Files
ops-docs/app-inventory.md
inference-bot 2eb88f55b4 docs: infrastructure audit — app inventory, backups, CI, provider pricing, agent fleet
Audit of the operator docs against live reality (2026-11-04):
- app-inventory.md: all 19 Cloudron apps with id, fqdn and registry image pin.
  Corrects the portal path (code/member-portal, not co-op/member-portal) and the
  panel path (local/coop.inference.admin-panel, not code/admin-panel).
- maintenance/backups.md: the two backup systems; the deliberate per-user restic
  cache split and the --group-by "" retention fix, with why.
- maintenance/woodpecker-ci.md: CI server + agent, image build/pin, manual-only
  trigger, git-lfs requirement, and its current not-yet-green state (agent's
  job-collection long-poll gets HTTP 500 from the server).
- provider-pricing/: index + GreenPT, Tinfoil (local EHBP proxy architecture) and
  the Metis /v1/systemone decision-model route; regolo.md updated to record the
  gateway prices were applied.
- agent-fleet.md: steward, infrastructure-bot and socialbot (Unix users, gateway
  units, teams); member-bot tier 2 planned but not yet provisioned.
- README: file list; operator-token-runbook: correct the membership_sweep cadence
  (3x daily, not nightly); migration doc: post-migration addendum (16->19 apps,
  DNS split resolved, old box still on with apps stopped).
2026-11-04 14:46:12 +00:00

83 lines
5.9 KiB
Markdown

# Cloudron app inventory
The co-op's Cloudron server carries **19 apps**. Before 2026-11-02 it carried 16;
the three added since the migration are the docs site, the CI server and the CI
agent (marked **NEW** below).
**Source of truth:** read it from the running apps, not from memory or a sibling
deploy. `GET https://my.inference.coop/api/v1/apps` returns every app with its
`id`, `fqdn`, install state and — inside `manifest` — `dockerImage`. The app
record's own top-level `image` field is **null**; the CLI's `list` output does
not carry the image at all. The registry paths are **per-app and not uniform**
(there are three different namespaces in use — see below), and a path copied from
a remembered deploy of a *different* app points the update at a repository that
does not hold it.
*Verified against the live API 2026-11-04.*
## The 19 apps
| FQDN | App id | Label | Image (pin) | Install |
|---|---|---|---|---|
| `inference.coop` | `55f5f904-3233-44de-ad7b-5dc7c8533b75` | — | `cloudron/io.cloudron.surfer:202611021342220000` | store (Surfer — marketing site) |
| `chat.inference.coop` | `4023ccbf-d57a-4500-97df-14de9cf3516e` | AI Chat | `registry.inference.coop/co-op/librechat-custom:20261031-2a98892` | **custom** (LibreChat overlay) |
| `chat-legacy.inference.coop` | `50ae6c97-e851-4d17-b013-51ca7a4e5be0` | Legacy AI Chat | `cloudron/com.openwebui.cloudronapp:202611030420300000` | store (Open WebUI) |
| `portal.inference.coop` | `d4f05e4b-75c6-492e-9faf-7afb0712fc94` | — | `registry.inference.coop/code/member-portal:20261104-d076729` | **custom** |
| `dashboard.inference.coop` | `daf8750e-2683-4104-83ea-f77d1b4601e8` | Dashboard | `registry.inference.coop/code/member-dashboard:20261103-3453131` | **custom** |
| `panel.inference.coop` | `ae187071-7a43-4a6e-8a02-986609a66a1a` | Admin Panel | `local/coop.inference.admin-panel:0.1.0-1793634279942` | **custom** |
| `gateway.inference.coop` | `adababd4-2427-4bdd-9bf7-6bdad0302610` | LiteLLM | `registry.inference.coop/local/ai.coop.litellm:1.0.0-20261103-d6cfe78` | **custom** |
| `matrix.inference.coop` | `aa6f4597-6206-4509-b32e-c89750b2c1d8` | Matrix Chat | `cloudron/org.matrix.synapse:202611030719520000` | store (Synapse) |
| `git.inference.coop` | `c91c13aa-30ed-4af9-9599-7a87ab4f221d` | Code | `cloudron/io.gitea.cloudronapp:202611011719500000` | store (Gitea) |
| `registry.inference.coop` | `c257ba3c-6737-4375-ad51-ea19586bf3f0` | — | `cloudron/io.cloudron.container-registry:202610221511140000` | store (container registry) |
| `vault.inference.coop` | `cb838bcf-f2e2-4670-b117-dca04b0ee957` | — | `cloudron/com.github.bitwardenrs:202611020820270000` | store (Vaultwarden) |
| `forum.inference.coop` | `8b1a972c-08af-4e92-852c-d573c37b01ad` | Forum | `cloudron/org.loomio.cloudronapp:202611010321240000` | store (Loomio) |
| `newsletter.inference.coop` | `eed2217c-b165-430e-bc29-7ccfef9b11e4` | — | `cloudron/app.listmonk.cloudronapp:202610220221130000` | store (Listmonk) |
| `search.inference.coop` | `d7c73fff-ee42-4db0-98c0-4ce7a8ab35cc` | — | `cloudron/io.github.ascimoo.searx:202611012319290000` | store (SearXNG) |
| `cloud.inference.coop` | `fd261d67-b790-424f-9e82-f74883ee8585` | — | `cloudron/com.nextcloud.cloudronapp:202610211606270000` | store (Nextcloud) |
| `email.inference.coop` | `fbb256b9-ead3-41d8-bee0-d5ea87149436` | — | `cloudron/io.cloudron.mail:202610261602550000` | store (Cloudron mail UI) |
| `docs.inference.coop` | `85b7ce06-e2af-49a4-bd4f-a9c2e692e3ab` | Docs | `cloudron/io.cloudron.surfer:202611021342220000` | store (Surfer) — **NEW 2026-11-03** |
| `ci.inference.coop` | `4984f95e-0c0a-4af3-9ce1-4ca4f3e8483d` | Woodpecker | `cloudron/org.woodpecker_ci.cloudronapp:202610300219490000` | store (Woodpecker server) — **NEW 2026-11-03** |
| `ci-agent.inference.coop` | `5ac63873-cf2c-4ad9-acd6-81dc0e016c83` | — | `registry.inference.coop/co-op/woodpecker-agent:20261104-e070275` | **custom** (Woodpecker agent) — **NEW 2026-11-03** |
(`my.inference.coop` is the Cloudron dashboard hostname — the platform itself, not
an app object — so it does not appear here.)
## Registry namespaces — they are NOT uniform
Five custom apps pull from four different namespaces. Deriving one path from
another app's pattern deploys the wrong (or a missing) image:
| App | Registry path |
|---|---|
| chat (LibreChat overlay) | `registry.inference.coop/co-op/librechat-custom` |
| CI agent | `registry.inference.coop/co-op/woodpecker-agent` |
| member portal | `registry.inference.coop/code/member-portal` |
| member dashboard | `registry.inference.coop/code/member-dashboard` |
| gateway (LiteLLM) | `registry.inference.coop/local/ai.coop.litellm` |
| admin panel | `local/coop.inference.admin-panel` |
**Correcting a stale memory:** the portal is `code/member-portal` (not
`co-op/member-portal`), and the admin panel is `local/coop.inference.admin-panel`
(not `code/admin-panel`). Both were cited wrongly in earlier notes; the values
above are read from the running apps.
## Store vs custom, and what that decides
Six apps are **custom** installs (packaged by us, `appStoreId == ""`): chat,
CI agent, portal, dashboard, panel, gateway. Custom apps get **no automatic
update** (Cloudron says "not available for custom apps") — their protection is the
`manifest.dockerImage` pin, which an update deploys, so a custom app must never be
pinned to a floating tag. The rest carry a real `appStoreId` and update through
the store.
## Notes that are easy to get wrong
- **`enableAutomaticUpdate` exists on every app object and means nothing for a
custom one.** Judge update behaviour by the install SOURCE (`appStoreId`), not
by that flag.
- **Public collectives reach `co-op/*` and `code/*` repos; the only private repos
are `ops/inferencebot` and `ops/security`.**
- **`info@inference.coop` is the co-op's gateway team account** (`member:info@inference.coop`,
budget $135/30d) and also the owner account of several provider keys — see the
token runbook.