@iflow-mcp/clickdevtech-celerity-panel
v1.0.0
Published
C³ CELERITY - Management panel for Hysteria 2 nodes by Click Connect
Readme
C³ CELERITY
⚡ Быстро, просто и надолго
License: MIT
Docker Pulls
Docker Image Size
Node.js
Hysteria
Xray
C³ CELERITY by Click Connect — современная веб-панель для управления серверами Hysteria 2 и Xray VLESS с централизованной авторизацией, автоматической настройкой нод и гибким распределением пользователей по группам.
Создана для скорости: Лёгкая архитектура, оптимизированная для быстрой работы на любом масштабе.
Дашборд — мониторинг серверов и статистика в реальном времени
⚡ Быстрый старт
Нужно обновить уже установленную панель? См. Безопасное обновление на проде.
1. Установите Docker (если не установлен):
curl -fsSL https://get.docker.com | sh2. Разверните панель (Docker Hub — рекомендуется):
mkdir hysteria-panel && cd hysteria-panel
# Скачать необходимые файлы
curl -O https://raw.githubusercontent.com/ClickDevTech/hysteria-panel/main/docker-compose.hub.yml
curl -O https://raw.githubusercontent.com/ClickDevTech/hysteria-panel/main/docker.env.example
# Создать конфиг SSL (обязательно для HTTPS)
mkdir -p greenlock.d
curl -o greenlock.d/config.json https://raw.githubusercontent.com/ClickDevTech/hysteria-panel/main/greenlock.d/config.json
cp docker.env.example .env
nano .env # Укажите домен, email и секреты
docker compose -f docker-compose.hub.yml up -dАльтернатива: сборка из исходников (для разработки или кастомизации)
git clone https://github.com/ClickDevTech/hysteria-panel.git
cd hysteria-panel
cp docker.env.example .env
nano .env # Укажите домен, email и секреты
docker compose up -d3. Откройте https://ваш-домен/panel
Планируете управлять панелью из AI-ассистента? См. Гайд по настройке MCP.
Обязательные переменные .env:
PANEL_DOMAIN=panel.example.com
[email protected]
ENCRYPTION_KEY=ваш32символьныйключ # openssl rand -hex 16
SESSION_SECRET=секретсессий # openssl rand -hex 32
MONGO_PASSWORD=парольмонго # openssl rand -hex 16🐳 Dokploy (разработка и релиз)
Используйте docker-compose.dokploy.yml при деплое через Dokploy с Traefik.
Режим разработки (сборка из текущей ветки)
- В Dokploy создайте проект из этого репозитория/ветки.
- Укажите путь к compose-файлу:
docker-compose.dokploy.yml. - Добавьте переменные окружения из
docker.env.example, минимум:MONGO_PASSWORDPANEL_DOMAINACME_EMAILENCRYPTION_KEYSESSION_SECRETDOKPLOY_PANEL_HOST(домен для правила TraefikHost(...))DOKPLOY_TRAEFIK_SERVICE_PORT(порт Traefik/backend, по умолчанию3000)
- Запустите деплой: Dokploy выполнит
build: .и поднимет стек.
Этот режим удобен для проверки изменений из ветки до публикации релизного образа.
Режим релиза (образ из Docker Hub)
Если нужен стабильный деплой по тегам Docker Hub (без сборки), замените источник backend в compose на образ:
backend:
image: clickdevtech/hysteria-panel:latest
# или зафиксируйте тег релиза, например clickdevtech/hysteria-panel:v1.2.3
restart: always
depends_on:
mongo:
condition: service_healthy
redis:
condition: service_healthy
expose:
- "${DOKPLOY_TRAEFIK_SERVICE_PORT:-3000}"
labels:
- "traefik.enable=true"
- "traefik.http.routers.celerity.rule=Host(`${DOKPLOY_PANEL_HOST}`)"
- "traefik.http.routers.celerity.entrypoints=websecure"
- "traefik.http.routers.celerity.tls=true"
- "traefik.http.services.celerity.loadbalancer.server.port=${DOKPLOY_TRAEFIK_SERVICE_PORT:-3000}"
env_file:
- .envlatest подходит для быстрых обновлений, фиксированный тег — для предсказуемых прод-выкаток.
✨ Возможности
- 🖥 Веб-панель — полноценный UI для управления нодами и пользователями
- 🔐 Двойной протокол — Hysteria 2 и Xray VLESS на одной панели
- 🛡️ 2FA для панели (TOTP) — единый сценарий подтверждения TOTP для входа администратора и чувствительных действий безопасности
- 🚀 Автонастройка нод — установка Hysteria/Xray, сертификатов и port hopping в один клик
- 👥 Группы серверов — гибкая привязка пользователей к нодам
- ⚖️ Балансировка нагрузки — распределение по загруженности
- 🚫 Фильтрация трафика (ACL) — блокировка рекламы, доменов, IP; маршрутизация через прокси
- 🧩 Расширенный конфиг Hysteria — опциональные параметры ACME challenge, режимы masquerade, resolver, speed test, sniffing и настройка QUIC
- 📊 Статистика — онлайн, трафик, состояние серверов
- 📱 Подписки — автоформаты для Clash, Sing-box, Shadowrocket, Hiddify
- 🔄 Бэкап/Восстановление — автоматические бэкапы с поддержкой S3
- 💻 SSH-терминал — прямой доступ к нодам из браузера
- 🔑 API-ключи — безопасный внешний доступ со скоупами, IP-фильтром и rate limiting
- 🪝 Вебхуки — уведомления о событиях с подписью HMAC-SHA256
- 🗺 Карта сети — визуальная каскадная топология с Forward/Reverse Chain (бета)
- 🤖 MCP-интеграция — нативная поддержка AI-ассистентов (Claude, Cursor и др.) для управления панелью
⚠️ Бета-функции
Карта сети и каскадная топология
Статус: бета — функциональность работает, но рекомендуется проверка после деплоя.
Каскадная топология позволяет строить цепочки серверов, где клиент подключается к одной ноде, а трафик выходит через другую. Это полезно в сценариях, где точка входа должна находиться в определённой сети или юрисдикции — например, когда требуется подключение через IP-адреса локальных облачных провайдеров.
Зачем это нужно
В корпоративных и операторских сетях часто применяется фильтрация по IP-диапазонам. Трафик к известным хостинг-провайдерам может проходить без ограничений, тогда как соединения с зарубежными IP блокируются или ограничиваются. Каскадная топология решает эту проблему: клиент подключается к серверу в «доверенном» диапазоне, а трафик прозрачно проксируется на внешний сервер.
Используемые механизмы Xray
Панель генерирует конфигурации Xray-core с использованием следующих механизмов:
| Механизм | Назначение |
|----------|------------|
| Reverse Proxy | Xray bridge/portal — позволяет серверу за NAT инициировать соединение к публичному узлу и принимать через него трафик |
| Outbound Chaining | Последовательное проксирование через несколько outbound с помощью proxySettings.tag |
| REALITY | Маскировка TLS-handshake под соединение с легитимным сайтом; не требует домена и сертификата |
| Transport Layer Proxy | Режим transportLayer: true для корректного применения REALITY в цепочке хопов |
Режимы связей
Reverse Proxy — классическая схема Xray reverse. Bridge-сервер (обычно за рубежом) инициирует постоянное соединение к Portal-серверу. Клиент подключается к Portal, трафик выходит через Bridge.
Клиент ──▶ Portal (вход) ◀── туннель ── Bridge (выход) ──▶ Интернет
(bridge инициирует соединение)- Portal может находиться за NAT или firewall — входящие соединения не требуются
- Подходит для сценариев, где точка входа должна быть в определённой сети
Forward Chain — прямая цепочка outbound. Portal устанавливает соединение через relay-ноды к exit-Bridge.
Клиент ──▶ Portal ──▶ Relay (опц.) ──▶ Bridge (выход) ──▶ Интернет
(chained outbounds)- Все ноды в цепочке должны иметь публичный IP
- Поддерживается REALITY на каждом хопе для шифрования межсерверного трафика
REALITY между нодами
Tunnel-REALITY настраивается независимо от клиентского REALITY на Portal-ноде. Это позволяет:
- Шифровать межсерверный трафик без привлечения внимания
- Использовать разные SNI/destination для клиента и для туннеля
- Автоматически генерировать x25519 ключи и shortId при создании связи
Рекомендации после деплоя
- Проверьте статусы хопов на карте сети
- Убедитесь, что трафик выходит через ожидаемый Bridge (проверьте exit IP)
- Для Forward Chain — подтвердите доступность каждого relay по его
tunnelPort
Ограничения
| Ограничение | Причина | |-------------|---------| | REALITY + WebSocket | WebSocket не поддерживает uTLS fingerprint, необходимый для REALITY | | Forward Chain без публичного IP | Каждый хоп должен принимать входящие соединения | | Смешанные режимы в одной цепочке | Reverse и Forward используют разные механизмы Xray и не комбинируются | | Один порт на relay для двух хопов | Relay, являющийся одновременно bridge и portal, требует разные порты для входящего и исходящего туннеля |
🏗 Архитектура
┌─────────────────┐
│ КЛИЕНТЫ │
│ Clash, Sing-box │
│ Shadowrocket │
└────────┬────────┘
│
hysteria2:// или vless://
│
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Hysteria Node │ │ Xray Node │ │ Hysteria Node │
│ :443 + hop │ │ VLESS Reality │ │ :443 + hop │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
│ POST /api/auth │ CC Agent API │
│ GET /online │ │
└────────────────────────┼────────────────────────┘
▼
┌────────────────────────┐
│ HYSTERIA PANEL │
│ │
│ • Веб-панель (/panel) │
│ • HTTP Auth API │
│ • Подписки │
│ • SSH-терминал │
│ • Сбор статистики │
└───────────┬────────────┘
│
▼
┌────────────────────────┐
│ MongoDB │
└────────────────────────┘Как работает авторизация
Hysteria:
- Клиент подключается к ноде с
userId:password - Нода отправляет
POST /api/authна панель - Панель проверяет пользователя и возвращает
{ "ok": true/false }
Xray:
- Клиент подключается с UUID (xrayUuid)
- CC Agent на ноде управляет списком пользователей через API
- Панель синхронизирует пользователей с нодой без перезагрузки Xray
Группы серверов
Вместо жёстких "планов" используются гибкие группы:
- Создайте группу (например, "Европа", "Premium")
- Привяжите к ней ноды
- Привяжите пользователей
- Пользователь получает в подписке только ноды из своих групп
🔧 Типы нод
Hysteria 2
Быстрый UDP-протокол на базе QUIC с поддержкой port hopping и обфускации.
Преимущества:
- Высокая скорость на нестабильных сетях
- Port hopping для обхода блокировок
- Обфускация Salamander
Настройки:
- Порт, диапазон портов для hopping
- ACME или self-signed сертификаты
- Obfs (Salamander) с паролем
Расширенные настройки Hysteria в панели:
- Интервал Port Hopping (
hopInterval) - Расширенный ACME (тип challenge, альтернативные порты, DNS challenge provider/config)
- Режимы masquerade:
proxyиstring - Лимиты bandwidth (
up/down) иignoreClientBandwidth - Встроенные
speedTest,disableUDP,udpIdleTimeout - Protocol sniffing (
sniff) и параметры QUIC (quic) - Кастомный DNS resolver (
resolver) - Режим источника ACL (
inlineилиfile) + пути к GeoIP/GeoSite - Расширенные секции опциональны и не попадают в сгенерированный конфиг, пока не включены в UI
Xray VLESS
Современный протокол с поддержкой Reality и различных транспортов.
Преимущества:
- Reality — маскировка под легитимный HTTPS трафик
- Множество транспортов (TCP, WebSocket, gRPC, XHTTP)
- Не требует домена для Reality
Транспорты:
| Транспорт | Описание | Поддержка клиентами | | --------- | ---------------------------------------- | ------------------- | | TCP | Прямое соединение, максимальная скорость | Все клиенты | | WebSocket | Работает через CDN и прокси | Все клиенты | | gRPC | Мультиплексирование, хорош для CDN | Все клиенты | | XHTTP | Новый splithttp транспорт | Ограниченная* |
*XHTTP поддерживается не всеми клиентами (Clash/Sing-box пока не поддерживают)
Безопасность:
| Режим | Описание | | ------- | ---------------------------------------------- | | Reality | Маскировка под популярный сайт, не нужен домен | | TLS | Классический TLS с сертификатом | | None | Без шифрования (не рекомендуется) |
🚀 Настройка Xray ноды
Автоматическая настройка (рекомендуется)
- Добавьте ноду в панели:
- Тип: Xray
- IP, SSH доступ
- Безопасность: Reality (рекомендуется)
- Транспорт: TCP (рекомендуется для Reality)
- Нажмите "⚙️ Автонастройка"
- Панель автоматически:
- Установит Xray-core
- Сгенерирует Reality ключи (x25519)
- Загрузит конфиг
- Установит CC Agent для управления пользователями
- Откроет порты в firewall
- Запустит сервисы
Reality настройки
| Поле | Описание | Пример |
| ----------- | ------------------------------- | -------------------------- |
| Dest | Куда маскироваться (домен:порт) | www.google.com:443 |
| SNI | Server Name Indication | www.google.com |
| Private Key | Приватный ключ x25519 | Генерируется автоматически |
| Public Key | Публичный ключ (для клиентов) | Генерируется автоматически |
| Short IDs | Идентификаторы сессий | Генерируются автоматически |
CC Agent
CC Agent — это лёгкий HTTP-сервис на ноде для управления пользователями Xray без перезагрузки.
Возможности:
- Добавление/удаление пользователей на лету
- Сбор статистики трафика
- Health check
Agent устанавливается автоматически при автонастройке Xray ноды.
🔧 Настройка Hysteria ноды
Понимание конфигурации
Порты
- Основной порт (443) — порт, на котором слушает Hysteria
- Диапазон портов (20000-50000) — UDP порты для port hopping
- Порт статистики (9999) — внутренний порт для сбора статистики
Домен и SNI
| Поле | Назначение | Пример |
| ---------- | ----------------------------------- | ----------------------------- |
| Domain | Для ACME/Let's Encrypt сертификатов | de1.example.com → 1.2.3.4 |
| SNI | Для маскировки (domain fronting) | www.google.com |
Сценарии:
- Простая настройка: Укажите домен, SNI оставьте пустым
- Domain fronting: Укажите домен для сертификатов, SNI — популярный домен
- Без домена: Оставьте пустым — будет self-signed сертификат
Автоматическая настройка (рекомендуется)
- Добавьте ноду в панели (IP, SSH доступ)
- Нажмите "⚙️ Автонастройка"
- Панель автоматически:
- Установит Hysteria 2
- Настроит ACME или self-signed сертификаты
- Настроит port hopping
- Откроет порты в firewall
- Запустит сервис
Обфускация (Salamander)
Hysteria поддерживает обфускацию для маскировки трафика:
- В настройках ноды включите Obfs
- Укажите пароль обфускации
- Сохраните и обновите конфиг
Клиенты автоматически получат параметры obfs в подписке.
Панель и нода на одном VPS
Можно запустить панель и ноду на одном VPS (панель TCP, нода UDP на 443).
Вариант 1: Использовать домен панели (рекомендуется)
- Укажите для ноды тот же домен что у панели
- Сертификаты панели скопируются автоматически
Вариант 2: Без домена (self-signed)
- Оставьте поле домена пустым
- Будет сгенерирован самоподписанный сертификат
📖 API
Аутентификация через API-ключ
Все эндпоинты /api/* (кроме /api/auth и /api/files) требуют аутентификации.
Создать ключ: Настройки → Безопасность → API-ключи → Создать ключ
Использование:
# Вариант 1 — заголовок
X-API-Key: ck_your_key_here
# Вариант 2 — Bearer токен
Authorization: Bearer ck_your_key_hereСкоупы (права доступа)
| Скоуп | Доступ |
| ------------- | --------------------------------------------------- |
| users:read | Чтение пользователей |
| users:write | Создание / изменение / удаление пользователей |
| nodes:read | Чтение нод |
| nodes:write | Создание / изменение / удаление / синхронизация нод |
| stats:read | Статистика и группы |
| sync:write | Запуск синхронизации, кик пользователей |
Rate Limiting
Каждый ключ имеет настраиваемый лимит (по умолчанию: 60 req/мин).
При превышении возвращается 429 с заголовками X-RateLimit-Limit / X-RateLimit-Remaining.
Авторизация (для нод)
POST /api/auth
Проверка пользователя при подключении к Hysteria ноде.
// Запрос
{ "addr": "1.2.3.4:12345", "auth": "userId:password" }
// Ответ (успех)
{ "ok": true, "id": "userId" }
// Ответ (ошибка)
{ "ok": false }Подписки
GET /api/files/:token
Универсальный эндпоинт подписки. Автоматически определяет формат по User-Agent.
| User-Agent | Формат |
| ------------------------------- | ------------------------ |
| shadowrocket | Base64 URI list |
| clash, stash, surge | Clash YAML |
| hiddify, sing-box, karing | Sing-box JSON |
| Браузер | HTML страница с QR-кодом |
| Другое | Plain URI list |
Query параметры: ?format=clash, ?format=singbox, ?format=uri
GET /api/files/info/:token
Информация о подписке (статус, трафик, срок действия).
Пользователи
Требуемый скоуп: users:read (GET) / users:write (POST, PUT, DELETE)
| Метод | Эндпоинт | Описание |
| ------ | ------------------------------------ | ----------------------------------------------------- |
| GET | /api/users | Список пользователей (пагинация, фильтры, сортировка) |
| GET | /api/users/:userId | Получить пользователя |
| POST | /api/users | Создать пользователя |
| PUT | /api/users/:userId | Обновить пользователя |
| DELETE | /api/users/:userId | Удалить пользователя |
| POST | /api/users/:userId/enable | Включить |
| POST | /api/users/:userId/disable | Отключить |
| POST | /api/users/:userId/groups | Добавить в группы |
| DELETE | /api/users/:userId/groups/:groupId | Удалить из группы |
| POST | /api/users/sync-from-main | Синхронизация с внешней БД |
Ноды
Требуемый скоуп: nodes:read (GET) / nodes:write (POST, PUT, DELETE)
| Метод | Эндпоинт | Описание |
| ------ | ----------------------------------- | --------------------------- |
| GET | /api/nodes | Список нод |
| GET | /api/nodes/:id | Получить ноду |
| POST | /api/nodes | Создать ноду |
| PUT | /api/nodes/:id | Обновить ноду |
| DELETE | /api/nodes/:id | Удалить ноду |
| GET | /api/nodes/:id/config | Получить конфиг (YAML/JSON) |
| GET | /api/nodes/:id/status | Статус ноды |
| POST | /api/nodes/:id/reset-status | Сбросить статус на online |
| GET | /api/nodes/:id/users | Пользователи на ноде |
| POST | /api/nodes/:id/sync | Синхронизировать ноду |
| POST | /api/nodes/:id/update-config | Отправить конфиг через SSH |
| POST | /api/nodes/:id/setup | Автонастройка через SSH |
| POST | /api/nodes/:id/setup-port-hopping | Настроить port hopping |
| POST | /api/nodes/:id/groups | Добавить ноду в группы |
| DELETE | /api/nodes/:id/groups/:groupId | Удалить из группы |
| GET | /api/nodes/:id/agent-info | Инфо от CC Agent (Xray) |
| POST | /api/nodes/:id/generate-xray-keys | Генерация Reality ключей |
Статистика и синхронизация
| Метод | Эндпоинт | Скоуп | Описание |
| ----- | ------------------- | ------------ | ------------------------- |
| GET | /api/stats | stats:read | Статистика панели |
| GET | /api/groups | stats:read | Список групп серверов |
| POST | /api/sync | sync:write | Синхронизировать все ноды |
| POST | /api/kick/:userId | sync:write | Кикнуть пользователя |
🪝 Вебхуки
Отправляйте уведомления о событиях в реальном времени на любой HTTP-эндпоинт.
Настройка: Настройки → Безопасность → Вебхуки
Формат запроса
POST https://your-endpoint.com/webhook
Content-Type: application/json
X-Webhook-Event: user.created
X-Webhook-Timestamp: 1700000000
X-Webhook-Signature: sha256=<hmac>
User-Agent: C3-Celerity-Webhook/1.0
{
"event": "user.created",
"timestamp": "2024-01-01T00:00:00.000Z",
"data": { ... }
}Проверка подписи
const crypto = require('crypto');
const expected = 'sha256=' + crypto
.createHmac('sha256', YOUR_SECRET)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
// сравните с заголовком X-Webhook-SignatureСобытия
| Событие | Когда |
| ----------------------- | --------------------------- |
| user.created | Создан пользователь |
| user.updated | Обновлён пользователь |
| user.deleted | Удалён пользователь |
| user.enabled | Пользователь включён |
| user.disabled | Пользователь отключён |
| user.traffic_exceeded | Достигнут лимит трафика |
| user.expired | Истёк срок подписки |
| node.online | Нода перешла в онлайн |
| node.offline | Нода ушла в оффлайн |
| node.error | Ошибка ноды |
| sync.completed | Завершён цикл синхронизации |
📊 Модели данных
Пользователь
| Поле | Тип | Описание |
| ------------------- | ---------- | ------------------------------------------------ |
| userId | String | Уникальный ID |
| username | String | Отображаемое имя |
| subscriptionToken | String | Токен для URL подписки |
| xrayUuid | String | UUID для Xray VLESS (авто-генерация) |
| enabled | Boolean | Активен ли пользователь |
| groups | [ObjectId] | Группы серверов |
| nodes | [ObjectId] | Прямая привязка к нодам |
| traffic | Object | { tx, rx, lastUpdate } — использованный трафик |
| trafficLimit | Number | Лимит трафика в байтах (0 = безлимит) |
| maxDevices | Number | Лимит устройств (0 = из группы, -1 = безлимит) |
| expireAt | Date | Дата истечения |
Нода
| Поле | Тип | Описание |
| -------------------- | ---------- | -------------------------------------------------- |
| type | String | hysteria или xray |
| name | String | Название |
| flag | String | Флаг страны (эмодзи) |
| ip | String | IP адрес |
| domain | String | Домен для SNI/ACME |
| sni | String | Кастомный SNI для маскировки |
| port | Number | Основной порт (443) |
| portRange | String | Диапазон портов для hopping |
| portConfigs | Array | Мультипорт: [{ name, port, portRange, enabled }] |
| obfs | Object | Обфускация: { type: 'salamander', password } |
| statsPort | Number | Порт статистики Hysteria (9999) |
| statsSecret | String | Секрет для API статистики |
| groups | [ObjectId] | Группы серверов |
| outbounds | Array | Прокси для ACL: [{ name, type, addr }] |
| aclRules | [String] | Правила ACL |
| maxOnlineUsers | Number | Макс. онлайн для балансировки |
| rankingCoefficient | Number | Коэффициент сортировки (1.0) |
| status | String | online/offline/error/syncing |
| traffic | Object | { tx, rx, lastUpdate } — трафик ноды |
| xray | Object | Настройки Xray (см. ниже) |
Xray настройки (node.xray)
| Поле | Тип | Описание |
| ------------------- | -------- | --------------------------------- |
| transport | String | tcp, ws, grpc, xhttp |
| security | String | reality, tls, none |
| flow | String | xtls-rprx-vision (для tcp) |
| fingerprint | String | chrome, firefox, safari, etc. |
| alpn | [String] | ALPN протоколы (h3, h2, http/1.1) |
| realityDest | String | Куда маскироваться |
| realitySni | [String] | Server names |
| realityPrivateKey | String | Приватный ключ x25519 |
| realityPublicKey | String | Публичный ключ |
| realityShortIds | [String] | Short IDs |
| realitySpiderX | String | Spider X path (default: /) |
| wsPath | String | WebSocket путь |
| wsHost | String | WebSocket host header |
| grpcServiceName | String | gRPC service name |
| xhttpPath | String | XHTTP путь |
| xhttpHost | String | XHTTP host header |
| xhttpMode | String | auto, packet-up, stream-up |
| apiPort | Number | Порт gRPC API Xray (61000) |
| inboundTag | String | Тег inbound (vless-in) |
| agentPort | Number | Порт CC Agent (62080) |
| agentToken | String | Токен агента |
| agentTls | Boolean | TLS для CC Agent |
Группа серверов
| Поле | Тип | Описание |
| ------------------- | ------ | --------------------------- |
| name | String | Название группы |
| description | String | Описание |
| color | String | Цвет для UI (#hex) |
| maxDevices | Number | Лимит устройств для группы |
| subscriptionTitle | String | Название в профиле подписки |
🚫 Фильтрация трафика (ACL)
Управление маршрутизацией на каждой Hysteria ноде. Доступ: Панель → Нода → Фильтрация трафика.
Встроенные действия
| Действие | Описание |
| ------------- | ------------- |
| reject(...) | Заблокировать |
| direct(...) | Пропустить |
Примеры правил
reject(suffix:doubleclick.net) # Блокировка рекламы
reject(suffix:googlesyndication.com)
reject(geoip:cn) # Блокировка китайских IP
reject(geoip:private) # Блокировка приватных IP
direct(all) # Разрешить всё остальноеМаршрутизация через свой прокси
- Добавьте прокси (например,
my-proxy, SOCKS5,1.2.3.4:1080) - Используйте в правилах:
my-proxy(geoip:ru)
⚖️ Балансировка нагрузки
Настраивается в Настройки:
- Балансировка включена — сортировка нод по загруженности
- Скрывать перегруженные — не выдавать перегруженные ноды
Алгоритм:
- Получаем ноды пользователя из групп
- Сортируем по % загрузки (online/max)
- Фильтруем перегруженные если включено
- При равной загрузке — по
rankingCoefficient
🔒 Лимит устройств
Приоритет:
- Персональный лимит пользователя (
maxDevices > 0) - Минимальный лимит из групп пользователя
-1= безлимит
Device Grace Period — задержка (в секундах) перед учётом отключённого устройства, чтобы избежать ложных срабатываний при переподключении.
📱 Настройка страницы подписки
Кастомизируйте HTML-страницу подписки в Настройки → Подписка:
| Поле | Описание |
| -------------- | ---------------------------------------------- |
| Logo URL | URL логотипа для шапки страницы |
| Page Title | Заголовок страницы |
| Support URL | Ссылка на поддержку (кнопка внизу страницы) |
| Web Page URL | URL профиля (заголовок profile-web-page-url) |
Страница подписки автоматически показывает:
- QR-код для импорта в приложение
- Статистику трафика и срок действия
- Список локаций с кнопками копирования
💾 Бэкапы
Автобэкапы
Настраиваются в Настройки → Бэкапы:
- Интервал (в часах)
- Количество локальных копий
Ручной бэкап
Кнопка на дашборде — файл автоматически скачивается.
Восстановление
Загрузите .tar.gz архив через интерфейс.
S3-совместимое хранилище
Бэкапы можно автоматически загружать в S3-совместимое хранилище (AWS S3, MinIO, Backblaze B2, Cloudflare R2 и др.).
Настройка: Настройки → Бэкапы → S3
| Поле | Описание |
| ------------------- | ----------------------------------------------------------- |
| Endpoint | URL хранилища (для MinIO и др.). Для AWS S3 оставьте пустым |
| Region | Регион (например, us-east-1) |
| Bucket | Имя бакета |
| Prefix | Префикс/папка для бэкапов |
| Access Key ID | Ключ доступа |
| Secret Access Key | Секретный ключ |
| Keep Last | Сколько бэкапов хранить в S3 |
Примеры настройки:
# AWS S3
Endpoint: (пусто)
Region: eu-central-1
Bucket: my-backups
# MinIO
Endpoint: https://minio.example.com
Region: us-east-1
Bucket: backups
# Cloudflare R2
Endpoint: https://<account-id>.r2.cloudflarestorage.com
Region: auto
Bucket: my-backups🐳 Docker Compose
version: '3.8'
services:
mongo:
image: mongo:7
restart: always
volumes:
- mongo_data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-hysteria}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
backend:
image: clickdevtech/hysteria-panel:latest
restart: always
depends_on:
- mongo
ports:
- "80:80"
- "443:443"
volumes:
- ./logs:/app/logs
- ./greenlock.d:/app/greenlock.d
- ./backups:/app/backups
env_file:
- .env
volumes:
mongo_data:📝 Переменные окружения
| Переменная | Обязательно | Описание |
| -------------------- | ----------- | --------------------------------------------- |
| PANEL_DOMAIN | ✅ | Домен панели |
| DOKPLOY_PANEL_HOST | ❌ | Хост Traefik в Dokploy (правило Host(...)) |
| DOKPLOY_TRAEFIK_SERVICE_PORT | ❌ | Порт Traefik/backend сервиса в Dokploy (default: 3000) |
| ACME_EMAIL | ✅ | Email для Let's Encrypt |
| ENCRYPTION_KEY | ✅ | Ключ шифрования SSH (32 символа) |
| SESSION_SECRET | ✅ | Секрет сессий |
| MONGO_PASSWORD | ✅ | Пароль MongoDB (для Docker) |
| MONGO_USER | ❌ | Пользователь MongoDB (default: hysteria) |
| MONGO_URI | ❌ | URI подключения к MongoDB (для не-Docker) |
| REDIS_URL | ❌ | URL Redis для кэша (default: память) |
| PANEL_IP_WHITELIST | ❌ | IP whitelist для панели |
| SYNC_INTERVAL | ❌ | Интервал синхронизации в минутах (default: 2) |
| API_DOCS_ENABLED | ❌ | Интерактивная документация на /api/docs |
| LOG_LEVEL | ❌ | Уровень логирования (default: info) |
🤝 Участие в разработке
Pull requests приветствуются!
📄 Лицензия
MIT
