Архитектура

Коротко о том, как Такт устроен внутри — для тех, кому интересно, что под капотом.

Общая схема

  Браузер (Nuxt 4 SPA, Vue 3)
        │  REST / SSE
        ▼
  Nitro (сервер в том же проекте)
        │
   ┌────┼──────────────┐
   ▼    ▼              ▼
 API  сервисы    фоновые задачи (cron)
        │
        ▼
  PostgreSQL + Row-Level Security (изоляция рабочих пространств)

Фронтенд и бэкенд живут в одном проекте: Nuxt отвечает за интерфейс, встроенный в него сервер Nitro — за API, бизнес-логику и фоновые задачи. Всё общается с одной базой PostgreSQL.

Ключевые решения

Модульный монолит, а не микросервисы. Проект развивает один человек, и монолит проще разрабатывать, тестировать и разворачивать. Разделение — по модулям внутри, а не по сетевым сервисам.

Multi-tenancy через Row-Level Security. Изоляция данных между рабочими пространствами обеспечивается на уровне самой базы: политики RLS не дают запросу увидеть чужие строки, даже если в коде закралась ошибка. Прикладная роль базы работает без права обхода RLS — защита включена принудительно.

SSE, а не WebSocket. Обновления в реальном времени (уведомления, изменения на доске) идут через Server-Sent Events — однонаправленного канала «сервер → браузер» здесь достаточно, а он проще двусторонних сокетов.

Фоновые задачи через планировщик Nitro. Периодических задач две: раз в час проверяются правила автоматизаций на всех досках (одна задача вместо трёх прежних сторожей), раз в сутки снимаются снапшоты прогнозов активных спринтов.

Автоматизации как эпизоды. Правило не «стреляет» при каждом совпадении: пока условие держится, открыт один эпизод, когда условие исчезает, эпизод закрывается. Это защищает от спама и даёт историю срабатываний; уникальный индекс на открытых эпизодах не даёт двум параллельным проверкам продублировать уведомление.

Один запрос на остров. Центр управления получает «пульс доски» одним эндпоинтом, который собирает счётчики из существующих функций аналитики, вместо восьми отдельных запросов из браузера.

SPA-режим. Продукт целиком за авторизацией, публичной индексируемой части у приложения нет — поэтому рендер на клиенте, без SSR.

Стек

СлойТехнология
ФронтендNuxt 4 (SPA), Vue 3, Tailwind, Nuxt UI
БэкендNitro / H3 (в том же проекте)
База данныхPostgreSQL + Row-Level Security
ORM / миграцииDrizzle ORM + Drizzle Kit
ВалидацияZod
ГрафикиECharts
Фоновые задачиПланировщик Nitro (cron)

Оговорка: полноценная очередь фоновых задач (pg-boss) — в планах. Она подключится, когда появятся задачи с очередной семантикой (email-дайджесты, повторные попытки доставки); для нынешних периодических задач планировщика Nitro достаточно.