feat: add GoAlert Cloudron package (Monitoring) [#633]

Official-image wrapper of goalert/goalert 0.34.1 (digest-pinned),
single Go binary + postgresql only. Native generic OIDC wired from
the platform provider (GOALERT_OIDC_*), data-encryption key
persisted, optional first-admin basic auth. grind-stack verified:
full migration chain, serving, origin canonicalization correct.
18th package; category table reconciled to the 46-app set.
This commit is contained in:
2026-09-06 18:47:20 -05:00
parent 5ba4078133
commit b9bc032d2b
10 changed files with 269 additions and 27 deletions
+52
View File
@@ -1367,6 +1367,58 @@ landed mid-flight) + verification hardening follow-up
--- ---
### 18. GoAlert (Monitoring) ✅
**Date**: 2026-09-06
**Application**: GoAlert — Target's open-source on-call alerting
(escalation chains, rotations, Slack/Twilio notifications, heartbeats,
status dashboards). Upstream: https://github.com/target/goalert
(Apache-2.0), v0.34.1. The cleanest Cloudron shape in the workspace: a
single Go binary, PostgreSQL as the only store, migrations automatic.
**Ticket**: [#633](https://projects.knownelement.com/issues/633)
**Pattern**: official-image wrapper of `goalert/goalert:0.34.1`
(amd64-manifest digest pinned; alpine + `apk add bash` for the
/dev/tcp wait loop, same as ChirpStack).
**Auth gate verdict**: ✅ OIDC preferred. Generic OIDC is first-class in
core (config.go OIDC struct on go-oidc, any issuer):
`GOALERT_OIDC_{ENABLE,ISSUER_URL,CLIENT_ID,CLIENT_SECRET,NEWUSERS}`
wired from `CLOUDRON_OIDC_*`. Callback:
`/api/v2/identity/providers/oidc/callback` (verified in
auth/handler.go:271,392 + oidc provider appends `/callback`).
GitHub OAuth + basic auth also exist; start.sh exposes optional
first-admin basic auth via `GOALERT_ADMIN_USER/PASS` app env vars.
**Key decisions**:
- `GOALERT_DB_URL` built from the postgresql addon env (sslmode=disable
— the addon is on the platform network).
- `GOALERT_DATA_ENCRYPTION_KEY` persisted under /app/data (rotating it
loses encrypted notification-provider credentials).
- `GOALERT_PUBLIC_URL` ← `CLOUDRON_APP_ORIGIN`: GoAlert canonicalizes
every request to the https origin — behind Cloudron's TLS proxy that
is exactly right; during local verification every path 307s to the
origin (expected, not a loop).
- Observed under the CPUWeight-25 batch slice: `slow cycle finished`
engine warnings (~5s cycles vs the 5s threshold) — contention
artifact, not a package defect; note for live sizing.
**Verification** (grind-stack, ephemeral postgres): build green
(small image — single binary); boot = PG wait → key generation → full
migration chain applied → serving 307→https origin on :8081; container
stable 5+ min under load.
**Files Created**: Dockerfile, CloudronManifest.json (port 8081,
localstorage + postgresql, 1024MB, healthCheckPath /api/v2/heartbeat),
start.sh, README.md (auth table + admin bootstrap), CHANGELOG.md,
.dockerignore, logo.png (Target org avatar — repo embeds its frontend,
no logo file ships).
**Commit**: `feat: add GoAlert Cloudron package (Monitoring) [#633]`
---
## Packaging Pattern: Download Pre-Compiled Binaries ## Packaging Pattern: Download Pre-Compiled Binaries
### When to Use ### When to Use
@@ -0,0 +1 @@
repo
@@ -0,0 +1,12 @@
# Changelog — GoAlert Cloudron Package
## 1.0.0 — 2026-09-06
- Initial package: GoAlert 0.34.1 (official-image wrapper, digest-pinned
sha256:36b3962e…)
- postgresql + localstorage addons; web/API on :8081; bash added for the
addon wait loop
- GOALERT_DB_URL/PUBLIC_URL mapped from the platform env; data-encryption
key persisted under /app/data
- Native OIDC wired from the platform provider, new-user creation on;
optional first-admin basic auth via GOALERT_ADMIN_USER/PASS env vars
@@ -0,0 +1,22 @@
{
"manifestVersion": 2,
"type": "app",
"id": "io.cloudron.goalert",
"title": "GoAlert",
"description": "Open-source on-call and alerting system by Target: escalation chains, rotation schedules, notification rules (Slack, Twilio SMS/voice, and more), heartbeat checks, and status dashboards. Single Go service with PostgreSQL storage; schema migrations run automatically on start. SSO via the Cloudron OIDC provider; optional basic-auth bootstrap for the first admin.",
"author": "Target Corporation / GoAlert contributors",
"website": "https://goalert.io/",
"contactEmail": "cloudron@tsys.dev",
"tagline": "On-call scheduling, escalations and alert routing",
"version": "0.34.1",
"healthCheckPath": "/api/v2/heartbeat",
"httpPort": 8081,
"memoryLimit": 1024,
"addons": {
"localstorage": {},
"postgresql": {}
},
"mediaLinks": [],
"changelog": "Initial Cloudron package for GoAlert 0.34.1 (official-image wrapper of goalert/goalert, digest pinned). start.sh waits for the postgresql addon, persists the data-encryption key under /app/data, maps GOALERT_DB_URL/PUBLIC_URL from the platform env, and wires native generic OIDC (GOALERT_OIDC_*) from the Cloudron OIDC provider with new-user creation enabled. Optional first-admin via GOALERT_ADMIN_USER/PASS app env vars (basic auth).",
"icon": "file://logo.png"
}
@@ -0,0 +1,35 @@
# GoAlert Cloudron Package
#
# GoAlert is Target's open-source on-call alerting system: escalation
# chains, schedules/rotations, notification rules (SMS/phone via
# Twilio/VictorOps etc., Slack), heartbeat checks, status dashboards —
# a single Go binary serving web UI + REST API on :8081 with
# PostgreSQL as the only backing store.
#
# Upstream: https://github.com/target/goalert (Apache-2.0), v0.34.1.
# - Official image goalert/goalert (alpine, /usr/bin/goalert, runs a
# build-time self-test). DB schema migrations run automatically at
# startup; no separate worker/scheduler processes.
# - Configuration is envconfig-style: GOALERT_<SECTION>_<FIELD>
# (GOALERT_DB_URL, GOALERT_PUBLIC_URL, GOALERT_OIDC_*, ...).
#
# Authentication: NATIVE OIDC (preferred). Generic OpenID Connect in
# core (config/config.go OIDC struct; go-oidc against any issuer):
# start.sh wires GOALERT_OIDC_ENABLE/ISSUER_URL/CLIENT_ID/CLIENT_SECRET
# from the Cloudron platform provider (CLOUDRON_OIDC_*), with
# new-user creation enabled. GitHub OAuth and basic-auth also exist.
#
# Pattern: official-image wrapper. Image pinned by tag AND digest
# (amd64 manifest digest of v0.34.1 from docker manifest inspect).
FROM goalert/goalert:v0.34.1@sha256:36b3962e3171de7ba6b964bcba21a9fee3fe331dc01d9716ee8bbd7bc01ba935
# bash for start.sh (alpine's ash lacks /dev/tcp used by the addon wait)
USER root
RUN apk add --no-cache bash
COPY start.sh /app/start.sh
# web UI + REST API; notifications are all outbound (no extra listeners)
EXPOSE 8081
ENTRYPOINT ["/bin/bash", "/app/start.sh"]
@@ -0,0 +1,44 @@
# GoAlert — Cloudron Package
[GoAlert](https://github.com/target/goalert) v0.34.1 — Target's open-source
on-call alerting: escalation chains, schedules and rotations, notification
rules (Slack, Twilio SMS/voice, VictorOps, ...), heartbeats, status
dashboards. A **single Go binary** with PostgreSQL as its only store —
packaged as an official-image wrapper around `goalert/goalert`
(digest-pinned), the cleanest Cloudron shape in this workspace.
## Authentication (auth gate: ✅ OIDC preferred)
Generic OpenID Connect is first-class in core (`config/config.go` OIDC
struct on go-oidc — any compliant issuer). `start.sh` wires it from the
Cloudron platform provider:
| GoAlert env | Source |
|-------------|--------|
| `GOALERT_OIDC_ENABLE=true` | fixed |
| `GOALERT_OIDC_ISSUER_URL` | `CLOUDRON_OIDC_ISSUER` |
| `GOALERT_OIDC_CLIENT_ID` | `CLOUDRON_OIDC_CLIENT_ID` |
| `GOALERT_OIDC_CLIENT_SECRET` | `CLOUDRON_OIDC_CLIENT_SECRET` |
| `GOALERT_OIDC_NEWUSERS=true` | overridable (`GOALERT_OIDC_NEWUSERS`) |
- SSO redirect: `https://<app-domain>/api/v2/identity/providers/oidc/callback`
- OIDC-registered users are created **without** privileges. First admin:
set `GOALERT_ADMIN_USER` + `GOALERT_ADMIN_PASS` app env vars once —
start.sh exposes them as basic auth — log in, promote your SSO account,
then unset them (README + `.env.example`).
## Runtime layout
| Concern | How |
|---------|-----|
| Database | Cloudron `postgresql` addon; migrations run automatically at startup |
| Encryption key | `GOALERT_DATA_ENCRYPTION_KEY` generated once, persisted in `/app/data` (rotating loses provider credentials) |
| Public URL | `GOALERT_PUBLIC_URL``CLOUDRON_APP_ORIGIN` |
| Notifications | All outbound (Slack/Twilio/webhooks) — no inbound ports beyond 8081 |
| Storage | `/app/data` (localstorage) — key + future runtime files |
## Notes
- Version upgrades: bump tag+digest in the Dockerfile, rebuild —
migrations run on first boot.
- Package pattern + verification: repo `JOURNAL.md`, GoAlert section.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

+73
View File
@@ -0,0 +1,73 @@
#!/bin/bash
set -euo pipefail
# GoAlert runtime setup for Cloudron:
# 1. wait for the postgresql addon (GoAlert's startup runs migrations
# itself, but gives up quickly if the DB is slow to accept - the
# /dev/tcp wait removes that race)
# 2. persist GOALERT_DATA_ENCRYPTION_KEY (rotating it loses encrypted
# notification-provider credentials)
# 3. map the Cloudron addon + platform env onto GOALERT_* vars
# 4. exec /usr/bin/goalert (migrations + web/API on :8081)
#
# Authentication: OIDC via the Cloudron platform provider. OIDC users
# are created on first login (NewUsers=true); they arrive WITHOUT
# admin rights - an admin logs in once with basic auth (GOALERT_BASIC_AUTH
# below, set only when the operator provides GOALERT_ADMIN_USER/PASS env)
# or via OIDC and is promoted from the admin panel.
DATA_DIR="/app/data"
KEY_FILE="${DATA_DIR}/.data_encryption_key"
mkdir -p "${DATA_DIR}"
# --- 1. wait for the addon -------------------------------------------------------
wait_tcp() {
local host="$1" port="$2" name="$3"
echo "Waiting for ${name} at ${host}:${port} ..."
until (exec 3<>"/dev/tcp/${host}/${port}") 2>/dev/null; do
echo "${name} is unavailable - sleeping"
sleep 2
done
echo "${name} is up"
}
DB_HOST="${CLOUDRON_POSTGRESQL_HOST:-127.0.0.1}"
DB_PORT="${CLOUDRON_POSTGRESQL_PORT:-5432}"
DB_NAME="${CLOUDRON_POSTGRESQL_DATABASE:-goalert}"
DB_USER="${CLOUDRON_POSTGRESQL_USERNAME:-goalert}"
DB_PASS="${CLOUDRON_POSTGRESQL_PASSWORD:-}"
wait_tcp "${DB_HOST}" "${DB_PORT}" "PostgreSQL"
# --- 2. persistent data-encryption key -------------------------------------------
if [[ ! -s "${KEY_FILE}" ]]; then
( umask 077; head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n' > "${KEY_FILE}" )
echo "Generated new data encryption key"
fi
# --- 3. Cloudron -> GOALERT_* environment ----------------------------------------
export GOALERT_DB_URL="postgres://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable"
export GOALERT_PUBLIC_URL="${CLOUDRON_APP_ORIGIN:-http://localhost}"
export GOALERT_DATA_ENCRYPTION_KEY="$(cat "${KEY_FILE}")"
export GOALERT_LISTEN=":8081"
# optional admin bootstrap: when GOALERT_ADMIN_USER/GOALERT_ADMIN_PASS
# are set as app env vars, basic auth allows the first admin login
# (promote/deactivate the account after SSO users exist)
if [[ -n "${GOALERT_ADMIN_USER:-}" && -n "${GOALERT_ADMIN_PASS:-}" ]]; then
export GOALERT_BASIC_AUTH="${GOALERT_ADMIN_USER}:${GOALERT_ADMIN_PASS}"
else
unset GOALERT_BASIC_AUTH || true
fi
# platform OIDC provider -> goalert oidc config
export GOALERT_OIDC_ENABLE="${GOALERT_OIDC_ENABLE:-true}"
export GOALERT_OIDC_ISSUER_URL="${CLOUDRON_OIDC_ISSUER:-}"
export GOALERT_OIDC_CLIENT_ID="${CLOUDRON_OIDC_CLIENT_ID:-}"
export GOALERT_OIDC_CLIENT_SECRET="${CLOUDRON_OIDC_CLIENT_SECRET:-}"
export GOALERT_OIDC_NEWUSERS="${GOALERT_OIDC_NEWUSERS:-true}"
export GOALERT_OIDC_OVERRIDE_NAME="${GOALERT_OIDC_OVERRIDE_NAME:-Cloudron}"
echo "Starting GoAlert (migrations run automatically) ..."
exec /usr/bin/goalert
+8 -7
View File
@@ -9,9 +9,9 @@ The Cloudron component focuses on packaging upstream free/libre/open application
### 📊 Current Progress ### 📊 Current Progress
- **Total Applications**: 46 (see [GitUrlList.txt](GitUrlList.txt); pruned 2026-09-06 by human rulings: no-Node policy, k8s redirects, out-of-scope) - **Total Applications**: 46 (see [GitUrlList.txt](GitUrlList.txt); pruned 2026-09-06 by human rulings: no-Node policy, k8s redirects, out-of-scope)
- **Completed Packages**: 17/~57 (~30%) - **Completed Packages**: 18/46 (~39% of the post-ruling set)
- **Packaging Templates**: Created ✅ - **Packaging Templates**: Created ✅
- **Packages Committed & Pushed**: 17 - **Packages Committed & Pushed**: 18
- **Build Tickets**: rulings synced 2026-09-06 (#633-#678 batch, umbrella - **Build Tickets**: rulings synced 2026-09-06 (#633-#678 batch, umbrella
[#632](https://projects.knownelement.com/issues/632), Redmine project 55); [#632](https://projects.knownelement.com/issues/632), Redmine project 55);
grist-core excluded (packaged upstream) grist-core excluded (packaged upstream)
@@ -39,6 +39,7 @@ The Cloudron component focuses on packaging upstream free/libre/open application
| 15 | eLabFTW | Business-Apps | ~209MB (compressed) | 443 | localstorage, mysql, ldap | ✅ Committed | | 15 | eLabFTW | Business-Apps | ~209MB (compressed) | 443 | localstorage, mysql, ldap | ✅ Committed |
| 16 | NetBox | Infrastructure | ~1GB | 8080 | localstorage, postgresql, redis | ✅ Committed | | 16 | NetBox | Infrastructure | ~1GB | 8080 | localstorage, postgresql, redis | ✅ Committed |
| 17 | ConsulDemocracy | Collaboration | ~1.6GB | 3000 | localstorage, postgresql | ✅ Committed | | 17 | ConsulDemocracy | Collaboration | ~1.6GB | 3000 | localstorage, postgresql | ✅ Committed |
| 18 | GoAlert | Monitoring | ~40MB | 8081 | localstorage, postgresql | ✅ Committed |
### 📦 Packages in Development ### 📦 Packages in Development
@@ -113,7 +114,7 @@ Applications are organized by function rather than programming language:
| Application Name | Repository | Description | Functional Category | Package Status | | Application Name | Repository | Description | Functional Category | Package Status |
|---|---|---|---|---| |---|---|---|---|---|
| [GoAlert](https://github.com/target/goalert) | [GitHub](https://github.com/target/goalert) | On-call scheduling, escalation, and alerting platform | Monitoring | | [GoAlert](https://github.com/target/goalert) | [GitHub](https://github.com/target/goalert) | On-call scheduling, escalation, and alerting platform | Monitoring | ✅ Packaged |
| [Tirreno](https://github.com/tirrenotechnologies/tirreno) | [GitHub](https://github.com/tirrenotechnologies/tirreno) | Security and threat intelligence platform | Security | | [Tirreno](https://github.com/tirrenotechnologies/tirreno) | [GitHub](https://github.com/tirrenotechnologies/tirreno) | Security and threat intelligence platform | Security |
| [Runme](https://github.com/runmedev/runme) | [GitHub](https://github.com/runmedev/runme) | Execute your README.md as interactive scripts | Automation | | [Runme](https://github.com/runmedev/runme) | [GitHub](https://github.com/runmedev/runme) | Execute your README.md as interactive scripts | Automation |
| [DataHub](https://github.com/datahub-project/datahub) | [GitHub](https://github.com/datahub-project/datahub) | Modern data stack for end-to-end data management | Data-Management | | [DataHub](https://github.com/datahub-project/datahub) | [GitHub](https://github.com/datahub-project/datahub) | Modern data stack for end-to-end data management | Data-Management |
@@ -131,11 +132,11 @@ Applications are organized by function rather than programming language:
| [Grist Core](https://github.com/gristlabs/grist-core) | [GitHub](https://github.com/gristlabs/grist-core) | Modern data spreadsheet and database | Collaboration | ⏭ Excluded — packaged upstream (Cloudron App Store) | | [Grist Core](https://github.com/gristlabs/grist-core) | [GitHub](https://github.com/gristlabs/grist-core) | Modern data spreadsheet and database | Collaboration | ⏭ Excluded — packaged upstream (Cloudron App Store) |
| [Healthchecks](https://github.com/healthchecks/healthchecks) | [GitHub](https://github.com/healthchecks/healthchecks) | Cron job monitoring service | Monitoring | ✅ Packaged | | [Healthchecks](https://github.com/healthchecks/healthchecks) | [GitHub](https://github.com/healthchecks/healthchecks) | Cron job monitoring service | Monitoring | ✅ Packaged |
| [Fleet](https://github.com/fleetdm/fleet) | [GitHub](https://github.com/fleetdm/fleet) | Device management and monitoring | Monitoring | | [Fleet](https://github.com/fleetdm/fleet) | [GitHub](https://github.com/fleetdm/fleet) | Device management and monitoring | Monitoring |
| [NetBox](https://github.com/netbox-community/netbox) | [GitHub](https://github.com/netbox-community/netbox) | IP address management (IPAM) and data center infrastructure management | Infrastructure | | [NetBox](https://github.com/netbox-community/netbox) | [GitHub](https://github.com/netbox-community/netbox) | IP address management (IPAM) and data center infrastructure management | Infrastructure | ✅ Packaged
| [SeaTunnel](https://github.com/apache/seatunnel) | [GitHub](https://github.com/apache/seatunnel) | Data integration and streaming platform | Data-Management | | [SeaTunnel](https://github.com/apache/seatunnel) | [GitHub](https://github.com/apache/seatunnel) | Data integration and streaming platform | Data-Management |
| [Rathole](https://github.com/rapiz1/rathole) | [GitHub](https://github.com/rapiz1/rathole) | Lightweight and high-performance reverse proxy | Infrastructure | ✅ Packaged | | [Rathole](https://github.com/rapiz1/rathole) | [GitHub](https://github.com/rapiz1/rathole) | Lightweight and high-performance reverse proxy | Infrastructure | ✅ Packaged |
| [Easy-Gate](https://github.com/wiredlush/easy-gate) | [GitHub](https://github.com/wiredlush/easy-gate) | Gateway and proxy solution | Infrastructure | ✅ Packaged | | [Easy-Gate](https://github.com/wiredlush/easy-gate) | [GitHub](https://github.com/wiredlush/easy-gate) | Gateway and proxy solution | Infrastructure | ✅ Packaged |
| [ConsulDemocracy](https://github.com/consuldemocracy/consuldemocracy) | [GitHub](https://github.com/consuldemocracy/consuldemocracy) | Open-source citizen participation platform | Collaboration | | [ConsulDemocracy](https://github.com/consuldemocracy/consuldemocracy) | [GitHub](https://github.com/consuldemocracy/consuldemocracy) | Open-source citizen participation platform | Collaboration | ✅ Packaged
| [BOINC](https://github.com/BOINC/boinc) | [GitHub](https://github.com/BOINC/boinc) | Open-source software for volunteer computing | Scientific-Computing | | [BOINC](https://github.com/BOINC/boinc) | [GitHub](https://github.com/BOINC/boinc) | Open-source software for volunteer computing | Scientific-Computing |
| [Slurm](https://github.com/SchedMD/slurm) | [GitHub](https://github.com/SchedMD/slurm) | Workload manager and job scheduling system | System-Administration | | [Slurm](https://github.com/SchedMD/slurm) | [GitHub](https://github.com/SchedMD/slurm) | Workload manager and job scheduling system | System-Administration |
| [Gophish](https://github.com/gophish/gophish) | [GitHub](https://github.com/gophish/gophish) | Open-source phishing toolkit | Security | | [Gophish](https://github.com/gophish/gophish) | [GitHub](https://github.com/gophish/gophish) | Open-source phishing toolkit | Security |
@@ -149,14 +150,14 @@ Applications are organized by function rather than programming language:
| [SigNoz](https://github.com/SigNoz/signoz) | [GitHub](https://github.com/SigNoz/signoz) | Open-source observability platform | Monitoring | | [SigNoz](https://github.com/SigNoz/signoz) | [GitHub](https://github.com/SigNoz/signoz) | Open-source observability platform | Monitoring |
| [Sentry](https://github.com/getsentry/sentry) | [GitHub](https://github.com/getsentry/sentry) | Error tracking and performance monitoring | Monitoring | | [Sentry](https://github.com/getsentry/sentry) | [GitHub](https://github.com/getsentry/sentry) | Error tracking and performance monitoring | Monitoring |
| [ChirpStack](https://github.com/chirpstack/chirpstack) | [GitHub](https://github.com/chirpstack/chirpstack) | Open-source LoRaWAN network server | Infrastructure | ✅ Packaged | | [ChirpStack](https://github.com/chirpstack/chirpstack) | [GitHub](https://github.com/chirpstack/chirpstack) | Open-source LoRaWAN network server | Infrastructure | ✅ Packaged |
| [eLabFTW](https://github.com/elabftw/elabftw) | [GitHub](https://github.com/elabftw/elabftw) | Electronic lab notebook for research teams | Business-Apps | | [eLabFTW](https://github.com/elabftw/elabftw) | [GitHub](https://github.com/elabftw/elabftw) | Electronic lab notebook for research teams | Business-Apps | ✅ Packaged
| [Jamovi](https://github.com/jamovi/jamovi) | [GitHub](https://github.com/jamovi/jamovi) | Statistical spreadsheet software | Scientific-Computing | | [Jamovi](https://github.com/jamovi/jamovi) | [GitHub](https://github.com/jamovi/jamovi) | Statistical spreadsheet software | Scientific-Computing |
| [Review Board](https://github.com/reviewboard/reviewboard) | [GitHub](https://github.com/reviewboard/reviewboard) | Code review and collaboration tool | Development | ✅ Packaged | | [Review Board](https://github.com/reviewboard/reviewboard) | [GitHub](https://github.com/reviewboard/reviewboard) | Code review and collaboration tool | Development | ✅ Packaged |
| [Core](https://github.com/Resgrid/Core) | [GitHub](https://github.com/Resgrid/Core) | Emergency management and incident response system | Project-Management | | [Core](https://github.com/Resgrid/Core) | [GitHub](https://github.com/Resgrid/Core) | Emergency management and incident response system | Project-Management |
| [SDRangel](https://github.com/f4exb/sdrangel) | [GitHub](https://github.com/f4exb/sdrangel) | Software defined radio application | Infrastructure | | [SDRangel](https://github.com/f4exb/sdrangel) | [GitHub](https://github.com/f4exb/sdrangel) | Software defined radio application | Infrastructure |
| [No-Code Architects Toolkit](https://github.com/stephengpope/no-code-architects-toolkit) | [GitHub](https://github.com/stephengpope/no-code-architects-toolkit) | No-code development toolkit | Low-Code | | [No-Code Architects Toolkit](https://github.com/stephengpope/no-code-architects-toolkit) | [GitHub](https://github.com/stephengpope/no-code-architects-toolkit) | No-code development toolkit | Low-Code |
| [Windmill](https://github.com/windmill-labs/windmill) | [GitHub](https://github.com/windmill-labs/windmill) | Open-source workflow automation platform | Automation | ✅ Packaged | | [Windmill](https://github.com/windmill-labs/windmill) | [GitHub](https://github.com/windmill-labs/windmill) | Open-source workflow automation platform | Automation | ✅ Packaged |
| [Corteza](https://github.com/cortezaproject/corteza) | [GitHub](https://github.com/cortezaproject/corteza) | Open-source low-code platform | Low-Code | | [Corteza](https://github.com/cortezaproject/corteza) | [GitHub](https://github.com/cortezaproject/corteza) | Open-source low-code platform | Low-Code | ✅ Packaged
| [Security Awareness Training](https://github.com/security-companion/security-awareness-training) | [GitHub](https://github.com/security-companion/security-awareness-training) | Security awareness training platform | Security | | [Security Awareness Training](https://github.com/security-companion/security-awareness-training) | [GitHub](https://github.com/security-companion/security-awareness-training) | Security awareness training platform | Security |
| [Puter](https://github.com/HeyPuter/puter) | [GitHub](https://github.com/HeyPuter/puter) | The Internet OS - Personal Cloud Computer | Development | ✅ Packaged | | [Puter](https://github.com/HeyPuter/puter) | [GitHub](https://github.com/HeyPuter/puter) | The Internet OS - Personal Cloud Computer | Development | ✅ Packaged |
+22 -20
View File
@@ -3,7 +3,8 @@
> **Human read-only. Agents maintain this file automatically after each work > **Human read-only. Agents maintain this file automatically after each work
> session.** Do not edit by hand — the next agent run will overwrite it. > session.** Do not edit by hand — the next agent run will overwrite it.
> >
> **Last updated:** 2026-09-06 by ZCode (GLM-5.3) — ConsulDemocracy packaged (17th; verified via grind lifecycle) > **Last updated:** 2026-09-06 by ZCode (GLM-5.3) — GoAlert packaged (18th; rulings synced:
> GitUrlList 56→46, no-Node policy live)
> (#648, Infrastructure, 16th package); auth gate verdict: native OIDC via > (#648, Infrastructure, 16th package); auth gate verdict: native OIDC via
> python-social-auth (OpenIdConnectAuth + SOCIAL_AUTH_OIDC_*) wired to the > python-social-auth (OpenIdConnectAuth + SOCIAL_AUTH_OIDC_*) wired to the
> platform provider; official-image wrapper of netboxcommunity/netbox > platform provider; official-image wrapper of netboxcommunity/netbox
@@ -13,14 +14,14 @@
## Current State: STABLE (packaging phase, ongoing) ## Current State: STABLE (packaging phase, ongoing)
Cloudron packaging pipeline is operational. 17 of ~57 upstream applications are Cloudron packaging pipeline is operational. 18 of 46 remaining-set applications are
packaged, committed, and pushed. Packaging templates exist for the core packaged, committed, and pushed. Packaging templates exist for the core
patterns. The gardening protocol (this file + AGENTS.md) keeps docs in sync. patterns. The gardening protocol (this file + AGENTS.md) keeps docs in sync.
All remaining apps now carry build tickets (#633-#678) under umbrella All remaining apps now carry build tickets (#633-#678) under umbrella
[#632](https://projects.knownelement.com/issues/632) in Redmine project 55 — [#632](https://projects.knownelement.com/issues/632) in Redmine project 55 —
ready for the sequential grind-driver pattern. ready for the sequential grind-driver pattern.
## Completed Packages (17) ## Completed Packages (18)
| # | Application | Category | Pattern | Port(s) | Addons | | # | Application | Category | Pattern | Port(s) | Addons |
|---|-------------|----------|---------|---------|--------| |---|-------------|----------|---------|---------|--------|
@@ -56,7 +57,7 @@ GitUrlList pruned 56 → 46 accordingly.
| Ticket | App | Category | Flavor | | Ticket | App | Category | Flavor |
|--------|-----|----------|--------| |--------|-----|----------|--------|
| #633 | GoAlert | Monitoring | GO: verify passed 2026-09-06, commit landing next | | #633 | GoAlert | Monitoring | DONE 2026-09-06 (18th package, grind-verified) |
| #634 | Tirreno | Security | build (already live on Cloudron — verify packaging need) | | #634 | Tirreno | Security | build (already live on Cloudron — verify packaging need) |
| #635 | Runme | Automation | pending service-story ruling (Go CLI runner, NOT node) | | #635 | Runme | Automation | pending service-story ruling (Go CLI runner, NOT node) |
| #636 | DataHub | Data-Management | build (heavy; disposition risk) | | #636 | DataHub | Data-Management | build (heavy; disposition risk) |
@@ -105,27 +106,27 @@ Full write-ups of each pattern + challenges are in [`JOURNAL.md`](JOURNAL.md).
## Progress by Category ## Progress by Category
| Category | Apps | Packaged | Notes |
| Category | Apps | Packaged | Notes | | Category | Apps | Packaged | Notes |
|----------|------|----------|-------| |----------|------|----------|-------|
| **API-Gateway** | 2 | 2/2 (100%) ✅ | Category complete | | **API-Gateway** | 2 | 2/2 (100%) ✅ | Category complete |
| Development | 4 | 2/4 | reviewboard, puter done | | **DevOps-Tools** | 1 | 1/1 (100%) ✅ | Category complete |
| **Development** | 2 | 2/2 (100%) ✅ | reviewboard, puter (autobom removed) |
| Documentation-Tools | 3 | 2/3 | wireviz-web, draw.io done | | Documentation-Tools | 3 | 2/3 | wireviz-web, draw.io done |
| Low-Code | 3 | 1/3 | corteza done | | Low-Code | 2 | 1/2 | corteza done (openblocks removed) |
| Monitoring | 6 | 1/6 | healthchecks done | | Monitoring | 5 | 2/5 | healthchecks, goalert done (langfuse removed) |
| Automation | 4 | 1/4 | windmill done | | Automation | 3 | 1/3 | windmill done (huginn removed) |
| Business-Apps | 8 | 1/8 | elabftw done | | Business-Apps | 6 | 1/6 | elabftw done (midday removed) |
| Collaboration | 2 | 1/2 | consuldemocracy done | | Collaboration | 2 | 1/2 | consuldemocracy done |
| Communication | 1 | 0/1 | |
| Data-Management | 2 | 0/2 | |
| DevOps-Tools | 1 | 1/1 (100%) ✅ | fx done |
| Financial-Payments | 1 | 0/1 | |
| Financial-Trading | 1 | 0/1 | |
| Infrastructure | 6 | 5/6 | easy-gate, rathole, database-gateway, chirpstack, netbox done | | Infrastructure | 6 | 5/6 | easy-gate, rathole, database-gateway, chirpstack, netbox done |
| Legal | 1 | 0/1 | | | Data-Management | 2 | 0/2 | datahub, seatunnel |
| Project-Management | 1 | 0/1 | | | Security | 4 | 0/4 | tirreno, gophish, sniperphish, sat (comply removed) |
| Scientific-Computing | 2 | 0/2 | | | System-Administration | 2 | 0/2 | mender, slurm |
| Security | 5 | 0/5 | | | Scientific-Computing | 2 | 0/2 | boinc, jamovi |
| System-Administration | 2 | 0/2 | | | Financial-Payments | 1 | 0/1 | hyperswitch |
| Financial-Trading | 1 | 0/1 | nautilus (out-of-scope pending ruling) |
| Legal | 1 | 0/1 | docassemble |
| Project-Management | 1 | 0/1 | resgrid |
## Auth Status ## Auth Status
@@ -134,7 +135,7 @@ Auth capability is a hard gate before packaging (see
LDAP acceptable (risk flag), 🔄 = auth-proxy (no users), ❌ = local-only LDAP acceptable (risk flag), 🔄 = auth-proxy (no users), ❌ = local-only
(unacceptable / blocked-on-auth). (unacceptable / blocked-on-auth).
### Completed packages (17) ### Completed packages (18)
| App | OIDC | LDAP | Verdict | Note | | App | OIDC | LDAP | Verdict | Note |
|-----|------|------|---------|------| |-----|------|------|---------|------|
@@ -155,6 +156,7 @@ LDAP acceptable (risk flag), 🔄 = auth-proxy (no users), ❌ = local-only
| eLabFTW | no | yes | ⚠️ risk (LDAP) | **Packaged**; no OIDC upstream (auth = local/SAML/LDAP per `src/Enums/AuthMethod.php`); `ldap` addon enabled, README maps `CLOUDRON_LDAP_*` → sysconfig LDAP panel — must be validated on the live Cloudron before production; SAML possible via external IdP | | eLabFTW | no | yes | ⚠️ risk (LDAP) | **Packaged**; no OIDC upstream (auth = local/SAML/LDAP per `src/Enums/AuthMethod.php`); `ldap` addon enabled, README maps `CLOUDRON_LDAP_*` → sysconfig LDAP panel — must be validated on the live Cloudron before production; SAML possible via external IdP |
| NetBox | yes | plugin | ✅ preferred | **Packaged**; python-social-auth OIDC (`REMOTE_AUTH_BACKEND=OpenIdConnectAuth` + `SOCIAL_AUTH_OIDC_*`) wired from `CLOUDRON_OIDC_*`; local Django login retained for admin bootstrap; SSO users register without privileges (README) | | NetBox | yes | plugin | ✅ preferred | **Packaged**; python-social-auth OIDC (`REMOTE_AUTH_BACKEND=OpenIdConnectAuth` + `SOCIAL_AUTH_OIDC_*`) wired from `CLOUDRON_OIDC_*`; local Django login retained for admin bootstrap; SSO users register without privileges (README) |
| ConsulDemocracy | yes | no | ✅ preferred | **Packaged**; omniauth_openid_connect (discovery) wired into generated secrets.yml; `feature.oidc_login` auto-enabled on first boot when the provider is present (admin-panel toggle afterwards); SAML also available; local admin seeded | | ConsulDemocracy | yes | no | ✅ preferred | **Packaged**; omniauth_openid_connect (discovery) wired into generated secrets.yml; `feature.oidc_login` auto-enabled on first boot when the provider is present (admin-panel toggle afterwards); SAML also available; local admin seeded |
| GoAlert | yes | no | ✅ preferred | **Packaged**; native generic OIDC (go-oidc, any issuer) wired via GOALERT_OIDC_* from the platform provider; new-user creation on; optional first-admin basic auth via GOALERT_ADMIN_USER/PASS; callback /api/v2/identity/providers/oidc/callback |
### Candidates researched ### Candidates researched