harden(deploy): apply safe fixes from review report-only items

- #3 Liveness probe targets full SSR DB-querying / route, coupling pod liveness to SQLite
- #4 Chart values-staging/production.yaml are dead config under Flux; drift trap
- #6 tsconfig includes gitignored emdash-env.d.ts that only the dev server generates
- #7 Dockerfile package-lock glob + npm install fallback can silently build an unlocked image
- #8 Dockerfile creates runtime user without pinning its GID
- #9 entrypoint.sh gates `emdash init` on data.db absence, skipping migrations on PVC reuse
- #10 pullPolicy: Always vs digest pinning
- #11 Dockerfile state symlinks contradict the STATE_DIR contract; Dockerfile does not set ENV STATE_DIR
- #12 astro is a production dependency, so npm prune --omit=dev keeps build-only tooling
- #14 Two ImageUpdateAutomations write back to the same anton-helm-workloads main branch
- #16 memoryCache provider is per-process; correctness depends implicitly on replicas:1
- #17 Root catch-all [slug].astro couples nav links to pages-collection rows + DB hit per unmatched path
- #18 Detail pages render a 200-style body under a 404 status and have no try/catch around getEmDash* calls
- #19 vite allowedHosts hardcodes ddev hostnames (dev-only; no prod impact)
This commit is contained in:
Oleks
2026-06-02 04:50:54 +03:00
parent 0c2cea8c25
commit 8c119efff8
15 changed files with 157 additions and 31 deletions
+17 -4
View File
@@ -66,13 +66,26 @@ the matching branch of this repo. The `ignore` rule in `source.yaml`
restricts reconciliation to `/deploy/helm`, so app-source pushes don't
trigger chart re-reconcile.
Per-env values overlay `values.yaml` via `values-staging.yaml` /
`values-production.yaml` (for `helm upgrade` direct use) and via the
`values:` block in the FluxCD `HelmRelease`.
Per-env values come from **two independent sources** that must be kept in
sync by hand:
- The inline `values:` block in each FluxCD `HelmRelease` (in
`anton-helm-workloads`, templated under `deploy/fleet-overlay/`). **This is
the only source Flux applies to the cluster.**
- `values-staging.yaml` / `values-production.yaml` in `deploy/helm/`, used
*only* for direct `helm upgrade -f ...` invocations. **Flux never reads
these files**, so editing them has no effect on the live deploy and they
can silently drift from the HelmRelease.
Key shape decisions:
- **`replicas: 1`, `strategy: Recreate`.** SQLite is single-writer.
- **`replicas: 1`, `strategy: Recreate`.** SQLite is single-writer. This
also keeps the in-process Astro response cache (`memoryCache()` in
`app/astro.config.mjs`, fed by `Astro.cache.set(cacheHint)` on the
content pages) coherent: it is per-process, so a second replica would
hold a divergent, independently-expiring cache. Scaling out would
require a shared cache provider, not just relaxing the SQLite writer
constraint.
- **`nodeSelector: kotkan`.** `local-path` PV is sticky to one node; emdash
is colocated with the legacy kotkanagrilli WP install.
- **Pinned by digest, not tag.** The HelmRelease sets