git / github和Web服务器部署配置

时间:2010-11-21 02:45:28

标签: apache git github webserver

我正在运行一个Apache Web服务器,并想知道将更改(从github)部署到Web服务器的最佳方法是什么?

/ var / www /现在只能由root写入。

我应该直接在/ var / www /中使用我的git项目吗? (所以它创建/var/www/.git /?)

然而,当我需要运行命令(即sudo git push)时不起作用(因为我的ssh键不在sudo下)。

我自己(而不仅仅是root)制作/ var / www / writable会更好吗?或者我应该向root用户添加ssh密钥?或者我应该完全做其他事情吗?

感谢。

2 个答案:

答案 0 :(得分:5)

我使用rsync将本地计算机的内容与服务器同步,如果您只是部署到一台服务器,那么它非常简单(而且Capistrano太过分了。)。我在~/.bash_profile中添加了以下别名:

alias eget='rsync -avie ssh matt@example.com:sites/example.com/www/ ~/Projects/example/example.com/www/ --exclude .DS_Store --exclude ".git*" --delete-after'
alias edep='rsync -avuie ssh ~/Projects/example/example.com/www/ matt@example.com:sites/example.com/www/ --exclude .DS_Store --exclude ".git*" --delay-updates --delete-after'

然后,从我本地机器上的git repo。我这样做:

git commit -am 'commit some changes'
git pull --rebase # pull any new changes from remote (--rebase prevents an unnecessary merge commit.)
eget -n # confirm which files I've changed

如果它看起来很可疑,我可以在没有-n的情况下eget,然后只做一个git diff -w。然后,我可以为我想要保留更改的文件git checkout -- path/to/file。然后,我提交了我尚未获得的服务器上的更改。只有当服务器上的文件以不同于部署的方式更改时,才会发生这种情况。否则,您知道本地版本总是比服务器上的文件更新,因此不必担心覆盖您本地尚未拥有的服务器上的内容。继续...

edep -n # just see what files will be deployed/updated/etc.
edep # looks good. Deploy for real.

完成!

查看rsync(1) Mac OS X Manual Page了解详情。

另一种选择是使用Git post-receive hook。但是,你必须在服务器上安装Git才能做到这一点。另外,为了安全起见,我建议将.git目录放在公共www目录之外。清洁的原因。您可以使用Git core.worktree配置选项执行此操作。例如,从~/git/example.com.git开始,git init --bare; git config core.worktree ~/sites/example.com/。这样~/git/example.com.git就像.git的{​​{1}}目录一样。

答案 1 :(得分:2)

创建一个中央存储库,使用git的分支为不同的目的创建不同的分支,并且永远不会公开提供所有存储库,也不应该公开提供.git目录(因为这与为您提供的所有内容提供服务相同使用代码或将存储库放到公共场所)。从我自己的经验来看,这是我推荐的步骤:

  • 为代码创建中心/集线器存储库。 (可选,但建议。更好的是使用github.com作为中央存储库)。然后,您可以查看本地部署的本地副本,例如当您想在笔记本电脑上重新创建网站时。没必要,但非常方便,确保您的网站是便携式的。您可以使用暂存存储库和暂存分支进行开发。您还可以使用回购和分支进行生产。

  • 在存储库中创建一个显式公共目录,该目录不是存储库的根:例如。在存储库中创建/ www /或/ served /或/ public /目录。这些内容将由搜索引擎公开提供并可编入索引,因此请注意其中的内容。假设任何进入那里的东西都是公共知识,缓存为永恒,并且将成为安全漏洞攻击的目标(因为这可能很容易成为事实)。

  • 创建开发者存储库:git克隆服务器上的中央存储库(例如cd /home/tchal然后git clone git@github.com:tchalvak/ninjawars.git),理想情况下是在对开发者组具有共享权限的文件夹中。

  • 为您的开发网站创建一个符号链接:cd /var/www/ln -s /url/to/shared/repository/public/ nickNameForDevSiteHere,只创建一个指向该网站的服务/公共文件的符号链接,从而创建一个简单的开发级网站。 (可选,但建议)。以这种方式,可以通过一些ip和昵称,例如,可以容易地访问开发站点。 http://10.0.1.123/publicdevelopmentsitenickname,无需真正的域名。

  • 指定直播&部署代码提交。您可能希望为当前“活动”的任何代码创建live-branch,只要知道该分支可能必须定期被强制覆盖,例如, git branch live-branch git push -f origin live-branch。将其视为代码的快照,而不是保持稳定的分支。

  • 当您确定开发站点已经过足够好的测试时,可以通过自定义部署脚本手动部署live-branch代码,也可以使用不同的存储库检查实时分支在其中,仅提供明确的公共内容,类似于开发站点。

    • 在apache中为域名创建虚拟主机。例如,您可以使用以下内容: <VirtualHost *> ServerName greatdomain.com ServerAlias www.greatdomain.com DocumentRoot /srv/greatdomain/www/ </VirtualHost> 这是一个很大的话题,所以如果你不清楚所有的细节,我建议进一步研究在apache中设置虚拟主机。

    • 将DNS指向服务器IP的域名。

总之,您可以非常轻松地使用git使用特定于每个部署类型的分支来部署所有代码。无法帮助同步(例如,部署之间的数据库),但这是您在运行之后可以弄清楚的一个步骤,作为部署站点的第二层,并在此期间手动执行。