diff --git a/public/guides/index.json b/public/guides/index.json
index 56c9280..8577041 100644
--- a/public/guides/index.json
+++ b/public/guides/index.json
@@ -1 +1 @@
-[{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"}]
\ No newline at end of file
+[{"content":"Обзор проекта Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:\nСтек технологий:\nБэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx Фронтенд: Angular (версия не указана), HttpClient Инфраструктура: Docker, PM2, Hugo для документации Архитектура:\nClean Architecture с разделением на слои (handlers, service, repository) RESTful API с использованием JWT для аутентификации Управление правами доступа через RBAC (Role-Based Access Control) Поддержка пространств (spaces) как основной изоляции данных PostgreSQL с миграциями через golang-migrate Основные сущности:\nПользователи (Users) Пространства (Spaces) Диаграммы Ганта (Gantt Charts) Секции диаграмм (Gantt Sections) Задачи (Gantt Tasks) Бекенд — найденные проблемы 1. Критичные уязвимости 1.1 Отсутствие валидации ввода данных Критичность: Critical\nФайл: internal/dto/auth/login_request.go:5-6\nОписание: В DTO используются базовые теги валидации (binding:\u0026quot;required,email\u0026quot;), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.\nРекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).\n1.2 Риск SQL-инъекций Критичность: High\nФайл: internal/repository/space_repository.go:68-73\nОписание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.\nРекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.\n1.3 Небезопасное хранение секретов Критичность: High\nФайл: internal/config/config.go:13-15\nОписание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.\nРекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.\n1.4 Отсутствие ограничений на частоту запросов Критичность: Medium\nОписание: Нет защиты от brute force атак на аутентификацию.\nРекомендация: Реализовать rate limiting для эндпоинтов аутентификации.\n2. Проблемы безопасности 2.1 XSS валидация Критичность: Medium\nФайл: internal/handlers/space_handler.go\nОписание: Нет очистки пользовательского ввода перед сохранением в базу данных.\nРекомендация: Добавить HTML экранирование пользовательских данных.\n2.2 Отсутствие CSRF защиты Критичность: Medium\nФайл: internal/middleware/cors_middleware.go\nОписание: Нет CSRF токенов или других механизмов защиты.\nРекомендация: Реализовать CSRF защиту для изменяющих операций.\n2.3 Небезопасная обработка ошибок Критичность: Medium\nФайл:/internal/utils/response.go\nОписание: Возвращаемые ошибки могут содержать внутренние детали реализации.\nРекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.\n3. Архитектурные проблемы 3.1 Отсутствие тестов Критичность: Medium\nФайл: Отсутствие тестовых файлов\nОписание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.\nРекомендация: Добавить покрытие тестами, особенно для критичных бизнес-логик.\n3.2 Отсутствие индексов в БД Критичность: Medium\nФайл: migrations/000001_create_users_table.up.sql:15-16\nОписание: Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.\nРекомендация: Добавить индексы для часто используемых запросов.\n3.3 Плохая обработка пагинации Критичность: Medium\nФайл: internal/repository/space_repository.go:39-45\nОписание: Пагинация реализована, но нет валидации параметров page и per_page.\nРекомендация: Добавить валидацию и ограничение на максимальное количество элементов на страницу.\n4. Проблемы конфигурации 4.1 Слабые настройки по умолчанию Критичность: Medium\nФайл: .env.example\nОписание: JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.\nРекомендация: Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.\n4.2 Небезопасные настройки CORS Критичность: Medium\nФайл: .env.example\nОписание: CORS разрешает любые origin в development.\nРекомендация: В продакшене использовать конкретные домены.\nФронтенд — найденные проблемы 1. Критичные уязвимости 1.1 Небезопасное хранение токенов Критичность: Critical\nФайл: src/app/core/auth/auth.service.ts:19-21\nОписание: Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.\nРекомендация: Перенести токены в httpOnly cookie или secure storage.\n1.2 Отсутствие валидации на клиенте Критичность: Medium\nФайл: src/app/core/auth/auth.models.ts\nОписание: Нет валидации email, пароля и других полей на клиенте.\nРекомендация: Добавить клиентскую валидацию форм перед отправкой запросов.\n2. Проблемы безопасности 2.1 Отсутствие CSP Критичность: Medium\nОписание: Нет Content Security Policy для защиты от XSS и других атак.\nРекомендация: Добавить заголовки CSP с разрешенными источниками.\n2.2 Нет ограничений на длину ввода Критичность: Medium\nОписание: Нет ограничения максимальной длины вводимых данных.\nРекомендация: Добавить maxlength атрибуты к input полям.\n3. UX проблемы 3.1 Нет индикации загрузки Критичность: Low\nФайл: src/app/core/auth/auth.service.ts:45-47\nОписание: Для некоторых операций нет индикации загрузки.\nРекомендация: Добавить skeleton loaders или spinners для всех асинхронных операций.\n3.2 Плохая обработка ошибок Критичность: Low\nФайл: src/app/core/auth/auth.interceptor.ts:28-32\nОписание: Обработка ошибок 401 не всегда приводит к корректному перенаправлению.\nРекомендация: Стандартизовать обработку ошибок и отображение пользователю.\nБезопасность Текущие меры безопасности Использование JWT токенов для аутентификации Параметризованные SQL запросы (защита от SQL инъекций) CORS настройка RBAC система через пространства и роли Пароли хранятся в виде хешей Refresh токены для управления сессиями Отсутствующие меры Rate limiting CSRF protection Content Security Policy Input validation middleware SQL injection protection for dynamic queries XSS protection Secure cookie storage Brute force protection Рекомендации по безопасности Реализовать rate limiting для аутентификации Добавить CSRF защиту Перенести JWT токены в httpOnly cookies Реализовать систему мониторинга и оповещений о подозрительной активности Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД) Реализовать ротацию секретов Добавить тесты безопасности UX улучшения Фронтенд Улучшить валидацию форм: Добавить реальную-time валидацию и подсказки Добавить индикацию загрузки: Skeleton loaders для всех асинхронных операций Улучшить обработку ошибок: Пользовательские сообщения об ошибках с возможностью повторной попытки Добавить отключенные состояния: Кнопки должны быть disabled во время загрузки Мобильная адаптация: Проверка и улучшение мобильного UI Доступность: Добавить ARIA labels и проверить доступность Бэкенд Улучшить пагинацию: Добавить валидацию и лимиты Добавить bulk операции: Оптимизировать массовые операции Улучшить обработку ошибок: Более информативные сообщения Добавить метрики: Время выполнения запросов, количество запросов Оптимизировать запросы: Проверка на N+1 запросы Приоритизированный план исправления Приоритет Проблема Файлы Трудоёмкость Critical Хранение JWT токенов в localStorage frontend/src/app/core/auth/auth.service.ts 2 часа Critical Отсутствие валидации ввода данных backend/internal/handlers/*.go 4 часа High Небезопасные настройки JWT backend/internal/config/config.go 1 час High Rate limiting для аутентификации backend/internal/middleware/ 3 часа Medium Отсутствие тестов backend/internal/ 8 часов Medium XSS валидация backend/internal/handlers/*.go 2 часа Medium CSRF защита backend/internal/middleware/ 2 часа Low UX улучшения (индикация загрузки) frontend/src/app/ 3 часа Low Оптимизация запросов backend/internal/repository/ 4 часа Low Документация API backend/api/ 2 часа Общая трудоёмкость: ~31 час\nРекомендуемый срок выполнения: 2-3 недели с учётом приоритетов\n","section":"guides","tags":["audit","leadera","security","ux"],"title":"Аудит Leadera","url":"/guides/leadera-audit/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"}]
\ No newline at end of file
diff --git a/public/guides/leadera-audit/index.html b/public/guides/leadera-audit/index.html
new file mode 100644
index 0000000..85ea24d
--- /dev/null
+++ b/public/guides/leadera-audit/index.html
@@ -0,0 +1,493 @@
+
+
+
+
+
+ Аудит Leadera — docs.a2v.space
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Инфраструктура: Docker, PM2, Hugo для документации
+
+
Архитектура:
+
+
Clean Architecture с разделением на слои (handlers, service, repository)
+
RESTful API с использованием JWT для аутентификации
+
Управление правами доступа через RBAC (Role-Based Access Control)
+
Поддержка пространств (spaces) как основной изоляции данных
+
PostgreSQL с миграциями через golang-migrate
+
+
Основные сущности:
+
+
Пользователи (Users)
+
Пространства (Spaces)
+
Диаграммы Ганта (Gantt Charts)
+
Секции диаграмм (Gantt Sections)
+
Задачи (Gantt Tasks)
+
+
Бекенд — найденные проблемы
+
1. Критичные уязвимости
+
1.1 Отсутствие валидации ввода данных
+
Критичность: Critical
+Файл: internal/dto/auth/login_request.go:5-6
+Описание: В DTO используются базовые теги валидации (binding:"required,email"), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.
+Рекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).
+
1.2 Риск SQL-инъекций
+
Критичность: High
+Файл: internal/repository/space_repository.go:68-73
+Описание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.
+Рекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.
+
1.3 Небезопасное хранение секретов
+
Критичность: High
+Файл: internal/config/config.go:13-15
+Описание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.
+Рекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.
+
1.4 Отсутствие ограничений на частоту запросов
+
Критичность: Medium
+Описание: Нет защиты от brute force атак на аутентификацию.
+Рекомендация: Реализовать rate limiting для эндпоинтов аутентификации.
+
2. Проблемы безопасности
+
2.1 XSS валидация
+
Критичность: Medium
+Файл: internal/handlers/space_handler.go
+Описание: Нет очистки пользовательского ввода перед сохранением в базу данных.
+Рекомендация: Добавить HTML экранирование пользовательских данных.
+
2.2 Отсутствие CSRF защиты
+
Критичность: Medium
+Файл: internal/middleware/cors_middleware.go
+Описание: Нет CSRF токенов или других механизмов защиты.
+Рекомендация: Реализовать CSRF защиту для изменяющих операций.
+
2.3 Небезопасная обработка ошибок
+
Критичность: Medium
+Файл:/internal/utils/response.go
+Описание: Возвращаемые ошибки могут содержать внутренние детали реализации.
+Рекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.
+
3. Архитектурные проблемы
+
3.1 Отсутствие тестов
+
Критичность: Medium
+Файл: Отсутствие тестовых файлов
+Описание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.
+Рекомендация: Добавить покрытие тестами, особенно для критичных бизнес-логик.
+
3.2 Отсутствие индексов в БД
+
Критичность: Medium
+Файл: migrations/000001_create_users_table.up.sql:15-16
+Описание: Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.
+Рекомендация: Добавить индексы для часто используемых запросов.
+
3.3 Плохая обработка пагинации
+
Критичность: Medium
+Файл: internal/repository/space_repository.go:39-45
+Описание: Пагинация реализована, но нет валидации параметров page и per_page.
+Рекомендация: Добавить валидацию и ограничение на максимальное количество элементов на страницу.
+
4. Проблемы конфигурации
+
4.1 Слабые настройки по умолчанию
+
Критичность: Medium
+Файл: .env.example
+Описание: JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.
+Рекомендация: Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.
+
4.2 Небезопасные настройки CORS
+
Критичность: Medium
+Файл: .env.example
+Описание: CORS разрешает любые origin в development.
+Рекомендация: В продакшене использовать конкретные домены.
+
Фронтенд — найденные проблемы
+
1. Критичные уязвимости
+
1.1 Небезопасное хранение токенов
+
Критичность: Critical
+Файл: src/app/core/auth/auth.service.ts:19-21
+Описание: Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.
+Рекомендация: Перенести токены в httpOnly cookie или secure storage.
+
1.2 Отсутствие валидации на клиенте
+
Критичность: Medium
+Файл: src/app/core/auth/auth.models.ts
+Описание: Нет валидации email, пароля и других полей на клиенте.
+Рекомендация: Добавить клиентскую валидацию форм перед отправкой запросов.
+
2. Проблемы безопасности
+
2.1 Отсутствие CSP
+
Критичность: Medium
+Описание: Нет Content Security Policy для защиты от XSS и других атак.
+Рекомендация: Добавить заголовки CSP с разрешенными источниками.
+
2.2 Нет ограничений на длину ввода
+
Критичность: Medium
+Описание: Нет ограничения максимальной длины вводимых данных.
+Рекомендация: Добавить maxlength атрибуты к input полям.
+
3. UX проблемы
+
3.1 Нет индикации загрузки
+
Критичность: Low
+Файл: src/app/core/auth/auth.service.ts:45-47
+Описание: Для некоторых операций нет индикации загрузки.
+Рекомендация: Добавить skeleton loaders или spinners для всех асинхронных операций.
+
3.2 Плохая обработка ошибок
+
Критичность: Low
+Файл: src/app/core/auth/auth.interceptor.ts:28-32
+Описание: Обработка ошибок 401 не всегда приводит к корректному перенаправлению.
+Рекомендация: Стандартизовать обработку ошибок и отображение пользователю.
+
Безопасность
+
Текущие меры безопасности
+
+
Использование JWT токенов для аутентификации
+
Параметризованные SQL запросы (защита от SQL инъекций)
+
CORS настройка
+
RBAC система через пространства и роли
+
Пароли хранятся в виде хешей
+
Refresh токены для управления сессиями
+
+
Отсутствующие меры
+
+
Rate limiting
+
CSRF protection
+
Content Security Policy
+
Input validation middleware
+
SQL injection protection for dynamic queries
+
XSS protection
+
Secure cookie storage
+
Brute force protection
+
+
Рекомендации по безопасности
+
+
Реализовать rate limiting для аутентификации
+
Добавить CSRF защиту
+
Перенести JWT токены в httpOnly cookies
+
Реализовать систему мониторинга и оповещений о подозрительной активности
+
Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)
+
Реализовать ротацию секретов
+
Добавить тесты безопасности
+
+
UX улучшения
+
Фронтенд
+
+
Улучшить валидацию форм: Добавить реальную-time валидацию и подсказки
+
Добавить индикацию загрузки: Skeleton loaders для всех асинхронных операций
+
Улучшить обработку ошибок: Пользовательские сообщения об ошибках с возможностью повторной попытки
+
Добавить отключенные состояния: Кнопки должны быть disabled во время загрузки
+
Мобильная адаптация: Проверка и улучшение мобильного UI
+
Доступность: Добавить ARIA labels и проверить доступность
+
+
Бэкенд
+
+
Улучшить пагинацию: Добавить валидацию и лимиты
+
Добавить bulk операции: Оптимизировать массовые операции
+
Улучшить обработку ошибок: Более информативные сообщения
+
Добавить метрики: Время выполнения запросов, количество запросов
+
Оптимизировать запросы: Проверка на N+1 запросы
+
+
Приоритизированный план исправления
+
+
+
+
Приоритет
+
Проблема
+
Файлы
+
Трудоёмкость
+
+
+
+
+
Critical
+
Хранение JWT токенов в localStorage
+
frontend/src/app/core/auth/auth.service.ts
+
2 часа
+
+
+
Critical
+
Отсутствие валидации ввода данных
+
backend/internal/handlers/*.go
+
4 часа
+
+
+
High
+
Небезопасные настройки JWT
+
backend/internal/config/config.go
+
1 час
+
+
+
High
+
Rate limiting для аутентификации
+
backend/internal/middleware/
+
3 часа
+
+
+
Medium
+
Отсутствие тестов
+
backend/internal/
+
8 часов
+
+
+
Medium
+
XSS валидация
+
backend/internal/handlers/*.go
+
2 часа
+
+
+
Medium
+
CSRF защита
+
backend/internal/middleware/
+
2 часа
+
+
+
Low
+
UX улучшения (индикация загрузки)
+
frontend/src/app/
+
3 часа
+
+
+
Low
+
Оптимизация запросов
+
backend/internal/repository/
+
4 часа
+
+
+
Low
+
Документация API
+
backend/api/
+
2 часа
+
+
+
+
Общая трудоёмкость: ~31 час
+Рекомендуемый срок выполнения: 2-3 недели с учётом приоритетов
diff --git a/public/index.json b/public/index.json
index 553ab29..673c1e0 100644
--- a/public/index.json
+++ b/public/index.json
@@ -1 +1 @@
-[{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"},{"content":"Basic Authentication Username: agaltsovav Password: Magamet787! Конфигурация Nginx server { listen 8091; server_name docs.a2v.space; auth_basic \u0026#34;Restricted Access\u0026#34;; auth_basic_user_file /etc/nginx/.htpasswd; } Доступ URL: https://docs.a2v.space (через reverse proxy) Local: http://localhost:8091 (для разработки) Auth: всегда требуется Мастер-пароль для шифрования Важно: Пароль для расшифровки файлов в разделе creds/\nMaster Password: Popoloka16! Шифрование Алгоритм: AES-256-GCM Хранилище: client-side encryption Файлы шифруются при сохранении Расшифровываются при чтении ","section":"creds","tags":["docs","authentication","nginx"],"title":"docs.a2v.space Basic Auth","url":"/creds/docs-a2v-space-auth/"},{"content":"Docker Compose креды (~/Projects/eversolo-companion/docker-compose.yml) services: postgres: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: eversolo Локальные креды (.env файл) POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_DB=eversolo Хостинг Host: localhost Port: 5433 Database: eversolo Безопасность Используйте разные пароли для production Включите SSL для удаленного подключения Регулярно делайте бэкапы ","section":"creds","tags":["eversolo","companion","postgresql","docker"],"title":"Eversolo Companion PostgreSQL","url":"/creds/eversolo-companion-postgres/"},{"content":"Eversolo T8 — музыкальный стример.\nIP: 192.168.0.156 Порт: 9529 Авторизация: нет\nБазовый URL: http://192.168.0.156:9529\nВоспроизведение Действие URL Play/Pause /ZidooMusicControl/v2/playOrPause Следующий трек /ZidooMusicControl/v2/playNext Предыдущий трек /ZidooMusicControl/v2/playLast Перемотка (ms) /ZidooMusicControl/v2/seekTo?time=\u0026lt;ms\u0026gt; Воспроизвести по ID /ZidooMusicControl/v2/playMusic?type=4\u0026amp;id=\u0026lt;id\u0026gt; Состояние /ZidooMusicControl/v2/getState Громкость Действие URL Громкость вверх /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeUp Громкость вниз /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeDown Точная громкость /ZidooMusicControl/v2/setDevicesVolume?volume=\u0026lt;0-200\u0026gt; Mute /ZidooMusicControl/v2/setMuteVolume?isMute=1 Unmute /ZidooMusicControl/v2/setMuteVolume?isMute=0 Входы/Выходы Действие URL Получить список /ZidooMusicControl/v2/getInputAndOutputList Установить вход /ZidooMusicControl/v2/setInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Установить выход /ZidooMusicControl/v2/setOutInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Теги выхода: RCA, XLRRCA, XLR, HDMI, SPDIF, USB\nДисплей Действие URL Яркость экрана (get) /SystemSettings/displaySettings/getScreenBrightness Яркость экрана (set) /SystemSettings/displaySettings/setScreenBrightness?index=\u0026lt;0-115\u0026gt; Яркость ручки (get) /SystemSettings/displaySettings/getKnobBrightness Яркость ручки (set) /SystemSettings/displaySettings/setKnobBrightness?index=\u0026lt;0-255\u0026gt; VU-режим (get) /SystemSettings/displaySettings/getVUModeList VU-режим (set) /SystemSettings/displaySettings/setVUMode?index=\u0026lt;n\u0026gt; Спектр (get) /SystemSettings/displaySettings/getSpPlayModeList Спектр (set) /SystemSettings/displaySettings/setSpPlayModeList?index=\u0026lt;n\u0026gt; Переключить VU/Спектр `/ZidooMusicControl/v2/changVUDisplay?openType=\u0026lt;0 Питание Действие URL Параметры питания /ZidooMusicControl/v2/getPowerOption Перезагрузка /ZidooMusicControl/v2/setPowerOption?tag=reboot Выключение /ZidooMusicControl/v2/setPowerOption?tag=poweroff Переключить экран /ZidooMusicControl/v2/setPowerOption?tag=screen Включить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.ON Выключить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.OFF Поиск Поиск URL По трекам /ZidooMusicControl/v2/searchMusicV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По артистам /ZidooMusicControl/v2/searchArtistV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По альбомам /ZidooMusicControl/v2/searchAlbumV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 Обложки и устройство Действие URL Обложка по ID /ZidooMusicControl/v2/getImage?id=\u0026lt;song_id\u0026gt;\u0026amp;target=16 Модель устройства /ControlCenter/getModel Источники Zidoo Forum Home Assistant Integration ","section":"kb","tags":["api","eversolo","music","streamer"],"title":"Eversolo T8 API","url":"/kb/eversolo-api/"},{"content":"\nNYVK4PEGwmOHmAnGk8IAUc+lyFJtnEAvX6ZddBro/ILRWHOXBGYywgglFvQZ18BLDLb5DuA8GPAIdB/LwTHRXYO0KsmtlZQVWGEeeXlXAoEXpa5theoOQhebkW6LmiKyNGAVW2z9rK3nz6NnztYdn49LvGMjrHuR4IwCLbl/pYa96CPNRnxGDFlduFi8lMSspM0rBFi/bZhNGhzy36ViCl+aKr5P9cle0ZvM8E8av/6c5JjgDt88QFI3VYdTaTCE0+uHsXlnJN7Qgg/KH7kD\n\n\n","section":"creds","tags":["postgresql","docker-compose","leadera","database"],"title":"Mac Studio — leadera-api БД (docker-compose)","url":"/creds/leadera-db-docker/"},{"content":"\np7Iw7Y3zbj1kLBcbOXGoO27oDwF85AhxBW7saT538hxi0ogJpyFeM49GDuLHzxuyknvdNC/rx3tb4AFnGkCeHSrrCmj+VK8Zxt7ujeujVJSRuOeeUlsqkHdlmaiXl2KQknrIsqVCi3Tnn0V5qcFxvo+1Ktc+surF6bBpWrTHzWV5mLtWVfD6C6kvvP/UFldFBD6v+FQs79yfoOe/j/bUrtpt6v5VndbbBmhUAQcy1BV2rpXxO373dTcLQ6coRWkt/RFo\n\n\n","section":"creds","tags":["postgresql","docker","leadera","database"],"title":"Mac Studio — leadera-api БД (локальная)","url":"/creds/leadera-db-local/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"\nYEI16NAJ78d3lmSa/lca8Zxczt+u6GyMUYHduX47VoFQdj0Ixozd8R6yXoB7eM+AjhCtNGkOxGlOj2s73ABOBjLEIVIhD4Z+xTyzdtah4VpyLoltYOeNYsnbIIFARdF/FBYq5COXohhXs33K5ozznrtDd/awbKMjl/sbQqjXAZ+A3ZSob6/5uU+fFKetXLR6v4ZLAYQ57iiD21ImSLSggwv+rJgK5XyPDKEPD4N5nOsiDrLgoukVBMvgJ54PqfPp2Hni+2tdKOlMnOG2npTuu4SkyALcfFar\n\n\n","section":"creds","tags":["vpn","amnezia","infrastructure"],"title":"VPN VPS","url":"/creds/vpn-vps/"},{"content":"\nIpYXLMtgCFlGQ550DZCLjq37VsnNqL08Rn03iRS7kQ7ozBZNsiZySFzDAvYh4xIHytRDy0Sz0KGUXekr0S+cNiJsmtZ8kj0Pd0JhevhxTMZF2khFvs/LFWoTL5ZwAJ34y/qfLw2gaWX90VZDu0wO+KeAQeXhrWmol/2zUlfWX1AihyYqD2vRz+h2FcjD8ubYOXG35PyX7OlV1HPXgDv5X/bFNrxzPc867UOwB4aGxY9a\n\n\n","section":"creds","tags":["vps","reg.ru","infrastructure"],"title":"VPS reg.ru","url":"/creds/vps-reg-ru/"},{"content":"Описание Завершить разработку Eversolo Companion после решения проблемы с сетевым доступом.\nЧто сделано Backend (Go + Gin): собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17): собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов PostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Спецификация: полная в ~/Projects/eversolo-companion/SPEC.md Проблема API не может достучаться до Eversolo T8 (192.168.0.156:9529) из-за ограничений OpenClaw sandbox.\nВозможные решения Настроить tools.elevated.allowFrom.webchat для разрешения сетевых соединений Запустить API через launchd plist (как SSH туннели) Использовать отдельный контейнер без ограничений Этапы 3-9 (после решения сети) Библиотека синхронизации — двухсторонний sync с Eversolo Плейлисты — импорт/экспорт, редактирование Scrobbler — Last.fm / ListenBrainz Обложки — кэширование, отображение в UI Плеер — улучшенный интерфейс управления Система уведомлений — события от Eversolo Администрирование — настройка подключений Связанные ресурсы Спецификация проекта API документация Дневник разработки ","section":"plans","tags":["eversolo","companion","angular","go","docker"],"title":"Завершить Eversolo Companion - этапы 3-9","url":"/plans/eversolo-companion-phases-3-9/"},{"content":"Описание Добавить поддержку Ollama в OpenClaw для использования локальных LLM моделей.\nПроблема Модель qwen3.5:9b добавлена в конфиг openclaw.json, но не отображается в openclaw models list.\nСтатус Отложено по решению Антона.\n","section":"plans","tags":["ollama","openclaw","llm"],"title":"Настроить интеграцию Ollama с OpenClaw","url":"/plans/ollama-openclaw/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"},{"content":"Описание Добавить инструменты управления Eversolo T8 в OpenClaw.\nЧто сделано Изучен полный API Eversolo T8 (см. Базу знаний) Проблема Sandbox OpenClaw не имеет доступа к локальной сети, где находится Eversolo.\nВозможные решения Настроить проброс портов Запустить OpenClaw без sandbox-ограничений Использовать промежуточный proxy-сервис ","section":"plans","tags":["eversolo","openclaw","api"],"title":"Реализовать управление Eversolo из OpenClaw","url":"/plans/eversolo-control/"}]
\ No newline at end of file
+[{"content":"Обзор проекта Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:\nСтек технологий:\nБэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx Фронтенд: Angular (версия не указана), HttpClient Инфраструктура: Docker, PM2, Hugo для документации Архитектура:\nClean Architecture с разделением на слои (handlers, service, repository) RESTful API с использованием JWT для аутентификации Управление правами доступа через RBAC (Role-Based Access Control) Поддержка пространств (spaces) как основной изоляции данных PostgreSQL с миграциями через golang-migrate Основные сущности:\nПользователи (Users) Пространства (Spaces) Диаграммы Ганта (Gantt Charts) Секции диаграмм (Gantt Sections) Задачи (Gantt Tasks) Бекенд — найденные проблемы 1. Критичные уязвимости 1.1 Отсутствие валидации ввода данных Критичность: Critical\nФайл: internal/dto/auth/login_request.go:5-6\nОписание: В DTO используются базовые теги валидации (binding:\u0026quot;required,email\u0026quot;), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.\nРекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).\n1.2 Риск SQL-инъекций Критичность: High\nФайл: internal/repository/space_repository.go:68-73\nОписание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.\nРекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.\n1.3 Небезопасное хранение секретов Критичность: High\nФайл: internal/config/config.go:13-15\nОписание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.\nРекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.\n1.4 Отсутствие ограничений на частоту запросов Критичность: Medium\nОписание: Нет защиты от brute force атак на аутентификацию.\nРекомендация: Реализовать rate limiting для эндпоинтов аутентификации.\n2. Проблемы безопасности 2.1 XSS валидация Критичность: Medium\nФайл: internal/handlers/space_handler.go\nОписание: Нет очистки пользовательского ввода перед сохранением в базу данных.\nРекомендация: Добавить HTML экранирование пользовательских данных.\n2.2 Отсутствие CSRF защиты Критичность: Medium\nФайл: internal/middleware/cors_middleware.go\nОписание: Нет CSRF токенов или других механизмов защиты.\nРекомендация: Реализовать CSRF защиту для изменяющих операций.\n2.3 Небезопасная обработка ошибок Критичность: Medium\nФайл:/internal/utils/response.go\nОписание: Возвращаемые ошибки могут содержать внутренние детали реализации.\nРекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.\n3. Архитектурные проблемы 3.1 Отсутствие тестов Критичность: Medium\nФайл: Отсутствие тестовых файлов\nОписание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.\nРекомендация: Добавить покрытие тестами, особенно для критичных бизнес-логик.\n3.2 Отсутствие индексов в БД Критичность: Medium\nФайл: migrations/000001_create_users_table.up.sql:15-16\nОписание: Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.\nРекомендация: Добавить индексы для часто используемых запросов.\n3.3 Плохая обработка пагинации Критичность: Medium\nФайл: internal/repository/space_repository.go:39-45\nОписание: Пагинация реализована, но нет валидации параметров page и per_page.\nРекомендация: Добавить валидацию и ограничение на максимальное количество элементов на страницу.\n4. Проблемы конфигурации 4.1 Слабые настройки по умолчанию Критичность: Medium\nФайл: .env.example\nОписание: JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.\nРекомендация: Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.\n4.2 Небезопасные настройки CORS Критичность: Medium\nФайл: .env.example\nОписание: CORS разрешает любые origin в development.\nРекомендация: В продакшене использовать конкретные домены.\nФронтенд — найденные проблемы 1. Критичные уязвимости 1.1 Небезопасное хранение токенов Критичность: Critical\nФайл: src/app/core/auth/auth.service.ts:19-21\nОписание: Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.\nРекомендация: Перенести токены в httpOnly cookie или secure storage.\n1.2 Отсутствие валидации на клиенте Критичность: Medium\nФайл: src/app/core/auth/auth.models.ts\nОписание: Нет валидации email, пароля и других полей на клиенте.\nРекомендация: Добавить клиентскую валидацию форм перед отправкой запросов.\n2. Проблемы безопасности 2.1 Отсутствие CSP Критичность: Medium\nОписание: Нет Content Security Policy для защиты от XSS и других атак.\nРекомендация: Добавить заголовки CSP с разрешенными источниками.\n2.2 Нет ограничений на длину ввода Критичность: Medium\nОписание: Нет ограничения максимальной длины вводимых данных.\nРекомендация: Добавить maxlength атрибуты к input полям.\n3. UX проблемы 3.1 Нет индикации загрузки Критичность: Low\nФайл: src/app/core/auth/auth.service.ts:45-47\nОписание: Для некоторых операций нет индикации загрузки.\nРекомендация: Добавить skeleton loaders или spinners для всех асинхронных операций.\n3.2 Плохая обработка ошибок Критичность: Low\nФайл: src/app/core/auth/auth.interceptor.ts:28-32\nОписание: Обработка ошибок 401 не всегда приводит к корректному перенаправлению.\nРекомендация: Стандартизовать обработку ошибок и отображение пользователю.\nБезопасность Текущие меры безопасности Использование JWT токенов для аутентификации Параметризованные SQL запросы (защита от SQL инъекций) CORS настройка RBAC система через пространства и роли Пароли хранятся в виде хешей Refresh токены для управления сессиями Отсутствующие меры Rate limiting CSRF protection Content Security Policy Input validation middleware SQL injection protection for dynamic queries XSS protection Secure cookie storage Brute force protection Рекомендации по безопасности Реализовать rate limiting для аутентификации Добавить CSRF защиту Перенести JWT токены в httpOnly cookies Реализовать систему мониторинга и оповещений о подозрительной активности Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД) Реализовать ротацию секретов Добавить тесты безопасности UX улучшения Фронтенд Улучшить валидацию форм: Добавить реальную-time валидацию и подсказки Добавить индикацию загрузки: Skeleton loaders для всех асинхронных операций Улучшить обработку ошибок: Пользовательские сообщения об ошибках с возможностью повторной попытки Добавить отключенные состояния: Кнопки должны быть disabled во время загрузки Мобильная адаптация: Проверка и улучшение мобильного UI Доступность: Добавить ARIA labels и проверить доступность Бэкенд Улучшить пагинацию: Добавить валидацию и лимиты Добавить bulk операции: Оптимизировать массовые операции Улучшить обработку ошибок: Более информативные сообщения Добавить метрики: Время выполнения запросов, количество запросов Оптимизировать запросы: Проверка на N+1 запросы Приоритизированный план исправления Приоритет Проблема Файлы Трудоёмкость Critical Хранение JWT токенов в localStorage frontend/src/app/core/auth/auth.service.ts 2 часа Critical Отсутствие валидации ввода данных backend/internal/handlers/*.go 4 часа High Небезопасные настройки JWT backend/internal/config/config.go 1 час High Rate limiting для аутентификации backend/internal/middleware/ 3 часа Medium Отсутствие тестов backend/internal/ 8 часов Medium XSS валидация backend/internal/handlers/*.go 2 часа Medium CSRF защита backend/internal/middleware/ 2 часа Low UX улучшения (индикация загрузки) frontend/src/app/ 3 часа Low Оптимизация запросов backend/internal/repository/ 4 часа Low Документация API backend/api/ 2 часа Общая трудоёмкость: ~31 час\nРекомендуемый срок выполнения: 2-3 недели с учётом приоритетов\n","section":"guides","tags":["audit","leadera","security","ux"],"title":"Аудит Leadera","url":"/guides/leadera-audit/"},{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"},{"content":"Basic Authentication Username: agaltsovav Password: Magamet787! Конфигурация Nginx server { listen 8091; server_name docs.a2v.space; auth_basic \u0026#34;Restricted Access\u0026#34;; auth_basic_user_file /etc/nginx/.htpasswd; } Доступ URL: https://docs.a2v.space (через reverse proxy) Local: http://localhost:8091 (для разработки) Auth: всегда требуется Мастер-пароль для шифрования Важно: Пароль для расшифровки файлов в разделе creds/\nMaster Password: Popoloka16! Шифрование Алгоритм: AES-256-GCM Хранилище: client-side encryption Файлы шифруются при сохранении Расшифровываются при чтении ","section":"creds","tags":["docs","authentication","nginx"],"title":"docs.a2v.space Basic Auth","url":"/creds/docs-a2v-space-auth/"},{"content":"Docker Compose креды (~/Projects/eversolo-companion/docker-compose.yml) services: postgres: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: eversolo Локальные креды (.env файл) POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_DB=eversolo Хостинг Host: localhost Port: 5433 Database: eversolo Безопасность Используйте разные пароли для production Включите SSL для удаленного подключения Регулярно делайте бэкапы ","section":"creds","tags":["eversolo","companion","postgresql","docker"],"title":"Eversolo Companion PostgreSQL","url":"/creds/eversolo-companion-postgres/"},{"content":"Eversolo T8 — музыкальный стример.\nIP: 192.168.0.156 Порт: 9529 Авторизация: нет\nБазовый URL: http://192.168.0.156:9529\nВоспроизведение Действие URL Play/Pause /ZidooMusicControl/v2/playOrPause Следующий трек /ZidooMusicControl/v2/playNext Предыдущий трек /ZidooMusicControl/v2/playLast Перемотка (ms) /ZidooMusicControl/v2/seekTo?time=\u0026lt;ms\u0026gt; Воспроизвести по ID /ZidooMusicControl/v2/playMusic?type=4\u0026amp;id=\u0026lt;id\u0026gt; Состояние /ZidooMusicControl/v2/getState Громкость Действие URL Громкость вверх /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeUp Громкость вниз /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeDown Точная громкость /ZidooMusicControl/v2/setDevicesVolume?volume=\u0026lt;0-200\u0026gt; Mute /ZidooMusicControl/v2/setMuteVolume?isMute=1 Unmute /ZidooMusicControl/v2/setMuteVolume?isMute=0 Входы/Выходы Действие URL Получить список /ZidooMusicControl/v2/getInputAndOutputList Установить вход /ZidooMusicControl/v2/setInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Установить выход /ZidooMusicControl/v2/setOutInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Теги выхода: RCA, XLRRCA, XLR, HDMI, SPDIF, USB\nДисплей Действие URL Яркость экрана (get) /SystemSettings/displaySettings/getScreenBrightness Яркость экрана (set) /SystemSettings/displaySettings/setScreenBrightness?index=\u0026lt;0-115\u0026gt; Яркость ручки (get) /SystemSettings/displaySettings/getKnobBrightness Яркость ручки (set) /SystemSettings/displaySettings/setKnobBrightness?index=\u0026lt;0-255\u0026gt; VU-режим (get) /SystemSettings/displaySettings/getVUModeList VU-режим (set) /SystemSettings/displaySettings/setVUMode?index=\u0026lt;n\u0026gt; Спектр (get) /SystemSettings/displaySettings/getSpPlayModeList Спектр (set) /SystemSettings/displaySettings/setSpPlayModeList?index=\u0026lt;n\u0026gt; Переключить VU/Спектр `/ZidooMusicControl/v2/changVUDisplay?openType=\u0026lt;0 Питание Действие URL Параметры питания /ZidooMusicControl/v2/getPowerOption Перезагрузка /ZidooMusicControl/v2/setPowerOption?tag=reboot Выключение /ZidooMusicControl/v2/setPowerOption?tag=poweroff Переключить экран /ZidooMusicControl/v2/setPowerOption?tag=screen Включить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.ON Выключить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.OFF Поиск Поиск URL По трекам /ZidooMusicControl/v2/searchMusicV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По артистам /ZidooMusicControl/v2/searchArtistV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По альбомам /ZidooMusicControl/v2/searchAlbumV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 Обложки и устройство Действие URL Обложка по ID /ZidooMusicControl/v2/getImage?id=\u0026lt;song_id\u0026gt;\u0026amp;target=16 Модель устройства /ControlCenter/getModel Источники Zidoo Forum Home Assistant Integration ","section":"kb","tags":["api","eversolo","music","streamer"],"title":"Eversolo T8 API","url":"/kb/eversolo-api/"},{"content":"\nNYVK4PEGwmOHmAnGk8IAUc+lyFJtnEAvX6ZddBro/ILRWHOXBGYywgglFvQZ18BLDLb5DuA8GPAIdB/LwTHRXYO0KsmtlZQVWGEeeXlXAoEXpa5theoOQhebkW6LmiKyNGAVW2z9rK3nz6NnztYdn49LvGMjrHuR4IwCLbl/pYa96CPNRnxGDFlduFi8lMSspM0rBFi/bZhNGhzy36ViCl+aKr5P9cle0ZvM8E8av/6c5JjgDt88QFI3VYdTaTCE0+uHsXlnJN7Qgg/KH7kD\n\n\n","section":"creds","tags":["postgresql","docker-compose","leadera","database"],"title":"Mac Studio — leadera-api БД (docker-compose)","url":"/creds/leadera-db-docker/"},{"content":"\np7Iw7Y3zbj1kLBcbOXGoO27oDwF85AhxBW7saT538hxi0ogJpyFeM49GDuLHzxuyknvdNC/rx3tb4AFnGkCeHSrrCmj+VK8Zxt7ujeujVJSRuOeeUlsqkHdlmaiXl2KQknrIsqVCi3Tnn0V5qcFxvo+1Ktc+surF6bBpWrTHzWV5mLtWVfD6C6kvvP/UFldFBD6v+FQs79yfoOe/j/bUrtpt6v5VndbbBmhUAQcy1BV2rpXxO373dTcLQ6coRWkt/RFo\n\n\n","section":"creds","tags":["postgresql","docker","leadera","database"],"title":"Mac Studio — leadera-api БД (локальная)","url":"/creds/leadera-db-local/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"\nYEI16NAJ78d3lmSa/lca8Zxczt+u6GyMUYHduX47VoFQdj0Ixozd8R6yXoB7eM+AjhCtNGkOxGlOj2s73ABOBjLEIVIhD4Z+xTyzdtah4VpyLoltYOeNYsnbIIFARdF/FBYq5COXohhXs33K5ozznrtDd/awbKMjl/sbQqjXAZ+A3ZSob6/5uU+fFKetXLR6v4ZLAYQ57iiD21ImSLSggwv+rJgK5XyPDKEPD4N5nOsiDrLgoukVBMvgJ54PqfPp2Hni+2tdKOlMnOG2npTuu4SkyALcfFar\n\n\n","section":"creds","tags":["vpn","amnezia","infrastructure"],"title":"VPN VPS","url":"/creds/vpn-vps/"},{"content":"\nIpYXLMtgCFlGQ550DZCLjq37VsnNqL08Rn03iRS7kQ7ozBZNsiZySFzDAvYh4xIHytRDy0Sz0KGUXekr0S+cNiJsmtZ8kj0Pd0JhevhxTMZF2khFvs/LFWoTL5ZwAJ34y/qfLw2gaWX90VZDu0wO+KeAQeXhrWmol/2zUlfWX1AihyYqD2vRz+h2FcjD8ubYOXG35PyX7OlV1HPXgDv5X/bFNrxzPc867UOwB4aGxY9a\n\n\n","section":"creds","tags":["vps","reg.ru","infrastructure"],"title":"VPS reg.ru","url":"/creds/vps-reg-ru/"},{"content":"Описание Завершить разработку Eversolo Companion после решения проблемы с сетевым доступом.\nЧто сделано Backend (Go + Gin): собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17): собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов PostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Спецификация: полная в ~/Projects/eversolo-companion/SPEC.md Проблема API не может достучаться до Eversolo T8 (192.168.0.156:9529) из-за ограничений OpenClaw sandbox.\nВозможные решения Настроить tools.elevated.allowFrom.webchat для разрешения сетевых соединений Запустить API через launchd plist (как SSH туннели) Использовать отдельный контейнер без ограничений Этапы 3-9 (после решения сети) Библиотека синхронизации — двухсторонний sync с Eversolo Плейлисты — импорт/экспорт, редактирование Scrobbler — Last.fm / ListenBrainz Обложки — кэширование, отображение в UI Плеер — улучшенный интерфейс управления Система уведомлений — события от Eversolo Администрирование — настройка подключений Связанные ресурсы Спецификация проекта API документация Дневник разработки ","section":"plans","tags":["eversolo","companion","angular","go","docker"],"title":"Завершить Eversolo Companion - этапы 3-9","url":"/plans/eversolo-companion-phases-3-9/"},{"content":"Описание Добавить поддержку Ollama в OpenClaw для использования локальных LLM моделей.\nПроблема Модель qwen3.5:9b добавлена в конфиг openclaw.json, но не отображается в openclaw models list.\nСтатус Отложено по решению Антона.\n","section":"plans","tags":["ollama","openclaw","llm"],"title":"Настроить интеграцию Ollama с OpenClaw","url":"/plans/ollama-openclaw/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"},{"content":"Описание Добавить инструменты управления Eversolo T8 в OpenClaw.\nЧто сделано Изучен полный API Eversolo T8 (см. Базу знаний) Проблема Sandbox OpenClaw не имеет доступа к локальной сети, где находится Eversolo.\nВозможные решения Настроить проброс портов Запустить OpenClaw без sandbox-ограничений Использовать промежуточный proxy-сервис ","section":"plans","tags":["eversolo","openclaw","api"],"title":"Реализовать управление Eversolo из OpenClaw","url":"/plans/eversolo-control/"}]
\ No newline at end of file
diff --git a/public/sitemap.xml b/public/sitemap.xml
index 9d466fd..4a1767c 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -2,6 +2,30 @@
+ /tags/audit/
+ 2026-03-30T00:00:00+00:00
+
+ /
+ 2026-03-30T00:00:00+00:00
+
+ /guides/
+ 2026-03-30T00:00:00+00:00
+
+ /tags/leadera/
+ 2026-03-30T00:00:00+00:00
+
+ /tags/security/
+ 2026-03-30T00:00:00+00:00
+
+ /tags/
+ 2026-03-30T00:00:00+00:00
+
+ /tags/ux/
+ 2026-03-30T00:00:00+00:00
+
+ /guides/leadera-audit/
+ 2026-03-30T00:00:00+00:00
+ /diary/2026-03-29/2026-03-29T00:00:00+00:00
@@ -40,9 +64,6 @@
/tags/docs/2026-03-29T00:00:00+00:00
-
- /
- 2026-03-29T00:00:00+00:00/creds/docs-a2v-space-auth/2026-03-29T00:00:00+00:00
@@ -58,9 +79,6 @@
/tags/go/2026-03-29T00:00:00+00:00
-
- /guides/
- 2026-03-29T00:00:00+00:00/tags/hugo/2026-03-29T00:00:00+00:00
@@ -73,9 +91,6 @@
/kb/2026-03-29T00:00:00+00:00
-
- /tags/leadera/
- 2026-03-29T00:00:00+00:00/tags/llm/2026-03-29T00:00:00+00:00
@@ -121,9 +136,6 @@
/tags/streamer/2026-03-29T00:00:00+00:00
-
- /tags/
- 2026-03-29T00:00:00+00:00/tags/tunnel/2026-03-29T00:00:00+00:00
diff --git a/public/tags/audit/index.html b/public/tags/audit/index.html
new file mode 100644
index 0000000..70ff883
--- /dev/null
+++ b/public/tags/audit/index.html
@@ -0,0 +1,140 @@
+
+
+
+
+
+ Audit — docs.a2v.space
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/tags/ux/index.xml b/public/tags/ux/index.xml
new file mode 100644
index 0000000..8639725
--- /dev/null
+++ b/public/tags/ux/index.xml
@@ -0,0 +1,19 @@
+
+
+
+ Ux on docs.a2v.space
+ /tags/ux/
+ Recent content in Ux on docs.a2v.space
+ Hugo
+ ru-ru
+ Mon, 30 Mar 2026 00:00:00 +0000
+
+
+ Аудит Leadera
+ /guides/leadera-audit/
+ Mon, 30 Mar 2026 00:00:00 +0000
+ /guides/leadera-audit/
+ <h2 id="обзор-проекта">Обзор проекта</h2>
<p>Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:</p>
<p><strong>Стек технологий:</strong></p>
<ul>
<li><strong>Бэкенд:</strong> Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx</li>
<li><strong>Фронтенд:</strong> Angular (версия не указана), HttpClient</li>
<li><strong>Инфраструктура:</strong> Docker, PM2, Hugo для документации</li>
</ul>
<p><strong>Архитектура:</strong></p>
<ul>
<li>Clean Architecture с разделением на слои (handlers, service, repository)</li>
<li>RESTful API с использованием JWT для аутентификации</li>
<li>Управление правами доступа через RBAC (Role-Based Access Control)</li>
<li>Поддержка пространств (spaces) как основной изоляции данных</li>
<li>PostgreSQL с миграциями через golang-migrate</li>
</ul>
<p><strong>Основные сущности:</strong></p>
+
+
+