Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
70 lines
3.0 KiB
Markdown
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.
|