8 Commits

Author SHA1 Message Date
2858c87b1b fix: use named volume for production PostgreSQL to prevent data loss
Two issues caused DB reset on every deploy:

1. docker-compose.prod.yml used bind mount (./data/postgres) with
   PostgreSQL 18's incompatible /var/lib/postgresql/data path.

2. The Gitea CI runner shares Docker socket with the host, but
   ./data/postgres resolves to a temp path inside the runner container.
   Each deploy creates a fresh workspace, so the bind mount always
   points to an empty directory on the host.

Fix: Use a named Docker volume (same as docker-compose.yml dev config).
Named volumes are managed by Docker daemon directly, survive container
recreation, and don't depend on working directory resolution.

Also fix deploy.yml: remove unnecessary mkdir for data dirs, write
backup to /tmp instead of relative path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 23:47:46 +09:00
0a8d17a588 fix: use relative paths for postgres data and backups to avoid root permission issues
All checks were successful
Deploy to Production / deploy (push) Successful in 1m58s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:42:23 +09:00
75a408362e fix: use host bind mount for postgres data to prevent data loss on deploy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:26:55 +09:00
eadc935e46 fix: add ADMIN_* env vars to deploy workflow .env.prod generation
All checks were successful
Deploy to Production / deploy (push) Successful in 1m7s
Without these variables the admin user seed was skipped in production.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 22:28:08 +09:00
070f74d978 fix: use 127.0.0.1 instead of localhost in health checks
All checks were successful
Deploy to Production / deploy (push) Successful in 1m35s
Alpine's wget resolves localhost to IPv6 [::1] first, but Next.js
standalone listens on 0.0.0.0 (IPv4 only), causing connection refused.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:12:59 +09:00
e22241dbc4 fix(ci): use retry loop for frontend health check
Some checks failed
Deploy to Production / deploy (push) Failing after 3m32s
The frontend container needs more time to initialize. Replace fixed
sleep with a retry loop that polls the container health status up to
30 times (150s max) before checking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:58:06 +09:00
f43f26f43c fix(ci): redesign deploy workflow for containerized Act Runner
Some checks failed
Deploy to Production / deploy (push) Failing after 1m14s
- Install Docker CLI + Compose plugin in job container
- Remove rsync dependency (work directly from checkout workspace)
- Use --project-name for consistent compose project naming
- Use --env-file for compose variable substitution
- Use docker exec for health checks (job container can't reach host ports)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:40:23 +09:00
39d2226d95 feat: production deployment setup with Gitea Actions CI/CD
Some checks failed
Deploy to Production / deploy (push) Failing after 46s
- Remove nginx from docker-compose.prod.yml (NPM handles reverse proxy)
- Add Next.js rewrites to proxy /api/* to backend (backend fully hidden)
- Bind frontend to 127.0.0.1:3000 only (NPM proxies externally)
- Replace hardcoded localhost:8000 in history page with api client
- Make CORS origins configurable via environment variable
- Restrict CORS methods to GET/POST/PUT/DELETE
- Add Gitea Actions deploy workflow with secrets-based env management
- Add security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
- Add BACKEND_URL build arg to frontend Dockerfile for standalone builds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 23:09:22 +09:00