Git na serveru: deploy klíče pro soukromé GitHub repozitáře
Jak bezpečně klonovat soukromý repozitář na VPS – deploy klíč jen pro čtení, více repozitářů přes ~/.ssh/config, safe.directory a alternativa s tokenem.
Chcete na VPS udělat git clone soukromého repozitáře a pak jen git pull při každé aktualizaci. Nejhorší řešení je zkopírovat na server svůj osobní SSH klíč – ten má přístup ke všem vašim repozitářům a účtu. Správně je použít deploy klíč: SSH klíč svázaný s jediným repozitářem.
Co je deploy klíč
- Veřejný SSH klíč přidaný do nastavení jednoho repozitáře (ne účtu).
- Ve výchozím stavu má přístup jen pro čtení – server může stahovat, ale nemůže pushovat.
- Když server někdo kompromituje, útočník získá přístup jen k tomuto repozitáři, a to jen ke čtení.
- Jeden klíč lze na GitHubu použít jako deploy klíč jen u jednoho repozitáře.
Krok 1: vygenerujte klíč na serveru
Přihlaste se jako uživatel, pod kterým aplikace běží (ne root):
ssh-keygen -t ed25519 -f ~/.ssh/deploy_mojeapp -N "" -C "deploy mojeapp@$(hostname)"
cat ~/.ssh/deploy_mojeapp.pub
Klíč bez passphrase (-N "") je tu v pořádku – server ho musí používat bez interakce. Privátní klíč nikdy neopouští server.
Krok 2: přidejte klíč do repozitáře
Na GitHubu: repozitář → Settings → Deploy keys → Add deploy key. Vložte obsah .pub souboru, pojmenujte ho (např. „VPS produkce“) a nezaškrtávejte Allow write access, pokud server nemusí pushovat.
Totéž přes GitHub CLI:
gh repo deploy-key add ~/.ssh/deploy_mojeapp.pub --repo firma/mojeapp --title "VPS produkce"
Krok 3: SSH konfigurace
Aby Git věděl, který klíč použít, a aby šlo mít více repozitářů s různými klíči, vytvořte alias v ~/.ssh/config:
Host github-mojeapp
HostName github.com
User git
IdentityFile ~/.ssh/deploy_mojeapp
IdentitiesOnly yes
IdentitiesOnly yes zajistí, že SSH nezkouší jiné klíče – jinak by GitHub mohl přijmout špatný klíč a odmítnout přístup k repozitáři.
chmod 600 ~/.ssh/config ~/.ssh/deploy_mojeapp
Ověření:
ssh -T git@github-mojeapp
# Hi firma/mojeapp! You've successfully authenticated, but GitHub does not provide shell access.
Pozdrav obsahuje jméno repozitáře – poznáte, že se použil správný deploy klíč.
Krok 4: klonování
V adrese místo github.com použijte alias:
git clone git@github-mojeapp:firma/mojeapp.git /srv/mojeapp
U existujícího klonu změňte remote:
git remote set-url origin git@github-mojeapp:firma/mojeapp.git
Druhý repozitář? Nový klíč, nový deploy key v GitHubu, nový blok Host github-druhaapp v configu.
Aktualizace na serveru
Bezpečný pull, který selže místo vytvoření merge commitu, když se historie rozešla:
cd /srv/mojeapp
git pull --ff-only
Pokud na serveru nikdy nic neupravujete ručně (a neměli byste), můžete vynutit přesný stav větve:
git fetch origin
git reset --hard origin/main
Tento postup je základem automatického deploye přes GitHub Actions.
Časté problémy
Permission denied (publickey)
- Spouštíte Git jako jiný uživatel (např. sudo git pull použije klíče roota).
- Špatná práva k ~/.ssh (má být 700, klíče 600).
- Diagnostika: ssh -vT git@github-mojeapp ukáže, který klíč se zkouší.
ERROR: Repository not found
- Klíč patří k jinému repozitáři. Zkontrolujte pozdrav z ssh -T.
detected dubious ownership in repository
- Složku vlastní jiný uživatel, než který Git spouští. Řešení je opravit vlastníka (sudo chown -R deploy:deploy /srv/mojeapp), případně repozitář výslovně povolit:
git config --global --add safe.directory /srv/mojeapp
Host key verification failed
- Při prvním připojení k GitHubu je potřeba přijmout otisk serveru. Přidejte ho předem:
ssh-keyscan -t ed25519 github.com >> ~/.ssh/known_hosts
Otisk ověřte proti hodnotám zveřejněným v dokumentaci GitHubu (GitHub’s SSH key fingerprints).
Alternativa: fine-grained token přes HTTPS
Pokud SSH nelze použít (firewall blokuje port 22 ven), vytvořte v GitHubu fine-grained personal access token omezený na jeden repozitář s oprávněním Contents: Read-only a nastavte credential helper:
git config --global credential.helper store
git clone https://github.com/firma/mojeapp.git
# Username: váš GitHub login, Password: token
Pozor, store ukládá token v čitelné podobě do ~/.git-credentials. Token má expiraci – nastavte si připomínku. Pro serverové nasazení je deploy klíč obvykle praktičtější. Jako další alternativa existuje SSH přes port 443 (HostName ssh.github.com, Port 443).
Když server potřebuje i pushovat
Například skript, který commituje vygenerované soubory. Zaškrtněte u deploy klíče Allow write access, ale zvažte ochranu větve main a pushování do samostatné větve.
Tip
V ColdHost AI můžete připojit VPS přes SSH a pracovat s gitem na serveru (clone, pull, commit, push) přes propojení s GitHubem. Navržené příkazy vždy vidíte a každý schvalujete kliknutím.