Commit Graph

  • e538ecd509 Update docker-compose-prod.yml main vasyansk 2026-07-05 17:12:50 +07:00
  • 650a8cff85 Create docker-compose-prod.yml vasyansk 2026-07-05 17:07:02 +07:00
  • 567d721311 fix readme vasyansk 2026-07-05 17:01:33 +07:00
  • 5215678fe6 Merge fix/surface-provider-error: реальная ошибка провайдера вместо internal error vasyansk 2026-07-05 16:10:37 +07:00
  • 879e9e14b1 fix(api): surface real provider error on apply/check instead of generic internal error vasyansk 2026-07-05 15:53:27 +07:00
  • 6f9958af60 Merge feature/selective-apply-order: выборочный Apply + удаления перед обновлениями vasyansk 2026-07-05 15:32:54 +07:00
  • e283e5f22a fix: document apply ordering invariant; visible indeterminate checkbox + test vasyansk 2026-07-05 15:26:46 +07:00
  • 2f1f5311ad feat(web): per-record apply checkboxes with select-all; prune opt-in vasyansk 2026-07-05 15:20:09 +07:00
  • 0b26923586 feat(apply): per-record selection + deletes-before-updates ordering vasyansk 2026-07-05 15:10:01 +07:00
  • fc19678727 docs: plan for per-record apply selection + deletes-first order vasyansk 2026-07-05 15:03:14 +07:00
  • 0b2b9c6e3e Merge fix/check-status-and-diff-layout: статус при ручной проверке + перенос длинных значений vasyansk 2026-07-05 14:48:23 +07:00
  • 27d70a987e fix(store): scope SetDomainStatus by project (IDOR); scheduler reuses DeriveStatus vasyansk 2026-07-05 14:40:13 +07:00
  • 784e7bd822 fix(web): wrap long record values in diff and zone view (no horizontal overflow) vasyansk 2026-07-05 14:27:33 +07:00
  • 1b367c4bda fix(api): manual check persists last_check_status (was stale unknown) vasyansk 2026-07-05 14:22:02 +07:00
  • cc5e562a67 docs: plan for manual-check status + diff value wrapping vasyansk 2026-07-05 14:15:02 +07:00
  • aa7e8c705a Merge feature/template-placeholders: плейсхолдер {{domain_name}} в шаблонах vasyansk 2026-07-05 14:01:34 +07:00
  • 91f7a02f2c fix(tmpl): parameterize zone name only on DNS-label boundaries vasyansk 2026-07-05 13:58:55 +07:00
  • 655ae8ccf8 feat(web): hint about {{domain_name}} placeholder in template editor vasyansk 2026-07-05 13:48:24 +07:00
  • df895d8850 feat(tmpl): {{domain_name}} placeholder — materialize on diff/apply, parameterize on snapshot vasyansk 2026-07-05 13:41:18 +07:00
  • 135917216c docs: plan for {{domain_name}} template placeholders vasyansk 2026-07-05 13:34:00 +07:00
  • 40cec05c9a Merge fix/empty-changeset-null: пустой changeset → [] не null (белый экран после snapshot) vasyansk 2026-07-05 13:11:01 +07:00
  • bc2e77ad4e fix: empty changeset must serialize as [] not null (white-screen after snapshot) vasyansk 2026-07-05 13:10:08 +07:00
  • 08697e06d7 Merge feature/zone-view-snapshot: просмотр зоны без шаблона + snapshot-шаблон vasyansk 2026-07-05 12:58:20 +07:00
  • 9f0938daea fix: reject snapshot when template already attached (409); handle domains-load error; drop orphaned useDeleteDomain vasyansk 2026-07-05 12:54:52 +07:00
  • 137113cbe6 fix(web): gate zone-records fetch to no-template case; wait for domains load before branching vasyansk 2026-07-05 12:28:07 +07:00
  • c2832348f8 feat(web): view zone without template, snapshot button, no-template status, drop delete vasyansk 2026-07-05 12:19:50 +07:00
  • 5662334799 fix(api): distinguish domain-not-found (404) from provider failure (502) on zone endpoints vasyansk 2026-07-05 12:14:46 +07:00
  • 9ccb304d2e feat(api): read zone records without template + snapshot-to-template vasyansk 2026-07-05 12:00:27 +07:00
  • 1540140542 docs: plan for zone view without template + snapshot vasyansk 2026-07-05 11:48:21 +07:00
  • b4e34f5b9b Merge feature/selectel-iam-auth: фикс 401 — project IAM-токен для Cloud DNS v2 vasyansk 2026-07-04 21:25:39 +07:00
  • e8e7371f09 fix: drain Identity error body (keep-alive); reject whitespace-only credential fields in form vasyansk 2026-07-04 20:36:50 +07:00
  • be408a216c feat(web): Selectel service-user account form (IAM credentials) vasyansk 2026-07-04 20:23:34 +07:00
  • 568452846a feat(api): structured provider credentials + trial-auth validation on account create vasyansk 2026-07-04 20:12:41 +07:00
  • 32107571d1 feat(selectel): project-scoped IAM auth with token cache; provider Validate vasyansk 2026-07-04 20:02:36 +07:00
  • 617b02dbfb docs: plan for Selectel IAM auth (Cloud DNS v2) vasyansk 2026-07-04 19:52:42 +07:00
  • 774b480677 Merge feature/tech-debt-docker: техдолг Фаз 1-3 + docker compose vasyansk 2026-07-04 16:38:45 +07:00
  • 77ca0200ae build: docker compose (app + postgres) with healthchecks and .env vasyansk 2026-07-04 16:27:16 +07:00
  • 675136e488 build: mirror .gitignore dist rules in .dockerignore for hermetic builds vasyansk 2026-07-04 16:23:20 +07:00
  • 7d875ea19a build: multi-stage Dockerfile (node build -> go embed -> distroless) vasyansk 2026-07-04 16:15:55 +07:00
  • 7256adf637 fix(web): scope Suspense to page body; guard formatConfig against null config vasyansk 2026-07-04 16:12:21 +07:00
  • 8c35aed8f2 perf(web): route-level code-splitting; harden channel config rendering vasyansk 2026-07-04 16:04:17 +07:00
  • 41844d49a0 test(notify): assert per-channel results on decrypt-fail and unknown-type vasyansk 2026-07-04 16:01:14 +07:00
  • f14916396c feat(notify): per-channel delivery results + accurate notification metrics vasyansk 2026-07-04 15:56:15 +07:00
  • e9a100ab4a fix(server): drain scheduler on unexpected serve error before exit vasyansk 2026-07-04 15:52:40 +07:00
  • a27ddc79e8 feat(server): graceful scheduler shutdown, /healthz, healthcheck mode vasyansk 2026-07-04 15:46:56 +07:00
  • c265d36bdb docs: plan for tech-debt cleanup + docker compose vasyansk 2026-07-04 15:43:00 +07:00
  • f80d700a83 Merge feature/phase-3: scheduler, notifications (Telegram/Webhook), Prometheus metrics vasyansk 2026-07-04 15:16:58 +07:00
  • 504c4c081f fix(phase3): skip templateless domains in scheduler; block CGNAT range in webhook SSRF guard vasyansk 2026-07-04 14:58:09 +07:00
  • 34422420ca feat(web): расписание, каналы уведомлений, история проверок, drift-badge vasyansk 2026-07-04 14:40:29 +07:00
  • 45259b9720 feat(web,api): клиент/хуки расписания/каналов/истории + lastCheckStatus в domainResponse vasyansk 2026-07-04 14:24:02 +07:00
  • b31f886ae2 feat(server): запуск планировщика, /metrics, graceful shutdown vasyansk 2026-07-04 14:14:00 +07:00
  • 9475af441e fix(scheduler): убрать двойной SaveCheckRun (Checker персистит), SetDrift через CountDriftDomains, resolved после error vasyansk 2026-07-04 14:03:49 +07:00
  • 23e02d6804 feat(scheduler): in-process планировщик проверок + смена статуса + уведомления + метрики vasyansk 2026-07-04 13:53:06 +07:00
  • 070a32717f fix(sec): webhook SSRF-guard через Dialer.Control (закрытие DNS-rebinding TOCTOU) vasyansk 2026-07-04 13:48:22 +07:00
  • 29f448d4b5 fix(sec): санитизация Telegram-ошибок, SSRF-guard Webhook, чистка логов test-канала, go mod tidy, histogram-бакеты vasyansk 2026-07-04 13:40:29 +07:00
  • 5a2903ca1e merge 3 wave: worktree-agent-ab476f3616a493a88 vasyansk 2026-07-04 13:32:02 +07:00
  • d3e83ee81f merge 3 wave: worktree-agent-abf50211e004f196f vasyansk 2026-07-04 13:32:02 +07:00
  • d184b12b29 merge 3 wave: worktree-agent-a23ea3cfa26561e67 vasyansk 2026-07-04 13:32:02 +07:00
  • 7d4bf153d7 feat(api): CRUD расписания/каналов + тест-отправка + история проверок vasyansk 2026-07-04 13:24:50 +07:00
  • e82fb0b13d feat(notify): Telegram/Webhook нотификаторы + Dispatcher по каналам проекта vasyansk 2026-07-04 13:19:21 +07:00
  • 98d8dee413 feat(metrics): Prometheus registry (checks/drift/notifications) + /metrics handler vasyansk 2026-07-04 13:18:58 +07:00
  • 6fd847a909 feat(store): schedules, notification_channels, domain last_check_status + методы vasyansk 2026-07-04 13:10:42 +07:00
  • 1cdb32b747 docs: план реализации Фазы 3 (расписание, уведомления, метрики) vasyansk 2026-07-04 13:02:44 +07:00
  • 6125af4bab docs: детализация дизайна Фазы 3 (расписание, уведомления, метрики) vasyansk 2026-07-04 12:58:59 +07:00
  • 0c21694ec4 merge: Фаза 2 — авторизация vasyansk 2026-07-03 21:40:45 +07:00
  • 901eb51e2a fix(auth): серверная проверка длины пароля, loading-guard и различение ошибок на auth-страницах vasyansk 2026-07-03 21:33:03 +07:00
  • 5a4d560e70 feat(web): Login/Register страницы, protected routes, logout vasyansk 2026-07-03 21:21:29 +07:00
  • 222d6c0453 fix(web): null-guard в мутациях (no active project), AuthContext различает 401 и ошибки сервера vasyansk 2026-07-03 21:07:48 +07:00
  • b5d9e8f7ab feat(web): AuthContext + клиент под cookie-сессии, projectId из контекста vasyansk 2026-07-03 21:00:18 +07:00
  • 4533b0ca25 feat(api): RequireAuth+RequireProjectAccess middleware, IDOR-scope check/apply по projectID vasyansk 2026-07-03 20:47:40 +07:00
  • 35ffe73ae3 fix(auth): wiring Auth/Sessions, нормализация email, GetUserByID для /me, 409 на дубль, timing-guard логина vasyansk 2026-07-03 20:29:05 +07:00
  • aa0ef1c6a9 feat(api): auth-хендлеры register/login/logout/me + session cookie vasyansk 2026-07-03 20:11:00 +07:00
  • a584cf5c37 fix(auth): VerifyPassword валидирует параметры/версию, не паникует на битом хэше vasyansk 2026-07-03 19:58:54 +07:00
  • 12b7945efc feat(auth): argon2id пароли + session store (sha256 токена) vasyansk 2026-07-03 19:50:11 +07:00
  • 3bd237d562 feat(store): миграция sessions/password + методы users/sessions/projects vasyansk 2026-07-03 19:44:36 +07:00
  • bd82fe5509 docs: план реализации Фазы 2 (авторизация) vasyansk 2026-07-03 19:37:27 +07:00
  • fc5d3cdbae docs: детализация дизайна Фазы 2 (авторизация) vasyansk 2026-07-03 19:33:12 +07:00
  • 136708bdf0 merge: Фаза 1C — React SPA vasyansk 2026-07-03 19:17:45 +07:00
  • 4140847a15 fix(web,server): плейсхолдер dist для воспроизводимой сборки + /api без слэша → API vasyansk 2026-07-03 18:24:24 +07:00
  • bba72cc70f feat(web,server): embed статики SPA + fallback, монтирование в cmd/server vasyansk 2026-07-03 18:14:18 +07:00
  • 388bf4aeb6 fix(web): валидация записей шаблона — пустые values не уходят в API, ошибки видимы vasyansk 2026-07-03 18:10:10 +07:00
  • 99e09d35fb feat(web): TemplatesPage + RecordEditor — CRUD шаблонов с редактором записей vasyansk 2026-07-03 18:02:08 +07:00
  • 4e91211a89 feat(web): AccountsPage — CRUD учёток, secret-форма, инструкция Selectel vasyansk 2026-07-03 17:52:59 +07:00
  • ef003230fa fix(web): DomainsPage показывает ошибки привязки шаблона и удаления vasyansk 2026-07-03 17:49:48 +07:00
  • 0ce15d30a8 feat(web): DomainsPage — список, импорт зон, привязка шаблона vasyansk 2026-07-03 17:43:49 +07:00
  • 1412da9a31 feat(web): DiffView + DomainDiffPage с prune-guard по умолчанию выключенным vasyansk 2026-07-03 17:32:20 +07:00
  • 267ffc4ed9 fix(web): Domain.templateId опционален (Go omitempty), String() на error vasyansk 2026-07-03 17:19:51 +07:00
  • 6f82036e38 feat(web): типизированный API-клиент, типы DTO, TanStack Query хуки vasyansk 2026-07-03 17:14:11 +07:00
  • 41242973e1 feat(web): scaffold Vite+React+TS, Tailwind v4, shadcn, router, тёмная console-тема vasyansk 2026-07-03 17:06:23 +07:00
  • 93cbe538e2 docs: план реализации Фазы 1C (React SPA) vasyansk 2026-07-03 16:44:41 +07:00
  • fe85918407 docs: детализация дизайна Фазы 1C (React SPA) vasyansk 2026-07-03 16:40:22 +07:00
  • b329855c28 merge: Фаза 1B — persistence + REST API vasyansk 2026-07-03 15:33:36 +07:00
  • ddab6e2162 fix(store,api): идемпотентный import (UNIQUE+ON CONFLICT) + PATCH привязки шаблона к домену vasyansk 2026-07-03 15:24:08 +07:00
  • 2aca92d070 fix(api): tenant-проверка account/template в CreateDomain (HIGH), атомарный import через транзакцию (MEDIUM) vasyansk 2026-07-03 15:08:16 +07:00
  • ae6a4d7f4c feat(api): CRUD accounts/templates/domains + import зон (полный цикл), secret не в ответах vasyansk 2026-07-03 14:53:29 +07:00
  • 763919d23f feat(server): Loader/Recorder на Store, wiring cmd/server (config→migrate→pool→api) vasyansk 2026-07-03 14:41:09 +07:00
  • 05dc586646 fix(api): 400 на битое тело apply, маскирование internal-ошибок, лимит тела vasyansk 2026-07-03 14:35:43 +07:00
  • fdf90a7c23 feat(api): chi-роутер, check/apply хендлеры, changeset DTO vasyansk 2026-07-03 14:28:06 +07:00
  • 8a2d985197 feat(service): Check/Apply оркестрация с guard на prune vasyansk 2026-07-03 14:22:59 +07:00
  • 635b05361f refactor(store): sqlc override uuid→google/uuid.UUID (убирает pgtype boilerplate) vasyansk 2026-07-03 14:20:03 +07:00