- Сервер на LinuxVPS с публичным IP, 1–2 ядра, ~512 МБ RAM; готовый .deb — amd64
- root-доступнужны сетевые права: TUN, NAT, привязка к порту
Установка и настройка Qeli
Основные команды и файлы обновлены для выпущенной Qeli 0.8.1 beta. Руководство охватывает установку, безопасное обновление сервера и приложений, маршрутизацию, панель, резервные копии и диагностику.
Короткие инструкции по способу установки
Эта страница остаётся полным руководством. Для быстрого старта откройте отдельную инструкцию под свою платформу — в ней только нужные требования, команды и проверки.
Debian VPS
Чистый VPS, установка сервера одной командой, проверка службы и получение ссылок qeli://.
Docker на Linux
GHCR-образ, Docker Compose, TUN, capabilities, постоянные тома и проверка контейнера.
MikroTik RouterOS
Контейнер RouterOS v7, выбор архитектуры, veth, mounts, ограничения TUN и маршрутизация.
Клиенты
Windows, macOS, Android и Linux: выбор файла, SHA-256 и импорт qeli://.
Установка одной командой
На чистом сервере Debian 12+ / Ubuntu 22.04+ выполните от root — скрипт развернёт reality-tls сервер на :443 целиком: поставит зависимости и последний .deb из релизов, запишет конфиг с full-tunnel NAT, сгенерирует ключ сервера, заведёт пять пользователей с готовыми ссылками qeli:// и запустит службу.
# 1. скачать скрипт
$ curl -fsSLO https://raw.githubusercontent.com/litvinovtd/qeli/main/install-qeli-server.sh
# 2. прочитать его — и только потом запускать от root
$ less install-qeli-server.sh
$ bash install-qeli-server.sh
Чтобы задать адрес подключения явно (IP, домен или IPv6), передайте его аргументом: bash install-qeli-server.sh vpn.example.com — иначе публичный адрес определится автоматически. Профиль и порт задаются переменными QELI_PROFILE=reality-tls|fake-tls|udp-quic и QELI_PORT=<1-65535>. Готовые строки подключения появятся в /etc/qeli/client-links/.
Почему не curl … | bash: скрипт работает от root, поэтому сначала скачайте и прочитайте его.
Что меняется в системе: включаются forwarding и MSS clamp, применяются BBR/fq, TCP/PMTU и socket-buffer sysctl. Панель остаётся на HTTPS 127.0.0.1:8080; открывайте её через SSH-туннель. Для воспроизводимости используйте файл из тега v0.8.1.
Обновление сервера
Для сервера, установленного из .deb, используйте штатный updater. Он обновляет пакет и бинарник, сохраняет конфигурацию и при неудачном старте пытается откатить пакет. Перед запуском сделайте резервную копию /etc/qeli и /var/lib/qeli.
$ sudo qeli check-config --config /etc/qeli/server.conf
$ curl -fsSLO https://raw.githubusercontent.com/litvinovtd/qeli/main/update-qeli-server.sh
$ less update-qeli-server.sh
$ sudo bash update-qeli-server.sh
Если переходите с версии до 0.7.15, удалите устаревший tun.netmask: единственным источником подсети теперь служит pool.cidr. Затем выполните sudo qeli check-config. Обновление перезапускает службу и разрывает активные сессии; клиенты подключатся снова автоматически. Скрипт запускается от root — скачайте и прочитайте его перед выполнением.
Проверка перед обновлением
0.8.1 опубликована как beta. До замены бинаря сделайте проверяемую резервную копию, выполните qeli check-config для сервера и каждого клиентского профиля, а 17 payload-файлов релиза сверяйте с SHA256SUMS.
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo qeli check-config --client --config /etc/qeli/clients/<profile>.conf
Первая команда проверяет серверный конфиг и базу пользователей; вторую повторите для каждого включённого клиентского профиля. Исправьте ошибки маршрутов и IPv6 до restart. При обновлении приложения используйте вложенный native core 0.8.1 — вручную подменять его старой версией нельзя.
Обновление до Qeli 0.8.1
Сначала обновите сервер, проверьте конфигурацию и перезапустите службу. Затем установите новые приложения целиком вместе с вложенными native cores. UDP batching включается автоматически; NDP proxy и большие route_file требуют осознанной настройки.
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo systemctl restart qeli
$ qeli --version
$ sudo journalctl -u qeli -n 100 --no-pager
UDP batching не требует нового ключа. Linux и Android автоматически используют bounded recvmmsg/sendmmsg пачки до 32 без дополнительного таймера накопления; порядок пакетов, roaming, pacing и PMTU fallback сохраняются.
Перед импортом больших списков проверьте новый формат route_file: ключ можно повторять, поддерживаются CIDR и OpenVPN route-строки, общий лимит — 250 000. Нечитаемый файл, битая маска или превышение лимита теперь останавливают подключение fail-closed.
Android и iOS теперь ждут реально пригодный Wi‑Fi/LTE carrier и не тратят backoff в состоянии без сети. Установите приложение 0.8.1 целиком; ручное отключение остаётся окончательным и не должно запускать автоматическое восстановление.
Оставьте routing.ipv6.ndp_proxy = off, если провайдер маршрутизирует клиентский префикс на WAN-адрес сервера. Для on-link префикса сначала проверьте Neighbor Solicitation и используйте auto; required включайте после проверки интерфейса и CAP_NET_RAW.
Запуск в Docker
Контейнер совмещает обе роли — server и client — со всеми зависимостями внутри. Он работает на Linux-хостах и в контейнерных рантаймах роутеров (MikroTik RouterOS v7, OpenWrt). Чтобы установка 0.8.1 не зависела от состояния GHCR :latest, инструкция собирает образ из закреплённого тега v0.8.1 и запускает его через Docker Compose:
# получить исходники опубликованной версии 0.8.1:
$ git clone --branch v0.8.1 --depth 1 https://github.com/litvinovtd/qeli.git
$ cd qeli
# собрать локальный образ из закреплённого тега:
$ docker buildx build -f release/docker/Dockerfile -t qeli:latest --load .
$ cp release/docker/docker-compose.yml .
# запустить сервер:
$ docker compose -f docker-compose.yml up -d qeli-server
Контейнеру нужны /dev/net/tun и capabilities NET_ADMIN, NET_RAW, NET_BIND_SERVICE (без --privileged); для серверного NAT — net.ipv4.ip_forward=1. Том /etc/qeli обязательно сохраняйте — там ключ сервера и пользователи. Тот же образ запускается и как клиент-шлюз (client); для клиента в контейнере задайте dns = off. Полное руководство (Linux и MikroTik) — в release/docker/README.md.
Скачать клиент 0.8.1
Берите файлы только из официального релиза: QeliWin-standalone.exe либо QeliWin-net-required.exe для Windows, Qeli-macOS-universal.zip для macOS, qeli-android-0.8.1.apk для Android и qeli-linux-amd64 либо qeli_0.8.1_amd64.deb для Linux. Обновляйте приложения вместе с вложенными native cores; готовой iOS-сборки в релизе нет.
# Linux / macOS: SHA256SUMS и нужный файл должны лежать рядом
$ sha256sum -c SHA256SUMS --ignore-missing
# Windows PowerShell: сравните результат со строкой в SHA256SUMS
PS> Get-FileHash .\QeliWin-standalone.exe -Algorithm SHA256
MikroTik, Keenetic и OpenWrt
На MikroTik RouterOS v7 Qeli запускается из OCI-образа через встроенный контейнерный рантайм. Для Keenetic и OpenWrt в релизе есть протестированные client-only сборки под несколько архитектур; работоспособность на реальных роутерах подтверждена. Перед установкой проверьте архитектуру, наличие TUN и SHA-256 файла.
Установка зависит от модели, архитектуры и наличия TUN. Следуйте version-pinned инструкциям, а не случайной команде для другой платформы.
Полная инструкция: Docker на MikroTik RouterOS v7 → Инструкция Keenetic → Инструкция OpenWrt →
Что понадобится
- Rustдля сборки из исходников — либо готовый бинарь / .deb
- Клиентпод вашу платформу: Linux, Windows, macOS или Android
Сборка и установка
Для воспроизводимой сборки переключитесь на тег v0.8.1, включите production allocator фичей jemalloc и установите runtime-зависимости. Один бинарь работает как сервер, клиент и утилита управления.
$ git clone https://github.com/litvinovtd/qeli.git
# зафиксировать именно опубликованную версию
$ cd qeli && git checkout v0.8.1 && cd qeli
# jemalloc используется серверной релизной сборкой и удерживает RSS под churn
$ cargo build --release --features jemalloc
$ sudo install -Dm755 target/release/qeli /usr/bin/qeli
# служба, пользователь и каталоги — при установке из .deb это делает пакет,
# при ручной сборке создайте их сами:
$ sudo apt install -y iproute2 iptables libcap2-bin
$ getent passwd qeli >/dev/null || sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin qeli
$ sudo install -d -o qeli -g qeli /etc/qeli /var/log/qeli /var/lib/qeli
$ sudo install -m640 -o qeli -g qeli config/server.conf /etc/qeli/server.conf
$ sudo touch /etc/qeli/users.conf
$ sudo chown qeli:qeli /etc/qeli/users.conf && sudo chmod 640 /etc/qeli/users.conf
$ sudo install -Dm644 debian/qeli.service /etc/systemd/system/qeli.service
# разрешить непривилегированной панели перезапускать только qeli.service
$ sudo qeli install-polkit
$ sudo systemctl daemon-reload
Конфигурация сервера
Откройте /etc/qeli/server.conf — единый текстовый формат (flat-INI). Минимальный профиль reality-tls на 443 с выходом в интернет:
[auth]
# reality-tls и H-1 требуют настоящий закреплённый ключ клиента;
# true дополнительно отклоняет непиненных клиентов до AUTH и не раскрывает
# identity-ключ сетевому сканеру.
require_client_key_proof = true
[profile:main]
bind.address = 0.0.0.0
bind.port = 443
bind.transport = tcp
# reality-tls использует параметры reality_proxy ниже
obf.mode = reality-tls
tun.address = 10.0.0.1
pool.cidr = 10.0.0.0/24
# выпуск клиентов в интернет
routing.nat.enabled = true
# резолвер в туннеле
dns.enabled = true
dns.listen = 10.0.0.1
dns.upstream = 1.1.1.1
# reality-tls: туннель внутри настоящего TLS 1.3
# server_name должен совпадать с target — именно он попадёт в ссылку qeli://
obf.tls.server_name = www.microsoft.com
obf.tls.reality_proxy.enabled = true
# чей сертификат заимствуем
obf.tls.reality_proxy.target = www.microsoft.com
# токен клиента (reality_sid)
obf.tls.reality_proxy.short_ids = 7e78a17ad41f1004
# настоящий TLS (handrolled по умолч.)
obf.tls.reality_proxy.real_tls = true
Глобальные секции — [auth], [web], [logging]; каждый интерфейс — это [profile:имя]. Можно поднять несколько профилей сразу (TCP и UDP на разных портах). Комментарии — только на отдельной строке.
obf.mode принимает plain, fake-tls, obfs (нужен obf.obfs_key) и reality-tls. Для reality/reality-tls задайте блок obf.tls.reality_proxy.*; real_tls = true включает настоящий TLS 1.3, false оставляет режим port-sharing proxy. Для UDP-профиля нужны obf.quic.enabled = true и bind.transport = udp.
Запуск как служба
Через systemd (рекомендуется): служба qeli работает под отдельным пользователем с минимальными правами (только сетевые capabilities), сама перезапускается при сбое.
$ sudo systemctl enable --now qeli
$ sudo journalctl -u qeli -f # смотреть логи
# либо вручную для проверки (foreground):
$ sudo qeli server --config /etc/qeli/server.conf
Сокращённый пример: фактический журнал содержит дополнительные строки диагностики, а одна служба может поднять несколько профилей сразу:
$ sudo qeli server --config /etc/qeli/server.conf
[info] qeli 0.8.1 · запуск 5 профилей
[info] Profile 'reality' tcp/443 reality-tls · основной
[ ok ] REALITY real-TLS termination enabled
[info] Profile 'tls' tcp/8443 fake-tls · запасной
[info] Profile 'obfs' tcp/8444 obfs + WebSocket
[info] Profile 'plain' tcp/8445 raw · доверенные сети
[info] Profile 'udp' udp/4443 udp-quic · QUIC-shaped masking
[ ok ] web admin → https://127.0.0.1:8080
При старте сервер печатает поднятые профили и адрес веб-панели. HUP (или sudo systemctl reload qeli) перечитывает пользователей и часть runtime-настроек без разрыва сессий. Изменения профилей, портов, TUN и транспорта требуют sudo systemctl restart qeli.
Ключ сервера и пиннинг
Покажите публичный ключ каждого профиля — клиенты «пиннят» его, чтобы исключить подключение к подменному серверу (анти-MITM):
$ sudo qeli show-identity --config /etc/qeli/server.conf
main a3f5…d290 # → в поле key у клиента
Скопируйте ключ в поле key клиента. Для reality-tls и включённого по умолчанию H-1 настоящий закреплённый ключ обязателен; require_client_key_proof = true дополнительно отклоняет непиненных клиентов до AUTH. Сменить ключ: sudo qeli rotate-identity <профиль>, затем перезапустить службу и обновить key у клиентов.
Заведение пользователей
Команда add-client сохраняет Argon2id-хеш и защищённую обратимо зашифрованную копию пароля для повторной выдачи ссылки/QR. С флагами --link --host она сразу печатает ссылку qeli:// для импорта в приложение.
$ sudo qeli add-client alice --link --host vpn.example.com:443
password: x7Qp…m2K # сгенерирован, печатается один раз
qeli://alice:x7Qp…m2K@vpn.example.com:443?proto=tcp&mode=reality-tls&key=a3f5…d290&sni=www.microsoft.com&rsid=7e78a17ad41f1004
# свой пароль без утечки в argv и историю shell:
$ read -rsp 'Password: ' QELI_USER_PASSWORD; echo
$ printf '%s\n' "$QELI_USER_PASSWORD" | sudo qeli add-client bob --password-stdin --profiles main --max-sessions 2
$ unset QELI_USER_PASSWORD
# применить новых пользователей (без разрыва активных сессий)
$ sudo systemctl reload qeli
Файл пользователей (auth.users_file, по умолчанию /etc/qeli/users.conf) можно править и вручную — по секции на пользователя плюс шаблоны [group:*]:
[user:alice]
# добавляет qeli add-client alice
password_hash = $argon2id$…
enabled = true
# одновременных устройств (0 = без лимита)
max_sessions = 2
# фиксированный IP в туннеле (из pool.cidr)
static_ip = 10.0.0.50
# доступ только к этим профилям
profiles = main
# куда можно ходить (ACL); пусто = без ограничений
allowed_networks = 10.0.0.0/24
# лимит скорости, Мбит/с (0 = без лимита)
bandwidth.limit_mbps = 50
# наследовать лимиты из [group:premium]
group = premium
# доп. маршрут этому пользователю
route = 10.20.0.0/16 gateway=10.0.0.1
[group:premium]
bandwidth_limit_mbps = 100
max_sessions = 3
Не передавайте секрет через --password: аргумент виден в списке процессов и часто остаётся в истории shell. Используйте автоматическую генерацию или --password-stdin. Рядом с Argon2id-хешем Qeli хранит password_enc — зашифрованную копию под ключом /var/lib/qeli/panel-secret.key; включайте этот файл в аварийную резервную копию. Для dual-stack доступна выдача --static-ipv6.
Повторно выдать ссылку существующему пользователю
Команда share-link использует защищённую копию пароля и заново собирает ссылку из текущего профиля сервера:
$ sudo qeli share-link alice --host vpn.example.com:443 --profile main
# только для старого пользователя без password_enc: пароль будет заменён
$ sudo qeli share-link legacy-user --host vpn.example.com:443 --profile main --reset
$ sudo systemctl reload qeli
--reset — разрушающая операция: старый клиентский конфиг перестанет работать. Без --reset пароль не меняется и reload не требуется.
Подключение клиента
Приложение (телефон / десктоп): импортируйте ссылку qeli:// или отсканируйте QR — сервер, режим и закреплённый ключ подтянутся сами.
CLI-клиент (Linux): заполните client.conf и запустите:
[qeli]
server = vpn.example.com:443
proto = tcp
mode = reality-tls
user = alice
pass = ••••••••
# ключ из show-identity
key = a3f5…d290
# short_id из профиля сервера
reality_sid = 7e78a17ad41f1004
# как у reality-цели
sni = www.microsoft.com
$ sudo qeli client --config /etc/qeli/client.conf
Кроме базовых полей, клиент понимает локальные опции (задаются только в файле, в ссылку qeli:// не входят) — авто-MTU, режим туннеля, kill-switch и совместимые с OpenVPN persist_tun / local / metric (а в клиентах Windows/macOS — ещё и route_file):
# локальные опции (в ссылку qeli:// не входят).
# ВАЖНО: комментарий — только отдельной строкой. Всё, что стоит после «=»,
# попадает в значение целиком, вместе с «# ...».
# авто-подбор MTU (важно на LTE/CGNAT); >0 = вручную
mtu = 0
# полный туннель; false = split-tunnel
gateway = true
# заворачивать и приватные подсети сервера
route_local = false
# эти подсети — мимо туннеля
exclude = 203.0.113.0/24
# блокировать выход, пока туннель не поднят (Linux)
kill_switch = true
# держать адаптер и маршруты между реконнектами (Win/macOS)
persist_tun = true
# авто-подключение при старте панели/супервизора
autostart = true
Поля proto, mode и (для obfs — obfs_key; для reality-tls — key, reality_sid, sni) должны совпадать с профилем сервера — проще всего импортировать ссылку qeli://, она подставит их сама. Маршруты, DNS и MTU сервер выдаёт при подключении; локальные опции выше — по желанию. Полный аннотированный список ключей — в config/client.conf; есть и алиасы режима mode = udp-quic / udp-obfs.
Несколько профилей и режимов
Один сервер поднимает несколько профилей сразу — по профилю на транспортный режим и порт; пользователи общие и работают на любом. Ниже сокращённый пример на основе актуального server-multiprofile.conf; у каждого профиля должны быть собственные порт, TUN и пул адресов.
[profile:reality-tls] # настоящий TLS 1.3 — TCP :443
bind.port = 443
bind.transport = tcp
obf.mode = reality-tls
obf.tls.reality_proxy.enabled = true
obf.tls.reality_proxy.real_tls = true
obf.tls.reality_proxy.target = www.microsoft.com
obf.tls.reality_proxy.short_ids = 0123456789abcdef
tun.address = 10.9.0.1
pool.cidr = 10.9.0.0/24
[profile:fake-tls] # TLS-подобный хендшейк — TCP :8443
bind.port = 8443
bind.transport = tcp
obf.mode = fake-tls
tun.address = 10.9.1.1
pool.cidr = 10.9.1.0/24
[profile:obfs] # ChaCha20-обфускация — TCP :8444
bind.port = 8444
bind.transport = tcp
obf.mode = obfs
obf.obfs_key = смените-меня
tun.address = 10.9.2.1
pool.cidr = 10.9.2.0/24
[profile:udp-quic] # fake-tls + QUIC поверх UDP — UDP :8449
bind.port = 8449
bind.transport = udp
obf.mode = fake-tls
obf.quic.enabled = true
tun.address = 10.9.7.1
pool.cidr = 10.9.7.0/24
Полный шаблон 0.8.1 содержит 10 готовых профилей: reality-tls, reality, fake-tls, obfs-ws, obfs-none, plain, udp-fake-tls, udp-quic, udp-obfs и obfs-awg. Новые шаблоны включают bounded roaming, dual-stack и recordizer.policy=prefer.
Выход в интернет через сервер
Весь трафик устройства идёт через сервер и выходит в интернет с его IP — классический VPN: приватность в публичных сетях, единый внешний адрес. На сервере нужен NAT, а на клиенте — gateway = true: по умолчанию клиент работает в режиме split-tunnel.
# MASQUERADE клиентов в интернет
routing.nat.enabled = true
# резолвер в туннеле
dns.enabled = true
# полный туннель включается НА КЛИЕНТЕ: по умолчанию gateway = false (split-tunnel)
gateway = true
# опционально: не выпускать трафик мимо туннеля, пока он не поднят (Linux)
kill_switch = true
Доступ к сети за сервером
Дотянуться из любой точки до локальной сети за сервером — NAS, камеры, принтеры, внутренние сервисы. Сервер раздаёт клиенту маршрут к LAN и пересылает пакеты без NAT; домашний роутер возвращает ответы в pool.cidr через LAN-адрес Qeli-сервера.
# маршрутизация без подмены исходных адресов
routing.nat.enabled = false
routing.forward_private = true
# подсеть за сервером
route = 192.168.1.0/24 gateway=10.0.0.1
Настройте обратный путь: на домашнем роутере добавьте маршрут к pool.cidr через постоянный LAN-адрес Qeli-сервера. Маршрут клиенту можно выдать индивидуально — ключом route в секции [user:имя]. NAT используйте только как запасной вариант, если роутер не поддерживает статические маршруты.
Объединение сетей (site-to-site)
Соедините целые сети нескольких площадок так, чтобы их узлы видели друг друга — связать офисы, филиалы, домашнюю и рабочую сеть. На каждой площадке ставится шлюз с qeli client и фиксированным IP в туннеле; сервер раздаёт маршруты к подсетям площадок, и трафик ходит между сетями через туннель на уровне L3.
[user:branch-a]
# LAN ЗА этим клиентом — аналог iroute в OpenVPN (ключевая строка)
client_subnet = 192.168.50.0/24
# фиксированный IP в туннеле — удобно, но не обязательно
static_ip = 10.0.0.10
# site-to-site идёт БЕЗ NAT — реальные адреса сохраняются
routing.nat.enabled = false
# транзит туннель ↔ сети, без MASQUERADE
routing.forward_private = true
# обратный маршрут к сети за сервером — пушится клиентам
route = 10.20.0.0/24 gateway=10.0.0.1
[qeli]
# ip_forward + FORWARD ACCEPT + MSS-clamp, но БЕЗ MASQUERADE —
# реальные адреса LAN сохраняются
forward = true
Ключевая строка — client_subnet у пользователя: она регистрирует подсеть за клиентом как входящий маршрут. Без неё сервер дропнет пакеты на любой адрес, кроме пулового IP клиента. На шлюзе площадки — forward = true (форвардинг без NAT). Доступно с 0.7.11; на Android не поддерживается. Адресацию площадок держите непересекающейся.
Раздельный туннель (split-tunnel)
В туннель идёт только то, что нужно — например, рабочие подсети, — а остальной трафик клиента идёт напрямую. Режим выбирает клиент: gateway = false (это значение по умолчанию), а сервер лишь раздаёт нужные маршруты. Отдельные подсети можно, наоборот, увести мимо туннеля ключом exclude.
# без полного выхода в интернет
routing.nat.enabled = false
# только рабочие подсети
route = 10.50.0.0/16 gateway=10.0.0.1
# split-tunnel — значение по умолчанию: в туннель идут только выданные маршруты
gateway = false
# при желании увести отдельные подсети мимо туннеля
exclude = 203.0.113.0/24
Команды управления
Команды используют управляющий сокет с правами 0600, поэтому ниже указан sudo. Большинство изменений применяется на лету. Исключения — rotate-identity и set-web-password: они правят конфиг на диске и требуют sudo systemctl restart qeli.
sudo qeli list-clientsкто сейчас подключёнsudo qeli kick <user>отключить пользователяsudo qeli disable-user <user>заблокировать (отключить + запретить реконнект)sudo qeli enable-user <user>снова разрешить входsudo qeli set-bandwidth <user> <mbps>лимит скорости (0 = без лимита)sudo qeli show-routes <user>маршруты пользователяsudo qeli list-blockedIP, заблокированные защитой VPN-входаsudo qeli unblock <ip>снять блокировку с IP; --all — со всехsudo qeli rotate-identity <profile>сменить ключ сервера у профиляsudo qeli set-web-passwordзадать пароль входа в веб-панельУправление через браузер
Панель управляет профилями, пользователями, группами, маршрутами, ключами и резервными копиями. Вход защищён Argon2id, CSRF и отдельной защитой от перебора. Ниже три самостоятельных сценария — не смешивайте их параметры в одном конфиге.
Общий шаг · Пароль панели
Добавьте параметры одного из вариантов ниже, затем выполните команду: без аргументов она сгенерирует стойкий пароль, покажет его один раз и добавит в ту же секцию username и password_hash. Для своего пароля используйте --password-stdin, а не небезопасный аргумент --password.
$ sudo qeli set-web-password
$ sudo systemctl restart qeli
Вариант A · Только loopback и SSH-туннель
Самый безопасный вариант и значение автоустановщика по умолчанию: панель слушает только сервер. После изменения адреса или TLS нужен полный restart.
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 127.0.0.1
port = 8080
tls = true
csrf = true
session_ttl_secs = 86400
update_check = false
brute_force.max_attempts = 5
$ ssh -L 8080:127.0.0.1:8080 root@vpn.example.com
# затем откройте https://127.0.0.1:8080
Вариант B · Прямой публичный HTTPS
Публикуйте панель напрямую только с TLS и непустым allowed_ips. Укажите свой реальный IP или CIDR: тестовый адрес ниже не даст вам войти.
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 0.0.0.0
port = 8080
tls = true
allowed_ips = 203.0.113.4
public_host = vpn.example.com
allowed_origins = vpn.example.com:8080
csrf = true
Вариант C · За reverse-proxy
TLS завершается на прокси, а Qeli остаётся на loopback. В trusted_proxies укажите адрес самого прокси; allowed_origins должен совпадать с браузерным host. Проксируйте префикс без его срезания.
[web]
# username и password_hash добавит qeli set-web-password
enabled = true
bind = 127.0.0.1
port = 8080
tls = false
base_path = /qeli
allowed_origins = panel.example.com
trusted_proxies = 127.0.0.1
secure_cookie = true
csrf = true
Если панель отвечает 403: на обычном GET сначала проверьте allowed_ips; если страница открывается, но сохранение даёт 403 — проверьте allowed_origins. Параметры сокета (enabled, bind, port, tls, base_path) применяются только после полного restart.
Резервная копия и восстановление
Кнопка резервной копии в панели создаёт проверенный архив /etc/qeli с конфигом, пользователями и ключами сервера. Машинный ключ /var/lib/qeli/panel-secret.key намеренно в него не входит. Поэтому для полного аварийного восстановления сохраните и /etc/qeli, и /var/lib/qeli; архив содержит секреты и должен храниться зашифрованным.
$ sudo systemctl stop qeli
$ sudo tar --xattrs --acls -C / -czf /root/qeli-backup-0.8.1.tar.gz etc/qeli var/lib/qeli
$ sudo systemctl start qeli
$ sudo tar -tzf /root/qeli-backup-0.8.1.tar.gz
Перед восстановлением проверьте список файлов, остановите службу и сохраните текущее состояние отдельно. После возврата файлов восстановите владельца qeli:qeli и строгие права на секреты, выполните sudo qeli check-config --config /etc/qeli/server.conf и только затем запускайте службу. Панель умеет безопасно проверить и восстановить созданный ею архив /etc/qeli, но не заменяет полную копию /var/lib/qeli.
Диагностика типовых проблем
Сначала проверьте конфиг, состояние службы и журнал. Затем отделите проблему туннеля от NAT, DNS и доступа к панели.
sudo qeli check-config --config /etc/qeli/server.confсинтаксис, пользователи, профили и конфликтыsudo systemctl status qeli --no-pagerстатус службы и последняя ошибкаsudo journalctl -u qeli -n 200 --no-pagerпоследние 200 строк журналаsudo sysctl net.ipv4.ip_forwardдля full-tunnel значение должно быть 1sudo iptables-save | grep qeli-natпроверить правила NAT, созданные QeliТуннель поднялся, но интернета нет — проверьте routing.nat.enabled = true, forwarding и правила firewall. TCP-сайты зависают — проверьте MSS clamp и MTU. Панель отдаёт 403 — сверяйте allowed_ips, allowed_origins и адрес доверенного прокси. Если проблема появилась после ручной правки, помните: комментарий допустим только на отдельной строке.
Удаление Qeli
Сначала остановите службу и удалите пакет. Конфигурация и состояние оставляются намеренно, чтобы установку можно было восстановить.
$ sudo systemctl disable --now qeli
$ sudo apt remove qeli
Необратимо: удаляйте /etc/qeli, /var/lib/qeli и /var/log/qeli только после проверенной резервной копии. Это сотрёт серверные ключи, пользователей и машинный ключ расшифровки password_enc; существующие конфиги клиентов нельзя будет перевыпустить с прежней идентичностью.
$ sudo rm -rf /etc/qeli /var/lib/qeli /var/log/qeli