# StreamHoard — Docker Compose deployment # # Runs alongside existing LAMP stacks without conflicts: # - Apache keeps port 80/443 # - MySQL is untouched (StreamHoard uses its own MongoDB in a container) # - StreamHoard exposes a single configurable port (default 8080) # # Usage: # cp .env.compose.example .env # # edit .env — set JWT_SECRET, ADMIN_PASSWORD, KINO_HTTP_PORT, MEDIA_ROOT_HOST # docker compose up -d # # visit http://:8080 (or whatever KINO_HTTP_PORT you set) services: mongo: image: mongo:4.4 container_name: streamhoard-mongo restart: unless-stopped volumes: - mongo-data:/data/db networks: - streamhoard # No ports exposed to host — only reachable inside streamhoard network backend: build: context: ./backend dockerfile: Dockerfile container_name: streamhoard-backend restart: unless-stopped depends_on: - mongo environment: MONGO_URL: mongodb://mongo:27017 DB_NAME: ${DB_NAME:-kino} CORS_ORIGINS: "*" JWT_SECRET: ${JWT_SECRET:?set JWT_SECRET in .env} JWT_ALG: HS256 JWT_EXPIRE_HOURS: ${JWT_EXPIRE_HOURS:-720} ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@streamhoard.local} ADMIN_PASSWORD: ${ADMIN_PASSWORD:?set ADMIN_PASSWORD in .env} ADMIN_NAME: ${ADMIN_NAME:-Admin} MEDIA_ROOT: /media volumes: # Host media directory (movies, HLS, subtitles) — point at your NAS/ZFS mount - ${MEDIA_ROOT_HOST:-./media}:/media networks: - streamhoard # No direct host port — frontend container reverse-proxies /api → backend:8001 frontend: build: context: ./frontend dockerfile: Dockerfile container_name: streamhoard-frontend restart: unless-stopped depends_on: - backend ports: # Only StreamHoard's external port. Change KINO_HTTP_PORT to avoid clashes with Apache. - "${KINO_HTTP_PORT:-8080}:80" networks: - streamhoard networks: streamhoard: driver: bridge volumes: mongo-data: driver: local