Skip to content

Деплой на VPS (systemd)

Альтернатива Docker-установке для тех, кто хочет запускать процессы напрямую через systemd. Проверено на Ubuntu 24.04, 1 vCPU / 1 GB RAM (на 1 GB обязателен swap 2 GB).

Раскладка на сервере

  • /opt/vpnshop/app — код, .venv, .env с секретами, admin/dist (собранная SPA)
  • /opt/vpnshop/compose.dev.yml — Postgres 16 + Redis 7 в docker, доступ только с localhost
  • systemd-юниты, все с MemoryMax под размер RAM:
ЮнитЧтоПорт
vpnshop-webuvicorn: admin API, cabinet API, вебхуки, статика:8000
vpnshop-botTelegram-бот (long polling)
vpnshop-workertaskiq: рассылки, бэкапы, синк, обработка оплат
vpnshop-schedulertaskiq: задачи по расписанию
vpnshop-mockpanelмок-панель Remnawave:3010
  • nginx: 443 с сертификатом Let's Encrypt (авто-обновление certbot) → / на :8000, /sub/ на :3010

Что где доступно после провижининга:

ЧтоГде
Админ-кабинетhttps://your-domain/admin/ (логин/пароль — ADMIN__USERNAME/ADMIN__PASSWORD из .env)
Мини-аппаhttps://your-domain/app/ (превью тем: ?mock=1&variant=a..h&mode=dark)
Admin APIhttps://your-domain/api/admin/…
Cabinet APIhttps://your-domain/api/cabinet/…
Ссылки подписки мок-панелиhttps://your-domain/sub/<short>

Деплой обновлений

С локальной машины, из корня репозитория:

bash
./scripts/deploy.sh user@your-server https://your-domain

Что происходит по шагам:

  1. SPA кабинета собирается локально (npm run build --prefix admin) — Node на сервере не нужен.
  2. rsync рабочей копии в /opt/vpnshop/app — git на сервере не нужен; .env, backups/, uploads/ не трогаются.
  3. На сервере: uv sync --frozen --no-devalembic upgrade headsystemctl restart vpnshop-* → вывод статуса юнитов.
  4. Health-check: скрипт ждёт до 90 секунд ответа 200 от /admin/ и проверяет /app/. Домен — второй аргумент; без него шаг пропускается.

Замена мок-панели на живую Remnawave

В /opt/vpnshop/app/.env:

REMNAWAVE__BASE_URL=https://panel.example.com
REMNAWAVE__TOKEN=<api token>

и systemctl restart vpnshop-web vpnshop-worker vpnshop-bot. Больше ничего не меняется — мок реализует те же эндпоинты и схемы, что использует клиент панели.

Логи

bash
journalctl -u vpnshop-web -f      # api
journalctl -u vpnshop-bot -f      # бот
journalctl -u vpnshop-worker -f   # рассылки/бэкапы/синк

INFO

Скрипт update.sh — только для Docker-установки. В systemd-варианте обновление — всегда deploy.sh с локальной машины.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов