Úvod
Pokud jste nečetli poslední dva díly, které se věnovaly SCM nástroji Git, základům jeho používání a jeho jednoduchému nasazení na vlastní server, projděte si první díl a druhý díl, abyste byli v obraze.
Představili jsme zde jednoduché techniky zprovoznění centrálního Git repozitáře. Probrali jsme v zásadě dvě možnosti – veřejný read-only přístup k repozitáři prostřednictvím Git démona a kompletní (read-write) přístup přes SSH. Obojí je velmi jednoduché na zprovoznění (je-li vůbec třeba něco zprovozňovat), avšak pro některá použití nemusí takto jednoduché techniky představovat optimální řešení, jelikož jim chybí možnost jemněji definovat pravidla přístupu a hlavně neumožňují bezpečný přístup více uživatelů k jednomu repozitáři. Gitosis je jedním z nástrojů, který umožňuje přístup k repozitářům definovat detailněji a pro více uživatelů. Lze jej integrovat s webovou aplikací Gitweb a Git démonem, i když to v Debianu nefunguje out-of-the-box (postup, jak toho docílit, bude naznačen).
Dodám, že Gitosis neumožňuje úplně nejjemnější dělení přístupových práv. V zásadě umožňuje víceuživatelský přístup k jednotlivým repozitářům a pro každého uživatele (nebo skupinu) umožňuje definovat oprávnění buď k read-only nebo read-write přístupu. Ačkoliv je to oproti dříve představeným metodám podstatné zlepšení, existují ještě sofistikovanější nástroje, jako např. Gitolite.
Gitosis používá ke svému nastavení Git. Při instalaci dojde k vytvoření správcovského repozitáře, prostřednictvím kterého je pak možné měnit nastavení a připravovat půdu pro nové repozitáře. Pro přístup je používán SSH server a veřejné klíče. Pokud vám není jasná problematika použití SSH klíčů, přečtěte si můj Úvod do SSH pro správce. Ve zbytku článku předpokládám, že tuto problematiku ovládáte.
Gitosis je vázán na jednoho konkrétního uživatele, v Debianu je to stejnojmenný uživatel, tedy gitosis
. Gitosis řídí přístup jednotlivých uživatelů prostřednictvím konfigurace a SSH klíčů. Žádné uživatelské účty se při práci s ním nezakládají. Z pohledu systému vše probíhá pod jedním uživatelem.
Instalace a zprovoznění Gitosis
Prvním krokem nemůže být nic jiného než nainstalování příslušného balíčku. V repozitářích Debianu je k dispozici stejnojmenný balíček gitosis
, který nainstalujte takto:
aptitude install gitosis
Pokud se vás během instalace Debconf nezeptá na SSH klíč, který má být použit pro přístup k repozitáři správce, nedojde k vytvoření tohoto repozitáře, a bude tedy nutné jej vytvořit ručně (obvyklý trik s dpkg-reconfigure gitosis
zde nejspíše nezabere, alespoň dle mých pokusů). Ruční vytvoření repozitáře je však velmi jednoduché:
sudo -H -u gitosis gitosis-init < id_rsa.pub
Předpokladem je dostupnost souboru id_rsa.pub
s veřejným SSH klíčem, který budete používat pro přístup ke správcovskému repozitáři gitosis-admin
.
Nastavení Gitosis
V tuto chvíli byste měli mít možnost naklonovat správcovský repozitář na svém počítači.
git clone gitosis@server.example.org:gitosis-admin.git
Pokud se podíváte do obsahu repozitáře, naleznete soubor gitosis.conf
(hlavní konfigurační soubor Gitosis) a adresář keydir
. Ten slouží jako úložiště SSH klíčů jednotlivých uživatelů.
Výchozí konfigurační soubor je velmi strohý. Příklad komentovaného konfiguračního souboru pro inspiraci naleznete např. v /usr/share/doc/gitosis/examples/example.conf
(platí pro Debian).
Obecné nastavení Gitosis naleznete v bloku [gitosis]
:
[gitosis] gitweb = no daemon = no
Zde se nastavuje globální zpřístupnění repozitářů Gitwebu a Git démona (aby toto nastavení mělo kýžený účinek, je třeba provést integraci těchto dvou nástrojů s Gitosis, což je naznačeno níže). Zpřístupnění repozitářů těmto nástrojům lze nastavit jak na globální úrovni zde, tak na úrovni jednotlivých repozitářů (viz níže).
Nastavení repozitáře
Nastavení repozitáře není nutné, stačí jméno repozitáře přiřadit konkrétní skupině uživatelů (viz níže). Pokud však chcete nastavit některé parametry repozitáře, vytvořte nový blok s jeho definicí, takto:
[repo mujprojekt] gitweb = yes description = Popis mého projektu owner = Michal Dočekal daemon = yes
V definici je naznačená integrace s Gitwebem a Git démonem (viz výše). Přístupnost repozitáře přes Gitweb řídí proměnná gitweb
, přičemž pokud ji nastavíte na yes
, doporučuji vyplnit i proměnné description
(popis) a owner
(jméno vlastníka). Tyto dvě proměnné slouží primárně pro integraci s Gitwebem. Poslední proměnná, daemon
, řídí integraci s Git démonem.
Integrace s Gitwebem
Za účelem integrace Gitosis s Gitwebem upravte hodnoty v konfiguračním souboru /etc/gitweb.conf
, takto:
$projectroot = "/srv/gitosis/git"; $projects_list = "/srv/gitosis/gitosis/projects.list"; $strict_export = "true";
Integrace s Git démonem
Integrace s Git démonem je trošku složitější. V první řadě je potřeba upravit parametry startovacího skriptu Git démona v souboru /etc/service/git-daemon/run
. Zde nalezněte řádku se specifikací --base-path
:
--base-path=/var/cache /var/cache/git
Jak je vidět, tato cesta neukazuje do úložiště Gitosis, tudíž v tomto stavu Git démon jednotlivé repozitáře „neuvidí“. Nastavte tedy správnou cestu, takto:
--base-path=/srv/gitosis/git /srv/gitosis/git
Soubor uložte a následně restartujte Git démona:
sv restart git-daemon
Poté by povolené repozitáře mělo být možné klonovat, takto:
git clone git://server.example.org/mujprojekt1.git
Nastavení uživatelů a přístupových práv
Výchozí nastavení Gitosis zahrnuje skupinu gitosis-admin
, jejíž členové mají práva k repozitáři správce:
[group gitosis-admin] writable = gitosis-admin members = docekal
Pokud byste chtěli vytvořit skupinu skupina
obsahující uživatele milan
a jan
s přístupem k repozitářům mujprojekt1
, mujprojekt2
a mujprojekt3
tak, aby uživatelé skupiny měli přístup k repozitářům mujprojekt1
a mujprojekt2
pouze pro čtení a k repozitáři mujprojekt3
i se zápisem, vypadala by konfigurace takto:
[group skupina] writable = mujprojekt3 readonly = mujprojekt1 mujprojekt2 members = milan jan
Mezi členy (members
) může patřit i jiná skupina – tu je ovšem třeba označit zavináčem na začátku:
members = @nejaka_skupina
U uživatelů se předpokládá existence souborů s jejich SSH klíči. Uživatel milan
by měl mít klíč v keydir/milan.pub
. Po nastavení a přidání klíčů změny commitněte a nahrajte na server:
git add gitosis.conf keydir git commit -m 'nastaveni repositaru' git push
Workflow pro jednotlivé repozitáře
Ve chvíli, kdy máte hotové nastavení oprávnění a repozitářů, je konečně můžete začít tvořit a nahrávat na server. Sada příkazů od vytvoření repozitáře až k jeho prvotnímu nahrání na server by mohla vypadat takto:
mkdir projekt
cd projekt
git init
git remote add origin gitosis@server.example.org:projekt.git
# vytvoření souborů a adresářů s obsahem repozitáře
git add *
git commit -m "initial commit"
git push origin master:refs/heads/master
Význam většiny příkazů by měl být patrný. Jádro postupu tvoří dva příkazy. První slouží k přidání serveru s Gitosis jako vzdáleného repozitáře:
git remote add origin gitosis@server.example.org:projekt.git
Druhý pak v prázdném repozitáři na serveru vytvoří „master“ větev z místní „master“ větve. Příkaz nemusíte opakovat, podruhé stačí git push
.
git push origin master:refs/heads/master