Aller au contenu

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:

Mise à jour

docker compose pull
docker compose up -d