Aller au contenu

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-postgres et psycho-redis sur psychoenligne_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

  1. docker network create shared_infra
  2. Stop + rm psycho-postgresdocker run shared-postgres avec volume nommé
  3. Stop + rm psycho-redisdocker run shared-redis avec volume nommé
  4. Redémarrage backend avec --network shared_infra + docker network connect psychoenligne_default
  5. 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