10 KiB
Executable File
Docker Configuration Reference
This document describes the checked-in Dockerfiles and Compose assets that ship with the repository.
Prerequisites
- Docker Compose v2.20+ is required by the root
docker-compose.ymlbecause it usesinclude:. - The repository does not declare formal CPU, memory, or disk minimums. No resource limits are set in the checked-in Compose file, so capacity planning remains an operator responsibility.
- Docker is mandatory only for containerized runs, live tests, and the observability profile. Local source-based development can run directly through Deno.
Docker build
The Dockerfile is a two-stage Deno build:
denoland/deno:2.9.3builds the control UI inside the image.denoland/deno:alpine-2.9.3serves the gateway and the built UI bundle at runtime.
The image exposes port 8080 and runs through deploy/docker-entrypoint.sh,
which mirrors the runtime permission contract and only adds scoped --allow-run
when FROSTY_WORKERS>1 requires the supervisor process to spawn workers.
Docker Compose services
| Service | Image | Ports | Purpose | Volumes |
|---|---|---|---|---|
gateway |
local build | 8080:8080 |
Main API and same-origin control UI | frosty-data:/app/data |
postgres |
pgvector/pgvector:0.8.5-pg18 |
5432:5432 |
Required durable state, counters, response cache, and embedding index | postgres-data:/var/lib/postgresql |
pgbouncer |
edoburu/pgbouncer:v1.24.1-p1 |
6432:6432 |
Optional transaction pooler profile | none |
prometheus |
prom/prometheus:v2.53.0 |
9090:9090 |
Optional metrics storage and scrape target | prometheus-data:/prometheus plus config bind mount |
grafana |
grafana/grafana:11.1.0 |
3000:3000 |
Optional dashboard UI | grafana-data:/var/lib/grafana plus provisioning bind mounts |
grafana-provision |
curlimages/curl:8.11.1 |
none | One-shot Grafana observer-account bootstrap | bind mount of deploy/observability/grafana-observer.sh |
otel-collector |
otel/opentelemetry-collector-contrib:0.109.0 |
4318:4318, 4317:4317, 8888:8888, 8889:8889 |
OTLP intake and span-metrics fanout | config bind mount |
minio |
minio/minio:RELEASE.2025-09-07T16-13-09Z |
9000:9000, 9001:9001 |
S3-compatible trace storage backend for Tempo | host bind mount at ${FROSTY_TEMPO_STORAGE_PATH:-./data/tempo} |
minio-init |
minio/mc:RELEASE.2025-08-13T08-35-41Z |
none | Creates the Tempo trace bucket, then exits | none |
tempo-distributor |
grafana/tempo:2.9.0 |
none | Receives traces from the collector | config bind mount |
tempo-ingester |
grafana/tempo:2.9.0 |
none | Tempo ingest and WAL handling | tempo-wal:/var/tempo plus config bind mount |
tempo-querier |
grafana/tempo:2.9.0 |
none | Query backend for Tempo | config bind mount |
tempo-query-frontend |
grafana/tempo:2.9.0 |
3200:3200 |
Tempo query API and readiness endpoint | config bind mount |
tempo-compactor |
grafana/tempo:2.9.0 |
none | Tempo block compaction and retention work | config bind mount |
Environment variables for Docker
The gateway service forwards the full gateway env surface from .env.example
into the container. That includes provider credentials, PostgreSQL settings,
worker topology, caching, MCP, logging, observability, encryption, pricing sync,
HTTP client tuning, plugins, and Code Mode controls.
Additional Docker-specific variables used outside the gateway service:
| Variable | Used By | Purpose |
|---|---|---|
GF_ADMIN_USER |
grafana, grafana-provision |
Grafana admin username |
GF_ADMIN_PASSWORD |
grafana, grafana-provision |
Grafana admin password |
GF_OBSERVER_USER |
grafana-provision |
Observer account username |
GF_OBSERVER_PASSWORD |
grafana-provision |
Observer account password |
TEMPO_S3_ACCESS_KEY |
minio, minio-init, Tempo services |
MinIO access key |
TEMPO_S3_SECRET_KEY |
minio, minio-init, Tempo services |
MinIO secret key |
TEMPO_S3_BUCKET |
minio-init, Tempo services |
Tempo trace bucket name |
TEMPO_BLOCK_RETENTION |
Tempo services | Block retention period |
FROSTY_TEMPO_STORAGE_PATH |
minio bind mount |
Host path for MinIO trace storage |
See environment-variables.md for the full gateway env reference.
Volume mounts
| Volume or mount | Used By | Purpose |
|---|---|---|
frosty-data |
gateway |
Process-local scratch under /app/data |
postgres-data |
postgres |
Durable PostgreSQL data |
prometheus-data |
prometheus |
Prometheus TSDB storage |
grafana-data |
grafana |
Grafana state and provisioned metadata |
tempo-wal |
tempo-ingester |
Tempo write-ahead log |
${FROSTY_TEMPO_STORAGE_PATH:-./data/tempo} |
minio |
Host bind mount for Tempo trace blocks |
./deploy/observability/... |
observability services | Provisioned configs and dashboards |
Network configuration
- The gateway serves public traffic on port
8080. - PostgreSQL is exposed on
5432and is a hard dependency for production boot. - PgBouncer, when enabled, is exposed on
6432, but the session-stable LISTEN connection must still target PostgreSQL directly. - The observability profile exposes Grafana on
3000, Prometheus on9090, OTLP on4318and4317, MinIO on9000and9001, and Tempo query frontend on3200.
Common operations
Building images
- Build the gateway image:
docker build -t frosty-gateway . - Build and start the default Compose stack:
docker compose up -d --build
Starting and stopping services
- Start the default stack:
docker compose up -d - Add PgBouncer:
docker compose --profile pgbouncer up -d - Add observability:
docker compose --profile observability up -d - Stop everything:
docker compose down - Reset volumes:
docker compose down -v
Viewing logs
- Gateway logs:
docker compose logs -f gateway - PostgreSQL logs:
docker compose logs -f postgres - Observability logs:
docker compose --profile observability logs -f grafana prometheus otel-collector
Debugging containers
- Gateway shell:
docker compose exec gateway sh - PostgreSQL shell:
docker compose exec postgres sh - Compose status:
docker compose ps
Data persistence and backup
- PostgreSQL is the system's durable source of truth for config, counters, logs, and cache metadata.
postgres-datais the most critical volume to back up.frosty-dataholds process-local scratch only.- Tempo trace blocks live in the MinIO bind mount path and the ingester WAL volume.
- Prometheus and Grafana volumes matter only if you need observability history preserved.
Production considerations
- Health checks are defined for
gateway,postgres,pgbouncer,grafana, andminio. - The checked-in Compose assets do not define CPU or memory limits.
- Secrets are injected through environment variables; the repository does not ship a separate secret manager integration for Compose.
- The gateway process can run multi-worker on Linux and macOS when
FROSTY_WORKERS>1, but the Compose topology itself remains one gateway container unless the operator scales it externally. - Kubernetes and Helm packaging are not present in the repository and should not be documented as shipped deployment targets.