_                      _             _ _
| |_ ___ _ __ _ __ ___ (_)_ __   __ _| | | ___   __ _
| __/ _ \ '__| '_ ` _ \| | '_ \ / _` | | |/ _ \ / _` |
| ||  __/ |  | | | | | | | | | | (_| | | | (_) | (_| |
 \__\___|_|  |_| |_| |_|_|_| |_|\__,_|_|_|\___/ \__, |
			                        |___/

Git - podstawy systemu kontroli wersji

Ta strona wymaga aktualizacji, informacje na niej zawarte mogą być niezgodne z prawdą.

W tym jakże krótkim wpisie chciałbym przedstawić podstawową obsługę systemu kontroli wersji Git. Podstawowym zadaniem Git-a jest monitorowanie zmian oraz umożliwienie wycofania modyfikacji w danym pliku.

Podstawy lokalnego systemy kontroli wersji Git

Folder z danymi, na których pracujemy po zainstalowaniu repozytorium staje się pierwszą warstwą pracy z Git. Tę warstwę nazywamy working directory (ang. katalog roboczy). Natomiast samo repozytorium, które umożliwni nam pracę z Git instalujemy poniższym poleceniem.

xf0r3m@K52F:~/Dokumenty/landisk $ git init

Czym jest repozytorium? Repozytorium to ukryty katalog wewnątrz katalogu roboczego. W nim znajdują się zapisane i przechowane w odpowiedni sposób zamiany wprowadzone w plikach katalogu roboczego. Po zainstalowaniu repozytorium w katalogu, w którym jakieś pliki już istnieją możemy je dodać wybiórczo, korzystając z poniższego polecenia:

xf0r3m@K52F:~/Dokumenty/landisk $ git add landisk.sh

lub dodać wszystkie pliki z katalogu, wykorzystując to polecenie:

xf0r3m@K52F:~/Dokumenty/landisk $ git add .

Nowe pliki są automatycznie zauważane przez Git, jako zmiany w katalogu roboczym.

Podając . (kropkę) jako argument polecenia add, dodaliśmy wszystkie plik do naszego repozytorium. Rozważmy teraz taki scenariusz, że nasze repozytorium zawiera bardzo dużo plików. Moglibyśmy skorzystać z polecenia git add . jednak w naszym repozytorium znajdują się pliki, których nie chcemy monitorować, w tej sytuacji możemy regulować, które pliki mają być monitorowane, a które nie. Służy temu specjalny plik Git-a, umieszczany w repozytorium: .gitignore. W tym pliku umieszczamy nazwy katalogów, plików (w nazwach plików możemy używać symbolu wieloznaczności *) lub ścieżki, które mają zostać pominięte podczas monitorowania katalogu przez Git. Pamiętać należy o tym że ten plik jest ukryty.

Wszystkie zauważone przez Git zmiany możemy sprawdzić za pomocą polecenia:

xf0r3m@K52F:~/Dokumenty/landisk $ git status

Z informacji zwróconych przez polecenie, możemy sprawdzić stan naszych plików, teraz po dodaniu plików do monitorowania mamy informacje o zamianach w naszym katalogu roboczym. Korzystanie z Git-a, nie jest wcale trudne, sam Git daje nam podpowiedzi, aby usunąć jakiś plik z obecnego stanu przejściowego wydajemy poniższe polecenie. Uwaga! Usunięcie plików ze stanu przejściowego nie spowoduje przywrócenia pliku przed zmianami. Plik zostanie pominięty podczas zapisywania go zapisywania go w repozytorium:

xf0r3m@K52F:~/Dokumenty/landisk $ git rm --cached <nazwa_pliku>

Czym jest ten stan przejściowy? Otóż podczas pracy z Git-em, operujemy tak naprawdę na trzech płaszczyznach.

Diagram with local repository workflow

Pierwszy z nich to katalog roboczy, na plikach w tym katalogu są dokonywane przez nas zmiany, te zmiany są rejestrowane w tak zwanym stanie przejściowym. Ten stan przechowuje wszystkie zmiany przed zapisaniem ich w repozytorium, tworzy tymczasowe migawki plików, w których dokonano zmian. Ze stanu przejściowego bardzo łatwo cofnąć zmiany wystarczy jedno polecenie.

xf0r3m@K52F:~/Dokumenty/landisk $ git checkout landisk.sh

Podając jako argument nazwę pliku przywracamy tylko konkretny plik, warto zauważyć że po wydaniu tego polecenia, zmiany zarejestrowane przez Git w pliku zostają wycofane oraz zostaje on usunięty ze stanu przejściowego. Zamiast nazwy pliku możemy użyć kropki (.), wtedy przywrócimy wszystkie pliki. Warto pamiętać, że polecenie checkout wycofuje zmiany tylko z stanu przejściowego. To polecenie nie działa na nowe pliki. Jak widzimy możemy sobie swobodnie balansować pomiędzy stanem przejściowym, a katalogiem roboczym. W edytorze naciskamy ctrl+s, Git od razu wyłapuje zmianę, testujemy, coś nie działa, wydajemy polecenie git checkout, zmiany zostały wycofane, kiedy jednak jesteśmy pewni że nasz kod działa możemy dokonać zatwierdzenia. Zatwierdzenie jest dokonywane z plików, których zmiany zostały uwzględnione w stanie przejściowym. To co znajduje się w stanie przejściowym sprawdzamy poleceniem git status. Zatwierdzenie dokonuje takiej stałej migawki, którą będzie mogli przywrócić nie zależnie od tego ile zmian było już plikach projektu, kiedy przy poleceniu checkout możemy cofnąć tylko ostatnią zmianę. Aby dokonać zatwierdzenia, wydajemy następujące polecenie.

xf0r3m@K52F:~/git_lab/repo1$ git commit -am "Pierwsze pliki"
[master (root-commit) 7f5135a] Pierwsze pliki
 2 files changed, 9 insertions(+)
 create mode 100644 imiona
 create mode 100644 kolory

Opcja -a w poleceniu powoduje uwzględnienie wszystkich zmodyfikowanych plików, z kolei -m powoduje dodanie komentarza do zatwierdzenia. Sprawdzenie stanu repozytorium dokonujemy za pomocą polecenia

xf0r3m@K52F:~/git_lab/repo1$ git log --pretty=oneline
7f5135af8bca2dad1d9f1d7c7db34990a6115efa (HEAD -> master) Pierwsze pliki

Jak widzimy repozytorium jest takim miejscem przechowywania zatwierdzeń. Teraz dokonamy zmian w plikach aby mieć jeszcze jedno zatwierdzenie w repozytorium. Po wiedzmy że w tym zatwierdzeniu powinny być dwa pliki zmienione nie tylko jeden. Z repozytorium pliki możemy przywrócić na dwa sposoby: do stanu przejściowego (git reset --soft) oraz do katalogu roboczego (git reset --hard), jeśli chcemy dodać po prostu plik wycofując stare zatwierdzenie i utworzyć nowe tym razem obejmujące wszystkie pliki, wybierzemy opcje --soft. Jako argument opcji --soft podajemy to zatwierdzenie, z którego chcemy przywrócić pliki, nie te które ostatnio wprowadziliśmy, w którym znajduje się nasz błąd.

1f7ecc0bca359431bf11493358fd1f87e24fc341 (HEAD -> master) Zmiany w imionach
7f5135af8bca2dad1d9f1d7c7db34990a6115efa Pierwsze pliki

Więc jako argument opcji --soft podamy ID zatwierdzenia 7f5135. Po przywróceniu zatwierdzenie opisane jako "Zmiany w imionach" przestaje istnieć. Słowo o commit ID. Każde zatwierdzenie jest identyfikowane przez Git za pomocą długiego ciągu znaków zapisanego w systemie heksadecymalnym, który występuje w pierwszej kolumnie danych zwracanych przez polecenie git log --pretty=oneline. Commit ID jest sześcioma pierwszymi znakami tego ciągu.

To kiedy wydamy polecenie

xf0r3m@K52F:~/git_lab/repo1$ git status

Otrzymamy taką odpowiedź (o ile nie wprowadziliśmy żadnych w innych plikach) od Git.

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	zmodyfikowany: imiona

Jeśli zmieniliśmy jakieś pliki to odpowiedź będzie taka jak poniżej:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	zmodyfikowany: imiona

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	zmodyfikowany: kolory

Teraz aby dodać te pliki należy wydać polecenie git add <nazwa_pliku> w tym przypadku są to kolory.

Na tym przykładzie lepiej widać jak działa stan przejściowy. Kiedy plik zostaje zmodyfikowany, trafia on do stanu przejściowego jednak nie jest oznaczony jako plik do zatwierdzenia, dlatego wydajemy polecenie commit wraz opcją -a, aby nie musieć dodawać plików jako "do zatwierdzenia". Tylko zatwierdzać wszystkie zmodyfikowane pliki. Gdybyśmy nie stosowali tej opcji, to należało by każdy nieoznaczony plik dodać za pomocą polecenia add.

Pozostała w sumie ostatnia podstawowa czynność jaką możemy wykonać czyli przywrócić pliki z repozytorium bezpośrednio do katalogu roboczego. Aby wykonać tą czynność wydajemy polecenie.

xf0r3m@K52F:~/git_lab/repo1$ git reset --hard 7f5135

Przy tym poleceniu z ID commit-u jest identycznie. Ten commit, który wybraliśmy jest oznaczony jako HEAD, czyli główny commit repozytorium.

 

Prywatne, zdalne repozytorium

Teraz utworzymy sobie w prosty sposób zdalne repozytorium, będzie to wymagać jedynie kilka poleceń w powłoce, ponieważ połączenia będziemy realizować za pomocą SSH.

Na naszym serwerze sprawdzamy czy jest dostępny Git. Jeśli jest dostępny to możemy przejść od razu do tworzenie nowego użytkownika. Jeśli po wydaniu polecenia git dostajemy informacje o tym, że nie można odnaleźć polecenia, to wydajemy polecenie odpowiednie dla naszej dystrybucji, które zainstaluje Git w systemie.

ubuntu@gitssh:~$ sudo apt install git

Kiedy Git znajduje się już w systemie, lub został przed chwilą zainstalowany, tworzymy użytkownika, który w swoim folderze domowym będzie przechowywał nasze repozytoria.

ubuntu@gitssh:~$ sudo adduser git

W tym momencie (najlepiej zaraz po utworzeniu użytkownika), podać nasz klucz publiczny do logowania przez SSH nowemu użytkownikowi.

xf0r3m@K52F:~$ ssh-keygen
xf0r3m@K53F:~$ ssh-copy-id git@gitssh

Teraz kiedy już możemy zalogować się bez hasła, zalogujemy się na serwer jako git. Następnie tworzymy nowy katalog o nazwie git-shell-commands oraz nadamy mu odpowiednie uprawnienia.

git@gitssh:~$ mkdir git-shell-commands
git@gitssh:~$ chmod 775 git-shell-commands

Wylogowujemy się z tego użytkownika, a następnie logujemy się na użytkownika z uprawnieniami administracyjnymi, po zalogowaniu w pliku /etc/passwd zmieniamy domyślną powłokę dla użytkownika git z /bin/bash na /usr/bin/git-shell. Zapisujemy zmiany w pliku.

git:x:1001:1001:git,,,:/home/git:/usr/bin/git-shell

Teraz kiedy wydamy polecenie su git ukaże nam się taki obraz (aby wyjść wydajemy polecenie exit):

git>

Aby jednak uruchomić normalną powłokę UNIX-ową dla tego użytkownika musimy zalogować się jako root. Następnie wydać poniższe polecenie.

root@gitssh:/home/ubuntu$ su -s /bin/bash - git

Teraz zalogujemy się do powłoki bash na użytkowniku git i utworzymy katalog naszego repozytorium:

git@gitssh:~$ mkdir example.git

Wewnątrz utworzonego przez nas katalogu wydajemy poniższe polecenie:

git@gitssh:~/example.git$ git --bare init

Po wydaniu tego polecenia, nasze repozytorium jest gotowe, w celach testowych możemy przesłać na niego pusty plik README.

xf0r3m@K52F:/git_lab/repo3$ touch README.md
xf0r3m@K52F:/git_lab/repo3$ git init
Initialized empty Git repository in /home/xf0r3m/git_lab/repo3/.git/
xf0r3m@K52F:/git_lab/repo3$ git add .
xf0r3m@K52F:/git_lab/repo3$ git commit -am "first commit"
[master (root-commit) 5bafc2b] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.m
xf0r3m@K52F:/git_lab/repo3$ git remote add origin ssh://git@192.168.56.211/~/example.git
xf0r3m@K52F:/git_lab/repo3$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 209 bytes | 209.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://192.168.56.211/~/example.git
 * [new branch]      master -> master

Powyżej mamy listing z terminala, użyłem tutaj dwóch nowych poleceń, które często będą wykorzystywane przez nas podczas pracy ze zdalnym repozytorium. Pierwsze polecenie:

xf0r3m@K52F:/git_lab/repo3$ git remote add origin ssh://git@192.168.56.211/~/example.git

dodaje pod nazwą origin adres do zdalnego repozytorium do naszej lokalnej konfiguracji Git. Dzięki tej nazwie łatwiej będzie nam wpychać (przesyłać) nasze repozytorium na zdalny Git. Drugie polecenie:

git push origin master

powoduje wepchnięcie gałęzi o nazwie master (głównego repozytorium) na zdalne repozytorium, którego adres kryje się po nazwą origin.

Zdalne repozytorium po SSH jest dobre kiedy w szybki, prosty i bezpieczny sposób musimy stworzyć prywatne repozytorium. Jednak do pracy w wieloma użytkownikami jest ono nadzwyczaj nie wygodne, ponieważ każdy użytkownik musi zalogować się jako root, aby utworzyć kolejne repozytorium.

Obecnie dostępne są trzy sprawne pakiety oprogramowania zapewniające usługę zdalnego repozytorium obsługiwane z poziomu WWW. Taki GitHub tylko że hostowany na swoich serwerach. Poniżej przedstawię instalację wszystkich trzech pakietów. Obsługa nie jest trudna, wystarczy czytać ze zrozumieniem i nie bać się eksperymentować. Jak co się uszkodzi to zawsze możemy zainstalować to jeszcze raz z poniższych poradników lub mieć z tyłu głowy zapisane, aby zrobić kopie zapasową naszego środowiska testowego przed wprowadzeniem jakieś poważnej zmiany, prawda ?

 

GitLab

Na początek weźmiemy pod lupę pierwszy najbardziej zaawansowany i w sumie najłatwiejszy do zainstalowania - GitLab. Moim środowiskiem testowym to przedstawienia instalacji była maszyna wirtualna VirtualBox z Ubuntu Server 20.04, nie radze używać kontenerów chyba że uprzywilejowanych, ponieważ GitLab podczas swojej instalacji zmienia kilka ustawień kernela.

Dokonujemy aktualizacji repozytoriów z paczkami oprogramowania następnie instalujemy niezbędne w systemie pakiety. W Ubuntu Server 20.04, wymagane oprogramowanie jest już zainstalowane, jednak kiedy korzystamy z 18 lub 16.04 warto upewnić się czy te pakiety są już w naszym systemie.

xf0r3m@gitlab:~$ sudo apt update
xf0r3m@gitlab:~$ sudo apt install curl openssh-server ca-certificates tzdata

Instalacje Postfix możemy pominąć.

Teraz dodamy repozytoria GitLab do naszych repozytoriów systemowych.

xf0r3m@gitalab:~$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Właściwa instalacja GitLab odbywa się za pomocą APT. Jednak przed wydaniem polecenia należy zdefiniować w zmiennej EXTERNAL_URL, adres pod którym nasz GitLab będzie dostępny.

xf0r3m@gitlab:~$ sudo EXTERNAL_URL="http://192.168.0.211" apt install gitlab-ce

Instalacja GitLab może potrwać nawet do dwóch godzin w zależności od łącza internetowego oraz mocy obliczeniowej naszego sprzętu. O zakończeniu instalacji zostaniemy poinformowani odpowiednim komunikatem. Po zainstalowaniu możemy przejść pod adres, który podaliśmy w zmiennej EXTERNAL_URL. Po załadowaniu strony, zostaniemy poproszeni o zdefiniowanie hasła dla użytkownika administracyjnego GitLab. Teraz możemy zalogować się, podając w nazwie użytkownika nazwę root. Jeśli zdecydujemy się na użycie GitLab jako naszego zdalnego repozytorium, to należało by użyć HTTPS. Aby to zrealizować należy:

  1. Zmienić w pliku /etc/gitlab/gitlab.rb wartość opcji EXTERNAL_URL. Zmieć protokół na HTTPS następnie podać nazwę domeny, pod którą GitLab będzie dostępny.
    xf0r3m@gitlab:~$ sudo vi /etc/gitlab/gitlab.rb
    

    Wewnątrz pliku odszukujemy opcję EXTERNAL_URL i ustawiamy jej wartość na adres pod którym będzie widoczny GitLab.

    EXTERNAL_URL="https://gitlab.morketsmerke.net"
    
  2. Utworzyć katalog ssl wewnątrz katalogu /etc/gitlab, nadać mu uprawnienia 755 następnie przekopiować do tego katalogu nasze pliki certyfikatu.
    xf0r3m@gitlab:~$ sudo mkdir -p /etc/gitlab/ssl
    xf0r3m@gitlab:~$ sudo chmod 755 /etc/gitlab/ssl
    xf0r3m@gitlab:~$ sudo cp *.pem /etc/gitlab/ssl
    
  3. Następnie wydajemy polecenie:
    xf0r3m@gitlab:~$ sudo gitlab-ctl reconfigure
    

Po zakończeniu rekonfiguracji GitLab powinien być dostępny pod adresem jaki podaliśmy w zmiennej EXTERNAL_URL, po protokole HTTPS.

Kolejnym oprogramowaniem umożliwiającym nam łatwe utworzenie ogólnodostępnego zdalnego repozytorium Git-a będzie Gogs.

 

Gogs

Instalacje Gogs-a w naszym systemie rozpoczynamy od zainstalowania jakiegoś pakietu bazodanowego np. MySQL.

xf0r3@gogs:~$ sudo apt install mysql-server mysql-client

Następnie pobieramy najnowszą paczkę z Gogs-em z https://gogs.io/docs/installation/install_from_binary

xf0r3m@gogs:~$ wget https://dl.gogs.io/0.12.1/gogs_0.12.1_linux_amd64.tar.gz

Po pobraniu rozpakowujemy paczkę.

xf0r3m@gogs:~$ tar -xzvf gogs_0.12.1_linux_amd64.tar.gz

W katalogu gogs/scripts będzie plik o nazwie mysql.sql. Otwieramy go i dopisujemy dwie linie.

CREATE USER 'gogs'@'localhost' IDENTIFIED BY 'Trudn3Hasl0DOMysql';
GRANT ALL ON gogs.* TO 'gogs'@'localhost';

Zapisujemy zmiany w pliku, następnie tworzymy bazę dla Gogs.

xf0r3m@gogs:~/gogs/scripts$ sudo mysql < mysql.sql

Teraz tworzymy nowego użytkownika np. o nazwie git. To na jego katalogu domowym będą tworzone repozytoria użytkowników oraz to z jego uprawnieniami będzie uruchamiany Gogs.

xf0r3m@gogs:~$ sudo adduser git

Kopiujemy na jego katalog domowy naszą paczkę z Gogs.

xf0r3@gogs:~$ sudo cp gogs_0.12.1_linux_amd64.tar.gz /home/git

Przechodzimy na jego katalog domowy, albo przez sudo su i następnie su git lub bezpośrednio su git. Tam wypakowujemy naszą paczkę.

xf0r3m@gogs:~$ su git
Password:
git@gogs:~$ tar -xzvf gogs_0.12.1_linux_amd64.tar.gz

Teraz możemy uruchomić nasz serwer. Uwaga! Jeśli uruchamiamy naszego Gogs-a w środowisku produkcyjnym, to przed pierwszym uruchomieniem serwera należy wykonać czynność opisane poniżej, w przeciwnym wypadku możemy przejść do uruchomienia serwera.

Poniżej przedstawię jak należy skonfigurować Nginx jako reverse proxy, aby nasz serwer Gogs był widoczny pod konkretnym adresem oraz pod klasycznym portem HTTPS.

Na początku w katalogu /etc/ssl tworzymy katalog o nazwie gogs.

xf0r3m@gogs:~$ sudo mkdir -p /etc/ssl/gogs

Następnie kopiujemy do niego pliki certyfikatu

xf0r3@gogs:~$ sudo cp *.pem /etc/ssl/gogs

Teraz instalujemy nginx.

xf0r3m@gogs:~$ sudo apt install nginx

Po zainstalowaniu pakietu, w katalogu /etc/nginx/sites-enabled tworzymy plik o nazwie gogs następnie w nim wklejmy poniższą konfiguracje.

server {
    listen 443 ssl;
    server_name git.example.com;
		root /var/www/html/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)

		location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:3000;
		}

    ssl on;
    ssl_certificate /etc/ssl/gogs/fullchainX.pem;
    ssl_certificate_key /etc/ssl/gogs/privkeyX.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_session_timeout 5m;
    client_max_body_size 50m;
}

W pliku zmieniamy:

Restartujemy nginx:

xf0r3m@gogs:~$ sudo systemctl restart nginx

Sprawdzamy czy serwer wystartował prawidłowo:

xf0r3m@gogs:~$ sudo systemctl status nginx

Jeśli nginx wystartował poprawnie lub uruchamiamy gogs dla celów testowych to możemy, uruchomić serwer a następnie instalacje Gogs, na którą wchodzimy przez adres zdefiniowany w parametrze server_name.

git@gogs:~$ gogs/gogs web
2020/09/13 08:54:43 [ WARN] Custom config "/home/git/gogs/custom/conf/app.ini" not found. Ignore this warning if you're running for the first time
2020/09/13 08:54:43 [TRACE] Log mode: Console (Trace)
2020/09/13 08:54:43 [ INFO] Gogs 0.12.1
2020/09/13 08:54:43 [TRACE] Work directory: /home/git/gogs
2020/09/13 08:54:43 [TRACE] Custom path: /home/git/gogs/custom
2020/09/13 08:54:43 [TRACE] Custom config: /home/git/gogs/custom/conf/app.ini
2020/09/13 08:54:43 [TRACE] Log path: /home/git/gogs/log
2020/09/13 08:54:43 [TRACE] Build time: 2020-08-27 07:07:30 UTC
2020/09/13 08:54:43 [TRACE] Build commit: 43fc8260850090b55d4ee2586a819b3b6c016279
2020/09/13 08:54:43 [ INFO] Run mode: Development
2020/09/13 08:54:43 [ INFO] Listen on http://0.0.0.0:3000

Do stworzenia w dużej mierze (90 kilku %) Gogs wykorzystano język programowania Go. Dlatego podobnie do aplikacji stworzonych w Node.js, Gogs startuje na wysokim porcie, aby mógł wystartować na porcie poniżej 1024 musi zostać uruchomiony jako root, co nie jest zalecane. Adres z portem 3000 na końcu przepiszemy do naszej przeglądarki zamiast zer, podstawimy adres naszej maszyny.

Po wpisaniu naszego zmienionego adresu w przeglądarkę, wyświetli nam się strona instalacyjna. Co zmieniamy?

Po zainstalowaniu zostaniemy przyniesieni nas stronę logowania. Jednak naszą pracę z Gogs-em zaczniemy od utworzenia konta. Pierwszy zarejestrowany użytkownik dostaje uprawnienia administracyjne. Pod formularzem logowania znajduje się odnośnik kierujący nas do formularza rejestracji. Wypełniamy wszystkie pola i rejestrujemy użytkownika, po zarejestrowaniu zostaniemy przeniesieni z powrotem na stronę logowania, logujemy się nowo utworzonym użytkownikiem i mamy Gogs-a do dyspozycji.

Powiedzmy że mamy zainstalowany Gogs (w wersji produkcyjnej) i musimy wyłączyć nasz serwer. Po jego ponownym uruchomieniu i próbie połączenia z Gogs otrzymujemy błąd "502 Bad Gateway". Oznacza on mniej więcej tyle że proxy nie ma gdzie przekierować danych ponieważ usługa na podanym przez nas adresie i porcie nie odpowiada. Gogs nie został uruchomiony po starcie systemu. Musimy go uruchomić ręcznie. Jednak uruchamianie Gogs-a po każdym resecie serwera nie jest raczej mile widziane. Współczesne systemy, tak jak w moim przypadku Ubuntu posiadają bardzo zaawansowaną obsługę poziomów uruchomienia systemu jednym z nich jest systemd. Za uruchomienie konkretnych usług w danym momencie odpowiadają specjalne skrypty systemd, Gogs w swoich plikach instalacyjnych również posiada taki skrypt.

Aby dodać Gogs do autostartu, wystarczy że skopiujemy plik gogs.service z katalogu gogs/scripts/systemd do /etc/systemd/system następnie wydamy polecenie:

xf0r3m@gogs:~$ sudo systemctl enable gogs.service

W pliku nie musimy nic zmieniać, ponieważ tak zainstalowaliśmy Gogs-a, że nasze ścieżki do danych Gogs pokrywają się tymi w pliku usługi. To polecenie spowoduje zarejestrowanie nowej usługi na danym poziomie uruchomienia.

Ostatnim pakietem jaki będziemy instalować jest Gitea. Jej instalacja jest bardzo podobna do Gogs-a.

 

Gitea

A więc instalacje Gitei rozpoczynamy od zainstalowania na serwerze systemu bazodanowego może być to MySQL może być to MariaDB lub PostgreSQL.

xf0r3m@gitea:~$ sudo apt install mysql-client mysql-server

Następnym krokiem jest stworzenie bazy danych.

xf0r3m@gitea:~$ sudo mysql
mysql> CREATE DATABASE gitea;
-- ciach --
mysql> CREATE USER 'gitea'@'localhost' IDENTIFIED BY '2up3rT4jn3H4s|_0';
-- ciach --
mysql> GRANT ALL ON gitea.* TO 'gitea'@'localhost';

Kolejną czynnością jest utworzenie użytkownika, z którego uprawnieniami będziemy uruchamiać Giteę. W tym przypadku stworzymy użytkownika systemowego poniższym poleceniem.

xf0r3m@gitea:~$ sudo adduser --system --shell /bin/bash --group --disable-password --home /home/git git

Po stworzeniu użytkownika, możemy utworzyć niezbędne dla Gitei katalogi.

xf0r3m@gitea:~$ sudo mkdir -p /home/git/{custom,data,log}
xf0r3m@gitea:~$ sudo chown -R git:git /home/git
xf0r3m@gitea:~$ sudo chmod -R 750 /home/git
xf0r3m@gitea:~$ sudo mkdir /etc/gitea
xf0r3m@gitea:~$ sudo chown root:git /etc/gitea
xf0r3m@gitea:~$ sudo chmod 770 /etc/gitea

Po instalacji będziemy, musieli pamiętać o odebraniu uprawnień do zapisu w katalogu /etc/gitea oraz w pliku /etc/gitea/app.ini.

Teraz przelogujemy się na użytkownika git.

xf0r3m@gitea:~$ sudo su
root@gitea:/home/xf0r3m# su git

Bezpośrednio do katalogu domowego ściągamy plik binarny Gitei. Kiedy plik znajdzie się już na serwerze możemy go uruchomić i zainstalować Giteę.

git@gitea:~$ GITEA_WORK_DIR=/home/git ./gitea web -c /etc/gitea/app.ini

Nie musimy przejmować się brakiem pliku /etc/gitea/app.ini. Zostanie on utworzony podczas instalacji. Kiedy nasz serwer wystartuje możemy przejść pod http://<ip_serwera>:3000. Naszym oczom ukaże się strona startowa, podobna do tej, którą znamy z Gogs. Wygląda to trochę jakby nie trzeba było tego instalować, mamy w prawym górnym rogu dwa odnośniki Zaloguj się oraz Zarejestruj się, z racji tego iż musimy zarejestrować pierwszego użytkownika (pierwszy zarejestrowany użytkownik zyskuje uprawnienia administracyjne) klikamy w odnośnik Zarejestruj sie i wyświetla nam się stroną instalacji, którą już znamy z Gogs. Uzupełniamy lub zmieniamy te pola, jakie zostały wymienione przy okazji Gogs-a. Po zainstalowaniu zostaniemy przekierowani na stronę logowania, klikamy odnośnik pod przyciskiem aby zarejestrować pierwszego użytkownika. Następnie możemy się już logować.

Dla Gitei również dostępny jest plik usługi po tym adresem https://github.com/go-gitea/gitea/blob/master/contrib/systemd/gitea.service, w którym musimy zmienić parę opcji, m.in. wskazać jakiego systemy bazodanowego użyliśmy, aby wstrzymać uruchamianie Gitei do momentu uruchomienia bazy danych. Poniżej znajduje się zawartość pliku gitea.service przygotowana dla przedstawionej tutaj instalacji Gitei.

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
###
# Don't forget to add the database service requirements
###
#
Requires=mysql.service
#Requires=mariadb.service
#Requires=postgresql.service
#Requires=memcached.service
#Requires=redis.service
#
###
# If using socket activation for main http/s
###
#
#After=gitea.main.socket
#Requires=gitea.main.socket
#
###
# (You can also provide gitea an http fallback and/or ssh socket too)
#
# An example of /etc/systemd/system/gitea.main.socket
###
##
## [Unit]
## Description=Gitea Web Socket
## PartOf=gitea.service
##
## [Socket]
## Service=gitea.service
## ListenStream=<some_port>
## NoDelay=true
##
## [Install]
## WantedBy=sockets.target
##
###

[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
#RuntimeDirectory=gitea
ExecStart=/home/git/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/home/git
# If you want to bind Gitea to a port below 1024, uncomment
# the two values below, or use socket activation to pass Gitea its ports as above
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
###

[Install]
WantedBy=multi-user.target

Ten plik umieszczamy w katalogi /etc/systemd/system następnie wydajemy polecenie:

xf0r3m@gitea:~$ sudo systemctl enable gitea.service

Jeśli jeszcze tego zrobiśmy to teraz zatrzymamy naszą ręcznie uruchomioną Giteę, naciskając w oknie połaczonego z serwerem terminala Ctrl+c. Następnie wydajemy poniższe polecenia. Te polecenia zmieniają uprawnienia do pliku konfiguracyjnego Gitei.

xf0r3m@gitea:~$ sudo chmod 750 /etc/gitea
xf0r3m@gitea:~$ sudo chmod 640 /etc/gitea/app.ini

Na końcu możemy uruchomić naszą usługę z Giteą.

xf0r3m@gitea:~$ sudo systemctl start gitea.service

Jeśli chcemy Giteę uruchomić w środowisku produkcyjnym, to przydałby się HTTPS. Reverse proxy dla Gitei uruchomiamy identycznie jak dla Gogs. Nawet możemy użyć tego samego pliku konfiguracyjnego.

 

Podsumowanie

Pomiędzy tymi trzema, który wybrać. Osobiście jeśli potrzebujemy na wczoraj skonfigurować ogólnodostępnego prostego zdalnego Gita, to wybrał bym Gogsa. Instaluje się go szybko i bez wiekszych problemów, prawdopodbnie zawiera wszystko co potrzeba.

Jeśli jesteśmy na prawdę dużymi leniami, lub nie dysponujemy żadną mocą obliczeniową, którą możemy swobodnie zarządzać z Internetu, to czwartą opcją najmniej bolesną pozostaje konto na GitHub.

~xf0r3m