Ctrl K
ComunidadGuías…

docker-compose.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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:
    # Optional bundled Kokoro service. Unsupported engine selections fail.
    # 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
      target: ${LOCAL_TTS_ENGINE:-kokoro}
    container_name: sotto-local-tts
    profiles: ['local']
    environment:
      LOCAL_TTS_ENGINE: ${LOCAL_TTS_ENGINE:-kokoro}
    ports:
      - '127.0.0.1:8000:8000'
    healthcheck:
      test:
        [
          'CMD',
          'python',
          '-c',
          "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=5)",
        ]
      interval: 15s
      timeout: 5s
      retries: 10
      start_period: 30s

volumes:
  sotto_postgres_data:
  sotto_redis_data:
  sotto_ollama_data:
  sotto_whisper_data: