Grafinya
Документация
  1. Быстрый старт
  2. Установка (Docker Compose)
  3. Настройки и переменные
  4. Домен и HTTPS
  5. Клиенты и файлы .conf
  6. Параметры обфускации
  7. Обновление и резервные копии
  8. Безопасность
  9. Решение проблем
  10. FAQ
Документация

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. После этого сразу можно добавлять клиентов.

Нужен HTTPS. По умолчанию панель пускает только по HTTPS. Для быстрой проверки по 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

ПараметрЗначениеЗачем
namegrafinya-panelфиксированное имя проекта: том всегда называется одинаково, куда бы вы ни склонировали репозиторий
container_namegrafinyaимя для docker logs и docker exec
build.образ собирается из исходников на сервере; готового образа в реестре нет
volumesgrafinya-panel_grafinya_dataбаза, ключи сервера и клиентов, настройки
ports51820/udp, 51821/tcpтуннель и веб-панель
cap_addNET_ADMIN, SYS_MODULEсоздание сетевого интерфейса и правил маршрутизации
devices/dev/net/tunустройство для ядра Grafinya, которое работает в пространстве пользователя — модуль ядра Linux не нужен
sysctlsip_forward и др.пересылка трафика клиентов в интернет (IPv4 и IPv6)

Ядро Grafinya работает в пространстве пользователя, отдельный модуль ядра Linux не нужен. Для этого контейнеру нужно устройство /dev/net/tun.

Мастер первого запуска

Мастер спрашивает только имя и пароль администратора (пароль — не короче 12 символов). Адрес для клиентов панель берёт так: переменная PUBLIC_HOST, иначе публичный IPv4 сервера, определённый автоматически, иначе адрес, по которому вы открыли панель. Порт — VPN_PORT или 51820. Оба значения можно изменить позже в «Админ-панели» → «Конфигурация» и «Сетевой интерфейс».

Установка без браузера

Для автоматизации (Ansible, cloud-init) мастер можно пропустить: задайте переменные ниже. Они читаются только при самом первом запуске, потом их стоит убрать из файла.

docker-compose.yml
    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.

ПеременнаяПо умолчаниюЧто делает
PORT51821TCP-порт веб-панели внутри контейнера
HOST0.0.0.0адрес, на котором слушает веб-панель
INSECUREfalsetrue — разрешить вход по HTTP без TLS (только для проверки)
PUBLIC_HOSTавтодомен или IP, который попадёт в конфиги клиентов
VPN_PORT51820UDP-порт туннеля; если задан, применяется при каждом запуске. Меняйте вместе с ports:
OVERRIDE_AUTO_AWG—wg — выключить обфускацию Grafinya (режим без маскировки трафика)
DISABLE_IPV6falsetrue — не выдавать клиентам IPv6 и не создавать IPv6-правила
DISABLE_VERSION_CHECKfalsetrue — не проверять обновления
TRUSTED_PROXIES—IP/подсети вашего reverse proxy через запятую; включает доверие к заголовкам X-Forwarded-* и проверку Origin
WG_INTERFACEwg0имя сетевого интерфейса туннеля (нужно, если на одном хосте несколько панелей)
DOCS_URL—ссылка «Документация» в футере панели (например, на этот сайт)
SOURCE_URL—ссылка на исходный код вашей версии панели
DISABLE_PASSWORD_AUTHfalsetrue — вход только через внешнего 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 (сертификат выпускается автоматически)

/etc/caddy/Caddyfile
panel.example.com {
    reverse_proxy 127.0.0.1:51821
}

nginx

/etc/nginx/sites-available/grafinya
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):

docker-compose.yml
    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.

Из консоли сервера:

CLI
docker exec -it grafinya cli clients:list
docker exec -it grafinya cli clients:qr 1
Файл .conf содержит приватный ключ. Не публикуйте его. Если файл утёк — удалите клиента и создайте нового.

6Параметры обфускации

Обфускация — функция ядра Grafinya, которая делает трафик туннеля непохожим на типичный VPN: добавляет «мусорные» пакеты перед рукопожатием, дополняет служебные сообщения случайными байтами и подменяет заголовки. Она включена по умолчанию, а случайные значения генерируются для каждого сервера при первом запуске.

ПараметрПо умолчаниюСмыслСовпадение на сервере и клиенте
Jc7количество «мусорных» пакетов перед рукопожатиемможет отличаться
Jmin / Jmax10 / 1000минимальный и максимальный размер мусорного пакета, байтможет отличаться
S1, S2128, 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). Сторонние компоненты и их лицензии — на странице «Участники и лицензии».