Skip to content

Hand over edge to the estate path #662

Closed

Description

@ExtraToast

Parent

Rewrite the spec and the compiler in place, release 1.0.0, and hand over every Project

What to build

The edge Project leaves fleet-infra and is delivered from the estate repository, in the order #381 sets.

Add external-dns to the estate's edge file. The proxies move from ingress-system and ingress-lan-system to edge-system; they are stateless, but each load-balancer address must pass from the old Service to the new one in an order the runbook sets. The estate's Platform document carries the tier ingress classes and the acme account.

The estate-side changes are recorded in the estate repository's HANDOVER.md.

Acceptance criteria

  • The render's diff against the Project's hand-written objects in fleet-infra is clean, or each difference is explained.
  • The Project's Reconcile Units report Ready.
  • A consumer-visible value checks out: Every public route answers over TLS, and every LAN route answers.
  • One change flips the handover ledger entry and deletes the hand-written objects, the descriptor and the drift-check entry.

Blocked by

Activity

  1. added
    type: choreMaintenance work without intended behavior change.
    area: platformPlatform, deployment, cluster, or runtime concern.
    priority: P1High; important and should be handled in the current iteration.
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 27, 2026
  2. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Resume here

    Before this handover, the maintainer writes CF_DNS_API_TOKEN at secret/data/platform/cloudflare: JorisJonkers-dev/estate#229.

  3. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    #380 is closed: delivery, _canary and _estate are on the 1.0 contract (evidence in #380 (comment)).

  4. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    Prepared: the edge handover, as drafts (2026-10-29)

    Nothing is merged and nothing live was written. The runbook is docs/runbooks/edge-handover.md in the estate PR.

    Pull requests, in merge order

    # PR when what
    1 JorisJonkers-dev/fleet-infra#555 any time before the window the five default-deny policies fleet-infra applies (hermes, hindsight, immich, karakeep, overleaf) also admit edge-system's traefik-public / traefik-lan; without it those five answer 503 after the passes
    2 JorisJonkers-dev/fleet-infra#556 before node's handover (#659) and before #557; proposed in utility's window right after fleet-infra#551 pool lan-edge (.99/32, autoAssign: false), enschede-lan gives .99 up, the old traefik-lan Service asks for .99 by address. Its own short .99 gap; conflicts trivially with #551 in config.yaml
    3 JorisJonkers-dev/fleet-infra#557 window step 1 orphan: prune: disabled on 54 objects, the three HelmReleases suspended, apps-edge prune: false
    4 JorisJonkers-dev/fleet-infra#558 window step 2 removal: external-dns and both Traefiks leave apps-core; the edge-system Namespace and forward-auth Middleware stop being applied (the render owns both names); apps-edge becomes apps-edge-legacy, freeing the name the estate unit takes
    5 JorisJonkers-dev/estate#257 window step 3, the flip ledger edge → estate; external-dns in the edge file; api on both proxies and external-dns, admitted in apiAccess.holders; dns.direct: 167.86.79.203; the runbook and the render-vs-live diff

    Then, in the window: the two address passes (proposal: LAN .99 first, then the public host ports), and after the flip a fleet-infra cleanup and the hand deletions the runbook lists.

    Issues filed

    Open blockers and decisions

    • The handovers before this one, node above all (it renders lan-edge and the speaker).
    • The address order and window (proposal, for the maintainer): LAN .99 first (a few seconds, LAN only; the new LAN proxy can be checked by port-forward before it takes traffic), then the public host ports on frankfurt-contabo-1 (15–60 s, every public host), minutes apart in one ~45-minute window at a quiet hour. Both in one window because the estate's apps-edge waits on the public proxy, which stays Pending until the old one frees the ports.
    • cert-manager: proposed to stay on the old path after the flip, with its ClusterIssuer, the wildcard and the default TLS store, until A tier that serves TLS but issues no certificate has no certificate source #726 is decided. This changes the runbook's "cert-manager retires with the edge".
    • Routes no Project renders: jellyfin, jellyseerr, qbittorrent, prowlarr, sonarr, radarr, bazarr (public and LAN), immich-lan, the Traefik dashboard. Proposed to stay in apps-edge-legacy, served by the new proxies. Their Projects declare no exposure; jellyfin also needs A public host served by another tier's edge has no declaration #711.
    • Lost at the flip, not modelled: the Traefik dashboard (api@internal), the proxies' OTLP traces, three access-log headers, Traefik's router metric labels.
    • To check live: estate-dashboard and findability-explorer under the rendered security-headers-strict CSP (default-src 'self'); every rendered route gains X-Frame-Options: DENY and HSTS.
  5. ExtraToast commented on Nov 1, 2026

    @ExtraToast
    ContributorAuthor

    Edge is on the estate path (estate 0.37.1), and the old path's edge is deleted, cert-manager with it.

    Follow-ups: every host serves the wildcard from secret/data/platform/tls/jorisjonkers-dev, valid until 2026-12-16, which nothing renews yet (JorisJonkers-dev/estate#292, renew by 2026-12-01). The public tier's resolver has issued no per-host certificate yet, so it may skip hosts the default store's wildcard already covers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: platformPlatform, deployment, cluster, or runtime concern.priority: P1High; important and should be handled in the current iteration.status: blockedCannot move forward until an external dependency is resolved.type: choreMaintenance work without intended behavior change.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions