@@ -0,0 +1,32 @@
|
|||||||
|
name: release-agent
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Go setup
|
||||||
|
uses: actions/setup-go@v6
|
||||||
|
with:
|
||||||
|
go-version: "1.26.1"
|
||||||
|
- name: Run GoReleaser
|
||||||
|
uses: goreleaser/goreleaser-action@v6
|
||||||
|
with:
|
||||||
|
distribution: goreleaser
|
||||||
|
version: latest
|
||||||
|
args: release --clean
|
||||||
|
workdir: agent
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
@@ -1 +1,426 @@
|
|||||||
# HellreigN
|
# HellreigN
|
||||||
|
|
||||||
|
Платформа централизованного мониторинга логов, управления скриптами и деплоя агентов.
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐ gRPC (mTLS) ┌────────┐
|
||||||
|
│ Agent 1 │ ───────────────────────► │ │
|
||||||
|
└─────────────┘ │ │
|
||||||
|
┌─────────────┐ gRPC (mTLS) │Backend │ HTTP ┌──────────┐
|
||||||
|
│ Agent 2 │ ───────────────────────► │ :8080 │ ◄──────────────── │ Frontend │
|
||||||
|
└─────────────┘ │ :9001 │ │ :3000 │
|
||||||
|
┌─────────────┐ gRPC (mTLS) │ │ └──────────┘
|
||||||
|
│ Agent N │ ───────────────────────► │ │
|
||||||
|
└─────────────┘ └───┬────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────┐
|
||||||
|
│ ClickHouse │
|
||||||
|
│ :8123/:9000│
|
||||||
|
└─────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Компоненты
|
||||||
|
|
||||||
|
| Компонент | Описание |
|
||||||
|
|-----------|----------|
|
||||||
|
| **Backend** | Go (Gin + gRPC). REST API, gRPC сервер с mTLS, хранение токенов в SQLite |
|
||||||
|
| **Agent** | Go. Сбор логов (journald, docker, kubernetes, file), отправка метрик, выполнение команд |
|
||||||
|
| **Frontend** | React 19 + TypeScript + TailwindCSS + PrimeReact |
|
||||||
|
| **ClickHouse** | Хранилище логов |
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### Требования
|
||||||
|
|
||||||
|
- Docker + Docker Compose
|
||||||
|
- Go 1.26.1+ (для локальной разработки)
|
||||||
|
- protoc + protoc-gen-go (для генерации proto)
|
||||||
|
|
||||||
|
### Деплой через Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd infra
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Это поднимет:
|
||||||
|
- **ClickHouse** — хранилище логов
|
||||||
|
- **Backend** — API на порту `8080`, gRPC на `9001`
|
||||||
|
- **Frontend** — веб-интерфейс на порту `3000`
|
||||||
|
- **Agent** — агент мониторинга (пример)
|
||||||
|
|
||||||
|
Откройте `http://localhost:3000`. Логин: `admin`, пароль: `admin123`.
|
||||||
|
|
||||||
|
### Локальная разработка
|
||||||
|
|
||||||
|
#### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
go mod tidy
|
||||||
|
go run ./cmd/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Frontend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Agent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd agent
|
||||||
|
go mod tidy
|
||||||
|
CONFIG_FILE=./config.yml go run main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### Backend (`infra/backend/config.yml`)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
database:
|
||||||
|
token_db: /var/lib/hellreign/tokens.db # SQLite база токенов и пользователей
|
||||||
|
clickhouse_host: clickhouse:9000 # ClickHouse native порт
|
||||||
|
clickhouse_user: default # Пользователь ClickHouse
|
||||||
|
clickhouse_password: testpassword # Пароль ClickHouse
|
||||||
|
clickhouse_database: hellreign # База данных ClickHouse
|
||||||
|
admin:
|
||||||
|
admin_name: Admin # Имя администратора
|
||||||
|
admin_last_name: User # Фамилия администратора
|
||||||
|
admin_login: admin # Логин администратора
|
||||||
|
admin_password: admin123 # Пароль администратора (смените!)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Agent (`infra/agent/config.yml`)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
backend_url: http://backend:8080 # HTTP URL бэкенда
|
||||||
|
grpc_url: backend:9001 # gRPC URL бэкенда
|
||||||
|
label: test-agent-1 # Уникальная метка агента
|
||||||
|
registration_token: "your-token-here" # Токен регистрации (сгенерировать в UI)
|
||||||
|
cert_dir: /etc/hellreign-agent/certs # Директория для mTLS сертификатов
|
||||||
|
services:
|
||||||
|
# Сбор логов из journald
|
||||||
|
- name: system
|
||||||
|
type: journald
|
||||||
|
|
||||||
|
# Сбор логов Docker контейнера
|
||||||
|
- name: nginx
|
||||||
|
type: docker
|
||||||
|
|
||||||
|
# Сбор логов из journald + проверка systemd сервиса
|
||||||
|
- name: sshd
|
||||||
|
type: journald
|
||||||
|
systemd_unit: sshd # Опционально: проверка alive/dead
|
||||||
|
|
||||||
|
# Сбор логов из файла
|
||||||
|
- name: myapp
|
||||||
|
type: file
|
||||||
|
path: /var/log/myapp/app.log
|
||||||
|
|
||||||
|
# Сбор логов из Kubernetes
|
||||||
|
- name: mypod
|
||||||
|
type: kubernetes
|
||||||
|
namespace: default
|
||||||
|
pod: my-pod
|
||||||
|
container: my-container
|
||||||
|
```
|
||||||
|
|
||||||
|
### Graph зависимостей (`infra/services.yaml`)
|
||||||
|
|
||||||
|
Описывает зависимости сервисов для построения графа и определения причин сбоев:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
nodes:
|
||||||
|
test-agent-1:
|
||||||
|
services:
|
||||||
|
nginx:
|
||||||
|
depends_on:
|
||||||
|
- sshd
|
||||||
|
sshd:
|
||||||
|
depends_on: []
|
||||||
|
system:
|
||||||
|
depends_on:
|
||||||
|
- sshd
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|-------------|----------|
|
||||||
|
| `CONFIG_FILE` | `/etc/hellreign/config.yml` | Путь к YAML конфигу |
|
||||||
|
| `GRAPH_YAML_PATH` | `/etc/hellreign/services.yaml` | Путь к графу сервисов |
|
||||||
|
| `SSL_CERT_DIR` | `/var/lib/hellreign/ssl` | Директория SSL сертификатов для mTLS |
|
||||||
|
| `SERVER_SAN_DNS` | `localhost,backend` | SAN DNS для серверного сертификата |
|
||||||
|
| `SERVER_SAN_IP` | `127.0.0.1` | SAN IP для серверного сертификата |
|
||||||
|
| `GRPC_PORT` | `9001` | Порт gRPC сервера |
|
||||||
|
| `GIN_MODE` | `release` | Режим Gin (`debug` / `release`) |
|
||||||
|
|
||||||
|
### Agent
|
||||||
|
|
||||||
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|-------------|----------|
|
||||||
|
| `CONFIG_FILE` | `/etc/hellreign-agent/config.yml` | Путь к YAML конфигу агента |
|
||||||
|
| `JOURNALD_LOGDIR` | `/var/log/journal` | Директория логов journald (read-only) |
|
||||||
|
| `BUFFER_DB` | `/var/lib/hellreign-agent/agent_buffer.db` | SQLite буфер для офлайн-доставки |
|
||||||
|
| `IS_DEBUG` | `0` | Включить debug логи агента (`1` / `0`) |
|
||||||
|
|
||||||
|
## Порты
|
||||||
|
|
||||||
|
| Сервис | Порт | Назначение |
|
||||||
|
|--------|------|------------|
|
||||||
|
| Frontend | `3000` | Веб-интерфейс (Nginx → React) |
|
||||||
|
| Backend HTTP | `8080` | REST API + Swagger UI |
|
||||||
|
| Backend gRPC | `9001` | gRPC с mTLS (Commander + Collector) |
|
||||||
|
| ClickHouse HTTP | `8123` | HTTP интерфейс ClickHouse |
|
||||||
|
| ClickHouse Native | `9000` | Native протокол ClickHouse |
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
### Авторизация
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логин
|
||||||
|
curl -X POST http://localhost:8080/api/v1/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"login":"admin","password":"admin123"}'
|
||||||
|
|
||||||
|
# Создать токен
|
||||||
|
curl -X POST http://localhost:8080/api/v1/auth/token \
|
||||||
|
-H "Authorization: Bearer <jwt>" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name":"my-token","permissions":["admin"]}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Регистрация агента
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сгенерировать токен регистрации (admin)
|
||||||
|
curl -X POST http://localhost:8080/api/v1/agents/register-token \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
|
||||||
|
# Зарегистрировать агент
|
||||||
|
curl -X POST http://localhost:8080/api/v1/agents/register \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"registration_token":"<token>","csr":"<pem>"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Поиск логов
|
||||||
|
curl "http://localhost:8080/api/v1/logs?service=nginx&level=error&from=2024-01-01T00:00:00Z" \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
|
||||||
|
# Список сервисов
|
||||||
|
curl http://localhost:8080/api/v1/logs/services \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Агенты и метрики
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Список подключённых агентов
|
||||||
|
curl http://localhost:8080/api/v1/agents \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
|
||||||
|
# Метрики нагрузки (CPU, RAM, disk, network)
|
||||||
|
curl http://localhost:8080/api/v1/agents/system-metrics \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Скрипты
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Дерево скриптов
|
||||||
|
curl http://localhost:8080/api/v1/scripts/tree \
|
||||||
|
-H "Authorization: Bearer <jwt>"
|
||||||
|
|
||||||
|
# Создать скрипт
|
||||||
|
curl -X POST http://localhost:8080/api/v1/scripts \
|
||||||
|
-H "Authorization: Bearer <jwt>" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"path":"deploy/restart.sh","content":"#!/bin/bash\nsystemctl restart nginx","interpreter_id":1}'
|
||||||
|
|
||||||
|
# Запустить скрипт
|
||||||
|
curl -X POST http://localhost:8080/api/v1/scripts/1/run \
|
||||||
|
-H "Authorization: Bearer <jwt>" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"token":"agent-token","stdin":""}'
|
||||||
|
|
||||||
|
# Переименовать скрипт или папку
|
||||||
|
curl -X POST http://localhost:8080/api/v1/scripts/rename \
|
||||||
|
-H "Authorization: Bearer <jwt>" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"old_path":"deploy/old.sh","new_path":"deploy/new.sh"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Swagger
|
||||||
|
|
||||||
|
Swagger UI доступен по адресу: `http://localhost:8080/swagger/index.html`
|
||||||
|
|
||||||
|
Перегенерация:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
swag init -g ./cmd/main.go --parseDependency --parseInternal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Proto
|
||||||
|
|
||||||
|
gRPC протокол определён в `proto/hellreign.proto`. После изменений:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd proto
|
||||||
|
protoc --go_out=. --go_opt=paths=source_relative \
|
||||||
|
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
|
||||||
|
hellreign.proto
|
||||||
|
mv hellreign*.go proto/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Миграции
|
||||||
|
|
||||||
|
SQL миграции для SQLite хранятся в `migrations/`. Применяются автоматически при старте бэкенда.
|
||||||
|
|
||||||
|
## Деплой агента на хост
|
||||||
|
|
||||||
|
### 1. Создать директорию
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mkdir -p /etc/hellreign-agent/certs
|
||||||
|
sudo mkdir -p /var/lib/hellreign-agent
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Конфиг
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/hellreign-agent/config.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
backend_url: https://your-backend.example.com
|
||||||
|
grpc_url: your-backend.example.com:9001
|
||||||
|
label: production-server-1
|
||||||
|
registration_token: "token-from-ui"
|
||||||
|
cert_dir: /etc/hellreign-agent/certs
|
||||||
|
services:
|
||||||
|
- name: nginx
|
||||||
|
type: journald
|
||||||
|
systemd_unit: nginx.service
|
||||||
|
- name: postgres
|
||||||
|
type: journald
|
||||||
|
systemd_unit: postgresql.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Установить бинарь
|
||||||
|
|
||||||
|
Скачать релиз из Gitea или собрать:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd agent
|
||||||
|
go build -o hellreign-agent ./main.go
|
||||||
|
sudo mv hellreign-agent /usr/bin/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Systemd сервис
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=HellreigN Agent
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/hellreign-agent
|
||||||
|
Environment=CONFIG_FILE=/etc/hellreign-agent/config.yml
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable --now hellreign-agent
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD
|
||||||
|
|
||||||
|
### GoReleaser (агент)
|
||||||
|
|
||||||
|
При пуше тега `v*` автоматически собирается релиз:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git tag v1.0.0
|
||||||
|
git push origin v1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Собираются `.deb` и `.rpm` пакеты для `linux/amd64` и `linux/arm64`.
|
||||||
|
|
||||||
|
Требует секрет `GITEA_TOKEN` в настройках репозитория.
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
HellreigN/
|
||||||
|
├── agent/ # Агент мониторинга
|
||||||
|
│ ├── main.go # Точка входа
|
||||||
|
│ ├── dockerfile
|
||||||
|
│ ├── .goreleaser.yml # Конфиг GoReleaser
|
||||||
|
│ └── internal/
|
||||||
|
│ ├── buffer/ # SQLite буфер логов
|
||||||
|
│ ├── client/ # gRPC клиент команд
|
||||||
|
│ ├── commander/ # Исполнитель команд
|
||||||
|
│ ├── config/ # Загрузка YAML конфига
|
||||||
|
│ ├── logger/ # Логгер
|
||||||
|
│ ├── logsource/ # Источники логов
|
||||||
|
│ │ ├── docker/ # Docker логи
|
||||||
|
│ │ ├── file/ # File логи
|
||||||
|
│ │ ├── journald/ # Journald логи
|
||||||
|
│ │ └── kubernetes/ # Kubernetes логи
|
||||||
|
│ ├── metrics/ # Сбор метрик (CPU, RAM, disk, network)
|
||||||
|
│ ├── mtls/ # mTLS credentials
|
||||||
|
│ └── registration/ # Регистрация агента
|
||||||
|
├── backend/ # Бэкенд API
|
||||||
|
│ ├── cmd/main.go # Точка входа
|
||||||
|
│ ├── dockerfile
|
||||||
|
│ ├── internal/
|
||||||
|
│ │ ├── handlers/ # HTTP хендлеры
|
||||||
|
│ │ ├── repository/ # Репозитории (SQLite)
|
||||||
|
│ │ ├── service/ # Бизнес-логика
|
||||||
|
│ │ ├── storage/ # ClickHouse storage
|
||||||
|
│ │ ├── grpcsrv/ # gRPC серверы
|
||||||
|
│ │ │ ├── commander/ # Выполнение команд на агентах
|
||||||
|
│ │ │ └── collector/ # Сбор логов и метрик
|
||||||
|
│ │ ├── auth/ # JWT авторизация
|
||||||
|
│ │ └── config/ # Загрузка конфига
|
||||||
|
│ └── docs/ # Swagger документация
|
||||||
|
├── frontend/ # Веб-интерфейс
|
||||||
|
│ ├── dockerfile
|
||||||
|
│ ├── nginx.conf
|
||||||
|
│ └── src/
|
||||||
|
├── infra/ # Docker Compose деплой
|
||||||
|
│ ├── docker-compose.yml
|
||||||
|
│ ├── services.yaml # Граф зависимостей
|
||||||
|
│ ├── backend/config.yml # Конфиг бэкенда
|
||||||
|
│ ├── agent/config.yml # Конфиг агента
|
||||||
|
│ └── clickhouse/init/ # Инициализация ClickHouse
|
||||||
|
├── migrations/ # SQL миграции SQLite
|
||||||
|
├── proto/ # Protobuf определения
|
||||||
|
│ ├── hellreign.proto
|
||||||
|
│ └── proto/ # Сгенерированный Go код
|
||||||
|
└── .gitea/workflows/ # Gitea Actions CI/CD
|
||||||
|
├── ci-agent.yml
|
||||||
|
├── ci-front.yml
|
||||||
|
└── release-agent.yml
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user