Key points
- Runners hold long-lived outbound connections to the dispatcher, so runners never need inbound access.
- The UI and API are the only surfaces that normally need external exposure, plus the Git webhook endpoint when non-GitHub providers are used.
- Docker step containers default to bridge networking;
DOCKER_NETWORK_NAME=noneremoves egress entirely. GET /metricsis public by default for scraper compatibility and can be locked behind bearer auth withMETRICS_REQUIRE_AUTH.- The Docker socket proxy exposes only the allow-listed reads System Logs needs and must never be replaced by the raw socket.
How it works
Internal service URLs (AAA_API_URL, GIT_BOT_API_URL, NOPSAI_API_URL) describe a private network. Exposing AAA or the dispatcher publicly removes a boundary the design depends on.
Provider endpoints for LLM and MCP must be reachable from the API runtime. Inside containers localhost refers to the container, so host-launched tools need a LAN IP or host.docker.internal.
Examples
# from the host: the published surfaces
curl -s localhost:8080/livez
curl -sI localhost/ | head -1
# from anywhere else: these should not answer
nc -z -w2 $HOST 9091 && echo "dispatcher reachable" || echo "dispatcher closed"
nc -z -w2 $HOST 5432 && echo "database reachable" || echo "database closed"Limits
Current behavior
- The repository documents no Kubernetes NetworkPolicy set and no automatic certificate-management integration.
Implementation evidence
docker-compose.yamlPublished ports and bind address defaults.
services/docker-socket-proxyThe allow-listed Docker API surface.

