Files
docs.a2v.space/public/index.json
T

1 line
46 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[{"content":"Аудит проекта Leadera Дата: 30.03.2026\nВерсия: pre-production, миграции 1–5\n1. Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с диаграммами Ганта.\nСтек Компонент Технологии Backend Go 1.21+, Gin, PostgreSQL 16, pgx/v5 + sqlx, JWT (HMAC-SHA256) Frontend Angular 21.1, Bootstrap 5, NgBootstrap, RxJS, Signals Инфраструктура Docker (Colima), pm2, nginx reverse proxy, VPS reg.ru Доменная модель User ──┬── Space (через space_members с role) │ └── GanttChart (принадлежит Space) ├── GanttSection └── GanttTask Роли: admin, editor, viewer — назначаются на уровне Space через таблицу space_members.\nЧто реализовано (endpoints) Auth (5): register, login, refresh, change-password, logout\nSpaces (9): CRUD + members CRUD\nGantt Charts (9): CRUD + archive + members (добавлен, но удалён в миграции 5)\nGantt Sections (5): CRUD + reorder\nGantt Tasks (4): CRUD\nИтого: ~32 endpoint\n2. Архитектура и качество кода 2.1. Backend — структура cmd/server/main.go — точка входа internal/ domain/ — модели (User, Space, GanttChart, etc.) dto/ — request/response DTO (auth, space, gantt) handlers/ — HTTP handlers (auth, space, gantt) middleware/ — auth, cors, space, gantt, role, logging, recovery repository/ — слой доступа к данным service/ — бизнес-логика config/ — конфигурация (.env) utils/ — jwt, password, response, validation migrations/ — SQL миграции (1-5) Оценка: ✅ Чистая layered архитектура. Разделение ответственности чёткое.\n2.2. Frontend — структура src/app/ core/auth/ — auth service, interceptor core/models/ — app.model, space.model core/services/ — space.service, space-storage.service pages/auth/ — sign-in, sign-up, reset-pw, etc. pages/gantt/ — компоненты, модалки, сервисы, модели pages/dashboards/ — spaces list, dashboard layouts/ — navbar, topbar, main-layout Оценка: ✅ Стандартная Angular-структура. Signals для state management.\n2.3. Проблемы кода # Проблема Критичность Описание C1 \\r в service-файлах Medium gantt_service.go, gantt_section_service.go содержат CRLF C2 main.go:238 — мёртвый код getUserHandler Low Неиспользуемая функция C3 Swagger не сгенерирован Medium Аннотации есть, но api/ директории нет C4 RegisterProtectedRoutes не вызывается в main.go Critical GET/PUT/DELETE /spaces/:id не зарегистрированы 3. Права доступа — главный вопрос 3.1. Текущая реализация Права назначаются исключительно через Space:\nТаблица space_members — связка user ↔ space с role (admin/editor/viewer) SpaceMiddleware.RequireSpace() — проверяет членство и записывает ContextSpaceRole в context RoleMiddleware.RequireMinRole() — проверяет иерархию ролей (admin \u0026gt; editor \u0026gt; viewer) Диаграммы Ганта НЕ имеют собственной системы ролей. Таблица gantt_chart_members была создана (миграция 4) и тут же удалена (миграция 5). Все проверки доступа к диаграммам идут через space membership.\n3.2. Как это работает Запрос → AuthMiddleware (JWT → userID) → SpaceMiddleware.RequireSpace() (проверяет space_members → ContextSpaceRole) → GanttMiddleware.RequireGanttChart() (проверяет chart.space_id == spaceID) → RoleMiddleware.RequireMinRole(\u0026#34;editor\u0026#34;) (проверяет ContextSpaceRole) Это правильно. Любой член Space с ролью editor+ может создавать/редактировать диаграммы. Viewers — только читать.\n3.3. 🔴 Критическая проблема: Frontend не соответствует Backend Frontend MembersModalComponent пытается управлять участниками диаграммы:\nganttService.addMember(chartId, dto) → /api/v1/spaces/{spaceId}/gantt-charts/{chartId}/members ganttService.updateMemberRole(chartId, userId, dto) → .../members/{userId} ganttService.removeMember(chartId, userId) → .../members/{userId} Backend GanttHandler.RegisterRoutes() НЕ регистрирует маршруты для members диаграмм. После удаления gantt_chart_members (миграция 5) эти endpoints не существуют.\nРезультат: модальное окно «Участники диаграммы» на фронтенде не работает — все вызовы вернут 404.\n3.4. 🔴 Проблема: Role fallback В role_middleware.go:28-31:\nrole := c.GetString(ContextSpaceRole) if role == \u0026#34;\u0026#34; { role = c.GetString(ContextRole) // fallback на глобальную роль User } Если ContextSpaceRole не установлен, используется глобальная роль пользователя (из JWT). Это значит:\nПользователь с role=admin в таблице users получит admin-доступ к любому space, даже если он не член этого space Но SpaceMiddleware проверяет членство раньше, так что в цепочке RequireSpace() → RequireMinRole() это не эксплуатируется Однако если RequireMinRole() используется без RequireSpace() — это дыра Рекомендация: Удалить fallback на ContextRole. Если ContextSpaceRole пуст — отказывать.\n3.5. Рекомендации по правам доступа Удалить модалку участников диаграммы на фронтенде — она мертва Или добавить раздел «Участники Space» с возможностью управления ролями через /spaces/:space_id/members (эти endpoints работают) Удалить fallback на ContextRole в role_middleware.go Добавить проверку: editor не может повысить кого-то до admin (сейчас может — AddMember разрешает editor+ назначать любую роль) 4. Безопасность 4.1. Критические # Проблема Файл Описание S1 JWT Secret = test .env JWT_SECRET=test_secret_key_change_in_production — это прод-конфиг! S2 CORS: * .env CORS_ALLOWED_ORIGINS=* — любой домен может обращаться к API S3 Пароль БД в .env .env DB_PASSWORD=popoloka16 — creds в открытом виде S4 Refresh tokens: SHA256 utils/password.go SHA256 вместо bcrypt для refresh token hash — быстро брутфорсится 4.2. Высокие # Проблема Описание S5 Нет rate limiting Brute-force на /auth/login без ограничений S6 Нет CSRF protection API принимает POST/PUT/DELETE без CSRF-токена S7 Нет CSP заголовков X-Frame-Options, Content-Security-Policy не настроены S8 JWT в localStorage XSS может украсть access + refresh tokens 4.3. Средние # Проблема Описание S9 Нет password policy Минимальные требования к паролю не enforced S10 Нет audit log Действия с spaces/charts не логируются для аудита S11 Нет блокировки аккаунта Неограниченные попытки входа 5. Инфраструктура 5.1. Текущее состояние Компонент Статус Примечание Go API (pm2: leadera-api) ⚠️ Порт 8080, хост 0.0.0.0 Angular FE (pm2: leadera-fe) ⚠️ Порт 4200, хост 0.0.0.0 PostgreSQL (Docker) ✅ Порт 5432, контейнер app-leadera-db VPS reverse proxy ⚠️ sand.a2v.space → 8082/8083, но 502 если сервисы не запущены SSL ✅ Let\u0026rsquo;s Encrypt на VPS 5.2. Проблемы # Проблема Описание I1 Docker для БД, нативно для API Несогласованность — API и FE не в Docker I2 Нет health-check в pm2 API может упасть без перезапуска I3 Нет CI/CD Ручной деплой через make run + pm2 I4 Нет nginx на Mac Studio FE и API торчат наружу напрямую 6. Функциональная оценка 6.1. Что работает Функция Backend Frontend Статус Регистрация/логин ✅ ✅ Работает JWT auth + refresh ✅ ✅ Работает Spaces CRUD ⚠️ ✅ RegisterProtectedRoutes не вызван (C4) Space members ✅ ✅ Работает Gantt charts CRUD ✅ ✅ Работает Gantt sections ✅ ✅ Работает Gantt tasks ✅ ⚠️ Нет UI для задач внутри диаграммы Архивация диаграмм ✅ ✅ Работает Members диаграммы ❌ ✅ (мёртвый UI) Backend endpoints не существуют 6.2. Что НЕ работает или отсутствует Функция Статус Визуализация Ганта (таймлайн) ❌ Нет компонента отрисовки Drag \u0026amp; Drop задач ❌ Real-time collaboration ❌ Уведомления ❌ Поиск ❌ Экспорт (PDF/Excel) ❌ Email verification ❌ Password reset Backend есть, UI есть — не проверено 6.3. Оценка готовности Система на стадии каркаса. Backend API функционален для CRUD операций, но:\nВизуализация Ганта — основная фича — не реализована (нет canvas/SVG рендеринга) Управление участниками только на уровне Space Нет CI/CD, тестов, мониторинга 7. Приоритизированный план исправлений Неделя 1 — Критическое (безопасность) Приоритет Задача Трудоёмкость P0 Заменить JWT secret на криптостойкий 1 час P0 Настроить CORS (только sand.a2v.space) 1 час P0 bcrypt для refresh tokens вместо SHA256 2 часа P0 Удалить fallback на ContextRole в role_middleware 30 мин P0 Исправить RegisterProtectedRoutes — зарегистрировать маршруты 1 час P1 Rate limiting на auth endpoints 4 часа P1 Editor не может назначать admin роль 2 часа Неделя 2 — Архитектура прав Приоритет Задача Трудоёмкость P1 Удалить/переписать MembersModalComponent → Space members 4 часа P1 Добавить страницу управления участниками Space 8 часов P2 HttpOnly cookies для JWT (вместо localStorage) 8 часов P2 CSRF protection 4 часа Неделя 3 — Функциональность Приоритет Задача Трудоёмкость P2 Визуализация Ганта (canvas/d3) 40+ часов P2 Drag \u0026amp; Drop для задач 16 часов P3 Тесты (unit + integration) 24 часа P3 CI/CD pipeline 8 часов 8. Резюме Ключевые выводы Права доступа — архитектурно верно: роль назначается через Space, не через диаграмму. Но фронтенд ещё не обновлён после удаления gantt_chart_members. Безопасность — критические уязвимости в конфигурации (JWT secret, CORS, bcrypt). Требуют немедленного исправления до любого публичного деплоя. Функциональность — CRUD работает, но основная ценность (визуализация Ганта) не реализована. Код — чистый, хорошая архитектура, но есть мёртвый код и незарегистрированные маршруты. Общая оценка: 🔴 Pre-alpha Проект готов к внутренней демонстрации CRUD, но не готов к продакшену. Первоочередное — безопасность и исправление мёртвых endpoints.\n","section":"guides","tags":["audit","leadera","security","architecture"],"title":"Аудит Leadera — полный отчёт","url":"/guides/leadera-audit/"},{"content":"Timeline Утро — Обсуждали аналоги htop: порекомендовал btm, btop, glances. Создан конфиг ~/.config/bottom/bottom.toml День — Разбирались со скиллами OpenCode: как работают, автоматический подбор по description День — Созданы скиллы для Leadera проектов (Go: build-and-fix, restart-api; Angular: build-and-fix) День — Обсудили миграцию Ганта с DOM на Canvas 2D (Konva.js) — real-time коллаборация, экспорт PDF/PNG, 500+ задач Вечер — Установлен gh CLI, авторизован как agaltsovav Вечер — Созданы GitHub Projects: Leadera Roadmap (21 задача, P0P3), agaltsovav.ru Roadmap (7 задач) Системные утилиты bottom (btm) — выбранный мониторинг, конфиг в ~/.config/bottom/bottom.toml Альтернативы: btop, glances OpenCode Skills Созданы скиллы:\napp-leadera-api/.opencode/skills/build-and-fix/ — сборка Go проекта + автофикс ошибок (до 10 итераций) app-leadera-api/.opencode/skills/restart-api/ — swagger генерация + pm2 restart app-leadera-fe/.opencode/skills/build-and-fix/ — сборка Angular + автофикс Gantt Canvas миграция Переход с DOM на Canvas 2D через Konva.js Цели: real-time коллаборация, экспорт PDF/PNG, 500+ задач Промт: GANTT_CANVAS_MIGRATION_PROMPT.md в app-leadera-fe GitHub CLI: gh авторизован (agaltsovav) Репо: app-leadera-fe, app-leadera-api, agaltsovav.ru Старые: leadera-fe/leadera-api (на VPS, leadera.ru) modece.ru — заброшен, планируется возвращение GitHub Projects — Roadmaps Leadera Roadmap (project #2) — 21 задача P0: JWT secret, CORS, bcrypt, ContextRole fallback, RegisterProtectedRoutes P1: Rate limiting, editor role check, MembersModal rewrite P2: HttpOnly cookies, CSRF, CSP, password policy, audit log, health-check, CI/CD, Canvas миграция, DnD P3: Code cleanup, тесты, email verification, поиск agaltsovav.ru Roadmap (project #1) — 7 задач Редизайн, мобильная версия, мультиязычность, блог, CI/CD, тёмная тема, форма обратной связи ","section":"diary","tags":["system-utils","opencode","leadera","gantt","canvas","github","roadmap"],"title":"31 марта 2026","url":"/diary/2026-03-31/"},{"content":"Проблема В params.toml:\ncopyRight = \u0026#34;Copyright (c) 2020-2025 Антон Агальцов\u0026#34; Сейчас 2026 год — нужно обновить.\nРекомендация Обновить на 2020-2026. Или сделать динамическим через Hugo template:\nCopyright (c) 2020-{{ now.Year }} Антон Агальцов ","section":"personal-site","tags":["audit","personal-site"],"title":"Copyright без 2026 года","url":"/personal-site/copyright-outdated/"},{"content":"Проблема Последний дайджест — февраль 2025. С тех пор 12+ месяцев без новых выпусков.\nЧто есть 27 файлов дайджестов (январь 2023 — февраль 2025) Автоматизация через digest.js — скрипт для генерации Но скрипт не запускается автоматически Риск Low — контент устаревает, SEO-позиции падают для страниц дайджестов.\nРекомендация Настроить cron/CI для ежемесячной генерации дайджеста Или интегрировать с OpenClaw — авто-сборка дайджеста на основе новых публикаций ","section":"personal-site","tags":["audit","personal-site"],"title":"Digest не обновлялся с февраля 2025","url":"/personal-site/digest-stale/"},{"content":"Проблема Проект использует тему Hyas/Doks v0.5.0 (package.json). Актуальная версия Doks — 1.x с полной переработкой архитектуры.\nЧто не так Doks 0.5 использует устаревший Bootstrap 5.2.0-beta1 Hugo 0.148.2 в зависимостях — новый, но интеграция с темой старая Конфигурация через theme.toml — в новых версиях перешли на другой формат exec-bin для вызова Hugo — устаревший подход, текущие версии Hugo ставятся глобально Риск Medium — работает, но миграция на Doks 1.x потребует значительного рефакторинга layout-ов и конфигурации. Чем дольше откладывать — тем сложнее.\nРекомендация Запланировать миграцию на Doks 1.x или перейти на чистый Hugo + Bootstrap без зависимости от темы-фреймворка.\n","section":"personal-site","tags":["audit","personal-site"],"title":"Hugo Doks 0.5 — сильно устарел","url":"/personal-site/outdated-doks-theme/"},{"content":"Проблема В params.toml указан Twitter: @AntonTotoshkin\nНо владелец сайта — Антон Агальцов. Ники не совпадают.\nДва варианта Это твой старый/другой аккаунт — тогда ок, но стоит указать актуальный Это чужой аккаунт — тогда нужно убрать или исправить Затронутые места twitterSite = \u0026quot;@AntonTotoshkin\u0026quot; schemaAuthorTwitter = \u0026quot;https://twitter.com/AntonTotoshkin\u0026quot; schemaTwitter = \u0026quot;https://twitter.com/AntonTotoshkin\u0026quot; Рекомендация Указать актуальный Twitter/X или убрать, если соцсеть не используется.\n","section":"personal-site","tags":["audit","personal-site"],"title":"Twitter handle не соответствует имени","url":"/personal-site/twitter-handle-mismatch/"},{"content":"Проблема В params.toml: yandexMetrika = false\nАналитика с сайта не собирается. Непонятно, есть ли вообще посетители и какие страницы популярны.\nРекомендация Включить Yandex Metrika или перейти на Plausible / Umami (privacy-friendly) Если сайт не нуждается в аналитике — оставить как есть Альтернатива: Netlify Analytics (уже встроен в хостинг) ","section":"personal-site","tags":["audit","personal-site"],"title":"Yandex Metrika отключена","url":"/personal-site/no-analytics/"},{"content":"Проблема В корне репозитория лежат два файла, которые не должны быть в git:\nШаблоны для сайта.key — Apple Keynote файл (бинарный) logo.psd — Photoshop файл (бинарный) Что не так Увеличивают размер репозитория Git неэффективно хранит бинарные файлы (каждая версия — полностью) .key файлы могут содержать конфиденциальные данные шаблонов Рекомендация Перенести в отдельное хранилище (Google Drive, облако) Удалить из git-истории через git filter-repo Добавить в .gitignore: *.key, *.psd, *.sketch ","section":"personal-site","tags":["audit","personal-site"],"title":"Бинарный файл в репозитории","url":"/personal-site/binary-files-in-repo/"},{"content":"Проблема node_modules/ отсутствует — проект нельзя собрать без npm install.\nРиск Low — стандартная ситуация. Но:\npackage-lock.json привязан к Node 16, а на Mac Studio текущий Node v24 Могут быть конфликты зависимостей (canvas, babel, postcss) Hugo 0.148.2 ставится через hugo-installer в npm — может не совпасть с глобальным Hugo Рекомендация Убедиться что npm install проходит без ошибок на текущем Node Если нет — обновить зависимости или использовать nvm для Node 16 Рассмотреть переход на глобальный Hugo вместо exec-bin ","section":"personal-site","tags":["audit","personal-site"],"title":"Отсутствуют node_modules — нужна установка","url":"/personal-site/no-node-modules/"},{"content":"Устаревший Node.js 16 в Netlify Файл: netlify.toml:5\nNODE_VERSION = \u0026#34;16.16.0\u0026#34; Node.js 16 вышел из поддержки (EOL) в сентябре 2023. Сборка на Netlify может начать падать или работать некорректно.\nРекомендация: Обновить до Node.js 20 LTS:\nNODE_VERSION = \u0026#34;20\u0026#34; ","section":"personal-site","tags":["audit","personal-site","infrastructure"],"title":"Устаревший Node.js 16 в Netlify","url":"/personal-site/netlify-node-version/"},{"content":"Timeline Утро — Установлен Vikunja (таск-трекер) на Mac Studio через Docker/Colima День — Создан проект «Leadera» в Vikunja (ID=2), добавлено 27 задач из аудита Leadera День — Начата реализация Leadera TaskTracker: миграции, модели, DTOs, repositories (бекенд), фронтенд (kanban, task-detail) Вечер — TaskTracker откачён по просьбе Антона — git checkout + git clean. Причина: Claude Code падал (SIGKILL), sub-agents не справлялись, Plane не запустился Вечер — Настроен MT Proxy на VPN VPS (185.234.64.52): порт 8443, секрет 9e40ae… Вечер — Qwen 3.5:9b подключён к OpenClaw через openclaw models set ollama/qwen3.5:9b, доступен для cron/spawn задач Вечер — Антон подключился к claw.a2v.space с мобильного, устройство одобрено Vikunja URL: http://192.168.0.37:8095 Проект Leadera: ID=2 API token: tk_635fb7ac… 27 задач из аудита, приоритеты P0P3 Leadera TaskTracker ТЗ: leadera-tasktracker-spec.md Реализация через sub-agents (GLM-5.1) Откачено — проекты возвращены к предыдущему коммиту MT Proxy Сервер: 185.234.64.52, порт 8443 Docker контейнер: mtproxy Инфраструктура Qwen 3.5:9b доступен как дешёвая локальная модель для cron/spawn Мобильное подключение к claw.a2v.space подтверждено ","section":"diary","tags":["vikunja","leadera","tasktracker","ollama","qwen","mtproxy","infrastructure"],"title":"30 марта 2026","url":"/diary/2026-03-30/"},{"content":"Timeline 20:03 — Настроили Angular + Go проекты (leadera) через pm2, удалили proxy.conf, подняли PostgreSQL в Docker 20:31 — Изучили API Eversolo T8 — полный список REST-эндпоинтов для управления музыкой 20:49 — Обсудили важность записи контекста в файлы для сохранения памяти между сессиями 21:13 — Начали проект docs.a2v.space — персональная документация на Hugo 21:44 — Завершили настройку Identity (Братан, SOUL.md, USER.md, IDENTITY.md) 22:15 — Документировали инфраструктуру: VPS reverse proxy (claw.a2v.space, code.a2v.space, sand.a2v.space, docs.a2v.space) 22:31 — Настроили docs.a2v.space: Hugo сайт, 83 страницы, Bootstrap 5 тёмная тема, AES-256-GCM шифрование кредов (мастер-пароль: Popoloka16!) 22:47 — Добавили Basic auth: agaltsovav / Magamet787! для доступа к документации 23:02 — Создали cron задачу docs-a2v-daily-sync на ежедневное обновление в 03:00 МСК 23:18 — Полностью задокументировали Eversolo T8 API (воспроизведение, громкость, дисплей, питание, поиск и т.д.) 23:45 — Переписали TOOLS.md как полный справочник по инфраструктуре Eversolo Companion — статус проекта Backend (Go + Gin):\nРепозиторий: ~/Projects/eversolo-companion Состояние: собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17):\nСостояние: собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов Dev server: pm2 (eversolo-fe), порт 8096 Инфраструктура:\nPostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Проблема: нет доступа к Eversolo из OpenClaw sandbox (192.168.0.156)\nРешение: настройка tools.elevated.allowFrom.webchat или запуск через launchd Следующие шаги: после решения сети — этапы 3-9 (библиотека sync, плейлисты, scrobbler, обложки)\n","section":"diary","tags":["angular","go","docker","eversolo","hugo","docs","identity","infrastructure","companion"],"title":"29 марта 2026","url":"/diary/2026-03-29/"},{"content":"Basic Authentication Username: agaltsovav Password: Magamet787! Конфигурация Nginx server { listen 8091; server_name docs.a2v.space; auth_basic \u0026#34;Restricted Access\u0026#34;; auth_basic_user_file /etc/nginx/.htpasswd; } Доступ URL: https://docs.a2v.space (через reverse proxy) Local: http://localhost:8091 (для разработки) Auth: всегда требуется Мастер-пароль для шифрования Важно: Пароль для расшифровки файлов в разделе creds/\nMaster Password: Popoloka16! Шифрование Алгоритм: AES-256-GCM Хранилище: client-side encryption Файлы шифруются при сохранении Расшифровываются при чтении ","section":"creds","tags":["docs","authentication","nginx"],"title":"docs.a2v.space Basic Auth","url":"/creds/docs-a2v-space-auth/"},{"content":"Docker Compose креды (~/Projects/eversolo-companion/docker-compose.yml) services: postgres: environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: eversolo Локальные креды (.env файл) POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_DB=eversolo Хостинг Host: localhost Port: 5433 Database: eversolo Безопасность Используйте разные пароли для production Включите SSL для удаленного подключения Регулярно делайте бэкапы ","section":"creds","tags":["eversolo","companion","postgresql","docker"],"title":"Eversolo Companion PostgreSQL","url":"/creds/eversolo-companion-postgres/"},{"content":"Eversolo T8 — музыкальный стример.\nIP: 192.168.0.156 Порт: 9529 Авторизация: нет\nБазовый URL: http://192.168.0.156:9529\nВоспроизведение Действие URL Play/Pause /ZidooMusicControl/v2/playOrPause Следующий трек /ZidooMusicControl/v2/playNext Предыдущий трек /ZidooMusicControl/v2/playLast Перемотка (ms) /ZidooMusicControl/v2/seekTo?time=\u0026lt;ms\u0026gt; Воспроизвести по ID /ZidooMusicControl/v2/playMusic?type=4\u0026amp;id=\u0026lt;id\u0026gt; Состояние /ZidooMusicControl/v2/getState Громкость Действие URL Громкость вверх /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeUp Громкость вниз /ZidooControlCenter/RemoteControl/sendkey?key=Key.VolumeDown Точная громкость /ZidooMusicControl/v2/setDevicesVolume?volume=\u0026lt;0-200\u0026gt; Mute /ZidooMusicControl/v2/setMuteVolume?isMute=1 Unmute /ZidooMusicControl/v2/setMuteVolume?isMute=0 Входы/Выходы Действие URL Получить список /ZidooMusicControl/v2/getInputAndOutputList Установить вход /ZidooMusicControl/v2/setInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Установить выход /ZidooMusicControl/v2/setOutInputList?tag=\u0026lt;tag\u0026gt;\u0026amp;index=\u0026lt;n\u0026gt; Теги выхода: RCA, XLRRCA, XLR, HDMI, SPDIF, USB\nДисплей Действие URL Яркость экрана (get) /SystemSettings/displaySettings/getScreenBrightness Яркость экрана (set) /SystemSettings/displaySettings/setScreenBrightness?index=\u0026lt;0-115\u0026gt; Яркость ручки (get) /SystemSettings/displaySettings/getKnobBrightness Яркость ручки (set) /SystemSettings/displaySettings/setKnobBrightness?index=\u0026lt;0-255\u0026gt; VU-режим (get) /SystemSettings/displaySettings/getVUModeList VU-режим (set) /SystemSettings/displaySettings/setVUMode?index=\u0026lt;n\u0026gt; Спектр (get) /SystemSettings/displaySettings/getSpPlayModeList Спектр (set) /SystemSettings/displaySettings/setSpPlayModeList?index=\u0026lt;n\u0026gt; Переключить VU/Спектр `/ZidooMusicControl/v2/changVUDisplay?openType=\u0026lt;0 Питание Действие URL Параметры питания /ZidooMusicControl/v2/getPowerOption Перезагрузка /ZidooMusicControl/v2/setPowerOption?tag=reboot Выключение /ZidooMusicControl/v2/setPowerOption?tag=poweroff Переключить экран /ZidooMusicControl/v2/setPowerOption?tag=screen Включить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.ON Выключить экран /ZidooControlCenter/RemoteControl/sendkey?key=Key.Screen.OFF Поиск Поиск URL По трекам /ZidooMusicControl/v2/searchMusicV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По артистам /ZidooMusicControl/v2/searchArtistV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 По альбомам /ZidooMusicControl/v2/searchAlbumV2?key=\u0026lt;text\u0026gt;\u0026amp;start=0\u0026amp;count=100 Обложки и устройство Действие URL Обложка по ID /ZidooMusicControl/v2/getImage?id=\u0026lt;song_id\u0026gt;\u0026amp;target=16 Модель устройства /ControlCenter/getModel Источники Zidoo Forum Home Assistant Integration ","section":"kb","tags":["api","eversolo","music","streamer"],"title":"Eversolo T8 API","url":"/kb/eversolo-api/"},{"content":"\nNYVK4PEGwmOHmAnGk8IAUc+lyFJtnEAvX6ZddBro/ILRWHOXBGYywgglFvQZ18BLDLb5DuA8GPAIdB/LwTHRXYO0KsmtlZQVWGEeeXlXAoEXpa5theoOQhebkW6LmiKyNGAVW2z9rK3nz6NnztYdn49LvGMjrHuR4IwCLbl/pYa96CPNRnxGDFlduFi8lMSspM0rBFi/bZhNGhzy36ViCl+aKr5P9cle0ZvM8E8av/6c5JjgDt88QFI3VYdTaTCE0+uHsXlnJN7Qgg/KH7kD\n\n\n","section":"creds","tags":["postgresql","docker-compose","leadera","database"],"title":"Mac Studio — leadera-api БД (docker-compose)","url":"/creds/leadera-db-docker/"},{"content":"\np7Iw7Y3zbj1kLBcbOXGoO27oDwF85AhxBW7saT538hxi0ogJpyFeM49GDuLHzxuyknvdNC/rx3tb4AFnGkCeHSrrCmj+VK8Zxt7ujeujVJSRuOeeUlsqkHdlmaiXl2KQknrIsqVCi3Tnn0V5qcFxvo+1Ktc+surF6bBpWrTHzWV5mLtWVfD6C6kvvP/UFldFBD6v+FQs79yfoOe/j/bUrtpt6v5VndbbBmhUAQcy1BV2rpXxO373dTcLQ6coRWkt/RFo\n\n\n","section":"creds","tags":["postgresql","docker","leadera","database"],"title":"Mac Studio — leadera-api БД (локальная)","url":"/creds/leadera-db-local/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"\nYEI16NAJ78d3lmSa/lca8Zxczt+u6GyMUYHduX47VoFQdj0Ixozd8R6yXoB7eM+AjhCtNGkOxGlOj2s73ABOBjLEIVIhD4Z+xTyzdtah4VpyLoltYOeNYsnbIIFARdF/FBYq5COXohhXs33K5ozznrtDd/awbKMjl/sbQqjXAZ+A3ZSob6/5uU+fFKetXLR6v4ZLAYQ57iiD21ImSLSggwv+rJgK5XyPDKEPD4N5nOsiDrLgoukVBMvgJ54PqfPp2Hni+2tdKOlMnOG2npTuu4SkyALcfFar\n\n\n","section":"creds","tags":["vpn","amnezia","infrastructure"],"title":"VPN VPS","url":"/creds/vpn-vps/"},{"content":"\nIpYXLMtgCFlGQ550DZCLjq37VsnNqL08Rn03iRS7kQ7ozBZNsiZySFzDAvYh4xIHytRDy0Sz0KGUXekr0S+cNiJsmtZ8kj0Pd0JhevhxTMZF2khFvs/LFWoTL5ZwAJ34y/qfLw2gaWX90VZDu0wO+KeAQeXhrWmol/2zUlfWX1AihyYqD2vRz+h2FcjD8ubYOXG35PyX7OlV1HPXgDv5X/bFNrxzPc867UOwB4aGxY9a\n\n\n","section":"creds","tags":["vps","reg.ru","infrastructure"],"title":"VPS reg.ru","url":"/creds/vps-reg-ru/"},{"content":"Описание Завершить разработку Eversolo Companion после решения проблемы с сетевым доступом.\nЧто сделано Backend (Go + Gin): собран, 17+ REST API эндпоинтов, WebSocket, CORS, state poller Frontend (Angular 17): собран, тёмная тема (Spotify-like), 5 экранов, 5 сервисов PostgreSQL: Docker, порт 5433, миграции готовы Docker Compose: рабочий (postgres + api + frontend) Спецификация: полная в ~/Projects/eversolo-companion/SPEC.md Проблема API не может достучаться до Eversolo T8 (192.168.0.156:9529) из-за ограничений OpenClaw sandbox.\nВозможные решения Настроить tools.elevated.allowFrom.webchat для разрешения сетевых соединений Запустить API через launchd plist (как SSH туннели) Использовать отдельный контейнер без ограничений Этапы 3-9 (после решения сети) Библиотека синхронизации — двухсторонний sync с Eversolo Плейлисты — импорт/экспорт, редактирование Scrobbler — Last.fm / ListenBrainz Обложки — кэширование, отображение в UI Плеер — улучшенный интерфейс управления Система уведомлений — события от Eversolo Администрирование — настройка подключений Связанные ресурсы Спецификация проекта API документация Дневник разработки ","section":"plans","tags":["eversolo","companion","angular","go","docker"],"title":"Завершить Eversolo Companion - этапы 3-9","url":"/plans/eversolo-companion-phases-3-9/"},{"content":"Описание Добавить поддержку Ollama в OpenClaw для использования локальных LLM моделей.\nПроблема Модель qwen3.5:9b добавлена в конфиг openclaw.json, но не отображается в openclaw models list.\nСтатус Отложено по решению Антона.\n","section":"plans","tags":["ollama","openclaw","llm"],"title":"Настроить интеграцию Ollama с OpenClaw","url":"/plans/ollama-openclaw/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"},{"content":"Описание Добавить инструменты управления Eversolo T8 в OpenClaw.\nЧто сделано Изучен полный API Eversolo T8 (см. Базу знаний) Проблема Sandbox OpenClaw не имеет доступа к локальной сети, где находится Eversolo.\nВозможные решения Настроить проброс портов Запустить OpenClaw без sandbox-ограничений Использовать промежуточный proxy-сервис ","section":"plans","tags":["eversolo","openclaw","api"],"title":"Реализовать управление Eversolo из OpenClaw","url":"/plans/eversolo-control/"}]