xpeditis2.0/infra/prod/env/github-secrets.md
2026-09-07 21:40:50 +02:00

3.0 KiB

Secrets et variables GitHub Actions — production

Dépôt → Settings → Environments → production.

Utiliser un Environment et non des secrets de dépôt permet d'exiger une approbation manuelle avant tout déploiement, et empêche une branche non protégée d'accéder à ces valeurs.

Activez « Required reviewers » sur l'environnement production. Sans cela, n'importe quel push sur main déploie sans validation humaine.


Secrets

Nom Contenu Comment l'obtenir
REGISTRY_TOKEN Jeton du registre Scaleway (lecture + écriture) Console Scaleway → Container Registry → jetons. Déjà utilisé par la preprod.
HCLOUD_TOKEN_CICD Jeton API Hetzner Cloud Console Hetzner → Security → API tokens. Read & Write (nécessaire pour ouvrir/fermer le firewall CI). Jeton distinct de celui de Terraform, pour pouvoir le révoquer seul.
PROD_SSH_HOST IP publique de app-01 make tf-output
PROD_SSH_USER deploy
PROD_SSH_KEY Clé privée SSH dédiée à la CI ssh-keygen -t ed25519 -a 100 -C "github-actions-prod" -f ci_deploy puis ajouter la clé publique dans ~deploy/.ssh/authorized_keys sur app-01. Ne réutilisez pas votre clé personnelle.
PROD_SSH_KNOWN_HOSTS Empreinte du serveur ssh-keyscan -H <IP_APP_01> — évite qu'un détournement DNS/BGP redirige le déploiement vers une machine tierce.
NEXT_PUBLIC_API_URL_PROD https://api.xpeditis.com Figé dans l'image frontend au build.
NEXT_PUBLIC_APP_URL_PROD https://app.xpeditis.com idem
DISCORD_WEBHOOK_URL Webhook du canal de déploiement Déjà utilisé par la preprod.

Variables (non sensibles)

Nom Valeur
PROD_API_URL https://api.xpeditis.com
PROD_APP_URL https://app.xpeditis.com
HCLOUD_CICD_FIREWALL xpeditis-prod-fw-cicd

Restreindre la clé SSH de la CI

La clé de déploiement n'a besoin que de lancer un script. Limitez-la dans ~deploy/.ssh/authorized_keys sur app-01 :

restrict,pty,command="/opt/xpeditis/infra-prod/scripts/ssh-deploy-wrapper.sh" ssh-ed25519 AAAA... github-actions-prod

restrict désactive le transfert de ports, d'agent et X11. Le command= force l'exécution du wrapper quelle que soit la commande demandée : une clé volée ne donne pas un shell.

rsync a besoin d'exécuter sa propre commande. Le wrapper l'autorise explicitement en inspectant SSH_ORIGINAL_COMMAND — voir scripts/ssh-deploy-wrapper.sh.


Ce qui ne doit PAS être un secret GitHub

  • La clé privée age / SOPS. Elle déchiffre tous les secrets de production. Les secrets sont appliqués depuis votre poste (make secrets-apply), pas depuis la CI. Un dépôt compromis ne doit pas donner les mots de passe de la base.
  • Le kubeconfig. L'API Kubernetes n'est ouverte qu'à vos IP d'administration ; la CI passe par SSH et utilise le kubeconfig local du serveur.
  • Le token Terraform. Il peut détruire l'infrastructure. Il reste sur votre poste.