Перейти к содержанию

Инвентаризация серверов

Источник истины: ansible/shiva-ansible/inventory/servers.ini (Ansible inventory)


Состав

Тип Кол-во Описание
VPN серверы (XUI/XRAY) 55 Группа [vpn] в Ansible
WL proxy 14 Группа [vpn_wl_proxy], VK Cloud nftables DNAT
API proxy 6 Группа [proxy]
Внутренняя инфра ~69 Группа [internal_servers] (через jump host)

Multi-inbound

Один физический сервер может иметь несколько записей в MySQL (одинаковый IP, разные inbound_id). В Ansible inventory — одна строка на физический хост.


Формат записи (servers.ini)

vpn-monovm-austria-01  ansible_host=130.195.222.139  ansible_port=22  ansible_user=root  external_ip_list=[130.195.222.139,130.195.222.142]

Конвенция имён: vpn-<провайдер>-<страна>-<номер>


Группы Ansible

Группа Описание
[vpn] VPN серверы с 3x-ui/XUI
[vpn_remnawave] Remnawave-ноды (VLESS+TCP+Reality, mTLS)
[vpn_wl_proxy] Whitelist прокси (nftables DNAT через RU IP)
[proxy] API и subscription proxy
[internal_servers] Внутренняя инфра Karmann (10.99.87.x, через ProxyJump)
[api-vpn] Backend серверы
[api-db] MySQL серверы
[grafana] Мониторинг (Grafana + Prometheus)
[telegram-proxies] MTProto Telegram proxy
[vpn_inactive] Выведенные из эксплуатации серверы

Полный список групп и переменных: Ansible.


Провайдеры

Провайдер Локации Назначение
MonoVM NL, AT, SE, GB, JP, и др. Основной пул VPN-серверов (~60% парка)
TheHosting NL, PL, DE, GB, AT VPN серверы + API proxy
DataPacket US, UK, DE, CA, PL, FR, BR, JP Выделенные серверы
VDSina RU, NL WL proxy, VPN
VK Cloud RU WL nftables proxy + инфра серверы
Yandex Cloud RU API proxy (резерв) + инфра

Учётные данные провайдеров: Vaultwarden → VPN Providers.


Аудит инвентаря

Сверка Ansible ↔ MySQL ↔ VPN Config Service:

python3 scripts/inventory_reconcile.py          # аудит + рекомендации
python3 scripts/inventory_reconcile.py --stats  # статистика

Подробнее: DevOps скрипты.


Добавление нового сервера

  1. Добавить хост в servers.ini → группа [vpn]
  2. Запустить Ansible деплой
  3. Зарегистрировать в MySQL (2 записи: inbound 1 + inbound 2)
  4. Проверить через скрипт: python3 scripts/check_vpn_server.py <IP>

Полная процедура: Деплой VPN-сервера.


Вывод сервера из эксплуатации

Удалять из inventory, НЕ перемещать в inactive

Группа [vpn_inactive] — антипаттерн. Terminated серверы удаляются из servers.ini. Git history = достаточный аудит: git log -S "88.218.1.49" найдёт за секунду.

Процедура

1. MySQL: is_active = 0
   UPDATE server SET is_active = 0 WHERE ip = 'X.X.X.X';

2. Удалить строку из servers.ini
   НЕ комментировать, НЕ перемещать — удалить.

3. Проверить ссылки (grep по IP):
   grep -r "X.X.X.X" ansible/ docs/ scripts/
   ├── proxy nginx конфиги → убрать upstream
   ├── nftables rules на WL серверах → убрать DNAT
   ├── DNS записи → удалить
   └── Hardcoded IP в скриптах → убрать

4. Обновить мониторинг:
   ansible-playbook playbooks/update-prometheus.yml  # file_sd обновится
   python3 scripts/kuma-sync.py sync --remove         # Uptime Kuma

5. Коммит:
   git commit -m "remove vpn-hostname (X.X.X.X) — terminated, причина"

6. Git push

Чеклист очистки

  • MySQL: is_active = 0
  • servers.ini: строка удалена
  • Prometheus targets: обновлены (ansible playbook)
  • Uptime Kuma: монитор удалён
  • Proxy nginx: upstream убран (если был)
  • Grafana: dashboard «Traffic per Server» удалится автоматически (grafana_sync worker)
  • DNS: A-записи удалены (если были)
  • Коммит с причиной

См. также: Ansible · Деплой VPN-сервера · DevOps скрипты → inventory_reconcile · Репозитории