# 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 ` — é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.