Zdalne repozytorium Git w chmurze Amazon

GIT na AWS - title

Je偶eli tak jak ja nie potrafisz wyobrazi膰 sobie rozpocz臋cia nowego projektu bez stworzenia repozytorium Git do 艣ledzenia zmian to mo偶esz by膰 zainteresowany t膮 instrukcj膮. Poni偶ej opisuj臋 jak stworzy膰 zdalne repozytorium Git (tzw. remote) na instancji EC2 w prywatnej chmurze Amazon Web Services i doda膰 je do swojego projektu.

Od czasu napisania tego tekstu zmieni艂 si臋 troch臋 m贸j workflow. Aktualnie korzystam z instancji Gitea, hostowanej na w艂asnym sprz臋cie. Je艣li chcesz dowiedzie膰 si臋 wi臋cej, zapraszam do artyku艂u Czym jest self-hosting?.

self-hosting wprowadzenie

Jak ja wykorzystuj臋 Gita?

Nad wi臋kszo艣ci膮 swoich projekt贸w pracuj臋 sam. Je艣li Ty pracujesz w wi臋kszej grupie to pewnie warto samemu hostowa膰 repozytorium GIT. Moje projekty to zazwyczaj aplikacje, w ostatnich latach najcz臋艣ciej w Pythonie ale mam sporo projekt贸w w rozmaitych technologiach kt贸re interesowa艂y mnie po drodze. Git pozwala mi 艣ledzi膰 wszystkie zmiany kt贸re wprowadzam w programie, powr贸ci膰 do ostatnich dzia艂aj膮cych wersji, pracowa膰 nad bardziej z艂o偶onymi zmianami w osobnych ga艂臋ziach (branch) czy w艂a艣nie zarz膮dza膰 wersjami pomi臋dzy r贸偶nymi urz膮dzeniami. Za projekt uwa偶am te偶 zbi贸r danych, informacji czy plik贸w kt贸re nie s膮 aplikacj膮. Na serwisie GitHub cz臋sto najwy偶ej ocenianymi repozytoriami s膮 w艂a艣nie dokumenty w formacie Markdown zawieraj膮cy instrukta偶e, zbiory odno艣nik贸w, narz臋dzi, opisy protoko艂贸w etc.. W tym kontek艣cie Git wraz ze zdalnym repozytorium mo偶e pe艂ni膰 rol臋 dysku lub notatnika w chmurze, konkuruj膮c z rozwi膮zaniami takimi jak Google Drive, Dropbox czy Evernote. Oczywi艣cie przy mniejszej ergonomii ale i wi臋kszej kontroli nad danymi.

Plusy i minusy zdalnego repozytorium

Zdalne repozytorium jest przydatne z kilku powod贸w:

  • Pozwala stworzy膰 kopi臋 bezpiecze艅stwa naszych danych na odr臋bnej maszynie (lub na innym urz膮dzeniu 鉃★笍 patrz ko艅c贸wka tego artyku艂u)
  • Jest kluczowe dla pracy w zespole i zarz膮dzania wersjami, wydaniami, branchami, backlogiem, sprintami etc.
  • Osobom pracuj膮cym w pojedynk臋 pozwala w prosty spos贸b synchronizowa膰 dane pomi臋dzy wieloma urz膮dzeniami czy 艣rodowiskami

Oczywi艣cie s膮 te偶 pewne ograniczenia kt贸re nale偶y mie膰 na uwadze:

  • Kontrola ponad ergonomi臋, a wi臋c nie b臋dzie to tak wygodne jak wspomniany Drive czy Evernote. Git ma przede wszystkim s艂u偶y膰 do kontroli wersji w rozproszonych 艣rodowiskach
  • Git ma ograniczenia je偶eli chodzi o pliki binarne. Nie jest w stanie ich r贸偶nicowa膰 – ka偶da zmiana to wgrany od zera plik. To ma oczywi艣cie sens (cho膰 s膮 rozszerzenia pozwalaj膮ce na r贸偶nicowanie plik贸w binarnych) ale w rezultacie ka偶da wersja Twojego pliku jest przechowywana w repozytorium. A wi臋c zar贸wno jego rozmiar, jak i transfer (w przypadku klonowania repozytorium) b臋d膮 wysokie.

Gdzie push’owa膰?

Przez d艂ugi czas my艣la艂em 偶e jedynym rozs膮dnym sposobem posiadania zdalnego repozytorium by艂o skorzystanie z serwis贸w takich jak GitHub, GitLab czy BitBucket.

Okazuje si臋 jednak 偶e uruchomienie w艂asnego, zdalnego repozytorium na wirtualnej maszynie w chmurze (w tym opisie b臋dzie to Amazon Web Services – AWS) jest prost膮, tani膮 (lub darmow膮 przez rok, je艣li skorzystamy z AWS Free Tier) i bezpieczn膮 alternatyw膮.

Prost膮, poniewa偶 nie musisz martwi膰 si臋 o cenniki i zakresy funkcjonalne r贸偶nych serwis贸w, zak艂ada膰 kont czy dostawa膰 newsletter贸w i wa偶nych aktualizacji polityki prywatno艣ci. Za艂o偶enie zdalnego repozytorium trwa dos艂ownie kilka minut. Na potrzeby zdalnego repozytorium Git wystarcz膮 nawet te najta艅sze typy instancji – t2.micro. To w艂a艣nie t2.micro jest dost臋pne za darmo przez rok w ofercie AWS Free Tier.

Jest to w ko艅cu bezpieczne, bo masz pe艂n膮 kontrol臋 nad kodem i tym z kim si臋 nim dzielisz. Ryzyko 偶e Twoje dane zostan膮 ujawnione w niepo偶膮dany spos贸b (np. poprzez b艂臋dy w ustawieniach uprawnie艅 projektu) jest mniejsze. Mo偶esz zastosowa膰 dowolny mechanizm autoryzacji, ja natomiast preferuj臋 ten domy艣lny oferowany przez AWS – prywatne pary kluczy 2048-bit SSH-2 RSA.

Korzystaj膮c z wbudowanych w AWS mechanizm贸w mo偶esz tak偶e w prosty spos贸b robi膰 snapshoty swoich maszyn (a dok艂adnie pami臋ci EBS), kt贸re mog膮 pe艂ni膰 funkcje kopii bezpiecze艅stwa.

Wymagania

Potrzebujesz konta AWS oraz instancji EC2. O zak艂adaniu konta i startowaniu EC2 napisa艂em troch臋 dwa lata temu tutaj 馃憠馃徏 Jak postawi膰 darmowy serwer VPN w chmurze Amazon 鉁旓笍.

Zak艂adam, 偶e:

  • Posiadasz klucz prywatny .pem pozwalaj膮cy na po艂膮czenie si臋 z instancj膮 EC2 oraz znasz publiczny adres (DNS lub IP) swojej instancji
  • Posiadasz projekt kt贸rym chcesz w ten spos贸b zarz膮dza膰
  • Masz zainstalowanego Git’a
  • Pracujesz na Linuxie/Unixie. Jest to istotne w sekcji o konfiguracji ssh – je艣li jeste艣 na Windowsie/Mac OS to b臋dziesz musia艂 wykaza膰 si臋 odrobin膮 google-fu

Lokalne repozytorium

Je艣li jeszcze tego nie zrobi艂e艣 – utw贸rz lokalne repozytorium Git w folderze nadrz臋dnym Twojego projektu i dodaj pierwszy commit:

$ git init
$ git add .
$ git commit -m "zaczynamy initial commit"

Zdalne repozytorium

Zaloguj si臋 na EC2 korzystaj膮c z klucza .pem:

$ ssh -i klucz_ec2.pem ubuntu@ec2-104-206-90-115.eu-west-1.compute.amazonaws.com

W ten spos贸b (podaj膮c namiar na klucz i pe艂ny adres maszyny) logujemy si臋 po raz ostatni. W kolejnej sekcji skonfigurujemy to po艂膮czenie w bardziej przyst臋pny spos贸b, przynajmniej na Linuksie. Stw贸rz na EC2 folder odpowiadaj膮cy nazwie Twojego projektu. Na ko艅cu nazwy folderu dodaj .git zgodnie z przyj臋t膮 konwencj膮:

$ mkdir python_project.git 
$ cd python_project.git

Teraz utworzymy repozytorium bare – a wi臋c takiego, w kt贸rym nie potrzebujesz bezpo艣rednio pracowa膰 na roboczej wersji plik贸w. S艂u偶y ono wy艂膮cznie do przyjmowania zmian, zarz膮dzania wersjami i udost臋pniania kodu innym maszynom/u偶ytkownikom:

$ git init . --bare

Gotowe. Sprawd藕 czy u Ciebie wygl膮da to podobnie. W folderze znajdziesz teraz struktur臋 zbli偶on膮 do zawarto艣ci katalogu .git w zwyk艂ym, roboczym repozytorium:

Opcjonalnie: skonfiguruj po艂膮czenie ssh

Je偶eli ta sekcja jest dla Ciebie niejasna polecam ten artyku艂: How to SSH to AWS servers using an SSH config file?.

Zanim dodamy zdalne repozytorium (remote) do naszego projektu, warto skonfigurowa膰 po艂膮czenie SSH tak, aby domy艣lnie korzysta艂o z pliku z kluczem prywatnym .pem. Dzi臋ki temu 艂膮czenie si臋 z instancj膮 oraz dodawanie i zarz膮dzanie remote b臋dzie prostsze.

Tutaj opisuj臋 jak zrobi膰 to w Linuksie, je艣li korzystasz z innej platformy musisz u偶y膰 google-fu w kolejnych sekcjach instrukcji. Sk艂adnia polece艅 odnosz膮ca si臋 do adresu zdalnej instancji mo偶e by膰 inna – musisz wskaza膰 namiary na klucz .pem.

Przenie艣 plik .pem do folderu ~/.ssh/ oraz stw贸rz (je艣li jeszcze nie istnieje) plik ~/.ssh/config:

$ cp klucz_ec2.pem ~/.ssh/ 
$ nano ~/.ssh/config

W pliku config mo偶esz zdefiniowa膰 po艂膮czenie SSH (kt贸re b臋dzie wykorzystane r贸wnie偶 przez komendy git). Tak wygl膮da m贸j plik config:

Host ec2-remote 
  Hostname ec2-104-206-90-115.eu-west-1.compute.amazonaws.com 
  User ubuntu 
  IdentityFile /home/lokalny-user/.ssh/klucz_ec2.pem

W polu Host wpisz dowoln膮 nazw臋 pod kt贸r膮 chcesz zdefiniowa膰 swoje po艂膮czenie. Ja wybra艂em ec2-remote. Warto艣膰 Hostname wskazuje na publiczny adres DNS (mo偶e to by膰 tak偶e publiczne IP) instancji EC2. User to domy艣lna nazwa u偶ytkownika kt贸ry zale偶y od wybranego obrazu instancji (AMI). Lista dla najpopularniejszych obraz贸w jest w dokumentacji Amazon Web Services: Get information about your instance . W polu IdentityFile zwr贸膰 uwag臋 na nazw臋 lokalnego u偶ytkownika oraz dok艂adn膮 (pe艂n膮) 艣cie偶k臋 do pliku z kluczem .pem.

Je偶eli wszystko si臋 powiedzie – komenda $ ssh ec2-remote powinna zalogowa膰 Ci臋 na maszynie EC2. Jest jednak szansa 偶e otrzymasz komunikat podobny do tego:

kuba@local:~/.ssh$ ssh ec2-remote
The authenticity of host 'ec2-104-206-90-115.eu-west-1.compute.amazonaws.com (104.206.90.115)' can't be established.
ECDSA key fingerprint is SHA256:UUqpym0NE8RJAKIESSMIESZNEZNACZKITUTAJ42342wU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-104-206-90-115.eu-west-1.compute.amazonaws.com,104.206.90.115' (ECDSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/kuba/.ssh/klucz_ec2.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/kuba/.ssh/klucz_ec2.pem": bad permissions
ubuntu@ec2-104-206-90-115.eu-west-1.compute.amazonaws.com: Permission denied (publickey).

Klucz to Permissions 0644 for (...) are too open. To oznacza 偶e potrzebujesz bardziej restrykcyjnych uprawnie艅 dost臋pu do pliku .pem. Skorzystaj z chmod – tryb 400 sprawi 偶e plik b臋dzie dost臋pny tylko dla bie偶膮cego u偶ytkownika i tylko do odczytu. Po zmianie uprawnie艅 u mnie wygl膮da to tak:

kuba@local:~/.ssh$ chmod 400 klucz_ec2.pem
kuba@local:~/.ssh$ ssh ec2-remote
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.3.0-1034-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Sep 13 (...)

Dodaj zdalne repozytorium do projektu

Korzystaj膮c ze skonfigurowanego po艂膮czenia SSH dodaj teraz nowy remote do swojego projektu Git. Upewnij si臋 偶e jeste艣 we w艂a艣ciwym folderze i skorzystaj z komendy git remote add:

$ pwd 
/home/kuba/python_project 
$ git remote add origin ubuntu@ec2-remote:python_project.git

Pami臋taj o ko艅c贸wce .git na zdalnym repozytorium, o nazwie u偶ytkownika i zdefiniowanym hoscie. W kwestii nazewnictwa – remote z kt贸rego klonujemy pierwotny projekt (o tym dzisiaj nie pisa艂em) lub kt贸re jest podstawowym zdalnym repozytorium (o tym by艂o), zgodnie z konwencj膮 nazywa si臋 origin, ale mo偶esz to zmieni膰. A teraz moment prawdy – pushnijmy zmiany na EC2:

$ git push -u origin master

Je偶eli wszystko si臋 powiod艂o powiniene艣 zobaczy膰 podobny komunikat:

kuba@local:~/python_project$ git push -u origin master
Counting objects: 85, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (76/76), done.
Writing objects: 100% (85/85), 126.50 KiB | 4.12 MiB/s, done.
Total 85 (delta 55), reused 0 (delta 0)
To ec2-remote:python_project.git
   e321cbf..c93cb41  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Jak sprawdzi膰 list臋 zdalnych repozytori贸w w projekcie?

Skorzystaj z polecenia git remote -v, dzi臋ki niemu zobaczysz wszystkie zdalne repozytoria. Je偶eli nie korzystasz ju偶 z kt贸rego艣 z nich mo偶esz je usun膮膰 poleceniem git remote remove origin – oczywi艣cie zmie艅 origin na w艂a艣ciw膮 nazw臋 remote’a.

Jako zdalne repozytorium mo偶esz doda膰 tak偶e pami臋膰 USB, na przyk艂ad pendrive lub dysk zewn臋trzny. Jest to dobra alternatywa do repozytorium na AWS oraz jako dodatkowy backup. Wystarczy 偶e na dysku USB utworzysz repozytorium bare. Dodaj膮c remote do swojego projektu u偶yj pe艂nej 艣cie偶ki repozytorium z USB.

Qingdao, Chengyang, 2015

Podsumowanie

  1. Dodaj zdalne repozytorium na wszystkich urz膮dzeniach kt贸re powinny mie膰 dost臋p do projektu
  2. Korzystaj z git push i git pull podczas pracy z kodem. Wykorzystaj ga艂臋zie oraz tagi aby sprawniej zarz膮dza膰 zmianami
  3. ….
  4. Profit

Je偶eli masz ju偶 maszyn臋 EC2 z dzia艂aj膮cym po艂膮czeniem SSH mo偶esz wykorzysta膰 j膮, w bardzo prosty spos贸b, do stworzenia prywatnego, darmonowego serwera VPN.

P.S.

Zdj臋cie tytu艂owe (na g贸rze) zrobi艂em w Korei Po艂udniowej w 2014 roku. Przedstawia widok z dachu hotelu w Seulu 鉂わ笍, gdzie艣 w dzielnicy Myeongdong. To drugie (w podsumowaniu) zrobi艂em w Qingdao w 2015 roku. Oba aparatem Fujifilm X100s.

Autor: kuba

Pracuj臋 w IT, sprzedaj膮c oprogramowanie klasy APS/MES firmom produkcyjnym. Nie jestem software developerem ale odk膮d zacz膮艂em w Turbo Pascalu zawsze co艣 pisz臋 - ostatnio w Pythonie. Lubi臋 technologie, mocn膮 kaw臋 i dobre zdj臋cia 馃

Dodaj komentarz

Tw贸j adres e-mail nie zostanie opublikowany.