git push 后文件所有权问题

git push 后文件所有权问题

我家里有一台服务器,运行 Ubuntu 13.10,配置为 Web 服务器和 git 存储库。如果我将项目从系统推送到服务器,则会执行一个 post-receive 钩子,将文件(Symfony2 项目)移动到正确的虚拟服务器的 Web 根目录。

我这样做(托管我自己的服务器)的部分原因是因为我想了解更多有关服务器托管的最佳实践。

我以有权访问 /opt/git 中 git 存储库的用户 git 身份通过 SSH 推送到我的 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 种方法来解决这个问题,但我更感兴趣的是找到一种正确/预期的方式来解决我的问题。

  • 我是否应该以某种方式将文件分配给 www-data 用户并以同一用户身份运行 cronjobs?

    • 这看起来很复杂,因为我不认为 git 用户被允许“将文件交给其他人”
  • 我是否应该找到一种方法来以不同的用户 www-data 或 tim 的身份运行 post-receive 钩子?

  • 我的 cronjob 应该以哪个用户身份运行?只能是 tim 吗?还是应该是 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

我很确定作曲家将我的文件权限重置为 755,因为每次都会删除缓存目录。

相关内容