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?.
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 – push
nijmy 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.
Podsumowanie
- Dodaj zdalne repozytorium na wszystkich urządzeniach które powinny mieć dostęp do projektu
- Korzystaj z
git push
igit pull
podczas pracy z kodem. Wykorzystaj gałęzie oraz tagi aby sprawniej zarządzać zmianami - ….
- 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.