mirror of
https://github.com/R0m1k3/Socialflow.git
synced 2026-10-11 17:26:45 +02:00
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
255 lines
7.4 KiB
Markdown
255 lines
7.4 KiB
Markdown
# 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 <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
|
|
|
|
```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
|
|
```
|