feat: Docker images, compose stacks, nginx config, Gitea CI

- site image: multi-stage node build -> unprivileged nginx (non-root, read-only)
- nginx: CSP + security headers, immutable asset caching, revalidated HTML,
  canonical trailing slash, preserved /Linkedin 301, legacy-WP 410s, custom 404
- externalise theme-init so CSP uses script-src 'self' (no inline hash)
- prod + dev compose; .env.example; relay Dockerfile fixed (image ships app user)
- Gitea Actions: quality, e2e, lighthouse budgets, relay build, image push on main
- verified: both images build; relay healthz 200; site serves EN/NO with CSP + redirect

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
cesnimda
2026-07-04 06:21:35 +02:00
parent 033c9ec315
commit 9088dcffb9
11 changed files with 322 additions and 20 deletions
+20
View File
@@ -0,0 +1,20 @@
{
"ci": {
"collect": {
"staticDistDir": "./dist",
"url": ["http://localhost/index.html", "http://localhost/projects/jobtrack/index.html"],
"numberOfRuns": 1
},
"assert": {
"assertions": {
"categories:performance": ["error", { "minScore": 0.95 }],
"categories:accessibility": ["error", { "minScore": 1 }],
"categories:seo": ["error", { "minScore": 1 }],
"largest-contentful-paint": ["error", { "maxNumericValue": 1800 }],
"cumulative-layout-shift": ["error", { "maxNumericValue": 0.02 }],
"total-blocking-time": ["error", { "maxNumericValue": 100 }],
"unused-javascript": "off"
}
}
}
}