Déploiement instance unique¶
Configuration simple pour un déploiement mono-instance, sans Traefik ni PgBouncer. Adapté pour un usage personnel ou un petit groupe.
Pour commencer
C'est la configuration recommandée pour un premier déploiement. Passez à la configuration scalable uniquement si vous avez besoin de haute disponibilité.
Différences avec la production scalable¶
| Aspect | Instance unique | Production scalable |
|---|---|---|
| PgBouncer | Non | Oui |
| Traefik | Non (ports exposés) | Oui (reverse-proxy + TLS) |
| Replicas app | 1 | 4 |
| Replicas worker | 1 | 2 |
| Sécurité Docker | Standard | read_only, cap_drop ALL |
| WARP proxy | Non | Oui (optionnel) |
| Sticky sessions | Non | Oui |
Lancement¶
# 1. Créer le répertoire
mkdir stream-fusion && cd stream-fusion
# 2. Créer le .env (voir la page Environnement pour le détail)
nano .env
# 3. Créer le docker-compose.yml (copier le contenu ci-dessous)
nano docker-compose.yml
# 4. Lancer
docker compose up -d
# 5. Suivre les logs
docker compose logs -f stream-fusion
Accès aux services¶
| Service | URL |
|---|---|
| Application | http://localhost:8080 |
| Admin | http://localhost:8080/admin/ |
| Meilisearch | http://localhost:7700 (non exposé par défaut) |
| PostgreSQL | localhost:5432 (non exposé par défaut) |
| Redis | localhost:6379 (non exposé par défaut) |
En production
En production, seul le port 8080 (ou Traefik) doit être exposé publiquement. Les autres ports ne doivent être accessibles que via le réseau Docker interne.
Docker Compose complet¶
Copiez ce contenu dans un fichier docker-compose.yml :
---
# docker-compose.yml — Déploiement instance unique
#
# Prérequis :
# - Fichier .env rempli (voir la page Environnement)
#
# Lancement :
# docker compose up -d
networks:
sfr-network:
services:
stremio-postgres:
image: postgres:17-alpine
container_name: sfr-postgres
restart: unless-stopped
environment:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_USER: ${POSTGRES_USER:-streamfusion}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-streamfusion}
POSTGRES_DB: ${POSTGRES_DB:-streamfusion}
expose:
- 5432
volumes:
- stremio-postgres:/var/lib/postgresql/data/pgdata
networks:
- sfr-network
stremio-redis:
image: redis:7-alpine
container_name: sfr-redis
command: redis-server --appendonly yes
expose:
- 6379
volumes:
- stremio-redis:/data
restart: unless-stopped
networks:
- sfr-network
meilisearch:
image: getmeili/meilisearch:v1.41.0
container_name: sfr-meilisearch
environment:
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:?Provide MEILI_MASTER_KEY}
MEILI_ENV: production
MEILI_EXPERIMENTAL_DUMPLESS_UPGRADE: "true"
expose:
- 7700
volumes:
- meili-data:/meili_data
restart: unless-stopped
networks:
- sfr-network
taskiq-scheduler:
image: limedrive/stream-fusion-reborn:latest
container_name: sfr-taskiq-scheduler
command: python -m taskiq scheduler stream_fusion.tkq:scheduler
environment:
REDIS_HOST: stremio-redis
TASKIQ_REDIS_DB: ${TASKIQ_REDIS_DB:-6}
TZ: ${TZ:-Europe/London}
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp:mode=1777
- /home/appuser:uid=1000,gid=1000,mode=0700
volumes:
- taskiq-logs:/app/config/logs
depends_on:
- stremio-redis
restart: unless-stopped
networks:
- sfr-network
# IMPORTANT: ne jamais scaler au-delà de 1
taskiq-worker:
image: limedrive/stream-fusion-reborn:latest
container_name: sfr-taskiq-worker
command: python -m taskiq worker stream_fusion.worker:broker
environment:
SECRET_API_KEY: ${SECRET_API_KEY:?Please provide a secret API key}
TMDB_API_KEY: ${TMDB_API_KEY:?Please provide a TMDB API key}
REDIS_HOST: stremio-redis
PG_HOST: stremio-postgres
PG_USER: ${POSTGRES_USER:-streamfusion}
PG_PASS: ${POSTGRES_PASSWORD:-streamfusion}
MEILI_HOST: meilisearch
MEILI_PORT: "7700"
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:?Provide MEILI_MASTER_KEY}
TASKIQ_REDIS_DB: ${TASKIQ_REDIS_DB:-6}
DMM_SYNC_ENABLED: ${DMM_SYNC_ENABLED:-true}
TZ: ${TZ:-Europe/London}
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp:mode=1777,size=8g
- /home/appuser:uid=1000,gid=1000,mode=0700
volumes:
- dmm-hashlists:/data/dmm_hashlists
- imdb-db:/data/imdb_db
- taskiq-logs:/app/config/logs
depends_on:
- stremio-postgres
- stremio-redis
- meilisearch
restart: unless-stopped
networks:
- sfr-network
stream-fusion:
image: limedrive/stream-fusion-reborn:latest
container_name: stream-fusion
environment:
RUN_MIGRATIONS: "true"
SECRET_API_KEY: ${SECRET_API_KEY:?Please provide a secret API key}
CONFIG_SECRET_KEY: ${CONFIG_SECRET_KEY:-}
TMDB_API_KEY: ${TMDB_API_KEY:?Please provide a TMDB API key}
REDIS_HOST: stremio-redis
PG_HOST: stremio-postgres
PG_USER: ${POSTGRES_USER:-streamfusion}
PG_PASS: ${POSTGRES_PASSWORD:-streamfusion}
USE_HTTPS: ${USE_HTTPS:-False}
MEILI_HOST: meilisearch
MEILI_PORT: "7700"
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY:?Provide MEILI_MASTER_KEY}
TZ: ${TZ:-Europe/London}
ports:
- "${APP_PORT:-8080}:8080"
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp:mode=1777
- /home/appuser:uid=1000,gid=1000,mode=0700
volumes:
- stream-fusion:/app/config
- torrent-cache:/var/cache/torrents
- imdb-db:/data/imdb_db:ro
depends_on:
- stremio-postgres
- stremio-redis
- meilisearch
restart: unless-stopped
networks:
- sfr-network
volumes:
stremio-postgres:
stremio-redis:
stream-fusion:
meili-data:
dmm-hashlists:
imdb-db:
torrent-cache:
taskiq-logs: