# DĂ©ploiement Docker - Social Flow ## 📋 Configuration L'application utilise Docker Compose pour orchestrer : - **PostgreSQL 16** : Base de donnĂ©es sur rĂ©seau interne - **Social Flow App** : Application Node.js exposĂ©e sur le port **4523** ## 🚀 DĂ©marrage rapide ### 1. Copier le fichier d'environnement ```bash cp .env.example .env ``` ### 2. Éditer les variables d'environnement Modifiez `.env` avec vos valeurs : ```bash # Base de donnĂ©es PGDATABASE=socialflow PGUSER=socialflow PGPASSWORD=votre_mot_de_passe_securise # Application PORT=4523 SESSION_SECRET=votre_cle_secrete_aleatoire # API OpenRouter (pour la gĂ©nĂ©ration IA) OPENROUTER_API_KEY=votre_cle_openrouter ``` ### 3. Lancer les conteneurs ```bash # DĂ©marrer en arriĂšre-plan docker-compose up -d # Voir les logs docker-compose logs -f # ArrĂȘter docker-compose down ``` ## 🌐 AccĂšs - **PostgreSQL** : Accessible sur le port **4523** (interne et externe) - **Application** : Accessible via Nginx sur le rĂ©seau `nginx_default` ## 🔧 Architecture rĂ©seau ### RĂ©seau interne (`internal`) - PostgreSQL et l'application communiquent sur ce rĂ©seau privĂ© ### RĂ©seau nginx (`nginx_default`) - RĂ©seau externe pour le reverse proxy Nginx - PostgreSQL et l'application sont sur ce rĂ©seau - Permet l'accĂšs via Nginx et un domaine personnalisĂ© ### Ports exposĂ©s - **PostgreSQL** : `4523:4523` (port hĂŽte 4523 → port container 4523) - **Application** : Port 5555 interne (non exposĂ© sur l'hĂŽte, accessible via Nginx) ## 📝 Configuration Nginx ### PrĂ©requis : CrĂ©er le rĂ©seau nginx **Avant de lancer docker-compose**, crĂ©ez le rĂ©seau nginx (une seule fois) : ```bash docker network create nginx_default ``` ### Configuration Nginx Configurez Nginx pour cibler l'application sur le port **5555** : ```nginx upstream socialflow { server socialflow-app:5555; # ← Port interne de l'application } server { listen 80; server_name votre-domaine.com; location / { proxy_pass http://socialflow; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` **Important** : Si vous n'utilisez pas Nginx, vous pouvez retirer le rĂ©seau `nginx_default` du `docker-compose.yml`. ## đŸ› ïž Commandes utiles ### Reconstruire les images ```bash docker-compose build --no-cache docker-compose up -d ``` ### Voir les logs d'un service spĂ©cifique ```bash docker-compose logs -f app # Application docker-compose logs -f postgres # Base de donnĂ©es ``` ### AccĂ©der au conteneur ```bash docker-compose exec app sh # Shell de l'application docker-compose exec postgres psql -U socialflow # PostgreSQL CLI ``` ### Nettoyer complĂštement ```bash # ArrĂȘter et supprimer les conteneurs, rĂ©seaux docker-compose down # Supprimer aussi les volumes (⚠ PERTE DE DONNÉES) docker-compose down -v ``` ## 🔗 URL publique et connexions OAuth (Facebook / TikTok) Les boutons « Connecter une page » construisent une URI de redirection Ă  partir de l'URL publique de l'application. Renseignez donc `APP_URL` avec le domaine rĂ©el : ```bash APP_URL=https://socialflow.exemple.fr ``` Puis dĂ©clarez l'URI correspondante chez le fournisseur : - Facebook : *Connexion Facebook → ParamĂštres → URI de redirection OAuth valides* → `https://socialflow.exemple.fr/api/facebook/callback` - TikTok : *Login Kit → Redirect URI* → `https://socialflow.exemple.fr/api/tiktok/callback` Si `APP_URL` est absent, l'URL est dĂ©duite des en-tĂȘtes `X-Forwarded-Proto` et `X-Forwarded-Host` envoyĂ©s par Nginx — vĂ©rifiez que le proxy les transmet (voir la configuration Nginx ci-dessus). Un `APP_URL` rĂ©glĂ© sur `http://localhost:5555` en production produit une URI que Facebook refuse. ## đŸ§© DĂ©ploiement via Portainer (stack Git) La stack se construit depuis les sources : `app` et `ffmpeg-api` ont une section `build:`, leurs images n'existent sur aucun registre. - **« Pull and redeploy » Ă©choue** avec `pull access denied for -app, repository does not exist` : Docker cherche sur Docker Hub une image qui est construite localement. Le `pull_policy: build` du `docker-compose.yml` Ă©vite cette tentative ; si votre version de Portainer dĂ©clenche quand mĂȘme le pull, dĂ©cochez **« Re-pull image »** dans la mise Ă  jour de la stack. - Pour reconstruire aprĂšs une mise Ă  jour du dĂ©pĂŽt : *Stack → Editor → Update the stack*, en laissant Docker rebĂątir les images (ou `docker compose up -d --build` en ligne de commande). - Le nom des images est figĂ© (`socialflow-app:latest`, `socialflow-ffmpeg-api:latest`) : il ne dĂ©pend donc plus du nom donnĂ© Ă  la stack dans Portainer. ## đŸŽ™ïž Service ffmpeg-api (voix et rendu des Reels) - **Premier build plus long** : l'image embarque FFmpeg 7.0.2 (version Ă©pinglĂ©e), les polices des sous-titres et le modĂšle Whisper qui cale les sous-titres mot Ă  mot sur la voix (~150 Mo avec `WHISPER_MODEL=base`). - **Voix Gemini** : renseignez `GEMINI_API_KEY` (ou la clĂ© dans l'application). Sans clĂ©, la voix Edge gratuite est utilisĂ©e et un avertissement apparaĂźt dans les logs. - **Moteur de rendu** : par dĂ©faut, les Reels vidĂ©o sont montĂ©s par Remotion (sous-titres animĂ©s, identiques Ă  l'aperçu de l'application). En cas de serveur trop lent, `REEL_RENDERER=ffmpeg` revient au rendu FFmpeg, plus rapide. `RENDER_CONCURRENCY` limite le nombre d'onglets Chromium. - **VĂ©rifier la version dĂ©ployĂ©e** : au dĂ©marrage, les logs de `socialflow-app` affichent `[ReelQueue] Worker dĂ©marrĂ©`, et `socialflow-ffmpeg` rĂ©pond `{"status":"ok","version":2}` sur `/health`. - **Tests du service** : `pip install -r requirements-dev.txt`, puis `pytest` et `ruff check .` dans `ffmpeg-service/`. ## 🔒 SĂ©curitĂ© en production 1. **Variables d'environnement** : Ne commitez JAMAIS le fichier `.env` 2. **Mots de passe** : Utilisez des mots de passe forts et alĂ©atoires 3. **SESSION_SECRET** : GĂ©nĂ©rez une clĂ© alĂ©atoire de 32+ caractĂšres 4. **Firewall** : Limitez l'accĂšs au port 4523 ou utilisez Nginx 5. **HTTPS** : Configurez un certificat SSL (Let's Encrypt + Nginx) ## 📊 Healthchecks - **PostgreSQL** : VĂ©rifie que la base est prĂȘte avant de dĂ©marrer l'app - **Migrations** : ExĂ©cutĂ©es automatiquement au dĂ©marrage (`drizzle-kit push --force`) ## 🐛 DĂ©pannage ### L'application ne dĂ©marre pas ```bash # VĂ©rifier les logs docker-compose logs app # VĂ©rifier que PostgreSQL est prĂȘt docker-compose exec postgres pg_isready -U socialflow ``` ### Port 4523 dĂ©jĂ  utilisĂ© ```bash # Trouver le processus sudo lsof -i :4523 # Ou changer le port dans .env et docker-compose.yml ``` ### Erreur de connexion Ă  la base de donnĂ©es VĂ©rifiez que `DATABASE_URL` dans `.env` correspond aux variables `PGUSER`, `PGPASSWORD`, etc. ## 📩 Volumes Docker - `postgres_data` : DonnĂ©es persistantes de PostgreSQL - Mappages locaux : - `./attached_assets` → `/app/attached_assets` (mĂ©dias uploadĂ©s) - `./migrations` → `/app/migrations` (migrations DB) ## 🔄 Mise Ă  jour de l'application ```bash # 1. Pull les derniĂšres modifications git pull # 2. Reconstruire l'image docker-compose build # 3. RedĂ©marrer docker-compose up -d # 4. VĂ©rifier les logs docker-compose logs -f app ```