| .gitignore | ||
| api.go | ||
| ARCHITECTURE.md | ||
| compare.go | ||
| config.go | ||
| database.go | ||
| DATABASE_SCHEMA.md | ||
| dns.go | ||
| git.go | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| notify.go | ||
| README.md | ||
| whitelist.go | ||
API Sync - API to PostgreSQL Synchronization Tool
Утилита для автоматической синхронизации данных WAF из API в PostgreSQL с управлением whitelist для PT AF AntiDDOS.
Структура проекта
├── main.go # Точка входа, worker pool
├── 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
Go автоматически найдёт все .go файлы в директории и скомпилирует их в один бинарник.
Конфигурация
Шаг 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
# Git репозиторий whitelist
GIT_REPO_URL=https://token@svc-git.test.ru/wmx/waf_whitelist.git
GIT_REPO_PATH=/home/install/waf_whitelist
WHITELIST_FILE=whitelist_ptaf.txt
# Параллельность
MAX_CONCURRENT_WORKERS=5
Шаг 3: Защитить файл конфигурации
chmod 600 API_sync.env
Использование
Запуск вручную
./API_sync
Запуск через cron
# /etc/cron.d/API_sync
*/15 * * * * install cd /home/install && /home/install/API_sync >> /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
✅ Режим 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
);
-- Добавить столбец mode в apps_settings (если ещё не добавлен)
ALTER TABLE apps_settings ADD COLUMN mode VARCHAR(10) DEFAULT 'auto';
-- Добавить столбец waf_vendor в apps_settings (если ещё не добавлен)
ALTER TABLE apps_settings ADD COLUMN waf_vendor VARCHAR(50);
Логи
Программа выводит детальные логи:
2025/12/26 10:00:00 Start sync API_info
2025/12/26 10:00:00 Total SIDs to process: 25
2025/12/26 10:00:00 Using 5 concurrent workers
2025/12/26 10:00:01 [Worker 0] Processing SID 10307
2025/12/26 10:00:01 [WAF Info] SID: 10307, WAF Enabled: 1, Vendor: ptaf, Instance: PTAFd_02_03
2025/12/26 10:00:01 [AntiDDOS Check] ✅ AntiDDOS is ENABLED for nationallottery.ru
2025/12/26 10:00:01 [Telegram] Using SOCKS5 proxy: proxy.example.com:1080
2025/12/26 10:00:15 Finish sync API_info
2025/12/26 10:00:15 Start cleanup of removed SIDs
2025/12/26 10:00:15 [Cleanup] No stale SIDs found in API_info
2025/12/26 10:00:15 Finish cleanup of removed SIDs
2025/12/26 10:00:15 Start WAF whitelist update
2025/12/26 10:00:16 [WAF Whitelist] No changes needed
2025/12/26 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, и только если оба недоступны — прямое подключение.