docs(selfhost): document hosted/self-host migration and decommissioning - #3291
Conversation
Covers two previously undocumented self-hosting topics: how to move a repo between the hosted managed-beta App and a self-host install (what carries over via .gittensory.yml vs. what must be re-created, since settings live in separate databases), and how to cleanly decommission a self-host instance (revoke the GitHub App, choose what happens to data volumes, the current lack of a brokered-mode revocation endpoint, and removing ADMIN_GITHUB_LOGINS access).
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
gittensory-ui | eb9b3c2 | Commit Preview URL Branch Preview URL |
Jul 05 2026, 01:03 AM |
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ Gittensory review result - manual review recommendedReview updated: 2026-07-05 01:09:24 UTC
⏸️ Suggested Action - Manual Review
Review summary Nits — 5 non-blocking
Concerns raised — review before merging
Review context
Contributor next steps
Signal definitions
🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by Gittensory, a quiet PR intelligence layer for OSS maintainers.
|
Summary
apps/gittensory-ui/src/routes/docs.maintainer-self-hosting.tsx(after the existing "How self-hosting fits with hosted docs" section). Grounded in readingsrc/selfhost/setup-wizard.tsandsrc/settings/repository-settings.ts(resolveRepositorySettings): a repo cannot be repointed between the shared hosted App and a self-host App (the wizard always mints a distinct App), settings resolve fromenv.DBwhich is a completely different database per deployment (so DB-backed settings do NOT carry over and must be re-created by hand — there is no export/import tool), while.gittensory.ymlgenuinely does carry over because it lives in the repo's own git history andresolveRepositorySettingsoverlays it identically on either side. Also documents that GitHub review-comment/check-run history is never migrated, and covers the reverse (self-host to hosted) direction the same way.apps/gittensory-ui/src/routes/docs.self-hosting-operations.tsx(after "Updating and rolling back", following the same placement pattern as PR docs(selfhost): document the real update and rollback flow #3195's update/rollback section). Covers, in order: (1) revoking the GitHub App installation — confirmed there is noinstallation/deletedwebhook handler insrc/github/webhook.tsto run first, so uninstalling on GitHub's side is sufficient; (2) what happens to the named Docker volumes vs. the./gittensory-configbind mount onstop/down/down -v(cross-checked againstdocker-compose.yml's actual volume declarations), with keep/export/delete options and a link to the backup/restore flow before anything destructive; (3) brokered-mode (ORB_ENROLLMENT_SECRET/ORB_BROKER_URL) deregistration — verified there is genuinely no revocation write path in this codebase (grepped everyUPDATE orb_enrollmentsstatement; none setsrevoked_atoutside tests), which matches the existing "Minimum broker safeguards" checklist ondocs.self-hosting-github-app.tsxthat already lists a revocation path as a missing prerequisite for public brokered rollout — documented honestly as unsupported today rather than implying a self-serve revoke exists; (4) removingADMIN_GITHUB_LOGINSaccess — confirmed viasrc/auth/security.ts'sisAuthorizedGitHubSessionLoginthat the allowlist is re-read from env on every request (never cached, never baked into a session), so editing.env+ restarting the app service is sufficient and takes effect immediately.<head>meta description to mention uninstall/decommissioning, matching PR docs(selfhost): document the real update and rollback flow #3195's precedent of updating the meta when a page's content materially expands.Scope decision: existing pages, not new ones
Both additions are sections within the two pages named in the task (
docs.maintainer-self-hosting.tsx,docs.self-hosting-operations.tsx) rather than new dedicated routes. Justification: each topic is a few hundred words that reads naturally as a subsection of an existing page a maintainer is already on (the migration content extends the page's own "how this fits with hosted" framing; decommissioning is the natural counterpart to "Updating and rolling back" on the Operations page, which a maintainer already visits for day-two operations). Neither topic is large enough on its own to justify a new route, sidebar entry, andSECTION_LINKSwiring — that would fragment two already-small topics across even more pages for a reader to discover.What this PR does NOT do (scope honesty)
Scope
type(scope): short summaryConventional Commit format.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Validation
git diff --checknpm run actionlint— not run; no workflow files touched.npm run typechecknpm run test:coverage— not applicable; onlyapps/gittensory-ui/**changed, which Codecov does not gate (docs-only, nosrc/**lines changed).npm run test:workers— not applicable; no Worker/backend code touched.npm run build:mcp/npm run test:mcp-pack— not applicable; MCP package untouched.npm run ui:openapi:check— not applicable; no API/schema changes.npm run ui:lint(requirednpm --workspace @jsonbored/gittensory-ui run formatonce to fix prettier JSX-prose wrapping, then clean)npm run ui:typechecknpm run ui:build(confirmed both changed routes' SSR bundles built:docs.maintainer-self-hosting-*.mjs,docs.self-hosting-operations-*.mjs)npm run docs:drift-checknpm audit --audit-level=moderate— not run standalone;npm cireported 0 vulnerabilities and no dependency changes are in this diff.If any required check was skipped, explain why:
apps/gittensory-ui/src/routes/. Nosrc/**,scripts/**,migrations/**, or workflow files changed, so the backend/coverage/MCP/OpenAPI/audit checks don't apply. I ran every UI-specific and root check that does apply (ui:lint,ui:typecheck,ui:build,docs:drift-check, roottypecheck), all green, plusgit diff --check.Safety
DocsPage/Callout/FeatureRow/CodeBlock/Linkprimitives, no new components or layout.CHANGELOG.mdnot touched.UI Evidence
Not applicable in the screenshot-table sense — this PR is prose-only content added to two existing docs pages using their existing components (
Callout,FeatureRow,CodeBlock, headings, lists, links), no new layout or visual styling. Verified vianpm run ui:build(green — both changed routes' SSR bundles compiled without error) andnpm run docs:drift-check(green). Did not stand up a full local preview server for this pass since thedist/servermodule path didn't resolve cleanly forvite previewin this sandboxed worktree; the build output already confirms both pages compile and the JSX structure (headings,<ol>/<ul>,Callout, links) matches the existing rendered pattern used by every other section on both pages.Notes
ADMIN_GITHUB_LOGINS,ORB_ENROLLMENT_SECRET,ORB_BROKER_URL, and the GitHub App manifest/permissions had zero prior mentions of migration or uninstall/decommission anywhere in the self-hosting docs before this PR, matching the audit's claim.src/selfhost/setup-wizard.ts,src/settings/repository-settings.ts,src/orb/relay.ts,src/orb/broker.ts,src/auth/security.ts,src/github/webhook.ts, anddocker-compose.yml's volumes section in full before writing, rather than restating.env.examplecomments verbatim.origin/mainimmediately before pushing (0 commits behind at push time).