task(cron-deploy): code complete; status 🟡 pending user-side deploy
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,10 +25,10 @@ _Updated: 2026-05-22_
|
||||
|
||||
---
|
||||
|
||||
## ⚪ [board-viewer-cron-deploy] — systemd timer + traefik + DNS on VDS
|
||||
**Status:** ready
|
||||
**Where I stopped:** разблокировано — html-render готов, артефакт `dist/index.html + dist/static/` генерируется `npm run build`. Команда: `node --experimental-strip-types src/cli.ts [config_path]`.
|
||||
**Next action:** systemd timer (~5 мин) + traefik label на VDS + DNS A `board.kzntsv.site` + basic-auth через traefik. См. `board-viewer-cron-deploy.md`.
|
||||
## 🟡 [board-viewer-cron-deploy] — docker-compose stack on VDS (board.kzntsv.site)
|
||||
**Status:** code-complete (waiting on user-side deploy actions)
|
||||
**Where I stopped:** deploy/ полностью написан (compose + Dockerfile.build + nginx.conf + auth.toml.example + .env.example + README). Compose syntax валидируется. Изменён mechanism: docker stack вместо systemd timer (user choice).
|
||||
**Next action:** user-side — DNS A-запись, `docker build && push`, bootstrap `/opt/stacks/board-viewer/` на VDS, `compose up -d`, smoke curl. После — установить 🟢.
|
||||
**Branch:** master
|
||||
|
||||
---
|
||||
|
||||
@@ -8,11 +8,14 @@
|
||||
|
||||
## Key files
|
||||
|
||||
- (TBD) `deploy/board-viewer.service` — systemd one-shot unit (runs reader + render → writes to `/var/www/board-viewer/`)
|
||||
- (TBD) `deploy/board-viewer.timer` — systemd timer (OnUnitActiveSec=5min)
|
||||
- (TBD) `deploy/docker-compose.yml` фрагмент или `deploy/traefik-labels.yaml` — traefik label для статики
|
||||
- (TBD) `deploy/README.md` — install steps + DNS record requirements
|
||||
- (TBD) `deploy/auth/htpasswd` — basic-auth credentials (gitignored, with `.htpasswd.example`)
|
||||
- `deploy/docker-compose.yml` — двухсервисный стек (build + web) на `proxy` network
|
||||
- `deploy/Dockerfile.build` — build-image (node:22-alpine + cron-loop entrypoint)
|
||||
- `deploy/nginx.conf` — static serving с Cache-Control
|
||||
- `deploy/auth.toml.example` — шаблон Gitea token + board_viewer_repos
|
||||
- `deploy/.env.example` — шаблон BOARD_VIEWER_USERS с правилом `$$` escape
|
||||
- `deploy/README.md` — DNS / image build / bootstrap / smoke / DR steps
|
||||
|
||||
**Замечание:** acceptance изначально упоминал systemd timer, но user выбрал docker-compose stack (consistent с существующим VDS pattern Gitea/registry/etc.). Mechanism: `while true; do node cli.ts; sleep 300; done` внутри `board-viewer-build` контейнера. Логи через `docker compose logs`, не journalctl. Эффект тот же — каждые 5 мин regen.
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
@@ -28,16 +31,30 @@
|
||||
|
||||
- 2026-05-22: task создан промоушеном; carve-out из TDD под инфра (declarative configs).
|
||||
- 2026-05-22: auth = traefik basic-auth, не in-app (фиксировано в дизайне).
|
||||
- 2026-05-22: deploy-mechanism = docker-compose stack (рекомендация принята); systemd timer заменён на cron-loop внутри build container'а. Гомогенно с existing VDS pattern (Gitea, registry, ntfy).
|
||||
- 2026-05-22: basicauth.users inline через env_file, `$$` escape для compose interpolation. Не нужно касаться traefik stack'а (mounting htpasswd в traefik потребовало бы изменения соседнего стека).
|
||||
|
||||
## Open questions
|
||||
|
||||
- [ ] Хост: VDS Rusonyx (тот, где уже Gitea + traefik) или отдельная машина? — VDS, рядом с git.kzntsv.site (см. дизайн).
|
||||
- [ ] Multi-user basic-auth или single creds? — пока single, поскольку single-user проект.
|
||||
- [ ] Rate-limit на Gitea API: 5-мин тик * N репо * M файлов — оценить, не упрётся ли. Gitea дефолт ~60 req/min anon, токенизированный сильно выше — должно хватить с запасом.
|
||||
- [x] Host: VDS Rusonyx (тот же, где Gitea+traefik). Network `proxy`, путь `/opt/stacks/board-viewer/` — verified via vds-ops inspect of gitea container.
|
||||
- [x] Multi-user basic-auth: схема поддерживает (comma-separated), но MVP — single user.
|
||||
- [x] Rate-limit: 4 repos × ~2 calls/repo (STATUS.md fetch + commit log per task slug) каждые 5 мин = ~24-100 calls. Token'изированный Gitea не упрётся.
|
||||
|
||||
## Completed steps
|
||||
|
||||
- [ ] (фиксируется при выполнении)
|
||||
- [x] docker-compose.yml с двумя сервисами и traefik labels
|
||||
- [x] Dockerfile.build для cron-loop image
|
||||
- [x] nginx.conf для static serving
|
||||
- [x] auth.toml.example + .env.example + README.md с полным install path
|
||||
- [x] .gitignore исключает реальные `auth.toml` и `.env`
|
||||
- [x] compose syntax validated via `docker compose config`
|
||||
|
||||
## Pending (user-side actions)
|
||||
|
||||
- [ ] DNS A-record `board.kzntsv.site` → VDS IP
|
||||
- [ ] `docker build && docker push` на dev-машине → `registry.kzntsv.site/board-viewer-build:latest`
|
||||
- [ ] Bootstrap `/opt/stacks/board-viewer/` на VDS + заполнить `auth.toml` и `.env`
|
||||
- [ ] `docker compose up -d` + smoke `curl -u user:pass https://board.kzntsv.site/`
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user