Веб-панель для amnezia-box (форк sing-box). Один бинарник со встроенным интерфейсом, два сценария: VPN-роутер для домашней сети и панель управления прокси-сервером на VPS.
| Сервер: панель на VPS | Клиент: роутер дома | |
|---|---|---|
| Что делает | Управляет VPN-сервером: протоколы, пользователи, подписки | Направляет трафик домашней сети через VPN: целиком или только выбранные сайты |
| Установка | vps-install.sh или Docker |
install.sh |
| Доступ | https://домен:8443, TLS-сертификат Let's Encrypt выпускается автоматически |
http://IP-роутера:8080 |
| Авторизация | Обязательна, пароль администратора генерируется при установке | Опциональна |
| Что подключается | Клиенты пользователей — по ссылке-подписке, QR-коду или файлу конфигурации | AmneziaWG / WireGuard, VLESS, Hysteria2, NaiveProxy, Mieru — по ссылке или файлу |
Режим задаётся ключом mode в настройках; интерфейс показывает только разделы своего режима.
Возможности
Маршрутизация
- Готовые списки: Antizapret, geosite/geoip rule-sets; свои списки доменов
- Приоритет правил перетаскиванием, продвинутые правила по домену, IP, порту, процессу
- Настройка DNS-серверов и DNS-правил
- Route Inspector: проверка, каким правилом и куда уйдёт запрос
Подключения (клиентская сторона)
- Эндпоинты AmneziaWG (включая обфускацию AWG 1.0/2.0/3.0) и WireGuard — импорт из
.conf - Аутбаунды VLESS, Hysteria2, NaiveProxy, Mieru — импорт по ссылкам
vless://,hy2://,naive+https://,mierus:// - Группы selector и urltest, подписки с автообновлением
Сервер (режим VPS)
- Инбаунды VLESS (в том числе Reality), Hysteria2, NaiveProxy, Mieru; транспорты raw / ws / grpc / httpupgrade / xhttp
- Сервер AmneziaWG (включая версию AWG 3.0) без модуля ядра, с обфускацией и профилями маскировки; выдача клиентам QR-кода,
.confи sing-box JSON - Пользователи: ссылки-подписки, сроки действия, включение и отключение, учёт трафика
- Telegram-прокси (MTProto) внутри самой панели: у каждого клиента свой секрет и своя ссылка
tg://proxy, отдельный счётчик трафика и срок действия; ссылку можно отозвать, не трогая остальных. В Telegram можно ходить напрямую или через любой outbound/endpoint из конфига
Мониторинг
- Трафик в реальном времени с историей, разбивка по аутбаундам
- Активные соединения с флагами стран (GeoIP), цепочкой узлов и объёмами
- Логи amnezia-box и журнал systemd
Обслуживание
- Проверка и установка обновлений RouteBox и amnezia-box из панели
- Валидация конфигурации перед применением, черновики и откат изменений
Требования:
- VPS на Linux (amd64 или arm64), права root. Для установки на голое железо — systemd.
- Домен с A/AAAA-записью на IP сервера — обязателен: по нему выпускается TLS-сертификат панели. По «голому» IP панель не откроется: сертификат выпускается на домен, и по IP TLS-соединение не установится.
- Порты
8443/tcp(панель) и80/tcp(HTTP-01 проверка Let's Encrypt; должен оставаться открытым — продления идут по нему же).
Три способа: скрипт на голое железо, скрипт для Docker и compose вручную. Все поднимают одну и ту же панель, состояние и настройки совместимы.
Скрипт: vps-install.sh
Первый запуск лучше делать с флагом --staging — он использует тестовый каталог Let's Encrypt и не расходует лимит выпуска сертификатов:
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/vps-install.sh \
| sudo bash -s -- --domain panel.example.com --email you@example.com --stagingКогда всё работает, повторный запуск без --staging переключает панель на боевой сертификат:
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/vps-install.sh \
| sudo bash -s -- --domain panel.example.com --email you@example.comФлаги:
--domain— домен панели (без него установщик спросит интерактивно);--email— контакт для Let's Encrypt;--port <n>— порт панели (по умолчанию8443);--staging— тестовый CA Let's Encrypt.
Скрипт проверяет DNS, ставит оба бинарника с проверкой sha256, настраивает systemd и firewall. Порты 8443/tcp и 80/tcp он откроет в ufw, если тот активен; порты 443 и 22 не трогает. Сертификат RouteBox выпускает и продлевает сам — nginx и certbot не нужны.
Панель доступна на https://panel.example.com:8443 — открывайте по домену, не по IP. Логин admin, пароль генерируется при первом старте и сохраняется в /etc/routebox/routebox-initial-password (также виден в journalctl -u routebox). Смените его после входа в разделе App Settings → Security.
Docker: установка скриптом
Скрипт спрашивает домен, порты и кто держит TLS, смотрит, что уже есть на хосте, и встраивается в это. Compose-файл и каталог с данными он создаёт сам.
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/docker-install.sh | sudo bashБез nginx на хосте панель держит TLS сама: сертификат выпускает встроенный ACME, наружу открываются порт панели и 80 для проверки Let's Encrypt.
С nginx на хосте панель уходит на loopback, а наружу смотрит nginx: скрипт выпускает сертификат через certbot, пишет свой vhost и перечитывает конфигурацию. Чужие файлы он не правит, а если домен уже кем-то занят — останавливается и просит другой поддомен.
Для nginx-ветки нужен certbot: если его нет и готового сертификата тоже, скрипт остановится и предложит либо поставить certbot, либо вернуться к встроенному ACME.
Если на 443 никто, кроме nginx, не сидит, а модуль stream доступен, скрипт предложит SNI-роутер: тогда на 443 живут и панель, и инбаунд — nginx разводит их по домену из TLS-приветствия. Инбаунд после этого создаётся в панели с портом 443, порт под него уже проброшен. Hysteria2, Mieru и AmneziaWG так не отдать: это UDP, им нужен свой порт.
Если TLS держит Caddy, Traefik или nginx в контейнере, скрипт ставит панель на loopback и печатает готовую конфигурацию для вашего прокси — сам он её не применяет.
Повторный запуск спрашивает только каталог и дальше обновляет образ. Удаление — sudo bash docker-install.sh --uninstall, данные при этом остаются (--purge удаляет и их); файлы nginx скрипт сносит только свои, по маркеру в первой строке. Посмотреть, что получится, ничего не трогая: --dry-run.
Docker Compose вручную
Образ собран на базовом образе LinuxServer.io и поддерживает только режим панели. Роутеру нужны TUN и роль шлюза локальной сети — в контейнере этого нет, для него есть install.sh.
curl -fsSLO https://raw.githubusercontent.com/hoaxisr/routebox/source/docker-compose.yml
# впишите свой домен в PUBLIC_HOST и почту в ACME_EMAIL
docker compose up -dПанель поднимется на https://ваш-домен:8443 и сама выпустит сертификат. Пароль администратора она генерирует при первом старте и кладёт в /config/routebox-initial-password; он же виден в docker compose logs routebox.
Всё состояние лежит в одном volume /config: routebox.toml, конфиг и бинарник amnezia-box, база GeoIP, traffic.db, кэш ACME, ключи сервера AmneziaWG. Внутри контейнера /etc/routebox и /etc/amnezia/amneziawg — симлинки туда же.
Переменные окружения контейнер читает один раз, когда создаёт routebox.toml. Дальше настройки живут в файле, и панель правит его же, так что домен после первого запуска меняйте в /config/routebox.toml. Если PUBLIC_HOST разойдётся с файлом, контейнер напишет об этом в лог.
| Переменная | Назначение |
|---|---|
PUBLIC_HOST |
домен панели; попадает в ссылки-подписки |
PUBLIC_PORT |
порт, по которому панель видят клиенты (по умолчанию — из LISTEN) |
ACME_EMAIL |
контакт для Let's Encrypt |
ACME_ENABLED |
false, если TLS терминирует прокси |
ACME_STAGING |
тестовый CA Let's Encrypt на время проверки |
ACME_HTTP_ADDR |
адрес слушателя HTTP-01, если :80 внутри контейнера занят |
LISTEN |
адрес и порт панели внутри контейнера |
TRUSTED_PROXIES |
адреса прокси, чьему X-Forwarded-For можно верить |
PUID / PGID |
владелец файлов в /config |
Домен panel.example.com из примера контейнер игнорирует: сертификат на чужой домен всё равно не выпустится, а неудачные проверки расходуют лимит Let's Encrypt.
Бинарник amnezia-box контейнер копирует из образа в /config/bin при первом запуске. Дальше он живёт на volume, поэтому обновление из панели работает и переживает пересоздание контейнера; уже установленный бинарник образ не трогает. systemd в контейнере нет, процесс запускает сам RouteBox при каждом старте — если конфиг и бинарник на месте. Start/Stop/Restart в панели работают как обычно.
Наружу открыты 8443 (панель) и 80: по нему Let's Encrypt проверяет домен, в том числе при продлении. Инбаунды amnezia-box вы настраиваете в панели и публикуете сами через ports:. Панель работает не под root, но Docker выставляет в контейнерах net.ipv4.ip_unprivileged_port_start=0, так что порт меньше 1024 занимается и без NET_BIND_SERVICE. Если ваш runtime так не умеет, добавьте cap_add: [NET_BIND_SERVICE] или дайте инбаунду порт от 1024 и пробросьте его на нужный ("443:8444").
Обновление образа:
docker compose pull && docker compose up -dРаздел Updates работает и здесь: amnezia-box ставится прямо из панели, и обновление остаётся после docker compose up -d, потому что бинарник лежит на volume. Свой бинарник RouteBox берёт из образа, поэтому вместо кнопки показывает ту же команду с именем сервиса: docker compose pull routebox && docker compose up -d routebox.
За обратным прокси: nginx, Caddy, Traefik
Если TLS уже держит nginx, Caddy или Traefik, встроенный ACME не нужен: RouteBox отдаёт панель по обычному HTTP, а сертификат остаётся заботой прокси. Порт 80 наружу не публикуется, ACME_EMAIL можно не задавать.
environment:
- PUID=1000
- PGID=1000
# Адрес, по которому панель видят клиенты: адрес прокси, а не контейнера.
- PUBLIC_HOST=panel.example.com
- PUBLIC_PORT=443
- ACME_ENABLED=false
# Чьему X-Forwarded-For верить: только адрес самого прокси.
- TRUSTED_PROXIES=172.28.0.2/32
networks: [proxynet]
ports: []
expose:
- "8443"Адрес прокси в той же сети при этом закрепляется:
<сервис прокси>:
networks:
proxynet:
ipv4_address: 172.28.0.2
networks:
proxynet:
ipam:
config:
- subnet: 172.28.0.0/24
# Docker раздаёт адреса с начала подсети и статику не резервирует,
# так что динамический диапазон лучше увести от закреплённого .2.
ip_range: 172.28.0.128/25TRUSTED_PROXIES лучше задать сразу. На адресе клиента держатся блокировка перебора пароля и лимит запросов к публичному /sub/{token}, а из-за прокси все клиенты приходят с одного адреса и считаются за одного: лимит подписок срабатывает через несколько запросов и накрывает всех. Заголовку RouteBox верит только с перечисленных адресов, с остальных смотрит на реальный адрес соединения — подделать не выйдет. Из цепочки он берёт самый правый адрес, которого нет в списке.
В списке должен быть адрес прокси, а не подсеть docker-сети. Подсеть — это все контейнеры в ней: скомпрометированный сосед пришлёт панели поддельный X-Forwarded-For напрямую и обойдёт блокировку перебора пароля. Отсюда и фиксированный ipv4_address у прокси, и /32 в списке. Если в сети включён IPv6, закрепите и ipv6_address и добавьте его тоже: Docker отвечает на DNS-запрос сначала AAAA, прокси придёт по ULA-адресу, а адрес, которого нет в списке, доверенным не считается — и предупреждения об этом не будет. Про X-Forwarded-For с неизвестного адреса RouteBox пишет в лог один раз на адрес.
Прокси должен пробрасывать WebSocket — по ним на дашборд идут трафик, логи и список соединений — и передавать X-Forwarded-Proto, иначе cookie сессии останется без флага Secure.
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://routebox:8443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Дашборд держит WebSocket открытым, с таймаутом по умолчанию он рвётся.
proxy_read_timeout 3600s;
proxy_buffering off;
}
}
# в http-блоке:
# map $http_upgrade $connection_upgrade { default upgrade; "" close; }Caddy — X-Forwarded-* и WebSocket из коробки:
panel.example.com {
reverse_proxy routebox:8443
}Этот конфиг покрывает только панель и подписки. Инбаунды amnezia-box публикует сам контейнер своими портами: UDP-протоколы и raw-транспорты через HTTP-прокси не пройдут в принципе.
Telegram-прокси (MTProto)
Прокси поднимает сама панель, отдельного контейнера и второго бинарника не нужно. Страница «Telegram» есть только в режиме VPS.
У каждого клиента свой секрет: ссылку можно отозвать отдельно, а трафик считается по клиентам.
Порт по умолчанию — 9443: 443 обычно занят обратным прокси, 8443 — самой панелью. В Docker опубликуйте его:
ports:
- "9443:9443" # порт из настроек панелиЕсли 443 уже держит nginx с ssl_preread, прокси можно завести за ним по SNI и не открывать отдельный порт. Клиенты Telegram отправляют домен маскировки в SNI — по нему и маршрутизируем:
stream {
map $ssl_preread_server_name $backend {
www.microsoft.com routebox:9443; # домен маскировки -> MTProto
default panel_backend;
}
server {
listen 443;
ssl_preread on;
proxy_pass $backend;
}
}Домен маскировки входит в секрет каждого клиента. Прокси притворяется этим сайтом, и туда же уходит всё, что не прошло проверку. Менять домен после раздачи ссылок нельзя: перестанут работать все выданные. Панель предупреждает об этом перед сохранением. Берите сайт, куда ваши пользователи и так ходят по HTTPS.
В ссылки идут «Внешний хост» и «Внешний порт» из настроек страницы, а не адрес прослушивания: за обратным прокси или SNI-маршрутизатором это разные вещи. Пока хост или домен не заданы, кнопки ссылки и QR неактивны. Ссылка без них выглядит правильной, но в Telegram не сработает.
Выход в Telegram. По умолчанию прокси ходит к серверам Telegram напрямую, с адреса этого сервера. В настройках можно выбрать любой outbound или endpoint из конфигурации sing-box — WARP, hysteria2 до другой машины, selector, — и трафик пойдёт туда.
Отдать внешнему процессу конкретный outbound sing-box не умеет, поэтому под выбранный тег RouteBox сам дописывает в конфиг две вещи:
"inbounds": [
{ "type": "socks", "tag": "mtproto-socks", "listen": "127.0.0.1", "listen_port": 1080 }
],
"route": { "rules": [
{ "inbound": ["mtproto-socks"], "outbound": "ionos-hy2" }
] }Правило встаёт первым, чтобы его не перехватило чьё-нибудь общее правило ниже. Оба объекта принадлежат RouteBox: править и удалять их вручную нельзя (как и endpoint awg-server), они появляются и исчезают вместе с настройкой. Выбор «напрямую» убирает и inbound, и правило. Слушает только 127.0.0.1 — открытый наружу SOCKS без пароля быстро находят и начинают использовать не по назначению.
Смена выхода переписывает активный конфиг и перезагружает amnezia-box: живые VPN-подключения на секунду рвутся. Пока в конфиге есть неприменённые изменения, настройка не сохраняется — сначала примените или отбросьте черновик. В списке выходов нет awg-server: это точка входа для пиров, а не выход, и трафик Telegram в ней просто пропадёт.
Настройку можно задать и руками — outbound в блоке [mtproto]; при старте RouteBox сам приведёт конфиг sing-box в соответствие.
Если выбранный выход отвалится, подключения к Telegram будут падать, а не молча уходить напрямую: тихий откат означал бы трафик с собственного IP сервера, ровно то, ради чего выход и выбирали. Доменный фронтинг остаётся прямым намеренно — запрос к маскировочному сайту должен выглядеть как обычный визит, а не как визит из чужого VPN-выхода.
Рекламных каналов (adtag) нет: mtglib их не поддерживает.
Бэкенд kernel для AmneziaWG в Docker
Бэкенд kernel в образе работает, но требует подготовки хоста: модуль, права и порт — всё ниже. По умолчанию сервер AmneziaWG поднимается на singbox: ему не нужны ни модуль ядра, ни особые права.
Для kernel понадобятся модуль amneziawg, загруженный на хосте (пакет amneziawg-dkms с заголовками ядра, затем modprobe amneziawg), права NET_ADMIN у контейнера и проброшенный UDP-порт сервера — он не HTTP и через обратный прокси не пойдёт. amneziawg-tools уже в образе. Панель проверяет инструменты и права заранее и при нехватке отказывает, называя, чего именно не хватает.
cap_add:
- NET_ADMIN
sysctls:
- net.ipv4.ip_forward=1
ports:
- "51820:51820/udp" # порт сервера AmneziaWG из настроек панелиRouteBox передаёт права через ambient set, поэтому их видят awg-quick и запускаемые им ip и iptables, а сам процесс панели остаётся под пользователем PUID. Их наследуют и дочерние процессы, включая amnezia-box, — привилегия расползается шире, чем хотелось бы, поэтому без нужды бэкенд kernel не включайте. Без cap_add панель работает как раньше, без привилегий.
AWG 3.0 (защита заголовков, CPA/RAT) на этом бэкенде доступна, если и модуль ядра, и amneziawg-tools на хосте версии 3.x. Версию загруженного модуля панель читает из sysfs; если модуль ещё не загружен, она спрашивает modinfo, которому нужен смонтированный /lib/modules:/lib/modules:ro. Панель проверяет их независимо, так что свежий модуль со старыми инструментами тоже считается неподдерживаемым. На бэкенде singbox AWG 3.0 доступна всегда и от версии модуля не зависит.
Требования: Linux (amd64 или arm64) с systemd, права root. В Docker этот режим не поднимается — ему нужны TUN и роль шлюза локальной сети.
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/install.sh | sudo bashСкрипт скачивает последние релизы RouteBox и amnezia-box, кладёт настройки в /etc/routebox/, скачивает базу GeoIP, включает IP-forwarding и создаёт systemd-сервисы routebox и amnezia-box.
Дальше:
sudo systemctl start routebox- Откройте
http://IP-устройства:8080. - Добавьте подключение: AmneziaWG и WireGuard импортируются из
.confв разделе Endpoints; VLESS, Hysteria2, NaiveProxy и Mieru — по ссылке в Outbounds. - В разделе Routes выберите, что маршрутизировать через VPN — весь трафик или списки сайтов.
- На устройствах домашней сети укажите IP роутера как шлюз (или раздайте его по DHCP).
В обоих режимах: раздел Updates в панели проверяет и ставит новые версии RouteBox и amnezia-box. Список изменений — в CHANGELOG.md.
Из консоли:
# Сервер: конфигурация и сертификат сохраняются
sudo bash vps-install.sh --update
# Сервер в Docker
docker compose pull && docker compose up -d
# Клиент: повторный запуск установщика обновляет бинарники, настройки не трогает
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/install.sh | sudo bash# Сервер; --purge дополнительно удаляет /etc/routebox и /etc/amnezia-box
sudo bash vps-install.sh --uninstall
# Сервер в Docker; данные остаются в ./config
docker compose down
# Клиент (каталоги настроек остаются)
curl -fsSL https://raw.githubusercontent.com/hoaxisr/routebox/main/install.sh | sudo bash -s -- --uninstallКонфигурация: routebox.toml и GeoIP
Настройки приложения хранятся в /etc/routebox/routebox.toml (пример с комментариями). Большинство параметров также доступно в панели в разделе App Settings.
| Секция | Описание |
|---|---|
[geoip] |
Путь к MMDB-базе, включение GeoIP |
[ui] |
Язык (en/ru), единицы скорости (биты или байты) |
[monitoring] |
GeoIP-обогащение соединений |
[security] |
Авторизация панели, CORS, таймаут сессии, trusted_proxies — чьему X-Forwarded-For верить |
[network] |
Адрес и порт панели, таймауты, сжатие, TLS (свой сертификат или встроенный ACME/Let's Encrypt) |
[server] |
Режим (router/vps), публичный хост и порт для ссылок-подписок |
[singbox] |
Путь к конфигу и бинарнику amnezia-box (config_path, binary_path; пустые — автопоиск), адрес Clash API, адрес v2ray-статистики. systemd-юнит определяется сам: сначала amnezia-box, потом sing-box |
[updates] |
Ежедневная автопроверка обновлений |
[awg] |
Сервер AmneziaWG: интерфейс, подсеть, порт, DNS, бэкенд, обфускация |
[mtproto] |
Telegram-прокси: адрес прослушивания, домен маскировки, внешние хост и порт для ссылок, outbound для выхода в Telegram и socks_port под него |
[advanced] |
Интервалы WebSocket-пинга |
Установщик скачивает базу IPLocate ip-to-country в /etc/routebox/geoip.mmdb — флаги стран в мониторе соединений работают сразу. Ручное обновление базы:
sudo curl -fsSL -o /etc/routebox/geoip.mmdb \
https://github.com/iplocate/ip-address-databases/raw/main/ip-to-country/ip-to-country.mmdb
sudo systemctl restart routeboxОбновление можно повесить на cron (с перезапуском сервиса). Подходит любая MMDB-база (IPInfo, MaxMind GeoLite2) — укажите путь в path.
Параметры запуска и приоритет настроек
routebox [флаги]
routebox version # версия
--settings PATH Путь к routebox.toml (по умолчанию: авто-поиск)
--config PATH Путь к конфигу amnezia-box (переопределяет settings)
--listen ADDR Адрес веб-интерфейса (переопределяет settings)
--geoip PATH Путь к GeoIP MMDB (переопределяет settings)
--binary PATH Путь к бинарнику amnezia-box (переопределяет settings)
--clash ADDR Адрес Clash API (по умолчанию берётся из конфига amnezia-box)
--mode MODE Режим панели: router (по умолчанию) или vps
Приоритет: флаги командной строки → routebox.toml → авто-определение → значения по умолчанию.
В режиме router нужен root: RouteBox создаёт TUN-интерфейс и управляет системными сервисами. В режиме vps root не обязателен — в Docker панель и работает под пользователем PUID.
REST API
Все эндпоинты, кроме /api/health и /api/auth/login, /logout, /session, требуют сессию, если авторизация включена. Основные:
| Endpoint | Описание |
|---|---|
GET /api/status |
Статус процесса amnezia-box |
GET / PUT /api/config |
Полный конфиг sing-box |
POST /api/config/apply |
Применить изменения (reload/restart) |
POST /api/config/fix-unit |
Перенацелить systemd-юнит на конфиг, которым управляет RouteBox (drop-in) |
DELETE /api/config/unit-dropin |
Снять этот drop-in — обратная операция к fix-unit |
POST /api/config/adopt-unit-path |
Перейти на путь конфига из ExecStart юнита (второе лечение расхождения) |
CRUD /api/endpoints, /api/outbounds, /api/inbounds |
Подключения |
CRUD /api/route/rules, /api/route/rule-sets |
Маршрутизация |
CRUD /api/dns/servers, /api/dns/rules |
DNS |
CRUD /api/users |
Пользователи панели (режим vps) |
/api/awg/* |
Сервер AmneziaWG: статус, пиры, конфиги |
GET / PUT /api/settings |
Настройки RouteBox |
GET /api/clash/* |
Прокси к Clash API |
WS /api/clash/traffic, /api/clash/connections, /api/clash/logs |
Данные в реальном времени |
GET /sub/{token} |
Публичная ссылка-подписка пользователя |
Ручная установка и systemd
Подходит для обоих режимов: разница только в mode в routebox.toml.
Бинарники публикуются в GitHub Releases:
# amd64; для arm64 замените суффикс
curl -fsSL -o routebox \
https://github.com/hoaxisr/routebox/releases/latest/download/routebox-linux-amd64
curl -fsSL -O \
https://github.com/hoaxisr/routebox/releases/latest/download/routebox-linux-amd64.sha256
sha256sum -c routebox-linux-amd64.sha256 --ignore-missing || echo "checksum mismatch"
chmod +x routebox
sudo cp routebox /usr/local/bin/
sudo mkdir -p /etc/routebox /etc/amnezia-boxТакже понадобится бинарник amnezia-box из релизов форка в /usr/local/bin/amnezia-box.
Systemd-сервис:
sudo tee /etc/systemd/system/routebox.service << 'EOF'
[Unit]
Description=RouteBox - VPN Router Web UI
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/routebox --settings /etc/routebox/routebox.toml
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now routeboxДля работы в режиме роутера включите IP-forwarding:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.confСборка из исходников
Понадобятся Go 1.25+ и Node.js с npm.
git clone https://github.com/hoaxisr/routebox
cd routebox
# Фронтенд (SvelteKit -> статика, встраивается в бинарник)
cd frontend && npm install && npm run build && cd ..
rm -rf backend/internal/embedded/dist/*
cp -r frontend/build/* backend/internal/embedded/dist/
# Бэкенд
go build -ldflags "-X main.Version=$(sed -n 's/.*"version": "\(.*\)".*/\1/p' frontend/package.json)" \
-o routebox ./backend/cmd/routebox
sudo ./routeboxMIT