【问题标题】:How do deploy web app with git without having to chown the app directory on every deploy?如何使用 git 部署 Web 应用程序,而不必在每次部署时都更改应用程序目录?
【发布时间】:2019-07-29 21:59:24
【问题描述】:

什么是使用 git 进行部署的好方法,现在每次部署时都必须将整个应用程序目录“chown -R”给 www 用户?

基本上我想使用发布接收挂钩进行部署。目前我有一个类似这样的 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 钩子中的 git 行更改为:

sudo -u www git --work-tree=/home/www/my-web-app --git-dir=/home/john/repo/my-web-app.git checkout -f

但这不起作用,因为我收到关于无法在 git repo 中写入 index.lock 文件的权限错误。显然,用户 www 没有在 git repo 中写入的权限,我不想给 www 这个权限,因为这似乎不利于服务器安全。

那么,在这种情况下,什么是优雅的解决方案?您是否会签出到临时目录,然后从临时目录 rsync 到 /home/www/my-web-app 目录,以便您复制文件并同时更改所有者?我觉得必须有一些我缺少的简单解决方案。

【问题讨论】:

    标签: git web-deployment


    【解决方案1】:

    考虑到 Git 不是部署工具,您的 rsync 可能是更好的解决方案。

    但请检查在您的情况下设置组是否足够,在您的my-web-app 文件夹中使用setgid,如explained here。这可能会避免需要 chown 文件。

    【讨论】:

    • 谢谢 - setgid 看起来是个不错的选择。我现在的计划是 chmod g+s+w /home/www/my-web-app 这样 git 签出的文件将属于 www 组(感谢 g+s),当网络应用程序作为用户 www 数据运行时,它将能够写入/删除文件my-web-app 目录(感谢 g+w)。我可以摆脱 post-receive 钩子中的 chown 行。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2012-04-12
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多