Перейти к содержимому

Внешний доступ к API

Панель Remnawave умеет отдавать свой API внешним клиентам: ботам, панелям управления, статистике. По умолчанию скрипт прячет всё за cookie-защитой или страницей входа, поэтому наружу выходит только то, что вы откроете сами: один location в nginx.conf, а дальше любой запрос проходит ту же защиту, что и браузер, плюс токен панели (Настройки → API-токены).

Шаг 1. Публичный путь

Маршрут /api/ в nginx.conf или Caddyfile: API открывается наружу, токен панели остаётся.

Шаг 2. Ваш способ входа

Кука, страница входа TinyAuth или ключ Caddy: что выбрано при установке панели.

Токен везде

Authorization: Bearer … отправляется в каждом запросе независимо от способа входа.

Блок одинаков для всех вариантов установки («только панель» и «панель + нода»).

  1. Откройте конфигурацию nginx:

    root@server: ~
    nano /opt/remnawave/nginx.conf
  2. В блок сервера с доменом панели (server_name panel.example.com;) добавьте location: он выводит /api/ из-под проверки cookie и отдаёт запросы напрямую панели:

    nginx.conf
    location ^~ /api/ {
    proxy_http_version 1.1;
    proxy_pass http://remnawave;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    }
  3. Перезапустите веб-сервер, чтобы конфигурация применилась:

    root@server: ~
    cd /opt/remnawave && docker compose restart remnawave-nginx
  4. Проверьте доступность снаружи (запрос без токена должен вернуть ошибку авторизации, а не таймаут):

    root@server: ~
    curl -i https://panel.example.com/api/nodes

Дальше всё зависит от способа защиты панели, выбранного при установке. Токен панели (Authorization: Bearer …) отправляется в каждом запросе поверх любого из вариантов.

Скрипт генерирует случайную пару ИМЯ=ЗНАЧЕНИЕ. Откройте nginx.conf и найдите строку map $http_cookie $auth_cookie, ваши данные это значение после ~*:

map $http_cookie $auth_cookie {
default 0;
"~*zIdejKtN=MWbLrRzx" 1;
}

Здесь кука zIdejKtN=MWbLrRzx.

На примере HTTP-клиента httpx и записи COOKIES в .env вашего проекта:

.env
COOKIES={"zIdejKtN":"MWbLrRzx"}
token = os.getenv("API_TOKEN", "")
base_url = os.getenv("REMNAWAVE_BASE_URL", "")
cookies = json.loads(os.getenv("COOKIES", "{}"))
async def get_all_nodes():
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + token
}
async with httpx.AsyncClient(cookies=cookies) as async_client:
response = await async_client.get(f"{base_url}/api/nodes", headers=headers)
return response.json()

Быстрая проверка curl:

root@server: ~
curl -b "zIdejKtN=MWbLrRzx" -H "Authorization: Bearer <токен>" https://panel.example.com/api/nodes

Установка «только страница подписки» спрашивает способ защиты панели и подставляет всё сама: при TinyAuth достаточно ввести логин и пароль страницы входа: base64-пару установщик собирает самостоятельно.

Защита панели Что спрашивает инсталлер Переменная в compose страницы подписки
Cookie-защита кука ИМЯ=ЗНАЧЕНИЕ EGAMES_COOKIE=ИМЯ=ЗНАЧЕНИЕ
Страница входа (TinyAuth) логин и пароль CADDY_AUTH_API_TOKEN=Basic base64(...)
Caddy с MFA ключ со страницы входа CADDY_AUTH_API_TOKEN=<ключ>