groupe-meditation/docs/DEPLOIEMENT.md
2026-03-04 14:01:00 -05:00

243 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Guide de déploiement — Groupe Méditation
## 27 modules · Phases 0 à 9 · Infrastructure Debian + Apache + NGINX + PostgreSQL
---
## Prérequis
- Debian 12+ ou Ubuntu 24.04+
- PostgreSQL 16+
- Python 3.11+
- Node.js 20+ (pour le build frontend)
- Apache 2.4+ avec mod_rewrite et mod_headers
- NGINX 1.24+ (reverse proxy)
- Certbot (Let's Encrypt)
---
## 1. Installer PostgreSQL
```bash
sudo apt update
sudo apt install -y postgresql-16 postgresql-client-16
sudo systemctl enable postgresql
sudo systemctl start postgresql
sudo -u postgres psql << 'SQL'
CREATE USER grpmed WITH PASSWORD 'CHANGEZ_CE_MOT_DE_PASSE';
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
```
## 2. Installer Python et les dépendances
```bash
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
sudo mkdir -p /opt/groupe-meditation
sudo chown $USER:$USER /opt/groupe-meditation
cp -r backend/ /opt/groupe-meditation/backend/
cp -r deploy/ /opt/groupe-meditation/deploy/
cd /opt/groupe-meditation/backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
### Dépendances Python (requirements.txt)
| Paquet | Rôle |
|--------|------|
| fastapi | API REST async |
| uvicorn | Serveur ASGI |
| sqlalchemy[asyncio] + asyncpg | ORM + driver PostgreSQL |
| pydantic-settings | Configuration .env |
| python-jose + bcrypt | JWT + hachage PIN |
| weasyprint | Génération PDF (rapports C1) |
## 3. Configurer le backend
```bash
cd /opt/groupe-meditation/backend
cp .env.example .env
nano .env
```
Modifier `.env` :
```
DATABASE_URL=postgresql+asyncpg://grpmed:VOTRE_MOT_DE_PASSE@localhost:5432/groupe_meditation
JWT_SECRET=GENEREZ_AVEC_openssl_rand_base64_48
CORS_ORIGINS=["https://groupe-meditation.chezlepro.ca"]
INVITATION_EXPIRE_HOURS=48
```
Générer le secret JWT :
```bash
openssl rand -base64 48
```
## 4. Initialiser la base de données (23 tables)
```bash
cd /opt/groupe-meditation
source backend/venv/bin/activate
python deploy/seed.py
```
Le script crée **interactivement** :
- Les 23 tables (groupes, membres, postes, affectations, collectes, dépenses, réunions, présences, PV, décisions, rotations, rapports RSG, jetons, littérature, ventes, contributions, config_repartition, sondages, options_sondage, votes, jumelages, sync_log)
- Les 10 postes prédéfinis (RSG, RSG Substitut, Trésorier, Secrétaire, Animateur, Accueil, Café, Littérature, Jetons, Clés)
- La répartition par défaut des contributions (30/30/30/10)
- La littérature de base (Gros Livre, 12×12, Vivre sans alcool, brochures)
- Le premier groupe et le premier membre avec son poste
- Un code d'invitation valide 7 jours
## 5. Créer le service systemd
```bash
sudo cp 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
curl http://127.0.0.1:8000/api/health
```
Le service expose 25 routers API sur le port 8000 :
- Auth (login, register)
- Membres, postes, accueil, invitations
- Collectes, réunions, dépenses, décisions
- Calendrier, rapports PDF, rotations, paramètres
- Présences, PV, rapports RSG
- Jetons, anniversaires, commandes jetons
- Littérature, ventes littérature
- Contributions, config répartition
- Sondages (votes), jumelages (parrainage)
## 6. Construire le frontend
```bash
cd 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
```
Le build produit une PWA installable avec :
- 30 pages React (27 modules + Login + Inscription + Accueil)
- Tailwind CSS mobile-first
- Service Worker pour le mode hors ligne
## 7. Configurer Apache
```bash
sudo cp deploy/apache-groupe-meditation.conf /etc/apache2/sites-available/
sudo a2enmod rewrite headers
sudo a2ensite groupe-meditation
sudo systemctl reload apache2
```
Apache écoute sur 127.0.0.1:8080 et sert :
- Les fichiers statiques du build React
- Le SPA routing (toutes les routes → index.html)
- Le cache immutable sur les assets (JS, CSS, images)
## 8. Configurer NGINX
```bash
sudo cp deploy/nginx-groupe-meditation.conf /etc/nginx/sites-available/groupe-meditation
sudo ln -s /etc/nginx/sites-available/groupe-meditation /etc/nginx/sites-enabled/
# Ajouter dans /etc/nginx/nginx.conf (section http) :
# limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
# Obtenir le certificat Let's Encrypt
sudo certbot certonly --nginx -d groupe-meditation.chezlepro.ca
sudo nginx -t
sudo systemctl reload nginx
```
NGINX est le point d'entrée unique HTTPS :
- `/` → Apache (fichiers statiques frontend)
- `/api/*` → FastAPI (Uvicorn port 8000)
- HSTS, CSP, X-Frame-Options, rate limiting
## 9. Sauvegarde automatique
```bash
sudo cp deploy/backup.sh /etc/cron.daily/groupe-meditation-backup
sudo chmod +x /etc/cron.daily/groupe-meditation-backup
```
- pg_dump quotidien en format custom (-Fc)
- Rétention 30 jours
- Stockage Ceph (réplication triple copie)
- **Test de restauration mensuel recommandé** :
```bash
pg_restore -U grpmed -d groupe_meditation_test /var/backups/groupe-meditation/grpmed_DERNIER.dump
```
## 10. Vérification finale
```bash
# API
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 |
|----------|----------|
| 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` (vérifier que FastAPI tourne) |
| WeasyPrint échoue | `sudo apt install libpango-1.0-0 libpangocairo-1.0-0` |
| Mise à jour frontend | `cd frontend && npm run build && sudo cp -r dist/* /var/www/groupe-meditation/` |
| Mise à jour backend | `sudo systemctl restart groupe-meditation` |
| Ajouter un groupe | Utiliser l'API : `POST /api/groupes/` ou ajouter via le seed |
## Mise à jour de l'application
```bash
# Backend
cd /opt/groupe-meditation/backend
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart groupe-meditation
# Frontend
cd 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 · 23 tables · 25 routers · 27 modules**