Infrastructure Overview

Hetzner k3s cluster, Traefik ingress, cert-manager TLS, private registry, staging/prod namespaces.

Traffic flow

flowchart LR
    DNS["lomavuokraus.fi\nstaging.lomavuokraus.fi\napi.lomavuokraus.fi"] --> Traefik["Traefik ingress\n(class: traefik)"]
    User["User browser"] -->|"HTTPS"| Traefik
    CertMgr["cert-manager\nletsencrypt prod/staging"] -->|"TLS"| Traefik
    subgraph Cluster["k3s hel1 cx22 (157.180.66.64)"]
        Traefik --> Service["Service :80 -> 8080"]
        Service --> Varnish["Varnish cache\n(static + /api/images/*)"]
        Varnish --> Pod["Next.js pods (2)\n(port 3000)"]
        Pod --> DB["PostgreSQL 46.62.203.202"]
        Pod --> SMTP["smtp.lomavuokraus.fi"]
        Secret["Secret: lomavuokraus-web-secrets"]
        CM["ConfigMap: lomavuokraus-web-config"]
    end
    Registry["registry.halla-aho.net/thalla/lomavuokraus-web"] -->|"pull"| Pod
          
Mermaid renders directly in the browser; edit the graph in this file to update.

Hetzner nodes

flowchart TB
    Users["Users"] -->|"HTTPS"| K3s["Node A: k3s (hel1 cx22)\nTraefik + cert-manager"]
    subgraph HetznerCloud["Hetzner Cloud"]
        K3s
        DB["Node B: Postgres VM\n46.62.203.202"]
    end

    subgraph Prod["Prod namespace"]
        Prod1["Next.js pod #1 (prod)"]
        Prod2["Next.js pod #2 (prod)"]
    end

    subgraph Staging["Staging namespace"]
        Stg1["Next.js pod #1 (staging)"]
        Stg2["Next.js pod #2 (staging)"]
    end

    K3s --> Prod1
    K3s --> Stg1
    Prod1 --> DB
    Prod2 --> DB
    Stg1 --> DB
    Stg2 --> DB
          

Cluster & Namespaces

Registry

App Manifests

Runtime Environment