# 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 ```bash 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) : ```bash 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 : ```bash 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 : ```bash 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) : ```bash sudo apt install -y nodejs npm ``` Vérifier : ```bash node --version npm --version ``` --- ## 3. Installer Python et les dépendances système ```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 ``` --- ## 4. Installer NGINX ```bash sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx ``` --- ## 5. Déployer le code source ```bash # 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 : ```bash openssl rand -base64 48 ``` Créer le `.env` : ```bash 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é : ```bash 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 ```bash 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 : ```bash 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 ```bash 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. ```bash 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 : ```bash curl -s http://groupe-meditation.chezlepro.ca/api/health ``` --- ## 11. Certificat TLS (Let's Encrypt) ```bash 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 ```bash 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 ```bash # 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 ```bash # 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**