Montage (étape 3) : - Nouvelle composition ReelVideo : sous-titres animés mot à mot (3 styles : Impact, Surligné, Épuré), logo, effet de fin et fondu, en React - Le service Python prépare l'image (recadrage, HDR, stabilisation, dernière image figée) et la piste son finale (/prepare-reel) ; Remotion compose - Reels d'images sur les mêmes composants, avec le vrai minutage de la voix - Police Montserrat embarquée (plus de dépendance à Google Fonts) - REEL_RENDERER=ffmpeg conserve le rendu FFmpeg, plus rapide, en secours - Script de pré-bundle réparé (échouait en silence : require en ESM) Interface (étape 4) : - Aperçu en direct avec @remotion/player, identique au rendu final ; la voix testée cale les sous-titres, sinon minutage estimé - Choix du style de sous-titres sur les 4 pages Reel - Vraie progression : étape réelle du rendu, échecs visibles 24 h avec leur cause ; fin de la barre simulée et du faux « publié avec succès » Outillage (étape 5) : - Tests vitest (minutage identique à Python, validation, sécurité) et pytest ; CI GitHub Actions (tsc, tests, build, ruff) - Captures d'écran, out.mp4 et scripts de test retirés de la racine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018Ze4bs7tpF1KGWUk6ZZSZ4
7.4 KiB
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
cp .env.example .env
2. Éditer les variables d'environnement
Modifiez .env avec vos valeurs :
# 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
# 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) :
docker network create nginx_default
Configuration Nginx
Configurez Nginx pour cibler l'application sur le port 5555 :
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
docker-compose build --no-cache
docker-compose up -d
Voir les logs d'un service spécifique
docker-compose logs -f app # Application
docker-compose logs -f postgres # Base de données
Accéder au conteneur
docker-compose exec app sh # Shell de l'application
docker-compose exec postgres psql -U socialflow # PostgreSQL CLI
Nettoyer complètement
# 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 :
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 <stack>-app, repository does not exist: Docker cherche sur Docker Hub une image qui est construite localement. Lepull_policy: builddudocker-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 --builden 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=ffmpegrevient au rendu FFmpeg, plus rapide.RENDER_CONCURRENCYlimite le nombre d'onglets Chromium. - Vérifier la version déployée : au démarrage, les logs de
socialflow-appaffichent[ReelQueue] Worker démarré, etsocialflow-ffmpegrépond{"status":"ok","version":2}sur/health. - Tests du service :
pip install -r requirements-dev.txt, puispytestetruff check .dansffmpeg-service/.
🔒 Sécurité en production
- Variables d'environnement : Ne commitez JAMAIS le fichier
.env - Mots de passe : Utilisez des mots de passe forts et aléatoires
- SESSION_SECRET : Générez une clé aléatoire de 32+ caractères
- Firewall : Limitez l'accès au port 4523 ou utilisez Nginx
- 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
# 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é
# 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
# 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