api_sync/README.md

8.9 KiB
Executable file
Raw Permalink Blame History

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!)

Сборка

Установка зависимостей

go get github.com/joho/godotenv
go get github.com/lib/pq
go get golang.org/x/net

Компиляция

# Собрать бинарник
go build -o API_sync

# Или с оптимизацией размера
go build -ldflags="-s -w" -o API_sync

Конфигурация

Шаг 1: Создать файл конфигурации

cp API_sync.env.example API_sync.env
nano API_sync.env

Шаг 2: Заполнить переменные

# 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: Защитить файл конфигурации

chmod 600 API_sync.env

Использование

Запуск вручную

# Основной запуск
./API_sync

# Проверка дублирующихся доменов/алиасов + ошибок API
./API_sync --cd

Запуск через cron

# /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

База данных

Необходимые таблицы

-- Таблица с информацией из 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 автоматически настраивается при первом запуске. Если ошибка повторяется:

cd /home/install/waf_whitelist
git config user.email "API_sync@example.com"
git config user.name "API Sync Bot"

Медленная работа

Увеличьте MAX_CONCURRENT_WORKERS в конфигурации:

MAX_CONCURRENT_WORKERS=10

Telegram не доступен напрямую

Заполните переменные прокси в конфигурации. Утилита автоматически попробует HTTP-прокси, затем SOCKS5, и только если оба недоступны — прямое подключение.

Ошибка TLS при отправке email

Если сертификат SMTP-сервера просрочен или невалиден:

EMAIL_SKIP_TLS_VERIFY=true