AWG необязателен — уберёте из протоколов на шаге 3.
1
Заливка файлов
Залейте папку awg-panel/ в /opt/ через scp/sftp.
scp
scp -r awg-panel/ root@IP:/opt/
Результат: /opt/awg-panel/app.py, static/, data/
2
Зависимости
выполнить
cd /opt/awg-panel
python3 -m venv venv
./venv/bin/pip install gunicorn flask
опционально: вставьте выводожидание вывода
3
server.json
Данные вашего сервера. Команда генерируется автоматически.
Произвольное имя для отображения в панели. Любое.
Внешний (публичный) IP вашего VPS. Узнать: curl ifconfig.me
Домен, на который выпущен сертификат (TLS-режим) или домен маскировки (Reality-режим, например www.google.com). Клиенты будут подключаться с этим SNI.
Протоколы (Xray обязателен):
Xray
MTProto
AWG
server.json
Заполните поля
IP и домен должны быть от этого сервера. Иначе панель будет генерировать ссылки на чужой IP/SNI.
4
Пароль
Пароль для входа в панель. Хранится как SHA256 в admin.json.
admin.json
Введите пароль
Ключ должен быть password_hash, не password. Plaintext → KeyError.
5
Синхронизация AWG
AWG не выбран — пропускаем.
Панель раздаёт клиентам параметры обфускации из app.py. Серверный awg0.confобязан содержать те же Jc/Jmin/Jmax/S1/S2/H1-H4. Иначе клиенты не подключатся — handshake не пройдёт.
1. параметры панели
grep -A6 "AWG_PARAMS" /opt/awg-panel/app.py | head -7
Впишите значения в /etc/amnezia/amneziawg/awg0.conf. Не трогайте PrivateKey, Address, ListenPort, PostUp/PostDown.
2. перезапуск
awg-quick down awg0 && awg-quick up awg0
3. проверка
awg show awg0
опционально: вставьте выводожидание вывода
H1-H4 должны быть случайными большими числами. Дефолтные 1/2/3/4 = обычный WireGuard, детектится DPI.
Ответ 200 — панель работает. Откройте в браузере и залогиньтесь.
Сервер—
IP—
Домен—
Протоколы—
Панель—
Раскладка портов:
443/tcpXray VLESS+TLS
443/udpAWG (если вкл.)
8443/tcpmtg MTProto
8444nginx fallback (localhost)
5000gunicorn panel (localhost)
10085Xray stats API (localhost)
0
Подключение к серверу
Введите данные VPS. Эти значения будут подставляться во все команды дальше.
Стандартный — 22. Если хостер выдал другой (например 23422) — впишите его.
Домен для отображения сайта/панели в браузере. Должен указывать A-записью на IP сервера.
Если хотите разделить — укажите поддомен для XRay SNI, mtg и клиентских ссылок (например vpn.example.com или proxy.example.com). Тоже должен указывать A-записью на IP сервера. Если пусто — используется основной домен.
Будет захэширован SHA256 для admin.json.
По умолчанию 8443. Менять обычно не надо. Xray (443/tcp) и AWG (443/udp) не меняются — это маскировка под HTTPS и обход блокировок UDP. Менять mtg-порт имеет смысл только если 8443 заблокирован у провайдера (тогда попробуйте 2096 или 8888).
Как подключиться:
Windows — откройте PowerShell или Windows Terminal. Введите команду ниже. Пароль при запросе вставляйте: Shift+Insert (PowerShell), правая кнопка мыши (CMD), Ctrl+V (Windows Terminal). Символы при вводе пароля не отображаются — это нормально, просто нажмите Enter.
SSH подключение
ssh root@IP -p 22
macOS / Linux — откройте Terminal и введите ту же команду.
Если при первом подключении спросит Are you sure you want to continue connecting? (yes/no) — напишите yes и нажмите Enter.
Протоколы для этого сервера:
Xray
MTProto
AWG
Режим TLS для Xray:
Свой домен + TLSLet's Encrypt сертификат, fallback на nginx
RealityМаскировка под чужой сайт, сертификат не нужен
TLS — нужен домен с A-записью на IP. Лучшая обфускация (DNS, IP, серт — всё совпадает). Панель открывается через браузер.
Reality — сертификат не нужен. Xray притворяется чужим сайтом. Панель будет доступна только через VPN (или curl по IP).
1
Проверка DNS
Убеждаемся что домен (и поддомен, если указан) указывают на IP сервера. Без этого Certbot не выдаст сертификат.
основной домен
dig +short DOMAIN
опционально: вставьте выводожидание вывода
поддомен для протоколов
dig +short SUBDOMAIN
опционально: вставьте выводожидание вывода
Должен вернуть IP. Если пусто или другой IP — настройте A-запись у регистратора и подождите 5-10 минут.
Поддомен тоже должен вернуть IP. Оба домена должны указывать на один и тот же сервер.
В режиме Reality домен не нужен. Xray маскируется под чужой сайт, свой сертификат не требуется.
2
Обновление системы
Обновляем пакеты и ставим инструменты. Каждую команду выполнять отдельно, дождавшись завершения предыдущей.
0. проверка что уже установлено
for p in nginx certbot fail2ban ufw docker.io xray mtg awg; do printf "%-30s " "$p"; if command -v $p >/dev/null 2>&1 || dpkg -l 2>/dev/null | grep -q "^ii $p "; then echo "УСТАНОВЛЕН"; else echo "нет"; fi; done
Если nginx/certbot/fail2ban/ufw уже установлены — apt install ниже их не сломает, просто пропустит. Но если установлены xray, mtg или awg — стоп! Сервер уже настроен. Не следуйте этой шпаргалке, иначе перезатрёте рабочие конфиги. Используйте этот файл только для свежего VPS.
1. обновить список
apt update
2. обновить пакеты
apt upgrade -y
Если спросит про перезапуск сервисов — жмите Enter (оставить по умолчанию). В конце должны увидеть приглашение командной строки root@server:~#.
Порты в команде: SSH (доступ), 80/tcp (certbot), 443/tcp (Xray VLESS+TLS), 443/udp (AWG, зарезервировано даже если AWG не ставите), mtg (MTProto).
проверка
ufw status
опционально: вставьте выводожидание вывода
4
Fail2ban
Защита от брутфорса SSH. В ignoreip укажите свои IP-адреса, чтобы вас не забанило при ошибках пароля.
Узнать свой IP: откройте ifconfig.me в браузере. Можно указать несколько через пробел (домашний + рабочий + мобильный). Совет: если у вас нет выделенного (статического) IP — указывайте подсетью /24. Например, ваш IP 1.2.3.246 → пишите 1.2.3.0/24. Это покроет весь диапазон провайдера, даже если IP сменится. Если не уверены — оставьте пусто (будет только 127.0.0.1/8, но рискуете забанить себя при ошибке пароля).
Должны увидеть две строки: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok и nginx: configuration file /etc/nginx/nginx.conf test is successful. После них приглашение командной строки без ошибок.
Панель будет доступна только через VPN или по curl http://127.0.0.1:5000 с самого сервера.
6
Xray (VLESS)
0. проверка
command -v xray && echo "УЖЕ УСТАНОВЛЕН — STOP" || echo "не установлен, можно ставить"
опционально: вставьте выводожидание вывода
Если показывает «УЖЕ УСТАНОВЛЕН» — пропустите шаг 1 (установка). Конфиг в шаге 6 всё равно перезатрёт /usr/local/etc/xray/config.json. Если на сервере уже работают клиенты — сначала забэкапьте: cp /usr/local/etc/xray/config.json /root/xray-config-backup.json
Если зависло дольше 2 минут — Ctrl+C, переподключиться по SSH и повторить. GitHub иногда не отдаёт.
2. сгенерировать UUID
xray uuid
Скопируйте UUID — он пойдёт в конфиг. Вставьте его в поле ниже.
3. фикс прав сервиса
sed -i 's/User=nobody/User=root/' /etc/systemd/system/xray.service
sed -i 's/NoNewPrivileges=true/NoNewPrivileges=false/' /etc/systemd/system/xray.service
systemctl daemon-reload
Без этого Xray не прочитает сертификаты даже от root (директории 700 по умолчанию).
6. конфиг xray (TLS + fallback)
Заполните UUID выше
3. сгенерировать ключи Reality
xray x25519
Скопируйте Private key и Public key. Private → в конфиг сервера, Public → клиенту.
Любые 8 hex-символов. Можно оставить по умолчанию.
4. конфиг xray (Reality)
Заполните UUID и ключи выше
запуск
systemctl enable xray && systemctl restart xray
проверка статуса
systemctl status xray --no-pager -l
Должны увидеть Active: active (running) зелёным цветом. Ниже — последние строки лога без слов error или failed.
опционально: вставьте выводожидание вывода
проверка портов
ss -tlnp | grep xray
Должны увидеть две строки: одна с :443 (для VLESS) и одна с 127.0.0.1:10085 (stats API). Если порт 443 показывается с IP 0.0.0.0 — это норма.
опционально: вставьте выводожидание вывода
7
mtg (MTProto)
MTProto прокси для Telegram. Качаем бинарник с GitHub.
0. проверка
command -v mtg && echo "УЖЕ УСТАНОВЛЕН — STOP" || echo "не установлен, можно ставить"
опционально: вставьте выводожидание вывода
Если показывает «УЖЕ УСТАНОВЛЕН» — пропустите шаги 1–3 (загрузку). Конфиг в шаге 5 всё равно перезатрёт /etc/mtg/config.toml новым секретом. Если на сервере уже есть клиенты с рабочим секретом — забэкапьте: cp /etc/mtg/config.toml /root/mtg-config-backup.toml
Нельзя качать mtg-linux-amd64 без .tar.gz — по ссылке latest/download отдаётся HTML, не бинарник!
Должны увидеть строку вида mtg vX.Y.Z (например mtg v2.1.7), затем приглашение командной строки. Если выводится ошибка command not found — бинарник не на месте, вернитесь к шагу 2.
PortОставьте предложенный (Enter) — скрипт не принимает 443. Поменяем после установки.
SubnetОставьте предложенный (Enter)
Disable IPv6Enter (да)
Routing modeEnter (по умолчанию)
Reboot now?y — после перезагрузки переподключиться по SSH и запустить скрипт заново
Скрипт может перезагружать сервер 1–2 раза. Каждый раз: подождите 30 сек, переподключитесь по SSH, скачайте скрипт заново (/tmp очищается при ребуте!) и запустите повторно. Скрипт подхватит настройки и продолжит с места остановки.
После завершения установки — порт будет не 443 (скрипт не позволяет ниже 1024). Меняем на 443/UDP:
3. узнать текущий порт
grep ListenPort /etc/amnezia/amneziawg/awg0.conf
Покажет строку вроде ListenPort = 39743 (или другое число). Запомните это число — оно нужно для следующей команды.
4. сменить порт на 443
awg-quick down awg0
sed -i 's/ListenPort = 39743/ListenPort = 443/' /etc/amnezia/amneziawg/awg0.conf
awg-quick up awg0
5. обновить endpoint в клиентских конфигах
sed -i 's/:39743/:443/' /root/awg/*.conf
6. проверить конфиг
cat /etc/amnezia/amneziawg/awg0.conf
Должны увидеть ListenPort = 443. H1–H4 — большие числа или диапазоны вида 840491219-878906097 (AWG 2.0). Если H1-H4 равны 1/2/3/4 — это обычный WireGuard, DPI его видит.
опционально: вставьте выводожидание вывода
4. статус
awg show awg0
Должны увидеть interface: awg0, ниже public key:, private key: (hidden), listening port: 443. Если уже добавлен peer — будет блок peer: с latest handshake (только после первого подключения клиента).
опционально: вставьте выводожидание вывода
Клиент подключается (handshake есть), но интернета нет
Если политика FORWARD = DROP (Docker или UFW ставят её автоматически), обратный трафик не проходит. Проверьте:
проверка политики
iptables -L FORWARD -v -n | head -1
Если видите policy DROP — нужно добавить правило для обратного трафика. Замените PostUp/PostDown в /etc/amnezia/amneziawg/awg0.conf:
После изменения: awg-quick down awg0 && awg-quick up awg0
Подсеть клиента не совпадает с сервером
Address в клиентском конфиге должен быть из той же подсети, что и Address сервера в awg0.conf. Например, если сервер 10.9.9.1/24 — клиенты должны быть 10.9.9.2, 10.9.9.3 и т.д. Если у клиента адрес из другой подсети (например 10.20.0.2) — handshake пройдёт, но трафик маршрутизироваться не будет. Проверьте также что AllowedIPs пира на сервере совпадает с Address клиента.
AWG не выбран — пропускаем. 443/UDP зарезервирован на будущее.
9
AWG Panel
Подготовка окружения. Файлы панели зальёте вручную через scp/sftp.
0. проверка
test -d /opt/awg-panel && echo "УЖЕ СУЩЕСТВУЕТ — STOP" || echo "нет, можно ставить"
systemctl is-active awg-panel 2>/dev/null && echo "СЕРВИС РАБОТАЕТ — STOP" || echo "сервис не запущен"
опционально: вставьте выводожидание вывода
Если показывает «УЖЕ СУЩЕСТВУЕТ» — панель уже развёрнута. Не запускайте шаги ниже, иначе перезатрёте admin.json, server.json и venv. Забэкапьте: cp -r /opt/awg-panel /root/awg-panel-backup
Откройте новое окно терминала на своём компьютере (не тот где SSH) и скопируйте файлы через scp. Или залейте через sftp-клиент (WinSCP, FileZilla).
scp (выполнить на своём компьютере!)
scp -P 22 -r "ПУТЬ\*" root@IP:/opt/awg-panel/
После заливки вернитесь в SSH-окно сервера и проверьте:
проверка (на сервере!)
ls /opt/awg-panel/
Должны увидеть app.py прямо в списке (не внутри вложенной папки). Если видите только имя папки вместо файлов — файлы залились папка-в-папку, переместите: mv /opt/awg-panel/deploy/* /opt/awg-panel/ && rmdir /opt/awg-panel/deploy
Как зайти в панель в разных режимах XRay. Панель сама детектит TLS/Reality и в разделе ⚙ → Страница входа показывает рабочий адрес. Ниже — что выбрать в каждом случае. Везде <IP>, <домен>, <ключ>, <порт> — подставь свои.
★
Универсально: SSH-туннель (работает всегда)
Если снаружи панель закрыта (Reality, сбитая маскировка, потерян адрес) — заходишь напрямую к gunicorn через туннель. Через него же можно настроить всё остальное.
на своём компьютере
ssh -L 8080:127.0.0.1:5000 root@<IP>
Оставь окно открытым → открой в браузере http://localhost:8080 (если маскировка/ключ — http://localhost:8080/<ключ>).
1
XRay в режиме TLS (сертификат на домен)
Панель едет на 443 «прицепом»: XRay-TLS → fallback → nginx → панель. Отдельный порт не нужен.
Вход: https://<домен>/ — или https://<домен>/<ключ>, если включена маскировка.
В Страница входа выбери «Вход по IP» (корень = панель) или «Маскировка фейк-сайтом» (корень = сайт, панель по ключу).
2
XRay в режиме Reality
443 целиком занят Reality (уводит на dest-сайт) — на 443 панель НЕ отдаётся. Нужен отдельный порт.
1. Первый вход — через SSH-туннель (см. выше). 2.⚙ → Страница входа → Доступ к панели по порту → впиши порт (напр. 2096) → выбери режим «Только по ключу» → Сохранить. Панель сама поднимет nginx и откроет порт в ufw.
Вход: https://<домен>:<порт>/<ключ> (TLS, если есть серт) или http://<IP>:<порт>/<ключ> (если серта нет).
Конфиг XRay/Reality панель не трогает — поднимает только свой отдельный nginx-блок awg-panel-access.
→
Переезд: был TLS, стал Reality
Был доступ https://<домен>/. После смены XRay на Reality 443 перестаёт отдавать панель — веб-доступ пропадёт.
1. Зайди через SSH-туннель. 2.Страница входа → задай порт → режим «Только по ключу» → Сохранить.
Новый вход: https://<домен>:<порт>/<ключ>.
←
Переезд: был Reality, стал TLS
Вернул XRay на TLS+fallback на 443 → панель снова доступна на 443 через домен. Отдельный порт больше не нужен.
1. Зайди по старому порту (если оставлял) или через SSH-туннель. 2.Страница входа → очисти поле порта → Сохранить (порт закроется в ufw, nginx-блок снимется). Режим верни на «Маскировка» или «Вход по IP».
Вход: https://<домен>/<ключ> (или https://<домен>/ без маскировки).
!
Потерял адрес входа
Сбрось маскировку и key-only через SSH — панель вернётся на корень (доступный через 443-TLS / порт / туннель):