Lockdown
Self-hosted платформа для приватного удалённого доступа: многопротокольный шлюз Xray (VLESS+Reality, VLESS+XHTTP), веб-админка с реалтайм-статистикой по WebSocket и Telegram-бот для управления пользователями.
Функционал
- Реалтайм-дашборд: трафик каждого пользователя обновляется через WebSocket каждые 2 секунды без перезагрузки страницы.
- Метрики соединения: отдельная вкладка Network показывает RTT, message rate, reconnect count, uptime WS-соединения и лог событий.
- Аутентификация: логин/пароль на bcrypt + JWT-токен с TTL 24 часа.
- Telegram-бот: отдельный сервис выдаёт ключи через flow «заявка → одобрение», ведёт SQLite со списком пользователей.
- VPN-шлюз: Xray-core с двумя транспортами — VLESS+XTLS Vision+Reality (TCP) на :443 и VLESS+XHTTP+Reality (HTTP/2 multiplexing) на :2096.
- Статистика трафика: локальный gRPC API Xray на :10085, FastAPI читает его через subprocess
xray api statsqueryи распространяет данные подписчикам через pub-sub.
Архитектура
VPN-клиент ─TLS(Reality)─► Xray :443/:2096
│
│ gRPC stats (loopback :10085)
▼
Browser ─HTTPS─► nginx :4443 ─proxy/upgrade─► uvicorn :8001 (FastAPI)
│ │
│ ├─ poll каждые 2s
│ ├─ JWT (bcrypt + HS256)
│ └─ WS broadcast (pub-sub)
▼
статистика трафика
по пользователям
Telegram ─HTTPS long-poll─► bot (отдельный процесс) ─► xray config + SQLite
Стек
| Компонент | Технология |
|---|---|
| Backend | FastAPI, uvicorn (Python 3.12) |
| Auth | bcrypt + PyJWT (HS256) |
| Realtime | WebSocket (RFC 6455) с heartbeat и reconnect |
| Bot | python-telegram-bot 20.x, aiosqlite |
| Proxy | nginx 1.27 (TLS termination, WS upgrade) |
| VPN | Xray-core (VLESS+Reality+Vision, VLESS+XHTTP+Reality) |
| Stats | xray gRPC API через CLI subprocess |
| Deploy | Docker Compose или systemd + rsync |
Сетевые особенности
- TLS 1.2/1.3 на nginx, HTTP/2 на внешнем порту, HTTP/1.1 на внутреннем upstream.
- HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy.
- Reality-handshake маскирует TLS под произвольный публичный TLS-сервер по SNI.
- XTLS Vision не шифрует внутренний TLS дважды (передаёт passthrough).
- WebSocket: ping/pong каждые 30 секунд, exponential backoff на reconnect (1s → 2s → 4s → … → 30s).
- Pub-sub в админке: один фоновый poller дёргает xray и публикует снапшот в очереди подписчиков — N клиентов не создают N процессов xray.
Исходный код
Репозиторий проекта на GitHub: github.com/Simonchello/uni_network