feat(deploy): single-image docker-compose and kubernetes install.sh
- multi-stage root Dockerfile (opsx-loki pattern): frontend dist +
go binary + gh-ost in one alpine image, non-root user, HEALTHCHECK,
entrypoint warning for missing SECRET_KEY; gin now serves the SPA
from DIST_DIR (asset/db-logos/favicon passthrough, /api returns JSON
404, SPA fallback to index.html) - one origin, no CORS surface
- docker-compose.yml rewritten: single service, named data volume,
no-new-privileges + cap_drop ALL, /health healthcheck, resource
limits, log rotation; SECRET_KEY required (openssl rand -hex 32),
JWT_SECRET optional (auto-generated and persisted in prod)
- kubernetes/: install.sh one-command deploy (idempotent secret
reuse, --nodeport/--ingress flags, rollout wait, backup tips) plus
namespace/secret/pvc/deployment(single replica + Recreate, probes,
resource limits, non-root)/service/nodeport/ingress manifests and
README (sqlite single-writer constraints, snapshot backup)
- docs: README quick-start now has 3 deployment paths; ARCHITECTURE
ch.14 expanded
single-image runtime verified locally (SPA/assets/api/login coexist
on :9002); full image build left to server (docker hub unreachable
from this machine)