Configurer une clé SSH
Ce guide explique comment configurer une clé SSH pour cloner, pousser et gérer tous vos dépôts Gitea sans mot de passe.
1. Une seule clé suffit pour tous vos dépôts
En SSH, la clé publique est rattachée à votre compte utilisateur Gitea, pas à un dépôt en particulier. Une fois ajoutée une seule fois dans Paramètres → Clés SSH/GPG, elle vous donne accès en SSH à :
- tous les dépôts dont vous êtes propriétaire,
- tous les dépôts d'organisation où vous avez des droits (lecture/écriture selon vos permissions),
- avec les mêmes droits que ceux définis dans l'interface web (une clé SSH ne donne pas plus de droits qu'un compte n'en a déjà).
Inutile donc de créer une clé par dépôt.
2. Générer une clé SSH (si vous n'en avez pas déjà une)
ssh-keygen -t ed25519 -C "votre_email@example.com" -f ~/.ssh/id_ed25519_gitea
ed25519: algorithme moderne, recommandé (plus court et au moins aussi sûr que RSA).- Une passphrase est demandée : renseignez-en une (voir §6, bonnes pratiques).
- Si vous avez déjà une clé SSH que vous souhaitez réutiliser, passez directement à l'étape 3 avec
~/.ssh/id_ed25519(ou le nom de votre clé existante) à la place de~/.ssh/id_ed25519_giteadans la suite de ce guide.
3. Ajouter la clé publique à votre compte Gitea
Afficher la clé publique à copier :
cat ~/.ssh/id_ed25519_gitea.pub
Dans l'interface web de Gitea :
- Paramètres du compte (icône profil, en haut à droite) → Clés SSH/GPG
- Ajouter une clé → coller le contenu de
id_ed25519_gitea.pub - Donner un nom explicite à la clé (ex :
laptop-perso,poste-bureau) — utile pour la révoquer précisément plus tard sans casser l'accès de vos autres machines - Valider
4. Configurer le client SSH (~/.ssh/config)
Le serveur SSH intégré de Gitea écoute sur le port 2222 (et non 22). Un alias dans ~/.ssh/config évite d'avoir à le préciser à chaque commande :
Host git.mondomain.ovh
HostName git.mondomain.ovh
Port 2222
User git
IdentityFile ~/.ssh/id_ed25519_gitea
IdentitiesOnly yes
chmod 600 ~/.ssh/config
5. Tester la connexion
ssh -T git@git.mondomain.ovh
Réponse attendue :
Hi <votre_nom_utilisateur>! You've successfully authenticated, but Gitea does not provide shell access.
C'est normal : Gitea confirme l'authentification mais ne donne volontairement pas de shell.
Sans l'alias ~/.ssh/config configuré à l'étape 4 :
ssh -T -p 2222 git@git.mondomain.ovh
6. Cloner, pousser, committer
Cloner un nouveau dépôt (avec l'alias configuré) :
git clone git@git.mondomain.ovh:USER/REPO.git
Sans alias :
git clone ssh://git@git.mondomain.ovh:2222/USER/REPO.git
Basculer un dépôt existant (cloné en HTTP) vers SSH :
git remote set-url origin git@git.mondomain.ovh:USER/REPO.git
Ensuite, git add, git commit, git push, git pull fonctionnent normalement : l'authentification est entièrement gérée par la clé SSH, plus besoin de nom d'utilisateur ni de mot de passe/token.
7. Bonnes pratiques (DevSecOps)
- Une clé par appareil, pas une clé unique copiée sur toutes vos machines : en cas de perte ou de compromission d'un appareil, vous pouvez révoquer uniquement sa clé sans couper l'accès des autres.
- Toujours une passphrase sur la clé privée, combinée à
ssh-agentpour ne pas la retaper à chaque commande :eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519_gitea - La clé privée (
id_ed25519_gitea, sans.pub) ne doit jamais quitter votre machine : vérifierchmod 600 ~/.ssh/id_ed25519_giteaetchmod 700 ~/.ssh. - Nommez explicitement chaque clé ajoutée dans Gitea (étape 3) : l'interface affiche aussi la date de dernière utilisation, utile pour repérer une clé oubliée/inutilisée à révoquer.
- Révoquer immédiatement une clé en cas de perte/vol de l'appareil correspondant : Paramètres → Clés SSH/GPG → supprimer la clé concernée.
8. Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
Permission denied (publickey) |
Clé non ajoutée dans Gitea, ou mauvaise clé utilisée | ssh -vT git@git.mondomain.ovh pour voir quelle clé est proposée ; vérifier qu'elle correspond bien à celle ajoutée dans Gitea |
Permission denied (publickey) malgré une clé correcte |
Plusieurs clés dans l'agent SSH, la mauvaise est essayée en premier | Ajouter IdentitiesOnly yes dans ~/.ssh/config (voir §4) |
ssh: connect to host ... port 22: Connection refused |
Le port 2222 n'est pas utilisé (alias non configuré ou oublié dans l'URL) |
Utiliser l'alias ~/.ssh/config, ou ssh://git@git.mondomain.ovh:2222/... |
Timeout / Connection refused sur le port 2222 |
Port fermé côté pare-feu ou conteneur non démarré | sudo ufw status côté serveur ; docker compose ps (le port 2222 doit apparaître) |
Bad permissions / clé ignorée par SSH |
Droits trop ouverts sur ~/.ssh ou la clé privée |
chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519_gitea |
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! qui revient à chaque redémarrage du conteneur |
Clés hôte SSH du serveur (pas de votre poste) illisibles par le conteneur — voir §9 | Corriger les permissions de data/data/ssh/ côté serveur (voir §9) |
Clé refusé après redémarrage du service
Côté serveur : la clé hôte change à chaque redémarrage du conteneur
Symptôme : l'avertissement "REMOTE HOST IDENTIFICATION HAS CHANGED" réapparaît après chaque redémarrage de gitea, même en supprimant l'entrée dans known_hosts et en faisant confiance à la nouvelle clé à chaque fois — le fingerprint proposé change encore la fois suivante.
Cause : les fichiers de clés hôte SSH persistées (data/data/ssh/gitea.rsa, ssh_host_ecdsa_key, ssh_host_ed25519_key...) appartiennent à root:root en mode 600 au lieu de 1000:1000 (l'UID git du conteneur rootless). Gitea échoue silencieusement à charger ces clés persistées — visible dans les logs :
docker compose logs gitea | grep -i -A1 "Adding SSH host key"
# [I] Adding SSH host key: /var/lib/gitea/data/ssh/gitea.rsa
# [E] Failed to set Host Key. open /var/lib/gitea/data/ssh/gitea.rsa: permission denied
Le serveur SSH démarre quand même, mais avec une clé hôte générée en mémoire, différente à chaque redémarrage du conteneur — d'où l'avertissement qui revient sans cesse, même après avoir fait confiance à la clé précédente : elle n'est jamais la même deux fois.
Ce cas survient typiquement après une restauration/migration manuelle où le dossier ssh/ a été copié avec sudo séparément du reste des données (voir aussi BACKUP.md, §7, sur la correspondance UID à respecter côté serveur).
Correction, côté serveur :
sudo chown -R 1000:1000 data/data/ssh
docker compose restart gitea
# Vérifier que le chargement réussit désormais (plus de ligne [E])
docker compose logs gitea | grep -i -A1 "Adding SSH host key"
Puis côté client, une dernière fois (la clé hôte restera stable à partir de maintenant) :
ssh-keygen -f ~/.ssh/known_hosts -R "[git.mondomain.ovh]:2222"
ssh -T -p 2222 git@git.mondomain.ovh
No comments to display
No comments to display