Веб-консоль для развёртывания и мониторинга MTProto-прокси Telegram на удалённых VPS
Добавь сервер по SSH — система сама поставит Docker, поднимет прокси и выдаст готовую ссылку tg://proxy?….
|
🚀 Развёртывание
|
📊 Мониторинг и управление
|
🔒 Безопасность: SSH-credentials шифруются AES-256-GCM · TOFU-проверка host-key (защита от MITM) · JWT в httpOnly-cookie · обязательная смена слабого пароля · HTTPS через Caddy + Let's Encrypt.
| Список серверов | Детали сервера |
|---|---|
| Добавление сервера | Вход |
| mtg v2 | tg-ws-proxy | |
|---|---|---|
| Образ | nineseconds/mtg:2 |
dato1/tg-ws-proxy:latest |
| Порт по умолчанию | 443 |
1443 (рекомендуется 443) |
| Fake TLS / SNI | всегда (ee-секрет) | опционально |
| Ссылка | …&secret=ee… |
…&secret=dd… или ee… |
| SNI из whitelist | да | только при Fake TLS |
SNI-домен случайно выбирается из russia-mobile-internet-whitelist.
flowchart TD
U([👤 Пользователь]) -->|HTTPS| C[Caddy + React UI]
C -->|/api/*| A[Go API · SQLite · JWT]
A -->|SSH деплой| V1[VPS · mtg]
A -->|SSH деплой| V2[VPS · tg-ws-proxy]
A -. ping / TCP .-> V1
A -. ping / TCP .-> V2
| Слой | Технологии |
|---|---|
| Backend | Go 1.24, SQLite (pure-Go), JWT, golang.org/x/crypto/ssh |
| Frontend | React 18, TypeScript, Vite |
| Reverse proxy / TLS | Caddy 2 + Let's Encrypt |
| Прокси | nineseconds/mtg:2, dato1/tg-ws-proxy:latest |
| Оркестрация | Docker Compose |
Требования: Docker и Docker Compose. Для production с HTTPS — домен с A-записью и открытые порты 80/443.
git clone https://github.com/dato-dev/mtprotoui.git
cd mtprotoui
cp .env.example .envЗаполни ключевые переменные в .env:
ENCRYPTION_KEY=<openssl rand -base64 32>
JWT_SECRET=<любая длинная случайная строка>
ADMIN_USER=admin
ADMIN_PASSWORD=<временный пароль>
# Production
DOMAIN=mtproto.example.com
ACME_EMAIL=admin@example.com
# Локально (без TLS): DOMAIN=localhost и HTTP_PORT=8080Запусти:
docker compose up --build -dОткрой WebUI — https://<DOMAIN> (или http://localhost:8080 локально). При первом входе система попросит сменить пароль на надёжный (мин. 12 символов: верхний/нижний регистр, цифра, спецсимвол).
- «Добавить сервер» → IP, SSH-доступ, тип прокси, порт, теги
- (опционально) «Проверить SSH»
- Подтвердить — пойдёт фоновый деплой с прогрессом
Требования к VPS: Linux с SSH (root или пользователь в группе docker), открытый порт прокси, исходящий интернет (Docker Hub, get.docker.com).
Образы публикуются в Docker Hub (dato1/mtprotouiapi, dato1/mtprotouicaddy). Сборка/пуш с машины разработки:
docker login
docker compose -f docker-compose-prod.yml build
docker compose -f docker-compose-prod.yml pushНа сервере (рядом нужны только docker-compose-prod.yml и .env):
docker compose -f docker-compose-prod.yml pull
docker compose -f docker-compose-prod.yml up -dОбразы фиксированы на
linux/amd64, так что сборка с Apple Silicon корректно запустится на amd64-VPS.
| Переменная | Описание |
|---|---|
ENCRYPTION_KEY |
Base64, 32 байта — шифрование SSH-credentials |
JWT_SECRET |
Секрет для JWT-сессий |
ADMIN_USER |
Логин администратора |
ADMIN_PASSWORD |
Начальный пароль (сменится при первом входе) |
| Переменная | По умолчанию | Описание |
|---|---|---|
DOMAIN |
localhost |
Домен WebUI. Реальный домен → авто Let's Encrypt |
ACME_EMAIL |
— | Email для Let's Encrypt |
HTTP_PORT / HTTPS_PORT |
80 / 443 |
Порты на хосте |
| Переменная | По умолчанию | Описание |
|---|---|---|
HEALTH_INTERVAL |
5m |
Интервал фоновых проверок |
PING_ENABLED |
true |
ICMP ping (нужен NET_RAW) |
PING_COUNT |
3 |
Число ping-пакетов |
PING_TIMEOUT / TCP_TIMEOUT |
4s |
Таймауты проверок |
| Переменная | По умолчанию | Описание |
|---|---|---|
WHITELIST_URL |
GitHub whitelist | URL списка SNI-доменов |
SNI_ROTATION_INTERVAL |
0 |
Интервал авто-ротации SNI (напр. 24h); 0 — выключено. Меняет SNI/secret/ссылку у серверов с включённой опцией |
ADMIN_PASSWORD_RESET |
false |
true → при старте сбросить пароль админа на ADMIN_PASSWORD и потребовать смену. После входа вернуть false |
| Метод | Путь | Описание |
|---|---|---|
POST |
/api/auth/login |
Вход |
POST |
/api/auth/change-password |
Смена пароля |
GET |
/api/servers |
Список серверов |
POST |
/api/servers |
Добавить + деплой |
PATCH |
/api/servers/:id |
Редактировать (авто-редеплой при смене порта/хоста) |
DELETE |
/api/servers/:id |
Удалить (async) |
POST |
/api/servers/:id/recreate |
Пересоздать прокси |
POST |
/api/servers/:id/health |
Ручная проверка |
GET |
/api/servers/:id/stats |
Метрики контейнера |
GET |
/api/servers/:id/qr |
QR-код proxy-ссылки (PNG) |
GET |
/api/servers/:id/logs |
Логи контейнера (?tail=N) |
POST |
/api/servers/test-ssh |
Тест SSH |
GET |
/api/audit |
Журнал действий (кто/когда/что) |
- SSH-credentials шифруются AES-256-GCM (
ENCRYPTION_KEY) - TOFU-проверка SSH host-key: ключ пиннится при первом подключении, при подмене соединение отклоняется
- JWT хранится в httpOnly-cookie
- Обязательная смена слабого начального пароля
- Аудит-лог действий с серверами
- WebUI рекомендуется держать за HTTPS (Caddy + Let's Encrypt)
- Не коммитьте
.env— он в.gitignore
# Frontend (Vite проксирует /api → :8080)
cd frontend && npm install && npm run dev
# Backend
cd backend && go run ./cmd/api # переменные из .env
# Сборка всего стека
docker compose up --build -dmtprotoui/
├── backend/ # Go API
│ ├── cmd/api/
│ └── internal/{api,auth,crypto,deploy,health,operation,sshclient,store,whitelist}
│ └── deploy/scripts/ # deploy-mtproto.sh, deploy-tgws.sh
├── frontend/ # React + TypeScript (Vite)
├── caddy/ # Caddy + сборка UI
├── docs/img/ # скриншоты для README
├── docker-compose.yml # dev (локальная сборка)
├── docker-compose-prod.yml # prod (образы из registry)
└── ROADMAP.md
Реализовано: типы прокси, ротация SNI, редактирование, теги, поиск/фильтр/сортировка, массовые операции, метрики, QR, логи, аудит, TOFU host-key, сброс пароля, ретраи деплоя.
В планах: стриминг логов в реальном времени, метрики уровня прокси (ss/stats-endpoint), уведомления при падении, история uptime, многопользовательский режим, тесты бэкенда.
📋 Полный список и прогресс — в ROADMAP.md.
MIT © 2026 Timur Abdullin