Internal documentation — not for external distribution.

System Overview

Planekeeper is a Go- and Postgres-backed service with remote agents that introspect version information from code repositories and normalize release metadata so rules can be applied to detect out-of-date software versions.

Architecture Diagram

                    Internet
                        |
        +---------------+---------------+
        |   traefik-public (80/443)     |
        |   - Client UI (/)             |
        |   - Client API (/api/v1/client)|
        |   - Agent API (/api/v1/agent) |
        |   - Public Docs (/docs)       |
        |   - Early Access (/earlyaccess)|
        |   - Swagger UI (/api/v1/swagger)|
        +---------------+---------------+
                        |
        +---------------+---------------+
        |               v               |
        |  +---------+ +-------------+  |
        |  |   API   | |  Client UI  |  |
        |  +----+----+ +-------------+  |
        |       |                       |
        |  +----+----+ +-------------+  |
        |  |PostgreSQL| | Internal UI |  |
        |  +---------+ +------+------+  |
        |                     |         |
        |  +-------------+ +----------+ |
        |  | TaskEngine  | |ServerAgent||
        |  +-------------+ +----------+ |
        |  +-------------+ +----------+ |
        |  |  Notifier   | |EarlyAccess||
        |  +-------------+ +----------+ |
        |  +------+ +---------------+   |
        |  | Docs | | Internal Docs |   |
        |  +------+ +---------------+   |
        +---------------------+---------+
                              |
        +---------------------v---------+
        | traefik-internal (8443/8082)  |
        | - Internal UI (/)             |
        | - Internal API (/api/v1/internal)|
        | - Internal Docs (/docs)       |
        | - Early Access Admin (/earlyaccess)|
        +-------------------------------+
                  ^
            Firewall-restricted IP

Service Descriptions

ServiceRole
Server (API)Hosts the REST API, runs migrations, manages background services
ClientUIPublic-facing UI for end users
InternalUIAdmin UI for system management (port 8443, firewall-restricted)
ServerAgentPolls for tasks, executes gather/scrape jobs (co-located in Docker network)
ClientAgentSame as ServerAgent but deployed remotely at client sites
TaskEngineHandles job scheduling, timeout management, and result processing
EOLSyncScheduled sync of endoflife.date data
NotifierDelivers webhook notifications for alert events with retry logic
EarlyAccessWaitlist form and admin management for early access signups
DocsPublic Hugo (docs theme) documentation site (nginx)
Internal DocsInternal Hugo (docs theme) documentation site (nginx)

Split Traefik Architecture

The deployment uses two separate Traefik reverse proxy instances:

  • traefik-public (ports 80/443): Exposes only client-facing endpoints — Client UI, Client API, Agent API, public docs, early access, and Swagger UI
  • traefik-internal (port 8443): Exposes admin/internal endpoints — Internal UI, Internal API, internal docs, and early access admin. TLS via Let’s Encrypt DNS-01. Accessible only via firewall-restricted IP.

Public Traefik Routes

RouterRuleServicePriority
client-apiPathPrefix(/api/v1/client)api (3000)100
agent-apiPathPrefix(/api/v1/agent)api (3000)100
healthPath(/health)api (3000)100
swagger-clientPathPrefix(/api/v1/swagger)api (3000)100
api-specsPathPrefix(/api/)api (3000)50
docsPathPrefix(/docs)docs (8080)100
earlyaccessPath(/earlyaccess)earlyaccess (3000)100
clientuiCatch-allclientui (3000)1

Internal Traefik Routes

RouterRuleServicePriority
internal-apiPathPrefix(/api/v1/internal)api (3000)100
healthPath(/health)api (3000)100
api-specsPathPrefix(/api/spec)api (3000)100
earlyaccessPathPrefix(/earlyaccess)earlyaccess (3000)100
internal-docsPathPrefix(/docs)internal-docs (8080)100
internaluiPathPrefix(/)internalui (3000)1

Key Design Decisions

  • Multi-tenant: Organizations provide the tenant boundary. All data is scoped to an organization.
  • Dual auth: The API server supports both JWT (Supabase) and API key authentication.
  • Agent-based: Remote agents poll the server for tasks, enabling deployment at client sites behind firewalls.
  • Event-driven alerts: Rule evaluation triggers events that the notification system subscribes to.
  • Docker-native: All development tools and production deployment use Docker containers.