Создание VPN на Hysteria2: опыт одиночки с AI-ассистентом | AiManual
AiManual Logo Ai / Manual.
24 Май 2026 Гайд

Как я создал VPN-сервис на Hysteria2: опыт одиночного SaaS с AI-помощью

Пошаговое создание продакшн VPN-сервиса на Hysteria2 с FastAPI, React, PostgreSQL и помощью ИИ. Все детали, код и ошибки для повторения своими руками.

Всё началось с блокировок 2026-го

В начале 2026 года привычные протоколы VPN, которые работали годами, начали массово отваливаться. OpenVPN срезали на первых пакетах, WireGuard палили по handshake. Абоненты скупали VPS, ставили shadowsocks, но DPI (Deep Packet Inspection) адаптировался быстрее, чем я успевал менять конфиги.

Я тогда занимался администрированием небольшой инфраструктуры и параллельно писал стартап с AI-агентами. В какой-то момент понял: нужно сделать свой VPN-сервис, который будет обходить блокировки из коробки, не требовать ручного тюнинга и при этом масштабироваться под десятки пользователей. И сделать это одному, используя современные тулы и AI-ассистентов.

Так появился TunnelFast — open-source SaaS для быстрой раздачи доступа к Hysteria2. Весь код лежит на GitHub, но я не буду вас грузить ссылками — лучше покажу, как собрать свой аналог за вечер.

💡
Статья будет полезна всем, кто хочет запустить свой VPN-сервис: от настройки Hysteria2 до деплоя админки на React. Я покажу реальную архитектуру, которую можно повторно использовать для любого SaaS на FastAPI.

Почему Hysteria2 — это не просто очередной протокол

В 2025-2026 годах на рынке прокси-протоколов сложилась чёткая картина: классические TCP-туннели (OpenVPN, SSTP) проигрывают скорость, WireGuard — незаметен только при правильной обфускации, Shadowsocks — всё ещё работает, но его уже научились детектить по энтропии трафика.

Hysteria2 (hysteria2 на git) построен на QUIC и использует многопоточную передачу. Он не просто шифрует — он маскирует трафик под обычный UDP-quic браузеров. Плюс встроенный механизм fake TCP: если провайдер режет UDP, Hysteria2 упаковывает QUIC-пакеты в TCP-сегменты, и это работает чертовски быстро.

Но главное — обфускация. Hysteria2 поддерживает смену метрик (v2) и имитацию популярных протоколов вроде HTTP/3. Сервер генерирует сертификаты Let's Encrypt автоматически, клиент не требует сложных настроек. Идеально для массового использования.

1 Выбор стека: FastAPI + React + PostgreSQL

Когда протокол выбран, нужно решить, как управлять пользователями. Я мог бы раздавать ключи руками (как делают 90% мелких сервисов), но это не SaaS. Поэтому я спроектировал бэкенд на FastAPI (Python 3.12) с админкой на React (Vite + Ant Design). База данных — PostgreSQL, кэш — Redis.

AI-ассистент (Cursor AI) здорово помог на этапе написания шаблонного кода: CRUD для юзеров, вебхуки к Hysteria2, генерация QR-кодов для клиентов. Без него я бы потратил раза в два больше времени на повторяющиеся задачи. Подробнее про опыт создания полноценного фронта без ручного кодинга я писал в статье «Создание полноценного веб-сервиса без единой строчки кода с помощью Cursor AI».

Схема работы сервиса:

  • Пользователь регистрируется через сайт, выбирает регион сервера (локации VPS доступны в админке).
  • Бэкенд создаёт конфигурацию для Hysteria2, запускает новый инстанс сервера (через Docker Compose) или дописывает клиента в уже существующий.
  • Redis хранит активные сессии и токены для быстрой аутентификации.
  • PostgreSQL — полная история: подписки, статистика трафика, логи.
  • Фронтенд отображает пользователю готовую ссылку для импорта в клиент (hysteria2://...) и QR-код.

Архитектура: как я связал Hysteria2 и FastAPI

Самый тонкий момент — управление Hysteria2 через API. У него есть встроенный REST API (по умолчанию на порту 8080), который принимает команды на добавление/удаление пользователей и получение статистики. Я сделал слой абстракции в FastAPI: модуль-адаптер HysteriaClient, который общается с серверным API через авторизацию по токену.

Типичный эндпоинт создания пользователя:

# app/clients/hysteria.py

import httpx

class HysteriaClient:
    def __init__(self, base_url: str, secret: str):
        self.client = httpx.AsyncClient(
            base_url=base_url,
            headers={"Authorization": f"Bearer {secret}"}
        )

    async def add_user(self, user_id: str, quota_gb: int = 100):
        payload = {
            "uuid": user_id,
            "quota": {
                "enabled": True,
                "max_bytes": quota_gb * 1024**3
            }
        }
        response = await self.client.post("/user", json=payload)
        response.raise_for_status()
        return response.json()

    async def get_traffic(self, user_id: str) -> dict:
        resp = await self.client.get(f"/user/{user_id}/traffic")
        return resp.json()

А вот как выглядит конфигурация самого сервера Hysteria2 (спойлер: там всего несколько ключевых параметров):

# config.yaml
listen: :443
tls:
  cert: /etc/letsencrypt/live/tunnel.example.com/fullchain.pem
  key: /etc/letsencrypt/live/tunnel.example.com/privkey.pem
quic:
  init_stream_receive_window: 8388608
  max_stream_receive_window: 8388608
  max_connections: 250
auth:
  type: token
  payload: my_secret_admin_token
acl:
  inline:
    - allow all
    - reject all

Деплой: от нуля до первого клиента за 2 часа

Расскажу по шагам, как я поднимал инфраструктуру. Предполагается, что у вас есть VPS (я брал на Timeweb — дешёво и нормальная сеть).

2 Поднимаем Hysteria2 сервер

# Установка (Ubuntu 24.04)
curl -fsSL https://github.com/apernet/hysteria/releases/latest/download/hysteria-linux-amd64 -o /usr/local/bin/hysteria
chmod +x /usr/local/bin/hysteria

# Генерация сертификата (через acme.sh)
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue --standalone -d tunnel.example.com

# Запуск с конфигом
hysteria server -c /etc/hysteria/config.yaml

3 Бэкенд: FastAPI + PostgreSQL

Я использовал Docker Compose для поднятия всего стека. Кстати, на этапе написания докерфайлов и CI/CD мне очень помогла практика из статьи «Свой ngrok за 10 часов» — там отлично описан процесс настройки туннелей и деплоя сервисов с помощью Claude Code.

# docker-compose.yml
version: '3.8'
services:
  backend:
    build: ./backend
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis
    environment:
      - DATABASE_URL=postgresql+asyncpg://user:pass@db/tunnel
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
  redis:
    image: redis:7-alpine
volumes:
  postgres_data:

4 Фронтенд: React + Vite + Ant Design

Фронтенд — самая простая часть, так как 90% UI сгенерировал Cursor AI. Основные страницы: логин, дашборд со статистикой трафика, форма создания подписки и список конфигураций. Данные получаем из FastAPI через REST.

// fetch configs from backend
const { data } = await axios.get('/api/user/configs', {
  headers: { Authorization: `Bearer ${token}` }
});

AI-помощь: как ИИ ускорил разработку в 10 раз

Я не писал каждую строчку сам. Вместо этого я использовал Cursor AI (с моделью Claude Code 4) и ChatGPT-4o. Вот несколько примеров:

  • Генерация CRUD-эндпоинтов. Я описал модели SQLAlchemy, а AI дописал ручки Create, Read, Update, Delete и тесты к ним.
  • Интеграция с Hysteria2 API. Мы вместе с AI спроектировали слой обработки ошибок: если сервер недоступен или конфиг битый, фронтенд показывает понятное сообщение.
  • Асинхронное обновление статистики. Через Celery и Redis собираю трафик каждые 5 минут — AI написал таски и celery-beat расписание.
  • Генерация промптов для AI-агентов. В одном из модулей я подключал AI-агента для проверки конфигов на уязвимости. Эта идея выросла из проекта про обучение ИИ работе с SSH — там очень наглядно показано, как агент выполняет команды на сервере.

⚠️ Важное предостережение: Не доверяйте AI-коду вслепую. У меня был случай, когда Cursor сгенерировал эндпоинт для удаления всех пользователей — без проверки прав. Если бы я не заметил, кто-то мог дропнуть базу. Всегда пересматривайте код, особенно касающийся авторизации и безопасности.

Нюансы и ошибки, которые дорого мне обошлись

Расскажу о трёх граблях, на которые наступил, чтобы вы их обошли.

Ошибка #1: Лимиты по умолчанию

В Hysteria2 есть параметр quic.init_stream_receive_window. По дефолту он 1 МБ. Это значит, что если пользователь скачивает большой файл, соединение закрывается. Я долго не мог понять, почему у клиентов обрывается связь на торрентах. Пришлось поднять до 8 МБ и добавить проверку в мониторинге.

Ошибка #2: Порты блокируются

Когда я запускал сервер впервые, я поставил порт 443. Но у некоторых железных провайдеров (например, мобильных) 443-й порт режется на уровне ядра. Решение — перенести на нестандартный порт (8443, 9090) или настроить port hopping между несколькими.

Ошибка #3: Отсутствие мониторинга

Первые две недели сервис работал на голом энтузиазме. Пока один пользователь не пожаловался, что не может подключиться. Оказалось, Let's Encrypt подставил сертификат с истекшим сроком — acme.sh не обновил cron. Решение: добавить healthcheck с уведомлением в Telegram (через Bot API) и Prometheus метрики.

Цифры: сколько стоит запустить всё это хозяйство

Ресурс Цена/мес (2026)
VPS (1 vCPU, 1 GB RAM, 50 GB SSD) ~400 руб.
Домен ~200 руб/год
PostgreSQL (managed или на той же VPS) Бесплатно
AI-ассистент (Cursor Pro + Claude API) 20-30$ (одноразово)

Часто задаваемые вопросы (из моего опыта поддержки)

— Можно ли использовать Hysteria2 без своего домена?

Да, но сертификат нужно получать на IP? Технически можно с самостоятельной подписью, но тогда клиенты увидят предупреждение о безопасности. Лучше взять дешёвый домен, который не блокируется.

— Как масштабировать на тысячи пользователей?

Hysteria2 легко выдерживает несколько сотен коннектов на одном сервере. Если нужно больше — ставьте несколько VPS в разных регионах и используйте load balancer на стороне бэкенда. FastAPI справится.

— А что с безопасностью?

Стандартные меры: HTTPS везде, пароли с bcrypt, токены через JWT с коротким сроком жизни (15 минут). База данных — только через TLS. И регулярные проверки на утечки (хотя бы раз в месяц).

Прогноз: что дальше?

Протоколы обхода блокировок — это гонка вооружений. Думаю, в ближайшие год-два DPI станет ещё умнее, и Hysteria2 тоже эволюционирует. Уже сейчас появляются ответвления с маскировкой под WebSocket и gRPC. Мой совет: не зацикливайтесь на одном протоколе, стройте гибкую платформу, где можно легко менять «движок». FastAPI + абстракция над транспортным слоем — идеальный выбор.

Если хотите повторить мой опыт — форкайте репозиторий, читайте исходники, задавайте вопросы в Issues. Одиночный SaaS — это вызов, но с современными инструментами и AI-помощью он превращается в увлекательный спринт. Главное — не бояться пробовать и доверять проверке кода.

Подписаться на канал