如何使用 git 部署 Web 应用程序而不必在每次部署时都更改应用程序目录?
How do deploy web app with git without having to chown the app directory on every deploy?
使用 git 进行部署的好方法是什么?现在每次部署时都必须 "chown -R" 将整个应用程序目录发送给 www 用户?
基本上我想使用 post 接收挂钩进行部署。目前我有一个 post-receive 挂钩,看起来像这样:
#!/bin/sh
git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
sudo chown -R www:www /home/www/my-web-app
sudo /home/john/scripts/reload-my-web-app.sh
可以,但问题是chown这一步很慢,因为my-web-app文件夹里有几百万个文件。
我想我可以使用 git 作为用户 www 来解决这个问题,这样签出的文件就有了正确的所有者。所以我改变了 post-receive hook 中的 git 行:
sudo -u www git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
但这不起作用,因为我收到有关无法在 git 存储库中写入 index.lock 文件的权限错误。显然,用户 www 没有在 git 存储库中写入的权限,我不想给 www 那个权限,因为这似乎对服务器安全不利。
那么,在这种情况下,什么是优雅的解决方案?您会签出到临时目录,然后从临时目录 rsync 到 /home/www/my-web-app 目录,以便复制文件并同时更改所有者吗?我觉得一定有一些我缺少的简单解决方案。
考虑到 Git 不是部署工具,您的 rsync 可能是更好的解决方案。
但是请检查您的情况下设置组是否足够,在您的 my-web-app
文件夹中使用 setgid
,如 explained here。这可能会避免对文件进行 chown 操作。
使用 git 进行部署的好方法是什么?现在每次部署时都必须 "chown -R" 将整个应用程序目录发送给 www 用户?
基本上我想使用 post 接收挂钩进行部署。目前我有一个 post-receive 挂钩,看起来像这样:
#!/bin/sh
git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
sudo chown -R www:www /home/www/my-web-app
sudo /home/john/scripts/reload-my-web-app.sh
可以,但问题是chown这一步很慢,因为my-web-app文件夹里有几百万个文件。
我想我可以使用 git 作为用户 www 来解决这个问题,这样签出的文件就有了正确的所有者。所以我改变了 post-receive hook 中的 git 行:
sudo -u www git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f
但这不起作用,因为我收到有关无法在 git 存储库中写入 index.lock 文件的权限错误。显然,用户 www 没有在 git 存储库中写入的权限,我不想给 www 那个权限,因为这似乎对服务器安全不利。
那么,在这种情况下,什么是优雅的解决方案?您会签出到临时目录,然后从临时目录 rsync 到 /home/www/my-web-app 目录,以便复制文件并同时更改所有者吗?我觉得一定有一些我缺少的简单解决方案。
考虑到 Git 不是部署工具,您的 rsync 可能是更好的解决方案。
但是请检查您的情况下设置组是否足够,在您的 my-web-app
文件夹中使用 setgid
,如 explained here。这可能会避免对文件进行 chown 操作。