From 5f28d82a1dccd80af12d5e66cba9148dc3b47702 Mon Sep 17 00:00:00 2001
From: JSONbored <49853598+JSONbored@users.noreply.github.com>
Date: Sat, 4 Jul 2026 13:55:16 -0700
Subject: [PATCH] docs(selfhost): recommend pull vs. push relay mode, add
pull-mode smoke scenario
Completes the remaining #1825 deliverables that PR #3193's audit left
open: a written stable-ingress-vs-pull-mode recommendation, a
reproducible pull-mode smoke-test scenario alongside the existing
push-mode one, and troubleshooting guidance for a failed relay
registration in each mode.
- GitHub App and Orb doc: new "Choosing a relay mode" section makes
the existing implicit lean (pull mode for NAT/tailnet, no public
ingress needed; push mode requires a real, SSRF-validated public
origin) explicit, and expands the Brokered Orb env block to show
ORB_RELAY_MODE.
- Beta release checklist: the brokered-mode scenario now runs BOTH
relay modes, since they exercise genuinely different code paths.
- Troubleshooting: new guidance for selfhost_orb_relay_register_failed,
covering what it means and what to check per relay mode.
---
.../routes/docs.self-hosting-github-app.tsx | 34 ++++++++++++++++---
.../docs.self-hosting-release-checklist.tsx | 23 ++++++++++---
.../docs.self-hosting-troubleshooting.tsx | 28 +++++++++++++++
3 files changed, 77 insertions(+), 8 deletions(-)
diff --git a/apps/gittensory-ui/src/routes/docs.self-hosting-github-app.tsx b/apps/gittensory-ui/src/routes/docs.self-hosting-github-app.tsx
index 7e09c865d7..ba9848e071 100644
--- a/apps/gittensory-ui/src/routes/docs.self-hosting-github-app.tsx
+++ b/apps/gittensory-ui/src/routes/docs.self-hosting-github-app.tsx
@@ -189,11 +189,37 @@ GITHUB_WEBHOOK_SECRET=
+ Brokered mode still needs a way for GitHub webhook events to reach your self-host through
+ the broker. Choosing a relay mode: pull vs. push
+ ORB_RELAY_MODE picks how:
+ ORB_RELAY_MODE=pull. It needs no
+ DNS record, TLS certificate, or firewall rule of its own, and tolerates a transient broker
+ outage more gracefully (see the release checklist's known-warnings table below). Use push
+ only once you already have a stable, publicly reachable HTTPS origin for this instance — the
+ Direct App setup wizard, for instance, always requires one anyway, so an operator running
+ Direct App today has it available for brokered push mode too.
ORB_ENROLLMENT_SECRET set — the container gets tokens from the central Orb
- instead of its own App key. A working push-mode registration logs{" "}
- selfhost_orb_relay_register; a broken one is fatal for push mode (logged at{" "}
- error, not warn).
+ instead of its own App key. Relay mode changes what "working" means: push mode (
+ ORB_RELAY_MODE unset, the default) needs a real public{" "}
+ PUBLIC_API_ORIGIN and a failed registration is release-blocking (logged at{" "}
+ error); pull mode (ORB_RELAY_MODE=pull) needs no inbound endpoint
+ at all and tolerates a failed registration (logged at warn) since the drain
+ loop keeps retrying regardless. Run BOTH scenarios — they exercise genuinely different code
+ paths, not just different env (see{" "}
+ choosing a relay mode).
+ selfhost_orb_relay_register_failed means the container could not announce
+ itself to the broker at boot. What it means depends on ORB_RELAY_MODE (see{" "}
+ choosing a relay mode):
+
error and{" "}
+ release-blocking: the container looks healthy but never receives an
+ event, since there is no fallback delivery path. Check that PUBLIC_API_ORIGIN{" "}
+ is a real, internet-reachable, TLS-terminated URL — the broker rejects a loopback or
+ private address at registration time, so a misconfigured or unreachable origin fails here
+ every time, not intermittently.
+ warn and non-fatal: the drain loop (
+ gittensory_orb_relay_drains_total) keeps retrying on its own schedule
+ regardless, so a transient failure here recovers on its own once the broker is reachable
+ again. A registration failure that never clears across many retries still points at{" "}
+ ORB_ENROLLMENT_SECRET being wrong, revoked, or not yet provisioned
+ server-side.
+
+ Either mode: confirm ORB_BROKER_URL is reachable from inside the container
+ first — a broker that is down or unreachable produces the same registration-failed event
+ regardless of relay mode or credential correctness.
+