Synology nedávno vydal balík GIT server pro své DiskStation NAS podporující DSM 5.x. Instalace ale není tak přímočará, jak by se mohlo zdát, protože GIT Server nemá (víceméně) žádný program pro nastavení a většinu je potřeba dělat přes konzoli.
Poznámka: V článku budu počítat s tím, že již umíte používat SSH a máte připravený privátní klíč. Návodů k tomu je celá řada.
Rychlá navigace
Instalace
Nejprve jděte v DSM do Ovládací panely, Sdílení souborů, Uživatel, Rozšířené, Složka uživatele a zaškrtněte Povolit službu Složka uživatele. Pokud máte více disků, zvolte, na kterém budou vytvořeny.
SSH přístup
Pak jděte do Ovládací Panely, System, Terminál a SNMP, Terminál a zaškrtněte SSH (nebo Telnet, pokud víte proč).
Následně se pomocí Putty (nebo jiného nástroje) připojte k NAS jako root (heslo má stejné jako DSM admin), jděte do složky /etc/ssh/ a otevřete soubor sshd_config:
vi /etc/ssh/sshd_config
Stiskněte I (pro editaci) a smažte # z řádek:
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
Stiskněte ESC, pak klávesu „:“ (na české klávesnici SHIFT+.) a nakonec „w“, „q“ a ENTER.
Nyní jděte zpět do DSM do nastavení terminálu a zrušte SSH, klikněte na Použít, pak ho zase zaškrtněte a klikněte na Použít (tím vynutíte nové nastavení).
GIT složka a uživatel
Nyní musíte vytvořit sdílenou složku a uživatele, který do ní bude mít přístup. V DSM v Ovládacích panelech otevřete Sdílená složka a klikněte na Vytvořit. Zadejte jméno (např. git) a zvolte disk, kam chcete složku uložit. V oprávněních ponechte akorát „admin“ a všem ostatním uživatelům přístup zakažte.
Nyní klikněte v Ovládacích panelech na Uživatel a zvolte Vytvořit. Zadejte jméno (např. git), nechte mu vytvořit náhodné heslo (uživatel se nebude muset přímo přihlašovat – heslo tedy není důležité) a pod oprávněními mu zakažte vše kromě GIT složky (do té mu dejte právo číst a zapisovat).
Instalace GITu
V DSM jděte do Centrum balíčků a pod Nástroje najděte Git Server. Klikněte na instalovat a počkejte. Po instalaci zkontrolujte, zda je Stav: Spuštěno.
Poznámka: V nabídce nyní můžete otevřít aplikaci Git Server (pokud tam není, není server spuštěn), ale ta prakticky nic nenabízí – a to jediné, co nabízí, nefunguje příliš dobře – a tak ji nemá cenu používat. Pro jistotu v ní vůbec nic nedělejte – pouze byste si rozbili konfiguraci a zamezili GIT uživateli používat repozitáře!
Nastavení GIT uživatele
Přihlašte se přes SSH jako root
a otevřete soubor passwd:
vi /etc/passwd
V novější verzi DSM, která nepovoluje přihlášení jako root
, se musíte přihlásit jako admin a následně použít příkaz sudo -i
. Také můžete předchozí příkaz uvést se SUDO:
sudo vi /etc/passwd
Najděte řádek příslušející požadovanému git uživateli (začíná jeho jménem) a stiskněte I. Pak přepište konec řádky (který bude nejspíše „/bin/nologin“) na:
:/bin/ash
Tím povolíte uživateli používat SSH. Pokud to nebude fungovat, zkuste „/bin/sh“ nebo „/bin/bash“.
Nyní jděte do složky uživatelů:
cd /var/services/homes/
a smažte složku git uživatele:
rm -rf git/
Následně tuto složku vytvořte jako odkaz na repozitář:
ln -s /volumeX/git git chown -h git git chown git git chmod 755 git
„volumeX“ je disk, na kterém jste složku vytvořili (např. „volume1“), „git“ za „volumeX“ je jméno složky pro repozitář. U dalších příkazů je první „git“ jméno uživatele a to druhé je jméno právě vytvořeného odkazu (u posledního příkazu jsou místo jména uživatele jeho práva – jméno je odkaz). U chown s parametrem -h nastavujete vlastníka odkazu, zatímco u druhého nastavujete vlastníka odkazované složky (tedy repozitáře).
Alternativně můžete v souboru passwd přepsat složku uživatele přímo na repozitář. Rozdíl v tom ale není, a pokud něco nefunguje, je to spíše právy souborů než tím, že je složka uživatele odkaz.
Pokud již repozitář obsahuje soubory (např. repozitáře zkopírované z jiného serveru), musíte jim také nastavit vlastníka:
chown -R git git/*
Parametrem -R a hvězdičkou říkáte, že se mají zpracovat všechny soubory ve složce. První „git“ je jméno uživatele, to druhé je jméno vytvořeného odkazu.
Nyní jděte do složky repozitáře a vytvořte podsložku „.ssh“:
cd git mkdir .ssh chown git .ssh chmod 700 .ssh
Vytvořte soubor „authorized_keys“ a vložte do něj veřejný klič:
cd .ssh touch authorized_keys chown git authorized_keys chmod 600 authorized_keys vi authorized_keys
Veřejný klíč musí vypadat následovně:
ssh-rsa AAAA....XXXX nějaký komentář
nebo
ssh-rsa AAAA....XX== nějaký komentář
a musí být na jednom řádku.
Přihlášení uživatele
Nyní můžete zkusit přihlásit uživatele přes SSH pomocí soukromého klíče (private key) – pokud se zobrazí „Using username git. Authenticating with public key.“ tak je vše v pořádku. Pokud se naopak zobrazí žádost o heslo „git@diskstation’s password:“ tak jste udělali něco špatně. Zkontrolujte hlavně vlastníka (git) a práva všech výše uvedených složek (odkaz a repozitář 755, .ssh 700 a keys 600)!
Pokud se uživatel přihlásí s použitím klíče, ale pak se hned zase odhlásí a nebo se zobrazí chyba „Permition denied“, zkontrolujte nastavení v souboru „/etc/passwd“ (cesta do domovské složky a k bin/ash – příp. zkuste alternativy sh nebo bash).
Vytvoření repozitáře
Repozitář musíte opět vytvářet přes SSH, ale nyní se již stačí připojit jako GIT uživatel – který se hlásí pomocí klíče a jeho domovská složka je složka s repozitáři, takže je to bez zdržování.
Repozitář vytvoříte těmito příkazy:
mkdir myProject cd myProject git --bare init cd .. chown -R git myProject chmod -R 744 myProject
myProject je jméno repozitáře a „git“ v příkazu chown je jméno GIT uživatele – tento příkaz je potřeba, pokud se hlásíte jako root; pokud jste použili přímo GIT uživatele, bude již automaticky vlastníkem.
Klonování a Pushování
Nyní již můžete ve svém oblíbeném GIT programu (např. GitExtensions) nastavit repozitář na adresu:
ssh://git@diskstation/~/myProject
„git“ je jméno GIT uživatele, „diskstation“ je adresa NASu a „myProject“ je jméno repozitáře.
Test přístupu
Pokud se vám nedaří repozitář naklonovat nebo pushnout, můžete zkusit, co server vrací jako odpověď na git dotaz. Najděte nebo nainstalujte SSH a zadejte příkaz:
ssh git@diskstation git-receive-pack '~/myProject'
Na tento příkaz by měl server odpovědět:
1234abcd...ef refs/heads/master report-status delete-refs ... agent=git/X.Y.Z 0000
První čtyři znaky jsou délka řádku (proto poslední řádek obsahuje 0000 protože je prázdný). V prvním řádku je pak hash a jméno nejnovějšího commitu, seznam podporovaných příkazů a končí specifikací verze GIT (agent=git/X.Y.Z). Další řádky pak mohou obsahovat hashe a jména všech větví v repozitáři. Pokud server vrátí něco jiného (např. chybu nebo dotaz na heslo), není to platná GIT odpověď a váš klient odmítne komunikovat. Pak musíte podle chyby dohledat, jak problém vyřešit. Poznámka: server může vrátit dotaz na heslo jednoduše proto, že váš SSH příkaz nepodporuje přihlášení přes privátní klíč. V takovém případě zkuste naopak přihlášení přes PUTTY, které ho podporuje:
plink git@diskstation git-receive-pack '~/myProject'
Přístup s heslem
Pokud potřebujete vytvořit repozitář, do kterého se bude možno připojit pomocí hesla (protože máte nějakou speciální aplikaci, která privátní klíče nepodporuje), doporučuji vytvořit nového uživatele pro daný repozitář, abyste předešli riziku prozrazení přistupu ke všem GIT repozitářům. U přístupu přes heslo je potřeba pamatovat na to, že heslo se bude posílat v čitelné podobě a přístup tedy není nijak zabezpečen!!!
V DSM vytvořte nového uživatele (např. „pubgit“) a přiřaďte mu heslo, které bude používat pro GIT repozitář (jelikož není nijak bezpečné, může to být klidně „pubgit“ nebo „heslo“). V průvodci zakažte přístup ke všem složkám a službám. Následně mu nastavte v /etc/passwd
přístup na /bin/ash
. Podle výše uvedeného postupu vytvořte nový repozitář, který mu bude patřit:
cd /volumeX/git/ mkdir pub.git cd pub.git git --bare init cd .. chown -R pubgit pub.git chmod -R 744 pub.git
Nyní jděte do HOME složky a změňte domovskou složku nového uživatele na vytvořený repozitář:
cd /var/services/homes rm -r pubgit ln -s /volumeX/git/pub.git pubgit chown -h pubgit pubgit chown pubgit pubgit chmod 755 pubgit chown -R pubgit pubgit/*
Nyní můžete přistupovat k repozitáři přes adresu ssh://pubgit:heslo@diskstation/~
(kde heslo
je heslo uživatele a diskstation je adresa serveru). Pozor ale na to, že tato adresa je určena jen pro specifické programy, které vyžadují heslo. Naopak programy jako Git Extensions neumí heslo v adrese použít a zobrazí chybu fatal: protocol error: bad line length character:
, za kterou budou následovat první 4 znaky ze jména uživatele (to proto, že se Synology ptá na SSH heslo místo aby poslalo odpověď).
Poznámka: Pokud později změníte heslo pro daného uživatele přes DSM (příkaz passwd
nefunguje), budete muset znovu nastavit přistup v /etc/passwd
.