| .forgejo | ||
| docker-entrypoint.d | ||
| nginx | ||
| public | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc.json | ||
| CLAUDE.md | ||
| commitlint.config.js | ||
| Dockerfile | ||
| eslint.config.js | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
hello-web
Test frontend for hello-svc. Frontend service generated from nholtware/service-template-react: a Vite +
React 19 + React Router (data mode) SPA, served as static files by
unprivileged nginx.
Develop
npm install
npm run dev # http://localhost:5173, /api proxied to API_PROXY_TARGET (default http://localhost:3000)
npm test
npm run lint
npm run format
Runtime config
/config.js sets window.__APP_CONFIG__. In the container,
docker-entrypoint.d/10-config.sh writes it at start from env vars, so one
image runs in every environment. Read values through getConfig() in
src/lib/config.ts.
| Env var | Default | Meaning |
|---|---|---|
API_BASE_URL |
/api |
Backend base URL; /api is the same-host route |
APP_NAME |
app |
Display name |
Everything in config.js is public. Never put secrets there.
Container
GIT_SHAbuild arg is baked in asimport.meta.env.VITE_GIT_SHA.- nginx listens on 8080:
/healthzreturns 200, unknown paths fall back toindex.html,/assets/*are cached as immutable, andindex.htmlandconfig.jsare not cached. - Access log: one JSON line per request in the platform logging contract
(
level,time,service=APP_NAME,version=GIT_SHA,req.id(echoesX-Request-Id),req.method,req.url,res.statusCode,responseTimein ms,msg: "request completed"), the same shape as the backend template. In Kibana (http://kibana.192.168.1.83.nip.io, data viewkube-*):service:"hello-web" and res.statusCode >= 400./healthzisn't logged. nginx's own startup/error lines stay plain text (fieldlog).
Deploy
Push to main: Forgejo CI runs lint/test/format, builds and pushes
192.168.1.230:3000/nholtware/hello-web:<sha>, and bumps the tag in the
gitops repo. ArgoCD then syncs it. Manifests come from gitops
templates/frontend/. The repo needs Actions secrets REGISTRY_USER,
REGISTRY_TOKEN, and GITOPS_TOKEN.