我对EC2和Git都不熟悉,我刚刚使用干净的Amazon Linux AMI设置了我的第一个EC2实例。我还安装了MySQL,Apache和PHP,并打开了一些端口,使其作为普通的Web服务器工作,同时响应弹性IP。
现在,我的代码在GitHub上的私有仓库上,我想通过执行git pull
或类似的操作来执行简单的部署。 Git也已安装在服务器上。我知道我可以使用我的个人ssh密钥在服务器上设置我的git repo,但这看起来很奇怪。我想另一个解决方案是创建一个新的GitHub用户并在服务器上使用它,但它似乎也不正确。
如何以优雅,安全的方式实现这一目标?
答案 0 :(得分:35)
为了避免在EC2实例上保留SSH私钥,人们经常使用涉及推送到该远程服务器以进行部署的工作流。基本上,您在那里设置了一个带有pre-receive
钩子的裸git存储库,该钩子部署到另一个目录。在this tutorial中有一个简单的例子。然后,您只需要在服务器上的~/.ssh/authorized_keys
中拥有SSH public 键。但是,使用此工作流程,您无法直接从GitHub存储库进行部署 - 您需要在本地提取它,然后再推送到EC2计算机。
另一种方法是使用GitHub的deploy keys机制。这将涉及在EC2实例上创建新的SSH密钥对,并将公钥作为部署密钥添加到GitHub上的私有存储库中。然后,您可以直接从私有GitHub存储库提取到EC2实例。
答案 1 :(得分:10)
我刚刚按照tutorial指出的Mark Longair解决了这种情况。我得到的唯一问题是创建裸git存储库。所以,让我恢复我的解决方法。
/home/ubuntu/.ssh/authorized_keys
文件中。mkdir sitesrepo.git websites
我通过vim创建了钩子文件,并在名为cd sitesrepo.git && git init --bare
的文件中创建了以下内容,然后通过post-receive
使其可执行(正如教程所述)。该文件必须放在chmod +x post-receive
/home/ubuntu/sitesrepo.git/hooks
这里我的步骤与前面提到的教程不同:一个简单的git存储库存在冲突,它无法将工作树保持为裸存储库(它不会使感觉因为它是一个裸存储库。非裸存储库旨在拥有一个工作空间,即工作树。幸运的是,您可以手动设置存储库#!/bin/sh
GIT_WORK_TREE=/home/ubuntu/websites git checkout -f
文件。因此,通过编辑文件config
,您必须保证具有以下内容:
/home/ubuntu/sitesrepo.git/config
现在,在您自己的机器上,在您的git本地存储库工作文件夹中,我们的想法是添加一个新的远程存储库。目前,您已默认配置[core]
repositoryformatversion = 0
filemode = true
bare = false
worktree = /home/ubuntu/websites
[receive]
denycurrentbranch = ignore
,它告诉您的存储库将您的内容推送到github的存储库中。本教程将调用此类远程存储库origin
。所以你必须运行一次:web
。随后的推送可以通过简单的git remote add web ssh://mysite.com/home/ubuntu/sitesrepo.git && git push web +master:refs/heads/master
根据您计划持有的网站数量,您必须configure your apache sites-enabled
hosts。此外,由于您使用的是apache,请不要忘记将网络文件夹更改为指向git push web
,因为默认情况下它指向/home/ubuntu/websites
但您已准备好去,在定义新的web文件夹后,不要忘记重启apache服务。
希望这对您的问题有所帮助。