Skip to content

Requirements

Host

Resource Minimum Comfortable
CPU 4 vCPU 8 vCPU
Memory 4 GB 8 GB
Disk 20 GB 50 GB+ — grows with retention and saved bodies

Nine JVM services, Postgres, and Redis run side by side. On a small host, apply the resource overlay described in Scaling — it caps each JVM's heap and connection pool so the stack fits in roughly 8 vCPU / 7 GB.

Software

Component Version Notes
Docker Engine 24+ With the Compose plugin (docker compose, not docker-compose).
PostgreSQL 18 Supplied by the stack. No extensions required.
Redis 8 Supplied by the stack.
JDK 17+ Only to build outside Docker. The jars are compiled to Java 17 bytecode and run on 17 or anything newer; the shipped images bundle Temurin 21.
Python 3.10+ Only to run the probe agent outside Docker.
Node.js 18+ Only to build or run the dashboard outside Docker.

Any stock PostgreSQL 18 works

The Compose file pulls postgres:18-alpine. Tracedown creates no hypertables, installs no extensions and depends on no particular distribution — a container, a distro package or a managed instance are all fine. See Database & Migrations.

Redis 8 is not BSD-licensed — Valkey 8 is a drop-in alternative

The Compose files pull redis:8-alpine. From Redis 8 on, the server is distributed under RSALv2, SSPLv1 or AGPLv3 rather than the BSD license that covered Redis 7 and earlier. Tracedown uses only ordinary key, list and pub/sub commands — no modules, no Redis-specific extensions — so if that license change is a problem for you, point the stack at valkey/valkey:8-alpine, the BSD-licensed fork, and change nothing else: the REDIS_*_URL values, the --appendonly yes and --maxmemory-policy arguments and the redis-cli ping healthcheck all work unchanged. Redis stays the tested and supported default.

max_connections must be at least 160

The stack reserves 103 connections while idle, so the PostgreSQL default of 100 is not enough and the stack will not finish booting on it. The bundled Compose file raises it with postgres -c max_connections=160; if you point Tracedown at your own PostgreSQL, raise it there instead. The arithmetic is in Scaling.

Source layout

Only relevant when building the images from source — the production deploy runs from published release artifacts and needs none of this.

All Lace libraries are pinned Maven Central dependencies (dev.lacelang:*), so there are no extra repositories to clone or copy. The one convention that remains: the backend's Docker build context is the parent of the repository root, so clone into a fixed tree:

tracedown/
  core/
    tracedown-core-backend/     # the JVM services + docker/ stack
    tracedown-core-frontend/    # the dashboard
    tracedown-probe-agent/      # the probe agent

Network

Port Who Purpose
20714 api-gateway REST API and health. Published on 127.0.0.1; your web server proxies to it.
20870 realtime-service WebSocket. Published on 127.0.0.1; proxied by your web server.
20850 metrics-service Prometheus scrape endpoint. Published on 127.0.0.1.
5555 Postgres Mapped to the host by the dev stack. Do not expose publicly.
8443 Probe agent The scheduler connects here over mutual TLS.

Agents must be reachable from the scheduler — the scheduler dials the agent, not the other way round. An agent behind NAT with no inbound route will register and then never receive work.

Outbound, agents need to reach whatever you are monitoring, and the host needs to reach your email provider if you configure one.