import { CodeBlock } from "../components/CodeBlock";
import { Callout } from "../components/Callout";
export function DockerComposePage() {
return (
Docker Compose Setup
The recommended way to run Veylant IA locally or in a single-server staging environment is
Docker Compose. The full stack is defined in docker-compose.yml at the
repository root.
Services
| Service |
Image |
Port |
Purpose |
{[
{ service: "proxy", image: "Custom (Go, distroless)", port: "8090", purpose: "Main AI gateway" },
{ service: "pii", image: "Custom (Python FastAPI)", port: "8091 / 50051", purpose: "PII detection" },
{ service: "postgres", image: "postgres:16-alpine", port: "5432", purpose: "Config, users, policies" },
{ service: "redis", image: "redis:7-alpine", port: "6379", purpose: "Sessions, rate limits, PII maps" },
{ service: "clickhouse", image: "clickhouse:24.3-alpine", port: "8123 / 9000", purpose: "Audit logs & analytics" },
{ service: "keycloak", image: "keycloak:24.0", port: "8080", purpose: "IAM & SSO" },
{ service: "prometheus", image: "prom/prometheus:v2.53.0", port: "9090", purpose: "Metrics scraper" },
{ service: "grafana", image: "grafana:11.3.0", port: "3001", purpose: "Dashboards" },
{ service: "web", image: "node:20-alpine", port: "3000", purpose: "React dashboard" },
].map((row) => (
| {row.service} |
{row.image} |
{row.port} |
{row.purpose} |
))}
Make Commands
Startup Order & Health Checks
Services start in dependency order:
- PostgreSQL → Redis → ClickHouse (databases)
- Keycloak (waits for PostgreSQL health check)
- PII service (independent)
- Go proxy (waits for PostgreSQL, uses
service_started for others)
- React web (waits for proxy)
- Prometheus → Grafana (monitoring)
The proxy Docker image uses distroless/static — no shell, no{" "}
wget. Services that depend on the proxy use{" "}
condition: service_started rather than a health check command.
First Run: Database Migrations
On first start, the proxy automatically applies PostgreSQL migrations (9 migration files)
and ClickHouse DDL. You can also run migrations manually:
Protocol Buffer Generation
If the gen/ or services/pii/gen/ directories are missing (e.g.,
fresh clone), regenerate the gRPC stubs before starting:
The PII service starts but rejects all gRPC requests if services/pii/gen/ is
missing. Run make proto first.
Viewing Logs
);
}