Files
site/content/blog/mypointvpn-serverus/index.md
T
protokeyandClaude Opus 5.5 672467a699 feat: MyPointVPN landing on mypointvpn.sokolab.xyz and post about Serverus
Landings get per-project themes (params.theme, params.fonts) and optional
chat/start/note/engine sections, so they don't look like clones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:22:41 +04:00

84 lines
7.9 KiB
Markdown

---
title: "MyPointVPN: как бот для VPN научился управлять серверами"
date: 2026-10-13T12:00:00+04:00
draft: false
tags:
- telegram
- vpn
- server
- ansible
- docker
summary: "Начинал с бота для портфолио, который ставит 3x-ui. По дороге выделил пакет Serverus, который управляет сервером целиком. Теперь бот живет на сервере, которым сам же и управляет"
---
23 сентября я сделал первый коммит в проект для портфолио: Телеграм-бот, который сам ставит и настраивает панель 3x-ui, чтобы у человека был свой VPN без ручной возни. Прошло три недели и около 40 коммитов, и VPN оказался не самой интересной частью.
## Как это выглядит
Вы арендуете сервер с Debian 12 или 13 у любого хостера, получаете IP и пароль root и присылаете боту одну строку `ip:пароль`. Бот переводит ssh на случайный порт со входом только по ключу, включает фаервол, обновляет систему и дальше управляет сервером сам.
Сервер можно забрать в любой момент кнопкой «Вернуть». Бот уберет свои доступы, откатит ssh и фаервол и пришлет новый пароль root. Данные на сервере останутся.
## VPN
Ради этого все и затевалось. Бот ставит 3x-ui и настраивает:
- подключение VLESS + XHTTP + Reality на 443 порту, цель для Reality бот подбирает сам
- по желанию сервер маскировки: клиенты подключаются к нему, он пересылает трафик на панель, и адрес панели нигде не светится
- домен с сертификатом Let's Encrypt для панели и подписки, а без домена короткий сертификат на IP, который продлевается автоматически
- прокси на выходе: свой или Cloudflare WARP
- шифрованный DNS на сервере: DNS-over-TLS, а если его режут, запасной DNS-over-HTTPS
Ключи клиентов бот выпускает и отзывает сам и выдает ссылки на подписку для v2rayN, Hiddify, Happ и v2rayNG. Ограничений на ключи нет: ни по трафику, ни по сроку, ни по устройствам. По каждому ключу видно трафик и когда клиент был онлайн.
Раз в сутки бот проверяет панель, Xray и сертификат подписки и пишет, если что-то сломалось или починилось.
## Почему без Cloudflare
Сначала бот умел работать через Cloudflare, и от этого пришлось отказаться. Cloudflare сам завершает TLS у себя и открывает до сервера новое соединение. А Reality живет как раз внутри TLS-рукопожатия клиента, и сервер должен увидеть его как есть. За Cloudflare Reality работать не может, так что поддержку я убрал.
## Где на самом деле работа
Когда я посмотрел на код, оказалось, что почти вся работа бота сводится к одному: взять голый Debian, закрыть его и дальше управлять им по ключу. Примерно то, что я описывал в [первичной настройке сервера](/blog/zero-setup-debian-server/), только без человека. 3x-ui лишь одна из задач поверх этого.
Поэтому код настройки серверов я выделил в отдельный пакет `serverus`. Это библиотека на ansible без Django и без Telegram с понятным программным API. Телеграм-часть тоже стала отдельным пакетом. Django-приложение осталось связующим звеном с бизнес-логикой.
## Второй сценарий: docker-сервер
Когда такая основа есть, следующий сценарий собирается быстро. Я сделал docker-сервер:
- бот ставит Docker, Caddy и автообновления системы, сертификаты для доменов выпускает Caddy
- приложение это папка с `docker-compose.yaml`, `.env` и `caddy.conf`, ее можно прислать боту архивом или по файлам
- перед применением бот показывает разницу и предупреждения по файлам, а если домен не указывает на сервер, тоже предупредит
- при применении бот проверяет compose, занятость портов и конфиг Caddy, и если что-то не так, приложение не трогает
- пересоздаются только изменившиеся сервисы
- кнопка «откатить» возвращает предыдущую версию файлов
- есть старт, стоп, рестарт и логи по сервисам, логин в приватный docker registry и гостевой доступ к volumes, чтобы залить данные
В примере к проекту лежит свой сервер RustDesk.
## Один код, разные боты
Что умеет бот, решает интерфейс, выбранный в админке: «MyPoint VPN», «Serverus» или оба сразу. Переключается на ходу, без перезапуска. Так из одного кода получаются разные боты.
## Бот держит сам себя
Моя любимая часть. Прод MyPointVPN развернут как приложение Serverus на docker-сервере, которым управляет этот же бот. Новая версия бота для него такое же приложение, как RustDesk.
## Стек
Python, Django, PostgreSQL, RabbitMQ + dramatiq (фоновые задачи с супервизором), ansible, собственный сервер Telegram Bot API, Docker, Caddy, 3x-ui v3.8.5.
## Попробовать и обсудить
У проекта есть своя страница: **[mypointvpn.sokolab.xyz](https://mypointvpn.sokolab.xyz/)**.
- [Бот](https://t.me/barbarisiska_bot)
- [Код](https://git.sokolab.xyz/s0k0l/mypointvpn), там же вики: деплой, перенос данных и как устроено приложение для Serverus
- [Задачи в Redmine](https://redmine.sokolab.xyz/projects/mypointvpn)
- [Форум для вопросов и идей](https://redmine.sokolab.xyz/boards/2/topics/3), там же гостевой вход, регистрироваться не обязательно
## Что дальше
Serverus, скорее всего, станет отдельным проектом. Расскажу о нем отдельной записью, и у него будет свой лендинг. Продолжение следует.