Skip to content

release: chart 0.12.3 (Dakera server v0.12.3, dashboard 0.5.2) + hardening - #16

Merged
ferhimedamine merged 4 commits into
mainfrom
claude/release-hardening
Oct 22, 2026
Merged

ferhimedamine merged 4 commits into
mainfrom
claude/release-hardening

Conversation

@ferhimedamine

@ferhimedamine ferhimedamine commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Chart 0.12.3. Version and appVersion move 0.12.2 -> 0.12.3, and the dashboard tag moves 0.5.1 -> 0.5.2. The chart follows engine Dakera-AI/dakera#922 (#917 / #920 / #921 / #923) and includes the hardening found in a security audit.

Merge order: merge last.

  1. Engine #922 first: it tags v0.12.3 and publishes ghcr.io/dakera-ai/dakera:0.12.3.
  2. Then the clients and the dashboard 0.5.2 release (ghcr.io/dakera-ai/dakera-dashboard:0.5.2).
  3. Then this PR and dakera-deploy.

Merging publishes chart 0.12.3, which needs both images to exist. helm-publish-oci.yml now skips versions that are already published, so 0.12.2 can no longer be overwritten.

Changes

Release

  • Version bump with artifacthub images and changes, a CHANGELOG 0.12.3 section with upgrade notes, README version tables and install examples, "Upgrading from chart 0.12.2", and a NOTES "Server 0.12.3" block.

Server 0.12.3 settings (rendered only when set, range-checked in values.schema.json)

  • dakera.config:
    • httpHeaderReadTimeoutSecs;
    • the recall switches (neighborhoodMode, recallRankDepth, ...);
    • maxConnections;
    • shutdownDrainSecs. The chart refuses it unless 15 + drain + 5 fits in the new dakera.terminationGracePeriodSeconds (30);
    • allowedHosts.
  • config.documents.*: document import (DAKERA_DOCUMENTS, DAKERA_DOCUMENT_*).
    • PDF / DOCX extraction uses up to extractConcurrency x extractMemoryMb (2 x 1024 MB) inside the 4Gi limit. The docs say to raise the limit or use concurrency 1 for PDF-heavy imports.
    • ingress.annotations now defaults to proxy-body-size: 500m. ingress-nginx's own 1m default refused 25 MiB uploads.

Authentication off

  • NOTES now warns that public dotted Host names (the ingress host) get 421 unless listed in allowedHosts, and prints a ready --set line. The Service FQDN (*.svc.cluster.local) is a private-use name the 0.12.3 server accepts, so in-cluster clients need nothing.

Behaviour of server 0.12.3 in the upgrade notes

  • Autopilot dedup is off by default (DAKERA_AUTOPILOT_DEDUP_MODE=merge in dakera.extraEnv keeps it); a full queue answers 429 + Retry-After; recall of an agent with nothing stored answers 200 with no memories.
  • Weight prepacking follows the memory limit: with the default 4Gi / 2 CPU the reranker's is on and the embedder's off (values.yaml, extraEnv).

Server image (distroless, uid/gid 1000)

  • Probes stay httpGet and gain timeoutSeconds: 5.
  • The GPU image is CUDA 13 and needs NVIDIA driver R580+ (documented).

Dashboard 0.5.2

  • Runs as uid/gid 10001 with a read-only root filesystem, a /tmp emptyDir and no capabilities.
  • New dashboard.trustedProxies (DAKERA_TRUSTED_PROXIES).

Hardening

  • Read-only root filesystem by default; the data root is an emptyDir when persistence is off.
  • RuntimeDefault seccomp and no service-account token on every pod.
  • dakera.existingSecret.
  • MinIO NetworkPolicy, on by default.
  • Fixed the manual-Secret instructions.
  • Actions pinned by commit SHA.

Tests

  • scripts/validate-chart.sh covers all of the above, including 37 refusal checks. Its helm template | grep -q checks no longer fail with SIGPIPE under pipefail.

Testing

  • scripts/validate-chart.sh (the CI job) passes with helm v3.14.4, checksum-verified.
  • helm lint passes on the defaults and every example; helm package produces dakera-0.12.3.tgz.
  • kubeconform -strict (k8s 1.30) finds 131 resources valid across the default render, all examples and a render with every option enabled.
  • NOTES output checked for authentication off, with and without allowedHosts, and for upgrades.
  • Against the 0.12.3 release commit's CI image (sha-c5b63fa): --check-config on the default render and on a render with every 0.12.3 setting set (plus throughput settings in extraEnv), also as a fresh install where an unknown DAKERA_* name is refused: every name is accepted. scripts/validate-chart.sh passes three runs in a row with helm v3.14.4.

🤖 Generated with Claude Code

https://claude.ai/code/session_019GcW157E6uJuFrBa2RgZBz

…shed versions

- Optional dakera.config settings of the server releases after 0.12.2,
  rendered only when set and checked by values.schema.json:
  httpHeaderReadTimeoutSecs (DAKERA_HTTP_HEADER_READ_TIMEOUT_SECS) and the
  recall switches (neighborhoodMode, recallRankDepth, ...).
- README: idle keep-alive vs the header timeout behind ingress-nginx / load
  balancers; security defaults.
- Read-only root filesystem by default (emptyDir data root with persistence
  off), RuntimeDefault seccomp, no service-account token on any pod, probe
  timeoutSeconds 5 (probes stay httpGet: nothing needed in the image).
- Dashboard: only the capabilities its 0.5.1 image needs (measured).
- dakera.existingSecret; MinIO NetworkPolicy (only this release's Dakera
  pods); fixed manual-Secret instructions (S3 key = minio.rootUser).
- helm-publish-oci: never overwrite a published chart version (it re-pushed
  the current version on every charts/ change); actions pinned by SHA.
- validate-chart.sh covers all of it.

No version change (the release process bumps it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019GcW157E6uJuFrBa2RgZBz
- Chart version and appVersion 0.12.2 -> 0.12.3; dashboard image 0.5.2;
  artifacthub images / changes, CHANGELOG 0.12.3 section, README version
  tables, install examples and "Upgrading from chart 0.12.2". Release after
  the 0.12.3 server and 0.5.2 dashboard images are published.
- Dashboard 0.5.2: uid/gid 10001, read-only root with a /tmp emptyDir, no
  capability; dashboard.trustedProxies (DAKERA_TRUSTED_PROXIES).
- Server 0.12.3 settings: maxConnections, shutdownDrainSecs (checked against
  the new dakera.terminationGracePeriodSeconds), allowedHosts (NOTES warns
  when authentication is off), config.documents.* (document import, with
  memory sizing notes); ingress.annotations defaults to proxy-body-size 500m.
- Distroless server image and the CUDA 13 GPU image (driver R580+) documented.
- validate-chart.sh covers the new values and refusals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019GcW157E6uJuFrBa2RgZBz
@ferhimedamine ferhimedamine changed the title chart: new server settings, hardening defaults, no overwrite of published versions release: chart 0.12.3 (Dakera server v0.12.3, dashboard 0.5.2) + hardening Oct 17, 2026
claude and others added 2 commits October 18, 2026 16:53
…xtraEnv

They are sized by the server from the pod's cores and memory limit; the
comment names them for operators who need to override one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019GcW157E6uJuFrBa2RgZBz
Checked every DAKERA_* name the chart renders against the 0.12.3 release
commit (--check-config passes on the default render and with every 0.12.3
setting set).

- Authentication off: the server accepts private-use Host names
  (*.local, *.internal, *.home.arpa), so the Service FQDN works without
  allowedHosts. NOTES no longer tells in-cluster clients that the FQDN is
  refused; values.yaml, both READMEs and the CHANGELOG ask only for public
  names (the ingress host).
- Upgrade notes: autopilot dedup off by default
  (DAKERA_AUTOPILOT_DEDUP_MODE=merge keeps it), 429 instead of 503 on a
  full queue, empty recall = 200, open-files raise, prepacking under a
  memory limit (default 4Gi / 2 CPU: reranker on, embedder off).
- Probe comments: the port binds before crash recovery from 0.12.3;
  /health is 503 while storage refuses writes.
- scripts/validate-chart.sh: `helm template | grep -q` under pipefail
  failed with SIGPIPE (141) when helm was still writing (reproduced with
  helm 3.14.4); grep_q reads its whole input.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ferhimedamine
ferhimedamine merged commit 5994bdb into main Oct 22, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants