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>
/home/kanmaber/projets/PsychoEnLigne/.env → POSTGRES_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/.env → POSTGRES_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_user—FichePaie_DB(dans deploy.sh) - [ ] Versionner
/home/kanmaber/shared_infra/docker-compose.ymldans un dépôt git dédié ou dans second-memory
Liens connexes¶
- shared/architecture/infrastructure-partagee-postgres-redis — contexte réseau shared_infra, postgres + redis partagés
- shared/references/acces-db-distante-depuis-local — 3 méthodes d'accès à la DB depuis le local
- shared/references/pipe-stdin-ssh-psql — pipe stdin → SSH → psql : règles d'échappement
- shared/architecture/vps-ports-services — cartographie complète des ports VPS
- shared/architecture/docker-networks-explication — explication simple des réseaux Docker