2011-10-20 22 views
40

我对EC2和Git都很陌生,我刚刚使用干净的Amazon Linux AMI设置了我的第一个EC2实例。我还安装了MySQL,Apache和PHP,并打开了一些端口,使其能够像普通的Web服务器一样工作,并响应弹性IP。在EC2上设置Git以从GitHub中获取回报

现在,我的代码位于GitHub的私人回购站上,我想通过执行git pull或类似的事情来执行简单的部署。 Git也已经安装在服务器上。我知道我可以使用个人ssh密钥在服务器上设置我的git repo,但这似乎很奇怪。我想另一种解决方案是创建一个新的GitHub用户并在服务器上使用它,但它看起来不正确。

如何以优雅,安全的方式实现这一目标?

回答

32

为避免必须在您的EC2实例上保留一个SSH私钥,人们通常会使用涉及推送到该远程服务器以部署的工作流程。实际上,你在那里建立一个裸露的git存储库,并在其中部署一个pre-receive挂钩。在this tutorial中有一个简单的例子。那么你只需要在服务器上有你的SSH 公钥密钥~/.ssh/authorized_keys。但是,通过这个工作流程,您无法直接从您的GitHub存储库进行部署 - 您需要将其在本地提取,然后推送到EC2计算机。

另一种方法是使用GitHub的deploy keys机制。这将涉及在您的EC2实例上创建新的SSH密钥对,并将公钥作为部署密钥添加到GitHub上的私有存储库中。然后,您可以直接从您的私有GitHub存储库中将您的EC2实例提取出来。

+0

太棒了,谢谢! – luchomolina

7

我刚刚解决了这种情况,遵循Mark Longair之前指出的tutorial。我得到的唯一问题是创建裸露的git存储库。所以,让我恢复如何解决它。

  1. 我已经有我的github私有存储库。
  2. 我创建了EC2的Linux AMI(Ubuntu的实用程序)
  3. 我已经安装的git,MySQL和PHP,Apache和SSH的EC2实例,并加入我的SSH公钥到/home/ubuntu/.ssh/authorized_keys文件。
  4. 一旦在EC2实例中,我创建了两个文件夹,第一个存放存储库(我刚刚命名为我命名我的github存储库),第二个存放站点:mkdir sitesrepo.git websites
  5. 然后我去了那个将要举行的存储库中的文件夹,并初始化纯仓库:cd sitesrepo.git && git init --bare
  6. 我通过vim的创建钩子文件在一个名为post-receive和文件中的以下内容,然后我可执行通过使它chmod +x post-receive(正如本教程所述)。这个文件必须放在/home/ubuntu/sitesrepo.git/hooks

    #!/bin/sh 
    GIT_WORK_TREE=/home/ubuntu/websites git checkout -f 
    
  7. 这里就是我的脚步,从前面提到的教程不同:裸露的git仓库有冲突的地方不能举行worktree是一个纯仓库(它不因为它是一个裸仓库,所以非常有意义。非裸仓库旨在具有工作空间,即工作树)。幸运的是,您可以手动设置存储库config文件。因此,通过编辑文件/home/ubuntu/sitesrepo.git/config你必须保证有这样的事情:

    [core] 
        repositoryformatversion = 0 
        filemode = true 
        bare = false 
        worktree = /home/ubuntu/websites 
    [receive] 
        denycurrentbranch = ignore 
    
  8. 现在,在你自己的机器,在你的git的本地仓库的工作文件夹,这个想法是添加一个新的远程仓库。目前,您已经配置了默认origin,它告诉您的存储库将您的内容推送到github的存储库。该教程调用这样的远程存储库web。所以你必须运行一次:git remote add web ssh://mysite.com/home/ubuntu/sitesrepo.git && git push web +master:refs/heads/master。随后的推动可以通过一个简单的方式完成git push web

  9. 根据您打算持有多少网站,您必须configure your apache sites-enabled hosts。此外,由于您使用的是Apache,因此不要忘记更改Web文件夹以指向/home/ubuntu/websites,因为默认情况下它指向/var/www但是您已准备好了,只要不要忘记在定义后重新启动apache服务新的web文件夹。

希望这有助于您的问题。