daily update 2026-03-30
This commit is contained in:
1 parent
ff46a70709
commit
20c2aae435
20 files changed
+1189
-25
No files matched your search
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../tags/tunnel/">tunnel</a></li>
|
||||
@@ -190,6 +208,44 @@
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title"><a href="../guides/leadera-audit/">Аудит Leadera</a></h3>
|
||||
<p class="card-text"><h2 id="обзор-проекта">Обзор проекта</h2>
|
||||
<p>Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:</p>
|
||||
<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></p>
|
||||
|
||||
<div class="tags">
|
||||
|
||||
<a href="../tags/audit/" class="tag">audit</a>
|
||||
|
||||
<a href="../tags/leadera/" class="tag">leadera</a>
|
||||
|
||||
<a href="../tags/security/" class="tag">security</a>
|
||||
|
||||
<a href="../tags/ux/" class="tag">ux</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
|
||||
@@ -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 httpsLine truncated
|
||||
[{"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Рекомендация: Добавить покрытие тестами, особенно для критичных бLine truncated
|
||||
@@ -0,0 +1,493 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Аудит Leadera — docs.a2v.space</title>
|
||||
|
||||
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../css/custom.css">
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="../../">docs.a2v.space</a>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarMain">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../diary/">Дневник</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../kb/">База знаний</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../plans/">Планы</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../guides/">Инструкции</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../creds/">Креды</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<form class="d-flex search-form" role="search">
|
||||
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
|
||||
<button class="btn btn-outline-light" type="submit">Найти</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="search-results" class="search-results" style="display: none;">
|
||||
<div class="search-results-content">
|
||||
<button type="button" class="btn-close float-end" id="close-search"></button>
|
||||
<h5>Результаты поиска</h5>
|
||||
<ul id="results-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
|
||||
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
|
||||
<div class="sidebar-content">
|
||||
|
||||
|
||||
|
||||
<h6>Фильтры</h6>
|
||||
<ul class="nav flex-column">
|
||||
<li class="nav-item"><a class="nav-link" href="../../guides/">Все инструкции</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/vps/">vps</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/reverse-proxy/">reverse-proxy</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/nginx/">nginx</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/devops/">devops</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/openclaw/">openclaw</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/opencode/">opencode</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/angular/">angular</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/go/">go</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/docker/">docker</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
<main class="col-md-9 col-lg-10 main-content">
|
||||
|
||||
<div class="article-content">
|
||||
<h1>Аудит Leadera</h1>
|
||||
|
||||
|
||||
<div class="tags mb-3">
|
||||
|
||||
<a href="../../tags/audit/" class="tag">audit</a>
|
||||
|
||||
<a href="../../tags/leadera/" class="tag">leadera</a>
|
||||
|
||||
<a href="../../tags/security/" class="tag">security</a>
|
||||
|
||||
<a href="../../tags/ux/" class="tag">ux</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<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>
|
||||
<ul>
|
||||
<li>Пользователи (Users)</li>
|
||||
<li>Пространства (Spaces)</li>
|
||||
<li>Диаграммы Ганта (Gantt Charts)</li>
|
||||
<li>Секции диаграмм (Gantt Sections)</li>
|
||||
<li>Задачи (Gantt Tasks)</li>
|
||||
</ul>
|
||||
<h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2>
|
||||
<h3 id="1-критичные-уязвимости">1. Критичные уязвимости</h3>
|
||||
<h4 id="11-отсутствие-валидации-ввода-данных">1.1 Отсутствие валидации ввода данных</h4>
|
||||
<p><strong>Критичность:</strong> Critical<br>
|
||||
<strong>Файл:</strong> internal/dto/auth/login_request.go:5-6<br>
|
||||
<strong>Описание:</strong> В DTO используются базовые теги валидации (<code>binding:"required,email"</code>), но они не применяются в handlers. В handlers используется только <code>c.ShouldBindJSON()</code> без дополнительной валидации.<br>
|
||||
<strong>Рекомендация:</strong> Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).</p>
|
||||
<h4 id="12-риск-sql-инъекций">1.2 Риск SQL-инъекций</h4>
|
||||
<p><strong>Критичность:</strong> High<br>
|
||||
<strong>Файл:</strong> internal/repository/space_repository.go:68-73<br>
|
||||
<strong>Описание:</strong> В методе <code>GetBySlug</code> используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.<br>
|
||||
<strong>Рекомендация:</strong> Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.</p>
|
||||
<h4 id="13-небезопасное-хранение-секретов">1.3 Небезопасное хранение секретов</h4>
|
||||
<p><strong>Критичность:</strong> High<br>
|
||||
<strong>Файл:</strong> internal/config/config.go:13-15<br>
|
||||
<strong>Описание:</strong> JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.<br>
|
||||
<strong>Рекомендация:</strong> Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.</p>
|
||||
<h4 id="14-отсутствие-ограничений-на-частоту-запросов">1.4 Отсутствие ограничений на частоту запросов</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Описание:</strong> Нет защиты от brute force атак на аутентификацию.<br>
|
||||
<strong>Рекомендация:</strong> Реализовать rate limiting для эндпоинтов аутентификации.</p>
|
||||
<h3 id="2-проблемы-безопасности">2. Проблемы безопасности</h3>
|
||||
<h4 id="21-xss-валидация">2.1 XSS валидация</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> internal/handlers/space_handler.go<br>
|
||||
<strong>Описание:</strong> Нет очистки пользовательского ввода перед сохранением в базу данных.<br>
|
||||
<strong>Рекомендация:</strong> Добавить HTML экранирование пользовательских данных.</p>
|
||||
<h4 id="22-отсутствие-csrf-защиты">2.2 Отсутствие CSRF защиты</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> internal/middleware/cors_middleware.go<br>
|
||||
<strong>Описание:</strong> Нет CSRF токенов или других механизмов защиты.<br>
|
||||
<strong>Рекомендация:</strong> Реализовать CSRF защиту для изменяющих операций.</p>
|
||||
<h4 id="23-небезопасная-обработка-ошибок">2.3 Небезопасная обработка ошибок</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong>/internal/utils/response.go<br>
|
||||
<strong>Описание:</strong> Возвращаемые ошибки могут содержать внутренние детали реализации.<br>
|
||||
<strong>Рекомендация:</strong> Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.</p>
|
||||
<h3 id="3-архитектурные-проблемы">3. Архитектурные проблемы</h3>
|
||||
<h4 id="31-отсутствие-тестов">3.1 Отсутствие тестов</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> Отсутствие тестовых файлов<br>
|
||||
<strong>Описание:</strong> Найден только один тестовый helper файл, нет unit и интеграционных тестов.<br>
|
||||
<strong>Рекомендация:</strong> Добавить покрытие тестами, особенно для критичных бизнес-логик.</p>
|
||||
<h4 id="32-отсутствие-индексов-в-бд">3.2 Отсутствие индексов в БД</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> migrations/000001_create_users_table.up.sql:15-16<br>
|
||||
<strong>Описание:</strong> Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.<br>
|
||||
<strong>Рекомендация:</strong> Добавить индексы для часто используемых запросов.</p>
|
||||
<h4 id="33-плохая-обработка-пагинации">3.3 Плохая обработка пагинации</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> internal/repository/space_repository.go:39-45<br>
|
||||
<strong>Описание:</strong> Пагинация реализована, но нет валидации параметров page и per_page.<br>
|
||||
<strong>Рекомендация:</strong> Добавить валидацию и ограничение на максимальное количество элементов на страницу.</p>
|
||||
<h3 id="4-проблемы-конфигурации">4. Проблемы конфигурации</h3>
|
||||
<h4 id="41-слабые-настройки-по-умолчанию">4.1 Слабые настройки по умолчанию</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> .env.example<br>
|
||||
<strong>Описание:</strong> JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.<br>
|
||||
<strong>Рекомендация:</strong> Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.</p>
|
||||
<h4 id="42-небезопасные-настройки-cors">4.2 Небезопасные настройки CORS</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> .env.example<br>
|
||||
<strong>Описание:</strong> CORS разрешает любые origin в development.<br>
|
||||
<strong>Рекомендация:</strong> В продакшене использовать конкретные домены.</p>
|
||||
<h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2>
|
||||
<h3 id="1-критичные-уязвимости-1">1. Критичные уязвимости</h3>
|
||||
<h4 id="11-небезопасное-хранение-токенов">1.1 Небезопасное хранение токенов</h4>
|
||||
<p><strong>Критичность:</strong> Critical<br>
|
||||
<strong>Файл:</strong> src/app/core/auth/auth.service.ts:19-21<br>
|
||||
<strong>Описание:</strong> Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.<br>
|
||||
<strong>Рекомендация:</strong> Перенести токены в httpOnly cookie или secure storage.</p>
|
||||
<h4 id="12-отсутствие-валидации-на-клиенте">1.2 Отсутствие валидации на клиенте</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Файл:</strong> src/app/core/auth/auth.models.ts<br>
|
||||
<strong>Описание:</strong> Нет валидации email, пароля и других полей на клиенте.<br>
|
||||
<strong>Рекомендация:</strong> Добавить клиентскую валидацию форм перед отправкой запросов.</p>
|
||||
<h3 id="2-проблемы-безопасности-1">2. Проблемы безопасности</h3>
|
||||
<h4 id="21-отсутствие-csp">2.1 Отсутствие CSP</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Описание:</strong> Нет Content Security Policy для защиты от XSS и других атак.<br>
|
||||
<strong>Рекомендация:</strong> Добавить заголовки CSP с разрешенными источниками.</p>
|
||||
<h4 id="22-нет-ограничений-на-длину-ввода">2.2 Нет ограничений на длину ввода</h4>
|
||||
<p><strong>Критичность:</strong> Medium<br>
|
||||
<strong>Описание:</strong> Нет ограничения максимальной длины вводимых данных.<br>
|
||||
<strong>Рекомендация:</strong> Добавить maxlength атрибуты к input полям.</p>
|
||||
<h3 id="3-ux-проблемы">3. UX проблемы</h3>
|
||||
<h4 id="31-нет-индикации-загрузки">3.1 Нет индикации загрузки</h4>
|
||||
<p><strong>Критичность:</strong> Low<br>
|
||||
<strong>Файл:</strong> src/app/core/auth/auth.service.ts:45-47<br>
|
||||
<strong>Описание:</strong> Для некоторых операций нет индикации загрузки.<br>
|
||||
<strong>Рекомендация:</strong> Добавить skeleton loaders или spinners для всех асинхронных операций.</p>
|
||||
<h4 id="32-плохая-обработка-ошибок">3.2 Плохая обработка ошибок</h4>
|
||||
<p><strong>Критичность:</strong> Low<br>
|
||||
<strong>Файл:</strong> src/app/core/auth/auth.interceptor.ts:28-32<br>
|
||||
<strong>Описание:</strong> Обработка ошибок 401 не всегда приводит к корректному перенаправлению.<br>
|
||||
<strong>Рекомендация:</strong> Стандартизовать обработку ошибок и отображение пользователю.</p>
|
||||
<h2 id="безопасность">Безопасность</h2>
|
||||
<h3 id="текущие-меры-безопасности">Текущие меры безопасности</h3>
|
||||
<ul>
|
||||
<li>Использование JWT токенов для аутентификации</li>
|
||||
<li>Параметризованные SQL запросы (защита от SQL инъекций)</li>
|
||||
<li>CORS настройка</li>
|
||||
<li>RBAC система через пространства и роли</li>
|
||||
<li>Пароли хранятся в виде хешей</li>
|
||||
<li>Refresh токены для управления сессиями</li>
|
||||
</ul>
|
||||
<h3 id="отсутствующие-меры">Отсутствующие меры</h3>
|
||||
<ul>
|
||||
<li>Rate limiting</li>
|
||||
<li>CSRF protection</li>
|
||||
<li>Content Security Policy</li>
|
||||
<li>Input validation middleware</li>
|
||||
<li>SQL injection protection for dynamic queries</li>
|
||||
<li>XSS protection</li>
|
||||
<li>Secure cookie storage</li>
|
||||
<li>Brute force protection</li>
|
||||
</ul>
|
||||
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности</h3>
|
||||
<ol>
|
||||
<li>Реализовать rate limiting для аутентификации</li>
|
||||
<li>Добавить CSRF защиту</li>
|
||||
<li>Перенести JWT токены в httpOnly cookies</li>
|
||||
<li>Реализовать систему мониторинга и оповещений о подозрительной активности</li>
|
||||
<li>Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)</li>
|
||||
<li>Реализовать ротацию секретов</li>
|
||||
<li>Добавить тесты безопасности</li>
|
||||
</ol>
|
||||
<h2 id="ux-улучшения">UX улучшения</h2>
|
||||
<h3 id="фронтенд">Фронтенд</h3>
|
||||
<ol>
|
||||
<li><strong>Улучшить валидацию форм</strong>: Добавить реальную-time валидацию и подсказки</li>
|
||||
<li><strong>Добавить индикацию загрузки</strong>: Skeleton loaders для всех асинхронных операций</li>
|
||||
<li><strong>Улучшить обработку ошибок</strong>: Пользовательские сообщения об ошибках с возможностью повторной попытки</li>
|
||||
<li><strong>Добавить отключенные состояния</strong>: Кнопки должны быть disabled во время загрузки</li>
|
||||
<li><strong>Мобильная адаптация</strong>: Проверка и улучшение мобильного UI</li>
|
||||
<li><strong>Доступность</strong>: Добавить ARIA labels и проверить доступность</li>
|
||||
</ol>
|
||||
<h3 id="бэкенд">Бэкенд</h3>
|
||||
<ol>
|
||||
<li><strong>Улучшить пагинацию</strong>: Добавить валидацию и лимиты</li>
|
||||
<li><strong>Добавить bulk операции</strong>: Оптимизировать массовые операции</li>
|
||||
<li><strong>Улучшить обработку ошибок</strong>: Более информативные сообщения</li>
|
||||
<li><strong>Добавить метрики</strong>: Время выполнения запросов, количество запросов</li>
|
||||
<li><strong>Оптимизировать запросы</strong>: Проверка на N+1 запросы</li>
|
||||
</ol>
|
||||
<h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Приоритет</th>
|
||||
<th>Проблема</th>
|
||||
<th>Файлы</th>
|
||||
<th>Трудоёмкость</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Critical</strong></td>
|
||||
<td>Хранение JWT токенов в localStorage</td>
|
||||
<td>frontend/src/app/core/auth/auth.service.ts</td>
|
||||
<td>2 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Critical</strong></td>
|
||||
<td>Отсутствие валидации ввода данных</td>
|
||||
<td>backend/internal/handlers/*.go</td>
|
||||
<td>4 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>High</strong></td>
|
||||
<td>Небезопасные настройки JWT</td>
|
||||
<td>backend/internal/config/config.go</td>
|
||||
<td>1 час</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>High</strong></td>
|
||||
<td>Rate limiting для аутентификации</td>
|
||||
<td>backend/internal/middleware/</td>
|
||||
<td>3 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Medium</strong></td>
|
||||
<td>Отсутствие тестов</td>
|
||||
<td>backend/internal/</td>
|
||||
<td>8 часов</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Medium</strong></td>
|
||||
<td>XSS валидация</td>
|
||||
<td>backend/internal/handlers/*.go</td>
|
||||
<td>2 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Medium</strong></td>
|
||||
<td>CSRF защита</td>
|
||||
<td>backend/internal/middleware/</td>
|
||||
<td>2 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Low</strong></td>
|
||||
<td>UX улучшения (индикация загрузки)</td>
|
||||
<td>frontend/src/app/</td>
|
||||
<td>3 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Low</strong></td>
|
||||
<td>Оптимизация запросов</td>
|
||||
<td>backend/internal/repository/</td>
|
||||
<td>4 часа</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Low</strong></td>
|
||||
<td>Документация API</td>
|
||||
<td>backend/api/</td>
|
||||
<td>2 часа</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><strong>Общая трудоёмкость:</strong> ~31 час<br>
|
||||
<strong>Рекомендуемый срок выполнения:</strong> 2-3 недели с учётом приоритетов</p>
|
||||
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
<p class="text-center mb-0">© 2026 docs.a2v.space</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
|
||||
|
||||
|
||||
<script src="../../js/search.js"></script>
|
||||
<script src="../../js/creds.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
@@ -106,6 +106,16 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -152,6 +162,14 @@
|
||||
<h6 class="mt-3">Теги</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/audit/">audit</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/leadera/">leadera</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/security/">security</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ux/">ux</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/ssh/">ssh</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../tags/tunnel/">tunnel</a></li>
|
||||
|
||||
+1
-1
@@ -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 ГромкосLine truncated
|
||||
[{"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Рекомендация: Добавить покрытие тестами, особенно для критичных бLine truncated
|
||||
+24
-12
@@ -2,6 +2,30 @@
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>/tags/audit/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/guides/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/leadera/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/security/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/ux/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/guides/leadera-audit/</loc>
|
||||
<lastmod>2026-03-30T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/diary/2026-03-29/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
@@ -40,9 +64,6 @@
|
||||
</url><url>
|
||||
<loc>/tags/docs/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/creds/docs-a2v-space-auth/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
@@ -58,9 +79,6 @@
|
||||
</url><url>
|
||||
<loc>/tags/go/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/guides/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/hugo/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
@@ -73,9 +91,6 @@
|
||||
</url><url>
|
||||
<loc>/kb/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/leadera/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/llm/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
@@ -121,9 +136,6 @@
|
||||
</url><url>
|
||||
<loc>/tags/streamer/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>/tags/tunnel/</loc>
|
||||
<lastmod>2026-03-29T00:00:00+00:00</lastmod>
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Audit — docs.a2v.space</title>
|
||||
|
||||
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../css/custom.css">
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="../../">docs.a2v.space</a>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarMain">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../diary/">Дневник</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../kb/">База знаний</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../plans/">Планы</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../guides/">Инструкции</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../creds/">Креды</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<form class="d-flex search-form" role="search">
|
||||
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
|
||||
<button class="btn btn-outline-light" type="submit">Найти</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="search-results" class="search-results" style="display: none;">
|
||||
<div class="search-results-content">
|
||||
<button type="button" class="btn-close float-end" id="close-search"></button>
|
||||
<h5>Результаты поиска</h5>
|
||||
<ul id="results-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
|
||||
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
|
||||
<div class="sidebar-content">
|
||||
|
||||
|
||||
|
||||
<h6>Разделы</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
<main class="col-md-9 col-lg-10 main-content">
|
||||
|
||||
<div class="article-content">
|
||||
<h1>Audit</h1>
|
||||
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
<p class="text-center mb-0">© 2026 docs.a2v.space</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
|
||||
|
||||
|
||||
<script src="../../js/search.js"></script>
|
||||
<script src="../../js/creds.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Audit on docs.a2v.space</title>
|
||||
<link>/tags/audit/</link>
|
||||
<description>Recent content in Audit on docs.a2v.space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>ru-ru</language>
|
||||
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="/tags/audit/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Аудит Leadera</title>
|
||||
<link>/guides/leadera-audit/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/guides/leadera-audit/</guid>
|
||||
<description><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></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -109,6 +109,14 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="../tags/audit/">Audit</a></li>
|
||||
|
||||
<li><a href="../tags/leadera/">Leadera</a></li>
|
||||
|
||||
<li><a href="../tags/security/">Security</a></li>
|
||||
|
||||
<li><a href="../tags/ux/">Ux</a></li>
|
||||
|
||||
<li><a href="../tags/amnezia/">Amnezia</a></li>
|
||||
|
||||
<li><a href="../tags/angular/">Angular</a></li>
|
||||
@@ -139,8 +147,6 @@
|
||||
|
||||
<li><a href="../tags/infrastructure/">Infrastructure</a></li>
|
||||
|
||||
<li><a href="../tags/leadera/">Leadera</a></li>
|
||||
|
||||
<li><a href="../tags/llm/">Llm</a></li>
|
||||
|
||||
<li><a href="../tags/music/">Music</a></li>
|
||||
|
||||
+29
-8
@@ -6,8 +6,36 @@
|
||||
<description>Recent content in Tags on docs.a2v.space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>ru-ru</language>
|
||||
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Audit</title>
|
||||
<link>/tags/audit/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/tags/audit/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Leadera</title>
|
||||
<link>/tags/leadera/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/tags/leadera/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Security</title>
|
||||
<link>/tags/security/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/tags/security/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Ux</title>
|
||||
<link>/tags/ux/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/tags/ux/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Amnezia</title>
|
||||
<link>/tags/amnezia/</link>
|
||||
@@ -113,13 +141,6 @@
|
||||
<guid>/tags/infrastructure/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Leadera</title>
|
||||
<link>/tags/leadera/</link>
|
||||
<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/tags/leadera/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Llm</title>
|
||||
<link>/tags/llm/</link>
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
|
||||
|
||||
<li><a href="../../creds/leadera-db-docker/">Mac Studio — leadera-api БД (docker-compose)</a></li>
|
||||
|
||||
<li><a href="../../creds/leadera-db-local/">Mac Studio — leadera-api БД (локальная)</a></li>
|
||||
|
||||
@@ -6,8 +6,15 @@
|
||||
<description>Recent content in Leadera on docs.a2v.space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>ru-ru</language>
|
||||
<lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="/tags/leadera/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Аудит Leadera</title>
|
||||
<link>/guides/leadera-audit/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/guides/leadera-audit/</guid>
|
||||
<description><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></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Mac Studio — leadera-api БД (docker-compose)</title>
|
||||
<link>/creds/leadera-db-docker/</link>
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Security — docs.a2v.space</title>
|
||||
|
||||
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../css/custom.css">
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="../../">docs.a2v.space</a>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarMain">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../diary/">Дневник</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../kb/">База знаний</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../plans/">Планы</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../guides/">Инструкции</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../creds/">Креды</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<form class="d-flex search-form" role="search">
|
||||
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
|
||||
<button class="btn btn-outline-light" type="submit">Найти</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="search-results" class="search-results" style="display: none;">
|
||||
<div class="search-results-content">
|
||||
<button type="button" class="btn-close float-end" id="close-search"></button>
|
||||
<h5>Результаты поиска</h5>
|
||||
<ul id="results-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
|
||||
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
|
||||
<div class="sidebar-content">
|
||||
|
||||
|
||||
|
||||
<h6>Разделы</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
<main class="col-md-9 col-lg-10 main-content">
|
||||
|
||||
<div class="article-content">
|
||||
<h1>Security</h1>
|
||||
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
<p class="text-center mb-0">© 2026 docs.a2v.space</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
|
||||
|
||||
|
||||
<script src="../../js/search.js"></script>
|
||||
<script src="../../js/creds.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Security on docs.a2v.space</title>
|
||||
<link>/tags/security/</link>
|
||||
<description>Recent content in Security on docs.a2v.space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>ru-ru</language>
|
||||
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="/tags/security/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Аудит Leadera</title>
|
||||
<link>/guides/leadera-audit/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/guides/leadera-audit/</guid>
|
||||
<description><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></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -0,0 +1,140 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Ux — docs.a2v.space</title>
|
||||
|
||||
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../css/custom.css">
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="../../">docs.a2v.space</a>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarMain" aria-controls="navbarMain" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarMain">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../diary/">Дневник</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../kb/">База знаний</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../plans/">Планы</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../guides/">Инструкции</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="../../creds/">Креды</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<form class="d-flex search-form" role="search">
|
||||
<input class="form-control me-2" type="search" placeholder="Поиск..." aria-label="Search" id="search-input">
|
||||
<button class="btn btn-outline-light" type="submit">Найти</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-outline-light d-md-none ms-2" type="button" data-bs-toggle="collapse" data-bs-target="#sidebar" aria-expanded="false" aria-controls="sidebar">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="search-results" class="search-results" style="display: none;">
|
||||
<div class="search-results-content">
|
||||
<button type="button" class="btn-close float-end" id="close-search"></button>
|
||||
<h5>Результаты поиска</h5>
|
||||
<ul id="results-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
|
||||
<aside class="col-md-3 col-lg-2 d-md-block sidebar collapse" id="sidebar">
|
||||
<div class="sidebar-content">
|
||||
|
||||
|
||||
|
||||
<h6>Разделы</h6>
|
||||
<ul class="nav flex-column">
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../diary/">Дневник</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../kb/">База знаний</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../plans/">Планы</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../guides/">Инструкции</a></li>
|
||||
|
||||
<li class="nav-item"><a class="nav-link" href="../../creds/">Креды</a></li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
<main class="col-md-9 col-lg-10 main-content">
|
||||
|
||||
<div class="article-content">
|
||||
<h1>Ux</h1>
|
||||
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="../../guides/leadera-audit/">Аудит Leadera</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
<p class="text-center mb-0">© 2026 docs.a2v.space</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/fuse.js@7.0.0/dist/fuse.min.js"></script>
|
||||
|
||||
|
||||
<script src="../../js/search.js"></script>
|
||||
<script src="../../js/creds.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Ux on docs.a2v.space</title>
|
||||
<link>/tags/ux/</link>
|
||||
<description>Recent content in Ux on docs.a2v.space</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>ru-ru</language>
|
||||
<lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="/tags/ux/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Аудит Leadera</title>
|
||||
<link>/guides/leadera-audit/</link>
|
||||
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
|
||||
<guid>/guides/leadera-audit/</guid>
|
||||
<description><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></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
Reference in new issue
Block a user