daily update 2026-03-30
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: "30 марта 2026"
|
||||
date: 2026-03-30
|
||||
tags: ["vikunja", "leadera", "tasktracker", "ollama", "qwen", "mtproxy", "infrastructure", "openclaw"]
|
||||
---
|
||||
|
||||
## Timeline
|
||||
|
||||
- **Утро/день** — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)
|
||||
- **День** — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)
|
||||
- **День** — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты
|
||||
- **Вечер** — **Откатили** TaskTracker по просьбе Антона (`git checkout + git clean`): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)
|
||||
- **Вечер** — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено `openclaw models set ollama/qwen3.5:9b` + возврат default на `zai/glm-5.1`
|
||||
- **Вечер** — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер `mtproxy`, порт 8443→443, секрет `9e40ae13999874305c87fd2777758188`
|
||||
- **Вечер** — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через `openclaw devices approve`
|
||||
|
||||
## Vikunja
|
||||
|
||||
- URL: http://192.168.0.37:8095
|
||||
- API token: `tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0`
|
||||
- Проект Leadera: 27 задач из аудита
|
||||
|
||||
## MT Proxy
|
||||
|
||||
- Сервер: 185.234.64.52:8443
|
||||
- Секрет: `9e40ae13999874305c87fd2777758188`
|
||||
- Ссылка: `tg://proxy?server=185.234.64.52&port=8443&secret=9e40ae13999874305c87fd2777758188`
|
||||
|
||||
## Уроки
|
||||
|
||||
- Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие
|
||||
- OpenClaw требует «активации» моделей через CLI, не только конфиг
|
||||
- Plane self-hosted commercial edition проблемный для локального запуска
|
||||
+235
-184
@@ -1,243 +1,294 @@
|
||||
---
|
||||
title: "Аудит Leadera"
|
||||
title: "Аудит Leadera — полный отчёт"
|
||||
date: 2026-03-30
|
||||
tags: ["audit", "leadera", "security", "ux"]
|
||||
lastmod: 2026-03-30
|
||||
tags: ["audit", "leadera", "security", "architecture"]
|
||||
weight: 100
|
||||
---
|
||||
|
||||
## Обзор проекта
|
||||
# Аудит проекта Leadera
|
||||
|
||||
Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:
|
||||
**Дата:** 30.03.2026
|
||||
**Версия:** pre-production, миграции 1–5
|
||||
|
||||
### Бекенд
|
||||
- **Стек:** Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT
|
||||
- **Архитектура:** Clean Architecture с разделением на слои
|
||||
- **Особенности:** RESTful API, автоматические миграции, система ролей через spaces
|
||||
---
|
||||
|
||||
### Фронтенд
|
||||
- **Стек:** Angular 21.1.3, Bootstrap 5, RxJS
|
||||
- **Особенности:** JWT-аутентификация, перехватчики HTTP, lazy loading
|
||||
## 1. Обзор проекта
|
||||
|
||||
## Бекенд — найденные проблемы
|
||||
Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.
|
||||
|
||||
### Критические проблемы
|
||||
### Стек
|
||||
|
||||
#### 1. Уязвимость XSS в сериализации DOM
|
||||
- **Файл:** `internal/handlers/space_handler.go:47-63`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** В методе `GetSpaceMembers` используется `c.BindJSON(&req)` без валидации, что может привести к XSS при сериализации данных в JSON
|
||||
- **Рекомендация:** Добавить валидацию DTO и использование HTML sanitizer
|
||||
| Компонент | Технологии |
|
||||
|-----------|-----------|
|
||||
| Backend | Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256) |
|
||||
| Frontend | Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals |
|
||||
| Инфраструктура | Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru |
|
||||
|
||||
#### 2. Небезопасное хранение токенов
|
||||
- **Файл:** `internal/utils/password.go:19-21`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
|
||||
- **Рекомендация:** Перейти на bcrypt для хэширования refresh токенов
|
||||
### Доменная модель
|
||||
|
||||
#### 3. Отсутствие Rate Limiting
|
||||
- **Файл:** Нет реализации
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
|
||||
- **Рекомендация:** Реализовать middleware для rate limiting
|
||||
```
|
||||
User ──┬── Space (через space_members с role)
|
||||
│
|
||||
└── GanttChart (принадлежит Space)
|
||||
├── GanttSection
|
||||
└── GanttTask
|
||||
```
|
||||
|
||||
### Высокие проблемы
|
||||
**Роли:** admin, editor, viewer — назначаются **на уровне Space** через таблицу `space_members`.
|
||||
|
||||
#### 4. Отсутствие валидации входных данных
|
||||
- **Файл:** `internal/handlers/auth_handler.go:26-32, 52-58`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет строгой валидации email, длинны строк и других параметров запросов
|
||||
- **Рекомендация:** Внедрить библиотеку для валидации (go-playground/validator)
|
||||
### Что реализовано (endpoints)
|
||||
|
||||
#### 5. Отсутствие защиты от CSRF
|
||||
- **Файл:** Нет реализации
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет CSRF-токенов для POST/PUT/DELETE запросов
|
||||
- **Рекомендация:** Реализовать CSRF middleware
|
||||
**Auth (5):** register, login, refresh, change-password, logout
|
||||
**Spaces (9):** CRUD + members CRUD
|
||||
**Gantt Charts (9):** CRUD + archive + members (добавлен, но удалён в миграции 5)
|
||||
**Gantt Sections (5):** CRUD + reorder
|
||||
**Gantt Tasks (4):** CRUD
|
||||
|
||||
#### 6. Потенциальные N+1 запросы
|
||||
- **Файл:** `internal/repository/space_repository.go`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
|
||||
- **Рекомендация:** Добавить правильные индексы и использовать eager loading
|
||||
**Итого: ~32 endpoint**
|
||||
|
||||
### Средние проблемы
|
||||
---
|
||||
|
||||
#### 7. Отсутствие логирования ошибок
|
||||
- **Файл:** `internal/handlers/gantt_handler.go:78-95`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Ошибки валидации не логируются, что затрудняет отладку
|
||||
- **Рекомендация:** Структурированное логирование всех ошибок
|
||||
## 2. Архитектура и качество кода
|
||||
|
||||
#### 8. Жестко закодированные настройки
|
||||
- **Файл:** `internal/middleware/space_middleware.go:121-128`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Статическая проверка subscription status без гибкой конфигурации
|
||||
- **Рекомендация:** Вынести в конфигурацию возможные статусы подписки
|
||||
### 2.1. Backend — структура
|
||||
|
||||
#### 9. Отсутствие ограничений на количество записей
|
||||
- **Файл:** `internal/handlers/gantt_handler.go`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет ограничений на количество задач, разделов или диаграмм на пользователя
|
||||
- **Рекомендация:** Добавить лимиты через middleware
|
||||
```
|
||||
cmd/server/main.go — точка входа
|
||||
internal/
|
||||
domain/ — модели (User, Space, GanttChart, etc.)
|
||||
dto/ — request/response DTO (auth, space, gantt)
|
||||
handlers/ — HTTP handlers (auth, space, gantt)
|
||||
middleware/ — auth, cors, space, gantt, role, logging, recovery
|
||||
repository/ — слой доступа к данным
|
||||
service/ — бизнес-логика
|
||||
config/ — конфигурация (.env)
|
||||
utils/ — jwt, password, response, validation
|
||||
migrations/ — SQL миграции (1-5)
|
||||
```
|
||||
|
||||
### Низкие проблемы
|
||||
**Оценка:** ✅ Чистая layered архитектура. Разделение ответственности чёткое.
|
||||
|
||||
#### 10. Отсутствие валидации для special символов
|
||||
- **Файл:** `internal/utils/validation.go:21-24`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Валидация паролей не включает некоторые специальные символы
|
||||
- **Рекомендация:** Расширить список разрешенных символов
|
||||
### 2.2. Frontend — структура
|
||||
|
||||
#### 11. Отсутствие Health Check для базы данных
|
||||
- **Файл:** `internal/handlers/handler.go`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Health endpoint не проверяет доступность базы данных
|
||||
- **Рекомендация:** Добавить ping к базе данных в health check
|
||||
```
|
||||
src/app/
|
||||
core/auth/ — auth service, interceptor
|
||||
core/models/ — app.model, space.model
|
||||
core/services/ — space.service, space-storage.service
|
||||
pages/auth/ — sign-in, sign-up, reset-pw, etc.
|
||||
pages/gantt/ — компоненты, модалки, сервисы, модели
|
||||
pages/dashboards/ — spaces list, dashboard
|
||||
layouts/ — navbar, topbar, main-layout
|
||||
```
|
||||
|
||||
## Фронтенд — найденные проблемы
|
||||
**Оценка:** ✅ Стандартная Angular-структура. Signals для state management.
|
||||
|
||||
### Критические проблемы
|
||||
### 2.3. Проблемы кода
|
||||
|
||||
#### 1. Хранение JWT токенов в localStorage
|
||||
- **Файл:** `src/app/core/auth/auth.service.ts:25-40`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Токены хранятся в localStorage, уязвимом для XSS атак
|
||||
- **Рекомендация:** Использовать HTTP-only cookies или secure storage
|
||||
| # | Проблема | Критичность | Описание |
|
||||
|---|----------|-------------|----------|
|
||||
| C1 | `\r` в service-файлах | Medium | gantt_service.go, gantt_section_service.go содержат CRLF |
|
||||
| C2 | `main.go:238` — мёртвый код `getUserHandler` | Low | Неиспользуемая функция |
|
||||
| C3 | Swagger не сгенерирован | Medium | Аннотации есть, но `api/` директории нет |
|
||||
| C4 | `RegisterProtectedRoutes` не вызывается в main.go | **Critical** | GET/PUT/DELETE `/spaces/:id` не зарегистрированы |
|
||||
|
||||
#### 2. Отсутствие Content Security Policy (CSP)
|
||||
- **Файл:** `src/index.html`
|
||||
- **Критичность:** **critical**
|
||||
- **Описание:** Нет заголовков CSP для защиты от XSS
|
||||
- **Рекомендация:** Добавить заголовки CSP в HTTP ответы
|
||||
---
|
||||
|
||||
### Высокие проблемы
|
||||
## 3. Права доступа — главный вопрос
|
||||
|
||||
#### 3. Нет валидации форм на стороне клиента
|
||||
- **Файл:** `src/app/pages/auth/components/sign-up/sign-up.component.ts`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Формы не проходят полную валидацию перед отправкой
|
||||
- **Рекомендация:** Реализовать полноценную клиентскую валидацию
|
||||
### 3.1. Текущая реализация
|
||||
|
||||
#### 4. Отсутствие обработки race conditions
|
||||
- **Файл:** `src/app/core/auth/auth.interceptor.ts:15-45`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Потенциальные race conditions при обновлении токенов
|
||||
- **Рекомендация:** Реализовать очередь запросов при обновлении токенов
|
||||
Права назначаются **исключительно через Space**:
|
||||
|
||||
#### 5. Нет ограничений на длину вводимых данных
|
||||
- **Файл:** `src/app/components/forms/gantt-form.component.ts`
|
||||
- **Критичность:** **high**
|
||||
- **Описание:** Пользователь может вводить очень длинные тексты без ограничений
|
||||
- **Рекомендация:** Добавить максимальную длину для полей ввода
|
||||
1. Таблица `space_members` — связка user ↔ space с role (admin/editor/viewer)
|
||||
2. `SpaceMiddleware.RequireSpace()` — проверяет членство и записывает `ContextSpaceRole` в context
|
||||
3. `RoleMiddleware.RequireMinRole()` — проверяет иерархию ролей (admin > editor > viewer)
|
||||
|
||||
### Средние проблемы
|
||||
**Диаграммы Ганта НЕ имеют собственной системы ролей.** Таблица `gantt_chart_members` была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.
|
||||
|
||||
#### 6. Нет proper error handling states
|
||||
- **Файл:** `src/app/layouts/components/navbar/navbar.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет graceful handling ошибок при загрузке данных
|
||||
- **Рекомендация:** Реализовать skeleton loaders и error boundaries
|
||||
### 3.2. Как это работает
|
||||
|
||||
#### 7. Плохая производительность при большом количестве данных
|
||||
- **Файл:** `src/app/pages/dashboard/gantt/gantt-page.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Нет virtual scrolling для больших списков задач
|
||||
- **Рекомендация:** Реализовать virtual scrolling и lazy loading
|
||||
```
|
||||
Запрос → AuthMiddleware (JWT → userID)
|
||||
→ SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole)
|
||||
→ GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID)
|
||||
→ RoleMiddleware.RequireMinRole("editor") (проверяет ContextSpaceRole)
|
||||
```
|
||||
|
||||
#### 8. Отсутствие a11y для некоторых компонентов
|
||||
- **Файл:** `src/app/components/charts/gantt-chart/gantt-chart.component.ts`
|
||||
- **Критичность:** **medium**
|
||||
- **Описание:** Гант-диаграмма не имеет proper ARIA labels
|
||||
- **Рекомендация:** Добавить ARIA атрибуты и keyboard navigation
|
||||
**Это правильно.** Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.
|
||||
|
||||
### Низкие проблемы
|
||||
### 3.3. 🔴 Критическая проблема: Frontend не соответствует Backend
|
||||
|
||||
#### 9. Нет CSRF protection
|
||||
- **Файл:** `src/app/core/auth/auth.interceptor.ts`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Отсутствие CSRF токенов для чувствительных операций
|
||||
- **Рекомендация:** Добавить CSRF токены в заголовки
|
||||
**Frontend `MembersModalComponent`** пытается управлять участниками **диаграммы**:
|
||||
- `ganttService.addMember(chartId, dto)` → `/api/v1/spaces/{spaceId}/gantt-charts/{chartId}/members`
|
||||
- `ganttService.updateMemberRole(chartId, userId, dto)` → `.../members/{userId}`
|
||||
- `ganttService.removeMember(chartId, userId)` → `.../members/{userId}`
|
||||
|
||||
#### 10. Плохая мобильная адаптация
|
||||
- **Файл:** `src/app/styles/gantt.scss`
|
||||
- **Критичность:** **low**
|
||||
- **Описание:** Нет proper responsive design для мобильных устройств
|
||||
- **Рекомендация:** Добавить медиа-запросы и touch-friendly интерфейс
|
||||
**Backend `GanttHandler.RegisterRoutes()` НЕ регистрирует маршруты для members диаграмм.** После удаления `gantt_chart_members` (миграция 5) эти endpoints не существуют.
|
||||
|
||||
## Безопасность
|
||||
**Результат:** модальное окно «Участники диаграммы» на фронтенде **не работает** — все вызовы вернут 404.
|
||||
|
||||
### Обнаруженные уязвимости:
|
||||
### 3.4. 🔴 Проблема: Role fallback
|
||||
|
||||
1. **XSS уязвимости** - Отсутствие валидации входных данных на бэкенде
|
||||
2. **Небезопасное хранение токенов** - Refresh токены используют SHA256 вместо bcrypt
|
||||
3. **Отсутствие rate limiting** - Уязвимость для brute-force атак
|
||||
4. **CSRF уязвимости** - Отсутствие CSRF-токенов
|
||||
5. **Storage vulnerabilities** - localStorage используется для хранения JWT
|
||||
В `role_middleware.go:28-31`:
|
||||
```go
|
||||
role := c.GetString(ContextSpaceRole)
|
||||
if role == "" {
|
||||
role = c.GetString(ContextRole) // fallback на глобальную роль User
|
||||
}
|
||||
```
|
||||
|
||||
### Рекомендации по безопасности:
|
||||
Если `ContextSpaceRole` не установлен, используется **глобальная роль пользователя** (из JWT). Это значит:
|
||||
- Пользователь с `role=admin` в таблице `users` получит admin-доступ к **любому** space, даже если он не член этого space
|
||||
- Но `SpaceMiddleware` проверяет членство раньше, так что в цепочке `RequireSpace() → RequireMinRole()` это не эксплуатируется
|
||||
- Однако если `RequireMinRole()` используется **без** `RequireSpace()` — это дыра
|
||||
|
||||
1. Реализовать Input Validation на всех уровнях
|
||||
2. Перейти на HTTP-only cookies для токенов
|
||||
3. Реализовать rate limiting middleware
|
||||
4. Добавить CSRF protection
|
||||
5. Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
|
||||
6. Реализовать proper logging и мониторинг
|
||||
7. Добавить автоматические тесты безопасности
|
||||
**Рекомендация:** Удалить fallback на `ContextRole`. Если `ContextSpaceRole` пуст — отказывать.
|
||||
|
||||
## UX улучшения
|
||||
### 3.5. Рекомендации по правам доступа
|
||||
|
||||
### Критические улучшения:
|
||||
1. **Удалить модалку участников диаграммы** на фронтенде — она мертва
|
||||
2. **Или** добавить раздел «Участники Space» с возможностью управления ролями через `/spaces/:space_id/members` (эти endpoints работают)
|
||||
3. Удалить fallback на `ContextRole` в `role_middleware.go`
|
||||
4. Добавить проверку: editor не может повысить кого-то до admin (сейчас может — `AddMember` разрешает editor+ назначать любую роль)
|
||||
|
||||
1. **Надежность аутентификации** - Реализовать MFA
|
||||
2. **Уведомления об ошибках** - Лучшее error messaging
|
||||
3. **Прогресс-бары** - Для долгих операций
|
||||
---
|
||||
|
||||
### Высокие улучшения:
|
||||
## 4. Безопасность
|
||||
|
||||
1. **Поиск по проекту** - Быстрый поиск across spaces
|
||||
2. **Drag & Drop** - Для задач и диаграмм
|
||||
3. **Keyboard shortcuts** - Повышение продуктивности
|
||||
4. **Темная тема** - Улучшение UX при длительной работе
|
||||
### 4.1. Критические
|
||||
|
||||
### Средние улучшения:
|
||||
| # | Проблема | Файл | Описание |
|
||||
|---|----------|------|----------|
|
||||
| S1 | JWT Secret = test | `.env` | `JWT_SECRET=test_secret_key_change_in_production` — **это прод-конфиг!** |
|
||||
| S2 | CORS: `*` | `.env` | `CORS_ALLOWED_ORIGINS=*` — любой домен может обращаться к API |
|
||||
| S3 | Пароль БД в .env | `.env` | `DB_PASSWORD=popoloka16` — creds в открытом виде |
|
||||
| S4 | Refresh tokens: SHA256 | `utils/password.go` | SHA256 вместо bcrypt для refresh token hash — быстро брутфорсится |
|
||||
|
||||
1. **Экспорт данных** -多种 форматы
|
||||
2. **Коллаборация в реальном времени** - WebSocket для live updates
|
||||
3. **Шаблоны диаграмм** - Pre-built templates
|
||||
4. **Аналитика и отчеты** - Insights по проектам
|
||||
### 4.2. Высокие
|
||||
|
||||
### Низкие улучшения:
|
||||
| # | Проблема | Описание |
|
||||
|---|----------|----------|
|
||||
| S5 | Нет rate limiting | Brute-force на `/auth/login` без ограничений |
|
||||
| S6 | Нет CSRF protection | API принимает POST/PUT/DELETE без CSRF-токена |
|
||||
| S7 | Нет CSP заголовков | X-Frame-Options, Content-Security-Policy не настроены |
|
||||
| S8 | JWT в localStorage | XSS может украсть access + refresh tokens |
|
||||
|
||||
1. **Mobile app** - iOS/Android приложения
|
||||
2. **Интеграции** - Slack, Teams, Jira и др.
|
||||
3. **API для плагинов** - Расширяемость системы
|
||||
### 4.3. Средние
|
||||
|
||||
## Приоритизированный план исправления
|
||||
| # | Проблема | Описание |
|
||||
|---|----------|----------|
|
||||
| S9 | Нет password policy | Минимальные требования к паролю не enforced |
|
||||
| S10 | Нет audit log | Действия с spaces/charts не логируются для аудита |
|
||||
| S11 | Нет блокировки аккаунта | Неограниченные попытки входа |
|
||||
|
||||
| Приоритет | Проблема | Файлы | Трудоёмкость |
|
||||
|-----------|----------|-------|--------------|
|
||||
| **Critical** | XSS уязвимости | `internal/handlers/*.go` | 3 дня |
|
||||
| **Critical** | Хранение JWT в localStorage | `src/app/core/auth/*.ts` | 1 день |
|
||||
| **Critical** | Небезопасное хранение refresh токенов | `internal/utils/password.go` | 1 день |
|
||||
| **High** | Rate limiting middleware | `internal/middleware/` | 2 дня |
|
||||
| **High** | CSRF protection | `internal/middleware/`, `src/app/core/auth/` | 2 дня |
|
||||
| **High** | Валидация входных данных | `internal/handlers/`, `internal/utils/` | 3 дня |
|
||||
| **Medium** | Оптимизация запросов БД | `internal/repository/` | 2 дня |
|
||||
| **Medium** | Структурированное логирование | `internal/handlers/` | 1 день |
|
||||
| **Low** | CSP заголовки | `src/index.html`, конфигурация сервера | 1 день |
|
||||
| **Low** | A11y улучшения | `src/app/components/` | 3 дня |
|
||||
---
|
||||
|
||||
### Общая оценка:
|
||||
- **Critical issues:** 6 задач, 8 дней
|
||||
- **High issues:** 5 задач, 7 дней
|
||||
- **Medium issues:** 3 задачи, 6 дней
|
||||
- **Low issues:** 4 задачи, 5 дней
|
||||
## 5. Инфраструктура
|
||||
|
||||
**Общая трудоёмкость:** 26 дней разработки + 3 дня на тестирование = 29 дней
|
||||
### 5.1. Текущее состояние
|
||||
|
||||
### Рекомендуемый порядок работы:
|
||||
| Компонент | Статус | Примечание |
|
||||
|-----------|--------|------------|
|
||||
| Go API (pm2: leadera-api) | ⚠️ | Порт 8080, хост 0.0.0.0 |
|
||||
| Angular FE (pm2: leadera-fe) | ⚠️ | Порт 4200, хост 0.0.0.0 |
|
||||
| PostgreSQL (Docker) | ✅ | Порт 5432, контейнер app-leadera-db |
|
||||
| VPS reverse proxy | ⚠️ | sand.a2v.space → 8082/8083, но 502 если сервисы не запущены |
|
||||
| SSL | ✅ | Let's Encrypt на VPS |
|
||||
|
||||
1. **Неделя 1:** Решение всех critical проблем (безопасность)
|
||||
2. **Неделя 2:** High приоритетные улучшения (защита)
|
||||
3. **Неделя 3:** Medium и Low улучшения (качество и UX)
|
||||
### 5.2. Проблемы
|
||||
|
||||
**Примечание:** Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.
|
||||
| # | Проблема | Описание |
|
||||
|---|----------|----------|
|
||||
| I1 | Docker для БД, нативно для API | Несогласованность — API и FE не в Docker |
|
||||
| I2 | Нет health-check в pm2 | API может упасть без перезапуска |
|
||||
| I3 | Нет CI/CD | Ручной деплой через `make run` + pm2 |
|
||||
| I4 | Нет nginx на Mac Studio | FE и API торчат наружу напрямую |
|
||||
|
||||
---
|
||||
|
||||
## 6. Функциональная оценка
|
||||
|
||||
### 6.1. Что работает
|
||||
|
||||
| Функция | Backend | Frontend | Статус |
|
||||
|---------|---------|----------|--------|
|
||||
| Регистрация/логин | ✅ | ✅ | Работает |
|
||||
| JWT auth + refresh | ✅ | ✅ | Работает |
|
||||
| Spaces CRUD | ⚠️ | ✅ | `RegisterProtectedRoutes` не вызван (C4) |
|
||||
| Space members | ✅ | ✅ | Работает |
|
||||
| Gantt charts CRUD | ✅ | ✅ | Работает |
|
||||
| Gantt sections | ✅ | ✅ | Работает |
|
||||
| Gantt tasks | ✅ | ⚠️ | Нет UI для задач внутри диаграммы |
|
||||
| Архивация диаграмм | ✅ | ✅ | Работает |
|
||||
| Members диаграммы | ❌ | ✅ (мёртвый UI) | Backend endpoints не существуют |
|
||||
|
||||
### 6.2. Что НЕ работает или отсутствует
|
||||
|
||||
| Функция | Статус |
|
||||
|---------|--------|
|
||||
| Визуализация Ганта (таймлайн) | ❌ Нет компонента отрисовки |
|
||||
| Drag & Drop задач | ❌ |
|
||||
| Real-time collaboration | ❌ |
|
||||
| Уведомления | ❌ |
|
||||
| Поиск | ❌ |
|
||||
| Экспорт (PDF/Excel) | ❌ |
|
||||
| Email verification | ❌ |
|
||||
| Password reset | Backend есть, UI есть — не проверено |
|
||||
|
||||
### 6.3. Оценка готовности
|
||||
|
||||
**Система на стадии каркаса.** Backend API функционален для CRUD операций, но:
|
||||
- Визуализация Ганта — основная фича — не реализована (нет canvas/SVG рендеринга)
|
||||
- Управление участниками только на уровне Space
|
||||
- Нет CI/CD, тестов, мониторинга
|
||||
|
||||
---
|
||||
|
||||
## 7. Приоритизированный план исправлений
|
||||
|
||||
### Неделя 1 — Критическое (безопасность)
|
||||
|
||||
| Приоритет | Задача | Трудоёмкость |
|
||||
|-----------|--------|--------------|
|
||||
| P0 | Заменить JWT secret на криптостойкий | 1 час |
|
||||
| P0 | Настроить CORS (только sand.a2v.space) | 1 час |
|
||||
| P0 | bcrypt для refresh tokens вместо SHA256 | 2 часа |
|
||||
| P0 | Удалить fallback на ContextRole в role_middleware | 30 мин |
|
||||
| P0 | Исправить `RegisterProtectedRoutes` — зарегистрировать маршруты | 1 час |
|
||||
| P1 | Rate limiting на auth endpoints | 4 часа |
|
||||
| P1 | Editor не может назначать admin роль | 2 часа |
|
||||
|
||||
### Неделя 2 — Архитектура прав
|
||||
|
||||
| Приоритет | Задача | Трудоёмкость |
|
||||
|-----------|--------|--------------|
|
||||
| P1 | Удалить/переписать MembersModalComponent → Space members | 4 часа |
|
||||
| P1 | Добавить страницу управления участниками Space | 8 часов |
|
||||
| P2 | HttpOnly cookies для JWT (вместо localStorage) | 8 часов |
|
||||
| P2 | CSRF protection | 4 часа |
|
||||
|
||||
### Неделя 3 — Функциональность
|
||||
|
||||
| Приоритет | Задача | Трудоёмкость |
|
||||
|-----------|--------|--------------|
|
||||
| P2 | Визуализация Ганта (canvas/d3) | 40+ часов |
|
||||
| P2 | Drag & Drop для задач | 16 часов |
|
||||
| P3 | Тесты (unit + integration) | 24 часа |
|
||||
| P3 | CI/CD pipeline | 8 часов |
|
||||
|
||||
---
|
||||
|
||||
## 8. Резюме
|
||||
|
||||
### Ключевые выводы
|
||||
|
||||
1. **Права доступа** — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления `gantt_chart_members`.
|
||||
2. **Безопасность** — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя.
|
||||
3. **Функциональность** — CRUD работает, но основная ценность (визуализация Ганта) не реализована.
|
||||
4. **Код** — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты.
|
||||
|
||||
### Общая оценка: 🔴 Pre-alpha
|
||||
|
||||
Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.
|
||||
|
||||
Reference in New Issue
Block a user