Флоу прогона¶
Новый 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 на существующих серверах¶
Безопасно: бэкап DB → stop → rm → start новой версии → integrity check.
Применить kernel tuning (без перезагрузки)¶
Можно на все серверы: --limit vpn
Добавить/удалить SSH ключ¶
- Редактировать
inventory/group_vars/all.yml: - Добавить ключ →
root_public_keys - Уволить → переместить в
revoked_public_keys - Прогнать:
Новый 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 мониторинг¶
- Редактировать
roles/grafana/templates/prometheus.yml.j2— добавить target - Прогнать:
Правила безопасности¶
| Команда | Что делает | Безопасно на 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(упадёт на секретах)