Skip to content

Reference

Fast lookups for this Project Loom instance: pinned versions, endpoints, namespaces, and secrets. Anything Penvoice-specific below is an example app, not the platform.

Chart / operatorVersion
cert-managerv1.20.2
argo-cd9.5.21
argo-rollouts2.41.0
CloudNativePG0.28.3 (operator v1.29.1)
Keycloak operator26.6.3
Infisical (server chart)1.10.0
Infisical Secrets Operator0.11.8
HostWhat
loom.webbies.devThis guide
control.webbies.devArgo CD (apps portal)
uat.auth.webbies.devKeycloak (UAT / staging overlay)
auth.webbies.devKeycloak (prod)
vault.webbies.devInfisical UI
test.penvoice.appPenvoice web (staging)
penvoice.appPenvoice web (prod)
test.api.penvoice.appPenvoice API (staging)
api.penvoice.appPenvoice API (prod)
test.mytalon.co.zwTalon web (staging)
mytalon.co.zwTalon web (prod)
test.api.mytalon.co.zwTalon API (staging)
api.mytalon.co.zwTalon API (prod)
test.invoicer.visarend.systemsInvoicer (staging)
invoicer.visarend.systemsInvoicer (prod)

Every app follows the same host pattern: web is the plain domain (domain.tld), API is api.domain.tld, and staging prefixes either with test. (test.domain.tld / test.api.domain.tld).

Run kubectl on the node, or locally once set up. See Access.

RepoContents
webb1es/loomManifests (app-of-apps). Private. Source of truth.
webb1es/penvoice-apiGo REST API. CI → GHCR, public package.
penvoice-webAngular SPA. Deploys on Vercel (branch-based).
webb1es/talon-apiGo BFF (session-based, not a stateless resource server; owns its own credentials). CI → GHCR, public package.
talon-webReact SPA. Deploys on Vercel (branch-based).
webb1es/invoicerGo server-rendered app on SQLite. CI → GHCR, pushed straight to its staging branch.

Images: ghcr.io/webb1es/penvoice-api:sha-<sha>, ghcr.io/webb1es/talon-api:sha-<sha>, ghcr.io/webb1es/invoicer:sha-<sha>.

NamespaceRuns
argocdArgo CD / Rollouts
cert-managercert-manager
cnpg-systemCloudNativePG operator
keycloakKeycloak operator only
keycloak-stagingStaging Keycloak + Postgres
keycloak-prodProd Keycloak + Postgres
infisicalInfisical server + secrets operator + its Postgres
penvoice-stagingPenvoice API + Postgres + Redis (staging)
penvoice-prodPenvoice API + Postgres + Redis (prod)
talon-stagingTalon API + Postgres + Redis (staging)
talon-prodTalon API + Postgres + Redis (prod)
invoicer-stagingInvoicer + Gotenberg + SQLite volume (staging)
invoicer-prodInvoicer + Gotenberg + SQLite volume (prod)

Recreate these by hand. Provision. <app>-api-kc is not in this list: Infisical owns it. See Secrets.

SecretNamespace(s)What
infisical-secretsinfisicalInfisical server’s own AUTH_SECRET/ENCRYPTION_KEY/DB_CONNECTION_URI/REDIS_URL
infisical-pg-backup-credsinfisicalOracle Object Storage S3 keys
infisical-<app>-identity<app>-staging, <app>-prodMachine Identity per env
keycloak-config-cli-sakeycloak-staging, keycloak-prodconfig-cli service-account (master realm, admin)
<app>-pg-backup-credsmatching app/keycloak env nsOracle Object Storage S3 keys

Oracle S3 keys: access key = clean hex; secret key has +/=. Don’t swap. The Keycloak realm config also lives out-of-band (in its DB, which is backed up).

SettingValue
Bucketpenvoice-pg-backups (per-cluster folders)
ScheduleNightly ScheduledBackup + continuous WAL archiving
PITR windowStaging 3 days; prod and Infisical 7 days
Regionaf-johannesburg-1
Required S3 envAWS_REQUEST_CHECKSUM_CALCULATION=when_required, AWS_RESPONSE_CHECKSUM_VALIDATION=when_required, AWS_DEFAULT_REGION=af-johannesburg-1

OCI Email Delivery, region af-johannesburg-1. Setup: Provision § 9 once, Onboard § Email per app. Model: Concepts § Email.

SettingValue
SMTP endpointsmtp.email.af-johannesburg-1.oci.oraclecloud.com, port 587 (STARTTLS)
Email domainmail.visarend.systems (compartment email), DKIM selector visarend-jnb-<yyyymm>
Policyemail-apps-send (root), one line per app
Notices mailboxoci@visarend.systems (Zoho), one alias per app
Limits50,000 emails/day, ~2 MB per message including encoding, 18,000/min
AppCompartmentApproved sender (MAIL_FROM)OCI user / emailGroupSettings live in
invoiceremail-invoicerinvoicer@mail.visarend.systemsSMTP Invoicer / oci-invoicer@visarend.systemsemail-invoicerInfisical invoicer
aydeemail-aydeayde@mail.visarend.systemsSMTP Ayde / oci-ayde@visarend.systemsemail-aydeInfisical ayde
talonemail-talontalon@mail.visarend.systemsSMTP Talon / oci-talon@visarend.systemsemail-talonInfisical talon
sonkeemail-sonkesonke@mail.visarend.systemsSMTP Sonke / oci-sonke@visarend.systemsemail-sonkeInfisical sonke
keycloakemail-keycloakauth@mail.visarend.systemsSMTP Keycloak / oci-keycloak@visarend.systemsemail-keycloakKeycloak realm Email tab (DB)

Infisical keys per app: SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD, MAIL_FROM.

No metrics stack. Prod overlays pause 60s at 25% / 50% / 75%. Staging is one replica and setWeight: 100.