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 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:

Mise à jour

docker compose pull
docker compose up -d