在EC2上设置Git从GitHub回购

对于EC2和Git,我都是一个新手,我刚刚使用干净的Amazon Linux AMI设置了我的第一个EC2实例。 我还安装了MySQL,Apache和PHP,并打开了一些端口,使其作为一个普通的Web服务器,响应一个弹性IP。

现在,我的代码在GitHub上的一个私人回购,我想通过执行git pull或类似的东西来执行简单的部署。 Git也已经安装在服务器上。 我知道我可以使用我的个人ssh密钥在服务器上build立我的git repo,但这似乎很奇怪。 我想另一个解决scheme是创build一个新的GitHub用户,并在服务器上使用它,但它似乎并不正确。

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

为了避免必须在您的EC2实例上保留一个SSH私钥,人们通常使用一个工作stream程来推送到该远程服务器以进行部署。 本质上,你在那里build立一个裸露的git仓库,并有一个部署到另一个目录的pre-receive钩子。 本教程中有一个简单的例子。 那么你只需要在服务器的~/.ssh/authorized_keys有你的SSH ~/.ssh/authorized_keys 。 但是,通过这个工作stream程,您不能直接从您的GitHub仓库进行部署 – 您需要将其从本地提取,然后推送到EC2计算机。

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

我只是按照Mark Longair指出的教程来解决这个问题。 我得到的唯一问题是创build裸Git存储库。 所以,让我恢复如何解决它。

  1. 我已经有我的github私人存储库。
  2. 我创build了EC2 Linux AMI(Ubuntu for practical procedures)
  3. 我已经在EC2实例上安装了git,mysql,php,apache和ssh,并将我的公共ssh密钥添加到/home/ubuntu/.ssh/authorized_keys文件中。
  4. 一旦在EC2实例中,我创build了两个文件夹,第一个保存库(我刚刚命名为我的github库),第二个文件夹保存网站: mkdir sitesrepo.git websites
  5. 然后,我去了要保存存储库并初始化裸存储库的文件夹: cd sitesrepo.git && git init --bare
  6. 我通过名为post-receive的文件中的以下内容通过vim创build了钩子文件,然后通过chmod +x post-receive (就像本教程所述)使它成为可执行文件。 该文件必须放在/home/ubuntu/sitesrepo.git/hooks

     #!/bin/sh GIT_WORK_TREE=/home/ubuntu/websites git checkout -f 
  7. 这里是我的步骤与前面提到的教程有所不同的地方:一个纯粹的git仓库有一个冲突,它不能把工作仓库当作一个裸仓库(这是没有意义的,因为它是一个裸仓库,非裸仓库是为了有一个工作空间,即工作树)。 幸运的是,您可以手动设置存储库config文件。 所以通过编辑文件/home/ubuntu/sitesrepo.git/config你必须保证有这样的东西:

     [core] repositoryformatversion = 0 filemode = true bare = false worktree = /home/ubuntu/websites [receive] denycurrentbranch = ignore 
  8. 现在,在你自己的机器上,在你的git本地仓库工作文件夹中,想法是添加一个新的远程仓库。 目前你已经configuration了默认的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. 根据您计划保存的网站数量,您必须configuration您的apache sites-enabled主机 。 此外,由于您使用的是Apache,所以不要忘记将Web文件夹更改为/home/ubuntu/websites ,因为默认情况下它指向/var/www但是您已经准备好了忘记在定义新的Web文件夹后重新启动Apache服务。

希望这有助于你的问题。