253 lines
No EOL
8.9 KiB
Markdown
Executable file
253 lines
No EOL
8.9 KiB
Markdown
Executable file
# API Sync - API to PostgreSQL Synchronization Tool
|
||
|
||
Утилита для автоматической синхронизации данных WAF из API в PostgreSQL с управлением whitelist для PT AF AntiDDOS.
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
├── main.go # Точка входа, worker pool, режим --cd
|
||
├── config.go # Конфигурация и переменные окружения
|
||
├── api.go # HTTP клиент и API структуры
|
||
├── database.go # Работа с PostgreSQL
|
||
├── dns.go # DNS резолв для AntiDDOS проверки
|
||
├── notify.go # Уведомления (Telegram, Mattermost, Email)
|
||
├── git.go # Git операции (clone, commit, push)
|
||
├── whitelist.go # Управление WAF whitelist
|
||
├── compare.go # Функции сравнения (origins, aliases)
|
||
└── API_sync.env # Файл конфигурации (не в Git!)
|
||
```
|
||
|
||
## Сборка
|
||
|
||
### Установка зависимостей
|
||
|
||
```bash
|
||
go get github.com/joho/godotenv
|
||
go get github.com/lib/pq
|
||
go get golang.org/x/net
|
||
```
|
||
|
||
### Компиляция
|
||
|
||
```bash
|
||
# Собрать бинарник
|
||
go build -o API_sync
|
||
|
||
# Или с оптимизацией размера
|
||
go build -ldflags="-s -w" -o API_sync
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### Шаг 1: Создать файл конфигурации
|
||
|
||
```bash
|
||
cp API_sync.env.example API_sync.env
|
||
nano API_sync.env
|
||
```
|
||
|
||
### Шаг 2: Заполнить переменные
|
||
|
||
```env
|
||
# API API
|
||
BEARER_TOKEN=your_api_token
|
||
|
||
# PostgreSQL
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_USER=install
|
||
DB_PASSWORD=your_password
|
||
DB_NAME=waf_info
|
||
|
||
# Telegram (обязательно)
|
||
TELEGRAM_BOT_TOKEN=123456789:ABC...
|
||
TELEGRAM_CHAT_ID=-1001234567890
|
||
|
||
# Telegram прокси (опционально, пробуются в порядке: HTTP → SOCKS5 → прямое подключение)
|
||
TELEGRAM_HTTP_PROXY=http://user:pass@proxy.example.com:3128
|
||
TELEGRAM_SOCKS5_PROXY=proxy.example.com:1080
|
||
TELEGRAM_SOCKS5_USER=user
|
||
TELEGRAM_SOCKS5_PASSWORD=password
|
||
|
||
# Mattermost (опционально)
|
||
MATTERMOST_URL=https://mattermost.example.com
|
||
MATTERMOST_BOT_TOKEN=your_bot_token
|
||
MATTERMOST_CHANNEL_ID=channel_id
|
||
|
||
# Email (опционально)
|
||
EMAIL_SMTP_HOST=smtp.example.com
|
||
EMAIL_SMTP_PORT=587
|
||
EMAIL_SMTP_USER=user@example.com
|
||
EMAIL_SMTP_PASSWORD=your_password
|
||
EMAIL_FROM=API_sync@example.com
|
||
EMAIL_TO=admin@example.com,team@example.com
|
||
EMAIL_SKIP_TLS_VERIFY=false
|
||
|
||
# Git репозиторий whitelist
|
||
GIT_REPO_URL=https://token@svc-git.cirex.ru/wmx/waf_whitelist.git
|
||
GIT_REPO_PATH=/home/install/waf_whitelist
|
||
WHITELIST_FILE=whitelist_ptaf.txt
|
||
|
||
# Параллельность и функции
|
||
MAX_CONCURRENT_WORKERS=5
|
||
CHECK_DUPLICATES=true
|
||
```
|
||
|
||
### Шаг 3: Защитить файл конфигурации
|
||
|
||
```bash
|
||
chmod 600 API_sync.env
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Запуск вручную
|
||
|
||
```bash
|
||
# Основной запуск
|
||
./API_sync
|
||
|
||
# Проверка дублирующихся доменов/алиасов + ошибок API
|
||
./API_sync --cd
|
||
```
|
||
|
||
### Запуск через cron
|
||
|
||
```bash
|
||
# /etc/cron.d/API_sync
|
||
|
||
# Основной запуск каждые 15 минут
|
||
*/15 * * * * install cd /home/install && /home/install/API_sync >> /var/log/API_sync.log 2>&1
|
||
|
||
# Проверка дублей и ошибок API каждый час
|
||
0 * * * * install cd /home/install && /home/install/API_sync --cd >> /var/log/API_sync.log 2>&1
|
||
```
|
||
|
||
## Возможности
|
||
|
||
✅ **Параллельная обработка** — настраиваемый worker pool для запросов к API
|
||
|
||
✅ **Синхронизация данных WAF** из API API в PostgreSQL
|
||
|
||
✅ **Smart Diff** — детальное сравнение origins и aliases с уведомлением об изменениях
|
||
|
||
✅ **AntiDDOS проверка** — DNS-резолв домена и сравнение с protected_ip из API
|
||
|
||
✅ **WAF настройки** — отслеживание изменений waf_enabled, waf_vendor, waf_instance
|
||
|
||
✅ **Мультиканальные уведомления** — Telegram (с поддержкой HTTP/SOCKS5 прокси), Mattermost, Email
|
||
|
||
✅ **Автоматический whitelist** — объединение IP из API_info и manual_info, фильтрация WAF-сетей, Git push
|
||
|
||
✅ **Очистка устаревших данных** — автоматическое удаление из API_info ресурсов, пропавших из apps_settings
|
||
|
||
✅ **Сводный алерт ошибок API** — все недоступные SID собираются в одно сообщение (управляется `CHECK_DUPLICATES`)
|
||
|
||
✅ **Проверка дублей** — поиск совпадающих доменов/алиасов между разными SID, запускается в основном режиме (управляется `CHECK_DUPLICATES`) или отдельно через `--cd`
|
||
|
||
✅ **Режим auto/manual** — только ресурсы с `mode = 'auto'` синхронизируются через API; ресурсы из manual_info используются как дополнительный источник IP для whitelist
|
||
|
||
## База данных
|
||
|
||
### Необходимые таблицы
|
||
|
||
```sql
|
||
-- Таблица с информацией из API (заполняется автоматически)
|
||
CREATE TABLE API_info (
|
||
sid BIGINT PRIMARY KEY,
|
||
domain_name VARCHAR(255),
|
||
origins JSONB,
|
||
aliases JSONB,
|
||
aliaces_in_API_modified TIMESTAMP WITHOUT TIME ZONE,
|
||
protected_ip VARCHAR(45),
|
||
resolved_ip VARCHAR(45),
|
||
antiddos_enable BOOLEAN,
|
||
waf_enabled_API INTEGER,
|
||
waf_vendor VARCHAR(255),
|
||
instance_API VARCHAR(255),
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- Таблица с WAF-сетями для фильтрации whitelist
|
||
CREATE TABLE ips (
|
||
id SERIAL PRIMARY KEY,
|
||
waf_networks TEXT[]
|
||
);
|
||
|
||
-- Пример заполнения WAF-сетей
|
||
INSERT INTO ips (waf_networks) VALUES
|
||
('{109.238.89.0/24,89.20.63.0/24}');
|
||
|
||
-- Таблица ручных ресурсов (заполняется администратором вручную)
|
||
CREATE TABLE manual_info (
|
||
sid BIGINT PRIMARY KEY,
|
||
domain_name VARCHAR(255),
|
||
origins JSONB
|
||
);
|
||
|
||
-- Добавить столбцы в apps_settings (если ещё не добавлены)
|
||
ALTER TABLE apps_settings ADD COLUMN mode VARCHAR(10) DEFAULT 'auto';
|
||
ALTER TABLE apps_settings ADD COLUMN waf_vendor VARCHAR(50);
|
||
|
||
-- Добавить столбец в client_info (если ещё не добавлен)
|
||
ALTER TABLE client_info ADD COLUMN waf_provider VARCHAR(50);
|
||
```
|
||
|
||
## Логи
|
||
|
||
```
|
||
2026/06/10 10:00:00 Start sync API_info
|
||
2026/06/10 10:00:00 Total SIDs to process: 25
|
||
2026/06/10 10:00:00 Using 5 concurrent workers
|
||
2026/06/10 10:00:01 [Worker 0] Processing SID 10307
|
||
2026/06/10 10:00:01 [WAF Info] SID: 10307, WAF Enabled: 1, Vendor: ptaf, Instance: PTAFd_02_03
|
||
2026/06/10 10:00:01 [AntiDDOS Check] ✅ AntiDDOS is ENABLED for nationallottery.ru
|
||
2026/06/10 10:00:01 [Telegram] Using SOCKS5 proxy: proxy.example.com:1080
|
||
2026/06/10 10:00:15 Finish sync API_info
|
||
2026/06/10 10:00:15 Start cleanup of removed SIDs
|
||
2026/06/10 10:00:15 [Cleanup] No stale SIDs found in API_info
|
||
2026/06/10 10:00:15 Finish cleanup of removed SIDs
|
||
2026/06/10 10:00:15 Start duplicate domain/alias check
|
||
2026/06/10 10:00:15 [Duplicate Check] No duplicates found
|
||
2026/06/10 10:00:15 Finish duplicate domain/alias check
|
||
2026/06/10 10:00:15 Start WAF whitelist update
|
||
2026/06/10 10:00:16 [WAF Whitelist] No changes needed
|
||
2026/06/10 10:00:16 Finish WAF whitelist update
|
||
```
|
||
|
||
## Troubleshooting
|
||
|
||
### Ошибка: "API_sync.env file not found"
|
||
|
||
Создайте файл конфигурации по пути `/etc/API_sync/API_sync.env` или используйте системные переменные окружения.
|
||
|
||
### Ошибка: "git commit failed: Author identity unknown"
|
||
|
||
Git автоматически настраивается при первом запуске. Если ошибка повторяется:
|
||
|
||
```bash
|
||
cd /home/install/waf_whitelist
|
||
git config user.email "API_sync@example.com"
|
||
git config user.name "API Sync Bot"
|
||
```
|
||
|
||
### Медленная работа
|
||
|
||
Увеличьте `MAX_CONCURRENT_WORKERS` в конфигурации:
|
||
|
||
```env
|
||
MAX_CONCURRENT_WORKERS=10
|
||
```
|
||
|
||
### Telegram не доступен напрямую
|
||
|
||
Заполните переменные прокси в конфигурации. Утилита автоматически попробует HTTP-прокси, затем SOCKS5, и только если оба недоступны — прямое подключение.
|
||
|
||
### Ошибка TLS при отправке email
|
||
|
||
Если сертификат SMTP-сервера просрочен или невалиден:
|
||
|
||
```env
|
||
EMAIL_SKIP_TLS_VERIFY=true
|
||
``` |