134 lines
4.9 KiB
YAML
134 lines
4.9 KiB
YAML
# Honcho sandbox — an ephemeral, seeded stack for harness integration testing.
|
|
#
|
|
# This file is provider-agnostic and is NOT a working stack on its own. Exactly one
|
|
# provider overlay must be composed on top of it:
|
|
#
|
|
# docker compose -f sandbox/compose.yml -f sandbox/compose.mock.yml up -d # default
|
|
# docker compose -f sandbox/compose.yml -f sandbox/compose.real.yml up -d
|
|
#
|
|
# Use sandbox/sandbox.sh rather than driving compose directly.
|
|
|
|
name: honcho-sandbox
|
|
|
|
# Everything the api and deriver need in order to behave identically and promptly.
|
|
# Provider wiring lives in the overlays; this block is provider-independent.
|
|
x-honcho-env: &honcho-env
|
|
DB_CONNECTION_URI: postgresql+psycopg://postgres:postgres@database:5432/honcho_sandbox
|
|
CACHE_URL: redis://redis:6379/0?suppress=true
|
|
CACHE_ENABLED: "true"
|
|
AUTH_USE_AUTH: "false"
|
|
LOG_LEVEL: INFO
|
|
|
|
# The sandbox is configured only by what Compose injects here.
|
|
#
|
|
# src/config.py calls load_dotenv(override=True) at import, so a stray .env inside
|
|
# the image would beat this block. Dockerfile's `COPY config.toml* /app/` means a
|
|
# developer's local config.toml gets baked into any locally built image. Both are
|
|
# switched off so the stack cannot inherit machine state.
|
|
PYTHON_DOTENV_DISABLED: "1"
|
|
HONCHO_CONFIG_TOML_DISABLED: "1"
|
|
|
|
# Derivation has to happen now, not eventually. On stock settings a sandbox seeded
|
|
# with a handful of messages produces zero conclusions, and it fails silently — it
|
|
# reads as "the deriver found nothing" rather than "the deriver never ran".
|
|
#
|
|
# Three separate gates have to come off (src/config.py, DeriverSettings):
|
|
# - work units are not claimed until the batch reaches 512 tokens...
|
|
# - ...or REPRESENTATION_BATCH_MAX_AGE_SECONDS (30 min) elapses
|
|
# - startup jitter delays the first poll by up to 30s, then backoff stretches
|
|
# the interval out to 30s
|
|
DERIVER_FLUSH_ENABLED: "true"
|
|
DERIVER_REPRESENTATION_BATCH_WORK_UNIT_TARGET_TOKENS: "0"
|
|
DERIVER_REPRESENTATION_BATCH_MAX_AGE_SECONDS: "1"
|
|
DERIVER_POLLING_STARTUP_JITTER_SECONDS: "0"
|
|
DERIVER_POLLING_JITTER_RATIO: "0"
|
|
DERIVER_POLLING_BACKOFF_ENABLED: "false"
|
|
DERIVER_POLLING_SLEEP_INTERVAL_SECONDS: "0.25"
|
|
DERIVER_STALE_WORK_UNIT_CLEANUP_INTERVAL_SECONDS: "5"
|
|
|
|
# Dreams never fire on their own here: the document threshold is 50 and the
|
|
# minimum gap between dreams is 8 hours. seed.py calls schedule_dream directly,
|
|
# which bypasses both — but the subsystem still has to be enabled.
|
|
DREAM_ENABLED: "true"
|
|
|
|
services:
|
|
api:
|
|
image: ${HONCHO_SANDBOX_IMAGE:?set by sandbox.sh from sandbox/image.env}
|
|
entrypoint: ["sh", "docker/entrypoint.sh"]
|
|
depends_on:
|
|
database:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
ports:
|
|
- "127.0.0.1:${SANDBOX_API_PORT:-18000}:8000"
|
|
healthcheck:
|
|
test:
|
|
[
|
|
"CMD",
|
|
"/app/.venv/bin/python",
|
|
"-c",
|
|
"import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=2).read()",
|
|
]
|
|
interval: 3s
|
|
timeout: 5s
|
|
retries: 20
|
|
start_period: 10s
|
|
environment: *honcho-env
|
|
restart: "no"
|
|
|
|
deriver:
|
|
image: ${HONCHO_SANDBOX_IMAGE:?set by sandbox.sh from sandbox/image.env}
|
|
entrypoint: ["/app/.venv/bin/python", "-m", "src.deriver"]
|
|
depends_on:
|
|
api:
|
|
condition: service_healthy
|
|
database:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
environment: *honcho-env
|
|
restart: "no"
|
|
|
|
database:
|
|
image: pgvector/pgvector:pg15
|
|
ports:
|
|
- "127.0.0.1:${SANDBOX_DB_PORT:-15432}:5432"
|
|
command: ["postgres", "-c", "max_connections=200"]
|
|
environment:
|
|
POSTGRES_DB: postgres
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
# The port is bound to 127.0.0.1 and the whole database is disposable.
|
|
POSTGRES_HOST_AUTH_METHOD: trust
|
|
PGDATA: /var/lib/postgresql/data/pgdata
|
|
volumes:
|
|
# Creates the honcho_sandbox database. database/init.sql only adds the vector
|
|
# extension to `postgres`, and the sandbox needs its own database so that
|
|
# reset can DROP and re-CREATE it from a template.
|
|
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
|
- pgdata:/var/lib/postgresql/data/
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U postgres -d honcho_sandbox"]
|
|
interval: 3s
|
|
timeout: 5s
|
|
retries: 20
|
|
restart: "no"
|
|
|
|
redis:
|
|
image: redis:8.2
|
|
ports:
|
|
- "127.0.0.1:${SANDBOX_REDIS_PORT:-16379}:6379"
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "redis-cli ping"]
|
|
interval: 3s
|
|
timeout: 5s
|
|
retries: 20
|
|
restart: "no"
|
|
|
|
# Named volumes are prefixed with the project name (honcho-sandbox_*), so they
|
|
# never collide with a developer's existing local stack. `sandbox.sh down` removes
|
|
# them. Redis is deliberately unbacked — its state is rebuilt by reset.
|
|
volumes:
|
|
pgdata:
|