atlas-os/ARCHITECTURE.md
Atlas Developer 8c1efe6e30 feat: Atlas OS v2.0 — space-grade animated README, full productified repo
- assets/header.svg: animated SVG header (twinkling stars, orbiting service dots,
  Atlas A logo with glow, float/pulse animations, corner accents)
- README.md: animated banner, full 39-app service catalog, Mermaid architecture,
  AI stack table, tech stack, quick-deploy, repo structure, security model
- ARCHITECTURE.md: one-box philosophy, 5-tier service layers, data flow diagram,
  Caddy SSO pattern, AI mesh topology, Docker Compose topology
- SERVICES.md: all 55 containers + 20 systemd services documented
- CHANGELOG.md: full build history from v0.5 to v2.0
- assets/logo.svg: Atlas A logo with gradient
- deploy/install.sh: one-command installer (Docker + Caddy + Tailscale + stacks)
- deploy/compose/atlas-core.yml: Authentik + Nextcloud + Stalwart + Forgejo + Vaultwarden
- deploy/caddy/Caddyfile.template: Authentik SSO pattern, sanitized
- deploy/README.md: full deployment guide
- server/: sanitized atlas_brain.py, cockpit_shim.py, intelligence.py, meridian.py,
  atlas_router_api.py, cli-atlas.py (all secrets stripped, env var patterns)
- server/systemd/: 6 atlas-* service unit files
- server/README.md: deployment and configuration guide

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 21:33:18 +02:00

8.2 KiB

Atlas OS — System Architecture

Overview: The One-Box Philosophy

Atlas OS is deliberately a single-server architecture. One Hetzner CPX32 VPS (8 vCPU · 16 GB RAM · 150 GB NVMe · Nuremberg) runs the complete operational infrastructure of Atlas Corporation: CRM, finance, communications, AI, document management, fleet control, and 11 websites.

Why one box? For a solo founder, operational simplicity outweighs redundancy. One server = one bill, one SSH target, one Caddy config, one Authentik instance, and zero inter-datacenter latency. The Tailscale overlay provides device-level redundancy for access even if Caddy is down.


Network Topology

                    ┌──────────────────────────────────────────────┐
 Public Internet    │              atlas-01 (Hetzner CPX32)        │
 ─────────────      │  ┌─────────┐    ┌──────────┐                │
 Browser/App ──────►│  │  Caddy  │───►│Authentik │──► Services    │
                    │  │  (TLS)  │    │  (SSO)   │                │
                    │  └─────────┘    └──────────┘                │
                    │                                              │
 Tailscale mesh     │  ┌────────────────────────────────────────┐ │
 ────────────────   │  │  Private tailnet (100.x.x.x)           │ │
 iOS / PC / Laptop─►│  │  Webtop desktop · internal dashboards  │ │
                    │  └────────────────────────────────────────┘ │
                    └──────────────────────────────────────────────┘

Public → SSO path (every service except mail ports)

  1. Request hits Caddy (443 → Docker port)
  2. Caddy runs forward_auth against Authentik outpost
  3. Authentik validates session cookie / issues redirect to login
  4. On success: Caddy copies X-Authentik-* headers and proxies to service

Tailscale-only services

  • Webtop remote desktop (tailscale serve :8497)
  • Internal dashboards (portal, status feeds)
  • atlas-01 SSH (blocked on public firewall, tailnet-only)

Service Layers

Tier 0 — Identity & Security

  • Authentik (auth.atlascorporation.nl) — OIDC/SSO, MFA, app proxies
  • Vaultwarden (vault.atlascorporation.nl) — end-to-end encrypted password vault
  • Caddy — automatic TLS, reverse proxy, the sole public entry point

Tier 1 — Core Business

  • Odoo 19 — CRM, invoicing, project management, contacts
  • Nextcloud 31 — file storage, DAV (calendar/contacts sync to iOS)
  • Stalwart — self-hosted email: SMTP, IMAPS, JMAP, Sieve
  • Forgejo — self-hosted git (this very repo)

Tier 2 — Finance & Operations

  • Firefly III — double-entry bookkeeping, budgets, reconciliation
  • Enable Banking — PSD2 bank feed (ING, Knab → Firefly)
  • Paperless-ngx — document management, OCR, auto-tagging
  • n8n — workflow automation (webhooks, scheduled tasks)
  • Uptime Kuma — service health monitoring with alerting

Tier 3 — AI & Intelligence

  • LiteLLM proxy — unified OpenAI-compat API to all models (local + cloud)
  • Open-WebUI — ChatGPT-style UI on top of LiteLLM
  • Atlas Brain (atlas_brain.py) — Python signal collector, runs every 15 min
  • Atlas Loop — background nudge cycle, publishes to NATS
  • Atlas Meridian — autonomous decision engine / battle responder
  • Langfuse — LLM observability: every call traced with latency, cost, tokens
  • Local model router (:8888) — OpenAI-compat router for local Ollama models

Tier 4 — Fleet & Infrastructure

  • MeshCentral — remote device access, POS terminal fleet management
  • NATS — real-time pub/sub event bus across all Tailscale devices
  • Atlas heartbeat sink — aggregates device heartbeats from the NATS mesh
  • Atlas cockpit feeds — on-disk JSON feeds consumed by the OS desktop
  • Webtop — full XFCE Linux desktop in the browser (tailnet-only)

Tier 5 — Managed Sites (11 sites)

All served via Caddy. WordPress sites run in isolated Docker stacks:

Domain Stack Notes
atlasworks.nl Docker: works-wordpress Live WooCommerce (Caddy :8111)
atlascorporation.nl Docker: corp-wordpress Corporate site
atlasagency.nl Docker: agency-wordpress Agency services
atlasacademy.nl TransIP nginx (static HTML) Academy landing
atlaspos.nl TransIP AtlasPOS product site
atlashub.nl Docker: atlashub Hub platform
bicosagency.nl Docker: bicos-wordpress Client site
budgetenergiecoach.nl Docker Client site
hkintercare.nl Docker: hkincare-wordpress Client site
jouwenergieadvies.nl Docker Client site
reclamemans.nl Docker Client site

Data Flow — Atlas Brain Cycle

Every 15 minutes (atlas-brain.service):
  ┌──────────────────────────────────────────┐
  │  Signal collection phase                 │
  │  ├── 7 IMAP mailboxes (read-only)        │
  │  ├── Odoo REST API (leads, contacts)     │
  │  ├── Enable Banking (bank transactions)  │
  │  └── atlas-01 health/fleet feeds         │
  └──────────────────┬───────────────────────┘
                     │
                     ▼
             atlas-state.json
                     │
                     ▼
         LLM synthesis (model router):
           atlas-auto (local) → Groq 70B → Claude Opus
                     │
                     ▼
         atlas-brief-spoken.json  (daily brief)
                     │
                     ▼
         Atlas OS cockpit panels (Today · Money · Inbox · Pipeline)

The AI Mesh

atlas-01 (NATS JetStream server)
    │
    ├── subjects:
    │     atlas.events.*      system events (disk, CPU, service state)
    │     atlas.heartbeat.*   device health pings
    │     atlas.jobs.*        delegated compute jobs (Ollama on NEBULA)
    │     atlas.brief.*       daily brief push to all devices
    │
    └── subscribers:
          Caddy PC (this machine)  ← atlas-events-collector
          NEBULA (HP EliteBook)    ← atlas-delegate-worker (5 Ollama models)
          MET-Desktop              ← Odoo failover + fleet monitor

Caddy SSO Pattern

Every SSO-gated service uses this Caddyfile block (see deploy/caddy/Caddyfile.template):

app.example.com {
  # Authentik outpost endpoints (must come first)
  reverse_proxy /outpost.goauthentik.io/* authentik-server:9000

  # SSO gate — redirects to login if no valid session
  forward_auth authentik-server:9000 {
    uri /outpost.goauthentik.io/auth/caddy
    copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Email
                 X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt
  }

  # Only reached after successful authentication
  reverse_proxy localhost:APP_PORT
}

Docker Compose Topology

Stack File Services
Core deploy/compose/atlas-core.yml Authentik, Nextcloud, Stalwart, Forgejo, Vaultwarden
AI deploy/compose/atlas-ai.yml LiteLLM, Open-WebUI, Langfuse
Business atlas-odoo.yml Odoo 19 + PostgreSQL
Finance atlas-finance.yml Firefly III + Paperless-ngx + Enable Banking
Fleet atlas-fleet.yml MeshCentral + NATS + Uptime Kuma
Sites Per-site compose WordPress stacks
Desktop deploy/webtop-docker-compose.yml Webtop (tailnet-only)

All stacks share the atlas-net Docker network. Caddy is the sole process with public port bindings (80/443). All internal services bind only to 127.0.0.1:PORT.