docs: publish relay beta repo

This commit is contained in:
Андрей Бобырев
2026-06-05 17:59:26 +03:00
parent 7e8edae777
commit 166d3316ca
5 changed files with 72 additions and 2 deletions

View File

@@ -1,6 +1,10 @@
# WARP Web UI # WARP Web UI
Веб-панель для управления **Cloudflare WARP** на Linux: подключение и отключение туннеля, активация WARP+, настройка SOCKS-прокси и готовые пресеты для **3x-ui** и **Amnezia Xray**. Веб-панель для управления **Cloudflare WARP** на Linux: подключение и отключение туннеля, активация WARP+, настройка SOCKS-прокси, готовые пресеты для **3x-ui**/**Amnezia Xray** и beta-модуль **WARP Relay**.
![WARP Web UI dashboard](docs/images/dashboard.png)
![WARP Relay beta](docs/images/warp-relay-beta.png)
Документация на английском (кратко): [README.en.md](README.en.md). Документация на английском (кратко): [README.en.md](README.en.md).
@@ -10,6 +14,7 @@
- **Аккаунт**: информация о регистрации, применение лицензионного ключа WARP+ - **Аккаунт**: информация о регистрации, применение лицензионного ключа WARP+
- **Установка и удаление** пакета `cloudflare-warp` прямо из браузера (репозиторий Cloudflare для Debian/Ubuntu) - **Установка и удаление** пакета `cloudflare-warp` прямо из браузера (репозиторий Cloudflare для Debian/Ubuntu)
- **SOCKS-прокси**: смена порта `warp-cli proxy` (часто `40000` или `1024`) - **SOCKS-прокси**: смена порта `warp-cli proxy` (часто `40000` или `1024`)
- **WARP Relay beta**: UDP relay через `nftables`/`iptables` на выбранный WARP/WireGuard endpoint, single-port или Cloudflare multiport
- **Пресет 3x-ui**: outbound `warp-socks``127.0.0.1:ПОРТ` и правило маршрутизации `geosite:google` - **Пресет 3x-ui**: outbound `warp-socks``127.0.0.1:ПОРТ` и правило маршрутизации `geosite:google`
- **Пресет Amnezia**: мост Docker `172.17.0.1:11025` → SOCKS на хосте, маршрутизация WARP для выбранных клиентов с понятными именами - **Пресет Amnezia**: мост Docker `172.17.0.1:11025` → SOCKS на хосте, маршрутизация WARP для выбранных клиентов с понятными именами
@@ -18,6 +23,7 @@
- Linux (рекомендуется Debian/Ubuntu) - Linux (рекомендуется Debian/Ubuntu)
- `python3` — только стандартная библиотека, без pip - `python3` — только стандартная библиотека, без pip
- `systemd` - `systemd`
- `nftables` или `iptables` для WARP Relay beta
- По желанию: пакет `cloudflare-warp` (можно поставить из UI или скриптом `scripts/warp-install-cf.sh`) - По желанию: пакет `cloudflare-warp` (можно поставить из UI или скриптом `scripts/warp-install-cf.sh`)
- Для интеграций: `docker`, `socat`, панель **3x-ui** и/или **Amnezia** - Для интеграций: `docker`, `socat`, панель **3x-ui** и/или **Amnezia**
@@ -29,6 +35,12 @@
curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/install.sh | sudo bash curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/install.sh | sudo bash
``` ```
Beta-репозиторий с WARP Relay:
```bash
curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI-Relay-Beta/main/install.sh | sudo bash
```
Установщик **задаёт вопросы** (можно нажать Enter для значения по умолчанию): Установщик **задаёт вопросы** (можно нажать Enter для значения по умолчанию):
| Вопрос | По умолчанию | Зачем это нужно | | Вопрос | По умолчанию | Зачем это нужно |
@@ -56,6 +68,12 @@ sudo bash install.sh
curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/uninstall.sh | sudo bash curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI/main/uninstall.sh | sudo bash
``` ```
Beta-репозиторий:
```bash
curl -fsSL https://raw.githubusercontent.com/andrey271192/WARP-Web-UI-Relay-Beta/main/uninstall.sh | sudo bash
```
Или из каталога клона: `sudo bash uninstall.sh` — останавливает сервис, по запросу удаляет файлы приложения, конфигурацию и при желании пакет `cloudflare-warp`. Или из каталога клона: `sudo bash uninstall.sh` — останавливает сервис, по запросу удаляет файлы приложения, конфигурацию и при желании пакет `cloudflare-warp`.
## Структура репозитория ## Структура репозитория
@@ -98,6 +116,20 @@ install.sh / uninstall.sh # Установка и снятие «в одн
Нужны `docker`, контейнер Amnezia Xray и переменные `AMNEZIA_*` при нестандартных путях — см. `.env.example`. Нужны `docker`, контейнер Amnezia Xray и переменные `AMNEZIA_*` при нестандартных путях — см. `.env.example`.
## WARP Relay beta
`openwarpkit/warp-relay` взят как идея и встроен без запуска внешнего интерактивного скрипта. Панель сама управляет только своими firewall rules с тегом `WR_WEBUI_RELAY`.
Что можно делать из UI:
- выбрать endpoint: `engage.cloudflareclient.com`, IPv4 или свой hostname;
- выбрать source IP сервера или оставить автоопределение;
- включить single UDP port, обычно `4500 -> 4500`;
- включить Cloudflare multiport mode;
- удалить только managed relay rules.
Важно: relay не гарантирует конкретный Cloudflare exit IP или страну. Он меняет WARP/WireGuard endpoint, через который клиент подключается. Для "желаемой точки" сейчас используйте ручной endpoint/IP; автоматический список точек и latency probe запланированы.
## Безопасность ## Безопасность
- **Только HTTP Basic Auth** — учётные данные передаются с каждым запросом. В продакшене ставьте **HTTPS** (обратный прокси: nginx, Caddy + TLS). - **Только HTTP Basic Auth** — учётные данные передаются с каждым запросом. В продакшене ставьте **HTTPS** (обратный прокси: nginx, Caddy + TLS).
@@ -112,8 +144,10 @@ install.sh / uninstall.sh # Установка и снятие «в одн
|-------|------|----------| |-------|------|----------|
| GET | `/` | HTML-интерфейс | | GET | `/` | HTML-интерфейс |
| GET | `/status`, `/registration`, `/proxy`, `/logs` | Статус и диагностика | | GET | `/status`, `/registration`, `/proxy`, `/logs` | Статус и диагностика |
| GET | `/relay` | Статус WARP Relay beta |
| POST | `/connect`, `/disconnect`, `/restart` | Управление WARP | | POST | `/connect`, `/disconnect`, `/restart` | Управление WARP |
| POST | `/warp-install`, `/warp-uninstall` | Установка/удаление пакета | | POST | `/warp-install`, `/warp-uninstall` | Установка/удаление пакета |
| POST | `/relay-apply`, `/relay-remove` | Применить/удалить WARP Relay rules |
| POST | `/proxy-port`, `/license` | Порт SOCKS, ключ WARP+ | | POST | `/proxy-port`, `/license` | Порт SOCKS, ключ WARP+ |
| POST | `/xui-preset`, `/amnezia-preset`, `/amnezia-routing` | Пресеты интеграций | | POST | `/xui-preset`, `/amnezia-preset`, `/amnezia-routing` | Пресеты интеграций |

3
app.py
View File

@@ -1142,7 +1142,8 @@ function setMsg(id, text, ok=null) {
n.className = 'msg ' + (ok === true ? 'ok' : ok === false ? 'bad' : 'muted'); n.className = 'msg ' + (ok === true ? 'ok' : ok === false ? 'bad' : 'muted');
} }
async function api(path, opts={}) { async function api(path, opts={}) {
const res = await fetch(path, { cache: 'no-store', ...opts }); const url = new URL(path, window.location.origin);
const res = await fetch(url, { cache: 'no-store', ...opts });
const ct = res.headers.get('content-type') || ''; const ct = res.headers.get('content-type') || '';
const body = ct.includes('application/json') ? await res.json() : await res.text(); const body = ct.includes('application/json') ? await res.json() : await res.text();
if (!res.ok) throw new Error(typeof body === 'string' ? body : JSON.stringify(body)); if (!res.ok) throw new Error(typeof body === 'string' ? body : JSON.stringify(body));

BIN
docs/images/dashboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -7,6 +7,7 @@ ENV_FILE="/etc/default/warp-webui"
SERVICE_NAME="warp-webui" SERVICE_NAME="warp-webui"
UNIT="/etc/systemd/system/${SERVICE_NAME}.service" UNIT="/etc/systemd/system/${SERVICE_NAME}.service"
BRIDGE_UNIT="/etc/systemd/system/warp-socks-bridge.service" BRIDGE_UNIT="/etc/systemd/system/warp-socks-bridge.service"
RELAY_TAG="${WARP_RELAY_RULE_TAG:-WR_WEBUI_RELAY}"
if [[ "${EUID:-0}" -ne 0 ]]; then if [[ "${EUID:-0}" -ne 0 ]]; then
echo "Запустите от root: sudo bash uninstall.sh" echo "Запустите от root: sudo bash uninstall.sh"
@@ -15,6 +16,40 @@ fi
echo "=== Удаление WARP Web UI ===" echo "=== Удаление WARP Web UI ==="
clean_relay_nftables() {
command -v nft >/dev/null 2>&1 || return 0
nft -a list ruleset 2>/dev/null | awk -v tag="comment \""${RELAY_TAG}"\"" '
/^table / { family=$2; table=$3 }
/^[[:space:]]*chain / { chain=$2 }
index($0, tag) && match($0, /# handle [0-9]+/) {
handle=substr($0, RSTART + 9, RLENGTH - 9)
print family, table, chain, handle
}
' | while read -r family table chain handle; do
nft delete rule "${family}" "${table}" "${chain}" handle "${handle}" 2>/dev/null || true
done
nft delete set ip nat wr_webui_relay_ports 2>/dev/null || true
nft delete set ip filter wr_webui_relay_ports 2>/dev/null || true
nft list ruleset > /etc/nftables.conf 2>/dev/null || true
}
clean_relay_iptables() {
command -v iptables >/dev/null 2>&1 || return 0
iptables -t nat -S 2>/dev/null | grep "${RELAY_TAG}" | sed 's/^-A/-D/' | while read -r rule; do
eval iptables -t nat "$rule" 2>/dev/null || true
done
iptables -S 2>/dev/null | grep "${RELAY_TAG}" | sed 's/^-A/-D/' | while read -r rule; do
eval iptables "$rule" 2>/dev/null || true
done
if command -v netfilter-persistent >/dev/null 2>&1; then
netfilter-persistent save 2>/dev/null || true
fi
}
echo "Удаляем managed WARP Relay rules (${RELAY_TAG})..."
clean_relay_nftables
clean_relay_iptables
if systemctl is-active --quiet "${SERVICE_NAME}.service" 2>/dev/null; then if systemctl is-active --quiet "${SERVICE_NAME}.service" 2>/dev/null; then
systemctl stop "${SERVICE_NAME}.service" systemctl stop "${SERVICE_NAME}.service"
fi fi