# board-viewer-cron-deploy ## Goal Деплой статической HTML-доски на VDS под доменом `board.kzntsv.site`. Periodic regen через systemd timer ~5 мин. Traefik label для роутинга. DNS A-запись. Basic-auth через traefik (не in-app). **TDD posture:** под carve-out «infrastructure / declarative» из `tdd-criteria`. Acceptance проверяется по факту deploy + curl, не unit-тестами. systemd unit-файлы и traefik labels — декларативные конфиги, не код. ## 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`) ## Acceptance criteria - DNS `board.kzntsv.site` → VDS IP (Cloudflare / namecheap / wherever DNS живёт). - Traefik route: `board.kzntsv.site` → static file serving из `/var/www/board-viewer/`. - Basic-auth на traefik (middleware), креды из `.htpasswd`. - systemd timer крутится каждые 5 мин, успешно дёргает reader + render, пишет в `/var/www/board-viewer/index.html`. - Логи systemd видны через `journalctl -u board-viewer.service`. - Health check: `curl -u user:pass https://board.kzntsv.site/` → HTML с актуальной доской. - README.md описывает install steps (для disaster-recovery: «как поднять с нуля на новой машине»). ## Decisions log - 2026-05-22: task создан промоушеном; carve-out из TDD под инфра (declarative configs). - 2026-05-22: auth = traefik basic-auth, не in-app (фиксировано в дизайне). ## 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, токенизированный сильно выше — должно хватить с запасом. ## Completed steps - [ ] (фиксируется при выполнении) ## Notes Зависит от `board-viewer-html-render` — нужен артефакт для деплоя (хотя бы placeholder). Можно стартовать параллельно с DNS-записью (она прогревается).