前文提到在 Linux 上將 /var/www 擁有者及群組都設成 www-data,再將我的帳號(jeffrey)也加入 www-data 群組,目的是讓以服務形式執行的 ASP.NET Core 網站可使用 www-data 身分讀寫檔案。而當要部署更新檔案,則使用我的帳號登入,藉著屬於 www-data 群組獲得修改權限。實務操作後發現一些眉角,筆記如下:

  1. 使用 jeffrey 帳號登入覆寫檔案,擁有者跟群組會被改成 jeffrey/jeffrey,導致 ASP.NET Core 服務無法存取。
    解法是執行 chmod g+s /var/www/Darkblog 設定 SetGID,以確保該目錄更新修改檔案時所屬群組沿用 www-data。
    補充:鳥哥 SUID, SGID, Sticky 的解說
    在網站根目錄設定 SGID,之後建立子目錄或檔案會繼承設定,若要套用在已存在目錄,需挑出目錄執行 chmod g+s,建議語法如下:

    find /var/www/Darkblog -type:d -exec chmod g+s {} +
    

    補充:關於 -exec command + 與 -exec command ; 的差別,可以參考 Stackoverlow 上的解答

  2. 使用 WinSCP 以 jeffrey 登入 SFTP 更新 www-data 群組檔案時出現以下錯誤:

    依據 WinSCP 文件,此為 Linux 系統限制擁有者才能更改檔案時間造成。

    On some systems, you need to be an owner of the file (write permissions are not enough) to modify its permissions or timestamp (you will see an error like “Permissions denied” in error details).

    此時需修改設定(如下圖)放棄修改檔案時間或忽略警告訊息,而這也意味上傳的檔案無法保留原始更新時間,會一律以上傳時間作為最後更新時間,不利日後檔案版本判斷。

  3. 後來想起檔案同步神器 - BeyondCompare 也支援 SFTP 檔案同步,人工更新換版,應該沒有工具可以跟它匹敵。輸入 sftp://username@host/path 當成同步對象,剩下的比對、複製操作跟網路磁碟機相同。

    唯試用發現一個小問題,預設無法點入 Symbol Link,需要改一下設定:

    但跟 WinSCP 一樣,當登入帳號非檔案擁有者時,也會遇到無法保留原始檔案更新時間的問題。

評估之後,未來更新部署換版,應該就是用 BeyondCompare 了,但檔案原始更新時間無法保留是一大困擾,在 StackExchange 找到一篇完整解釋後,最後採用設定帳號原則如下:

  1. 將 /var/www/Darkblog 所屬檔案及目錄的擁有者改成 jeffrey、群組維持 www-data。
  2. 目錄設定 g+s (SetGID)
  3. 對 /var/www/Darkblog 所屬檔案,www-data 群組預設只有讀取權限,特定需要寫入的目錄、檔案再增加寫入權限

歷經幾次換版實測沒發現啥問題,在產品經理、開發團隊與 DevOps 小組討論後取得共識後(咦? 從哪冒出一狗票角色?),SOP 制定完成。

Tips of publishing ASP.NET Core files to Linux via SFTP and best practice of www-data group permission settings.


Comments

# by Jerry

>>補充:烏哥 ? (是鳥哥還是烏哥?)

# by Jeffrey

to Jerry, 天吶... (跪) 謝謝指正。

Post a comment