2011-10-20 21 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文件夾。

希望這有助於您的問題。