我家裡有一台運行 Ubuntu 13.10 的伺服器,配置為 Web 伺服器和 git 儲存庫。如果我將專案從系統推送到伺服器,則會執行接收後掛鉤,將檔案(Symfony2 專案)移至正確的虛擬伺服器的 Web 根目錄。
我這樣做(託管我自己的伺服器)的部分原因是我想了解更多關於伺服器託管的最佳實踐。
我以 git 使用者身分透過 SSH 推送到我的 git 伺服器,該使用者有權存取 /opt/git 中的 git 儲存庫(有些指南建議這樣做)。 git 用戶的 shell 設定為 /usr/bin/git-shell。
我的網頁伺服器是 nginx,以用戶“www-data”運行,我相信這是預設設置,因為我沒有配置它。
我現在遇到的問題是,部署 www-data 使用者和我自己的使用者 (tim) 沒有權限寫入快取目錄,導致 Symfony 崩潰。
我的用戶 (tim) 參與其中的原因是因為該專案有一個我在自己的使用者帳戶中設定的 cronjob,這可能不是最好的主意。
另外,由於某種原因,提交後快取/目錄的預設權限是
drwxr-xr-x 4 git git 4096 Jul 29 09:33 cache
據我所知,這意味著只有 git 用戶才可以在快取資料夾中建立檔案/目錄。
現在我可以想到 101 種方法來處理這個問題,但我更感興趣的是解決我的問題的正確/預期的方法。
我是否應該以某種方式將文件 chown 給 www-data 用戶並以同一用戶身份運行 cronjobs?
- 這看起來很複雜,因為我認為 git 用戶不允許“將文件提供給其他人”
我應該找到一種方法以不同的用戶 www-data 或 tim 身份運行 post-receive 掛鉤嗎?
我的 cronjob 應該以哪個使用者身分執行?只能是蒂姆嗎?還是應該是 www-data 使用者? (或上帝禁止root)
這是我的接收後腳本的內容(我在某個網站上找到的,不記得是哪一個了)
#!/bin/sh
#
## store the arguments given to the script
read oldrev newrev refname
## Where to store the log information about the updates
LOGFILE=./post-receive.log
# The deployed directory (the running site)
DEPLOYDIR=/var/www/project.timfennis.com
## Record the fact that the push has been received
echo -e "Received Push Request at $( date +%F )" >> $LOGFILE
echo " - Old SHA: $oldrev New SHA: $newrev Branch Name: $refname" >> $LOGFILE
## Update the deployed copy
echo "Starting Deploy" >> $LOGFILE
echo " - Starting code update"
GIT_WORK_TREE="$DEPLOYDIR" git checkout -f
echo " - Finished code update"
echo " - Starting composer update"
cd "$DEPLOYDIR"; composer update; cd -
echo " - Finished composer update"
echo "Finished Deploy" >> $LOGFILE
我很確定 Composer 是將我的檔案權限重置為 755 的,因為快取目錄每次都會被刪除。