Renew docs
This commit is contained in:
parent
454aed05fa
commit
2611b099ce
2 changed files with 595 additions and 65 deletions
395
ARCHITECTURE.md
Normal file
395
ARCHITECTURE.md
Normal file
|
|
@ -0,0 +1,395 @@
|
||||||
|
# Auspex — Architecture
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
Auspex — монолитное CLI-приложение на Go. Все модули живут в одном пакете `main`, конфигурация глобальная, каналы доставки алертов shared. Такой подход выбран осознанно — утилита запускается по cron, живёт секунды, сложная изоляция не нужна.
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ auspex │
|
||||||
|
│ │
|
||||||
|
│ main.go ──► runByFlag() / showMenu() │
|
||||||
|
│ │ │
|
||||||
|
│ ┌──────────┼──────────────┐ │
|
||||||
|
│ ▼ ▼ ▼ │
|
||||||
|
│ certcheck portcheck logcheck ... │
|
||||||
|
│ │ │ │ │
|
||||||
|
│ └──────────┴──────────────┘ │
|
||||||
|
│ │ │
|
||||||
|
│ Alert Pipeline │
|
||||||
|
│ ┌──────────┼──────────────┐ │
|
||||||
|
│ ▼ ▼ ▼ │
|
||||||
|
│ telegram email mattermost │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Файлы и их роли
|
||||||
|
|
||||||
|
### `main.go` — точка входа
|
||||||
|
|
||||||
|
Отвечает за два режима запуска:
|
||||||
|
|
||||||
|
**CLI-флаги** (`runByFlag`): прямой вызов нужного модуля по флагу (`-c`, `-p`, `-l`, `-sv`, `-d`, `-m`, `-ss`).
|
||||||
|
|
||||||
|
**Интерактивное меню** (`showMenu`): ASCII-баннер, numbered menu, `bufio.Reader` для ввода. Поддерживает как цифры (`1`-`7`), так и текстовые алиасы (`-c`, `c`).
|
||||||
|
|
||||||
|
```
|
||||||
|
auspex [флаг] [аргументы]
|
||||||
|
│
|
||||||
|
├── -ss → runPortsView()
|
||||||
|
├── -c → runCertCheck()
|
||||||
|
├── -p → runPortCheck()
|
||||||
|
├── -m → runMatchCheck(clientFilter)
|
||||||
|
├── -l → runLogCheck()
|
||||||
|
├── -sv → runServiceCheck()
|
||||||
|
├── -d → runDockerCheck()
|
||||||
|
├── -v → версия
|
||||||
|
└── -h → usage
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `config.go` — конфигурация
|
||||||
|
|
||||||
|
Все настройки — глобальные переменные вида `cfgXxx`. Загрузка из `/etc/auspex/auspex.env` при старте через `loadConfig()` → `applyConfig()`.
|
||||||
|
|
||||||
|
Формат `.env`:
|
||||||
|
```
|
||||||
|
KEY=VALUE # кавычки обрезаются автоматически
|
||||||
|
# комментарии игнорируются
|
||||||
|
```
|
||||||
|
|
||||||
|
Если файл не найден — используются значения по умолчанию, вывод предупреждения в stdout. Программа продолжает работу.
|
||||||
|
|
||||||
|
**Группы переменных:**
|
||||||
|
- Telegram (токен, chat ID, прокси)
|
||||||
|
- Mattermost (URL, токен бота, channel ID)
|
||||||
|
- Email/SMTP (хост, порт, логин, пароль, from, to)
|
||||||
|
- PostgreSQL (user, password, dbname, port, primary host, secondary host)
|
||||||
|
- Пути (SSL dir, nginx glob, log dir, state files)
|
||||||
|
- Пороги (cert days, log stale minutes)
|
||||||
|
- Параметры проверки (timeout, retries, workers)
|
||||||
|
- Список служб для проверки
|
||||||
|
|
||||||
|
**Вспомогательные функции:**
|
||||||
|
- `isTelegramConfigured()` — проверяет наличие токена и chat ID
|
||||||
|
- `isEmailConfigured()` — проверяет host, from, to
|
||||||
|
- `isMattermostConfigured()` — проверяет URL, токен, channel ID
|
||||||
|
- `printConfigStatus()` — выводит статус всех каналов при запуске
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `telegram.go` — доставка в Telegram
|
||||||
|
|
||||||
|
**Функции отправки:**
|
||||||
|
- `telegramSendHTML(message)` — HTML-форматирование (теги `<b>`, `<code>`, `<i>`)
|
||||||
|
- `telegramSendPlainText(message)` — plain text без форматирования (используется в portcheck)
|
||||||
|
|
||||||
|
**Цепочка прокси (`telegramHTTPClients`):**
|
||||||
|
|
||||||
|
Возвращает срез `[]*http.Client` в порядке приоритета:
|
||||||
|
|
||||||
|
```
|
||||||
|
1. HTTP прокси (если задан TELEGRAM_HTTP_PROXY)
|
||||||
|
2. SOCKS5 (если задан TELEGRAM_SOCKS5_PROXY)
|
||||||
|
3. Прямое (всегда, как последний fallback)
|
||||||
|
```
|
||||||
|
|
||||||
|
`telegramDoPost` и `telegramDoPostForm` перебирают клиентов по очереди. При ошибке одного — переходят к следующему с логом предупреждения. Успешный вариант логируется.
|
||||||
|
|
||||||
|
**SOCKS5:** реализован через `golang.org/x/net/proxy`. Логин/пароль задаются отдельными переменными (не в URL) — это исключает проблемы со спецсимволами вроде `!` и `$` в паролях.
|
||||||
|
|
||||||
|
**HTTP прокси:** реализован через стандартный `http.Transport{Proxy: http.ProxyURL(...)}`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `email.go` — доставка по Email
|
||||||
|
|
||||||
|
**`emailSendHTML(subject, message)`** — отправка HTML-письма через SMTP.
|
||||||
|
|
||||||
|
Особенности реализации:
|
||||||
|
- Telegram-теги (`<b>`, `<code>`, `<i>`) являются валидным HTML и отображаются в письме без конвертации
|
||||||
|
- `\n` заменяются на `<br>` для корректного отображения переносов строк
|
||||||
|
- Письмо оборачивается в HTML-шаблон с CSS стилями (`emailBuildHTML`)
|
||||||
|
- Поддерживается `AUTH LOGIN` (тип авторизации который использует Microsoft Exchange и многие корпоративные серверы) через кастомный `emailLoginAuth`, реализующий интерфейс `smtp.Auth`
|
||||||
|
- Стандартный `smtp.PlainAuth` намеренно не используется — он несовместим с рядом серверов
|
||||||
|
- Порт 587 + STARTTLS работает автоматически через `smtp.SendMail`
|
||||||
|
- `EMAIL_TO` поддерживает несколько адресов через запятую
|
||||||
|
|
||||||
|
**Диагностика при неполной конфигурации:**
|
||||||
|
- Не задан HOST/FROM/TO → лог `[Email] Не настроен — пропускаем`
|
||||||
|
- Не задан USER или PASSWORD → предупреждение, попытка без авторизации (для relay-серверов)
|
||||||
|
- Ошибка SMTP → лог с кодом ответа и телом ошибки
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `mattermost.go` — доставка в Mattermost
|
||||||
|
|
||||||
|
**`mattermostSend(message)`** — отправка через Bot API.
|
||||||
|
|
||||||
|
Endpoint: `POST /api/v4/posts` с заголовком `Authorization: Bearer <token>`.
|
||||||
|
|
||||||
|
Успешный ответ: `201 Created` (не `200`, как в большинстве API).
|
||||||
|
|
||||||
|
**`mmHTMLToMarkdown(html)`** — конвертер форматирования:
|
||||||
|
|
||||||
|
| HTML (Telegram) | Markdown (Mattermost) |
|
||||||
|
|---|---|
|
||||||
|
| `<b>текст</b>` | `**текст**` |
|
||||||
|
| `<i>текст</i>` | `_текст_` |
|
||||||
|
| `<code>текст</code>` | `` `текст` `` |
|
||||||
|
| `<pre>текст</pre>` | ` ```текст``` ` |
|
||||||
|
| `━━━━━` | `---` |
|
||||||
|
| `<` `>` `&` | `<` `>` `&` |
|
||||||
|
| Прочие теги | удаляются |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `certcheck.go` — проверка SSL сертификатов
|
||||||
|
|
||||||
|
**Точка входа:** `runCertCheck()`
|
||||||
|
|
||||||
|
**Алгоритм:**
|
||||||
|
1. `ccFindCerts(cfgSSLDir)` — рекурсивный обход директории, фильтрация по расширениям (`.crt`, `.pem`, `.cer`, `.cert`, `.der`, `.p7b`, `.p7c`, `.p7s`, `.csr`)
|
||||||
|
2. Параллельный парсинг через пул горутин (`cfgMaxWorkers`)
|
||||||
|
3. `ccParseCert(path)` — определение формата (PEM/DER), парсинг через `crypto/x509`, вычисление `daysLeft`
|
||||||
|
4. `ccCheckAndAlert(cert)` — сравнение с порогами и отправка алерта
|
||||||
|
|
||||||
|
**Уровни алертов:**
|
||||||
|
|
||||||
|
| Условие | Emoji | Уровень |
|
||||||
|
|---|---|---|
|
||||||
|
| `daysLeft < 0` | 💀💀💀 | Сертификат истёк |
|
||||||
|
| `daysLeft <= CERT_CRITICAL_DAYS` | 🚨🚨🚨 | Критично |
|
||||||
|
| `daysLeft <= CERT_WARNING_DAYS` | ⚠️⚠️ | Предупреждение |
|
||||||
|
| `daysLeft <= CERT_INFO_DAYS` | ℹ️ | Информация |
|
||||||
|
| Иначе | — | Алерт не нужен |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `portcheck.go` — проверка доступности портов
|
||||||
|
|
||||||
|
**Точка входа:** `runPortCheck()`
|
||||||
|
|
||||||
|
**Алгоритм:**
|
||||||
|
1. Подключение к PostgreSQL (primary → secondary failover)
|
||||||
|
2. Загрузка карты `check_ports` из таблицы `apps_settings` — какие конфиги проверять
|
||||||
|
3. `pcParseNginxConfig(file)` — парсинг `upstream { server ip:port; }` блоков regex'ом
|
||||||
|
4. Дедупликация endpoint'ов по всем файлам
|
||||||
|
5. Параллельная TCP-проверка (`net.DialTimeout`) с повторами (`cfgMaxRetries`)
|
||||||
|
6. `pcCompareStates` — сравнение с предыдущим state-файлом
|
||||||
|
7. Отправка алерта только при изменениях
|
||||||
|
|
||||||
|
**State-файл** (`/tmp/port_checker_state.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"timestamp": "2026-04-14 13:10:10",
|
||||||
|
"status": {
|
||||||
|
"91.206.126.83:443": {"endpoint": "...", "available": true, "config_file": "Client_12345"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Имена конфигов** строятся из имени файла без расширения: `Client_12345.conf` → `Client_12345`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `logcheck.go` — проверка свежести логов
|
||||||
|
|
||||||
|
**Точка входа:** `runLogCheck()`
|
||||||
|
|
||||||
|
**Алгоритм (4 шага через PostgreSQL):**
|
||||||
|
1. `lcGetInstancesByHostname` — инстансы для текущего хоста (`instances_new`)
|
||||||
|
2. `lcGetClientsByInstances` — клиенты для этих инстансов (`client_info`)
|
||||||
|
3. `lcGetAppsByClients` — приложения с `check_write_logs = true` (`apps_settings`)
|
||||||
|
4. `lcCheckLogFile` — поиск файла по паттерну `{LOG_DIR}/*/*/{l7resourceid}*_access.log`, проверка `ModTime`
|
||||||
|
|
||||||
|
Файл считается устаревшим если `time.Since(ModTime) > cfgLogStaleMinutes`.
|
||||||
|
|
||||||
|
**Уровни в алерте** по времени с последней записи:
|
||||||
|
|
||||||
|
| Минут | Emoji |
|
||||||
|
|---|---|
|
||||||
|
| 61–120 | ⚠️ |
|
||||||
|
| 121–240 | 🔥 |
|
||||||
|
| > 240 | 💀 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `matchcheck.go` — проверка совпадений Angie ↔ Docker
|
||||||
|
|
||||||
|
**Точка входа:** `runMatchCheck(clientFilter)`
|
||||||
|
|
||||||
|
Проверяет соответствие между портами в конфигах Angie и запущенными Docker контейнерами. Поддерживает фильтрацию по имени клиента.
|
||||||
|
|
||||||
|
**Алгоритм:**
|
||||||
|
1. Парсинг конфигов Angie из `cfgAngieConfDir` — извлечение портов на которых слушает Angie
|
||||||
|
2. `docker ps` — список запущенных контейнеров с их портами
|
||||||
|
3. Сопоставление: для каждого клиента проверяется есть ли соответствующий контейнер и совпадают ли порты
|
||||||
|
4. Алерт при расхождениях
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `servicecheck.go` — проверка служб systemd
|
||||||
|
|
||||||
|
**Точка входа:** `runServiceCheck()`
|
||||||
|
|
||||||
|
**Алгоритм:**
|
||||||
|
1. Параллельная проверка всех служб из `cfgServicesToCheck` через горутины
|
||||||
|
2. `scCheckService(name)` — `systemctl is-active <name>` + `systemctl show <name> --property=SubState,Description`
|
||||||
|
3. Загрузка предыдущего state-файла
|
||||||
|
4. `scCompareStates` — сравнение текущих статусов с предыдущими
|
||||||
|
5. Алерт только при изменениях
|
||||||
|
|
||||||
|
**State-файл** (`/tmp/auspex_service_state.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"timestamp": "2026-04-14 13:00:00",
|
||||||
|
"services": {
|
||||||
|
"angie": "active",
|
||||||
|
"docker": "failed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Типы изменений в алерте:**
|
||||||
|
|
||||||
|
| Изменение | Emoji |
|
||||||
|
|---|---|
|
||||||
|
| `active` → любой другой | ❌ |
|
||||||
|
| любой → `active` | ✅ (восстановление) |
|
||||||
|
| `failed` | 💀 |
|
||||||
|
| `inactive` | 🔴 |
|
||||||
|
| `activating/deactivating` | 🟡 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `dockercheck.go` — проверка Docker контейнеров
|
||||||
|
|
||||||
|
**Точка входа:** `runDockerCheck()`
|
||||||
|
|
||||||
|
**Алгоритм:**
|
||||||
|
1. `dcCheckDockerAvailable()` — `docker info` для проверки доступности демона
|
||||||
|
2. `dcGetContainers()` — `docker ps -a --format '{{.ID}}|{{.Names}}|{{.Status}}|{{.Image}}'`
|
||||||
|
3. `dcGetHealth(id)` — `docker inspect --format '{{if .State.Health}}...{{end}}'` для каждого контейнера отдельно (`.Health` недоступен в `docker ps` в ряде сборок)
|
||||||
|
4. Нормализация статуса: `"Up 2 hours"` → `"running"`, `"Exited (1) 3 min ago"` → `"exited"`
|
||||||
|
5. `dcCompareStates` — сравнение с предыдущим state-файлом
|
||||||
|
6. Алерт только при изменениях
|
||||||
|
|
||||||
|
**Типы событий:**
|
||||||
|
|
||||||
|
| Kind | Условие | Emoji |
|
||||||
|
|---|---|---|
|
||||||
|
| `appeared` | Новый контейнер (не при первом запуске) | 🆕 |
|
||||||
|
| `disappeared` | Контейнер исчез из `docker ps -a` | 👻 |
|
||||||
|
| `status_changed` → не running | Упал/завис | 🔴 💀 🔄 |
|
||||||
|
| `status_changed` → running | Восстановился | ✅ |
|
||||||
|
| `health_changed` → unhealthy | Нездоров | 🤒 |
|
||||||
|
| `health_changed` → healthy | Оздоровился | ✅ |
|
||||||
|
|
||||||
|
**State-файл** (`/tmp/auspex_docker_state.json`):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"timestamp": "2026-04-14 13:00:00",
|
||||||
|
"containers": {
|
||||||
|
"portainer": {"status": "running", "health": "none"},
|
||||||
|
"zabbix-agent-7.0": {"status": "running", "health": "none"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `portsview.go` — TUI просмотр портов
|
||||||
|
|
||||||
|
**Точка входа:** `runPortsView()`
|
||||||
|
|
||||||
|
Интерактивный TUI на базе [Bubble Tea](https://github.com/charmbracelet/bubbletea). Показывает занятые порты на хосте (`ss -tlnp` / `netstat`). Поддерживает фильтрацию, навигацию клавишами.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pipeline доставки алертов
|
||||||
|
|
||||||
|
Все модули с алертами следуют единому паттерну:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 1. Telegram
|
||||||
|
if err := telegramSendHTML(message); err != nil {
|
||||||
|
log.Printf("❌ Ошибка отправки в Telegram: %v", err)
|
||||||
|
} else {
|
||||||
|
log.Println("✅ Алерт успешно отправлен в Telegram")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Email
|
||||||
|
if err := emailSendHTML("Тема", message); err != nil {
|
||||||
|
log.Printf("❌ Ошибка отправки Email: %v", err)
|
||||||
|
} else {
|
||||||
|
log.Println("✅ Алерт успешно отправлен на Email")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Mattermost
|
||||||
|
if err := mattermostSend(message); err != nil {
|
||||||
|
log.Printf("❌ Ошибка отправки в Mattermost: %v", err)
|
||||||
|
} else {
|
||||||
|
log.Println("✅ Алерт успешно отправлен в Mattermost")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Все три вызова независимы — ошибка одного не влияет на остальные.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Паттерн state-файлов
|
||||||
|
|
||||||
|
Модули `-p`, `-sv`, `-d` используют одинаковый механизм для предотвращения спама при запуске по cron:
|
||||||
|
|
||||||
|
```
|
||||||
|
Запуск N: Загрузить prev_state → Получить curr_state → Compare → Alert if changed → Save curr_state
|
||||||
|
Запуск N+1: Загрузить prev_state → Получить curr_state → Compare → ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Первый запуск** (state-файл отсутствует): состояние сохраняется, алерты не отправляются. Исключение: в `dockercheck` появление нового контейнера (`dcKindAppeared`) тоже не алертится при первом запуске — флаг `isFirstRun` передаётся в `dcCompareStates`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Параллелизм
|
||||||
|
|
||||||
|
| Модуль | Механизм |
|
||||||
|
|---|---|
|
||||||
|
| `certcheck` | Пул горутин (`cfgMaxWorkers`) через канал задач |
|
||||||
|
| `servicecheck` | Горутина на каждую службу + `sync.WaitGroup` |
|
||||||
|
| `dockercheck` | Последовательно (inspect на каждый контейнер отдельно) |
|
||||||
|
| `portcheck` | Горутина на каждый endpoint |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Работа с PostgreSQL
|
||||||
|
|
||||||
|
Модули `portcheck` и `logcheck` используют PostgreSQL с failover:
|
||||||
|
|
||||||
|
```
|
||||||
|
primary (cfgPrimaryDBHost) → ping OK? → использовать
|
||||||
|
→ ping fail → secondary (cfgSecondaryDBHost)
|
||||||
|
```
|
||||||
|
|
||||||
|
Каждый модуль реализует свой `pcConnectDB()` / `lcConnectDB()` — функции идентичны по логике, префиксы разные для избежания коллизий имён в пакете `main`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Соглашения по именованию
|
||||||
|
|
||||||
|
Все идентификаторы в каждом модуле имеют уникальный префикс — это позволяет всем файлам жить в одном пакете `main` без конфликтов:
|
||||||
|
|
||||||
|
| Модуль | Префикс |
|
||||||
|
|---|---|
|
||||||
|
| certcheck | `cc` |
|
||||||
|
| portcheck | `pc` |
|
||||||
|
| logcheck | `lc` |
|
||||||
|
| matchcheck | `mc` |
|
||||||
|
| servicecheck | `sc` |
|
||||||
|
| dockercheck | `dc` |
|
||||||
|
| email | `email` |
|
||||||
|
| mattermost | `mm` |
|
||||||
|
| config | `cfg` |
|
||||||
265
README.md
265
README.md
|
|
@ -7,38 +7,30 @@
|
||||||
| Ключ | Описание |
|
| Ключ | Описание |
|
||||||
|------|----------|
|
|------|----------|
|
||||||
| `-ss` | Просмотр занятых портов (интерактивный TUI на bubbletea) |
|
| `-ss` | Просмотр занятых портов (интерактивный TUI на bubbletea) |
|
||||||
| `-c` | Проверка SSL сертификатов (сроки истечения, алерты в Telegram) |
|
| `-c` | Проверка SSL сертификатов (сроки истечения, алерты) |
|
||||||
| `-p` | Проверка доступности портов из nginx upstream конфигов |
|
| `-p` | Проверка доступности портов из nginx upstream конфигов |
|
||||||
| `-m` | Проверка совпадений портов Angie ↔ Docker (+ проверка запуска контейнеров) |
|
| `-m` | Проверка совпадений портов Angie ↔ Docker (+ проверка запуска контейнеров) |
|
||||||
| `-l` | Проверка обновления файлов PT AF access logs |
|
| `-l` | Проверка обновления файлов PT AF access logs |
|
||||||
| `-sv` | Проверка работоспособности служб |
|
| `-sv` | Проверка работоспособности служб systemd |
|
||||||
| `-dv` или `-d` | Проверка работоспособности контейнеров |
|
| `-d` или `-dc` | Проверка работоспособности Docker контейнеров |
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
auspex/
|
auspex/
|
||||||
├── cmd/auspex/
|
├── main.go # Точка входа, меню, роутинг CLI-флагов
|
||||||
│ └── main.go # Точка входа, меню, роутинг CLI-флагов
|
├── config.go # Глобальная конфигурация (переменные + загрузка из .env)
|
||||||
├── internal/
|
├── telegram.go # Отправка алертов в Telegram (поддержка HTTP и SOCKS5 прокси)
|
||||||
│ ├── config/
|
├── email.go # Отправка алертов по Email (SMTP, AUTH LOGIN)
|
||||||
│ │ └── config.go # Общая конфигурация (хардкод + env)
|
├── mattermost.go # Отправка алертов в Mattermost (Bot API)
|
||||||
│ ├── telegram/
|
├── certcheck.go # -c: проверка SSL сертификатов
|
||||||
│ │ └── telegram.go # Общий клиент Telegram
|
├── portcheck.go # -p: проверка доступности портов
|
||||||
│ ├── portsview/
|
├── matchcheck.go # -m: совпадения Angie ↔ Docker
|
||||||
│ │ └── portsview.go # -ss: TUI просмотр портов
|
├── logcheck.go # -l: проверка свежести логов
|
||||||
│ ├── certcheck/
|
├── servicecheck.go # -sv: проверка служб systemd
|
||||||
│ │ └── certcheck.go # -c: проверка сертификатов
|
├── dockercheck.go # -d: проверка Docker контейнеров
|
||||||
│ ├── portcheck/
|
├── portsview.go # -ss: TUI просмотр занятых портов
|
||||||
│ │ └── portcheck.go # -p: проверка доступности портов
|
|
||||||
│ └── matchcheck/
|
|
||||||
│ | └── matchcheck.go # -m: совпадения Angie ↔ Docker
|
|
||||||
│ └── servicecheck/
|
|
||||||
│ | └── servicecheck.go # -sv: проверка работоспособности служб
|
|
||||||
│ └── dockercheck/
|
|
||||||
│ └── dockercheck.go # -dv или -d: проверка работоспособности служб
|
|
||||||
├── go.mod
|
├── go.mod
|
||||||
├── Makefile
|
|
||||||
└── README.md
|
└── README.md
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -46,7 +38,8 @@ auspex/
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go mod tidy
|
go mod tidy
|
||||||
go build -o auspex
|
go build -o auspex .
|
||||||
|
sudo cp auspex /usr/local/bin/auspex
|
||||||
```
|
```
|
||||||
|
|
||||||
## Использование
|
## Использование
|
||||||
|
|
@ -63,56 +56,198 @@ go build -o auspex
|
||||||
./auspex -m client_name # Проверка конкретного клиента
|
./auspex -m client_name # Проверка конкретного клиента
|
||||||
./auspex -l # Проверка свежести логов
|
./auspex -l # Проверка свежести логов
|
||||||
./auspex -sv # Проверка работоспособности служб
|
./auspex -sv # Проверка работоспособности служб
|
||||||
./auspex -dv или -d # Проверка работоспособности контейнеров
|
./auspex -d # Проверка работоспособности контейнеров
|
||||||
./auspex -h # Справка
|
./auspex -h # Справка
|
||||||
./auspex -v # Версия
|
./auspex -v # Версия
|
||||||
```
|
```
|
||||||
|
|
||||||
## Конфигурация
|
## Конфигурация
|
||||||
|
|
||||||
Все настройки находятся в `config.go`.
|
Конфигурация загружается из `/etc/auspex/auspex.env`. Если файл не найден — используются значения по умолчанию. Формат файла: `KEY=VALUE`, комментарии через `#`.
|
||||||
|
|
||||||
### Переменные окружения
|
```bash
|
||||||
|
sudo mkdir -p /etc/auspex
|
||||||
|
sudo nano /etc/auspex/auspex.env
|
||||||
|
```
|
||||||
|
|
||||||
| Переменная | Описание | Значение по умолчанию |
|
### Полный список параметров
|
||||||
|------------|----------|----------------------|
|
|
||||||
| `AUSPEX_TELEGRAM_BOT_TOKEN` | Токен Telegram бота | `YOUR_BOT_TOKEN` |
|
|
||||||
| `AUSPEX_TELEGRAM_CHAT_ID` | Chat ID для алертов | `YOUR_CHAT_ID` |
|
|
||||||
| `AUSPEX_PTAF_BASE_DIR` | Базовая директория PTAF | `/home/install/ptaf` |
|
|
||||||
| `AUSPEX_ANGIE_CONF_DIR` | Директория конфигов Angie | `/etc/angie/http.d` |
|
|
||||||
| `AUSPEX_SSL_DIR` | Директория SSL сертификатов | `/etc/ssl` |
|
|
||||||
| `AUSPEX_NGINX_CONFIG_GLOB` | Glob-путь к nginx конфигам | `/home/install/conf/ptaf-nginx/*/*/*/*.conf` |
|
|
||||||
| `AUSPEX_STATE_FILE_PATH` | Файл состояния port checker | `/tmp/port_checker_state.json` |
|
|
||||||
| `AUSPEX_CHECK_TIMEOUT_SEC` | Таймаут проверки порта (сек) | `10` |
|
|
||||||
| `AUSPEX_MAX_RETRIES` | Количество повторов | `3` |
|
|
||||||
| `AUSPEX_RETRY_DELAY_SEC` | Задержка между повторами (сек) | `2` |
|
|
||||||
| `AUSPEX_CERT_CRITICAL_DAYS` | Порог критического алерта (дни) | `3` |
|
|
||||||
| `AUSPEX_CERT_WARNING_DAYS` | Порог предупреждения (дни) | `15` |
|
|
||||||
| `AUSPEX_CERT_INFO_DAYS` | Порог информирования (дни) | `30` |
|
|
||||||
| `cfgDBUser` | БД юзер | `user` |
|
|
||||||
| `cfgDBPassword` | БД пароль | `qJBrR` |
|
|
||||||
| `cfgDBName` | Название БД | `waf_info` |
|
|
||||||
| `cfgDBPort` | Порт БД | `5432` |
|
|
||||||
| `cfgPrimaryDBHost` | Основная БД | `10.100.10.8` |
|
|
||||||
| `cfgSecondaryDBHost` | Резервная БД | `10.100.13.5` |
|
|
||||||
| `SERVICES_TO_CHECK ` | Службы для проверки | `ansible,docker` |
|
|
||||||
| `EMAIL_SMTP_HOST` | Адрес почтового сервера | `smtp.example.com` |
|
|
||||||
| `EMAIL_SMTP_PORT` | Порт почтового сервера | `587` |
|
|
||||||
| `EMAIL_SMTP_USER` | Юзер для отправки | `auspex@example.com` |
|
|
||||||
| `EMAIL_SMTP_PASSWORD` | Пароль | `secret` |
|
|
||||||
| `EMAIL_FROM` | Юзер для отправки | `auspex@example.com` |
|
|
||||||
| `EMAIL_TO` | Получатели | `admin1@example.com, admin2@example.com` |
|
|
||||||
|
|
||||||
## Зависимости
|
#### Telegram
|
||||||
|
|
||||||
- Go 1.22+
|
| Переменная | Описание | По умолчанию |
|
||||||
- github.com/charmbracelet/bubbletea (TUI фреймворк для `-ss`)
|
|------------|----------|--------------|
|
||||||
- github.com/charmbracelet/bubbles (компоненты TUI)
|
| `TELEGRAM_BOT_TOKEN` | Токен бота | — |
|
||||||
- github.com/charmbracelet/lipgloss (стилизация TUI)
|
| `TELEGRAM_CHAT_ID` | ID чата для алертов | — |
|
||||||
- github.com/lib/pq (запросы в БД)
|
| `TELEGRAM_HTTP_PROXY` | HTTP прокси: `http://user:pass@host:port` | — |
|
||||||
|
| `TELEGRAM_SOCKS5_PROXY` | SOCKS5 прокси: `host:port` | — |
|
||||||
|
| `TELEGRAM_SOCKS5_USER` | Логин SOCKS5 прокси | — |
|
||||||
|
| `TELEGRAM_SOCKS5_PASSWORD` | Пароль SOCKS5 прокси (спецсимволы безопасны) | — |
|
||||||
|
|
||||||
## Требования на хосте
|
Порядок попыток при отправке: **HTTP прокси → SOCKS5 → прямое соединение**. Если один вариант недоступен — автоматически используется следующий.
|
||||||
|
|
||||||
- `ss` или `netstat` — для просмотра портов
|
#### Email / SMTP
|
||||||
- `docker` — для проверки запущенных контейнеров (флаг `-m`)
|
|
||||||
- `ps` — для деталей процессов (флаг `-ss`)
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `EMAIL_SMTP_HOST` | Адрес SMTP сервера | — |
|
||||||
|
| `EMAIL_SMTP_PORT` | Порт SMTP (STARTTLS) | `587` |
|
||||||
|
| `EMAIL_SMTP_USER` | Логин SMTP | — |
|
||||||
|
| `EMAIL_SMTP_PASSWORD` | Пароль SMTP | — |
|
||||||
|
| `EMAIL_FROM` | Адрес отправителя | — |
|
||||||
|
| `EMAIL_TO` | Адреса получателей (через запятую) | — |
|
||||||
|
|
||||||
|
Поддерживается AUTH LOGIN (Exchange/корпоративные серверы). Если `EMAIL_SMTP_HOST` не задан — отправка молча пропускается.
|
||||||
|
|
||||||
|
#### Mattermost
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `MATTERMOST_URL` | URL сервера: `https://mattermost.example.com` | — |
|
||||||
|
| `MATTERMOST_BOT_TOKEN` | Токен бота | — |
|
||||||
|
| `MATTERMOST_CHANNEL_ID` | ID канала для отправки | — |
|
||||||
|
|
||||||
|
Используется Bot API (`POST /api/v4/posts`). HTML-теги из Telegram автоматически конвертируются в Markdown.
|
||||||
|
|
||||||
|
#### PostgreSQL
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `DB_USER` | Пользователь БД | — |
|
||||||
|
| `DB_PASSWORD` | Пароль БД | — |
|
||||||
|
| `DB_NAME` | Название БД | `waf_info` |
|
||||||
|
| `DB_PORT` | Порт БД | `5432` |
|
||||||
|
| `PRIMARY_DB_HOST` | Основной хост БД | `10.100.10.8` |
|
||||||
|
| `SECONDARY_DB_HOST` | Резервный хост БД | `10.100.13.5` |
|
||||||
|
|
||||||
|
#### Пути
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `PTAF_BASE_DIR` | Базовая директория PTAF | `/home/install/ptaf` |
|
||||||
|
| `ANGIE_CONF_DIR` | Директория конфигов Angie | `/etc/angie/http.d` |
|
||||||
|
| `SSL_DIR` | Директория SSL сертификатов | `/etc/ssl` |
|
||||||
|
| `NGINX_CONFIG_GLOB` | Glob-путь к nginx конфигам | `/home/install/conf/ptaf-nginx/*/*/*/*.conf` |
|
||||||
|
| `LOG_DIR` | Директория access логов | `/var/log/ptaf_nginx` |
|
||||||
|
| `STATE_FILE_PATH` | State-файл portcheck | `/tmp/port_checker_state.json` |
|
||||||
|
| `SERVICE_STATE_FILE_PATH` | State-файл servicecheck | `/tmp/auspex_service_state.json` |
|
||||||
|
| `DOCKER_STATE_FILE_PATH` | State-файл dockercheck | `/tmp/auspex_docker_state.json` |
|
||||||
|
|
||||||
|
#### Пороги сертификатов
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `CERT_CRITICAL_DAYS` | Критический алерт (дней до истечения) | `3` |
|
||||||
|
| `CERT_WARNING_DAYS` | Предупреждение | `15` |
|
||||||
|
| `CERT_INFO_DAYS` | Информирование | `30` |
|
||||||
|
|
||||||
|
#### Проверка портов
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `CHECK_TIMEOUT_SEC` | Таймаут TCP-соединения (сек) | `10` |
|
||||||
|
| `MAX_RETRIES` | Количество повторов | `3` |
|
||||||
|
| `RETRY_DELAY_SEC` | Задержка между повторами (сек) | `2` |
|
||||||
|
| `MAX_WORKERS` | Горутин для параллельной обработки | `10` |
|
||||||
|
|
||||||
|
#### Проверка логов
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `LOG_STALE_MINUTES` | Порог устаревшего лога (мин) | `61` |
|
||||||
|
|
||||||
|
#### Проверка служб
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `SERVICES_TO_CHECK` | Службы для проверки (через запятую) | — |
|
||||||
|
|
||||||
|
Пример: `SERVICES_TO_CHECK=angie,docker,postgresql`
|
||||||
|
|
||||||
|
### Пример auspex.env
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Telegram
|
||||||
|
TELEGRAM_BOT_TOKEN=8411463479:AAF0zFi7iXTEC51sBG0Ckc8_S7JD-DuVcoo
|
||||||
|
TELEGRAM_CHAT_ID=-1001234567890
|
||||||
|
# HTTP прокси (опционально)
|
||||||
|
TELEGRAM_HTTP_PROXY=http://10.100.12.4:8888
|
||||||
|
# SOCKS5 прокси (опционально, fallback после HTTP)
|
||||||
|
TELEGRAM_SOCKS5_PROXY=212.87.220.230:1080
|
||||||
|
TELEGRAM_SOCKS5_USER=proxyuser
|
||||||
|
TELEGRAM_SOCKS5_PASSWORD=ProxyPass!$
|
||||||
|
|
||||||
|
# Email
|
||||||
|
EMAIL_SMTP_HOST=mail.example.com
|
||||||
|
EMAIL_SMTP_PORT=587
|
||||||
|
EMAIL_SMTP_USER=auspex@example.com
|
||||||
|
EMAIL_SMTP_PASSWORD=secret
|
||||||
|
EMAIL_FROM=auspex@example.com
|
||||||
|
EMAIL_TO=admin@example.com,devops@example.com
|
||||||
|
|
||||||
|
# Mattermost
|
||||||
|
MATTERMOST_URL=https://mattermost.example.com
|
||||||
|
MATTERMOST_BOT_TOKEN=831yapr3xxxxxxxxxxx
|
||||||
|
MATTERMOST_CHANNEL_ID=oun39xxxxxxxxxxxx
|
||||||
|
|
||||||
|
# База данных
|
||||||
|
DB_USER=waf_user
|
||||||
|
DB_PASSWORD=secret
|
||||||
|
DB_NAME=waf_info
|
||||||
|
PRIMARY_DB_HOST=10.100.10.8
|
||||||
|
SECONDARY_DB_HOST=10.100.13.5
|
||||||
|
|
||||||
|
# Службы для проверки
|
||||||
|
SERVICES_TO_CHECK=angie,docker
|
||||||
|
|
||||||
|
# Пороги сертификатов
|
||||||
|
CERT_CRITICAL_DAYS=3
|
||||||
|
CERT_WARNING_DAYS=15
|
||||||
|
CERT_INFO_DAYS=30
|
||||||
|
```
|
||||||
|
|
||||||
|
## Доставка алертов
|
||||||
|
|
||||||
|
Все модули с алертами отправляют уведомления во все настроенные каналы независимо друг от друга:
|
||||||
|
|
||||||
|
| Канал | Условие отправки |
|
||||||
|
|-------|-----------------|
|
||||||
|
| Telegram | `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID` заданы |
|
||||||
|
| Email | `EMAIL_SMTP_HOST`, `EMAIL_FROM`, `EMAIL_TO` заданы |
|
||||||
|
| Mattermost | `MATTERMOST_URL`, `MATTERMOST_BOT_TOKEN`, `MATTERMOST_CHANNEL_ID` заданы |
|
||||||
|
|
||||||
|
Если канал не настроен — он молча пропускается, программа не падает.
|
||||||
|
|
||||||
|
## State-файлы
|
||||||
|
|
||||||
|
Модули `-p`, `-sv`, `-d` сохраняют состояние между запусками и отправляют алерты **только при изменении** статуса. Это позволяет безопасно запускать их по cron без спама.
|
||||||
|
|
||||||
|
| Модуль | State-файл |
|
||||||
|
|--------|-----------|
|
||||||
|
| `-p` portcheck | `/tmp/port_checker_state.json` |
|
||||||
|
| `-sv` servicecheck | `/tmp/auspex_service_state.json` |
|
||||||
|
| `-d` dockercheck | `/tmp/auspex_docker_state.json` |
|
||||||
|
|
||||||
|
При первом запуске состояние сохраняется, алерты не отправляются.
|
||||||
|
|
||||||
|
## Пример cron
|
||||||
|
|
||||||
|
```cron
|
||||||
|
# Проверка сертификатов — раз в сутки
|
||||||
|
0 9 * * * root /usr/local/bin/auspex -c >> /var/log/auspex/certcheck.log 2>&1
|
||||||
|
|
||||||
|
# Проверка портов — каждые 5 минут
|
||||||
|
*/5 * * * * root /usr/local/bin/auspex -p >> /var/log/auspex/portcheck.log 2>&1
|
||||||
|
|
||||||
|
# Проверка логов — каждый час
|
||||||
|
0 * * * * root /usr/local/bin/auspex -l >> /var/log/auspex/logcheck.log 2>&1
|
||||||
|
|
||||||
|
# Проверка служб — каждые 2 минуты
|
||||||
|
*/2 * * * * root /usr/local/bin/auspex -sv >> /var/log/auspex/servicecheck.log 2>&1
|
||||||
|
|
||||||
|
# Проверка контейнеров — каждые 2 минуты
|
||||||
|
*/2 * * * * root /usr/local/bin/auspex -d >> /var/log/auspex/dockercheck.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Подробнее
|
||||||
|
|
||||||
|
См. [ARCHITECTURE.md](ARCHITECTURE.md).
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue