name: arandu

# Variables requeridas en .env (ver OPERATIONS.md §15.4 y CONFIGURATION.md §4):
#
#   ARANDU_IMAGE            Imagen OCI de arandu-server.
#                           Default: localhost/arandu-server:0.1.0-rc-smoke
#   ARANDU_PORT             Puerto host expuesto (solo arandu expone puerto externo).
#                           Default: 8080
#   QDRANT_VERSION          Tag de imagen Qdrant, misma major que el cliente del
#                           workspace (qdrant-client 1.x). Ejemplo: v1.13.4
#
# Variables de runtime inyectadas al contenedor arandu-server vía env_file .env:
#
#   ARANDU_ENV              development | production
#   ARANDU_BIND_ADDR        Dirección de escucha interna (0.0.0.0:8080)
#   ARANDU_APP_URL          URL pública de la instancia (para guards CORS/TLS)
#   ARANDU_DATABASE_URL     Cadena de conexión PostgreSQL (incluye password inline)
#   ARANDU_DATABASE_MIGRATE_ON_BOOT  true / false
#   ARANDU_REDIS_URL        Cadena de conexión Redis
#   ARANDU_QDRANT_URL       Endpoint Qdrant gRPC (http://qdrant:6334)
#   ARANDU_DOCUMENT_STORAGE_PATH  Ruta de storage de documentos RAG en contenedor
#   ARANDU_MASTER_KEY_FILE  Ruta al archivo KEK en contenedor (/run/secrets/kek)
#   ARANDU_KEY_VERSION      Versión activa de la KEK (default: 1)
#   ARANDU_ENABLE_RAG       true / false
#   ARANDU_LICENSE_MODE     fake | remote
#   ARANDU_LICENSE_FAKE_STATE  trial | active | license_grace | license_blocked
#   ARANDU_LOG_LEVEL        error | warn | info | debug | trace
#   ARANDU_LOG_FORMAT       json | text
#   ARANDU_MAX_REQUEST_BYTES  Límite de payload en bytes
#
# El reverse proxy TLS es responsabilidad del cliente (OPERATIONS.md §15.1).
# Este compose NO incluye proxy: arandu-server escucha en 127.0.0.1:ARANDU_PORT.

services:

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: arandu
      POSTGRES_DB: arandu
      POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    secrets:
      - postgres-password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U arandu"]
      interval: 5s
      timeout: 3s
      retries: 20

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - ./data/redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 20

  qdrant:
    image: qdrant/qdrant:${QDRANT_VERSION:-v1.13.4}
    restart: unless-stopped
    volumes:
      - ./data/qdrant:/qdrant/storage
    healthcheck:
      # La imagen de qdrant no trae wget/curl: probe TCP puro con bash.
      test: ["CMD-SHELL", "bash -c ': > /dev/tcp/127.0.0.1/6333' || exit 1"]
      interval: 5s
      timeout: 3s
      retries: 20

  arandu-server:
    image: ${ARANDU_IMAGE:-localhost/arandu-server:0.1.0-rc-smoke}
    restart: unless-stopped
    env_file: .env
    secrets:
      - kek
      # Si se provisiona license key por archivo:
      # - license-key
    volumes:
      - ./data/storage:/var/lib/arandu/storage:rw
    ports:
      - "127.0.0.1:${ARANDU_PORT:-8080}:8080"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      qdrant:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://localhost:8080/ready || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 30

secrets:
  postgres-password:
    file: ./secrets/postgres-password
  kek:
    file: ./secrets/kek.key
  # license-key:
  #   file: ./secrets/license-key.jwt
