在EC2上设置Git以从GitHub repo中提取

luc*_*ina 47 git github amazon-ec2

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

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

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

Mar*_*air 36

为了避免在EC2实例上保留SSH私钥,人们经常使用涉及推送到该远程服务器以进行部署的工作流.基本上,你在那里设置了一个带有pre-receive钩子的裸git存储库,它可以部署到另一个目录.在本教程中有一个简单的例子.然后,你只需要拥有你的SSH 公共密钥~/.ssh/authorized_keys服务器上.但是,使用此工作流程,您无法直接从GitHub存储库进行部署 - 您需要在本地提取它,然后再推送到EC2计算机.

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


Mes*_*dón 10

我只是遵循解决这种情况的教程马克Longair之前指出.我得到的唯一问题是创建裸git存储库.那么让我恢复一下如何解决它.

  1. 我已经拥有了我的github私有存储库.
  2. 我创建了EC2 Linux AMI(Ubuntu实用程序)
  3. 我在EC2实例上安装了git,mysql,php,apache和ssh,并将我的公共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
    
    Run Code Online (Sandbox Code Playgroud)
  7. 这里是我的步骤与前面提到的教程不同的地方:一个裸git存储库存在冲突,它无法将工作树保持为裸存储库(它没有意义,因为它是一个裸存储库.非裸存储库旨在有工作空间,即工作树).幸运的是,您可以手动设置存储库config文件.因此,通过编辑文件,/home/ubuntu/sitesrepo.git/config您必须保证具有以下内容:

    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        worktree = /home/ubuntu/websites
    [receive]
        denycurrentbranch = ignore
    
    Run Code Online (Sandbox Code Playgroud)
  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. 根据您计划保留的站点数,您必须配置Apache sites-enabled主机.此外,由于你正在使用apache,不要忘记将web文件夹更改为指向/home/ubuntu/websites,因为默认情况下它指向/var/www但是你准备好了,只是不要忘记在定义新的apache服务后重启网络文件夹.

希望这有助于你的问题.