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

70 lines
3.0 KiB
Markdown

# 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.