groupe-meditation/docs/DEPLOIEMENT.md
2026-03-13 12:12:54 -04:00

6.6 KiB

Guide de déploiement — Groupe Méditation

27 modules · Debian Bookworm + NGINX + PostgreSQL

Testé sur Debian 12 (Bookworm) avec un utilisateur ansible ayant accès sudo.

Principe : on utilise ce que Debian fournit. Pas de dépôt externe.


0. Prérequis système

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ca-certificates gnupg

1. Installer PostgreSQL

On installe le PostgreSQL fourni par Debian Bookworm (version 15) :

sudo apt install -y postgresql postgresql-client
sudo systemctl enable postgresql
sudo systemctl start postgresql

Créer l'utilisateur et la base. Choisissez votre mot de passe maintenant — il sera réutilisé à l'étape 6 :

sudo -u postgres psql << 'SQL'
CREATE USER grpmed WITH PASSWORD 'votre_mot_de_passe_ici';
CREATE DATABASE groupe_meditation OWNER grpmed;
GRANT ALL PRIVILEGES ON DATABASE groupe_meditation TO grpmed;
\c groupe_meditation
GRANT ALL ON SCHEMA public TO grpmed;
SQL

Vérifier que la connexion fonctionne avec le mot de passe choisi :

PGPASSWORD='votre_mot_de_passe_ici' psql -U grpmed -h localhost -d groupe_meditation -c "SELECT 1;"

2. Installer Node.js

On installe le Node.js fourni par Debian Bookworm (version 18) :

sudo apt install -y nodejs npm

Vérifier :

node --version
npm --version

3. Installer Python et les dépendances système

sudo apt install -y python3 python3-pip python3-venv

# Dépendances système pour WeasyPrint (rapports PDF)
sudo apt install -y libpango-1.0-0 libpangocairo-1.0-0 \
  libgdk-pixbuf2.0-0 libffi-dev libcairo2

4. Installer NGINX

sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

5. Déployer le code source

# Copier l'archive sur le serveur, puis :
cd ~
tar xzf groupe-meditation-complet.tar.gz

# Backend
sudo mkdir -p /opt/groupe-meditation
sudo cp -r ~/groupe-meditation/backend/ /opt/groupe-meditation/backend/
sudo cp -r ~/groupe-meditation/deploy/ /opt/groupe-meditation/deploy/

# Environnement virtuel Python
cd /opt/groupe-meditation/backend
sudo python3 -m venv venv
sudo /opt/groupe-meditation/backend/venv/bin/pip install -r requirements.txt

6. Configurer le backend

Générer le secret JWT :

openssl rand -base64 48

Créer le .env :

cd /opt/groupe-meditation/backend
sudo cp .env.example .env
sudo nano .env

Modifier .env avec le même mot de passe que l'étape 1 :

DATABASE_URL=postgresql+asyncpg://grpmed:votre_mot_de_passe_ici@localhost:5432/groupe_meditation
JWT_SECRET=valeur_generee_ci-dessus
CORS_ORIGINS=["https://groupe-meditation.chezlepro.ca"]
INVITATION_EXPIRE_HOURS=48

Important : le mot de passe dans DATABASE_URL doit être identique à celui de l'étape 1. Si les deux ne correspondent pas, le seed et l'API échoueront avec InvalidPasswordError.


7. Initialiser la base de données (23 tables)

Le seed doit être lancé depuis le dossier backend/ pour que le fichier .env soit trouvé :

cd /opt/groupe-meditation/backend
/opt/groupe-meditation/backend/venv/bin/python ../deploy/seed.py

Si le .env n'est pas trouvé, le script utilisera les valeurs par défaut de config.py (qui ont un autre mot de passe) et la connexion échouera.

Le script crée interactivement :

  • Les 23 tables
  • Les 10 postes prédéfinis
  • La répartition par défaut des contributions (30/30/30/10)
  • La littérature de base (5 titres)
  • Le premier groupe et le premier membre
  • Un code d'invitation valide 7 jours

8. Créer le service systemd

sudo cp /opt/groupe-meditation/deploy/groupe-meditation.service /etc/systemd/system/
sudo chown -R www-data:www-data /opt/groupe-meditation
sudo systemctl daemon-reload
sudo systemctl enable groupe-meditation
sudo systemctl start groupe-meditation

Vérifier :

sudo systemctl status groupe-meditation
curl -s http://127.0.0.1:8000/api/health

Doit retourner {"status":"ok","app":"Groupe Méditation","version":"0.1.0"}


9. Construire et déployer le frontend

cd ~/groupe-meditation/frontend
npm install
npm run build

sudo mkdir -p /var/www/groupe-meditation
sudo cp -r dist/* /var/www/groupe-meditation/
sudo chown -R www-data:www-data /var/www/groupe-meditation

10. Configurer NGINX

NGINX fait tout : fichiers statiques du frontend + reverse proxy vers FastAPI.

sudo cp ~/groupe-meditation/deploy/nginx-groupe-meditation.conf \
  /etc/nginx/sites-available/groupe-meditation
sudo ln -sf /etc/nginx/sites-available/groupe-meditation /etc/nginx/sites-enabled/

# Retirer le site par défaut si présent
sudo rm -f /etc/nginx/sites-enabled/default

sudo nginx -t
sudo systemctl reload nginx

Tester en HTTP :

curl -s http://groupe-meditation.chezlepro.ca/api/health

11. Certificat TLS (Let's Encrypt)

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d groupe-meditation.chezlepro.ca

Certbot modifie automatiquement la config NGINX pour ajouter HTTPS et la redirection 80→443.


12. Sauvegarde automatique

sudo cp ~/groupe-meditation/deploy/backup.sh /etc/cron.daily/groupe-meditation-backup
sudo chmod +x /etc/cron.daily/groupe-meditation-backup

13. Vérification finale

# API en HTTPS
curl -s https://groupe-meditation.chezlepro.ca/api/health | python3 -m json.tool

# Documentation OpenAPI
# Ouvrir https://groupe-meditation.chezlepro.ca/api/docs

# Frontend
# Ouvrir https://groupe-meditation.chezlepro.ca
# Se connecter avec le prénom et le PIN créés lors du seed

Dépannage

Problème Commande
seed.py InvalidPasswordError Vérifier que le seed est lancé depuis backend/ et que le .env contient le bon mot de passe
API ne démarre pas sudo journalctl -u groupe-meditation -f
Erreur base de données sudo -u postgres psql -d groupe_meditation -c "SELECT count(*) FROM groupes;"
NGINX 502 sudo systemctl status groupe-meditation
WeasyPrint échoue sudo apt install libpango-1.0-0 libpangocairo-1.0-0
seed.py ImportError Vérifier les noms de classes dans backend/app/models/

Mise à jour de l'application

# Backend
cd /opt/groupe-meditation/backend
sudo venv/bin/pip install -r requirements.txt
sudo systemctl restart groupe-meditation

# Frontend
cd ~/groupe-meditation/frontend
npm install && npm run build
sudo cp -r dist/* /var/www/groupe-meditation/

Hébergé au Québec · 100% logiciel libre · Zéro traçage