Déploiement : CI/CD GitLab + image frontend de prod + Caddy
Remplace la chaîne GitHub Actions (jamais réellement branchée : aucun remote git n'existait) par une chaîne GitLab CI/CD, et comble un manque qu'elle avait déjà : le frontend n'était jusqu'ici jamais construit ni déployé en production. - `.gitlab-ci.yml` : tests (backend + frontend) à chaque push ; sur `main`, build des images backend et frontend (registre de conteneurs GitLab) puis déploiement SSH sur le VPS (pull, migration Alembic, up -d). - `frontend/Dockerfile.prod` + `frontend/nginx.conf` : build Vite statique servi par nginx (repli SPA sur index.html). `VITE_API_MODE`/ `VITE_EDITION_ID` sont des variables de build, passées en `--build-arg` depuis la variable CI/CD `VITE_EDITION_ID`. - `deploy/docker-compose.prod.yml` : ajout du service `frontend` ; `backend` et `frontend` ne publient plus que sur `127.0.0.1` (Caddy, déjà installé sur le serveur, devient l'unique porte d'entrée publique). - `deploy/Caddyfile.benevoles` : bloc de vhost à ajouter au Caddy existant (`/api/*` vers le backend avec préfixe retiré, le reste vers le frontend). - `deploy/README.md` : runbook complet (remote GitLab, variables CI/CD, préparation du VPS, création de l'édition de production avant le premier build frontend, vhost Caddy). - CLAUDE.md et README.md mis à jour en conséquence. Vérifié : `docker compose -f deploy/docker-compose.prod.yml config`, build réel de l'image frontend de prod, / et une route SPA (/grille) répondent 200 via nginx. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
367dfe42eb
commit
d5f67b2701
@@ -335,10 +335,11 @@ fonctions d'IA. *(L'envoi d'emails par SMTP est en place — voir § 2.)*
|
||||
├── README.md
|
||||
├── docker-compose.yml # dev : db + backend (hot reload)
|
||||
├── .env.example
|
||||
├── .github/workflows/deploy.yml # CI/CD : build → GHCR → SSH sur le VPS
|
||||
├── .gitlab-ci.yml # CI/CD : tests → build (registre GitLab) → SSH sur le VPS
|
||||
├── deploy/
|
||||
│ ├── docker-compose.prod.yml
|
||||
│ └── README.md # secrets requis, setup VPS
|
||||
│ ├── docker-compose.prod.yml # db + backend + frontend, ports en 127.0.0.1
|
||||
│ ├── Caddyfile.benevoles # bloc à ajouter au Caddy du VPS (reverse proxy)
|
||||
│ └── README.md # variables CI/CD requises, mise en service du VPS
|
||||
├── docker/postgres-init/ # création de la base de test au 1er boot
|
||||
├── backend/
|
||||
│ ├── pyproject.toml # géré par uv
|
||||
@@ -417,15 +418,26 @@ Aucune dépendance locale requise hors Docker.
|
||||
|
||||
## 9. Déploiement
|
||||
|
||||
- Dépôt GitHub. VPS avec Docker.
|
||||
- `.github/workflows/deploy.yml` : sur chaque push `main` → build de l'image
|
||||
backend → push sur `ghcr.io/<owner>/<repo>-backend` → SSH sur le VPS →
|
||||
`docker compose -f docker-compose.prod.yml pull && up -d`.
|
||||
- Secrets requis (voir `deploy/README.md`) : `SSH_HOST`, `SSH_USER`,
|
||||
`SSH_KEY`, `DEPLOY_PATH`, `GHCR_TOKEN`.
|
||||
- Dépôt GitLab. VPS avec Docker + un Caddy déjà installé en service système
|
||||
(hors de ce dépôt), qui reçoit tout le trafic public en HTTPS et fait
|
||||
reverse proxy vers les conteneurs.
|
||||
- `.gitlab-ci.yml` : à chaque push, tests (backend + frontend) ; sur `main`
|
||||
seulement, build des images `backend` et `frontend` (registre de conteneurs
|
||||
du projet GitLab) puis SSH sur le VPS → copie de
|
||||
`deploy/docker-compose.prod.yml` → `pull` → migration Alembic → `up -d`.
|
||||
- Le frontend est un **build statique** (`frontend/Dockerfile.prod`, servi par
|
||||
nginx) : `VITE_API_MODE`/`VITE_EDITION_ID` sont figées au moment du build,
|
||||
pas à l'exécution — l'édition de production doit donc exister avant la
|
||||
première construction de cette image (voir `deploy/README.md`).
|
||||
- Variables CI/CD requises (voir `deploy/README.md`) : `SSH_HOST`, `SSH_USER`,
|
||||
`SSH_KEY`, `DEPLOY_PATH`, `VITE_EDITION_ID`.
|
||||
- Le VPS porte un fichier `.env` (non versionné) avec `POSTGRES_USER`,
|
||||
`POSTGRES_PASSWORD`, `POSTGRES_DB`, `JWT_SECRET`, `PUBLIC_BASE_URL` et les
|
||||
variables `EMAIL_ENABLED` / `SMTP_*` (voir `deploy/README.md`).
|
||||
- `backend` et `frontend` n'écoutent que sur `127.0.0.1` (voir
|
||||
`docker-compose.prod.yml`) : `deploy/Caddyfile.benevoles` est le bloc à
|
||||
ajouter au Caddyfile du serveur pour les exposer publiquement (`/api/*` vers
|
||||
le backend avec le préfixe retiré, le reste vers le frontend).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user