Renew docs

This commit is contained in:
Magnus Root 2026-04-16 15:21:23 +03:00
parent 454aed05fa
commit 2611b099ce
2 changed files with 595 additions and 65 deletions

395
ARCHITECTURE.md Normal file
View 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>` | ` ```текст``` ` |
| `━━━━━` | `---` |
| `&lt;` `&gt;` `&amp;` | `<` `>` `&` |
| Прочие теги | удаляются |
---
### `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 |
|---|---|
| 61120 | ⚠️ |
| 121240 | 🔥 |
| > 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
View file

@ -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).