【问题标题】:Setting up Git on EC2 to pull from GitHub repo在 EC2 上设置 Git 以从 GitHub 存储库中提取
【发布时间】:2011-12-11 13:36:36
【问题描述】:
我对 EC2 和 Git 都是新手,我刚刚使用干净的 Amazon Linux AMI 设置了我的第一个 EC2 实例。我还安装了 MySQL、Apache 和 PHP,并打开了一些端口,使其像普通的 Web 服务器一样工作,也响应弹性 IP。
现在,我的代码在 GitHub 上的私人仓库中,我想通过 git pull 或类似的方式执行简单的部署。 Git 也已经安装在服务器上。我知道我可以使用我的个人 ssh 密钥在服务器上设置我的 git repo,但这似乎很奇怪。我想另一种解决方案是创建一个新的 GitHub 用户并在服务器上使用它,但它似乎也不对。
如何以优雅、安全的方式实现这一目标?
【问题讨论】:
标签:
git
github
amazon-ec2
【解决方案1】:
为了避免必须在 EC2 实例上保留 SSH 私钥,人们经常使用涉及推送到远程服务器以进行部署的工作流。本质上,您在那里设置了一个裸 git 存储库,其中带有一个部署到另一个目录的 pre-receive 挂钩。在this tutorial 中有一个简单的示例。然后你只需要在服务器上的~/.ssh/authorized_keys 中拥有你的 SSH public 密钥。但是,使用此工作流程,您无法直接从 GitHub 存储库进行部署 - 您需要将其拉到本地,然后推送到 EC2 机器。
另一种方法是使用 GitHub 的 deploy keys 机制。这将涉及在您的 EC2 实例上创建一个新的 SSH 密钥对,并将公钥作为部署密钥添加到您在 GitHub 上的私有存储库中。然后,您可以直接从您的私有 GitHub 存储库拉取到您的 EC2 实例。
【解决方案2】:
我刚刚通过遵循Mark Longair 之前指出的tutorial 解决了这种情况。我遇到的唯一问题是创建裸 git 存储库。所以让我继续我是如何解决它的。
- 我已经有了自己的 github 私有仓库。
- 我创建了 EC2 Linux AMI(实用程序用 Ubuntu)
- 我已经在 EC2 实例上安装了 git、mysql、php、apache 和 ssh,并将我的公共 ssh 密钥添加到
/home/ubuntu/.ssh/authorized_keys 文件中。
- 在 EC2 实例中,我创建了两个文件夹,第一个文件夹用于保存存储库(我只是将其命名为我的 github 存储库),第二个用于保存站点:
mkdir sitesrepo.git websites .
- 然后我转到要保存存储库的文件夹并初始化裸存储库:
cd sitesrepo.git && git init --bare
-
我通过 vim 在名为 post-receive 的文件中创建了具有以下内容的挂钩文件,然后我通过 chmod +x post-receive 使其可执行(正如教程所述)。该文件必须放在/home/ubuntu/sitesrepo.git/hooks
#!/bin/sh
GIT_WORK_TREE=/home/ubuntu/websites git checkout -f
-
以下是我的步骤与之前提到的教程不同的地方:裸 git 存储库存在冲突,它无法将工作树保持为裸存储库(这没有意义,因为它是裸存储库。非裸存储库旨在具有工作空间,即工作树)。幸运的是,您可以手动设置存储库config 文件。所以通过编辑文件/home/ubuntu/sitesrepo.git/config 你必须保证有这样的东西:
[core]
repositoryformatversion = 0
filemode = true
bare = false
worktree = /home/ubuntu/websites
[receive]
denycurrentbranch = ignore
现在,在您自己的机器上,在您的 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
完成
根据您计划持有的网站数量,您必须configure your apache sites-enabled hosts。另外,既然你用的是apache,别忘了把web文件夹改成指向/home/ubuntu/websites,因为默认指向/var/www但是你准备好了,别忘了重启定义新的 web 文件夹后的 apache 服务。
希望这对您的问题有所帮助。