Aller au contenu

Infrastructure partagée VPS — PostgreSQL + Redis

Contexte

Documentation complète de l'infrastructure partagée (shared-postgres, shared-redis, réseau shared_infra) sur le VPS Hetzner. Ces ressources étaient initialement créées manuellement — elles sont maintenant gérées par un docker-compose dédié avec service systemd pour le démarrage automatique.


Architecture générale

/home/kanmaber/shared_infra/
├── docker-compose.yml     ← définit postgres, redis et le réseau shared_infra
└── .env                   ← mots de passe (ne pas committer)

Le réseau shared_infra est le seul réseau Docker qui relie tous les projets du VPS. Chaque projet déclare ce réseau comme external: true dans son propre docker-compose.

Conteneurs du réseau au 20260517 : - shared-postgres — base de données PostgreSQL 16 - shared-redis — cache Redis 7 - psycho-backend — backend PsychoEnLigne - gestionfichepaie-backend — backend gestionFichePaie


Fichier docker-compose

Chemin : /home/kanmaber/shared_infra/docker-compose.yml

services:
  postgres:
    image: postgres:16-alpine
    container_name: shared-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: psycho_user
      POSTGRES_DB: psychoenLigne
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5432:5432"
    networks:
      - shared_infra
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U psycho_user -d psychoenLigne"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: shared-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    ports:
      - "127.0.0.1:6379:6379"
    networks:
      - shared_infra
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  shared_infra:
    name: shared_infra
    driver: bridge

volumes:
  postgres_data:
    external: true
    name: psychoenligne_postgres_data
  redis_data:
    external: true
    name: psychoenligne_redis_data

Fichier .env : /home/kanmaber/shared_infra/.env

POSTGRES_PASSWORD=<voir sur le VPS>
Le mot de passe réel est dans /home/kanmaber/projets/PsychoEnLigne/.envPOSTGRES_PASSWORD.


Volumes Docker

Les volumes existent déjà — ils sont déclarés external: true pour préserver les données :

Volume Docker Chemin réel sur le VPS Contenu
psychoenligne_postgres_data /var/lib/docker/volumes/psychoenligne_postgres_data/_data Données PostgreSQL
psychoenligne_redis_data /var/lib/docker/volumes/psychoenligne_redis_data/_data Données Redis

⚠️ Ces noms de volumes sont historiques (créés à l'époque où postgres était dans le docker-compose de PsychoEnLigne). Ne pas les renommer sans migrer les données.


Connexion PostgreSQL #postgresql

Paramètre Valeur
Host 127.0.0.1 (local uniquement) ou shared-postgres (depuis le réseau Docker)
Port 5432
Utilisateur principal psycho_user
Mot de passe voir /home/kanmaber/projets/PsychoEnLigne/.envPOSTGRES_PASSWORD

Utilisateurs PostgreSQL

Utilisateur Rôle Mot de passe Projet
psycho_user Superuser (Create role, Create DB, Replication, Bypass RLS) voir .env PsychoEnLigne PsychoEnLigne
fichepaie_user Utilisateur simple FichePaie_DB (trouvé dans gestionFichePaie/scripts/deploy.sh) gestionFichePaie

Important : il n'existe pas d'utilisateur postgres par défaut sur cette instance. Quand POSTGRES_USER est défini dans docker-compose, PostgreSQL ne crée pas l'utilisateur postgres habituel.

Bases de données

# Lister les bases depuis le conteneur
docker exec shared-postgres psql -U psycho_user -d psychoenLigne -c '\l'

Lister les utilisateurs

docker exec shared-postgres psql -U psycho_user -d psychoenLigne -c '\du'

Réinitialiser le mot de passe d'un utilisateur

docker exec -it shared-postgres psql -U psycho_user -d psychoenLigne \
  -c "ALTER USER fichepaie_user WITH PASSWORD 'nouveau_mot_de_passe';"

Connexion Redis

Paramètre Valeur
Host 127.0.0.1 (local) ou shared-redis (depuis Docker)
Port 6379
Pas de mot de passe
# Test depuis le VPS
docker exec shared-redis redis-cli ping
# → PONG

Service systemd — démarrage automatique

Fichier : /etc/systemd/system/shared-infra.service

[Unit]
Description=Shared Infrastructure (PostgreSQL + Redis)
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/kanmaber/shared_infra
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=120

[Install]
WantedBy=multi-user.target

Statut attendu : active (exited) — comportement normal pour Type=oneshot, le service a lancé docker compose up -d avec succès.

Commandes utiles

# Vérifier l'état
systemctl status shared-infra.service

# Démarrer manuellement
systemctl start shared-infra.service

# Arrêter (arrête aussi les conteneurs)
systemctl stop shared-infra.service

# Désactiver le démarrage automatique
systemctl disable shared-infra.service

Accès depuis le PC local (tunnel SSH)

Le port 5432 n'est pas exposé publiquement. Pour accéder depuis le PC :

# Terminal 1 — tunnel SSH (garder ouvert)
ssh -L 5432:127.0.0.1:5432 kanmaber@178.105.46.57 -N

# Terminal 2 — connexion psql locale
psql -h localhost -U psycho_user -d psychoenLigne

Voir aussi shared/references/acces-db-distante-depuis-local pour les 3 méthodes (psql SSH, tunnel, Prisma Studio).


Déclarer shared_infra dans un nouveau projet

Dans le docker-compose.yml du projet :

services:
  mon-backend:
    networks:
      - shared_infra
    environment:
      DATABASE_URL: postgresql://mon_user:mon_mdp@shared-postgres:5432/ma_base

networks:
  shared_infra:
    external: true

Créer l'utilisateur et la base dans PostgreSQL :

docker exec -it shared-postgres psql -U psycho_user -d psychoenLigne -c "
  CREATE USER mon_user WITH PASSWORD 'mon_mdp';
  CREATE DATABASE ma_base OWNER mon_user;
"


Reprendre from scratch (VPS recréé)

Si le VPS est recréé et que tout est perdu :

# 1. Créer le dossier
mkdir -p /home/kanmaber/shared_infra

# 2. Copier docker-compose.yml et .env (depuis git ou backup)
# Les volumes seront créés vides — restaurer depuis un backup si nécessaire

# 3. Lancer l'infra
cd /home/kanmaber/shared_infra
docker compose up -d

# 4. Créer les utilisateurs PostgreSQL manuellement
docker exec -it shared-postgres psql -U psycho_user -d psychoenLigne -c "
  CREATE USER fichepaie_user WITH PASSWORD 'FichePaie_DB';
"

# 5. Installer le service systemd (en root)
cp shared-infra.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable shared-infra.service

# 6. Reconnecter les backends au réseau
docker network connect shared_infra psycho-backend
docker network connect shared_infra gestionfichepaie-backend

À faire

  • [x] Migrer shared-postgres et shared-redis vers docker-compose dédié — fait le 20260517
  • [x] Installer le service systemd — fait le 20260517
  • [x] Retrouver le mot de passe de fichepaie_userFichePaie_DB (dans deploy.sh)
  • [ ] Versionner /home/kanmaber/shared_infra/docker-compose.yml dans un dépôt git dédié ou dans second-memory

Liens connexes