Files
Socialflow/DOCKER.md
T
Claude 9b66a6dc5a feat(reels): montage Remotion unifié, aperçu en direct, tests et CI
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
2026-09-24 14:37:42 +00:00

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. 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

# 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