*** title: Configuration description: Advanced configuration options for STT Docker deployments ---------------------------------------------------------------------- ## Overview This guide covers advanced configuration options for customizing your Docker deployment. Learn how to optimize resources, configure external services, and tune performance. ## Environment Variables All configuration is managed through environment variables in the `.env` file. ### Core Configuration Your Smallest.ai license key for validation and usage reporting Download URL for the Lightning ASR model (provided by Smallest.ai) ### API Server Configuration Port for the API server to listen on ```bash API_SERVER_PORT=8080 ``` Internal URL for license proxy communication Internal URL for Lightning ASR communication ### Lightning ASR Configuration Port for Lightning ASR to listen on ```bash ASR_PORT=2233 ``` Redis connection URL for caching and state management For external Redis: ```bash REDIS_URL=redis://external-redis.example.com:6379 ``` With password: ```bash REDIS_URL=redis://:password@redis:6379 ``` GPU device ID to use (for multi-GPU systems) ```bash GPU_DEVICE_ID=0 ``` ## Resource Configuration ### GPU Allocation For systems with multiple GPUs, you can specify which GPU to use: ```yaml docker-compose.yml lightning-asr: deploy: resources: reservations: devices: - driver: nvidia device_ids: ['0'] capabilities: [gpu] ``` For multiple GPUs per container: ```yaml docker-compose.yml lightning-asr: deploy: resources: reservations: devices: - driver: nvidia count: 2 capabilities: [gpu] ``` ### Memory Limits Set memory limits for containers: ```yaml docker-compose.yml api-server: deploy: resources: limits: memory: 2G reservations: memory: 512M lightning-asr: deploy: resources: limits: memory: 16G reservations: memory: 12G ``` ### CPU Allocation Reserve CPU cores for each service: ```yaml docker-compose.yml lightning-asr: deploy: resources: limits: cpus: '8' reservations: cpus: '4' ``` ## Redis Configuration ### Using External Redis To use an external Redis instance instead of the embedded one: Modify `.env` file: ```bash REDIS_URL=redis://your-redis-host:6379 REDIS_PASSWORD=your-password ``` Comment out or remove the Redis service: ```yaml docker-compose.yml # redis: # image: redis:latest # ... ``` Remove Redis from depends\_on: ```yaml docker-compose.yml api-server: depends_on: - lightning-asr - license-proxy # - redis # removed ``` ### Redis Persistence Enable data persistence for Redis: ```yaml docker-compose.yml redis: image: redis:latest command: redis-server --appendonly yes volumes: - redis-data:/data networks: - smallest-network volumes: redis-data: driver: local ``` ### Redis with Authentication Add password protection: ```yaml docker-compose.yml redis: image: redis:latest command: redis-server --requirepass ${REDIS_PASSWORD} environment: - REDIS_PASSWORD=${REDIS_PASSWORD} ``` Update `.env`: ```bash REDIS_PASSWORD=your-secure-password REDIS_URL=redis://:your-secure-password@redis:6379 ``` ## Scaling Configuration ### Multiple ASR Workers Run multiple Lightning ASR containers for higher throughput: ```yaml docker-compose.yml services: lightning-asr-1: image: quay.io/smallestinc/lightning-asr:latest ports: - "2233:2233" environment: - MODEL_URL=${MODEL_URL} - LICENSE_KEY=${LICENSE_KEY} - REDIS_URL=redis://redis:6379 - PORT=2233 deploy: resources: reservations: devices: - driver: nvidia device_ids: ['0'] capabilities: [gpu] networks: - smallest-network lightning-asr-2: image: quay.io/smallestinc/lightning-asr:latest ports: - "2234:2233" environment: - MODEL_URL=${MODEL_URL} - LICENSE_KEY=${LICENSE_KEY} - REDIS_URL=redis://redis:6379 - PORT=2233 deploy: resources: reservations: devices: - driver: nvidia device_ids: ['1'] capabilities: [gpu] networks: - smallest-network api-server: environment: - LIGHTNING_ASR_BASE_URL=http://lightning-asr-1:2233,http://lightning-asr-2:2233 ``` This configuration requires multiple GPUs in your system and will distribute load across workers. ## Network Configuration ### Custom Network Settings Configure custom network with specific subnet: ```yaml docker-compose.yml networks: smallest-network: driver: bridge ipam: config: - subnet: 172.28.0.0/16 gateway: 172.28.0.1 ``` ### Expose on Specific Interface Bind to specific host IP: ```yaml docker-compose.yml api-server: ports: - "192.168.1.100:7100:7100" ``` ### Use Host Network For maximum performance (loses network isolation): ```yaml docker-compose.yml api-server: network_mode: host ``` Host network mode bypasses Docker networking and directly uses host network stack. Use only if necessary. ## Logging Configuration ### Custom Log Drivers Use JSON file logging with rotation: ```yaml docker-compose.yml services: api-server: logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` ### Syslog Integration Send logs to syslog: ```yaml docker-compose.yml services: api-server: logging: driver: "syslog" options: syslog-address: "tcp://192.168.1.100:514" tag: "smallest-api-server" ``` ### Centralized Logging Forward logs to external logging service: ```yaml docker-compose.yml services: api-server: logging: driver: "fluentd" options: fluentd-address: "localhost:24224" tag: "docker.{{.Name}}" ``` ## Volume Configuration ### Persistent Model Storage Avoid re-downloading models on container restart: ```yaml docker-compose.yml services: lightning-asr: volumes: - model-cache:/app/models volumes: model-cache: driver: local ``` ### Custom Model Location Use a specific host directory: ```yaml docker-compose.yml services: lightning-asr: volumes: - /mnt/models:/app/models environment: - MODEL_CACHE_DIR=/app/models ``` ## Health Checks ### Custom Health Check Intervals Adjust health check timing: ```yaml docker-compose.yml redis: healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 start_period: 30s ``` ### API Server Health Check Add health check for API server: ```yaml docker-compose.yml api-server: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:7100/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s ``` ## Security Configuration ### Run as Non-Root User Add user specification: ```yaml docker-compose.yml api-server: user: "1000:1000" ``` ### Read-Only Filesystem Increase security with read-only root filesystem: ```yaml docker-compose.yml api-server: read_only: true tmpfs: - /tmp - /var/run ``` ### Resource Limits Prevent resource exhaustion: ```yaml docker-compose.yml api-server: deploy: resources: limits: cpus: '2' memory: 2G pids: 100 ``` ## Example: Production Configuration Here's a complete production-ready configuration: ```yaml docker-compose.yml version: "3.8" services: lightning-asr: image: quay.io/smallestinc/lightning-asr:latest ports: - "127.0.0.1:2233:2233" environment: - MODEL_URL=${MODEL_URL} - LICENSE_KEY=${LICENSE_KEY} - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379 - PORT=2233 volumes: - model-cache:/app/models deploy: resources: limits: memory: 16G cpus: '8' reservations: memory: 12G cpus: '4' devices: - driver: nvidia count: 1 capabilities: [gpu] restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - smallest-network api-server: image: quay.io/smallestinc/self-hosted-api-server:latest container_name: api-server ports: - "7100:7100" environment: - LICENSE_KEY=${LICENSE_KEY} - LIGHTNING_ASR_BASE_URL=http://lightning-asr:2233 - API_BASE_URL=http://license-proxy:6699 deploy: resources: limits: memory: 2G cpus: '2' reservations: memory: 512M cpus: '0.5' restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:7100/health"] interval: 30s timeout: 10s retries: 3 networks: - smallest-network depends_on: - lightning-asr - license-proxy - redis license-proxy: image: quay.io/smallestinc/license-proxy:latest container_name: license-proxy environment: - LICENSE_KEY=${LICENSE_KEY} deploy: resources: limits: memory: 512M cpus: '1' restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: - smallest-network redis: image: redis:7-alpine command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes ports: - "127.0.0.1:6379:6379" volumes: - redis-data:/data deploy: resources: limits: memory: 1G cpus: '1' restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 3s retries: 5 networks: - smallest-network networks: smallest-network: driver: bridge name: smallest-network volumes: model-cache: driver: local redis-data: driver: local ``` ## What's Next? Learn about each service component in detail Debug common issues and optimize performance