Лёгкий таск-трекер — аналог YouGile/Trello с Kanban-досками, дорожными картами, рабочими пространствами и workflow-переходами.
Версия: v1.5.0 · Changelog
| Слой | Технология |
|---|---|
| Backend | Node.js 20 · Express 4 · TypeScript 5 |
| ORM | Prisma 6 · PostgreSQL 16 |
| Cache | Redis 7 |
| Frontend | React 18 · Vite 6 · Ant Design 5 · Zustand |
| DnD | @hello-pangea/dnd |
| Auth | JWT (15m access) + Refresh tokens (7d) + SSO (Keycloak / Avanpost) |
| Testing | Vitest · Testing Library · Playwright |
- Kanban-доски — drag-and-drop задач, кастомные workflow-переходы (FORWARD_ONLY / BIDIRECTIONAL / CUSTOM)
- Серверные фильтры — assignee, priority, status, label, due date; параметры синхронизируются с URL
- Дорожные карты — Gantt-подобный вид с зумом (неделя / месяц / квартал), подзадачи раскрывашкой, overdue-индикатор
- Рабочие пространства — приватные/публичные, RBAC (Owner / Member / Viewer), страница настроек
- Подзадачи — до 5 уровней вложенности (materialized path), drawer drill-down
- Массовые операции — выбор задач, batch-изменение статуса/приоритета/исполнителя, массовое удаление
- Глобальный поиск —
Cmd+Kкомандная палитра, поиск задач по заголовку и issueKey - Мои задачи — аккордеон — встроенная панель деталей прямо в списке (описание, статус, дедлайн, исполнитель, теги), синхронизация с URL (
?open=) - Уведомления — @упоминания в задачах и комментариях, уведомление о назначении, email opt-out
- История статусов — сегментные бары изменений в задаче и в дорожной карте
- Счётчики символов — в комментариях и пунктах чеклиста с цветовой индикацией
- Мобильная адаптация — responsive 3-tier (mobile / tablet / desktop), landscape-режим, safe-area для iPhone notch
- Обратная связь — плавающая кнопка FAB на всех страницах, определение устройства
- Администрирование — страница пользователей и статистики, горизонтальный скролл на мобиле
- Human-readable URL — доски по prefix вместо UUID (DEV-1, OPS-42)
- SSO — вход через Keycloak или Avanpost (OIDC/PKCE), JIT-провижининг, режим
SSO_ONLY - Security Hardening — rotating refresh tokens, LRU session eviction, rate-limit (Redis sliding window), structured logger с redact PII, audit log
- API Keys — в профиле пользователя
- Node.js 20+
- Docker & Docker Compose
# 1. Клонировать репозиторий
git clone https://github.com/NovakPAai/flow-tasks.git
cd flow-tasks
# 2. Поднять PostgreSQL + Redis
docker compose up -d
# 3. Установить зависимости + мигрировать БД + seed
make setup
# 4. Запустить backend + frontend
make devПриложение доступно на http://localhost:5174
| Пароль | Роль | |
|---|---|---|
| admin@flowtask.dev | Password1 | Владелец |
| user@flowtask.dev | Password1 | Участник |
Скопируй .env.example → .env в директории backend/:
DATABASE_URL=postgresql://postgres:postgres@localhost:5434/flowtask
REDIS_URL=redis://localhost:6380
JWT_SECRET=flowtask-dev-secret-change-me
JWT_REFRESH_SECRET=flowtask-dev-refresh-secret-change-me
PORT=3101
NODE_ENV=development
# SSO — опционально (кнопка "Войти через SSO" появляется только при SSO_ENABLED=true)
# SSO_ENABLED=true
# SSO_PROVIDER=keycloak # keycloak | avanpost
# SSO_CLIENT_ID=flowtask
# SSO_CLIENT_SECRET=<secret>
# SSO_ISSUER_URL=https://keycloak.example.com/realms/myrealm
# SSO_ONLY=false # true — отключить локальный вход по паролю| Команда | Описание |
|---|---|
make setup |
Docker up + npm install + migrate + seed |
make dev |
Backend (3101) + Frontend (5174) |
make backend |
Только backend |
make frontend |
Только frontend |
make migrate |
Prisma migrate dev |
make seed |
Пересеять БД |
make lint |
ESLint |
make typecheck |
TypeScript проверка |
make sync |
Синхронизация с origin/main |
make pr |
Push + создать PR |
make ship |
sync → lint → push → PR |
make merge |
Squash-merge текущего PR |
POST /api/auth/register
POST /api/auth/login
POST /api/auth/refresh
POST /api/auth/logout
GET /api/auth/me
GET /api/workspaces
POST /api/workspaces
PATCH /api/workspaces/:id
DELETE /api/workspaces/:id
GET /api/workspaces/:id/members
POST /api/workspaces/:id/invite
PATCH /api/workspaces/:id/members/:userId
DELETE /api/workspaces/:id/members/:userId
GET /api/boards
POST /api/boards
PATCH /api/boards/:id
DELETE /api/boards/:id
GET /api/boards/:bid/tasks # query: assigneeId, priority, statusId, labelId, dueBefore, dueAfter
POST /api/boards/:bid/tasks
PATCH /api/boards/:bid/tasks/reorder
PATCH /api/boards/:bid/tasks/bulk # bulk update (status, priority, assignee); max 100 ids
POST /api/boards/:bid/tasks/bulk-delete # bulk delete with subtask cascade; max 100 ids
GET /api/tasks/:id
PATCH /api/tasks/:id
PATCH /api/tasks/:id/move
DELETE /api/tasks/:id
GET /api/tasks/:id/history
GET /api/tasks/:id/subtasks
POST /api/tasks/:id/subtasks
GET /api/workspaces/:wid/labels
POST /api/workspaces/:wid/labels
POST /api/tasks/:tid/labels/:labelId
DELETE /api/tasks/:tid/labels/:labelId
GET /api/tasks/:tid/comments
POST /api/tasks/:tid/comments
PATCH /api/comments/:id
DELETE /api/comments/:id
GET /api/my-tasks
GET /api/roadmap/:boardId
GET /api/search?q=&limit= # global task search, rate-limit 30/min
GET /api/notifications
PATCH /api/notifications/:id/read
POST /api/notifications/read-all
GET /api/users # admin only
GET /api/users/:id/stats # admin only
# На сервере (Ubuntu 22.04 / Astra Linux)
git clone https://github.com/NovakPAai/flow-tasks.git /opt/flow-tasks
cd /opt/flow-tasks
cp backend/.env.example backend/.env
# Отредактировать backend/.env (продакшн-секреты!)
docker compose -f docker-compose.yml up -d
make setupNginx reverse-proxy:
http://localhost:3101→/api- Статика фронта:
npm run build→ раздавать изfrontend/dist
flow-tasks/
├── backend/
│ └── src/
│ ├── modules/ # auth, workspaces, workflows, boards, tasks, labels, comments, history, onboarding, roadmap, users
│ ├── shared/ # middleware (asyncHandler, rate-limit, logger), utils, types
│ └── prisma/ # schema.prisma, migrations, seed.ts
├── frontend/
│ └── src/
│ ├── api/ # axios клиент + типизированные вызовы
│ ├── components/ # AppLayout, TaskCard, TaskDrawer, SubtaskDrawer, FeedbackFAB, RoadmapView, ...
│ ├── hooks/ # useBreakpoint, useIsLandscape, useResponsiveValue
│ ├── pages/ # WorkspacesPage, BoardPage, MyTasksPage, WorkspaceDashboardPage, AdminUsersPage, ...
│ ├── store/ # auth.store, workspace.store (Zustand)
│ └── types/ # TypeScript типы
├── docker-compose.yml
├── Makefile
└── README.md
- Аккордеон в «Мои задачи» (gap-11): детали задачи прямо в списке, синхронизация с URL
- Серверные фильтры доски (gap-02): assignee/priority/status/label/due
- Счётчики символов (gap-06): комментарии и чеклисты, предупреждение при >90%
- Ограничение вложенности подзадач 5 уровней (gap-07)
- Email opt-out + доп. триггеры уведомлений (gap-08): @упоминания в задачах, назначение исполнителя
- Глобальный поиск Cmd+K (gap-09): командная палитра, поиск по задачам
- Массовые операции (gap-10): bulk-update статуса/приоритета/исполнителя и bulk-delete до 100 задач
- Исправлен IDOR для labels, валидация assigneeId в workspace, пагинация комментариев
- Исправлены TypeScript-ошибки (
emitMentionNotifications), обновлены тесты под paginated API
- SSO через Keycloak и Avanpost (OIDC/PKCE), JIT-провижининг, режим SSO_ONLY
- Security Hardening: rotating refresh tokens + LRU session eviction, rate-limit (Redis sliding window), structured logger с redact PII, audit log, SMTP для сброса пароля
- E2E CI: Playwright тесты в CI (PR + main), coverage gates (vitest), RBAC static check
- Исправления: StrictMode double-loadUser, диалог колонок 75vw, seed superadmin flag
- FeedbackFAB плавающая кнопка на всех страницах (включая login/reset), только для авторизованных
- Landscape-адаптация: компактный топбар 40px, safe-area для iPhone notch, viewport-fit=cover
- AdminUsersPage: таблица в горизонтальный скролл на мобиле, hover через React state
- Human-readable URLs для досок (prefix вместо UUID)
- RoadmapView: Gantt с зумом неделя/месяц/квартал, раскрывашки подзадач, overdue-хвост
- SubtaskDrawer drill-down — открытие подзадачи в drawer без переходов
- История статусов: сегментные бары в задаче и в roadmap-тултипе
- Workspace Dashboard: быстрая навигация + активность
- Roadmaps Hub: все доски в виде дорожной карты
- Приватные воркспейсы и доски, настройки доски
- Упрощённая регистрация (Имя + Фамилия) + статистика пользователей (admin)
- API Keys в профиле
- Адаптивная вёрстка — 3-tier breakpoint (mobile/tablet/desktop)
- Паттерны безопасности из Pulsar: asyncHandler, rate-limit, logger
- Dual theme (dark/light), кастомный дизайн без Ant Design компонентов
- Базовые модули: auth, workspaces, boards, tasks, labels, comments, checklists, workflow