C³ CELERITY

April 17, 2026 · View on GitHub

Быстро, просто и надолго

English | Русский

License: MIT Docker Pulls Docker Image Size Node.js Hysteria Xray Telegram Поддержать

C³ CELERITY by Click Connect — современная веб-панель для управления серверами Hysteria 2 и Xray VLESS с централизованной авторизацией, автоматической настройкой нод и гибким распределением пользователей по группам.

Создана для скорости: Лёгкая архитектура, оптимизированная для быстрой работы на любом масштабе.

Дашборд — мониторинг серверов и статистика в реальном времени

⚡ Быстрый старт

Нужно обновить уже установленную панель? См. Безопасное обновление на проде.

1. Установите Docker (если не установлен):

curl -fsSL https://get.docker.com | sh

2. Разверните панель (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 -d

3. Откройте https://ваш-домен/panel

Планируете управлять панелью из AI-ассистента? См. Гайд по настройке MCP.

Обязательные переменные .env:

PANEL_DOMAIN=panel.example.com
ACME_EMAIL=admin@example.com
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.

Режим разработки (сборка из текущей ветки)

  1. В Dokploy создайте проект из этого репозитория/ветки.
  2. Укажите путь к compose-файлу: docker-compose.dokploy.yml.
  3. Добавьте переменные окружения из docker.env.example, минимум:
    • MONGO_PASSWORD
    • PANEL_DOMAIN
    • ACME_EMAIL
    • ENCRYPTION_KEY
    • SESSION_SECRET
    • DOKPLOY_PANEL_HOST (домен для правила Traefik Host(...))
    • DOKPLOY_TRAEFIK_SERVICE_PORT (порт Traefik/backend, по умолчанию 3000)
  4. Запустите деплой: 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:
    - .env

latest подходит для быстрых обновлений, фиксированный тег — для предсказуемых прод-выкаток.


✨ Возможности

  • 🖥 Веб-панель — полноценный 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 ProxyXray 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 при создании связи

Рекомендации после деплоя

  1. Проверьте статусы хопов на карте сети
  2. Убедитесь, что трафик выходит через ожидаемый Bridge (проверьте exit IP)
  3. Для Forward Chain — подтвердите доступность каждого relay по его tunnelPort

Ограничения

ОграничениеПричина
REALITY + WebSocketWebSocket не поддерживает 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:

  1. Клиент подключается к ноде с userId:password
  2. Нода отправляет POST /api/auth на панель
  3. Панель проверяет пользователя и возвращает { "ok": true/false }

Xray:

  1. Клиент подключается с UUID (xrayUuid)
  2. CC Agent на ноде управляет списком пользователей через API
  3. Панель синхронизирует пользователей с нодой без перезагрузки 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 ноды

Автоматическая настройка (рекомендуется)

  1. Добавьте ноду в панели:
  • Тип: Xray
  • IP, SSH доступ
  • Безопасность: Reality (рекомендуется)
  • Транспорт: TCP (рекомендуется для Reality)
  1. Нажмите "⚙️ Автонастройка"
  2. Панель автоматически:
  • Установит Xray-core
  • Сгенерирует Reality ключи (x25519)
  • Загрузит конфиг
  • Установит CC Agent для управления пользователями
  • Откроет порты в firewall
  • Запустит сервисы

Reality настройки

ПолеОписаниеПример
DestКуда маскироваться (домен:порт)www.google.com:443
SNIServer Name Indicationwww.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.com1.2.3.4
SNIДля маскировки (domain fronting)www.google.com

Сценарии:

  1. Простая настройка: Укажите домен, SNI оставьте пустым
  2. Domain fronting: Укажите домен для сертификатов, SNI — популярный домен
  3. Без домена: Оставьте пустым — будет self-signed сертификат

Автоматическая настройка (рекомендуется)

  1. Добавьте ноду в панели (IP, SSH доступ)
  2. Нажмите "⚙️ Автонастройка"
  3. Панель автоматически:
  • Установит Hysteria 2
  • Настроит ACME или self-signed сертификаты
  • Настроит port hopping
  • Откроет порты в firewall
  • Запустит сервис

Обфускация (Salamander)

Hysteria поддерживает обфускацию для маскировки трафика:

  1. В настройках ноды включите Obfs
  2. Укажите пароль обфускации
  3. Сохраните и обновите конфиг

Клиенты автоматически получат параметры 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Формат
shadowrocketBase64 URI list
clash, stash, surgeClash YAML
hiddify, sing-box, karingSing-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/statsstats:readСтатистика панели
GET/api/groupsstats:readСписок групп серверов
POST/api/syncsync:writeСинхронизировать все ноды
POST/api/kick/:userIdsync: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Завершён цикл синхронизации

📊 Модели данных

Пользователь

ПолеТипОписание
userIdStringУникальный ID
usernameStringОтображаемое имя
subscriptionTokenStringТокен для URL подписки
xrayUuidStringUUID для Xray VLESS (авто-генерация)
enabledBooleanАктивен ли пользователь
groups[ObjectId]Группы серверов
nodes[ObjectId]Прямая привязка к нодам
trafficObject{ tx, rx, lastUpdate } — использованный трафик
trafficLimitNumberЛимит трафика в байтах (0 = безлимит)
maxDevicesNumberЛимит устройств (0 = из группы, -1 = безлимит)
expireAtDateДата истечения

Нода

ПолеТипОписание
typeStringhysteria или xray
nameStringНазвание
flagStringФлаг страны (эмодзи)
ipStringIP адрес
domainStringДомен для SNI/ACME
sniStringКастомный SNI для маскировки
portNumberОсновной порт (443)
portRangeStringДиапазон портов для hopping
portConfigsArrayМультипорт: [{ name, port, portRange, enabled }]
obfsObjectОбфускация: { type: 'salamander', password }
statsPortNumberПорт статистики Hysteria (9999)
statsSecretStringСекрет для API статистики
groups[ObjectId]Группы серверов
outboundsArrayПрокси для ACL: [{ name, type, addr }]
aclRules[String]Правила ACL
maxOnlineUsersNumberМакс. онлайн для балансировки
rankingCoefficientNumberКоэффициент сортировки (1.0)
statusStringonline/offline/error/syncing
trafficObject{ tx, rx, lastUpdate } — трафик ноды
xrayObjectНастройки Xray (см. ниже)

Xray настройки (node.xray)

ПолеТипОписание
transportStringtcp, ws, grpc, xhttp
securityStringreality, tls, none
flowStringxtls-rprx-vision (для tcp)
fingerprintStringchrome, firefox, safari, etc.
alpn[String]ALPN протоколы (h3, h2, http/1.1)
realityDestStringКуда маскироваться
realitySni[String]Server names
realityPrivateKeyStringПриватный ключ x25519
realityPublicKeyStringПубличный ключ
realityShortIds[String]Short IDs
realitySpiderXStringSpider X path (default: /)
wsPathStringWebSocket путь
wsHostStringWebSocket host header
grpcServiceNameStringgRPC service name
xhttpPathStringXHTTP путь
xhttpHostStringXHTTP host header
xhttpModeStringauto, packet-up, stream-up
apiPortNumberПорт gRPC API Xray (61000)
inboundTagStringТег inbound (vless-in)
agentPortNumberПорт CC Agent (62080)
agentTokenStringТокен агента
agentTlsBooleanTLS для CC Agent

Группа серверов

ПолеТипОписание
nameStringНазвание группы
descriptionStringОписание
colorStringЦвет для UI (#hex)
maxDevicesNumberЛимит устройств для группы
subscriptionTitleStringНазвание в профиле подписки

🚫 Фильтрация трафика (ACL)

Управление маршрутизацией на каждой Hysteria ноде. Доступ: Панель → Нода → Фильтрация трафика.

Встроенные действия

ДействиеОписание
reject(...)Заблокировать
direct(...)Пропустить

Примеры правил

reject(suffix:doubleclick.net)     # Блокировка рекламы
reject(suffix:googlesyndication.com)
reject(geoip:cn)                   # Блокировка китайских IP
reject(geoip:private)              # Блокировка приватных IP
direct(all)                        # Разрешить всё остальное

Маршрутизация через свой прокси

  1. Добавьте прокси (например, my-proxy, SOCKS5, 1.2.3.4:1080)
  2. Используйте в правилах: my-proxy(geoip:ru)

⚖️ Балансировка нагрузки

Настраивается в Настройки:

  • Балансировка включена — сортировка нод по загруженности
  • Скрывать перегруженные — не выдавать перегруженные ноды

Алгоритм:

  1. Получаем ноды пользователя из групп
  2. Сортируем по % загрузки (online/max)
  3. Фильтруем перегруженные если включено
  4. При равной загрузке — по rankingCoefficient

🔒 Лимит устройств

Приоритет:

  1. Персональный лимит пользователя (maxDevices > 0)
  2. Минимальный лимит из групп пользователя
  3. -1 = безлимит

Device Grace Period — задержка (в секундах) перед учётом отключённого устройства, чтобы избежать ложных срабатываний при переподключении.


📱 Настройка страницы подписки

Кастомизируйте HTML-страницу подписки в Настройки → Подписка:

ПолеОписание
Logo URLURL логотипа для шапки страницы
Page TitleЗаголовок страницы
Support URLСсылка на поддержку (кнопка внизу страницы)
Web Page URLURL профиля (заголовок profile-web-page-url)

Страница подписки автоматически показывает:

  • QR-код для импорта в приложение
  • Статистику трафика и срок действия
  • Список локаций с кнопками копирования

💾 Бэкапы

Автобэкапы

Настраиваются в Настройки → Бэкапы:

  • Интервал (в часах)
  • Количество локальных копий

Ручной бэкап

Кнопка на дашборде — файл автоматически скачивается.

Восстановление

Загрузите .tar.gz архив через интерфейс.

S3-совместимое хранилище

Бэкапы можно автоматически загружать в S3-совместимое хранилище (AWS S3, MinIO, Backblaze B2, Cloudflare R2 и др.).

Настройка: Настройки → Бэкапы → S3

ПолеОписание
EndpointURL хранилища (для 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_EMAILEmail для Let's Encrypt
ENCRYPTION_KEYКлюч шифрования SSH (32 символа)
SESSION_SECRETСекрет сессий
MONGO_PASSWORDПароль MongoDB (для Docker)
MONGO_USERПользователь MongoDB (default: hysteria)
MONGO_URIURI подключения к MongoDB (для не-Docker)
REDIS_URLURL Redis для кэша (default: память)
PANEL_IP_WHITELISTIP whitelist для панели
SYNC_INTERVALИнтервал синхронизации в минутах (default: 2)
API_DOCS_ENABLEDИнтерактивная документация на /api/docs
LOG_LEVELУровень логирования (default: info)

🤝 Участие в разработке

Pull requests приветствуются!


📄 Лицензия

MIT