tududi speaks the OpenAI chat completions API for its daily brief and
task/project insights, so it can use the Ollama box directly instead of a
hosted provider -- nothing about the task list leaves the network.
LLM_API_KEY has to be set even though Ollama ignores it; without a key
the generation endpoints answer 503 and the UI shows a not-configured
state. It is a secret so the value can be swapped for a real one if the
provider ever changes.
gemma4:e4b was checked against the JSON-only replies these features parse
and answered correctly in about five seconds.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two self-hosted apps behind traefik, both keeping their state on the
GlusterFS volume that is mounted on every node:
- dashwise (home.wittyoneoff.com) is an all-in-one image running its web
server, a bundled PocketBase and valkey side by side. Only port 3000 is
published: the frontend resolves its backend as window.location.origin
and every PocketBase call is made server-side, so 8090 stays inside the
pod. It is on the service so the PocketBase admin UI can be reached with
kubectl port-forward.
- tududi (tududi.wittyoneoff.com) stores a SQLite database and user
uploads. Both are VOLUMEs in the image, so both are backed by the claim
-- as one volume mounted twice with subPath, because naming the same
claim as two volume entries wedges kubelet, which is what happened with
limesurvey.
Both images are pinned to tags that publish an arm64 manifest. dashwise
:latest and :stable are amd64 only and would not start on these nodes.
Namespaces and secrets are applied out of band, as with the other apps.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>