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