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

Флоу прогона

Новый VPN сервер (полный цикл)

1. Купить VPS → получить IP + root password
2. Добавить в inventory/servers.ini → группа [vpn]
3. Bootstrap SSH ключи (если только пароль):
   ansible-playbook playbooks/bootstrap-ssh.yml --limit <host> --ask-pass --vault-password-file .vault_pass
4. Полный деплой:
   ansible-playbook playbooks/vpn.yml --limit <host> --vault-password-file .vault_pass
5. Сменить пароль admin в 3x-ui: https://<IP>:1443
6. Создать inbounds (через commission_servers.py или вручную)
7. Добавить в MySQL (INSERT INTO server ...)
8. Добавить в Prometheus (roles/grafana/templates/prometheus.yml.j2)
9. Активировать: UPDATE server SET is_active = 1

Что делает vpn.yml

pre_tasks:
  ├── apt cache update
  ├── Docker install
  └── SSL cert generation (CA-signed)
roles (в порядке выполнения):
  ├── ssh        → SSH keys, hardening, MaxStartups/MaxSessions
  ├── ufw        → Firewall (22, 80, 443, 1443, xray_port, 9100)
  ├── sysctl     → 37 kernel params + BBR + ulimits 65535
  ├── nginx      → Nginx + dhparam + certbot
  ├── node_exporter → Prometheus agent + htpasswd
  └── vpn        → 3x-ui container (только на новых серверах!)
post_tasks:
  ├── swapfile
  ├── base packages + fail2ban
  ├── optimization (services, docker daemon, RPS, journald)
  └── apt cleanup

Обновление 3x-ui на существующих серверах

ansible-playbook playbooks/update_3xui_xray.yml --limit <host> --vault-password-file .vault_pass

Безопасно: бэкап DB → stop → rm → start новой версии → integrity check.

Применить kernel tuning (без перезагрузки)

ansible-playbook playbooks/sysctl.yml --limit <host>

Можно на все серверы: --limit vpn

Добавить/удалить SSH ключ

  1. Редактировать inventory/group_vars/all.yml:
  2. Добавить ключ → root_public_keys
  3. Уволить → переместить в revoked_public_keys
  4. Прогнать:
    ansible-playbook playbooks/ssh.yml --limit vpn --vault-password-file .vault_pass
    

Новый Telegram proxy

1. Bootstrap SSH:
   ansible-playbook playbooks/bootstrap-ssh.yml --limit <host> --ask-pass --vault-password-file .vault_pass
2. Деплой:
   ansible-playbook playbooks/setup-proxy-tg.yml --limit <host> --vault-password-file .vault_pass

Новый Whitelist (WL) proxy сервер

WL proxy — сервер в VK Cloud с российским IP. Принимает подключения клиентов и через nftables DNAT форвардит трафик на upstream VPN за рубежом.

1. Добавить хост в [vpn_wl_proxy] в inventory/servers.ini:
   whitelist-vk-11 ansible_host=<IP>

2. Создать inventory/host_vars/whitelist-vk-11.yml:
   # whitelist-vk-11 - VK Cloud WL proxy (<страны>)
   proxy_roles:
   - stream_proxy
   ips:
     primary: <WL_proxy_IP>
     stream: <WL_proxy_IP>
   stream_proxy:
     forwarding: nftables+flowtable
     interface: ens3
     internal_ip: <internal_10.x.x.x>
     primary_upstream: <upstream_vpn_ip> (<страна>#N)
     rules_count: <N>
     rules:
     - listen: 443
       target: <upstream_vpn_ip>:8443
     - listen: 2096
       target: <upstream_vpn_ip>:853
     # ... добавить правило на каждый порт

3. Прогнать плейбук:
   ansible-playbook playbooks/proxy.yml \
     --limit whitelist-vk-11 --vault-password-file .vault_pass

4. Добавить записи в MySQL (по одной на каждый порт):
   INSERT INTO server (id, name, ip, port, city_id, is_active, change_ip,
                       change_ip_enabled, panel_type, health_status, latitude, longitude)
   VALUES (
     UUID(),
     'vk-11-w<КОД>-<порт>',         -- уникальное имя: <proxy>-<код страны>-<port>
     '<upstream_vpn_ip>',            -- upstream VPN IP (НЕ proxy!)
     <порт>,                         -- порт на proxy (из правил nftables)
     (SELECT id FROM city WHERE name_key='moscow_wl<код>'),
     0,                              -- активировать после проверки
     '<WL_proxy_IP>',                -- IP proxy (куда подключается клиент)
     1,
     'WHITELIST',                    -- обязательно! дефолт XUI сломает логику
     'HEALTHY',
     0.0, 0.0
   );

5. Добавить в Prometheus мониторинг:
   ansible-playbook playbooks/setup_node_exporter_whitelist.yml \
     --vault-password-file .vault_pass
   # или вручную добавить target в roles/grafana/templates/prometheus.yml.j2

6. Проверить:
   ssh root@<WL_proxy_IP>
   nft list ruleset              # DNAT правила должны быть видны
   ss -tlnp | grep -E '443|2096' # порты слушаются
   ping <upstream_vpn_ip>        # связь с VPN сервером

7. Активировать после того как transport_params заполнен VCS (~30 мин):
   UPDATE server SET is_active=1 WHERE change_ip='<WL_proxy_IP>';

Важно: - ip в MySQL = upstream VPN. change_ip = российский proxy IP. Не путать. - (change_ip, port) — уникальная комбинация. Проверить: SELECT port FROM server WHERE change_ip='<IP>' ORDER BY port; - panel_type='WHITELIST' обязателен на всех записях. - Подробнее: docs/guides/WL-CREATE-NEW-ENTRIES-GUIDE.md в основном репо.

Обновить Prometheus мониторинг

  1. Редактировать roles/grafana/templates/prometheus.yml.j2 — добавить target
  2. Прогнать:
    ansible-playbook playbooks/update-prometheus.yml --vault-password-file .vault_pass
    

Правила безопасности

Команда Что делает Безопасно на production?
vpn.yml Полный деплой Да (x-ui.db не трогает, если уже есть)
update_3xui_xray.yml Обновление 3x-ui Да (бэкап + проверка)
ssh.yml SSH ключи + hardening Да (idempotent)
sysctl.yml Kernel tuning Да (мгновенно, без restart)
ufw.yml Firewall rules Да (additive, не сбрасывает)
setup-proxy-tg.yml TG proxy Да
rollback_3xui_xray.yml Откат Да (stop → restore DB → start)

Никогда не делать

  • --limit без значения (затронет ВСЕ серверы)
  • fresh_configure=true на production (сбросит UFW + перезапишет DB)
  • vpn.yml без --vault-password-file (упадёт на секретах)