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 template complet)
nano .env
# 3. (Optionnel) Créer user.env pour le mode unique_account (debrid/indexeurs partagés)
# nano user.env
# 4. Créer le docker-compose.yml (copier le contenu ci-dessous)
nano docker-compose.yml
# 5. Lancer
docker compose up -d
# 6. 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 :
# - .env rempli (copier depuis example.env)
# - user.env (optionnel — copier depuis example.user.env si unique_account)
#
# 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}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
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}
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:
PG_USER: ${PG_USER}
PG_PASS: ${PG_PASS}
TZ: ${TZ}
# Service-to-service wiring
REDIS_HOST: stremio-redis
PG_HOST: stremio-postgres
TASKIQ_REDIS_DB: "6"
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
# env_file: user.env # décommenter pour activer le mode unique_account
environment:
SECRET_API_KEY: ${SECRET_API_KEY}
TMDB_API_KEY: ${TMDB_API_KEY}
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
PG_USER: ${PG_USER}
PG_PASS: ${PG_PASS}
TZ: ${TZ}
# Service-to-service wiring
REDIS_HOST: stremio-redis
PG_HOST: stremio-postgres
MEILI_HOST: meilisearch
MEILI_PORT: "7700"
TASKIQ_REDIS_DB: "6"
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
# env_file: user.env # décommenter pour activer le mode unique_account
environment:
RUN_MIGRATIONS: "true"
SECRET_API_KEY: ${SECRET_API_KEY}
CONFIG_SECRET_KEY: ${CONFIG_SECRET_KEY}
TMDB_API_KEY: ${TMDB_API_KEY}
MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
PG_USER: ${PG_USER}
PG_PASS: ${PG_PASS}
PG_BASE: ${PG_BASE}
TZ: ${TZ}
USE_HTTPS: ${USE_HTTPS}
PROXY_URL: ${PROXY_URL}
# Service-to-service wiring
REDIS_HOST: stremio-redis
PG_HOST: stremio-postgres
MEILI_HOST: meilisearch
MEILI_PORT: "7700"
TASKIQ_REDIS_DB: "6"
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
warp:
image: caomingjun/warp:latest
container_name: sfr-warp
restart: always
expose:
- 1080
environment:
WARP_SLEEP: "2"
cap_add:
- NET_ADMIN
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv4.conf.all.src_valid_mark=1
volumes:
- warp-data:/var/lib/cloudflare-warp
networks:
- sfr-network
volumes:
stremio-postgres:
stremio-redis:
stream-fusion:
warp-data:
meili-data:
dmm-hashlists:
imdb-db:
torrent-cache:
taskiq-logs: