From c91e6f07488913107415499c4842612f38e102fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B3=D0=B0=D0=BB=D1=8C=D1=86=D0=BE=D0=B2=20=D0=90?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=BD?= Date: Tue, 31 Mar 2026 00:00:59 +0300 Subject: [PATCH] daily update 2026-03-30 --- content/diary/2026-03-30.md | 33 + content/guides/leadera-audit.md | 419 ++++++----- public/diary/2026-03-29/index.html | 36 +- public/diary/2026-03-30/index.html | 257 +++++++ public/diary/index.html | 62 +- public/diary/index.json | 2 +- public/guides/claw-a2v-space/index.html | 2 +- public/guides/code-a2v-space/index.html | 2 +- public/guides/index.html | 311 +------- public/guides/index.json | 2 +- public/guides/leadera-audit/index.html | 814 ++++++++++++++------- public/guides/sand-a2v-space/index.html | 2 +- public/guides/ssh-tunnels-vps/index.html | 2 +- public/guides/vps-reverse-proxy/index.html | 2 +- public/index.json | 2 +- public/sitemap.xml | 43 +- public/tags/architecture/index.html | 140 ++++ public/tags/architecture/index.xml | 19 + public/tags/audit/index.html | 2 +- public/tags/audit/index.xml | 4 +- public/tags/index.html | 22 +- public/tags/index.xml | 76 +- public/tags/infrastructure/index.html | 2 + public/tags/infrastructure/index.xml | 9 +- public/tags/leadera/index.html | 4 +- public/tags/leadera/index.xml | 11 +- public/tags/mtproxy/index.html | 140 ++++ public/tags/mtproxy/index.xml | 19 + public/tags/ollama/index.html | 2 + public/tags/ollama/index.xml | 9 +- public/tags/openclaw/index.html | 2 + public/tags/openclaw/index.xml | 9 +- public/tags/qwen/index.html | 140 ++++ public/tags/qwen/index.xml | 19 + public/tags/security/index.html | 2 +- public/tags/security/index.xml | 4 +- public/tags/tasktracker/index.html | 140 ++++ public/tags/tasktracker/index.xml | 19 + public/tags/ux/index.html | 2 - public/tags/ux/index.xml | 12 +- public/tags/vikunja/index.html | 140 ++++ public/tags/vikunja/index.xml | 19 + 42 files changed, 2129 insertions(+), 829 deletions(-) create mode 100644 content/diary/2026-03-30.md create mode 100644 public/diary/2026-03-30/index.html create mode 100644 public/tags/architecture/index.html create mode 100644 public/tags/architecture/index.xml create mode 100644 public/tags/mtproxy/index.html create mode 100644 public/tags/mtproxy/index.xml create mode 100644 public/tags/qwen/index.html create mode 100644 public/tags/qwen/index.xml create mode 100644 public/tags/tasktracker/index.html create mode 100644 public/tags/tasktracker/index.xml create mode 100644 public/tags/vikunja/index.html create mode 100644 public/tags/vikunja/index.xml diff --git a/content/diary/2026-03-30.md b/content/diary/2026-03-30.md new file mode 100644 index 0000000..eb0f5b2 --- /dev/null +++ b/content/diary/2026-03-30.md @@ -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 проблемный для локального запуска diff --git a/content/guides/leadera-audit.md b/content/guides/leadera-audit.md index d832633..514307d 100644 --- a/content/guides/leadera-audit.md +++ b/content/guides/leadera-audit.md @@ -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. Проблемы -**Примечание:** Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности. \ No newline at end of file +| # | Проблема | Описание | +|---|----------|----------| +| 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. diff --git a/public/diary/2026-03-29/index.html b/public/diary/2026-03-29/index.html index d7f932a..bcae174 100644 --- a/public/diary/2026-03-29/index.html +++ b/public/diary/2026-03-29/index.html @@ -105,6 +105,24 @@ + + + + + + + + + + + + + + + + + + @@ -113,6 +131,22 @@
Теги
diff --git a/public/diary/2026-03-30/index.html b/public/diary/2026-03-30/index.html new file mode 100644 index 0000000..63b3f50 --- /dev/null +++ b/public/diary/2026-03-30/index.html @@ -0,0 +1,257 @@ + + + + + + 30 марта 2026 — docs.a2v.space + + + + + + + + + + + + + +
+
+ + + + +
+ +
+

30 марта 2026

+

30.03.2026

+ +

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 проблемный для локального запуска
  • +
+ + + +
+ + vikunja + + leadera + + tasktracker + + ollama + + qwen + + mtproxy + + infrastructure + + openclaw + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/public/diary/index.html b/public/diary/index.html index 1d4cc9e..9f55676 100644 --- a/public/diary/index.html +++ b/public/diary/index.html @@ -105,6 +105,24 @@ + + + + + + + + + + + + + + + + + + @@ -113,6 +131,22 @@
Теги
@@ -148,6 +180,32 @@
+
+
30.03.2026
+

30 марта 2026

+ +
+ + vikunja + + leadera + + tasktracker + + ollama + + qwen + + mtproxy + + infrastructure + + openclaw + +
+ +
+
29.03.2026

29 марта 2026

diff --git a/public/diary/index.json b/public/diary/index.json index 242841c..3328353 100644 --- a/public/diary/index.json +++ b/public/diary/index.json @@ -1 +1 @@ -[{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"}] \ No newline at end of file +[{"content":"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\u0026amp;port=8443\u0026amp;secret=9e40ae13999874305c87fd2777758188 Уроки Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие OpenClaw требует «активации» моделей через CLI, не только конфиг Plane self-hosted commercial edition проблемный для локального запуска ","section":"diary","tags":["vikunja","leadera","tasktracker","ollama","qwen","mtproxy","infrastructure","openclaw"],"title":"30 марта 2026","url":"/diary/2026-03-30/"},{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"}] \ No newline at end of file diff --git a/public/guides/claw-a2v-space/index.html b/public/guides/claw-a2v-space/index.html index 5e30d05..df6c51d 100644 --- a/public/guides/claw-a2v-space/index.html +++ b/public/guides/claw-a2v-space/index.html @@ -168,7 +168,7 @@ - + diff --git a/public/guides/code-a2v-space/index.html b/public/guides/code-a2v-space/index.html index 3934c57..1c5412b 100644 --- a/public/guides/code-a2v-space/index.html +++ b/public/guides/code-a2v-space/index.html @@ -168,7 +168,7 @@ - + diff --git a/public/guides/index.html b/public/guides/index.html index 7fe35a2..2a57584 100644 --- a/public/guides/index.html +++ b/public/guides/index.html @@ -168,7 +168,7 @@ - + @@ -211,304 +211,43 @@
-

Аудит Leadera

-

Обзор проекта

-

Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:

-

Бекенд

-
    -
  • Стек: 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. Уязвимость XSS в сериализации DOM

-
    -
  • Файл: internal/handlers/space_handler.go:47-63
  • -
  • Критичность: critical
  • -
  • Описание: В методе GetSpaceMembers используется c.BindJSON(&req) без валидации, что может привести к XSS при сериализации данных в JSON
  • -
  • Рекомендация: Добавить валидацию DTO и использование HTML sanitizer
  • -
-

2. Небезопасное хранение токенов

-
    -
  • Файл: internal/utils/password.go:19-21
  • -
  • Критичность: critical
  • -
  • Описание: Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
  • -
  • Рекомендация: Перейти на bcrypt для хэширования refresh токенов
  • -
-

3. Отсутствие Rate Limiting

-
    -
  • Файл: Нет реализации
  • -
  • Критичность: high
  • -
  • Описание: Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
  • -
  • Рекомендация: Реализовать middleware для rate limiting
  • -
-

Высокие проблемы

-

4. Отсутствие валидации входных данных

-
    -
  • Файл: internal/handlers/auth_handler.go:26-32, 52-58
  • -
  • Критичность: high
  • -
  • Описание: Нет строгой валидации email, длинны строк и других параметров запросов
  • -
  • Рекомендация: Внедрить библиотеку для валидации (go-playground/validator)
  • -
-

5. Отсутствие защиты от CSRF

-
    -
  • Файл: Нет реализации
  • -
  • Критичность: high
  • -
  • Описание: Нет CSRF-токенов для POST/PUT/DELETE запросов
  • -
  • Рекомендация: Реализовать CSRF middleware
  • -
-

6. Потенциальные N+1 запросы

-
    -
  • Файл: internal/repository/space_repository.go
  • -
  • Критичность: high
  • -
  • Описание: Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
  • -
  • Рекомендация: Добавить правильные индексы и использовать eager loading
  • -
-

Средние проблемы

-

7. Отсутствие логирования ошибок

-
    -
  • Файл: internal/handlers/gantt_handler.go:78-95
  • -
  • Критичность: medium
  • -
  • Описание: Ошибки валидации не логируются, что затрудняет отладку
  • -
  • Рекомендация: Структурированное логирование всех ошибок
  • -
-

8. Жестко закодированные настройки

-
    -
  • Файл: internal/middleware/space_middleware.go:121-128
  • -
  • Критичность: medium
  • -
  • Описание: Статическая проверка subscription status без гибкой конфигурации
  • -
  • Рекомендация: Вынести в конфигурацию возможные статусы подписки
  • -
-

9. Отсутствие ограничений на количество записей

-
    -
  • Файл: internal/handlers/gantt_handler.go
  • -
  • Критичность: medium
  • -
  • Описание: Нет ограничений на количество задач, разделов или диаграмм на пользователя
  • -
  • Рекомендация: Добавить лимиты через middleware
  • -
-

Низкие проблемы

-

10. Отсутствие валидации для special символов

-
    -
  • Файл: internal/utils/validation.go:21-24
  • -
  • Критичность: low
  • -
  • Описание: Валидация паролей не включает некоторые специальные символы
  • -
  • Рекомендация: Расширить список разрешенных символов
  • -
-

11. Отсутствие Health Check для базы данных

-
    -
  • Файл: internal/handlers/handler.go
  • -
  • Критичность: low
  • -
  • Описание: Health endpoint не проверяет доступность базы данных
  • -
  • Рекомендация: Добавить ping к базе данных в health check
  • -
-

Фронтенд — найденные проблемы

-

Критические проблемы

-

1. Хранение JWT токенов в localStorage

-
    -
  • Файл: src/app/core/auth/auth.service.ts:25-40
  • -
  • Критичность: critical
  • -
  • Описание: Токены хранятся в localStorage, уязвимом для XSS атак
  • -
  • Рекомендация: Использовать HTTP-only cookies или secure storage
  • -
-

2. Отсутствие Content Security Policy (CSP)

-
    -
  • Файл: src/index.html
  • -
  • Критичность: critical
  • -
  • Описание: Нет заголовков CSP для защиты от XSS
  • -
  • Рекомендация: Добавить заголовки CSP в HTTP ответы
  • -
-

Высокие проблемы

-

3. Нет валидации форм на стороне клиента

-
    -
  • Файл: src/app/pages/auth/components/sign-up/sign-up.component.ts
  • -
  • Критичность: high
  • -
  • Описание: Формы не проходят полную валидацию перед отправкой
  • -
  • Рекомендация: Реализовать полноценную клиентскую валидацию
  • -
-

4. Отсутствие обработки race conditions

-
    -
  • Файл: src/app/core/auth/auth.interceptor.ts:15-45
  • -
  • Критичность: high
  • -
  • Описание: Потенциальные race conditions при обновлении токенов
  • -
  • Рекомендация: Реализовать очередь запросов при обновлении токенов
  • -
-

5. Нет ограничений на длину вводимых данных

-
    -
  • Файл: src/app/components/forms/gantt-form.component.ts
  • -
  • Критичность: high
  • -
  • Описание: Пользователь может вводить очень длинные тексты без ограничений
  • -
  • Рекомендация: Добавить максимальную длину для полей ввода
  • -
-

Средние проблемы

-

6. Нет proper error handling states

-
    -
  • Файл: src/app/layouts/components/navbar/navbar.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Нет graceful handling ошибок при загрузке данных
  • -
  • Рекомендация: Реализовать skeleton loaders и error boundaries
  • -
-

7. Плохая производительность при большом количестве данных

-
    -
  • Файл: src/app/pages/dashboard/gantt/gantt-page.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Нет virtual scrolling для больших списков задач
  • -
  • Рекомендация: Реализовать virtual scrolling и lazy loading
  • -
-

8. Отсутствие a11y для некоторых компонентов

-
    -
  • Файл: src/app/components/charts/gantt-chart/gantt-chart.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Гант-диаграмма не имеет proper ARIA labels
  • -
  • Рекомендация: Добавить ARIA атрибуты и keyboard navigation
  • -
-

Низкие проблемы

-

9. Нет CSRF protection

-
    -
  • Файл: src/app/core/auth/auth.interceptor.ts
  • -
  • Критичность: low
  • -
  • Описание: Отсутствие CSRF токенов для чувствительных операций
  • -
  • Рекомендация: Добавить CSRF токены в заголовки
  • -
-

10. Плохая мобильная адаптация

-
    -
  • Файл: src/app/styles/gantt.scss
  • -
  • Критичность: low
  • -
  • Описание: Нет proper responsive design для мобильных устройств
  • -
  • Рекомендация: Добавить медиа-запросы и touch-friendly интерфейс
  • -
-

Безопасность

-

Обнаруженные уязвимости:

-
    -
  1. XSS уязвимости - Отсутствие валидации входных данных на бэкенде
  2. -
  3. Небезопасное хранение токенов - Refresh токены используют SHA256 вместо bcrypt
  4. -
  5. Отсутствие rate limiting - Уязвимость для brute-force атак
  6. -
  7. CSRF уязвимости - Отсутствие CSRF-токенов
  8. -
  9. Storage vulnerabilities - localStorage используется для хранения JWT
  10. -
-

Рекомендации по безопасности:

-
    -
  1. Реализовать Input Validation на всех уровнях
  2. -
  3. Перейти на HTTP-only cookies для токенов
  4. -
  5. Реализовать rate limiting middleware
  6. -
  7. Добавить CSRF protection
  8. -
  9. Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
  10. -
  11. Реализовать proper logging и мониторинг
  12. -
  13. Добавить автоматические тесты безопасности
  14. -
-

UX улучшения

-

Критические улучшения:

-
    -
  1. Надежность аутентификации - Реализовать MFA
  2. -
  3. Уведомления об ошибках - Лучшее error messaging
  4. -
  5. Прогресс-бары - Для долгих операций
  6. -
-

Высокие улучшения:

-
    -
  1. Поиск по проекту - Быстрый поиск across spaces
  2. -
  3. Drag & Drop - Для задач и диаграмм
  4. -
  5. Keyboard shortcuts - Повышение продуктивности
  6. -
  7. Темная тема - Улучшение UX при длительной работе
  8. -
-

Средние улучшения:

-
    -
  1. Экспорт данных -多种 форматы
  2. -
  3. Коллаборация в реальном времени - WebSocket для live updates
  4. -
  5. Шаблоны диаграмм - Pre-built templates
  6. -
  7. Аналитика и отчеты - Insights по проектам
  8. -
-

Низкие улучшения:

-
    -
  1. Mobile app - iOS/Android приложения
  2. -
  3. Интеграции - Slack, Teams, Jira и др.
  4. -
  5. API для плагинов - Расширяемость системы
  6. -
-

Приоритизированный план исправления

+

Аудит Leadera — полный отчёт

+

Аудит проекта Leadera

+

Дата: 30.03.2026
+Версия: pre-production, миграции 1–5

+
+

1. Обзор проекта

+

Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.

+

Стек

- - - - + + - - - - + + - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
ПриоритетПроблемаФайлыТрудоёмкостьКомпонентТехнологии
CriticalXSS уязвимостиinternal/handlers/*.go3 дняBackendGo 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)
CriticalХранение JWT в localStoragesrc/app/core/auth/*.ts1 деньFrontendAngular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals
CriticalНебезопасное хранение refresh токеновinternal/utils/password.go1 день
HighRate limiting middlewareinternal/middleware/2 дня
HighCSRF protectioninternal/middleware/, src/app/core/auth/2 дня
HighВалидация входных данныхinternal/handlers/, internal/utils/3 дня
MediumОптимизация запросов БДinternal/repository/2 дня
MediumСтруктурированное логированиеinternal/handlers/1 день
LowCSP заголовкиsrc/index.html, конфигурация сервера1 день
LowA11y улучшенияsrc/app/components/3 дняИнфраструктураDocker (Colima), pm2, nginx reverse proxy, VPS reg.ru
-

Общая оценка:

-
    -
  • Critical issues: 6 задач, 8 дней
  • -
  • High issues: 5 задач, 7 дней
  • -
  • Medium issues: 3 задачи, 6 дней
  • -
  • Low issues: 4 задачи, 5 дней
  • -
-

Общая трудоёмкость: 26 дней разработки + 3 дня на тестирование = 29 дней

+

Доменная модель

+
User ──┬── Space (через space_members с role)
+        │
+        └── GanttChart (принадлежит Space)
+              ├── GanttSection
+              └── GanttTask
+

Роли: admin, editor, viewer — назначаются на уровне Space через таблицу space_members.

@@ -518,7 +257,7 @@ security - ux + architecture
diff --git a/public/guides/index.json b/public/guides/index.json index eea8d83..f05dbfd 100644 --- a/public/guides/index.json +++ b/public/guides/index.json @@ -1 +1 @@ -[{"content":"Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:\nБекенд Стек: 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. Уязвимость XSS в сериализации DOM Файл: internal/handlers/space_handler.go:47-63 Критичность: critical Описание: В методе GetSpaceMembers используется c.BindJSON(\u0026amp;req) без валидации, что может привести к XSS при сериализации данных в JSON Рекомендация: Добавить валидацию DTO и использование HTML sanitizer 2. Небезопасное хранение токенов Файл: internal/utils/password.go:19-21 Критичность: critical Описание: Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора Рекомендация: Перейти на bcrypt для хэширования refresh токенов 3. Отсутствие Rate Limiting Файл: Нет реализации Критичность: high Описание: Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак Рекомендация: Реализовать middleware для rate limiting Высокие проблемы 4. Отсутствие валидации входных данных Файл: internal/handlers/auth_handler.go:26-32, 52-58 Критичность: high Описание: Нет строгой валидации email, длинны строк и других параметров запросов Рекомендация: Внедрить библиотеку для валидации (go-playground/validator) 5. Отсутствие защиты от CSRF Файл: Нет реализации Критичность: high Описание: Нет CSRF-токенов для POST/PUT/DELETE запросов Рекомендация: Реализовать CSRF middleware 6. Потенциальные N+1 запросы Файл: internal/repository/space_repository.go Критичность: high Описание: Нет индексов и оптимизации для запросов с JOIN при получении членов spaces Рекомендация: Добавить правильные индексы и использовать eager loading Средние проблемы 7. Отсутствие логирования ошибок Файл: internal/handlers/gantt_handler.go:78-95 Критичность: medium Описание: Ошибки валидации не логируются, что затрудняет отладку Рекомендация: Структурированное логирование всех ошибок 8. Жестко закодированные настройки Файл: internal/middleware/space_middleware.go:121-128 Критичность: medium Описание: Статическая проверка subscription status без гибкой конфигурации Рекомендация: Вынести в конфигурацию возможные статусы подписки 9. Отсутствие ограничений на количество записей Файл: internal/handlers/gantt_handler.go Критичность: medium Описание: Нет ограничений на количество задач, разделов или диаграмм на пользователя Рекомендация: Добавить лимиты через middleware Низкие проблемы 10. Отсутствие валидации для special символов Файл: internal/utils/validation.go:21-24 Критичность: low Описание: Валидация паролей не включает некоторые специальные символы Рекомендация: Расширить список разрешенных символов 11. Отсутствие Health Check для базы данных Файл: internal/handlers/handler.go Критичность: low Описание: Health endpoint не проверяет доступность базы данных Рекомендация: Добавить ping к базе данных в health check Фронтенд — найденные проблемы Критические проблемы 1. Хранение JWT токенов в localStorage Файл: src/app/core/auth/auth.service.ts:25-40 Критичность: critical Описание: Токены хранятся в localStorage, уязвимом для XSS атак Рекомендация: Использовать HTTP-only cookies или secure storage 2. Отсутствие Content Security Policy (CSP) Файл: src/index.html Критичность: critical Описание: Нет заголовков CSP для защиты от XSS Рекомендация: Добавить заголовки CSP в HTTP ответы Высокие проблемы 3. Нет валидации форм на стороне клиента Файл: src/app/pages/auth/components/sign-up/sign-up.component.ts Критичность: high Описание: Формы не проходят полную валидацию перед отправкой Рекомендация: Реализовать полноценную клиентскую валидацию 4. Отсутствие обработки race conditions Файл: src/app/core/auth/auth.interceptor.ts:15-45 Критичность: high Описание: Потенциальные race conditions при обновлении токенов Рекомендация: Реализовать очередь запросов при обновлении токенов 5. Нет ограничений на длину вводимых данных Файл: src/app/components/forms/gantt-form.component.ts Критичность: high Описание: Пользователь может вводить очень длинные тексты без ограничений Рекомендация: Добавить максимальную длину для полей ввода Средние проблемы 6. Нет proper error handling states Файл: src/app/layouts/components/navbar/navbar.component.ts Критичность: medium Описание: Нет graceful handling ошибок при загрузке данных Рекомендация: Реализовать skeleton loaders и error boundaries 7. Плохая производительность при большом количестве данных Файл: src/app/pages/dashboard/gantt/gantt-page.component.ts Критичность: medium Описание: Нет virtual scrolling для больших списков задач Рекомендация: Реализовать virtual scrolling и lazy loading 8. Отсутствие a11y для некоторых компонентов Файл: src/app/components/charts/gantt-chart/gantt-chart.component.ts Критичность: medium Описание: Гант-диаграмма не имеет proper ARIA labels Рекомендация: Добавить ARIA атрибуты и keyboard navigation Низкие проблемы 9. Нет CSRF protection Файл: src/app/core/auth/auth.interceptor.ts Критичность: low Описание: Отсутствие CSRF токенов для чувствительных операций Рекомендация: Добавить CSRF токены в заголовки 10. Плохая мобильная адаптация Файл: src/app/styles/gantt.scss Критичность: low Описание: Нет proper responsive design для мобильных устройств Рекомендация: Добавить медиа-запросы и touch-friendly интерфейс Безопасность Обнаруженные уязвимости: XSS уязвимости - Отсутствие валидации входных данных на бэкенде Небезопасное хранение токенов - Refresh токены используют SHA256 вместо bcrypt Отсутствие rate limiting - Уязвимость для brute-force атак CSRF уязвимости - Отсутствие CSRF-токенов Storage vulnerabilities - localStorage используется для хранения JWT Рекомендации по безопасности: Реализовать Input Validation на всех уровнях Перейти на HTTP-only cookies для токенов Реализовать rate limiting middleware Добавить CSRF protection Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options) Реализовать proper logging и мониторинг Добавить автоматические тесты безопасности UX улучшения Критические улучшения: Надежность аутентификации - Реализовать MFA Уведомления об ошибках - Лучшее error messaging Прогресс-бары - Для долгих операций Высокие улучшения: Поиск по проекту - Быстрый поиск across spaces Drag \u0026amp; Drop - Для задач и диаграмм Keyboard shortcuts - Повышение продуктивности Темная тема - Улучшение UX при длительной работе Средние улучшения: Экспорт данных -多种 форматы Коллаборация в реальном времени - WebSocket для live updates Шаблоны диаграмм - Pre-built templates Аналитика и отчеты - Insights по проектам Низкие улучшения: Mobile app - iOS/Android приложения Интеграции - Slack, Teams, Jira и др. API для плагинов - Расширяемость системы Приоритизированный план исправления Приоритет Проблема Файлы Трудоёмкость 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 дней Общая трудоёмкость: 26 дней разработки + 3 дня на тестирование = 29 дней\nРекомендуемый порядок работы: Неделя 1: Решение всех critical проблем (безопасность) Неделя 2: High приоритетные улучшения (защита) Неделя 3: Medium и Low улучшения (качество и UX) Примечание: Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.\n","section":"guides","tags":["audit","leadera","security","ux"],"title":"Аудит Leadera","url":"/guides/leadera-audit/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"}] \ No newline at end of file +[{"content":"Аудит проекта Leadera Дата: 30.03.2026\nВерсия: pre-production, миграции 1–5\n1. Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.\nСтек Компонент Технологии 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 Доменная модель User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask Роли: admin, editor, viewer — назначаются на уровне Space через таблицу space_members.\nЧто реализовано (endpoints) Auth (5): register, login, refresh, change-password, logout\nSpaces (9): CRUD + members CRUD\nGantt Charts (9): CRUD + archive + members (добавлен, но удалён в миграции 5)\nGantt Sections (5): CRUD + reorder\nGantt Tasks (4): CRUD\nИтого: ~32 endpoint\n2. Архитектура и качество кода 2.1. Backend — структура 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 архитектура. Разделение ответственности чёткое.\n2.2. Frontend — структура 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.\n2.3. Проблемы кода # Проблема Критичность Описание 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 не зарегистрированы 3. Права доступа — главный вопрос 3.1. Текущая реализация Права назначаются исключительно через Space:\nТаблица space_members — связка user ↔ space с role (admin/editor/viewer) SpaceMiddleware.RequireSpace() — проверяет членство и записывает ContextSpaceRole в context RoleMiddleware.RequireMinRole() — проверяет иерархию ролей (admin \u0026gt; editor \u0026gt; viewer) Диаграммы Ганта НЕ имеют собственной системы ролей. Таблица gantt_chart_members была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.\n3.2. Как это работает Запрос → AuthMiddleware (JWT → userID) → SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole) → GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID) → RoleMiddleware.RequireMinRole(\u0026#34;editor\u0026#34;) (проверяет ContextSpaceRole) Это правильно. Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.\n3.3. 🔴 Критическая проблема: Frontend не соответствует Backend Frontend MembersModalComponent пытается управлять участниками диаграммы:\nganttService.addMember(chartId, dto) → /api/v1/spaces/{spaceId}/gantt-charts/{chartId}/members ganttService.updateMemberRole(chartId, userId, dto) → .../members/{userId} ganttService.removeMember(chartId, userId) → .../members/{userId} Backend GanttHandler.RegisterRoutes() НЕ регистрирует маршруты для members диаграмм. После удаления gantt_chart_members (миграция 5) эти endpoints не существуют.\nРезультат: модальное окно «Участники диаграммы» на фронтенде не работает — все вызовы вернут 404.\n3.4. 🔴 Проблема: Role fallback В role_middleware.go:28-31:\nrole := c.GetString(ContextSpaceRole) if role == \u0026#34;\u0026#34; { role = c.GetString(ContextRole) // fallback на глобальную роль User } Если ContextSpaceRole не установлен, используется глобальная роль пользователя (из JWT). Это значит:\nПользователь с role=admin в таблице users получит admin-доступ к любому space, даже если он не член этого space Но SpaceMiddleware проверяет членство раньше, так что в цепочке RequireSpace() → RequireMinRole() это не эксплуатируется Однако если RequireMinRole() используется без RequireSpace() — это дыра Рекомендация: Удалить fallback на ContextRole. Если ContextSpaceRole пуст — отказывать.\n3.5. Рекомендации по правам доступа Удалить модалку участников диаграммы на фронтенде — она мертва Или добавить раздел «Участники Space» с возможностью управления ролями через /spaces/:space_id/members (эти endpoints работают) Удалить fallback на ContextRole в role_middleware.go Добавить проверку: editor не может повысить кого-то до admin (сейчас может — AddMember разрешает editor+ назначать любую роль) 4. Безопасность 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 — быстро брутфорсится 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 4.3. Средние # Проблема Описание S9 Нет password policy Минимальные требования к паролю не enforced S10 Нет audit log Действия с spaces/charts не логируются для аудита S11 Нет блокировки аккаунта Неограниченные попытки входа 5. Инфраструктура 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\u0026rsquo;s Encrypt на VPS 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 \u0026amp; Drop задач ❌ Real-time collaboration ❌ Уведомления ❌ Поиск ❌ Экспорт (PDF/Excel) ❌ Email verification ❌ Password reset Backend есть, UI есть — не проверено 6.3. Оценка готовности Система на стадии каркаса. Backend API функционален для CRUD операций, но:\nВизуализация Ганта — основная фича — не реализована (нет 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 \u0026amp; Drop для задач 16 часов P3 Тесты (unit + integration) 24 часа P3 CI/CD pipeline 8 часов 8. Резюме Ключевые выводы Права доступа — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления gantt_chart_members. Безопасность — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя. Функциональность — CRUD работает, но основная ценность (визуализация Ганта) не реализована. Код — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты. Общая оценка: 🔴 Pre-alpha Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.\n","section":"guides","tags":["audit","leadera","security","architecture"],"title":"Аудит Leadera — полный отчёт","url":"/guides/leadera-audit/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"}] \ No newline at end of file diff --git a/public/guides/leadera-audit/index.html b/public/guides/leadera-audit/index.html index ad6f259..40449c2 100644 --- a/public/guides/leadera-audit/index.html +++ b/public/guides/leadera-audit/index.html @@ -3,7 +3,7 @@ - Аудит Leadera — docs.a2v.space + Аудит Leadera — полный отчёт — docs.a2v.space @@ -168,7 +168,7 @@ - + @@ -204,7 +204,7 @@
-

Аудит Leadera

+

Аудит Leadera — полный отчёт

@@ -215,315 +215,573 @@ security - ux + architecture
-

Обзор проекта

-

Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:

-

Бекенд

-
    -
  • Стек: 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. Уязвимость XSS в сериализации DOM

-
    -
  • Файл: internal/handlers/space_handler.go:47-63
  • -
  • Критичность: critical
  • -
  • Описание: В методе GetSpaceMembers используется c.BindJSON(&req) без валидации, что может привести к XSS при сериализации данных в JSON
  • -
  • Рекомендация: Добавить валидацию DTO и использование HTML sanitizer
  • -
-

2. Небезопасное хранение токенов

-
    -
  • Файл: internal/utils/password.go:19-21
  • -
  • Критичность: critical
  • -
  • Описание: Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
  • -
  • Рекомендация: Перейти на bcrypt для хэширования refresh токенов
  • -
-

3. Отсутствие Rate Limiting

-
    -
  • Файл: Нет реализации
  • -
  • Критичность: high
  • -
  • Описание: Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
  • -
  • Рекомендация: Реализовать middleware для rate limiting
  • -
-

Высокие проблемы

-

4. Отсутствие валидации входных данных

-
    -
  • Файл: internal/handlers/auth_handler.go:26-32, 52-58
  • -
  • Критичность: high
  • -
  • Описание: Нет строгой валидации email, длинны строк и других параметров запросов
  • -
  • Рекомендация: Внедрить библиотеку для валидации (go-playground/validator)
  • -
-

5. Отсутствие защиты от CSRF

-
    -
  • Файл: Нет реализации
  • -
  • Критичность: high
  • -
  • Описание: Нет CSRF-токенов для POST/PUT/DELETE запросов
  • -
  • Рекомендация: Реализовать CSRF middleware
  • -
-

6. Потенциальные N+1 запросы

-
    -
  • Файл: internal/repository/space_repository.go
  • -
  • Критичность: high
  • -
  • Описание: Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
  • -
  • Рекомендация: Добавить правильные индексы и использовать eager loading
  • -
-

Средние проблемы

-

7. Отсутствие логирования ошибок

-
    -
  • Файл: internal/handlers/gantt_handler.go:78-95
  • -
  • Критичность: medium
  • -
  • Описание: Ошибки валидации не логируются, что затрудняет отладку
  • -
  • Рекомендация: Структурированное логирование всех ошибок
  • -
-

8. Жестко закодированные настройки

-
    -
  • Файл: internal/middleware/space_middleware.go:121-128
  • -
  • Критичность: medium
  • -
  • Описание: Статическая проверка subscription status без гибкой конфигурации
  • -
  • Рекомендация: Вынести в конфигурацию возможные статусы подписки
  • -
-

9. Отсутствие ограничений на количество записей

-
    -
  • Файл: internal/handlers/gantt_handler.go
  • -
  • Критичность: medium
  • -
  • Описание: Нет ограничений на количество задач, разделов или диаграмм на пользователя
  • -
  • Рекомендация: Добавить лимиты через middleware
  • -
-

Низкие проблемы

-

10. Отсутствие валидации для special символов

-
    -
  • Файл: internal/utils/validation.go:21-24
  • -
  • Критичность: low
  • -
  • Описание: Валидация паролей не включает некоторые специальные символы
  • -
  • Рекомендация: Расширить список разрешенных символов
  • -
-

11. Отсутствие Health Check для базы данных

-
    -
  • Файл: internal/handlers/handler.go
  • -
  • Критичность: low
  • -
  • Описание: Health endpoint не проверяет доступность базы данных
  • -
  • Рекомендация: Добавить ping к базе данных в health check
  • -
-

Фронтенд — найденные проблемы

-

Критические проблемы

-

1. Хранение JWT токенов в localStorage

-
    -
  • Файл: src/app/core/auth/auth.service.ts:25-40
  • -
  • Критичность: critical
  • -
  • Описание: Токены хранятся в localStorage, уязвимом для XSS атак
  • -
  • Рекомендация: Использовать HTTP-only cookies или secure storage
  • -
-

2. Отсутствие Content Security Policy (CSP)

-
    -
  • Файл: src/index.html
  • -
  • Критичность: critical
  • -
  • Описание: Нет заголовков CSP для защиты от XSS
  • -
  • Рекомендация: Добавить заголовки CSP в HTTP ответы
  • -
-

Высокие проблемы

-

3. Нет валидации форм на стороне клиента

-
    -
  • Файл: src/app/pages/auth/components/sign-up/sign-up.component.ts
  • -
  • Критичность: high
  • -
  • Описание: Формы не проходят полную валидацию перед отправкой
  • -
  • Рекомендация: Реализовать полноценную клиентскую валидацию
  • -
-

4. Отсутствие обработки race conditions

-
    -
  • Файл: src/app/core/auth/auth.interceptor.ts:15-45
  • -
  • Критичность: high
  • -
  • Описание: Потенциальные race conditions при обновлении токенов
  • -
  • Рекомендация: Реализовать очередь запросов при обновлении токенов
  • -
-

5. Нет ограничений на длину вводимых данных

-
    -
  • Файл: src/app/components/forms/gantt-form.component.ts
  • -
  • Критичность: high
  • -
  • Описание: Пользователь может вводить очень длинные тексты без ограничений
  • -
  • Рекомендация: Добавить максимальную длину для полей ввода
  • -
-

Средние проблемы

-

6. Нет proper error handling states

-
    -
  • Файл: src/app/layouts/components/navbar/navbar.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Нет graceful handling ошибок при загрузке данных
  • -
  • Рекомендация: Реализовать skeleton loaders и error boundaries
  • -
-

7. Плохая производительность при большом количестве данных

-
    -
  • Файл: src/app/pages/dashboard/gantt/gantt-page.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Нет virtual scrolling для больших списков задач
  • -
  • Рекомендация: Реализовать virtual scrolling и lazy loading
  • -
-

8. Отсутствие a11y для некоторых компонентов

-
    -
  • Файл: src/app/components/charts/gantt-chart/gantt-chart.component.ts
  • -
  • Критичность: medium
  • -
  • Описание: Гант-диаграмма не имеет proper ARIA labels
  • -
  • Рекомендация: Добавить ARIA атрибуты и keyboard navigation
  • -
-

Низкие проблемы

-

9. Нет CSRF protection

-
    -
  • Файл: src/app/core/auth/auth.interceptor.ts
  • -
  • Критичность: low
  • -
  • Описание: Отсутствие CSRF токенов для чувствительных операций
  • -
  • Рекомендация: Добавить CSRF токены в заголовки
  • -
-

10. Плохая мобильная адаптация

-
    -
  • Файл: src/app/styles/gantt.scss
  • -
  • Критичность: low
  • -
  • Описание: Нет proper responsive design для мобильных устройств
  • -
  • Рекомендация: Добавить медиа-запросы и touch-friendly интерфейс
  • -
-

Безопасность

-

Обнаруженные уязвимости:

+

Аудит проекта Leadera

+

Дата: 30.03.2026
+Версия: pre-production, миграции 1–5

+
+

1. Обзор проекта

+

Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.

+

Стек

+ + + + + + + + + + + + + + + + + + + + + +
КомпонентТехнологии
BackendGo 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)
FrontendAngular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals
ИнфраструктураDocker (Colima), pm2, nginx reverse proxy, VPS reg.ru
+

Доменная модель

+
User ──┬── Space (через space_members с role)
+        │
+        └── GanttChart (принадлежит Space)
+              ├── GanttSection
+              └── GanttTask
+

Роли: admin, editor, viewer — назначаются на уровне Space через таблицу space_members.

+

Что реализовано (endpoints)

+

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

+

Итого: ~32 endpoint

+
+

2. Архитектура и качество кода

+

2.1. Backend — структура

+
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 архитектура. Разделение ответственности чёткое.

+

2.2. Frontend — структура

+
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. Проблемы кода

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ПроблемаКритичностьОписание
C1\r в service-файлахMediumgantt_service.go, gantt_section_service.go содержат CRLF
C2main.go:238 — мёртвый код getUserHandlerLowНеиспользуемая функция
C3Swagger не сгенерированMediumАннотации есть, но api/ директории нет
C4RegisterProtectedRoutes не вызывается в main.goCriticalGET/PUT/DELETE /spaces/:id не зарегистрированы
+
+

3. Права доступа — главный вопрос

+

3.1. Текущая реализация

+

Права назначаются исключительно через Space:

    -
  1. XSS уязвимости - Отсутствие валидации входных данных на бэкенде
  2. -
  3. Небезопасное хранение токенов - Refresh токены используют SHA256 вместо bcrypt
  4. -
  5. Отсутствие rate limiting - Уязвимость для brute-force атак
  6. -
  7. CSRF уязвимости - Отсутствие CSRF-токенов
  8. -
  9. Storage vulnerabilities - localStorage используется для хранения JWT
  10. +
  11. Таблица space_members — связка user ↔ space с role (admin/editor/viewer)
  12. +
  13. SpaceMiddleware.RequireSpace() — проверяет членство и записывает ContextSpaceRole в context
  14. +
  15. RoleMiddleware.RequireMinRole() — проверяет иерархию ролей (admin > editor > viewer)
-

Рекомендации по безопасности:

+

Диаграммы Ганта НЕ имеют собственной системы ролей. Таблица gantt_chart_members была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.

+

3.2. Как это работает

+
Запрос → AuthMiddleware (JWT → userID)
+       → SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole)
+       → GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID)
+       → RoleMiddleware.RequireMinRole("editor") (проверяет ContextSpaceRole)
+

Это правильно. Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.

+

3.3. 🔴 Критическая проблема: Frontend не соответствует Backend

+

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}
  • +
+

Backend GanttHandler.RegisterRoutes() НЕ регистрирует маршруты для members диаграмм. После удаления gantt_chart_members (миграция 5) эти endpoints не существуют.

+

Результат: модальное окно «Участники диаграммы» на фронтенде не работает — все вызовы вернут 404.

+

3.4. 🔴 Проблема: Role fallback

+

В role_middleware.go:28-31:

+
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() — это дыра
  • +
+

Рекомендация: Удалить fallback на ContextRole. Если ContextSpaceRole пуст — отказывать.

+

3.5. Рекомендации по правам доступа

    -
  1. Реализовать Input Validation на всех уровнях
  2. -
  3. Перейти на HTTP-only cookies для токенов
  4. -
  5. Реализовать rate limiting middleware
  6. -
  7. Добавить CSRF protection
  8. -
  9. Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
  10. -
  11. Реализовать proper logging и мониторинг
  12. -
  13. Добавить автоматические тесты безопасности
  14. +
  15. Удалить модалку участников диаграммы на фронтенде — она мертва
  16. +
  17. Или добавить раздел «Участники Space» с возможностью управления ролями через /spaces/:space_id/members (эти endpoints работают)
  18. +
  19. Удалить fallback на ContextRole в role_middleware.go
  20. +
  21. Добавить проверку: editor не может повысить кого-то до admin (сейчас может — AddMember разрешает editor+ назначать любую роль)
-

UX улучшения

-

Критические улучшения:

-
    -
  1. Надежность аутентификации - Реализовать MFA
  2. -
  3. Уведомления об ошибках - Лучшее error messaging
  4. -
  5. Прогресс-бары - Для долгих операций
  6. -
-

Высокие улучшения:

-
    -
  1. Поиск по проекту - Быстрый поиск across spaces
  2. -
  3. Drag & Drop - Для задач и диаграмм
  4. -
  5. Keyboard shortcuts - Повышение продуктивности
  6. -
  7. Темная тема - Улучшение UX при длительной работе
  8. -
-

Средние улучшения:

-
    -
  1. Экспорт данных -多种 форматы
  2. -
  3. Коллаборация в реальном времени - WebSocket для live updates
  4. -
  5. Шаблоны диаграмм - Pre-built templates
  6. -
  7. Аналитика и отчеты - Insights по проектам
  8. -
-

Низкие улучшения:

-
    -
  1. Mobile app - iOS/Android приложения
  2. -
  3. Интеграции - Slack, Teams, Jira и др.
  4. -
  5. API для плагинов - Расширяемость системы
  6. -
-

Приоритизированный план исправления

+
+

4. Безопасность

+

4.1. Критические

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ПроблемаФайлОписание
S1JWT Secret = test.envJWT_SECRET=test_secret_key_change_in_productionэто прод-конфиг!
S2CORS: *.envCORS_ALLOWED_ORIGINS=* — любой домен может обращаться к API
S3Пароль БД в .env.envDB_PASSWORD=popoloka16 — creds в открытом виде
S4Refresh tokens: SHA256utils/password.goSHA256 вместо bcrypt для refresh token hash — быстро брутфорсится
+

4.2. Высокие

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ПроблемаОписание
S5Нет rate limitingBrute-force на /auth/login без ограничений
S6Нет CSRF protectionAPI принимает POST/PUT/DELETE без CSRF-токена
S7Нет CSP заголовковX-Frame-Options, Content-Security-Policy не настроены
S8JWT в localStorageXSS может украсть access + refresh tokens
+

4.3. Средние

+ + + + + + + + + + + + + + + + + + + + + + + + + +
#ПроблемаОписание
S9Нет password policyМинимальные требования к паролю не enforced
S10Нет audit logДействия с spaces/charts не логируются для аудита
S11Нет блокировки аккаунтаНеограниченные попытки входа
+
+

5. Инфраструктура

+

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 если сервисы не запущены
SSLLet’s Encrypt на VPS
+

5.2. Проблемы

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ПроблемаОписание
I1Docker для БД, нативно для APIНесогласованность — API и FE не в Docker
I2Нет health-check в pm2API может упасть без перезапуска
I3Нет CI/CDРучной деплой через make run + pm2
I4Нет nginx на Mac StudioFE и API торчат наружу напрямую
+
+

6. Функциональная оценка

+

6.1. Что работает

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ФункцияBackendFrontendСтатус
Регистрация/логинРаботает
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 resetBackend есть, UI есть — не проверено
+

6.3. Оценка готовности

+

Система на стадии каркаса. Backend API функционален для CRUD операций, но:

+
    +
  • Визуализация Ганта — основная фича — не реализована (нет canvas/SVG рендеринга)
  • +
  • Управление участниками только на уровне Space
  • +
  • Нет CI/CD, тестов, мониторинга
  • +
+
+

7. Приоритизированный план исправлений

+

Неделя 1 — Критическое (безопасность)

- - + - - - - + + + - - - - + + + - - - - + + + - - - - + + + - - - - + + + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - + + +
ПриоритетПроблемаФайлыЗадача Трудоёмкость
CriticalXSS уязвимостиinternal/handlers/*.go3 дняP0Заменить JWT secret на криптостойкий1 час
CriticalХранение JWT в localStoragesrc/app/core/auth/*.ts1 деньP0Настроить CORS (только sand.a2v.space)1 час
CriticalНебезопасное хранение refresh токеновinternal/utils/password.go1 деньP0bcrypt для refresh tokens вместо SHA2562 часа
HighRate limiting middlewareinternal/middleware/2 дняP0Удалить fallback на ContextRole в role_middleware30 мин
HighCSRF protectioninternal/middleware/, src/app/core/auth/2 дняP0Исправить RegisterProtectedRoutes — зарегистрировать маршруты1 час
HighВалидация входных данныхinternal/handlers/, internal/utils/3 дняP1Rate limiting на auth endpoints4 часа
MediumОптимизация запросов БДinternal/repository/2 дня
MediumСтруктурированное логированиеinternal/handlers/1 день
LowCSP заголовкиsrc/index.html, конфигурация сервера1 день
LowA11y улучшенияsrc/app/components/3 дняP1Editor не может назначать admin роль2 часа
-

Общая оценка:

-
    -
  • Critical issues: 6 задач, 8 дней
  • -
  • High issues: 5 задач, 7 дней
  • -
  • Medium issues: 3 задачи, 6 дней
  • -
  • Low issues: 4 задачи, 5 дней
  • -
-

Общая трудоёмкость: 26 дней разработки + 3 дня на тестирование = 29 дней

-

Рекомендуемый порядок работы:

+

Неделя 2 — Архитектура прав

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПриоритетЗадачаТрудоёмкость
P1Удалить/переписать MembersModalComponent → Space members4 часа
P1Добавить страницу управления участниками Space8 часов
P2HttpOnly cookies для JWT (вместо localStorage)8 часов
P2CSRF protection4 часа
+

Неделя 3 — Функциональность

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ПриоритетЗадачаТрудоёмкость
P2Визуализация Ганта (canvas/d3)40+ часов
P2Drag & Drop для задач16 часов
P3Тесты (unit + integration)24 часа
P3CI/CD pipeline8 часов
+
+

8. Резюме

+

Ключевые выводы

    -
  1. Неделя 1: Решение всех critical проблем (безопасность)
  2. -
  3. Неделя 2: High приоритетные улучшения (защита)
  4. -
  5. Неделя 3: Medium и Low улучшения (качество и UX)
  6. +
  7. Права доступа — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления gantt_chart_members.
  8. +
  9. Безопасность — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя.
  10. +
  11. Функциональность — CRUD работает, но основная ценность (визуализация Ганта) не реализована.
  12. +
  13. Код — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты.
-

Примечание: Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.

+

Общая оценка: 🔴 Pre-alpha

+

Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.

diff --git a/public/guides/sand-a2v-space/index.html b/public/guides/sand-a2v-space/index.html index 2922f25..be41802 100644 --- a/public/guides/sand-a2v-space/index.html +++ b/public/guides/sand-a2v-space/index.html @@ -168,7 +168,7 @@ - + diff --git a/public/guides/ssh-tunnels-vps/index.html b/public/guides/ssh-tunnels-vps/index.html index f006fb4..66ae183 100644 --- a/public/guides/ssh-tunnels-vps/index.html +++ b/public/guides/ssh-tunnels-vps/index.html @@ -168,7 +168,7 @@ - + diff --git a/public/guides/vps-reverse-proxy/index.html b/public/guides/vps-reverse-proxy/index.html index 28f8458..50a825c 100644 --- a/public/guides/vps-reverse-proxy/index.html +++ b/public/guides/vps-reverse-proxy/index.html @@ -168,7 +168,7 @@ - + diff --git a/public/index.json b/public/index.json index 853cc0e..18097f9 100644 --- a/public/index.json +++ b/public/index.json @@ -1 +1 @@ -[{"content":"Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:\nБекенд Стек: 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. Уязвимость XSS в сериализации DOM Файл: internal/handlers/space_handler.go:47-63 Критичность: critical Описание: В методе GetSpaceMembers используется c.BindJSON(\u0026amp;req) без валидации, что может привести к XSS при сериализации данных в JSON Рекомендация: Добавить валидацию DTO и использование HTML sanitizer 2. Небезопасное хранение токенов Файл: internal/utils/password.go:19-21 Критичность: critical Описание: Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора Рекомендация: Перейти на bcrypt для хэширования refresh токенов 3. Отсутствие Rate Limiting Файл: Нет реализации Критичность: high Описание: Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак Рекомендация: Реализовать middleware для rate limiting Высокие проблемы 4. Отсутствие валидации входных данных Файл: internal/handlers/auth_handler.go:26-32, 52-58 Критичность: high Описание: Нет строгой валидации email, длинны строк и других параметров запросов Рекомендация: Внедрить библиотеку для валидации (go-playground/validator) 5. Отсутствие защиты от CSRF Файл: Нет реализации Критичность: high Описание: Нет CSRF-токенов для POST/PUT/DELETE запросов Рекомендация: Реализовать CSRF middleware 6. Потенциальные N+1 запросы Файл: internal/repository/space_repository.go Критичность: high Описание: Нет индексов и оптимизации для запросов с JOIN при получении членов spaces Рекомендация: Добавить правильные индексы и использовать eager loading Средние проблемы 7. Отсутствие логирования ошибок Файл: internal/handlers/gantt_handler.go:78-95 Критичность: medium Описание: Ошибки валидации не логируются, что затрудняет отладку Рекомендация: Структурированное логирование всех ошибок 8. Жестко закодированные настройки Файл: internal/middleware/space_middleware.go:121-128 Критичность: medium Описание: Статическая проверка subscription status без гибкой конфигурации Рекомендация: Вынести в конфигурацию возможные статусы подписки 9. Отсутствие ограничений на количество записей Файл: internal/handlers/gantt_handler.go Критичность: medium Описание: Нет ограничений на количество задач, разделов или диаграмм на пользователя Рекомендация: Добавить лимиты через middleware Низкие проблемы 10. Отсутствие валидации для special символов Файл: internal/utils/validation.go:21-24 Критичность: low Описание: Валидация паролей не включает некоторые специальные символы Рекомендация: Расширить список разрешенных символов 11. Отсутствие Health Check для базы данных Файл: internal/handlers/handler.go Критичность: low Описание: Health endpoint не проверяет доступность базы данных Рекомендация: Добавить ping к базе данных в health check Фронтенд — найденные проблемы Критические проблемы 1. Хранение JWT токенов в localStorage Файл: src/app/core/auth/auth.service.ts:25-40 Критичность: critical Описание: Токены хранятся в localStorage, уязвимом для XSS атак Рекомендация: Использовать HTTP-only cookies или secure storage 2. Отсутствие Content Security Policy (CSP) Файл: src/index.html Критичность: critical Описание: Нет заголовков CSP для защиты от XSS Рекомендация: Добавить заголовки CSP в HTTP ответы Высокие проблемы 3. Нет валидации форм на стороне клиента Файл: src/app/pages/auth/components/sign-up/sign-up.component.ts Критичность: high Описание: Формы не проходят полную валидацию перед отправкой Рекомендация: Реализовать полноценную клиентскую валидацию 4. Отсутствие обработки race conditions Файл: src/app/core/auth/auth.interceptor.ts:15-45 Критичность: high Описание: Потенциальные race conditions при обновлении токенов Рекомендация: Реализовать очередь запросов при обновлении токенов 5. Нет ограничений на длину вводимых данных Файл: src/app/components/forms/gantt-form.component.ts Критичность: high Описание: Пользователь может вводить очень длинные тексты без ограничений Рекомендация: Добавить максимальную длину для полей ввода Средние проблемы 6. Нет proper error handling states Файл: src/app/layouts/components/navbar/navbar.component.ts Критичность: medium Описание: Нет graceful handling ошибок при загрузке данных Рекомендация: Реализовать skeleton loaders и error boundaries 7. Плохая производительность при большом количестве данных Файл: src/app/pages/dashboard/gantt/gantt-page.component.ts Критичность: medium Описание: Нет virtual scrolling для больших списков задач Рекомендация: Реализовать virtual scrolling и lazy loading 8. Отсутствие a11y для некоторых компонентов Файл: src/app/components/charts/gantt-chart/gantt-chart.component.ts Критичность: medium Описание: Гант-диаграмма не имеет proper ARIA labels Рекомендация: Добавить ARIA атрибуты и keyboard navigation Низкие проблемы 9. Нет CSRF protection Файл: src/app/core/auth/auth.interceptor.ts Критичность: low Описание: Отсутствие CSRF токенов для чувствительных операций Рекомендация: Добавить CSRF токены в заголовки 10. Плохая мобильная адаптация Файл: src/app/styles/gantt.scss Критичность: low Описание: Нет proper responsive design для мобильных устройств Рекомендация: Добавить медиа-запросы и touch-friendly интерфейс Безопасность Обнаруженные уязвимости: XSS уязвимости - Отсутствие валидации входных данных на бэкенде Небезопасное хранение токенов - Refresh токены используют SHA256 вместо bcrypt Отсутствие rate limiting - Уязвимость для brute-force атак CSRF уязвимости - Отсутствие CSRF-токенов Storage vulnerabilities - localStorage используется для хранения JWT Рекомендации по безопасности: Реализовать Input Validation на всех уровнях Перейти на HTTP-only cookies для токенов Реализовать rate limiting middleware Добавить CSRF protection Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options) Реализовать proper logging и мониторинг Добавить автоматические тесты безопасности UX улучшения Критические улучшения: Надежность аутентификации - Реализовать MFA Уведомления об ошибках - Лучшее error messaging Прогресс-бары - Для долгих операций Высокие улучшения: Поиск по проекту - Быстрый поиск across spaces Drag \u0026amp; Drop - Для задач и диаграмм Keyboard shortcuts - Повышение продуктивности Темная тема - Улучшение UX при длительной работе Средние улучшения: Экспорт данных -多种 форматы Коллаборация в реальном времени - WebSocket для live updates Шаблоны диаграмм - Pre-built templates Аналитика и отчеты - Insights по проектам Низкие улучшения: Mobile app - iOS/Android приложения Интеграции - Slack, Teams, Jira и др. API для плагинов - Расширяемость системы Приоритизированный план исправления Приоритет Проблема Файлы Трудоёмкость 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 дней Общая трудоёмкость: 26 дней разработки + 3 дня на тестирование = 29 дней\nРекомендуемый порядок работы: Неделя 1: Решение всех critical проблем (безопасность) Неделя 2: High приоритетные улучшения (защита) Неделя 3: Medium и Low улучшения (качество и UX) Примечание: Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.\n","section":"guides","tags":["audit","leadera","security","ux"],"title":"Аудит Leadera","url":"/guides/leadera-audit/"},{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"},{"content":"Basic Authentication Username: agaltsovav Password: Magamet787! Конфигурация Nginx server { listen 8091; server_name docs.a2v.space; auth_basic \u0026#34;Restricted Access\u0026#34;; auth_basic_user_file /etc/nginx/.htpasswd; } Доступ URL: https://docs.a2v.space (через reverse proxy) Local: http://localhost:8091 (для разработки) Auth: всегда требуется Мастер-пароль для шифрования Важно: Пароль для расшифровки файлов в разделе creds/\nMaster Password: Popoloka16! Шифрование Алгоритм: AES-256-GCM Хранилище: client-side encryption Файлы шифруются при сохранении Расшифровываются при чтении ","section":"creds","tags":["docs","authentication","nginx"],"title":"docs.a2v.space Basic Auth","url":"/creds/docs-a2v-space-auth/"},{"content":"Docker Compose креды (~/Projects/eversolo-companion/docker-compose.yml) services: postgres: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: eversolo Локальные креды (.env файл) POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_DB=eversolo Хостинг Host: localhost Port: 5433 Database: eversolo Безопасность Используйте разные пароли для production Включите SSL для удаленного подключения Регулярно делайте бэкапы ","section":"creds","tags":["eversolo","companion","postgresql","docker"],"title":"Eversolo Companion PostgreSQL","url":"/creds/eversolo-companion-postgres/"},{"content":"Eversolo T8 — музыкальный стример.\nIP: 192.168.0.156 Порт: 9529 Авторизация: нет\nБазовый URL: http://192.168.0.156:9529\nВоспроизведение Действие URL Play/Pause /ZidooMusicControl/v2/playOrPause Следующий трек /ZidooMusicControl/v2/playNext Предыдущий трек /ZidooMusicControl/v2/playLast Перемотка (ms) /ZidooMusicControl/v2/seekTo?time=\u0026lt;ms\u0026gt; Воспроизвести по ID /ZidooMusicControl/v2/playMusic?type=4\u0026amp;id=\u0026lt;id\u0026gt; Состояние /ZidooMusicControl/v2/getState Громкость Действие URL Громкость вверх /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeUp Громкость вниз /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeDown Точная громкость /ZidooMusicControl/v2/setDevicesVolume?volume=\u0026lt;0-200\u0026gt; Mute /ZidooMusicControl/v2/setMuteVolume?isMute=1 Unmute /ZidooMusicControl/v2/setMuteVolume?isMute=0 Входы/Выходы Действие URL Получить список /ZidooMusicControl/v2/getInputAndOutputList Установить вход /ZidooMusicControl/v2/setInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Установить выход /ZidooMusicControl/v2/setOutInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Теги выхода: RCA, XLRRCA, XLR, HDMI, SPDIF, USB\nДисплей Действие URL Яркость экрана (get) /SystemSettings/displaySettings/getScreenBrightness Яркость экрана (set) /SystemSettings/displaySettings/setScreenBrightness?index=\u0026lt;0-115\u0026gt; Яркость ручки (get) /SystemSettings/displaySettings/getKnobBrightness Яркость ручки (set) /SystemSettings/displaySettings/setKnobBrightness?index=\u0026lt;0-255\u0026gt; VU-режим (get) /SystemSettings/displaySettings/getVUModeList VU-режим (set) /SystemSettings/displaySettings/setVUMode?index=\u0026lt;n\u0026gt; Спектр (get) /SystemSettings/displaySettings/getSpPlayModeList Спектр (set) /SystemSettings/displaySettings/setSpPlayModeList?index=\u0026lt;n\u0026gt; Переключить VU/Спектр `/ZidooMusicControl/v2/changVUDisplay?openType=\u0026lt;0 Питание Действие URL Параметры питания /ZidooMusicControl/v2/getPowerOption Перезагрузка /ZidooMusicControl/v2/setPowerOption?tag=reboot Выключение /ZidooMusicControl/v2/setPowerOption?tag=poweroff Переключить экран /ZidooMusicControl/v2/setPowerOption?tag=screen Включить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.ON Выключить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.OFF Поиск Поиск URL По трекам /ZidooMusicControl/v2/searchMusicV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По артистам /ZidooMusicControl/v2/searchArtistV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По альбомам /ZidooMusicControl/v2/searchAlbumV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 Обложки и устройство Действие URL Обложка по ID /ZidooMusicControl/v2/getImage?id=\u0026lt;song_id\u0026gt;\u0026amp;target=16 Модель устройства /ControlCenter/getModel Источники Zidoo Forum Home Assistant Integration ","section":"kb","tags":["api","eversolo","music","streamer"],"title":"Eversolo T8 API","url":"/kb/eversolo-api/"},{"content":"\nNYVK4PEGwmOHmAnGk8IAUc+lyFJtnEAvX6ZddBro/ILRWHOXBGYywgglFvQZ18BLDLb5DuA8GPAIdB/LwTHRXYO0KsmtlZQVWGEeeXlXAoEXpa5theoOQhebkW6LmiKyNGAVW2z9rK3nz6NnztYdn49LvGMjrHuR4IwCLbl/pYa96CPNRnxGDFlduFi8lMSspM0rBFi/bZhNGhzy36ViCl+aKr5P9cle0ZvM8E8av/6c5JjgDt88QFI3VYdTaTCE0+uHsXlnJN7Qgg/KH7kD\n\n\n","section":"creds","tags":["postgresql","docker-compose","leadera","database"],"title":"Mac Studio — leadera-api БД (docker-compose)","url":"/creds/leadera-db-docker/"},{"content":"\np7Iw7Y3zbj1kLBcbOXGoO27oDwF85AhxBW7saT538hxi0ogJpyFeM49GDuLHzxuyknvdNC/rx3tb4AFnGkCeHSrrCmj+VK8Zxt7ujeujVJSRuOeeUlsqkHdlmaiXl2KQknrIsqVCi3Tnn0V5qcFxvo+1Ktc+surF6bBpWrTHzWV5mLtWVfD6C6kvvP/UFldFBD6v+FQs79yfoOe/j/bUrtpt6v5VndbbBmhUAQcy1BV2rpXxO373dTcLQ6coRWkt/RFo\n\n\n","section":"creds","tags":["postgresql","docker","leadera","database"],"title":"Mac Studio — leadera-api БД (локальная)","url":"/creds/leadera-db-local/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"\nYEI16NAJ78d3lmSa/lca8Zxczt+u6GyMUYHduX47VoFQdj0Ixozd8R6yXoB7eM+AjhCtNGkOxGlOj2s73ABOBjLEIVIhD4Z+xTyzdtah4VpyLoltYOeNYsnbIIFARdF/FBYq5COXohhXs33K5ozznrtDd/awbKMjl/sbQqjXAZ+A3ZSob6/5uU+fFKetXLR6v4ZLAYQ57iiD21ImSLSggwv+rJgK5XyPDKEPD4N5nOsiDrLgoukVBMvgJ54PqfPp2Hni+2tdKOlMnOG2npTuu4SkyALcfFar\n\n\n","section":"creds","tags":["vpn","amnezia","infrastructure"],"title":"VPN VPS","url":"/creds/vpn-vps/"},{"content":"\nIpYXLMtgCFlGQ550DZCLjq37VsnNqL08Rn03iRS7kQ7ozBZNsiZySFzDAvYh4xIHytRDy0Sz0KGUXekr0S+cNiJsmtZ8kj0Pd0JhevhxTMZF2khFvs/LFWoTL5ZwAJ34y/qfLw2gaWX90VZDu0wO+KeAQeXhrWmol/2zUlfWX1AihyYqD2vRz+h2FcjD8ubYOXG35PyX7OlV1HPXgDv5X/bFNrxzPc867UOwB4aGxY9a\n\n\n","section":"creds","tags":["vps","reg.ru","infrastructure"],"title":"VPS reg.ru","url":"/creds/vps-reg-ru/"},{"content":"Описание Завершить разработку Eversolo Companion после решения проблемы с сетевым доступом.\nЧто сделано Backend (Go + Gin): собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17): собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов PostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Спецификация: полная в ~/Projects/eversolo-companion/SPEC.md Проблема API не может достучаться до Eversolo T8 (192.168.0.156:9529) из-за ограничений OpenClaw sandbox.\nВозможные решения Настроить tools.elevated.allowFrom.webchat для разрешения сетевых соединений Запустить API через launchd plist (как SSH туннели) Использовать отдельный контейнер без ограничений Этапы 3-9 (после решения сети) Библиотека синхронизации — двухсторонний sync с Eversolo Плейлисты — импорт/экспорт, редактирование Scrobbler — Last.fm / ListenBrainz Обложки — кэширование, отображение в UI Плеер — улучшенный интерфейс управления Система уведомлений — события от Eversolo Администрирование — настройка подключений Связанные ресурсы Спецификация проекта API документация Дневник разработки ","section":"plans","tags":["eversolo","companion","angular","go","docker"],"title":"Завершить Eversolo Companion - этапы 3-9","url":"/plans/eversolo-companion-phases-3-9/"},{"content":"Описание Добавить поддержку Ollama в OpenClaw для использования локальных LLM моделей.\nПроблема Модель qwen3.5:9b добавлена в конфиг openclaw.json, но не отображается в openclaw models list.\nСтатус Отложено по решению Антона.\n","section":"plans","tags":["ollama","openclaw","llm"],"title":"Настроить интеграцию Ollama с OpenClaw","url":"/plans/ollama-openclaw/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"},{"content":"Описание Добавить инструменты управления Eversolo T8 в OpenClaw.\nЧто сделано Изучен полный API Eversolo T8 (см. Базу знаний) Проблема Sandbox OpenClaw не имеет доступа к локальной сети, где находится Eversolo.\nВозможные решения Настроить проброс портов Запустить OpenClaw без sandbox-ограничений Использовать промежуточный proxy-сервис ","section":"plans","tags":["eversolo","openclaw","api"],"title":"Реализовать управление Eversolo из OpenClaw","url":"/plans/eversolo-control/"}] \ No newline at end of file +[{"content":"Аудит проекта Leadera Дата: 30.03.2026\nВерсия: pre-production, миграции 1–5\n1. Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.\nСтек Компонент Технологии 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 Доменная модель User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask Роли: admin, editor, viewer — назначаются на уровне Space через таблицу space_members.\nЧто реализовано (endpoints) Auth (5): register, login, refresh, change-password, logout\nSpaces (9): CRUD + members CRUD\nGantt Charts (9): CRUD + archive + members (добавлен, но удалён в миграции 5)\nGantt Sections (5): CRUD + reorder\nGantt Tasks (4): CRUD\nИтого: ~32 endpoint\n2. Архитектура и качество кода 2.1. Backend — структура 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 архитектура. Разделение ответственности чёткое.\n2.2. Frontend — структура 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.\n2.3. Проблемы кода # Проблема Критичность Описание 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 не зарегистрированы 3. Права доступа — главный вопрос 3.1. Текущая реализация Права назначаются исключительно через Space:\nТаблица space_members — связка user ↔ space с role (admin/editor/viewer) SpaceMiddleware.RequireSpace() — проверяет членство и записывает ContextSpaceRole в context RoleMiddleware.RequireMinRole() — проверяет иерархию ролей (admin \u0026gt; editor \u0026gt; viewer) Диаграммы Ганта НЕ имеют собственной системы ролей. Таблица gantt_chart_members была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.\n3.2. Как это работает Запрос → AuthMiddleware (JWT → userID) → SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole) → GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID) → RoleMiddleware.RequireMinRole(\u0026#34;editor\u0026#34;) (проверяет ContextSpaceRole) Это правильно. Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.\n3.3. 🔴 Критическая проблема: Frontend не соответствует Backend Frontend MembersModalComponent пытается управлять участниками диаграммы:\nganttService.addMember(chartId, dto) → /api/v1/spaces/{spaceId}/gantt-charts/{chartId}/members ganttService.updateMemberRole(chartId, userId, dto) → .../members/{userId} ganttService.removeMember(chartId, userId) → .../members/{userId} Backend GanttHandler.RegisterRoutes() НЕ регистрирует маршруты для members диаграмм. После удаления gantt_chart_members (миграция 5) эти endpoints не существуют.\nРезультат: модальное окно «Участники диаграммы» на фронтенде не работает — все вызовы вернут 404.\n3.4. 🔴 Проблема: Role fallback В role_middleware.go:28-31:\nrole := c.GetString(ContextSpaceRole) if role == \u0026#34;\u0026#34; { role = c.GetString(ContextRole) // fallback на глобальную роль User } Если ContextSpaceRole не установлен, используется глобальная роль пользователя (из JWT). Это значит:\nПользователь с role=admin в таблице users получит admin-доступ к любому space, даже если он не член этого space Но SpaceMiddleware проверяет членство раньше, так что в цепочке RequireSpace() → RequireMinRole() это не эксплуатируется Однако если RequireMinRole() используется без RequireSpace() — это дыра Рекомендация: Удалить fallback на ContextRole. Если ContextSpaceRole пуст — отказывать.\n3.5. Рекомендации по правам доступа Удалить модалку участников диаграммы на фронтенде — она мертва Или добавить раздел «Участники Space» с возможностью управления ролями через /spaces/:space_id/members (эти endpoints работают) Удалить fallback на ContextRole в role_middleware.go Добавить проверку: editor не может повысить кого-то до admin (сейчас может — AddMember разрешает editor+ назначать любую роль) 4. Безопасность 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 — быстро брутфорсится 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 4.3. Средние # Проблема Описание S9 Нет password policy Минимальные требования к паролю не enforced S10 Нет audit log Действия с spaces/charts не логируются для аудита S11 Нет блокировки аккаунта Неограниченные попытки входа 5. Инфраструктура 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\u0026rsquo;s Encrypt на VPS 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 \u0026amp; Drop задач ❌ Real-time collaboration ❌ Уведомления ❌ Поиск ❌ Экспорт (PDF/Excel) ❌ Email verification ❌ Password reset Backend есть, UI есть — не проверено 6.3. Оценка готовности Система на стадии каркаса. Backend API функционален для CRUD операций, но:\nВизуализация Ганта — основная фича — не реализована (нет 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 \u0026amp; Drop для задач 16 часов P3 Тесты (unit + integration) 24 часа P3 CI/CD pipeline 8 часов 8. Резюме Ключевые выводы Права доступа — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления gantt_chart_members. Безопасность — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя. Функциональность — CRUD работает, но основная ценность (визуализация Ганта) не реализована. Код — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты. Общая оценка: 🔴 Pre-alpha Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.\n","section":"guides","tags":["audit","leadera","security","architecture"],"title":"Аудит Leadera — полный отчёт","url":"/guides/leadera-audit/"},{"content":"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\u0026amp;port=8443\u0026amp;secret=9e40ae13999874305c87fd2777758188 Уроки Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие OpenClaw требует «активации» моделей через CLI, не только конфиг Plane self-hosted commercial edition проблемный для локального запуска ","section":"diary","tags":["vikunja","leadera","tasktracker","ollama","qwen","mtproxy","infrastructure","openclaw"],"title":"30 марта 2026","url":"/diary/2026-03-30/"},{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"},{"content":"Basic Authentication Username: agaltsovav Password: Magamet787! Конфигурация Nginx server { listen 8091; server_name docs.a2v.space; auth_basic \u0026#34;Restricted Access\u0026#34;; auth_basic_user_file /etc/nginx/.htpasswd; } Доступ URL: https://docs.a2v.space (через reverse proxy) Local: http://localhost:8091 (для разработки) Auth: всегда требуется Мастер-пароль для шифрования Важно: Пароль для расшифровки файлов в разделе creds/\nMaster Password: Popoloka16! Шифрование Алгоритм: AES-256-GCM Хранилище: client-side encryption Файлы шифруются при сохранении Расшифровываются при чтении ","section":"creds","tags":["docs","authentication","nginx"],"title":"docs.a2v.space Basic Auth","url":"/creds/docs-a2v-space-auth/"},{"content":"Docker Compose креды (~/Projects/eversolo-companion/docker-compose.yml) services: postgres: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: eversolo Локальные креды (.env файл) POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_DB=eversolo Хостинг Host: localhost Port: 5433 Database: eversolo Безопасность Используйте разные пароли для production Включите SSL для удаленного подключения Регулярно делайте бэкапы ","section":"creds","tags":["eversolo","companion","postgresql","docker"],"title":"Eversolo Companion PostgreSQL","url":"/creds/eversolo-companion-postgres/"},{"content":"Eversolo T8 — музыкальный стример.\nIP: 192.168.0.156 Порт: 9529 Авторизация: нет\nБазовый URL: http://192.168.0.156:9529\nВоспроизведение Действие URL Play/Pause /ZidooMusicControl/v2/playOrPause Следующий трек /ZidooMusicControl/v2/playNext Предыдущий трек /ZidooMusicControl/v2/playLast Перемотка (ms) /ZidooMusicControl/v2/seekTo?time=\u0026lt;ms\u0026gt; Воспроизвести по ID /ZidooMusicControl/v2/playMusic?type=4\u0026amp;id=\u0026lt;id\u0026gt; Состояние /ZidooMusicControl/v2/getState Громкость Действие URL Громкость вверх /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeUp Громкость вниз /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeDown Точная громкость /ZidooMusicControl/v2/setDevicesVolume?volume=\u0026lt;0-200\u0026gt; Mute /ZidooMusicControl/v2/setMuteVolume?isMute=1 Unmute /ZidooMusicControl/v2/setMuteVolume?isMute=0 Входы/Выходы Действие URL Получить список /ZidooMusicControl/v2/getInputAndOutputList Установить вход /ZidooMusicControl/v2/setInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Установить выход /ZidooMusicControl/v2/setOutInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Теги выхода: RCA, XLRRCA, XLR, HDMI, SPDIF, USB\nДисплей Действие URL Яркость экрана (get) /SystemSettings/displaySettings/getScreenBrightness Яркость экрана (set) /SystemSettings/displaySettings/setScreenBrightness?index=\u0026lt;0-115\u0026gt; Яркость ручки (get) /SystemSettings/displaySettings/getKnobBrightness Яркость ручки (set) /SystemSettings/displaySettings/setKnobBrightness?index=\u0026lt;0-255\u0026gt; VU-режим (get) /SystemSettings/displaySettings/getVUModeList VU-режим (set) /SystemSettings/displaySettings/setVUMode?index=\u0026lt;n\u0026gt; Спектр (get) /SystemSettings/displaySettings/getSpPlayModeList Спектр (set) /SystemSettings/displaySettings/setSpPlayModeList?index=\u0026lt;n\u0026gt; Переключить VU/Спектр `/ZidooMusicControl/v2/changVUDisplay?openType=\u0026lt;0 Питание Действие URL Параметры питания /ZidooMusicControl/v2/getPowerOption Перезагрузка /ZidooMusicControl/v2/setPowerOption?tag=reboot Выключение /ZidooMusicControl/v2/setPowerOption?tag=poweroff Переключить экран /ZidooMusicControl/v2/setPowerOption?tag=screen Включить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.ON Выключить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.OFF Поиск Поиск URL По трекам /ZidooMusicControl/v2/searchMusicV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По артистам /ZidooMusicControl/v2/searchArtistV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По альбомам /ZidooMusicControl/v2/searchAlbumV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 Обложки и устройство Действие URL Обложка по ID /ZidooMusicControl/v2/getImage?id=\u0026lt;song_id\u0026gt;\u0026amp;target=16 Модель устройства /ControlCenter/getModel Источники Zidoo Forum Home Assistant Integration ","section":"kb","tags":["api","eversolo","music","streamer"],"title":"Eversolo T8 API","url":"/kb/eversolo-api/"},{"content":"\nNYVK4PEGwmOHmAnGk8IAUc+lyFJtnEAvX6ZddBro/ILRWHOXBGYywgglFvQZ18BLDLb5DuA8GPAIdB/LwTHRXYO0KsmtlZQVWGEeeXlXAoEXpa5theoOQhebkW6LmiKyNGAVW2z9rK3nz6NnztYdn49LvGMjrHuR4IwCLbl/pYa96CPNRnxGDFlduFi8lMSspM0rBFi/bZhNGhzy36ViCl+aKr5P9cle0ZvM8E8av/6c5JjgDt88QFI3VYdTaTCE0+uHsXlnJN7Qgg/KH7kD\n\n\n","section":"creds","tags":["postgresql","docker-compose","leadera","database"],"title":"Mac Studio — leadera-api БД (docker-compose)","url":"/creds/leadera-db-docker/"},{"content":"\np7Iw7Y3zbj1kLBcbOXGoO27oDwF85AhxBW7saT538hxi0ogJpyFeM49GDuLHzxuyknvdNC/rx3tb4AFnGkCeHSrrCmj+VK8Zxt7ujeujVJSRuOeeUlsqkHdlmaiXl2KQknrIsqVCi3Tnn0V5qcFxvo+1Ktc+surF6bBpWrTHzWV5mLtWVfD6C6kvvP/UFldFBD6v+FQs79yfoOe/j/bUrtpt6v5VndbbBmhUAQcy1BV2rpXxO373dTcLQ6coRWkt/RFo\n\n\n","section":"creds","tags":["postgresql","docker","leadera","database"],"title":"Mac Studio — leadera-api БД (локальная)","url":"/creds/leadera-db-local/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"\nYEI16NAJ78d3lmSa/lca8Zxczt+u6GyMUYHduX47VoFQdj0Ixozd8R6yXoB7eM+AjhCtNGkOxGlOj2s73ABOBjLEIVIhD4Z+xTyzdtah4VpyLoltYOeNYsnbIIFARdF/FBYq5COXohhXs33K5ozznrtDd/awbKMjl/sbQqjXAZ+A3ZSob6/5uU+fFKetXLR6v4ZLAYQ57iiD21ImSLSggwv+rJgK5XyPDKEPD4N5nOsiDrLgoukVBMvgJ54PqfPp2Hni+2tdKOlMnOG2npTuu4SkyALcfFar\n\n\n","section":"creds","tags":["vpn","amnezia","infrastructure"],"title":"VPN VPS","url":"/creds/vpn-vps/"},{"content":"\nIpYXLMtgCFlGQ550DZCLjq37VsnNqL08Rn03iRS7kQ7ozBZNsiZySFzDAvYh4xIHytRDy0Sz0KGUXekr0S+cNiJsmtZ8kj0Pd0JhevhxTMZF2khFvs/LFWoTL5ZwAJ34y/qfLw2gaWX90VZDu0wO+KeAQeXhrWmol/2zUlfWX1AihyYqD2vRz+h2FcjD8ubYOXG35PyX7OlV1HPXgDv5X/bFNrxzPc867UOwB4aGxY9a\n\n\n","section":"creds","tags":["vps","reg.ru","infrastructure"],"title":"VPS reg.ru","url":"/creds/vps-reg-ru/"},{"content":"Описание Завершить разработку Eversolo Companion после решения проблемы с сетевым доступом.\nЧто сделано Backend (Go + Gin): собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17): собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов PostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Спецификация: полная в ~/Projects/eversolo-companion/SPEC.md Проблема API не может достучаться до Eversolo T8 (192.168.0.156:9529) из-за ограничений OpenClaw sandbox.\nВозможные решения Настроить tools.elevated.allowFrom.webchat для разрешения сетевых соединений Запустить API через launchd plist (как SSH туннели) Использовать отдельный контейнер без ограничений Этапы 3-9 (после решения сети) Библиотека синхронизации — двухсторонний sync с Eversolo Плейлисты — импорт/экспорт, редактирование Scrobbler — Last.fm / ListenBrainz Обложки — кэширование, отображение в UI Плеер — улучшенный интерфейс управления Система уведомлений — события от Eversolo Администрирование — настройка подключений Связанные ресурсы Спецификация проекта API документация Дневник разработки ","section":"plans","tags":["eversolo","companion","angular","go","docker"],"title":"Завершить Eversolo Companion - этапы 3-9","url":"/plans/eversolo-companion-phases-3-9/"},{"content":"Описание Добавить поддержку Ollama в OpenClaw для использования локальных LLM моделей.\nПроблема Модель qwen3.5:9b добавлена в конфиг openclaw.json, но не отображается в openclaw models list.\nСтатус Отложено по решению Антона.\n","section":"plans","tags":["ollama","openclaw","llm"],"title":"Настроить интеграцию Ollama с OpenClaw","url":"/plans/ollama-openclaw/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"},{"content":"Описание Добавить инструменты управления Eversolo T8 в OpenClaw.\nЧто сделано Изучен полный API Eversolo T8 (см. Базу знаний) Проблема Sandbox OpenClaw не имеет доступа к локальной сети, где находится Eversolo.\nВозможные решения Настроить проброс портов Запустить OpenClaw без sandbox-ограничений Использовать промежуточный proxy-сервис ","section":"plans","tags":["eversolo","openclaw","api"],"title":"Реализовать управление Eversolo из OpenClaw","url":"/plans/eversolo-control/"}] \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index 4a1767c..c48b810 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,17 +2,44 @@ + /guides/leadera-audit/ + 2026-03-30T00:00:00+00:00 + + /diary/2026-03-30/ + 2026-03-30T00:00:00+00:00 + + /tags/architecture/ + 2026-03-30T00:00:00+00:00 + /tags/audit/ 2026-03-30T00:00:00+00:00 + + /diary/ + 2026-03-30T00:00:00+00:00 / 2026-03-30T00:00:00+00:00 /guides/ 2026-03-30T00:00:00+00:00 + + /tags/infrastructure/ + 2026-03-30T00:00:00+00:00 /tags/leadera/ 2026-03-30T00:00:00+00:00 + + /tags/mtproxy/ + 2026-03-30T00:00:00+00:00 + + /tags/ollama/ + 2026-03-30T00:00:00+00:00 + + /tags/openclaw/ + 2026-03-30T00:00:00+00:00 + + /tags/qwen/ + 2026-03-30T00:00:00+00:00 /tags/security/ 2026-03-30T00:00:00+00:00 @@ -20,10 +47,10 @@ /tags/ 2026-03-30T00:00:00+00:00 - /tags/ux/ + /tags/tasktracker/ 2026-03-30T00:00:00+00:00 - /guides/leadera-audit/ + /tags/vikunja/ 2026-03-30T00:00:00+00:00 /diary/2026-03-29/ @@ -52,9 +79,6 @@ /tags/devops/ 2026-03-29T00:00:00+00:00 - - /diary/ - 2026-03-29T00:00:00+00:00 /tags/docker/ 2026-03-29T00:00:00+00:00 @@ -85,9 +109,6 @@ /tags/identity/ 2026-03-29T00:00:00+00:00 - - /tags/infrastructure/ - 2026-03-29T00:00:00+00:00 /kb/ 2026-03-29T00:00:00+00:00 @@ -106,12 +127,6 @@ /tags/nginx/ 2026-03-29T00:00:00+00:00 - - /tags/ollama/ - 2026-03-29T00:00:00+00:00 - - /tags/openclaw/ - 2026-03-29T00:00:00+00:00 /tags/opencode/ 2026-03-29T00:00:00+00:00 diff --git a/public/tags/architecture/index.html b/public/tags/architecture/index.html new file mode 100644 index 0000000..264b471 --- /dev/null +++ b/public/tags/architecture/index.html @@ -0,0 +1,140 @@ + + + + + + Architecture — docs.a2v.space + + + + + + + + + + + + + +
+
+ + + + +
+ +
+

Architecture

+ + + +
+ +
+
+
+ +
+
+

© 2026 docs.a2v.space

+
+
+ + + + + + + + + + + + + + + diff --git a/public/tags/architecture/index.xml b/public/tags/architecture/index.xml new file mode 100644 index 0000000..0d39ee3 --- /dev/null +++ b/public/tags/architecture/index.xml @@ -0,0 +1,19 @@ + + + + Architecture on docs.a2v.space + /tags/architecture/ + Recent content in Architecture on docs.a2v.space + Hugo + ru-ru + Mon, 30 Mar 2026 00:00:00 +0000 + + + Аудит Leadera — полный отчёт + /guides/leadera-audit/ + Mon, 30 Mar 2026 00:00:00 +0000 + /guides/leadera-audit/ + <h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1> <p><strong>Дата:</strong> 30.03.2026<br> <strong>Версия:</strong> pre-production, миграции 1–5</p> <hr> <h2 id="1-обзор-проекта">1. Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p> <h3 id="стек">Стек</h3> <table> <thead> <tr> <th>Компонент</th> <th>Технологии</th> </tr> </thead> <tbody> <tr> <td>Backend</td> <td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td> </tr> <tr> <td>Frontend</td> <td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td> </tr> <tr> <td>Инфраструктура</td> <td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td> </tr> </tbody> </table> <h3 id="доменная-модель">Доменная модель</h3> <pre tabindex="0"><code>User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask </code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p> + + + diff --git a/public/tags/audit/index.html b/public/tags/audit/index.html index 70ff883..e359edb 100644 --- a/public/tags/audit/index.html +++ b/public/tags/audit/index.html @@ -109,7 +109,7 @@
diff --git a/public/tags/audit/index.xml b/public/tags/audit/index.xml index 3c89a1c..1983836 100644 --- a/public/tags/audit/index.xml +++ b/public/tags/audit/index.xml @@ -9,11 +9,11 @@ Mon, 30 Mar 2026 00:00:00 +0000 - Аудит Leadera + Аудит Leadera — полный отчёт /guides/leadera-audit/ Mon, 30 Mar 2026 00:00:00 +0000 /guides/leadera-audit/ - <h2 id="обзор-проекта">Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p> <h3 id="бекенд">Бекенд</h3> <ul> <li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li> <li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li> <li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li> </ul> <h3 id="фронтенд">Фронтенд</h3> <ul> <li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li> <li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li> </ul> <h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2> <h3 id="критические-проблемы">Критические проблемы</h3> <h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li> <li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li> </ul> <h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li> <li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li> </ul> <h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li> <li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li> </ul> <h3 id="высокие-проблемы">Высокие проблемы</h3> <h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li> <li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li> </ul> <h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li> <li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li> </ul> <h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4> <ul> <li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li> <li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li> </ul> <h3 id="средние-проблемы">Средние проблемы</h3> <h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li> <li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li> </ul> <h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4> <ul> <li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li> <li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li> </ul> <h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li> <li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li> </ul> <h3 id="низкие-проблемы">Низкие проблемы</h3> <h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li> <li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li> </ul> <h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li> <li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li> </ul> <h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2> <h3 id="критические-проблемы-1">Критические проблемы</h3> <h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li> <li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li> </ul> <h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4> <ul> <li><strong>Файл:</strong> <code>src/index.html</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li> <li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li> </ul> <h3 id="высокие-проблемы-1">Высокие проблемы</h3> <h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li> <li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li> </ul> <h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li> <li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li> </ul> <h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li> <li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li> </ul> <h3 id="средние-проблемы-1">Средние проблемы</h3> <h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4> <ul> <li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li> <li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li> </ul> <h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li> <li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li> </ul> <h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li> <li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li> </ul> <h3 id="низкие-проблемы-1">Низкие проблемы</h3> <h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li> <li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li> </ul> <h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4> <ul> <li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li> <li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li> </ul> <h2 id="безопасность">Безопасность</h2> <h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3> <ol> <li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li> <li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li> <li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li> <li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li> <li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li> </ol> <h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3> <ol> <li>Реализовать Input Validation на всех уровнях</li> <li>Перейти на HTTP-only cookies для токенов</li> <li>Реализовать rate limiting middleware</li> <li>Добавить CSRF protection</li> <li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li> <li>Реализовать proper logging и мониторинг</li> <li>Добавить автоматические тесты безопасности</li> </ol> <h2 id="ux-улучшения">UX улучшения</h2> <h3 id="критические-улучшения">Критические улучшения:</h3> <ol> <li><strong>Надежность аутентификации</strong> - Реализовать MFA</li> <li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li> <li><strong>Прогресс-бары</strong> - Для долгих операций</li> </ol> <h3 id="высокие-улучшения">Высокие улучшения:</h3> <ol> <li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li> <li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li> <li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li> <li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li> </ol> <h3 id="средние-улучшения">Средние улучшения:</h3> <ol> <li><strong>Экспорт данных</strong> -多种 форматы</li> <li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li> <li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li> <li><strong>Аналитика и отчеты</strong> - Insights по проектам</li> </ol> <h3 id="низкие-улучшения">Низкие улучшения:</h3> <ol> <li><strong>Mobile app</strong> - iOS/Android приложения</li> <li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li> <li><strong>API для плагинов</strong> - Расширяемость системы</li> </ol> <h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2> <table> <thead> <tr> <th>Приоритет</th> <th>Проблема</th> <th>Файлы</th> <th>Трудоёмкость</th> </tr> </thead> <tbody> <tr> <td><strong>Critical</strong></td> <td>XSS уязвимости</td> <td><code>internal/handlers/*.go</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Хранение JWT в localStorage</td> <td><code>src/app/core/auth/*.ts</code></td> <td>1 день</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Небезопасное хранение refresh токенов</td> <td><code>internal/utils/password.go</code></td> <td>1 день</td> </tr> <tr> <td><strong>High</strong></td> <td>Rate limiting middleware</td> <td><code>internal/middleware/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>CSRF protection</td> <td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>Валидация входных данных</td> <td><code>internal/handlers/</code>, <code>internal/utils/</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Оптимизация запросов БД</td> <td><code>internal/repository/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Структурированное логирование</td> <td><code>internal/handlers/</code></td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>CSP заголовки</td> <td><code>src/index.html</code>, конфигурация сервера</td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>A11y улучшения</td> <td><code>src/app/components/</code></td> <td>3 дня</td> </tr> </tbody> </table> <h3 id="общая-оценка">Общая оценка:</h3> <ul> <li><strong>Critical issues:</strong> 6 задач, 8 дней</li> <li><strong>High issues:</strong> 5 задач, 7 дней</li> <li><strong>Medium issues:</strong> 3 задачи, 6 дней</li> <li><strong>Low issues:</strong> 4 задачи, 5 дней</li> </ul> <p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p> + <h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1> <p><strong>Дата:</strong> 30.03.2026<br> <strong>Версия:</strong> pre-production, миграции 1–5</p> <hr> <h2 id="1-обзор-проекта">1. Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p> <h3 id="стек">Стек</h3> <table> <thead> <tr> <th>Компонент</th> <th>Технологии</th> </tr> </thead> <tbody> <tr> <td>Backend</td> <td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td> </tr> <tr> <td>Frontend</td> <td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td> </tr> <tr> <td>Инфраструктура</td> <td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td> </tr> </tbody> </table> <h3 id="доменная-модель">Доменная модель</h3> <pre tabindex="0"><code>User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask </code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p> diff --git a/public/tags/index.html b/public/tags/index.html index c31bf1b..790ec28 100644 --- a/public/tags/index.html +++ b/public/tags/index.html @@ -109,13 +109,27 @@
    +
  • Architecture
  • +
  • Audit
  • +
  • Infrastructure
  • +
  • Leadera
  • +
  • Mtproxy
  • + +
  • Ollama
  • + +
  • Openclaw
  • + +
  • Qwen
  • +
  • Security
  • -
  • Ux
  • +
  • Tasktracker
  • + +
  • Vikunja
  • Amnezia
  • @@ -145,18 +159,12 @@
  • Identity
  • -
  • Infrastructure
  • -
  • Llm
  • Music
  • Nginx
  • -
  • Ollama
  • - -
  • Openclaw
  • -
  • Opencode
  • Postgresql
  • diff --git a/public/tags/index.xml b/public/tags/index.xml index 0491551..df8a626 100644 --- a/public/tags/index.xml +++ b/public/tags/index.xml @@ -8,6 +8,13 @@ ru-ru Mon, 30 Mar 2026 00:00:00 +0000 + + Architecture + /tags/architecture/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/architecture/ + + Audit /tags/audit/ @@ -15,6 +22,13 @@ /tags/audit/ + + Infrastructure + /tags/infrastructure/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/infrastructure/ + + Leadera /tags/leadera/ @@ -22,6 +36,34 @@ /tags/leadera/ + + Mtproxy + /tags/mtproxy/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/mtproxy/ + + + + Ollama + /tags/ollama/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/ollama/ + + + + Openclaw + /tags/openclaw/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/openclaw/ + + + + Qwen + /tags/qwen/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/qwen/ + + Security /tags/security/ @@ -30,10 +72,17 @@ - Ux - /tags/ux/ + Tasktracker + /tags/tasktracker/ Mon, 30 Mar 2026 00:00:00 +0000 - /tags/ux/ + /tags/tasktracker/ + + + + Vikunja + /tags/vikunja/ + Mon, 30 Mar 2026 00:00:00 +0000 + /tags/vikunja/ @@ -134,13 +183,6 @@ /tags/identity/ - - Infrastructure - /tags/infrastructure/ - Sun, 29 Mar 2026 00:00:00 +0000 - /tags/infrastructure/ - - Llm /tags/llm/ @@ -162,20 +204,6 @@ /tags/nginx/ - - Ollama - /tags/ollama/ - Sun, 29 Mar 2026 00:00:00 +0000 - /tags/ollama/ - - - - Openclaw - /tags/openclaw/ - Sun, 29 Mar 2026 00:00:00 +0000 - /tags/openclaw/ - - Opencode /tags/opencode/ diff --git a/public/tags/infrastructure/index.html b/public/tags/infrastructure/index.html index 3db3e48..6348988 100644 --- a/public/tags/infrastructure/index.html +++ b/public/tags/infrastructure/index.html @@ -109,6 +109,8 @@
      +
    • 30 марта 2026
    • +
    • 29 марта 2026
    • VPN VPS
    • diff --git a/public/tags/infrastructure/index.xml b/public/tags/infrastructure/index.xml index 6abd460..7b4120a 100644 --- a/public/tags/infrastructure/index.xml +++ b/public/tags/infrastructure/index.xml @@ -6,8 +6,15 @@ Recent content in Infrastructure on docs.a2v.space Hugo ru-ru - Sun, 29 Mar 2026 00:00:00 +0000 + Mon, 30 Mar 2026 00:00:00 +0000 + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + 29 марта 2026 /diary/2026-03-29/ diff --git a/public/tags/leadera/index.html b/public/tags/leadera/index.html index 458b8ac..c40ac73 100644 --- a/public/tags/leadera/index.html +++ b/public/tags/leadera/index.html @@ -109,7 +109,9 @@
        -
      • Аудит Leadera
      • +
      • Аудит Leadera — полный отчёт
      • + +
      • 30 марта 2026
      • Mac Studio — leadera-api БД (docker-compose)
      • diff --git a/public/tags/leadera/index.xml b/public/tags/leadera/index.xml index 9ac57e8..82592e9 100644 --- a/public/tags/leadera/index.xml +++ b/public/tags/leadera/index.xml @@ -9,11 +9,18 @@ Mon, 30 Mar 2026 00:00:00 +0000 - Аудит Leadera + Аудит Leadera — полный отчёт /guides/leadera-audit/ Mon, 30 Mar 2026 00:00:00 +0000 /guides/leadera-audit/ - <h2 id="обзор-проекта">Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p> <h3 id="бекенд">Бекенд</h3> <ul> <li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li> <li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li> <li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li> </ul> <h3 id="фронтенд">Фронтенд</h3> <ul> <li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li> <li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li> </ul> <h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2> <h3 id="критические-проблемы">Критические проблемы</h3> <h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li> <li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li> </ul> <h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li> <li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li> </ul> <h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li> <li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li> </ul> <h3 id="высокие-проблемы">Высокие проблемы</h3> <h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li> <li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li> </ul> <h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li> <li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li> </ul> <h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4> <ul> <li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li> <li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li> </ul> <h3 id="средние-проблемы">Средние проблемы</h3> <h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li> <li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li> </ul> <h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4> <ul> <li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li> <li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li> </ul> <h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li> <li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li> </ul> <h3 id="низкие-проблемы">Низкие проблемы</h3> <h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li> <li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li> </ul> <h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li> <li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li> </ul> <h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2> <h3 id="критические-проблемы-1">Критические проблемы</h3> <h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li> <li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li> </ul> <h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4> <ul> <li><strong>Файл:</strong> <code>src/index.html</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li> <li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li> </ul> <h3 id="высокие-проблемы-1">Высокие проблемы</h3> <h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li> <li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li> </ul> <h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li> <li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li> </ul> <h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li> <li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li> </ul> <h3 id="средние-проблемы-1">Средние проблемы</h3> <h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4> <ul> <li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li> <li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li> </ul> <h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li> <li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li> </ul> <h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li> <li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li> </ul> <h3 id="низкие-проблемы-1">Низкие проблемы</h3> <h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li> <li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li> </ul> <h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4> <ul> <li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li> <li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li> </ul> <h2 id="безопасность">Безопасность</h2> <h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3> <ol> <li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li> <li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li> <li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li> <li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li> <li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li> </ol> <h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3> <ol> <li>Реализовать Input Validation на всех уровнях</li> <li>Перейти на HTTP-only cookies для токенов</li> <li>Реализовать rate limiting middleware</li> <li>Добавить CSRF protection</li> <li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li> <li>Реализовать proper logging и мониторинг</li> <li>Добавить автоматические тесты безопасности</li> </ol> <h2 id="ux-улучшения">UX улучшения</h2> <h3 id="критические-улучшения">Критические улучшения:</h3> <ol> <li><strong>Надежность аутентификации</strong> - Реализовать MFA</li> <li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li> <li><strong>Прогресс-бары</strong> - Для долгих операций</li> </ol> <h3 id="высокие-улучшения">Высокие улучшения:</h3> <ol> <li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li> <li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li> <li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li> <li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li> </ol> <h3 id="средние-улучшения">Средние улучшения:</h3> <ol> <li><strong>Экспорт данных</strong> -多种 форматы</li> <li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li> <li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li> <li><strong>Аналитика и отчеты</strong> - Insights по проектам</li> </ol> <h3 id="низкие-улучшения">Низкие улучшения:</h3> <ol> <li><strong>Mobile app</strong> - iOS/Android приложения</li> <li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li> <li><strong>API для плагинов</strong> - Расширяемость системы</li> </ol> <h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2> <table> <thead> <tr> <th>Приоритет</th> <th>Проблема</th> <th>Файлы</th> <th>Трудоёмкость</th> </tr> </thead> <tbody> <tr> <td><strong>Critical</strong></td> <td>XSS уязвимости</td> <td><code>internal/handlers/*.go</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Хранение JWT в localStorage</td> <td><code>src/app/core/auth/*.ts</code></td> <td>1 день</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Небезопасное хранение refresh токенов</td> <td><code>internal/utils/password.go</code></td> <td>1 день</td> </tr> <tr> <td><strong>High</strong></td> <td>Rate limiting middleware</td> <td><code>internal/middleware/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>CSRF protection</td> <td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>Валидация входных данных</td> <td><code>internal/handlers/</code>, <code>internal/utils/</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Оптимизация запросов БД</td> <td><code>internal/repository/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Структурированное логирование</td> <td><code>internal/handlers/</code></td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>CSP заголовки</td> <td><code>src/index.html</code>, конфигурация сервера</td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>A11y улучшения</td> <td><code>src/app/components/</code></td> <td>3 дня</td> </tr> </tbody> </table> <h3 id="общая-оценка">Общая оценка:</h3> <ul> <li><strong>Critical issues:</strong> 6 задач, 8 дней</li> <li><strong>High issues:</strong> 5 задач, 7 дней</li> <li><strong>Medium issues:</strong> 3 задачи, 6 дней</li> <li><strong>Low issues:</strong> 4 задачи, 5 дней</li> </ul> <p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p> + <h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1> <p><strong>Дата:</strong> 30.03.2026<br> <strong>Версия:</strong> pre-production, миграции 1–5</p> <hr> <h2 id="1-обзор-проекта">1. Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p> <h3 id="стек">Стек</h3> <table> <thead> <tr> <th>Компонент</th> <th>Технологии</th> </tr> </thead> <tbody> <tr> <td>Backend</td> <td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td> </tr> <tr> <td>Frontend</td> <td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td> </tr> <tr> <td>Инфраструктура</td> <td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td> </tr> </tbody> </table> <h3 id="доменная-модель">Доменная модель</h3> <pre tabindex="0"><code>User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask </code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p> + + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> Mac Studio — leadera-api БД (docker-compose) diff --git a/public/tags/mtproxy/index.html b/public/tags/mtproxy/index.html new file mode 100644 index 0000000..0c244d2 --- /dev/null +++ b/public/tags/mtproxy/index.html @@ -0,0 +1,140 @@ + + + + + + Mtproxy — docs.a2v.space + + + + + + + + + + + + + +
        +
        + + + + +
        + +
        +

        Mtproxy

        + + + +
        + +
        +
        +
        + +
        +
        +

        © 2026 docs.a2v.space

        +
        +
        + + + + + + + + + + + + + + + diff --git a/public/tags/mtproxy/index.xml b/public/tags/mtproxy/index.xml new file mode 100644 index 0000000..8a01169 --- /dev/null +++ b/public/tags/mtproxy/index.xml @@ -0,0 +1,19 @@ + + + + Mtproxy on docs.a2v.space + /tags/mtproxy/ + Recent content in Mtproxy on docs.a2v.space + Hugo + ru-ru + Mon, 30 Mar 2026 00:00:00 +0000 + + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + + + diff --git a/public/tags/ollama/index.html b/public/tags/ollama/index.html index a5012fe..c6ca99c 100644 --- a/public/tags/ollama/index.html +++ b/public/tags/ollama/index.html @@ -109,6 +109,8 @@ diff --git a/public/tags/ollama/index.xml b/public/tags/ollama/index.xml index bc94eec..97507e9 100644 --- a/public/tags/ollama/index.xml +++ b/public/tags/ollama/index.xml @@ -6,8 +6,15 @@ Recent content in Ollama on docs.a2v.space Hugo ru-ru - Sun, 29 Mar 2026 00:00:00 +0000 + Mon, 30 Mar 2026 00:00:00 +0000 + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + Настроить интеграцию Ollama с OpenClaw /plans/ollama-openclaw/ diff --git a/public/tags/openclaw/index.html b/public/tags/openclaw/index.html index f7bdf38..e4547f1 100644 --- a/public/tags/openclaw/index.html +++ b/public/tags/openclaw/index.html @@ -109,6 +109,8 @@
          +
        • 30 марта 2026
        • +
        • Настроить интеграцию Ollama с OpenClaw
        • Подключение claw.a2v.space (OpenClaw)
        • diff --git a/public/tags/openclaw/index.xml b/public/tags/openclaw/index.xml index a1d75e8..a5a86e3 100644 --- a/public/tags/openclaw/index.xml +++ b/public/tags/openclaw/index.xml @@ -6,8 +6,15 @@ Recent content in Openclaw on docs.a2v.space Hugo ru-ru - Sun, 29 Mar 2026 00:00:00 +0000 + Mon, 30 Mar 2026 00:00:00 +0000 + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + Настроить интеграцию Ollama с OpenClaw /plans/ollama-openclaw/ diff --git a/public/tags/qwen/index.html b/public/tags/qwen/index.html new file mode 100644 index 0000000..1c763b6 --- /dev/null +++ b/public/tags/qwen/index.html @@ -0,0 +1,140 @@ + + + + + + Qwen — docs.a2v.space + + + + + + + + + + + + + +
          +
          + + + + +
          + +
          +

          Qwen

          + + + +
          + +
          +
          +
          + +
          +
          +

          © 2026 docs.a2v.space

          +
          +
          + + + + + + + + + + + + + + + diff --git a/public/tags/qwen/index.xml b/public/tags/qwen/index.xml new file mode 100644 index 0000000..956e84f --- /dev/null +++ b/public/tags/qwen/index.xml @@ -0,0 +1,19 @@ + + + + Qwen on docs.a2v.space + /tags/qwen/ + Recent content in Qwen on docs.a2v.space + Hugo + ru-ru + Mon, 30 Mar 2026 00:00:00 +0000 + + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + + + diff --git a/public/tags/security/index.html b/public/tags/security/index.html index 96e0821..af5adc3 100644 --- a/public/tags/security/index.html +++ b/public/tags/security/index.html @@ -109,7 +109,7 @@
diff --git a/public/tags/security/index.xml b/public/tags/security/index.xml index 8910e40..a9b67c6 100644 --- a/public/tags/security/index.xml +++ b/public/tags/security/index.xml @@ -9,11 +9,11 @@ Mon, 30 Mar 2026 00:00:00 +0000 - Аудит Leadera + Аудит Leadera — полный отчёт /guides/leadera-audit/ Mon, 30 Mar 2026 00:00:00 +0000 /guides/leadera-audit/ - <h2 id="обзор-проекта">Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p> <h3 id="бекенд">Бекенд</h3> <ul> <li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li> <li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li> <li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li> </ul> <h3 id="фронтенд">Фронтенд</h3> <ul> <li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li> <li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li> </ul> <h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2> <h3 id="критические-проблемы">Критические проблемы</h3> <h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li> <li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li> </ul> <h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li> <li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li> </ul> <h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li> <li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li> </ul> <h3 id="высокие-проблемы">Высокие проблемы</h3> <h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li> <li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li> </ul> <h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li> <li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li> </ul> <h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4> <ul> <li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li> <li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li> </ul> <h3 id="средние-проблемы">Средние проблемы</h3> <h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li> <li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li> </ul> <h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4> <ul> <li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li> <li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li> </ul> <h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li> <li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li> </ul> <h3 id="низкие-проблемы">Низкие проблемы</h3> <h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li> <li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li> </ul> <h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li> <li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li> </ul> <h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2> <h3 id="критические-проблемы-1">Критические проблемы</h3> <h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li> <li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li> </ul> <h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4> <ul> <li><strong>Файл:</strong> <code>src/index.html</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li> <li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li> </ul> <h3 id="высокие-проблемы-1">Высокие проблемы</h3> <h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li> <li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li> </ul> <h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li> <li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li> </ul> <h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li> <li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li> </ul> <h3 id="средние-проблемы-1">Средние проблемы</h3> <h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4> <ul> <li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li> <li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li> </ul> <h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li> <li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li> </ul> <h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li> <li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li> </ul> <h3 id="низкие-проблемы-1">Низкие проблемы</h3> <h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li> <li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li> </ul> <h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4> <ul> <li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li> <li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li> </ul> <h2 id="безопасность">Безопасность</h2> <h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3> <ol> <li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li> <li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li> <li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li> <li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li> <li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li> </ol> <h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3> <ol> <li>Реализовать Input Validation на всех уровнях</li> <li>Перейти на HTTP-only cookies для токенов</li> <li>Реализовать rate limiting middleware</li> <li>Добавить CSRF protection</li> <li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li> <li>Реализовать proper logging и мониторинг</li> <li>Добавить автоматические тесты безопасности</li> </ol> <h2 id="ux-улучшения">UX улучшения</h2> <h3 id="критические-улучшения">Критические улучшения:</h3> <ol> <li><strong>Надежность аутентификации</strong> - Реализовать MFA</li> <li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li> <li><strong>Прогресс-бары</strong> - Для долгих операций</li> </ol> <h3 id="высокие-улучшения">Высокие улучшения:</h3> <ol> <li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li> <li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li> <li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li> <li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li> </ol> <h3 id="средние-улучшения">Средние улучшения:</h3> <ol> <li><strong>Экспорт данных</strong> -多种 форматы</li> <li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li> <li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li> <li><strong>Аналитика и отчеты</strong> - Insights по проектам</li> </ol> <h3 id="низкие-улучшения">Низкие улучшения:</h3> <ol> <li><strong>Mobile app</strong> - iOS/Android приложения</li> <li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li> <li><strong>API для плагинов</strong> - Расширяемость системы</li> </ol> <h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2> <table> <thead> <tr> <th>Приоритет</th> <th>Проблема</th> <th>Файлы</th> <th>Трудоёмкость</th> </tr> </thead> <tbody> <tr> <td><strong>Critical</strong></td> <td>XSS уязвимости</td> <td><code>internal/handlers/*.go</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Хранение JWT в localStorage</td> <td><code>src/app/core/auth/*.ts</code></td> <td>1 день</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Небезопасное хранение refresh токенов</td> <td><code>internal/utils/password.go</code></td> <td>1 день</td> </tr> <tr> <td><strong>High</strong></td> <td>Rate limiting middleware</td> <td><code>internal/middleware/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>CSRF protection</td> <td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>Валидация входных данных</td> <td><code>internal/handlers/</code>, <code>internal/utils/</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Оптимизация запросов БД</td> <td><code>internal/repository/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Структурированное логирование</td> <td><code>internal/handlers/</code></td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>CSP заголовки</td> <td><code>src/index.html</code>, конфигурация сервера</td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>A11y улучшения</td> <td><code>src/app/components/</code></td> <td>3 дня</td> </tr> </tbody> </table> <h3 id="общая-оценка">Общая оценка:</h3> <ul> <li><strong>Critical issues:</strong> 6 задач, 8 дней</li> <li><strong>High issues:</strong> 5 задач, 7 дней</li> <li><strong>Medium issues:</strong> 3 задачи, 6 дней</li> <li><strong>Low issues:</strong> 4 задачи, 5 дней</li> </ul> <p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p> + <h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1> <p><strong>Дата:</strong> 30.03.2026<br> <strong>Версия:</strong> pre-production, миграции 1–5</p> <hr> <h2 id="1-обзор-проекта">1. Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p> <h3 id="стек">Стек</h3> <table> <thead> <tr> <th>Компонент</th> <th>Технологии</th> </tr> </thead> <tbody> <tr> <td>Backend</td> <td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td> </tr> <tr> <td>Frontend</td> <td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td> </tr> <tr> <td>Инфраструктура</td> <td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td> </tr> </tbody> </table> <h3 id="доменная-модель">Доменная модель</h3> <pre tabindex="0"><code>User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask </code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p> diff --git a/public/tags/tasktracker/index.html b/public/tags/tasktracker/index.html new file mode 100644 index 0000000..8025cdc --- /dev/null +++ b/public/tags/tasktracker/index.html @@ -0,0 +1,140 @@ + + + + + + Tasktracker — docs.a2v.space + + + + + + + + + + + + + +
+
+ + + + +
+ +
+

Tasktracker

+ + + +
+ +
+
+
+ +
+
+

© 2026 docs.a2v.space

+
+
+ + + + + + + + + + + + + + + diff --git a/public/tags/tasktracker/index.xml b/public/tags/tasktracker/index.xml new file mode 100644 index 0000000..22acec5 --- /dev/null +++ b/public/tags/tasktracker/index.xml @@ -0,0 +1,19 @@ + + + + Tasktracker on docs.a2v.space + /tags/tasktracker/ + Recent content in Tasktracker on docs.a2v.space + Hugo + ru-ru + Mon, 30 Mar 2026 00:00:00 +0000 + + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + + + diff --git a/public/tags/ux/index.html b/public/tags/ux/index.html index 1649790..101c9cb 100644 --- a/public/tags/ux/index.html +++ b/public/tags/ux/index.html @@ -109,8 +109,6 @@
diff --git a/public/tags/ux/index.xml b/public/tags/ux/index.xml index acaaf50..b66259f 100644 --- a/public/tags/ux/index.xml +++ b/public/tags/ux/index.xml @@ -2,18 +2,10 @@ Ux on docs.a2v.space - /tags/ux/ + //localhost:8090/tags/ux/ Recent content in Ux on docs.a2v.space Hugo ru-ru - Mon, 30 Mar 2026 00:00:00 +0000 - - - Аудит Leadera - /guides/leadera-audit/ - Mon, 30 Mar 2026 00:00:00 +0000 - /guides/leadera-audit/ - <h2 id="обзор-проекта">Обзор проекта</h2> <p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p> <h3 id="бекенд">Бекенд</h3> <ul> <li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li> <li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li> <li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li> </ul> <h3 id="фронтенд">Фронтенд</h3> <ul> <li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li> <li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li> </ul> <h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2> <h3 id="критические-проблемы">Критические проблемы</h3> <h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li> <li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li> </ul> <h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li> <li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li> </ul> <h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li> <li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li> </ul> <h3 id="высокие-проблемы">Высокие проблемы</h3> <h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li> <li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li> </ul> <h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4> <ul> <li><strong>Файл:</strong> Нет реализации</li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li> <li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li> </ul> <h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4> <ul> <li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li> <li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li> </ul> <h3 id="средние-проблемы">Средние проблемы</h3> <h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li> <li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li> </ul> <h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4> <ul> <li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li> <li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li> </ul> <h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li> <li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li> </ul> <h3 id="низкие-проблемы">Низкие проблемы</h3> <h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4> <ul> <li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li> <li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li> </ul> <h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4> <ul> <li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li> <li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li> </ul> <h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2> <h3 id="критические-проблемы-1">Критические проблемы</h3> <h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li> <li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li> </ul> <h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4> <ul> <li><strong>Файл:</strong> <code>src/index.html</code></li> <li><strong>Критичность:</strong> <strong>critical</strong></li> <li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li> <li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li> </ul> <h3 id="высокие-проблемы-1">Высокие проблемы</h3> <h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li> <li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li> </ul> <h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li> <li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li> </ul> <h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li> <li><strong>Критичность:</strong> <strong>high</strong></li> <li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li> <li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li> </ul> <h3 id="средние-проблемы-1">Средние проблемы</h3> <h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4> <ul> <li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li> <li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li> </ul> <h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4> <ul> <li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li> <li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li> </ul> <h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4> <ul> <li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li> <li><strong>Критичность:</strong> <strong>medium</strong></li> <li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li> <li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li> </ul> <h3 id="низкие-проблемы-1">Низкие проблемы</h3> <h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4> <ul> <li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li> <li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li> </ul> <h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4> <ul> <li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li> <li><strong>Критичность:</strong> <strong>low</strong></li> <li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li> <li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li> </ul> <h2 id="безопасность">Безопасность</h2> <h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3> <ol> <li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li> <li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li> <li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li> <li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li> <li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li> </ol> <h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3> <ol> <li>Реализовать Input Validation на всех уровнях</li> <li>Перейти на HTTP-only cookies для токенов</li> <li>Реализовать rate limiting middleware</li> <li>Добавить CSRF protection</li> <li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li> <li>Реализовать proper logging и мониторинг</li> <li>Добавить автоматические тесты безопасности</li> </ol> <h2 id="ux-улучшения">UX улучшения</h2> <h3 id="критические-улучшения">Критические улучшения:</h3> <ol> <li><strong>Надежность аутентификации</strong> - Реализовать MFA</li> <li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li> <li><strong>Прогресс-бары</strong> - Для долгих операций</li> </ol> <h3 id="высокие-улучшения">Высокие улучшения:</h3> <ol> <li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li> <li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li> <li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li> <li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li> </ol> <h3 id="средние-улучшения">Средние улучшения:</h3> <ol> <li><strong>Экспорт данных</strong> -多种 форматы</li> <li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li> <li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li> <li><strong>Аналитика и отчеты</strong> - Insights по проектам</li> </ol> <h3 id="низкие-улучшения">Низкие улучшения:</h3> <ol> <li><strong>Mobile app</strong> - iOS/Android приложения</li> <li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li> <li><strong>API для плагинов</strong> - Расширяемость системы</li> </ol> <h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2> <table> <thead> <tr> <th>Приоритет</th> <th>Проблема</th> <th>Файлы</th> <th>Трудоёмкость</th> </tr> </thead> <tbody> <tr> <td><strong>Critical</strong></td> <td>XSS уязвимости</td> <td><code>internal/handlers/*.go</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Хранение JWT в localStorage</td> <td><code>src/app/core/auth/*.ts</code></td> <td>1 день</td> </tr> <tr> <td><strong>Critical</strong></td> <td>Небезопасное хранение refresh токенов</td> <td><code>internal/utils/password.go</code></td> <td>1 день</td> </tr> <tr> <td><strong>High</strong></td> <td>Rate limiting middleware</td> <td><code>internal/middleware/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>CSRF protection</td> <td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>High</strong></td> <td>Валидация входных данных</td> <td><code>internal/handlers/</code>, <code>internal/utils/</code></td> <td>3 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Оптимизация запросов БД</td> <td><code>internal/repository/</code></td> <td>2 дня</td> </tr> <tr> <td><strong>Medium</strong></td> <td>Структурированное логирование</td> <td><code>internal/handlers/</code></td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>CSP заголовки</td> <td><code>src/index.html</code>, конфигурация сервера</td> <td>1 день</td> </tr> <tr> <td><strong>Low</strong></td> <td>A11y улучшения</td> <td><code>src/app/components/</code></td> <td>3 дня</td> </tr> </tbody> </table> <h3 id="общая-оценка">Общая оценка:</h3> <ul> <li><strong>Critical issues:</strong> 6 задач, 8 дней</li> <li><strong>High issues:</strong> 5 задач, 7 дней</li> <li><strong>Medium issues:</strong> 3 задачи, 6 дней</li> <li><strong>Low issues:</strong> 4 задачи, 5 дней</li> </ul> <p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p> - + diff --git a/public/tags/vikunja/index.html b/public/tags/vikunja/index.html new file mode 100644 index 0000000..1db76b8 --- /dev/null +++ b/public/tags/vikunja/index.html @@ -0,0 +1,140 @@ + + + + + + Vikunja — docs.a2v.space + + + + + + + + + + + + + +
+
+ + + + +
+ +
+

Vikunja

+ + + +
+ +
+
+
+ +
+
+

© 2026 docs.a2v.space

+
+
+ + + + + + + + + + + + + + + diff --git a/public/tags/vikunja/index.xml b/public/tags/vikunja/index.xml new file mode 100644 index 0000000..146410b --- /dev/null +++ b/public/tags/vikunja/index.xml @@ -0,0 +1,19 @@ + + + + Vikunja on docs.a2v.space + /tags/vikunja/ + Recent content in Vikunja on docs.a2v.space + Hugo + ru-ru + Mon, 30 Mar 2026 00:00:00 +0000 + + + 30 марта 2026 + /diary/2026-03-30/ + Mon, 30 Mar 2026 00:00:00 +0000 + /diary/2026-03-30/ + <h2 id="timeline">Timeline</h2> <ul> <li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li> <li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li> <li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li> <li><strong>Вечер</strong> — <strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li> <li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li> <li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li> <li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li> </ul> <h2 id="vikunja">Vikunja</h2> <ul> <li>URL: http://192.168.0.37:8095</li> <li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li> <li>Проект Leadera: 27 задач из аудита</li> </ul> <h2 id="mt-proxy">MT Proxy</h2> <ul> <li>Сервер: 185.234.64.52:8443</li> <li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li> <li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li> </ul> <h2 id="уроки">Уроки</h2> <ul> <li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li> <li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li> <li>Plane self-hosted commercial edition проблемный для локального запуска</li> </ul> + + +