Ce guide s'appuie sur la documentation de GitHub, relue le 14 octobre 2026 : utiliser des secrets et la syntaxe des workflows. L'exemple déploie une application Docker Compose dont le code est déjà cloné sur le serveur, dans ~/app.
Les étapes, dans l'ordre :
- Créer une clé réservée au déploiement.
- Ajouter sa clé publique au serveur.
- Relever la clé du serveur.
- Ranger les secrets dans le dépôt.
- Écrire le workflow.
- Essayer.
1. Créer une clé réservée au déploiement
Sur votre ordinateur, créez une paire de clés à part, sans phrase de passe puisque le workflow l'utilise sans vous :
ssh-keygen -t ed25519 -f deploiement -N "" -C "github-actions"
Vous obtenez deploiement, la clé privée, et deploiement.pub, la clé publique. Ne réutilisez jamais votre clé personnelle : une clé dédiée se retire seule le jour où le dépôt change de mains.
2. Ajouter la clé publique au serveur
Ajoutez le contenu de deploiement.pub sur une nouvelle ligne de ~/.ssh/authorized_keys, sur le compte qui déploie ; la marche à suivre est dans Ajouter une clé SSH sur un serveur Linux.
Pour limiter ce que la clé permet, la page de manuel de sshd décrit des options à placer en tête de la ligne. restrict coupe le transfert de ports, d'agent et de fenêtres, ainsi que l'ouverture d'un terminal ; command="..." force une commande unique quelle que soit celle demandée. Avec une commande forcée, le workflow ne peut lancer que votre script de déploiement.
3. Relever la clé du serveur
Le workflow doit reconnaître le serveur, sans quoi SSH demande une confirmation que personne ne donnera. Depuis votre ordinateur :
ssh-keyscan -t ed25519 adresse-du-serveur
La commande rend la clé publique d'hôte du serveur. Avant de lui faire confiance, affichez son empreinte avec ssh-keyscan -t ed25519 adresse-du-serveur | ssh-keygen -lf - et comparez-la à celle que vous avez acceptée lors de votre première connexion : c'est ce contrôle qui protège contre un faux serveur.
4. Ranger les secrets dans le dépôt
Sur GitHub, ouvrez le dépôt, puis Settings, Secrets and variables, Actions, onglet Secrets, et New repository secret. Créez trois secrets :
| Nom | Contenu |
|---|---|
SSH_PRIVATE_KEY | tout le fichier deploiement, lignes de début et de fin comprises |
SSH_KNOWN_HOSTS | la ligne rendue par ssh-keyscan |
SSH_HOST | admin@adresse-du-serveur |
Supprimez ensuite le fichier deploiement de votre ordinateur, ou rangez-le dans votre gestionnaire de mots de passe : il n'a pas à traîner sur un disque.
5. Écrire le workflow
Créez le fichier .github/workflows/deployer.yml dans le dépôt :
name: Déployer
on:
push:
branches: [main]
concurrency:
group: deploiement
cancel-in-progress: false
jobs:
deployer:
runs-on: ubuntu-latest
steps:
- name: Préparer SSH
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
SSH_KNOWN_HOSTS: ${{ secrets.SSH_KNOWN_HOSTS }}
run: |
mkdir -p ~/.ssh
printf '%s\n' "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
printf '%s\n' "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_ed25519
- name: Mettre à jour le serveur
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
run: |
ssh "$SSH_HOST" 'cd ~/app && git pull && docker compose up -d --build'
Le bloc concurrency empêche deux déploiements de se chevaucher. Les secrets passent par des variables d'environnement, comme le conseille GitHub : sur une ligne de commande, ils pourraient être visibles des autres processus de la machine.
6. Essayer
Envoyez un commit sur main, puis suivez l'exécution dans l'onglet Actions du dépôt. En cas d'échec, le journal de l'étape montre l'erreur de SSH ou de la commande distante.
Sur un VPS Hubspace
Le port 22 est ouvert depuis Internet, ce dont les machines de GitHub ont besoin pour joindre le serveur. Le compte à utiliser est admin, qui lance Docker sans sudo ; la connexion se fait par clé seulement, ce qui convient au workflow. fail2ban bloque une heure une adresse qui échoue cinq fois en dix minutes : un secret mal recopié peut donc faire bloquer temporairement les serveurs de GitHub. Les serveurs VPS décrivent ce qui est livré.
Questions fréquentes
Faut-il une action toute faite pour SSH ?
Non. Le client OpenSSH figure dans la liste des logiciels de l'image Ubuntu 24.04 des machines de GitHub, et l'exemple s'en sert directement. Une action tierce fonctionne aussi, mais elle ajoute du code extérieur qui manipule votre clé : lisez-la avant de lui confier un secret.
Peut-on construire l'image sur GitHub plutôt que sur le serveur ?
Oui. Le workflow peut construire l'image, la pousser dans un registre, puis le serveur la récupère avec docker compose pull. Le serveur travaille moins, et le déploiement va plus vite.
Comment retirer l'accès ?
Supprimez la ligne de la clé dans ~/.ssh/authorized_keys du serveur, puis les secrets du dépôt. Le workflow échoue dès le déploiement suivant.
Peut-on faire la même chose sans GitHub ?
Oui, avec une forge installée sur votre serveur, comme Gitea, dont les Actions sont en grande partie compatibles avec celles de GitHub.
Articles liés
- Pointer un nom de domaine vers son VPSPointer un nom de domaine ou un sous-domaine vers l'adresse IP de votre VPS avec un enregistrement A, vérifier la propagation et préparer le certificat HTTPS.
- Certificat SSL sur un VPS : Caddy ou CertbotObtenir un certificat SSL gratuit Let's Encrypt sur votre VPS avec Caddy, Traefik ou Certbot, le renouveler sans y penser, et corriger les échecs de validation.
- Quel VPS choisir : la bonne taille de serveurQuel VPS choisir : partir de la mémoire dont vos applications ont besoin, puis de la vitesse attendue. Repères par usage et signes qu'il faut monter.