services: postgres: image: pgvector/pgvector:pg17 container_name: sotto-postgres deploy: resources: limits: memory: 1g ports: - '127.0.0.1:5432:5432' environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: sotto volumes: - sotto_postgres_data:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -h 127.0.0.1 -U postgres'] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: sotto-redis deploy: resources: limits: memory: 256m ports: - '127.0.0.1:6379:6379' volumes: - sotto_redis_data:/data healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 5s timeout: 5s retries: 5 pinchtab: image: pinchtab/pinchtab container_name: sotto-pinchtab deploy: resources: limits: memory: 1g ports: - '127.0.0.1:9867:9867' environment: BRIDGE_BIND: '0.0.0.0' BRIDGE_PORT: '9867' BRIDGE_HEADLESS: 'true' BRIDGE_STEALTH: 'full' BRIDGE_BLOCK_IMAGES: 'true' BRIDGE_BLOCK_ADS: 'true' BRIDGE_BLOCK_MEDIA: 'true' BRIDGE_NAV_TIMEOUT: '25' shm_size: '1gb' security_opt: - seccomp:unconfined healthcheck: test: ['CMD-SHELL', 'wget -q --spider http://localhost:9867/health || exit 1'] interval: 10s timeout: 5s retries: 10 start_period: 30s # --------------------------------------------------------------------------- # Totally-local inference profile (opt-in): docker compose --profile local up # Runs the whole AI stack on your own hardware with zero cloud keys. Pair with: # Save these service URLs in /welcome or Admin after the containers start. # (Inside Docker use the service names above; from the host use localhost + # the mapped ports below. See .env.oss.example.) # --------------------------------------------------------------------------- ollama: image: ollama/ollama:latest container_name: sotto-ollama profiles: ['local'] ports: - '127.0.0.1:11434:11434' volumes: - sotto_ollama_data:/root/.ollama # GPU (NVIDIA): uncomment to accelerate. Requires nvidia-container-toolkit. # On Apple Silicon, Docker has no GPU passthrough — Ollama runs on CPU here; # for Metal acceleration run Ollama natively on the host instead. # deploy: # resources: # reservations: # devices: # - driver: nvidia # count: all # capabilities: [gpu] healthcheck: test: ['CMD-SHELL', 'ollama list || exit 1'] interval: 10s timeout: 5s retries: 10 start_period: 30s whisper: # OpenAI-compatible local Whisper (faster-whisper-server). Serves # /v1/audio/transcriptions. For NVIDIA GPUs use the :latest-cuda image. image: fedirz/faster-whisper-server:latest-cpu container_name: sotto-whisper profiles: ['local'] ports: - '127.0.0.1:8001:8000' environment: # large-v3-turbo: best broad multilingual coverage (99+ languages). WHISPER__MODEL: deepdml/faster-whisper-large-v3-turbo-ct2 volumes: - sotto_whisper_data:/root/.cache/huggingface local-tts: # Keyless Kokoro TTS sidecar (services/local-tts). Multilingual, CPU-friendly. # Context is the service dir (its Dockerfile uses bare `COPY app.py`, matching # `docker build ... services/local-tts` in services/local-tts/AGENTS.md). build: context: ./services/local-tts dockerfile: Dockerfile container_name: sotto-local-tts profiles: ['local'] ports: - '127.0.0.1:8000:8000' healthcheck: test: ['CMD-SHELL', 'wget -q --spider http://localhost:8000/health || exit 1'] interval: 15s timeout: 5s retries: 10 start_period: 30s volumes: sotto_postgres_data: sotto_redis_data: sotto_ollama_data: sotto_whisper_data: