Files
Socialflow/docker-compose.yml
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

116 lines
3.5 KiB
YAML

version: '3.8'
services:
# Base de données PostgreSQL
postgres:
image: postgres:16-alpine
container_name: socialflow-db
restart: unless-stopped
ports:
- "4523:4523"
environment:
POSTGRES_DB: ${PGDATABASE:-socialflow}
POSTGRES_USER: ${PGUSER:-socialflow}
POSTGRES_PASSWORD: ${PGPASSWORD:-changeme}
PGPORT: 4523
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- internal
- nginx_default
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${PGUSER:-socialflow}" ]
interval: 10s
timeout: 5s
retries: 5
# Application Social Flow
app:
build:
context: .
dockerfile: Dockerfile
# Image construite sur place : nom figé pour ne pas dépendre du nom de la
# stack, et `pull_policy: build` pour que Docker la reconstruise au lieu
# d'aller la chercher sur Docker Hub (où elle n'existe pas).
image: socialflow-app:latest
pull_policy: build
container_name: socialflow-app
restart: unless-stopped
environment:
NODE_ENV: production
PORT: 5555
DATABASE_URL: postgresql://${PGUSER:-socialflow}:${PGPASSWORD:-changeme}@postgres:4523/${PGDATABASE:-socialflow}
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
GEMINI_API_KEY: ${GEMINI_API_KEY}
SESSION_SECRET: ${SESSION_SECRET:-your-secret-key-change-me}
# URL publique (ex. https://socialflow.exemple.fr). Laissée vide, elle est
# déduite des en-têtes du reverse proxy — ne jamais forcer localhost ici,
# les URI de redirection OAuth (Facebook/TikTok) en dépendent.
APP_URL: ${APP_URL:-}
# URL interne Docker pour que ffmpeg-api puisse télécharger les fichiers audio
INTERNAL_APP_URL: http://socialflow-app:5555
# Configuration FFmpeg Service
FFMPEG_API_URL: http://ffmpeg-api:8000
FFMPEG_API_KEY: ${FFMPEG_API_KEY:-socialflow-secret-ffmpeg-key}
# Rendu des Reels vidéo : remotion (sous-titres animés, identique à
# l'aperçu) ou ffmpeg (plus rapide, sous-titres classiques)
REEL_RENDERER: ${REEL_RENDERER:-remotion}
# Onglets Chromium en parallèle pour Remotion (défaut : moitié des cœurs)
RENDER_CONCURRENCY: ${RENDER_CONCURRENCY:-}
networks:
- internal
- nginx_default
depends_on:
postgres:
condition: service_healthy
volumes:
- encryption_key:/app/.encryption-key-data
- audio_uploads:/app/uploads/audio
- media_uploads:/app/uploads/media
- logos_uploads:/app/uploads/logos
- stories_uploads:/app/uploads/stories
command: npm run start
# Service FFmpeg dédié
ffmpeg-api:
build:
context: ./ffmpeg-service
dockerfile: Dockerfile
args:
# Modèle Whisper (calage des sous-titres) intégré à l'image
WHISPER_MODEL: ${WHISPER_MODEL:-base}
image: socialflow-ffmpeg-api:latest
pull_policy: build
container_name: socialflow-ffmpeg
restart: unless-stopped
environment:
API_KEY: ${FFMPEG_API_KEY:-socialflow-secret-ffmpeg-key}
GEMINI_TTS_MODEL: ${GEMINI_TTS_MODEL:-gemini-2.5-flash-preview-tts}
networks:
- internal
expose:
- "8000"
volumes:
postgres_data:
driver: local
encryption_key:
driver: local
audio_uploads:
driver: local
media_uploads:
driver: local
logos_uploads:
driver: local
stories_uploads:
driver: local
networks:
# Réseau interne pour la communication DB <-> App
internal:
driver: bridge
# Réseau externe pour nginx reverse proxy
nginx_default:
external: true