- service.yaml: the shorashim.ch host rule is gone from the Ingress; the no-host catch-all stays for http://185.19.28.170 - gitea-public-patch.yaml: APP_NAME "Shorashim" → "Bikoret" (title and brand on every Gitea page) - shorashim-ch-takedown.sh: the operator's apply (ingress, orphan mcp.shorashim.ch TLS secret, Gitea patch + rollout) with verification - KOHEN.md, AGENTS.md: examples and the endpoint table use bikoret.ch Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
4.6 KiB
Deployment Architecture
Generic architecture shape for a bikoret deployment. Specifics of a particular deployment (hostnames, IPs, account names, credentials) live in the operator's private notes, not in this repo.
Components
One Kubernetes namespace runs the following:
| Component | Runtime | Purpose |
|---|---|---|
vav-pipeline |
Elixir/OTP release | Bereishit cycle, ShemaContext, Cloud, Manna, HTTP API (pe'ah, courtyard, chatzer, kodesh) |
shoresh-engine |
Haskell binary, spawned by vav-pipeline as an Erlang Port (staged into the pod by the shoresh-engine-install init container — NOT a sidecar container; a Port is a child process of the BEAM and cannot cross a container boundary) |
Root activation, te'amim parsing, gematria |
talmudic-engine |
SWI-Prolog (sidecar via Unix socket) | 613 mitzvot, 13 middot, kushya generation, teiku |
korban-processor |
Python 3.12 (sidecar) | Offering protocol, eish zarah validation |
All four run in the same pod. vav-pipeline is the main container; talmudic-engine and korban-processor are sidecars; shoresh-engine runs inside vav-pipeline as an Erlang Port child process, staged in by an init container.
External dependencies
| Dependency | Purpose | Contract |
|---|---|---|
| Managed PostgreSQL 17+ | L3 Oral Tradition (append-only) | DATABASE_URL env var. Requires SSL. Role with SELECT, INSERT only — UPDATE, DELETE revoked (see migration). |
| (none — in the images) | L1 Torah filesystem (~29 MB) | Baked into every image at /mnt/torah, owned by root with no write bit. No volume. The pipeline hashes the tree at startup and every ten minutes; no cycle runs on a scroll that does not match the pinned hash. |
| Block-storage PersistentVolume | Manna provision and its ledger (read-write, 1 GiB) | Mount at /var/lib/bikoret/manna. Operator writes today.json daily; the vessel writes ledger.json. |
| Ingress controller + TLS cert | Public HTTPS access | Cert-manager with Let's Encrypt HTTP-01 is the reference setup. |
| Container registry | Image distribution | Any registry that supports Docker v2 protocol. |
Kubernetes manifests
Kept in deploy/k8s/:
namespace.yaml— the namespaceconfigmap.yaml— non-secret configurationsecrets.yaml— template only; operator fills inDATABASE_URLl1-volume.yaml— PV and PVC for Torah filesystem (vestigial: L1 is in the images; do not apply)manna-volume.yaml— PVC for provision filedeployment.yaml— the pod with 3 containers + 2 init containers (shoresh-engine-install,migrate). Four images are still built and pushed; shoresh-engine ships a binary, not a running container.service.yaml— ClusterIP and external LoadBalancergitea-mcp-deployment.yaml— Gitea MCP server for the claude.ai / Claude Code connector, MCP OAuth mode (users act as themselves in Gitea)gitea-mcp-ingress.yaml— TLS ingressmcp.bikoret.chfor the MCP servergitea-mcp-secret.yaml— template for a Gitea PAT (static-token mode only; kept for rollback)gitea-ingress.yaml— TLS ingressgit.bikoret.chfor Gitea itself (namespace temple-council), required by OAuth modegitea-public-patch.yaml— patch that sets Gitea's ROOT_URL/DOMAIN/SSH_DOMAIN togit.bikoret.chand APP_NAME toBikoretgitea-public-apply.sh/gitea-public-verify.sh— the operator's apply and read-only check for the four aboveshorashim-ch-takedown.sh— 2026-10-20: removes the shorashim.ch ingress rule and the orphan mcp.shorashim.ch secret, applies the Gitea brand patchcert-manager-issuer.yaml— Let's Encrypt ClusterIssuer
Containers
Four Dockerfiles in deploy/docker/:
Dockerfile.vav_pipeline— multi-stage Elixir 1.16.1 / OTP 26.2.1 releaseDockerfile.shoresh_engine— multi-stage Haskell GHC 9.6.4 / CabalDockerfile.talmudic_engine— SWI-Prolog 9.2.2 with socket serverDockerfile.korban_processor— Python 3.12.2 slim
Configuration surface
The system reads three things from its environment:
- L1 Torah — in the image at
$L1_MOUNT_POINT, not writable by the service user. Read and hashed at startup and every ten minutes; every cycle is gated on the last reading. - Manna provision — JSON file at
$MANNA_PROVISION_FILE, written by the kohen/treasurer. - L3 database — connection string in
$DATABASE_URL.
Nothing else is configurable. The system obeys Torah (L1 + calendar) for governance and the provision file for resources.
Seven-day inauguration
Before serving users, run the shiv'at y'mei milu'im sequence documented in KOHEN.md. Each day validates a specific layer. Partial inauguration is no inauguration.