2010-11-21 113 views
7

我正在运行Apache Web服务器,并想知道什么是部署更改(从github)到web服务器的最佳方式?git/github和web服务器部署配置

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

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

但是,当我需要运行命令(即sudo git push)不起作用(因为我的SSH密钥不在sudo下)。

我自己(而不仅仅是root)可以让/ var/www /写入更好吗?或者我应该向根用户添加ssh密钥?或者我应该完全做些什么?

谢谢。

+0

检出http://stackoverflow.com/questions/279169/deploy-php-using-git – philfreo 2010-11-21 03:24:47

+0

或Capistrano http://help.github.com/capistrano/ – philfreo 2010-11-21 03:25:06

回答

5

我使用rsync同步我的本地计算机的内容与服务器,如果你只是部署到一台服务器,那么它很简单(和Capistrano是矫枉过正。)。我把下面的别名在~/.bash_profile

alias eget='rsync -avie ssh [email protected]: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/ [email protected]:sites/example.com/www/ --exclude .DS_Store --exclude ".git*" --delay-updates --delete-after' 

然后,从混帐回购协议我的本地机器上。我做的:

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 

如果它看起来腥,我可以做eget没有-n,然后就做了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 dir为~/sites/example.com/

2

创建一个中央存储库,使用git的分支为不同的目的创建不同的分支,并且永远不会公开提供所有的存储库,也不应该公开地为您的.git目录服务(因为这与为您提供所有内容曾经使用过这些代码或将其存储在公共存储库中)。把我的头顶部,这里是我推荐的步骤,从我自己的经验:

  • 创建中心/枢纽存储库中的代码。 (可选,但建议使用github.com更适合您的中央存储库)。然后,您可以检出本地副本以进行本地部署,例如当你想在你的笔记本电脑上重新创建网站时。没有必要,但非常方便,并确保您的网站是便携式的。您可以有一个临时存储库和临时分支用于开发目的。你也可以有一个回购和分支用于生产目的。

  • 在存储库中创建一个明确的公用目录,该存储库是而不是存储库的根:例如,在存储库中创建/ www /或/ serve /或/ public /目录。这是可以公开获得并且可以被搜索引擎索引的东西,所以要小心这里的内容。假设那里的任何东西都有公共知识,永久存储,并且将成为安全漏洞攻击的目标(因为这很可能是事实)。

  • 创建开发库:git克隆服务器上的中央存储库(例如,cd /home/tchal,然后git clone [email protected]: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-branchgit 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使用特定到每个部署型分支机构部署所有代码。无助于在部署之间同步数据库,但这是您运行后可以计算出来的一个步骤,作为部署站点的第二层,并在此期间手动执行。