Infrastructure partagée — PostgreSQL + Redis (shared_infra)¶
Résumé¶
PostgreSQL et Redis sont sortis des stacks individuelles et mis dans un réseau Docker partagé shared_infra. Tous les projets du VPS connectent leur backend à ce réseau pour accéder à la DB et au cache, sans dupliquer les containers.
Mis en place le 20260513 à partir de PsychoEnLigne. Validé en production.
Architecture¶
shared_infra (réseau Docker)
├── shared-postgres (port 5432 — accessible localhost uniquement)
└── shared-redis (port 6379 — accessible localhost uniquement)
psychoenligne_default (réseau Docker)
├── psycho-backend ──┐ (sur les DEUX réseaux)
└── psycho-frontend └──→ shared_infra (pour DB + Redis)
Chaque projet :
- Backend sur shared_infra (accès DB + Redis) ET sur son propre réseau (accès frontend)
- Frontend sur son propre réseau uniquement
Containers partagés¶
| Container | Image | Réseau | Volume |
|---|---|---|---|
shared-postgres |
postgres:16-alpine |
shared_infra |
psychoenligne_postgres_data |
shared-redis |
redis:7-alpine |
shared_infra |
psychoenligne_redis_data |
⚠️ Les volumes gardent leurs noms d'origine (
psychoenligne_*) — ils contiennent les données de production. Ne jamais les supprimer.
Fichiers de gestion¶
Sur le VPS : /home/kanmaber/projets/PsychoEnLigne/Shared/
- docker-compose.yml — définit postgres + redis sur shared_infra
- shared-infra-deploy.sh — démarre ou migre les containers partagés
Démarrer l'infra partagée (après reboot VPS ou crash) :
docker exec hermes-telegram bash -c "
docker start shared-postgres 2>/dev/null || \
docker run -d --name shared-postgres --restart unless-stopped \
--network shared_infra \
-p 127.0.0.1:5432:5432 \
-v psychoenligne_postgres_data:/var/lib/postgresql/data \
postgres:16-alpine
docker start shared-redis 2>/dev/null || \
docker run -d --name shared-redis --restart unless-stopped \
--network shared_infra \
-p 127.0.0.1:6379:6379 \
-v psychoenligne_redis_data:/data \
redis:7-alpine redis-server --appendonly yes
"
Les containers ont
--restart unless-stopped→ ils redémarrent automatiquement après reboot. Ce bloc n'est utile qu'en cas de suppression accidentelle.
Connecter un nouveau projet à shared_infra¶
Dans le deploy.sh du nouveau projet, le backend se connecte aux deux réseaux :
docker run -d \
--name <NOM_LOWER>-backend \
--restart unless-stopped \
--network shared_infra \ # ← accès postgres + redis
-p <PORT_BACKEND>:<PORT_BACKEND> \
-e REDIS_HOST=shared-redis \
-e REDIS_URL=redis://shared-redis:6379 \
-e DATABASE_URL="postgresql://<DB_USER>:<DB_PASSWORD>@shared-postgres:5432/<DB_NAME>" \
<NOM_LOWER>-backend:latest
# Connecter aussi au réseau du projet pour que le frontend le rejoigne
docker network connect --alias backend <NOM_LOWER>_default <NOM_LOWER>-backend
Créer la DB du nouveau projet dans postgres partagé :
docker exec shared-postgres psql -U postgres -c "
CREATE USER <DB_USER> WITH PASSWORD '<DB_PASSWORD>';
CREATE DATABASE <DB_NAME> OWNER <DB_USER>;
"
Migration effectuée le 20260513¶
Situation initiale¶
psycho-postgresetpsycho-redissurpsychoenligne_default- Données dans des volumes anonymes (pas les volumes nommés
psychoenligne_*— ceux-ci étaient vides)
Problème découvert¶
Les volumes nommés psychoenligne_postgres_data et psychoenligne_redis_data étaient vides — les vraies données étaient dans des volumes anonymes créés par docker-compose :
- Postgres : b77953e056173f43118062581296fc41b7594f2839541b23ddfe796798c59838
- Redis : 32a9afcd5c0cc9068d8277f9c03339b73f60ee792fe6d90935b29e8981364641
Solution¶
Copie des données des volumes anonymes vers les volumes nommés :
docker run --rm \
-v b77953e...:/source \
-v psychoenligne_postgres_data:/dest \
alpine sh -c 'cp -a /source/. /dest/'
Étapes exécutées¶
docker network create shared_infra- Stop + rm
psycho-postgres→docker run shared-postgresavec volume nommé - Stop + rm
psycho-redis→docker run shared-redisavec volume nommé - Redémarrage backend avec
--network shared_infra+docker network connect psychoenligne_default - Health check ✅
Pièges¶
| Problème | Cause | Solution |
|---|---|---|
shared-postgres restart loop au démarrage |
Volume nommé vide — données dans volume anonyme | Copier avec alpine cp -a vers le volume nommé |
| Backend ne voit pas postgres après migration | REDIS_HOST/DATABASE_URL encore sur ancien hostname | Mettre à jour avec shared-redis et shared-postgres |
psychoenligne_default ne contient plus le backend |
backend sur shared_infra seulement |
Ajouter docker network connect psychoenligne_default après docker run |
| GitHub Actions n'a pas besoin de changement | Le git pull récupère le nouveau deploy.sh automatiquement | Rien à faire |
Liens connexes¶
- PsychoEnLigneV2/architecture/deploiement-sync-psycho-hermes — deploy.sh, scripts Hermes
- shared/references/guide-mise-en-place-nouveau-projet — template deploy.sh à mettre à jour
- PsychoEnLigneV2/architecture/cicd-options-deploiement-automatique — GitHub Actions workflow