Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
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 quelpushsurmaindé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.
rsynca besoin d'exécuter sa propre commande. Le wrapper l'autorise explicitement en inspectantSSH_ORIGINAL_COMMAND— voirscripts/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.