7.4 KiB
Xray Subscription Server
Лёгкий сервер подписок для Xray/V2Ray экосистемы. Позволяет объединять несколько источников конфигураций (внешние подписки + локальные ссылки) и отдавать их в формате, совместимом с популярными клиентами (v2rayN, Nekobox, Happ, Sing-box и др.).
Возможности
- Объединение внешних подписок (
https://) и локальных ссылок - Поддержка метаданных подписки в стиле 3x-ui:
Subscription-Userinfo(динамически подтягивается из внешних подписок)Support-UrlProfile-Web-Page-UrlAnnounceProfile-Update-IntervalRouting+Routing-Enable(для клиента Happ)
- Умное объединение
Subscription-Userinfoиз нескольких upstream-подписок - Кеширование внешних подписок (TTL)
- Запуск через Docker + gunicorn
- Поддержка SSL прямо в gunicorn (без reverse proxy)
- Простая конфигурация через
.env
Быстрый старт
Через Docker Compose (рекомендуется)
-
Склонируй репозиторий:
git clone https://github.com/crutoboy/xray_sub_server.git cd xray_sub_server -
Создай
.envна основе примера:cp .env.example .env -
Отредактируй
.env— укажи свои ссылки и метаданные. -
Настрой сертификаты (обязательно для работы по HTTPS).
Подробности ниже в разделе SSL / Сертификаты.
-
Запусти:
docker compose up -d
Подписка будет доступна по адресу:
https://your-domain:2096/sub/<username>
Конфигурация
Основная конфигурация находится в файле .env.
URLS
Параметр URLS — это JSON-объект, где ключ — имя пользователя, а значение — массив ссылок.
Пример:
{
"all": [
"https://panel.example.com:2096/sub/{}",
"vless://...@server.com:443?security=reality#{}"
],
"crutoboy": [
"hysteria2://...@server.com:444#user-{}"
]
}
- Ключ
"all"— ссылки, которые получают все пользователи. - Другие ключи — персональные ссылки для конкретного пользователя.
- На место
{}подставляется имя пользователя из URL.
Поддерживаемые типы ссылок:
https://...— внешняя подписка (сервер сам её скачает и объединит)vless://,hysteria2://,trojan://,vmess://и т.д. — прямые конфиги
Глобальные метаданные подписки
Эти параметры добавляются во все подписки:
| Переменная | Описание | Пример |
|---|---|---|
SUPPORT_URL |
Ссылка на поддержку | https://t.me/your_support |
PROFILE_WEB_PAGE_URL |
Ссылка на панель / профиль | https://panel.example.com |
ANNOUNCE |
Объявление (показывается в клиентах) | Техработы 25.06 с 23:00 |
UPDATE_INTERVAL |
Интервал обновления подписки (в часах) | 12 |
SUBSCRIPTION_USERINFO |
Fallback для статистики трафика | upload=0; download=0; total=0; expire=0 |
HAPP_ROUTING_LINK |
Ссылка на маршрутизацию для клиента Happ | happ://routing/add/... |
Важно: Если среди ваших
https://ссылок есть подписки от 3x-ui / Hiddify и т.д., тоSubscription-Userinfoбудет автоматически подтягиваться оттуда и объединяться.
SSL / Сертификаты
Сервер по умолчанию работает по HTTP. Для продакшена рекомендуется использовать HTTPS.
В поставляемом docker-compose.yml настроен запуск с SSL напрямую через gunicorn. Для этого в контейнере должны быть доступны файлы сертификатов:
fullchain.pemprivkey.pem
Получение сертификатов через Certbot (рекомендуется)
Самый правильный способ — не копировать сертификаты, а смонтировать их напрямую из директории Let's Encrypt.
- Получи сертификат:
sudo apt update
sudo apt install certbot
sudo certbot certonly --standalone -d your-domain.com
- Отредактируй
docker-compose.ymlи замени путь к сертификатам:
volumes:
# Вместо ./certs монтируем настоящие сертификаты Let's Encrypt
- /etc/letsencrypt/live/your-domain.com:/certs:ro
- Запусти:
docker compose up -d
При таком подходе после автоматического продления сертификатов (certbot renew) ничего дополнительно делать не нужно.
Альтернатива: Симлинк в папку certs
Если по каким-то причинам хочешь оставить структуру с ./certs, можно сделать симлинк:
sudo ln -s /etc/letsencrypt/live/your-domain.com /path/to/project/certs
После этого можно не менять docker-compose.yml.
Самоподписной сертификат (только для теста)
mkdir -p certs
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
-keyout certs/privkey.pem \
-out certs/fullchain.pem \
-subj "/CN=your-domain.com"
Через reverse proxy (альтернатива)
Если предпочитаешь вынести SSL на уровень reverse proxy — используй Caddy, Nginx или Traefik. В этом случае можно запускать приложение без SSL (убрав блок command в docker-compose).
Переменные окружения
Полный список переменных окружения описан в файле .env.example.
Разработка
Локальный запуск
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python main.py
Лицензия
MIT
Проект создан для личного использования и self-hosted решений. Приветствуются пулл-реквесты и идеи по улучшению.