Files
documentation/stream-api/deployment/self-hosting.md
2026-11-14 18:21:12 -08:00

5.1 KiB

Self-Hosting Stream API

Complete production self-hosting guide for Stream API: Docker, Node.js systemd, PM2, and Nginx reverse proxy configuration with SSE streaming support.

Overview

Stream API is designed to be completely self-hostable on any Linux virtual private server (VPS), home server, or Docker container environment. Running your own instance gives you private access, eliminates shared IP rate limits, and allows you to tune worker concurrency to your hardware.


Environment Variables

Configure your environment variables via a .env file in the project root:

Variable Required Default Description
PORT Optional 7860 HTTP port on which the server binds.
TMDB_API_KEY Recommended "" The Movie Database v3 API key. Required for scrapers that resolve metadata via IMDb ID or episode titles.
WORKER_COUNT Optional os.cpus().length Number of worker processes to fork in cluster mode.
ENABLE_DEBUG_ROUTE Optional false Enables deep diagnostic traces at /debug/:source. Keep false in production.
GA_MEASUREMENT_ID Optional "" Google Analytics 4 Measurement ID for private usage telemetry.
GA_API_SECRET Optional "" Google Analytics 4 Measurement Protocol API Secret.
FALLBACK_BASE Optional "" Secondary Stream API instance URL used for failover redirects.
IS_HF Optional false Enables HuggingFace Spaces compatibility constraints.

1. Dockerfile

Create a Dockerfile in the project directory:

FROM node:20-alpine

WORKDIR /app

# Install native dependencies required for TLS and encryption
RUN apk add --no-cache python3 make g++

COPY package*.json ./
RUN npm ci --omit=dev

COPY . .

ENV PORT=7860
EXPOSE 7860

CMD ["node", "server.js"]

2. Docker Compose

Create a docker-compose.yml file:

version: '3.8'

services:
  stream-api:
    build: .
    container_name: vyla-stream-api
    restart: unless-stopped
    ports:
      - "127.0.0.1:7860:7860"
    environment:
      - PORT=7860
      - TMDB_API_KEY=your_tmdb_api_key_here
      - WORKER_COUNT=4
      - ENABLE_DEBUG_ROUTE=false
    volumes:
      - ./data:/app/data
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Start the container in detached mode:

docker compose up -d

Deployment Option 2: Direct Node.js & Systemd

1. Installation

# Clone the repository
git clone https://gitlab.com/vyla-entertainment/stream-api.git /opt/stream-api
cd /opt/stream-api

# Install dependencies
npm ci --omit=dev

2. Create Systemd Service

Create /etc/systemd/system/stream-api.service:

[Unit]
Description=Vyla Stream API Service
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/stream-api
ExecStart=/usr/bin/node /opt/stream-api/server.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=7860
Environment=TMDB_API_KEY=your_tmdb_api_key_here
Environment=WORKER_COUNT=4

# Security Hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Enable and start the service:

sudo systemctl daemon-reload
sudo systemctl enable --now stream-api
sudo systemctl status stream-api

Reverse Proxy: Nginx Configuration

Because Stream API utilizes Server-Sent Events (SSE) and large HLS video streams, your reverse proxy must disable proxy buffering. Standard buffering will delay SSE events until the buffer fills, breaking progressive playback.

Create an Nginx configuration at /etc/nginx/sites-available/stream-api.conf:

server {
    server_name stream-api.yourdomain.com;

    # Maximum upload size for DB syncs
    client_max_body_size 20M;

    location / {
        proxy_pass http://127.0.0.1:7860;
        proxy_http_version 1.1;

        # Mandatory for Server-Sent Events (SSE)
        proxy_set_header Connection '';
        proxy_buffering off;
        proxy_cache off;
        chunked_transfer_encoding off;

        # Keep-Alive & Timeouts for long media streams
        proxy_read_timeout 90s;
        proxy_send_timeout 90s;

        # Forward Client Identifiers for Geo-Token Verification
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 80;
}

Enable the configuration and obtain a free SSL certificate via Certbot:

sudo ln -s /etc/nginx/sites-available/stream-api.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

# Install Let's Encrypt SSL
sudo certbot --nginx -d stream-api.yourdomain.com

Verifying Your Deployment

Once deployed, verify the installation by testing the /health endpoint:

curl -i https://stream-api.yourdomain.com/health

You should receive an HTTP 200 (or 207) with JSON detailing the cluster status, cache count, and source probe results.