daily update 2026-03-30

This commit is contained in:
Агальцов Антон
2026-03-31 00:00:59 +03:00
parent b36056a690
commit c91e6f0748
42 changed files with 2129 additions and 829 deletions
+34 -2
View File
@@ -105,6 +105,24 @@
@@ -113,6 +131,22 @@
<h6 class="mt-3">Теги</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../tags/vikunja/">vikunja</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/tasktracker/">tasktracker</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ollama/">ollama</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/qwen/">qwen</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/mtproxy/">mtproxy</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/infrastructure/">infrastructure</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/openclaw/">openclaw</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/angular/">angular</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/go/">go</a></li>
@@ -127,8 +161,6 @@
<li class="nav-item"><a class="nav-link" href="../../tags/identity/">identity</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/infrastructure/">infrastructure</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/companion/">companion</a></li>
</ul>
+257
View File
@@ -0,0 +1,257 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>30 марта 2026 — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Фильтры</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Все записи</a></li>
</ul>
<h6 class="mt-3">Теги</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../tags/vikunja/">vikunja</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/tasktracker/">tasktracker</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ollama/">ollama</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/qwen/">qwen</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/mtproxy/">mtproxy</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/infrastructure/">infrastructure</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/openclaw/">openclaw</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/angular/">angular</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/go/">go</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/docker/">docker</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/eversolo/">eversolo</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/hugo/">hugo</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/docs/">docs</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/identity/">identity</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/companion/">companion</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>30 марта 2026</h1>
<p class="diary-date">30.03.2026</p>
<h2 id="timeline">Timeline</h2>
<ul>
<li><strong>Утро/день</strong> — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)</li>
<li><strong>День</strong> — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)</li>
<li><strong>День</strong> — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты</li>
<li><strong>Вечер</strong><strong>Откатили</strong> TaskTracker по просьбе Антона (<code>git checkout + git clean</code>): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)</li>
<li><strong>Вечер</strong> — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено <code>openclaw models set ollama/qwen3.5:9b</code> + возврат default на <code>zai/glm-5.1</code></li>
<li><strong>Вечер</strong> — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер <code>mtproxy</code>, порт 8443→443, секрет <code>9e40ae13999874305c87fd2777758188</code></li>
<li><strong>Вечер</strong> — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через <code>openclaw devices approve</code></li>
</ul>
<h2 id="vikunja">Vikunja</h2>
<ul>
<li>URL: http://192.168.0.37:8095</li>
<li>API token: <code>tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0</code></li>
<li>Проект Leadera: 27 задач из аудита</li>
</ul>
<h2 id="mt-proxy">MT Proxy</h2>
<ul>
<li>Сервер: 185.234.64.52:8443</li>
<li>Секрет: <code>9e40ae13999874305c87fd2777758188</code></li>
<li>Ссылка: <code>tg://proxy?server=185.234.64.52&amp;port=8443&amp;secret=9e40ae13999874305c87fd2777758188</code></li>
</ul>
<h2 id="уроки">Уроки</h2>
<ul>
<li>Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие</li>
<li>OpenClaw требует «активации» моделей через CLI, не только конфиг</li>
<li>Plane self-hosted commercial edition проблемный для локального запуска</li>
</ul>
<div class="tags">
<a href="../../tags/vikunja/" class="tag">vikunja</a>
<a href="../../tags/leadera/" class="tag">leadera</a>
<a href="../../tags/tasktracker/" class="tag">tasktracker</a>
<a href="../../tags/ollama/" class="tag">ollama</a>
<a href="../../tags/qwen/" class="tag">qwen</a>
<a href="../../tags/mtproxy/" class="tag">mtproxy</a>
<a href="../../tags/infrastructure/" class="tag">infrastructure</a>
<a href="../../tags/openclaw/" class="tag">openclaw</a>
</div>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+60 -2
View File
@@ -105,6 +105,24 @@
@@ -113,6 +131,22 @@
<h6 class="mt-3">Теги</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../tags/vikunja/">vikunja</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/leadera/">leadera</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/tasktracker/">tasktracker</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/ollama/">ollama</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/qwen/">qwen</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/mtproxy/">mtproxy</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/infrastructure/">infrastructure</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/openclaw/">openclaw</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/angular/">angular</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/go/">go</a></li>
@@ -127,8 +161,6 @@
<li class="nav-item"><a class="nav-link" href="../tags/identity/">identity</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/infrastructure/">infrastructure</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/companion/">companion</a></li>
</ul>
@@ -148,6 +180,32 @@
<div class="diary-timeline">
<div class="diary-entry">
<div class="diary-date">30.03.2026</div>
<h3><a href="../diary/2026-03-30/">30 марта 2026</a></h3>
<div class="tags">
<a href="../tags/vikunja/" class="tag">vikunja</a>
<a href="../tags/leadera/" class="tag">leadera</a>
<a href="../tags/tasktracker/" class="tag">tasktracker</a>
<a href="../tags/ollama/" class="tag">ollama</a>
<a href="../tags/qwen/" class="tag">qwen</a>
<a href="../tags/mtproxy/" class="tag">mtproxy</a>
<a href="../tags/infrastructure/" class="tag">infrastructure</a>
<a href="../tags/openclaw/" class="tag">openclaw</a>
</div>
</div>
<div class="diary-entry">
<div class="diary-date">29.03.2026</div>
<h3><a href="../diary/2026-03-29/">29 марта 2026</a></h3>
+1 -1
View File
@@ -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/"}]
[{"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/"}]
+1 -1
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
+1 -1
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
+25 -286
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../tags/ssh/">ssh</a></li>
@@ -211,304 +211,43 @@
<div class="col-md-6 mb-4">
<div class="card h-100">
<div class="card-body">
<h3 class="card-title"><a href="../guides/leadera-audit/">Аудит Leadera</a></h3>
<p class="card-text"><h2 id="обзор-проекта">Обзор проекта</h2>
<p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p>
<h3 id="бекенд">Бекенд</h3>
<ul>
<li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li>
<li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li>
<li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li>
</ul>
<h3 id="фронтенд">Фронтенд</h3>
<ul>
<li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li>
<li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li>
</ul>
<h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2>
<h3 id="критические-проблемы">Критические проблемы</h3>
<h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li>
<li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li>
</ul>
<h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li>
<li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li>
</ul>
<h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li>
<li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li>
</ul>
<h3 id="высокие-проблемы">Высокие проблемы</h3>
<h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li>
<li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li>
</ul>
<h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li>
<li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li>
</ul>
<h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li>
<li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li>
</ul>
<h3 id="средние-проблемы">Средние проблемы</h3>
<h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li>
<li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li>
</ul>
<h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li>
<li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li>
</ul>
<h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li>
<li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li>
</ul>
<h3 id="низкие-проблемы">Низкие проблемы</h3>
<h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li>
<li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li>
</ul>
<h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li>
<li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li>
</ul>
<h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2>
<h3 id="критические-проблемы-1">Критические проблемы</h3>
<h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li>
<li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li>
</ul>
<h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4>
<ul>
<li><strong>Файл:</strong> <code>src/index.html</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li>
<li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li>
</ul>
<h3 id="высокие-проблемы-1">Высокие проблемы</h3>
<h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li>
<li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li>
</ul>
<h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li>
<li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li>
</ul>
<h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li>
<li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li>
</ul>
<h3 id="средние-проблемы-1">Средние проблемы</h3>
<h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li>
<li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li>
</ul>
<h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li>
<li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li>
</ul>
<h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li>
<li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li>
</ul>
<h3 id="низкие-проблемы-1">Низкие проблемы</h3>
<h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li>
<li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li>
</ul>
<h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li>
<li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li>
</ul>
<h2 id="безопасность">Безопасность</h2>
<h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3>
<ol>
<li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li>
<li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li>
<li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li>
<li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li>
<li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li>
</ol>
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3>
<ol>
<li>Реализовать Input Validation на всех уровнях</li>
<li>Перейти на HTTP-only cookies для токенов</li>
<li>Реализовать rate limiting middleware</li>
<li>Добавить CSRF protection</li>
<li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li>
<li>Реализовать proper logging и мониторинг</li>
<li>Добавить автоматические тесты безопасности</li>
</ol>
<h2 id="ux-улучшения">UX улучшения</h2>
<h3 id="критические-улучшения">Критические улучшения:</h3>
<ol>
<li><strong>Надежность аутентификации</strong> - Реализовать MFA</li>
<li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li>
<li><strong>Прогресс-бары</strong> - Для долгих операций</li>
</ol>
<h3 id="высокие-улучшения">Высокие улучшения:</h3>
<ol>
<li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li>
<li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li>
<li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li>
<li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li>
</ol>
<h3 id="средние-улучшения">Средние улучшения:</h3>
<ol>
<li><strong>Экспорт данных</strong> -多种 форматы</li>
<li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li>
<li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li>
<li><strong>Аналитика и отчеты</strong> - Insights по проектам</li>
</ol>
<h3 id="низкие-улучшения">Низкие улучшения:</h3>
<ol>
<li><strong>Mobile app</strong> - iOS/Android приложения</li>
<li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li>
<li><strong>API для плагинов</strong> - Расширяемость системы</li>
</ol>
<h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2>
<h3 class="card-title"><a href="../guides/leadera-audit/">Аудит Leadera — полный отчёт</a></h3>
<p class="card-text"><h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1>
<p><strong>Дата:</strong> 30.03.2026<br>
<strong>Версия:</strong> pre-production, миграции 15</p>
<hr>
<h2 id="1-обзор-проекта">1. Обзор проекта</h2>
<p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p>
<h3 id="стек">Стек</h3>
<table>
<thead>
<tr>
<th>Приоритет</th>
<th>Проблема</th>
<th>Файлы</th>
<th>Трудоёмкость</th>
<th>Компонент</th>
<th>Технологии</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Critical</strong></td>
<td>XSS уязвимости</td>
<td><code>internal/handlers/*.go</code></td>
<td>3 дня</td>
<td>Backend</td>
<td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Хранение JWT в localStorage</td>
<td><code>src/app/core/auth/*.ts</code></td>
<td>1 день</td>
<td>Frontend</td>
<td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Небезопасное хранение refresh токенов</td>
<td><code>internal/utils/password.go</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Rate limiting middleware</td>
<td><code>internal/middleware/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>CSRF protection</td>
<td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Валидация входных данных</td>
<td><code>internal/handlers/</code>, <code>internal/utils/</code></td>
<td>3 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Оптимизация запросов БД</td>
<td><code>internal/repository/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Структурированное логирование</td>
<td><code>internal/handlers/</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>CSP заголовки</td>
<td><code>src/index.html</code>, конфигурация сервера</td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>A11y улучшения</td>
<td><code>src/app/components/</code></td>
<td>3 дня</td>
<td>Инфраструктура</td>
<td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td>
</tr>
</tbody>
</table>
<h3 id="общая-оценка">Общая оценка:</h3>
<ul>
<li><strong>Critical issues:</strong> 6 задач, 8 дней</li>
<li><strong>High issues:</strong> 5 задач, 7 дней</li>
<li><strong>Medium issues:</strong> 3 задачи, 6 дней</li>
<li><strong>Low issues:</strong> 4 задачи, 5 дней</li>
</ul>
<p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p></p>
<h3 id="доменная-модель">Доменная модель</h3>
<pre tabindex="0"><code>User ──┬── Space (через space_members с role)
└── GanttChart (принадлежит Space)
├── GanttSection
└── GanttTask
</code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p></p>
<div class="tags">
@@ -518,7 +257,7 @@
<a href="../tags/security/" class="tag">security</a>
<a href="../tags/ux/" class="tag">ux</a>
<a href="../tags/architecture/" class="tag">architecture</a>
</div>
File diff suppressed because one or more lines are too long
+536 -278
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Аудит Leadera — docs.a2v.space</title>
<title>Аудит Leadera — полный отчёт — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
@@ -204,7 +204,7 @@
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Аудит Leadera</h1>
<h1>Аудит Leadera — полный отчёт</h1>
<div class="tags mb-3">
@@ -215,315 +215,573 @@
<a href="../../tags/security/" class="tag">security</a>
<a href="../../tags/ux/" class="tag">ux</a>
<a href="../../tags/architecture/" class="tag">architecture</a>
</div>
<h2 id="обзор-проекта">Обзор проекта</h2>
<p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p>
<h3 id="бекенд">Бекенд</h3>
<ul>
<li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li>
<li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li>
<li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li>
</ul>
<h3 id="фронтенд">Фронтенд</h3>
<ul>
<li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li>
<li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li>
</ul>
<h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2>
<h3 id="критические-проблемы">Критические проблемы</h3>
<h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li>
<li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li>
</ul>
<h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li>
<li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li>
</ul>
<h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li>
<li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li>
</ul>
<h3 id="высокие-проблемы">Высокие проблемы</h3>
<h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li>
<li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li>
</ul>
<h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li>
<li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li>
</ul>
<h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li>
<li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li>
</ul>
<h3 id="средние-проблемы">Средние проблемы</h3>
<h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li>
<li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li>
</ul>
<h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li>
<li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li>
</ul>
<h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li>
<li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li>
</ul>
<h3 id="низкие-проблемы">Низкие проблемы</h3>
<h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li>
<li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li>
</ul>
<h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li>
<li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li>
</ul>
<h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2>
<h3 id="критические-проблемы-1">Критические проблемы</h3>
<h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li>
<li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li>
</ul>
<h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4>
<ul>
<li><strong>Файл:</strong> <code>src/index.html</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li>
<li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li>
</ul>
<h3 id="высокие-проблемы-1">Высокие проблемы</h3>
<h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li>
<li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li>
</ul>
<h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li>
<li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li>
</ul>
<h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li>
<li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li>
</ul>
<h3 id="средние-проблемы-1">Средние проблемы</h3>
<h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li>
<li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li>
</ul>
<h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li>
<li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li>
</ul>
<h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li>
<li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li>
</ul>
<h3 id="низкие-проблемы-1">Низкие проблемы</h3>
<h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li>
<li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li>
</ul>
<h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li>
<li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li>
</ul>
<h2 id="безопасность">Безопасность</h2>
<h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3>
<h1 id="аудит-проекта-leadera">Аудит проекта Leadera</h1>
<p><strong>Дата:</strong> 30.03.2026<br>
<strong>Версия:</strong> pre-production, миграции 15</p>
<hr>
<h2 id="1-обзор-проекта">1. Обзор проекта</h2>
<p>Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.</p>
<h3 id="стек">Стек</h3>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Технологии</th>
</tr>
</thead>
<tbody>
<tr>
<td>Backend</td>
<td>Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)</td>
</tr>
<tr>
<td>Frontend</td>
<td>Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals</td>
</tr>
<tr>
<td>Инфраструктура</td>
<td>Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru</td>
</tr>
</tbody>
</table>
<h3 id="доменная-модель">Доменная модель</h3>
<pre tabindex="0"><code>User ──┬── Space (через space_members с role)
└── GanttChart (принадлежит Space)
├── GanttSection
└── GanttTask
</code></pre><p><strong>Роли:</strong> admin, editor, viewer — назначаются <strong>на уровне Space</strong> через таблицу <code>space_members</code>.</p>
<h3 id="что-реализовано-endpoints">Что реализовано (endpoints)</h3>
<p><strong>Auth (5):</strong> register, login, refresh, change-password, logout<br>
<strong>Spaces (9):</strong> CRUD + members CRUD<br>
<strong>Gantt Charts (9):</strong> CRUD + archive + members (добавлен, но удалён в миграции 5)<br>
<strong>Gantt Sections (5):</strong> CRUD + reorder<br>
<strong>Gantt Tasks (4):</strong> CRUD</p>
<p><strong>Итого: ~32 endpoint</strong></p>
<hr>
<h2 id="2-архитектура-и-качество-кода">2. Архитектура и качество кода</h2>
<h3 id="21-backend--структура">2.1. Backend — структура</h3>
<pre tabindex="0"><code>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)
</code></pre><p><strong>Оценка:</strong> ✅ Чистая layered архитектура. Разделение ответственности чёткое.</p>
<h3 id="22-frontend--структура">2.2. Frontend — структура</h3>
<pre tabindex="0"><code>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
</code></pre><p><strong>Оценка:</strong> ✅ Стандартная Angular-структура. Signals для state management.</p>
<h3 id="23-проблемы-кода">2.3. Проблемы кода</h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Критичность</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>C1</td>
<td><code>\r</code> в service-файлах</td>
<td>Medium</td>
<td>gantt_service.go, gantt_section_service.go содержат CRLF</td>
</tr>
<tr>
<td>C2</td>
<td><code>main.go:238</code> — мёртвый код <code>getUserHandler</code></td>
<td>Low</td>
<td>Неиспользуемая функция</td>
</tr>
<tr>
<td>C3</td>
<td>Swagger не сгенерирован</td>
<td>Medium</td>
<td>Аннотации есть, но <code>api/</code> директории нет</td>
</tr>
<tr>
<td>C4</td>
<td><code>RegisterProtectedRoutes</code> не вызывается в main.go</td>
<td><strong>Critical</strong></td>
<td>GET/PUT/DELETE <code>/spaces/:id</code> не зарегистрированы</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="3-права-доступа--главный-вопрос">3. Права доступа — главный вопрос</h2>
<h3 id="31-текущая-реализация">3.1. Текущая реализация</h3>
<p>Права назначаются <strong>исключительно через Space</strong>:</p>
<ol>
<li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li>
<li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li>
<li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li>
<li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li>
<li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li>
<li>Таблица <code>space_members</code> — связка user ↔ space с role (admin/editor/viewer)</li>
<li><code>SpaceMiddleware.RequireSpace()</code> — проверяет членство и записывает <code>ContextSpaceRole</code> в context</li>
<li><code>RoleMiddleware.RequireMinRole()</code> — проверяет иерархию ролей (admin &gt; editor &gt; viewer)</li>
</ol>
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3>
<p><strong>Диаграммы Ганта НЕ имеют собственной системы ролей.</strong> Таблица <code>gantt_chart_members</code> была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.</p>
<h3 id="32-как-это-работает">3.2. Как это работает</h3>
<pre tabindex="0"><code>Запрос → AuthMiddleware (JWT → userID)
→ SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole)
→ GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID)
→ RoleMiddleware.RequireMinRole(&#34;editor&#34;) (проверяет ContextSpaceRole)
</code></pre><p><strong>Это правильно.</strong> Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.</p>
<h3 id="33--критическая-проблема-frontend-не-соответствует-backend">3.3. 🔴 Критическая проблема: Frontend не соответствует Backend</h3>
<p><strong>Frontend <code>MembersModalComponent</code></strong> пытается управлять участниками <strong>диаграммы</strong>:</p>
<ul>
<li><code>ganttService.addMember(chartId, dto)</code><code>/api/v1/spaces/{spaceId}/gantt-charts/{chartId}/members</code></li>
<li><code>ganttService.updateMemberRole(chartId, userId, dto)</code><code>.../members/{userId}</code></li>
<li><code>ganttService.removeMember(chartId, userId)</code><code>.../members/{userId}</code></li>
</ul>
<p><strong>Backend <code>GanttHandler.RegisterRoutes()</code> НЕ регистрирует маршруты для members диаграмм.</strong> После удаления <code>gantt_chart_members</code> (миграция 5) эти endpoints не существуют.</p>
<p><strong>Результат:</strong> модальное окно «Участники диаграммы» на фронтенде <strong>не работает</strong> — все вызовы вернут 404.</p>
<h3 id="34--проблема-role-fallback">3.4. 🔴 Проблема: Role fallback</h3>
<p>В <code>role_middleware.go:28-31</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">role</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">GetString</span>(<span style="color:#a6e22e">ContextSpaceRole</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">role</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;&#34;</span> {
</span></span><span style="display:flex;"><span> <span style="color:#a6e22e">role</span> = <span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">GetString</span>(<span style="color:#a6e22e">ContextRole</span>) <span style="color:#75715e">// fallback на глобальную роль User</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Если <code>ContextSpaceRole</code> не установлен, используется <strong>глобальная роль пользователя</strong> (из JWT). Это значит:</p>
<ul>
<li>Пользователь с <code>role=admin</code> в таблице <code>users</code> получит admin-доступ к <strong>любому</strong> space, даже если он не член этого space</li>
<li>Но <code>SpaceMiddleware</code> проверяет членство раньше, так что в цепочке <code>RequireSpace() → RequireMinRole()</code> это не эксплуатируется</li>
<li>Однако если <code>RequireMinRole()</code> используется <strong>без</strong> <code>RequireSpace()</code> — это дыра</li>
</ul>
<p><strong>Рекомендация:</strong> Удалить fallback на <code>ContextRole</code>. Если <code>ContextSpaceRole</code> пуст — отказывать.</p>
<h3 id="35-рекомендации-по-правам-доступа">3.5. Рекомендации по правам доступа</h3>
<ol>
<li>Реализовать Input Validation на всех уровнях</li>
<li>Перейти на HTTP-only cookies для токенов</li>
<li>Реализовать rate limiting middleware</li>
<li>Добавить CSRF protection</li>
<li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li>
<li>Реализовать proper logging и мониторинг</li>
<li>Добавить автоматические тесты безопасности</li>
<li><strong>Удалить модалку участников диаграммы</strong> на фронтенде — она мертва</li>
<li><strong>Или</strong> добавить раздел «Участники Space» с возможностью управления ролями через <code>/spaces/:space_id/members</code> (эти endpoints работают)</li>
<li>Удалить fallback на <code>ContextRole</code> в <code>role_middleware.go</code></li>
<li>Добавить проверку: editor не может повысить кого-то до admin (сейчас может — <code>AddMember</code> разрешает editor+ назначать любую роль)</li>
</ol>
<h2 id="ux-улучшения">UX улучшения</h2>
<h3 id="критические-улучшения">Критические улучшения:</h3>
<ol>
<li><strong>Надежность аутентификации</strong> - Реализовать MFA</li>
<li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li>
<li><strong>Прогресс-бары</strong> - Для долгих операций</li>
</ol>
<h3 id="высокие-улучшения">Высокие улучшения:</h3>
<ol>
<li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li>
<li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li>
<li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li>
<li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li>
</ol>
<h3 id="средние-улучшения">Средние улучшения:</h3>
<ol>
<li><strong>Экспорт данных</strong> -多种 форматы</li>
<li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li>
<li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li>
<li><strong>Аналитика и отчеты</strong> - Insights по проектам</li>
</ol>
<h3 id="низкие-улучшения">Низкие улучшения:</h3>
<ol>
<li><strong>Mobile app</strong> - iOS/Android приложения</li>
<li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li>
<li><strong>API для плагинов</strong> - Расширяемость системы</li>
</ol>
<h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2>
<hr>
<h2 id="4-безопасность">4. Безопасность</h2>
<h3 id="41-критические">4.1. Критические</h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Файл</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>S1</td>
<td>JWT Secret = test</td>
<td><code>.env</code></td>
<td><code>JWT_SECRET=test_secret_key_change_in_production</code><strong>это прод-конфиг!</strong></td>
</tr>
<tr>
<td>S2</td>
<td>CORS: <code>*</code></td>
<td><code>.env</code></td>
<td><code>CORS_ALLOWED_ORIGINS=*</code> — любой домен может обращаться к API</td>
</tr>
<tr>
<td>S3</td>
<td>Пароль БД в .env</td>
<td><code>.env</code></td>
<td><code>DB_PASSWORD=popoloka16</code> — creds в открытом виде</td>
</tr>
<tr>
<td>S4</td>
<td>Refresh tokens: SHA256</td>
<td><code>utils/password.go</code></td>
<td>SHA256 вместо bcrypt для refresh token hash — быстро брутфорсится</td>
</tr>
</tbody>
</table>
<h3 id="42-высокие">4.2. Высокие</h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>S5</td>
<td>Нет rate limiting</td>
<td>Brute-force на <code>/auth/login</code> без ограничений</td>
</tr>
<tr>
<td>S6</td>
<td>Нет CSRF protection</td>
<td>API принимает POST/PUT/DELETE без CSRF-токена</td>
</tr>
<tr>
<td>S7</td>
<td>Нет CSP заголовков</td>
<td>X-Frame-Options, Content-Security-Policy не настроены</td>
</tr>
<tr>
<td>S8</td>
<td>JWT в localStorage</td>
<td>XSS может украсть access + refresh tokens</td>
</tr>
</tbody>
</table>
<h3 id="43-средние">4.3. Средние</h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>S9</td>
<td>Нет password policy</td>
<td>Минимальные требования к паролю не enforced</td>
</tr>
<tr>
<td>S10</td>
<td>Нет audit log</td>
<td>Действия с spaces/charts не логируются для аудита</td>
</tr>
<tr>
<td>S11</td>
<td>Нет блокировки аккаунта</td>
<td>Неограниченные попытки входа</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="5-инфраструктура">5. Инфраструктура</h2>
<h3 id="51-текущее-состояние">5.1. Текущее состояние</h3>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Статус</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td>Go API (pm2: leadera-api)</td>
<td>⚠️</td>
<td>Порт 8080, хост 0.0.0.0</td>
</tr>
<tr>
<td>Angular FE (pm2: leadera-fe)</td>
<td>⚠️</td>
<td>Порт 4200, хост 0.0.0.0</td>
</tr>
<tr>
<td>PostgreSQL (Docker)</td>
<td></td>
<td>Порт 5432, контейнер app-leadera-db</td>
</tr>
<tr>
<td>VPS reverse proxy</td>
<td>⚠️</td>
<td>sand.a2v.space → 8082/8083, но 502 если сервисы не запущены</td>
</tr>
<tr>
<td>SSL</td>
<td></td>
<td>Let&rsquo;s Encrypt на VPS</td>
</tr>
</tbody>
</table>
<h3 id="52-проблемы">5.2. Проблемы</h3>
<table>
<thead>
<tr>
<th>#</th>
<th>Проблема</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>I1</td>
<td>Docker для БД, нативно для API</td>
<td>Несогласованность — API и FE не в Docker</td>
</tr>
<tr>
<td>I2</td>
<td>Нет health-check в pm2</td>
<td>API может упасть без перезапуска</td>
</tr>
<tr>
<td>I3</td>
<td>Нет CI/CD</td>
<td>Ручной деплой через <code>make run</code> + pm2</td>
</tr>
<tr>
<td>I4</td>
<td>Нет nginx на Mac Studio</td>
<td>FE и API торчат наружу напрямую</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="6-функциональная-оценка">6. Функциональная оценка</h2>
<h3 id="61-что-работает">6.1. Что работает</h3>
<table>
<thead>
<tr>
<th>Функция</th>
<th>Backend</th>
<th>Frontend</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<tr>
<td>Регистрация/логин</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>JWT auth + refresh</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>Spaces CRUD</td>
<td>⚠️</td>
<td></td>
<td><code>RegisterProtectedRoutes</code> не вызван (C4)</td>
</tr>
<tr>
<td>Space members</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>Gantt charts CRUD</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>Gantt sections</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>Gantt tasks</td>
<td></td>
<td>⚠️</td>
<td>Нет UI для задач внутри диаграммы</td>
</tr>
<tr>
<td>Архивация диаграмм</td>
<td></td>
<td></td>
<td>Работает</td>
</tr>
<tr>
<td>Members диаграммы</td>
<td></td>
<td>✅ (мёртвый UI)</td>
<td>Backend endpoints не существуют</td>
</tr>
</tbody>
</table>
<h3 id="62-что-не-работает-или-отсутствует">6.2. Что НЕ работает или отсутствует</h3>
<table>
<thead>
<tr>
<th>Функция</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<tr>
<td>Визуализация Ганта (таймлайн)</td>
<td>❌ Нет компонента отрисовки</td>
</tr>
<tr>
<td>Drag &amp; Drop задач</td>
<td></td>
</tr>
<tr>
<td>Real-time collaboration</td>
<td></td>
</tr>
<tr>
<td>Уведомления</td>
<td></td>
</tr>
<tr>
<td>Поиск</td>
<td></td>
</tr>
<tr>
<td>Экспорт (PDF/Excel)</td>
<td></td>
</tr>
<tr>
<td>Email verification</td>
<td></td>
</tr>
<tr>
<td>Password reset</td>
<td>Backend есть, UI есть — не проверено</td>
</tr>
</tbody>
</table>
<h3 id="63-оценка-готовности">6.3. Оценка готовности</h3>
<p><strong>Система на стадии каркаса.</strong> Backend API функционален для CRUD операций, но:</p>
<ul>
<li>Визуализация Ганта — основная фича — не реализована (нет canvas/SVG рендеринга)</li>
<li>Управление участниками только на уровне Space</li>
<li>Нет CI/CD, тестов, мониторинга</li>
</ul>
<hr>
<h2 id="7-приоритизированный-план-исправлений">7. Приоритизированный план исправлений</h2>
<h3 id="неделя-1--критическое-безопасность">Неделя 1 — Критическое (безопасность)</h3>
<table>
<thead>
<tr>
<th>Приоритет</th>
<th>Проблема</th>
<th>Файлы</th>
<th>Задача</th>
<th>Трудоёмкость</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Critical</strong></td>
<td>XSS уязвимости</td>
<td><code>internal/handlers/*.go</code></td>
<td>3 дня</td>
<td>P0</td>
<td>Заменить JWT secret на криптостойкий</td>
<td>1 час</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Хранение JWT в localStorage</td>
<td><code>src/app/core/auth/*.ts</code></td>
<td>1 день</td>
<td>P0</td>
<td>Настроить CORS (только sand.a2v.space)</td>
<td>1 час</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Небезопасное хранение refresh токенов</td>
<td><code>internal/utils/password.go</code></td>
<td>1 день</td>
<td>P0</td>
<td>bcrypt для refresh tokens вместо SHA256</td>
<td>2 часа</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Rate limiting middleware</td>
<td><code>internal/middleware/</code></td>
<td>2 дня</td>
<td>P0</td>
<td>Удалить fallback на ContextRole в role_middleware</td>
<td>30 мин</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>CSRF protection</td>
<td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td>
<td>2 дня</td>
<td>P0</td>
<td>Исправить <code>RegisterProtectedRoutes</code> — зарегистрировать маршруты</td>
<td>1 час</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Валидация входных данных</td>
<td><code>internal/handlers/</code>, <code>internal/utils/</code></td>
<td>3 дня</td>
<td>P1</td>
<td>Rate limiting на auth endpoints</td>
<td>4 часа</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Оптимизация запросов БД</td>
<td><code>internal/repository/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Структурированное логирование</td>
<td><code>internal/handlers/</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>CSP заголовки</td>
<td><code>src/index.html</code>, конфигурация сервера</td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>A11y улучшения</td>
<td><code>src/app/components/</code></td>
<td>3 дня</td>
<td>P1</td>
<td>Editor не может назначать admin роль</td>
<td>2 часа</td>
</tr>
</tbody>
</table>
<h3 id="общая-оценка">Общая оценка:</h3>
<ul>
<li><strong>Critical issues:</strong> 6 задач, 8 дней</li>
<li><strong>High issues:</strong> 5 задач, 7 дней</li>
<li><strong>Medium issues:</strong> 3 задачи, 6 дней</li>
<li><strong>Low issues:</strong> 4 задачи, 5 дней</li>
</ul>
<p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p>
<h3 id="рекомендуемый-порядок-работы">Рекомендуемый порядок работы:</h3>
<h3 id="неделя-2--архитектура-прав">Неделя 2 — Архитектура прав</h3>
<table>
<thead>
<tr>
<th>Приоритет</th>
<th>Задача</th>
<th>Трудоёмкость</th>
</tr>
</thead>
<tbody>
<tr>
<td>P1</td>
<td>Удалить/переписать MembersModalComponent → Space members</td>
<td>4 часа</td>
</tr>
<tr>
<td>P1</td>
<td>Добавить страницу управления участниками Space</td>
<td>8 часов</td>
</tr>
<tr>
<td>P2</td>
<td>HttpOnly cookies для JWT (вместо localStorage)</td>
<td>8 часов</td>
</tr>
<tr>
<td>P2</td>
<td>CSRF protection</td>
<td>4 часа</td>
</tr>
</tbody>
</table>
<h3 id="неделя-3--функциональность">Неделя 3 — Функциональность</h3>
<table>
<thead>
<tr>
<th>Приоритет</th>
<th>Задача</th>
<th>Трудоёмкость</th>
</tr>
</thead>
<tbody>
<tr>
<td>P2</td>
<td>Визуализация Ганта (canvas/d3)</td>
<td>40+ часов</td>
</tr>
<tr>
<td>P2</td>
<td>Drag &amp; Drop для задач</td>
<td>16 часов</td>
</tr>
<tr>
<td>P3</td>
<td>Тесты (unit + integration)</td>
<td>24 часа</td>
</tr>
<tr>
<td>P3</td>
<td>CI/CD pipeline</td>
<td>8 часов</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="8-резюме">8. Резюме</h2>
<h3 id="ключевые-выводы">Ключевые выводы</h3>
<ol>
<li><strong>Неделя 1:</strong> Решение всех critical проблем (безопасность)</li>
<li><strong>Неделя 2:</strong> High приоритетные улучшения (защита)</li>
<li><strong>Неделя 3:</strong> Medium и Low улучшения (качество и UX)</li>
<li><strong>Права доступа</strong> — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления <code>gantt_chart_members</code>.</li>
<li><strong>Безопасность</strong> — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя.</li>
<li><strong>Функциональность</strong> — CRUD работает, но основная ценность (визуализация Ганта) не реализована.</li>
<li><strong>Код</strong> — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты.</li>
</ol>
<p><strong>Примечание:</strong> Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.</p>
<h3 id="общая-оценка--pre-alpha">Общая оценка: 🔴 Pre-alpha</h3>
<p>Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.</p>
</div>
+1 -1
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
+1 -1
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
+1 -1
View File
@@ -168,7 +168,7 @@
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/architecture/">architecture</a></li>
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
+1 -1
View File
File diff suppressed because one or more lines are too long
+29 -14
View File
@@ -2,17 +2,44 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>/guides/leadera-audit/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/diary/2026-03-30/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/architecture/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/audit/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/diary/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/guides/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/infrastructure/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/leadera/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/mtproxy/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/ollama/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/openclaw/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/qwen/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/security/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
@@ -20,10 +47,10 @@
<loc>/tags/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/ux/</loc>
<loc>/tags/tasktracker/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/guides/leadera-audit/</loc>
<loc>/tags/vikunja/</loc>
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
</url><url>
<loc>/diary/2026-03-29/</loc>
@@ -52,9 +79,6 @@
</url><url>
<loc>/tags/devops/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/diary/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/docker/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
@@ -85,9 +109,6 @@
</url><url>
<loc>/tags/identity/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/infrastructure/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/kb/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
@@ -106,12 +127,6 @@
</url><url>
<loc>/tags/nginx/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/ollama/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/openclaw/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
</url><url>
<loc>/tags/opencode/</loc>
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Architecture — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Разделы</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Architecture</h1>
<ul>
<li><a href="../../guides/leadera-audit/">Аудит Leadera — полный отчёт</a></li>
</ul>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Architecture on docs.a2v.space</title>
<link>/tags/architecture/</link>
<description>Recent content in Architecture on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/architecture/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Аудит Leadera — полный отчёт</title>
<link>/guides/leadera-audit/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/guides/leadera-audit/</guid>
<description>&lt;h1 id=&#34;аудит-проекта-leadera&#34;&gt;Аудит проекта Leadera&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;Дата:&lt;/strong&gt; 30.03.2026&lt;br&gt;&#xA;&lt;strong&gt;Версия:&lt;/strong&gt; pre-production, миграции 15&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-обзор-проекта&#34;&gt;1. Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.&lt;/p&gt;&#xA;&lt;h3 id=&#34;стек&#34;&gt;Стек&lt;/h3&gt;&#xA;&lt;table&gt;&#xA; &lt;thead&gt;&#xA; &lt;tr&gt;&#xA; &lt;th&gt;Компонент&lt;/th&gt;&#xA; &lt;th&gt;Технологии&lt;/th&gt;&#xA; &lt;/tr&gt;&#xA; &lt;/thead&gt;&#xA; &lt;tbody&gt;&#xA; &lt;tr&gt;&#xA; &lt;td&gt;Backend&lt;/td&gt;&#xA; &lt;td&gt;Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256)&lt;/td&gt;&#xA; &lt;/tr&gt;&#xA; &lt;tr&gt;&#xA; &lt;td&gt;Frontend&lt;/td&gt;&#xA; &lt;td&gt;Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals&lt;/td&gt;&#xA; &lt;/tr&gt;&#xA; &lt;tr&gt;&#xA; &lt;td&gt;Инфраструктура&lt;/td&gt;&#xA; &lt;td&gt;Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru&lt;/td&gt;&#xA; &lt;/tr&gt;&#xA; &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;доменная-модель&#34;&gt;Доменная модель&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;User ──┬── Space (через space_members с role)&#xA;&#xA; └── GanttChart (принадлежит Space)&#xA; ├── GanttSection&#xA; └── GanttTask&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Роли:&lt;/strong&gt; admin, editor, viewer — назначаются &lt;strong&gt;на уровне Space&lt;/strong&gt; через таблицу &lt;code&gt;space_members&lt;/code&gt;.&lt;/p&gt;</description>
</item>
</channel>
</rss>
+1 -1
View File
@@ -109,7 +109,7 @@
<ul>
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
<li><a href="../../guides/leadera-audit/">Аудит Leadera — полный отчёт</a></li>
</ul>
</div>
File diff suppressed because one or more lines are too long
+15 -7
View File
@@ -109,13 +109,27 @@
<ul>
<li><a href="../tags/architecture/">Architecture</a></li>
<li><a href="../tags/audit/">Audit</a></li>
<li><a href="../tags/infrastructure/">Infrastructure</a></li>
<li><a href="../tags/leadera/">Leadera</a></li>
<li><a href="../tags/mtproxy/">Mtproxy</a></li>
<li><a href="../tags/ollama/">Ollama</a></li>
<li><a href="../tags/openclaw/">Openclaw</a></li>
<li><a href="../tags/qwen/">Qwen</a></li>
<li><a href="../tags/security/">Security</a></li>
<li><a href="../tags/ux/">Ux</a></li>
<li><a href="../tags/tasktracker/">Tasktracker</a></li>
<li><a href="../tags/vikunja/">Vikunja</a></li>
<li><a href="../tags/amnezia/">Amnezia</a></li>
@@ -145,18 +159,12 @@
<li><a href="../tags/identity/">Identity</a></li>
<li><a href="../tags/infrastructure/">Infrastructure</a></li>
<li><a href="../tags/llm/">Llm</a></li>
<li><a href="../tags/music/">Music</a></li>
<li><a href="../tags/nginx/">Nginx</a></li>
<li><a href="../tags/ollama/">Ollama</a></li>
<li><a href="../tags/openclaw/">Openclaw</a></li>
<li><a href="../tags/opencode/">Opencode</a></li>
<li><a href="../tags/postgresql/">Postgresql</a></li>
+52 -24
View File
@@ -8,6 +8,13 @@
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Architecture</title>
<link>/tags/architecture/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/architecture/</guid>
<description></description>
</item>
<item>
<title>Audit</title>
<link>/tags/audit/</link>
@@ -15,6 +22,13 @@
<guid>/tags/audit/</guid>
<description></description>
</item>
<item>
<title>Infrastructure</title>
<link>/tags/infrastructure/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/infrastructure/</guid>
<description></description>
</item>
<item>
<title>Leadera</title>
<link>/tags/leadera/</link>
@@ -22,6 +36,34 @@
<guid>/tags/leadera/</guid>
<description></description>
</item>
<item>
<title>Mtproxy</title>
<link>/tags/mtproxy/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/mtproxy/</guid>
<description></description>
</item>
<item>
<title>Ollama</title>
<link>/tags/ollama/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/ollama/</guid>
<description></description>
</item>
<item>
<title>Openclaw</title>
<link>/tags/openclaw/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/openclaw/</guid>
<description></description>
</item>
<item>
<title>Qwen</title>
<link>/tags/qwen/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/qwen/</guid>
<description></description>
</item>
<item>
<title>Security</title>
<link>/tags/security/</link>
@@ -30,10 +72,17 @@
<description></description>
</item>
<item>
<title>Ux</title>
<link>/tags/ux/</link>
<title>Tasktracker</title>
<link>/tags/tasktracker/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/ux/</guid>
<guid>/tags/tasktracker/</guid>
<description></description>
</item>
<item>
<title>Vikunja</title>
<link>/tags/vikunja/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/vikunja/</guid>
<description></description>
</item>
<item>
@@ -134,13 +183,6 @@
<guid>/tags/identity/</guid>
<description></description>
</item>
<item>
<title>Infrastructure</title>
<link>/tags/infrastructure/</link>
<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/infrastructure/</guid>
<description></description>
</item>
<item>
<title>Llm</title>
<link>/tags/llm/</link>
@@ -162,20 +204,6 @@
<guid>/tags/nginx/</guid>
<description></description>
</item>
<item>
<title>Ollama</title>
<link>/tags/ollama/</link>
<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/ollama/</guid>
<description></description>
</item>
<item>
<title>Openclaw</title>
<link>/tags/openclaw/</link>
<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
<guid>/tags/openclaw/</guid>
<description></description>
</item>
<item>
<title>Opencode</title>
<link>/tags/opencode/</link>
+2
View File
@@ -109,6 +109,8 @@
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
<li><a href="../../diary/2026-03-29/">29 марта 2026</a></li>
<li><a href="../../creds/vpn-vps/">VPN VPS</a></li>
+8 -1
View File
@@ -6,8 +6,15 @@
<description>Recent content in Infrastructure on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/infrastructure/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
<item>
<title>29 марта 2026</title>
<link>/diary/2026-03-29/</link>
+3 -1
View File
@@ -109,7 +109,9 @@
<ul>
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
<li><a href="../../guides/leadera-audit/">Аудит Leadera — полный отчёт</a></li>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
<li><a href="../../creds/leadera-db-docker/">Mac Studio — leadera-api БД (docker-compose)</a></li>
File diff suppressed because one or more lines are too long
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mtproxy — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Разделы</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Mtproxy</h1>
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
</ul>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Mtproxy on docs.a2v.space</title>
<link>/tags/mtproxy/</link>
<description>Recent content in Mtproxy on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/mtproxy/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
</channel>
</rss>
+2
View File
@@ -109,6 +109,8 @@
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
<li><a href="../../plans/ollama-openclaw/">Настроить интеграцию Ollama с OpenClaw</a></li>
</ul>
+8 -1
View File
@@ -6,8 +6,15 @@
<description>Recent content in Ollama on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/ollama/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
<item>
<title>Настроить интеграцию Ollama с OpenClaw</title>
<link>/plans/ollama-openclaw/</link>
+2
View File
@@ -109,6 +109,8 @@
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
<li><a href="../../plans/ollama-openclaw/">Настроить интеграцию Ollama с OpenClaw</a></li>
<li><a href="../../guides/claw-a2v-space/">Подключение claw.a2v.space (OpenClaw)</a></li>
+8 -1
View File
@@ -6,8 +6,15 @@
<description>Recent content in Openclaw on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/openclaw/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
<item>
<title>Настроить интеграцию Ollama с OpenClaw</title>
<link>/plans/ollama-openclaw/</link>
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Qwen — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Разделы</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Qwen</h1>
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
</ul>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Qwen on docs.a2v.space</title>
<link>/tags/qwen/</link>
<description>Recent content in Qwen on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/qwen/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
</channel>
</rss>
+1 -1
View File
@@ -109,7 +109,7 @@
<ul>
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
<li><a href="../../guides/leadera-audit/">Аудит Leadera — полный отчёт</a></li>
</ul>
</div>
File diff suppressed because one or more lines are too long
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Tasktracker — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Разделы</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Tasktracker</h1>
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
</ul>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Tasktracker on docs.a2v.space</title>
<link>/tags/tasktracker/</link>
<description>Recent content in Tasktracker on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/tasktracker/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
</channel>
</rss>
-2
View File
@@ -109,8 +109,6 @@
<ul>
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
</ul>
</div>
File diff suppressed because one or more lines are too long
+140
View File
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="ru-ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Vikunja — docs.a2v.space</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/custom.css">
</head>
<body>
<header class="site-header">
<nav class="navbar navbar-expand-lg">
<div class="container-fluid">
<a class="navbar-brand" href="../../">docs.a2v.space</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarMain">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="../../diary/">Дневник</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../kb/">База знаний</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../plans/">Планы</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../guides/">Инструкции</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../creds/">Креды</a>
</li>
</ul>
<form class="d-flex search-form" role="search">
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
<button class="btn btn-outline-light" type="submit">Найти</button>
</form>
</div>
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
</svg>
</button>
</div>
</nav>
<div id="search-results" class="search-results" style="display: none;">
<div class="search-results-content">
<button type="button" class="btn-close float-end" id="close-search"></button>
<h5>Результаты поиска</h5>
<ul id="results-list"></ul>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
<div class="sidebar-content">
<h6>Разделы</h6>
<ul class="nav flex-column">
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
</ul>
</div>
</aside>
<main class="col-md-9 col-lg-10 main-content">
<div class="article-content">
<h1>Vikunja</h1>
<ul>
<li><a href="../../diary/2026-03-30/">30 марта 2026</a></li>
</ul>
</div>
</main>
</div>
</div>
<footer class="site-footer">
<div class="container">
<p class="text-center mb-0">&copy; 2026 docs.a2v.space</p>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
<script src="../../js/search.js"></script>
<script src="../../js/creds.js"></script>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Vikunja on docs.a2v.space</title>
<link>/tags/vikunja/</link>
<description>Recent content in Vikunja on docs.a2v.space</description>
<generator>Hugo</generator>
<language>ru-ru</language>
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
<atom:link href="/tags/vikunja/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>30 марта 2026</title>
<link>/diary/2026-03-30/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/diary/2026-03-30/</guid>
<description>&lt;h2 id=&#34;timeline&#34;&gt;Timeline&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Утро/день&lt;/strong&gt; — Установили Vikunja (таск-трекер) на Mac Studio через Docker/Colima; URL: http://192.168.0.37:8095, проект «Leadera» (ID=2)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Загрузили 27 задач из аудита Leadera в Vikunja с приоритетами (P0–P3)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;День&lt;/strong&gt; — Начали реализацию Leadera TaskTracker по ТЗ (leadera-tasktracker-spec.md) через sub-agents (GLM-5.1): миграции, модели, DTOs, repositories, фронтенд-компоненты&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt;&lt;strong&gt;Откатили&lt;/strong&gt; TaskTracker по просьбе Антона (&lt;code&gt;git checkout + git clean&lt;/code&gt;): Claude Code падал на длинных задачах, sub-agents работали нестабильно; Plane не запустился (commercial edition)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Починили Qwen 3.5:9b для OpenClaw: модель была в конфиге, но не «активирована» через CLI — выполнено &lt;code&gt;openclaw models set ollama/qwen3.5:9b&lt;/code&gt; + возврат default на &lt;code&gt;zai/glm-5.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Установили MT Proxy на VPN VPS (185.234.64.52): Docker контейнер &lt;code&gt;mtproxy&lt;/code&gt;, порт 8443→443, секрет &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Вечер&lt;/strong&gt; — Антон подключился к claw.a2v.space с мобильного, одобрил устройство через &lt;code&gt;openclaw devices approve&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vikunja&#34;&gt;Vikunja&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;URL: http://192.168.0.37:8095&lt;/li&gt;&#xA;&lt;li&gt;API token: &lt;code&gt;tk_635fb7ac799d972ef32ed3bfb867bcc0985a3ae0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Проект Leadera: 27 задач из аудита&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mt-proxy&#34;&gt;MT Proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Сервер: 185.234.64.52:8443&lt;/li&gt;&#xA;&lt;li&gt;Секрет: &lt;code&gt;9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ссылка: &lt;code&gt;tg://proxy?server=185.234.64.52&amp;amp;port=8443&amp;amp;secret=9e40ae13999874305c87fd2777758188&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;уроки&#34;&gt;Уроки&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Claude Code не справляется с длинными задачами (SIGKILL) — лучше разбивать на мелкие&lt;/li&gt;&#xA;&lt;li&gt;OpenClaw требует «активации» моделей через CLI, не только конфиг&lt;/li&gt;&#xA;&lt;li&gt;Plane self-hosted commercial edition проблемный для локального запуска&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
</item>
</channel>
</rss>