Grafinya Panel
Справочник по панели Grafinya: веб-интерфейс и VPN-нода в одном контейнере на вашем сервере. Если вы ставите панель впервые, начните с пошагового гайда — здесь собраны подробности.
1Быстрый старт
На сервере с Docker:
git clone https://github.com/grapelloid/grafinya-panel.git && cd grafinya-panel
docker compose up -d --buildЧерез несколько минут панель ответит на порту 51821. Откройте её в браузере и создайте администратора — это единственный вопрос мастера. Публичный адрес сервера панель определяет сама, VPN-порт — 51820/udp. После этого сразу можно добавлять клиентов.
http:// включите INSECURE=true (см. переменные), для постоянной работы — домен и reverse proxy.2Установка (Docker Compose)
Требования
- Linux-сервер с публичным IPv4 (Ubuntu 22.04/24.04, Debian 12 или аналог), 1 ГБ RAM, ~5 ГБ диска.
- Docker Engine с плагином
docker compose. - Открытые порты:
51820/udp— туннель,51821/tcp— веб-панель.
Что делает docker-compose.yml
| Параметр | Значение | Зачем |
|---|---|---|
name | grafinya-panel | фиксированное имя проекта: том всегда называется одинаково, куда бы вы ни склонировали репозиторий |
container_name | grafinya | имя для docker logs и docker exec |
build | . | образ собирается из исходников на сервере; готового образа в реестре нет |
volumes | grafinya-panel_grafinya_data | база, ключи сервера и клиентов, настройки |
ports | 51820/udp, 51821/tcp | туннель и веб-панель |
cap_add | NET_ADMIN, SYS_MODULE | создание сетевого интерфейса и правил маршрутизации |
devices | /dev/net/tun | устройство для ядра Grafinya, которое работает в пространстве пользователя — модуль ядра Linux не нужен |
sysctls | ip_forward и др. | пересылка трафика клиентов в интернет (IPv4 и IPv6) |
Ядро Grafinya работает в пространстве пользователя, отдельный модуль ядра Linux не нужен. Для этого контейнеру нужно устройство /dev/net/tun.
Мастер первого запуска
Мастер спрашивает только имя и пароль администратора (пароль — не короче 12 символов). Адрес для клиентов панель берёт так: переменная PUBLIC_HOST, иначе публичный IPv4 сервера, определённый автоматически, иначе адрес, по которому вы открыли панель. Порт — VPN_PORT или 51820. Оба значения можно изменить позже в «Админ-панели» → «Конфигурация» и «Сетевой интерфейс».
Установка без браузера
Для автоматизации (Ansible, cloud-init) мастер можно пропустить: задайте переменные ниже. Они читаются только при самом первом запуске, потом их стоит убрать из файла.
environment:
- INIT_ENABLED=true
- INIT_USERNAME=admin
- INIT_PASSWORD=длинный-надёжный-пароль
- INIT_HOST=vpn.example.com
- INIT_PORT=51820Необязательно: INIT_DNS (через запятую), INIT_IPV4_CIDR вместе с INIT_IPV6_CIDR, INIT_ALLOWED_IPS. Сложность пароля здесь не проверяется — выбирайте длинный сами.
3Настройки и переменные окружения
Переменные задаются в блоке environment: сервиса grafinya в docker-compose.yml. После правки выполните docker compose up -d.
| Переменная | По умолчанию | Что делает |
|---|---|---|
PORT | 51821 | TCP-порт веб-панели внутри контейнера |
HOST | 0.0.0.0 | адрес, на котором слушает веб-панель |
INSECURE | false | true — разрешить вход по HTTP без TLS (только для проверки) |
PUBLIC_HOST | авто | домен или IP, который попадёт в конфиги клиентов |
VPN_PORT | 51820 | UDP-порт туннеля; если задан, применяется при каждом запуске. Меняйте вместе с ports: |
OVERRIDE_AUTO_AWG | — | wg — выключить обфускацию Grafinya (режим без маскировки трафика) |
DISABLE_IPV6 | false | true — не выдавать клиентам IPv6 и не создавать IPv6-правила |
DISABLE_VERSION_CHECK | false | true — не проверять обновления |
TRUSTED_PROXIES | — | IP/подсети вашего reverse proxy через запятую; включает доверие к заголовкам X-Forwarded-* и проверку Origin |
WG_INTERFACE | wg0 | имя сетевого интерфейса туннеля (нужно, если на одном хосте несколько панелей) |
DOCS_URL | — | ссылка «Документация» в футере панели (например, на этот сайт) |
SOURCE_URL | — | ссылка на исходный код вашей версии панели |
DISABLE_PASSWORD_AUTH | false | true — вход только через внешнего OAuth/OIDC-провайдера |
Остальное — DNS для клиентов, подсети, MTU, keepalive, разрешённые адреса, межклиентский firewall — настраивается в веб-интерфейсе: «Админ-панель» → «Конфигурация» и «Сетевой интерфейс».
4Домен и HTTPS
Панель рассчитана на работу за reverse proxy с TLS-сертификатом. Схема: браузер → https://panel.example.com → proxy → 127.0.0.1:51821. Сначала создайте A-запись домена на IP сервера и откройте порты 80 и 443.
Caddy (сертификат выпускается автоматически)
panel.example.com {
reverse_proxy 127.0.0.1:51821
}nginx
server {
listen 443 ssl http2;
server_name panel.example.com;
ssl_certificate /etc/letsencrypt/live/panel.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:51821;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
}
}Сертификат для nginx можно получить через certbot --nginx -d panel.example.com.
Закройте прямой доступ к 51821
Когда proxy работает, привяжите порт панели к localhost — иначе её по-прежнему видно по http://IP:51821 (Docker публикует порты в обход ufw):
ports:
- "51820:51820/udp"
- "127.0.0.1:51821:51821/tcp"INSECURE при работе через HTTPS оставляйте false. Если proxy работает в Docker-сети, а не на хосте, укажите его адрес в TRUSTED_PROXIES.
5Клиенты и файлы .conf
Клиент — это одно устройство со своей парой ключей и своим адресом в туннеле. Не используйте один конфиг на нескольких устройствах одновременно.
- Создание: «Клиенты» → «Новый клиент» → имя и (необязательно) дата отключения.
- Файл .conf: кнопка «Скачать конфигурацию» в карточке клиента. Его принимает приложение grafinya через «Выбрать файл».
- QR-код — для клиентов на других платформах, которые умеют сканировать конфиг.
- Одноразовая ссылка — чтобы передать конфиг человеку без доступа к панели; ссылка действует 5 минут, а после первого скачивания — ещё не больше 10 секунд.
- Срок действия: после указанной даты клиент отключается. «Продлить» — просто поставить новую дату.
- Включение/отключение — тумблер в карточке: доступ закрывается сразу, конфиг при этом не меняется.
- Статистика: статус «в сети», последнее рукопожатие, трафик и графики Tx/Rx.
Из консоли сервера:
docker exec -it grafinya cli clients:list
docker exec -it grafinya cli clients:qr 16Параметры обфускации
Обфускация — функция ядра Grafinya, которая делает трафик туннеля непохожим на типичный VPN: добавляет «мусорные» пакеты перед рукопожатием, дополняет служебные сообщения случайными байтами и подменяет заголовки. Она включена по умолчанию, а случайные значения генерируются для каждого сервера при первом запуске.
| Параметр | По умолчанию | Смысл | Совпадение на сервере и клиенте |
|---|---|---|---|
Jc | 7 | количество «мусорных» пакетов перед рукопожатием | может отличаться |
Jmin / Jmax | 10 / 1000 | минимальный и максимальный размер мусорного пакета, байт | может отличаться |
S1, S2 | 128, 56 | случайное дополнение пакетов инициации и ответа рукопожатия, байт | должны совпадать |
S3, S4 | — | дополнение остальных служебных и транспортных пакетов | должны совпадать |
H1–H4 | случайные | подменённые заголовки четырёх типов пакетов | должны совпадать |
I1–I5 | — | сигнатурные пакеты, имитирующие другие UDP-протоколы | может отличаться |
Параметры, которые должны совпадать, панель сама вписывает в каждый .conf. Поэтому после их изменения в «Админ-панели» → «Сетевой интерфейс» скачайте конфиги клиентов заново — старые перестанут подключаться.
Если меняете вручную: держите Jmin < Jmax, а Jmax не больше ~1280, чтобы пакеты не дробились; H1–H4 должны быть разными. Без уверенности лучше оставить значения, сгенерированные панелью.
Выключить обфускацию целиком можно переменной OVERRIDE_AUTO_AWG=wg — тогда трафик не маскируется, а конфиги клиентов создаются без этих параметров.
7Обновление, резервные копии, восстановление
Обновление
cd ~/grafinya-panel
git pull
docker compose up -d --build
docker image prune -fДанные лежат в томе grafinya-panel_grafinya_data и при пересборке не теряются.
Резервная копия
cd ~/grafinya-panel
docker compose stop
docker run --rm -v grafinya-panel_grafinya_data:/data -v "$PWD":/backup alpine \
tar czf /backup/grafinya-backup-$(date +%F).tar.gz -C /data .
docker compose startВосстановление
На новом сервере установите панель, не проходя мастер, затем:
cd ~/grafinya-panel
docker compose stop
docker run --rm -v grafinya-panel_grafinya_data:/data -v "$PWD":/backup alpine \
sh -c "rm -rf /data/* && tar xzf /backup/grafinya-backup-ДАТА.tar.gz -C /data"
docker compose startЕсли у нового сервера другой IP, поменяйте адрес в «Админ-панели» → «Конфигурация» и раздайте клиентам новые конфиги (или укажите в PUBLIC_HOST домен — тогда достаточно перенести DNS-запись).
8Безопасность
- Пароль администратора — не короче 12 символов, уникальный, в менеджере паролей.
- 2FA: включите двухфакторную аутентификацию (TOTP) на странице «Аккаунт» (меню пользователя в правом верхнем углу). Подойдёт любое приложение-аутентификатор.
- Только HTTPS:
INSECURE=false, панель за reverse proxy, порт51821привязан к127.0.0.1. - Минимум открытых портов: наружу — SSH,
51820/udp, 80/443 для proxy. - SSH: вход по ключу, пароль root отключён (
PasswordAuthentication no). - Обновления: регулярно обновляйте систему (
apt upgrade) и панель. - Бэкапы содержат все приватные ключи — храните их зашифрованными.
- Сброс доступа:
docker exec -it grafinya cli db:admin:resetзадаёт новый пароль и отключает 2FA администратора.
9Решение проблем
Начинайте с логов и состояния контейнера:
docker ps
docker logs --tail 100 grafinya| Симптом | Что проверить |
|---|---|
| Панель не открывается | контейнер запущен; порт 51821/tcp открыт в firewall хостинга; curl -I http://127.0.0.1:51821 на сервере |
| Страница есть, вход не работает | вход по HTTP без INSECURE=true; за proxy — заголовок X-Forwarded-Proto и TRUSTED_PROXIES |
| Клиент подключён, но нет интернета | открыт ли 51820/udp (именно UDP); правильный ли адрес в «Конфигурации»; включены ли sysctls пересылки |
| Подключение рвётся через минуту | не совпадают S1–S4/H1–H4: скачайте конфиг заново после изменения параметров |
В логах ошибка про /dev/net/tun | панель собрана из старой версии: обновите репозиторий (git pull && docker compose up -d --build) |
| Сборка образа падает | мало памяти: добавьте swap 1–2 ГБ и повторите docker compose up -d --build |
| Порт 51820 занят | смените VPN_PORT и левую часть в ports: на одинаковое значение |
10FAQ
Можно ли поставить панель без Docker?
Официально поддерживается только Docker Compose: так ядро, панель и все зависимости собираются одинаково на любом сервере.
Сколько клиентов выдержит сервер?
Ограничение задаёт подсеть (по умолчанию /24 — до ~250 клиентов) и ширина канала VPS. Нагрузка на процессор от самого туннеля невелика.
Видит ли Grafinya мой трафик?
Нет. Панель и туннель работают на вашем сервере, трафик идёт между устройством и вашим VPS. Приложение отправляет только ID установки, ошибки и диагностику — см. политику.
Можно ли использовать конфиг в других приложениях?
Да, если приложение поддерживает параметры обфускации из файла. Для iPhone рекомендуем grafinya.
Как сменить порт туннеля?
Задайте VPN_PORT=51999 и "51999:51999/udp" в ports:, выполните docker compose up -d, откройте новый порт в firewall и раздайте клиентам новые конфиги.
Где исходный код?
Панель — на GitHub (AGPL-3.0). Сторонние компоненты и их лицензии — на странице «Участники и лицензии».