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 @@
Утро/день — Установили 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
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/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 @@
Диаграммы Ганта НЕ имеют собственной системы ролей. Таблица gantt_chart_members была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.
Backend GanttHandler.RegisterRoutes() НЕ регистрирует маршруты для members диаграмм. После удаления gantt_chart_members (миграция 5) эти endpoints не существуют.
+
Результат: модальное окно «Участники диаграммы» на фронтенде не работает — все вызовы вернут 404.
+
3.4. 🔴 Проблема: Role fallback
+
В role_middleware.go:28-31:
+
role:=c.GetString(ContextSpaceRole)
+ifrole=="" {
+role = c.GetString(ContextRole) // fallback на глобальную роль User
+}
+
Если ContextSpaceRole не установлен, используется глобальная роль пользователя (из JWT). Это значит:
+
+
Пользователь с role=admin в таблице users получит admin-доступ к любому space, даже если он не член этого space
+
Но SpaceMiddleware проверяет членство раньше, так что в цепочке RequireSpace() → RequireMinRole() это не эксплуатируется
+
Однако если RequireMinRole() используется безRequireSpace() — это дыра
+
+
Рекомендация: Удалить fallback на ContextRole. Если ContextSpaceRole пуст — отказывать.
+
3.5. Рекомендации по правам доступа
-
Реализовать Input Validation на всех уровнях
-
Перейти на HTTP-only cookies для токенов
-
Реализовать rate limiting middleware
-
Добавить CSRF protection
-
Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
-
Реализовать proper logging и мониторинг
-
Добавить автоматические тесты безопасности
+
Удалить модалку участников диаграммы на фронтенде — она мертва
+
Или добавить раздел «Участники Space» с возможностью управления ролями через /spaces/:space_id/members (эти endpoints работают)
+
Удалить fallback на ContextRole в role_middleware.go
+
Добавить проверку: editor не может повысить кого-то до admin (сейчас может — AddMember разрешает editor+ назначать любую роль)
-
UX улучшения
-
Критические улучшения:
-
-
Надежность аутентификации - Реализовать MFA
-
Уведомления об ошибках - Лучшее error messaging
-
Прогресс-бары - Для долгих операций
-
-
Высокие улучшения:
-
-
Поиск по проекту - Быстрый поиск across spaces
-
Drag & Drop - Для задач и диаграмм
-
Keyboard shortcuts - Повышение продуктивности
-
Темная тема - Улучшение UX при длительной работе
-
-
Средние улучшения:
-
-
Экспорт данных -多种 форматы
-
Коллаборация в реальном времени - WebSocket для live updates
-
Шаблоны диаграмм - Pre-built templates
-
Аналитика и отчеты - Insights по проектам
-
-
Низкие улучшения:
-
-
Mobile app - iOS/Android приложения
-
Интеграции - Slack, Teams, Jira и др.
-
API для плагинов - Расширяемость системы
-
-
Приоритизированный план исправления
+
+
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’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 & Drop задач
+
❌
+
+
+
Real-time collaboration
+
❌
+
+
+
Уведомления
+
❌
+
+
+
Поиск
+
❌
+
+
+
Экспорт (PDF/Excel)
+
❌
+
+
+
Email verification
+
❌
+
+
+
Password reset
+
Backend есть, UI есть — не проверено
+
+
+
+
6.3. Оценка готовности
+
Система на стадии каркаса. Backend API функционален для CRUD операций, но:
+
+
Визуализация Ганта — основная фича — не реализована (нет canvas/SVG рендеринга)
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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.spaceHugoru-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&port=8443&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 @@
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.spaceHugoru-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&port=8443&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 @@