Полезное
Команды, шаблоны и обновление сертификатов. Выберите раздел:
Сервисные шаблоны и пути на серверах
Эталонные файлы лежат в репозитории в /root/bot/service/. Установщик копирует systemd-юниты как есть; nginx для бота генерирует из шаблона с вашим доменом и секретным путём.
systemctl daemon-reload && systemctl restart ИМЯ. После правки nginx: nginx -t && systemctl reload nginx.| Шаблон в репозитории | Путь на сервере | Как появляется |
|---|---|---|
service/vpn-bot.service |
/etc/systemd/system/vpn-bot.service |
install_bot.sh копирует |
service/vpn-webadmin.service |
/etc/systemd/system/vpn-webadmin.service |
install_bot.sh копирует |
service/xuiweb.service |
/etc/systemd/system/xuiweb.service |
install_bot.sh копирует |
нет в service/ — текст в Личный кабинет |
/etc/systemd/system/website.service |
создаёте вручную на сервере бота |
нет в service/ — пишет SUBPAGE install.sh |
/etc/systemd/system/subpage.service |
на сервере бота или отдельном SUBPAGE |
| Шаблон в репозитории | Путь на сервере | Где |
|---|---|---|
service/xuiweb.conf (пример) |
/etc/nginx/conf.d/xuiweb.conf |
Сервер бота. install_bot.sh пишет готовый конфиг (домен + секретный путь). Шаблон — образец location’ов. |
service/remnawave.conf (пример) |
/etc/nginx/conf.d/remnawave.conf |
Сервер панели Remnawave (или тот же VPS, если панель «под ботом»). Обычно ставит install_nginx.sh. |
| Файл | Куда ставится | Сервис |
|---|---|---|
service/requirements.txt |
/root/bot/venv и /root/bot/web_admin/venv |
vpn-bot, vpn-webadmin |
service/xuiweb.txt |
/root/bot/xuiweb/venv |
xuiweb |
service/website.txt |
/root/bot/website/venv |
website — см. кабинет |
| Сервис | Слушает | Кто проксирует |
|---|---|---|
vpn-bot | 127.0.0.1:8081 (вебхуки оплат и Remnawave) | nginx xuiweb.conf |
vpn-webadmin | 127.0.0.1:8181 | nginx /СЕКРЕТНЫЙ_ПУТЬ/ |
xuiweb | 127.0.0.1:8282 | nginx /api/ |
subpage | 127.0.0.1:3004 (типично) | nginx / на домене бота или свой домен |
| Remnawave | 127.0.0.1:3000 | nginx remnawave.conf |
website | 0.0.0.0:3012 | nginx на проксирующем сервере кабинета |
Тексты юнитов и nginx из service/ — ниже. Домен в примерах условный.
vpn-bot.service → /etc/systemd/system/vpn-bot.service
[Unit] Description=VPN Telegram Bot After=network.target [Service] Type=simple User=root WorkingDirectory=/root/bot ExecStart=/root/bot/venv/bin/python3 /root/bot/main.py Restart=always [Install] WantedBy=multi-user.target
vpn-webadmin.service → /etc/systemd/system/vpn-webadmin.service
[Unit] Description=VPN Web Admin After=network.target [Service] Type=simple User=root WorkingDirectory=/root/bot Environment="PATH=/root/bot/web_admin/venv/bin:/usr/local/bin:/usr/bin:/bin" Environment="PYTHONPATH=/root/bot" ExecStart=/root/bot/web_admin/venv/bin/hypercorn web_admin.run:app -w 1 --bind 127.0.0.1:8181 --keep-alive 30 Restart=always RestartSec=10 StandardOutput=journal StandardError=journal LimitNOFILE=65536 MemoryMax=1.5G [Install] WantedBy=multi-user.target
xuiweb.service → /etc/systemd/system/xuiweb.service
[Unit] Description=XUIWEBFASTAPI After=network.target [Service] User=root Group=www-data WorkingDirectory=/root/bot/xuiweb Environment="PATH=/root/bot/xuiweb/venv/bin" ExecStart=/root/bot/xuiweb/venv/bin/gunicorn --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:8282 run:app Restart=always RestartSec=5s [Install] WantedBy=multi-user.target
xuiweb.conf пример → /etc/nginx/conf.d/xuiweb.conf
server {
listen 80;
listen [::]:80;
server_name bot.domain.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name bot.domain.ru;
ssl_certificate /etc/letsencrypt/live/bot.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bot.domain.ru/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
client_max_body_size 50M;
location /admin123/ {
proxy_pass http://127.0.0.1:8181/admin123/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_buffering off;
client_max_body_size 50M;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
send_timeout 300s;
}
location /api/ {
proxy_pass http://127.0.0.1:8282/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://127.0.0.1:3004;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /yoomoney/ {
proxy_pass http://127.0.0.1:8081/yoomoney/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
}
location /platega/ {
proxy_pass http://127.0.0.1:8081/platega/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
}
location /yookassa/ {
proxy_pass http://127.0.0.1:8081/yookassa/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
}
location /cryptobot/ {
proxy_pass http://127.0.0.1:8081/cryptobot/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
}
location /wata/ {
proxy_pass http://127.0.0.1:8081/wata/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 90s;
proxy_connect_timeout 30s;
proxy_send_timeout 90s;
}
location /remnawave/webhook {
client_max_body_size 64M;
proxy_pass http://127.0.0.1:8081/remnawave/webhook;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 30s;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
}
}
/admin123/ на сервере заменяется на ваш admin_secret_path. Домен — на реальный.
remnawave.conf пример → /etc/nginx/conf.d/remnawave.conf
server {
listen 80;
listen [::]:80;
server_name panel.domain.ru;
return 301 https://$host$request_uri;
}
server {
server_name panel.domain.ru;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/panel.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.domain.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/panel.domain.ru/fullchain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 valid=60s;
resolver_timeout 2s;
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}
Сервисные команды
Отладка systemd на сервере. Действия: restart, start, enable, stop, disable, status.
website и subpage. Если юнит не установлен, systemctl напишет ошибку по нему — остальные сервисы всё равно выполнятся.
Журнал: поток в реальном времени (-f), выход — Ctrl+C.
Общие команды для всех сервисов
systemctl restart vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
systemctl start vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
systemctl status vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
systemctl enable vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
systemctl stop vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
systemctl disable vpn-bot.service vpn-webadmin.service xuiweb.service website.service subpage.service
journalctl — журнал в реальном времени
Показывает последние строки и дальше пишет новые, как только они появляются. Выход: Ctrl+C.
journalctl -u vpn-bot.service -u vpn-webadmin.service -u xuiweb.service -u website.service -u subpage.service -n 100 -f
journalctl -u vpn-bot.service -n 100 -f
journalctl -u vpn-webadmin.service -n 100 -f
journalctl -u xuiweb.service -n 100 -f
journalctl -u website.service -n 100 -f
journalctl -u subpage.service -n 100 -f
Команды по каждому сервису
vpn-bot.service
systemctl restart vpn-bot.servicesystemctl start vpn-bot.servicesystemctl stop vpn-bot.servicesystemctl status vpn-bot.servicesystemctl enable vpn-bot.servicesystemctl disable vpn-bot.servicevpn-webadmin.service
systemctl restart vpn-webadmin.servicesystemctl start vpn-webadmin.servicesystemctl stop vpn-webadmin.servicesystemctl status vpn-webadmin.servicesystemctl enable vpn-webadmin.servicesystemctl disable vpn-webadmin.servicexuiweb.service
systemctl restart xuiweb.servicesystemctl start xuiweb.servicesystemctl stop xuiweb.servicesystemctl status xuiweb.servicesystemctl enable xuiweb.servicesystemctl disable xuiweb.servicewebsite.service
systemctl restart website.servicesystemctl start website.servicesystemctl stop website.servicesystemctl status website.servicesystemctl enable website.servicesystemctl disable website.servicesubpage.service
systemctl restart subpage.servicesystemctl start subpage.servicesystemctl stop subpage.servicesystemctl status subpage.servicesystemctl enable subpage.servicesystemctl disable subpage.serviceСмена секретного пути в админку
https://ваш-домен.ru/admin123/. Важно менять его строго в правильном порядке, иначе потеряете доступ.- 1
Откройте веб-админку → Настройки → Основные и найдите параметр
admin_secret_path. Задайте новое значение, например:MySecretPanel
Используйте только латинские буквы и цифры, без слэшей и пробелов. - 2 Нажмите Сохранить. После этого старый адрес веб-админки ещё работает — сессия активна.
- 3
Подключитесь к серверу по SSH и откройте конфиг Nginx:
bash
nano /etc/nginx/conf.d/xuiweb.conf - 4
Найдите строки со старым путём и замените на новый (два места — в
locationи вproxy_pass):nginx — былоlocation /admin123/ { proxy_pass http://127.0.0.1:8181/admin123/; ... }Сохраните файл: Ctrl+O → Enter → Ctrl+Xnginx — сталоlocation /MySecretPanel/ { proxy_pass http://127.0.0.1:8181/MySecretPanel/; ... } - 5
Проверьте синтаксис Nginx и перезапустите:
bash
nginx -t && systemctl reload nginx
- 6
Перезапустите сервисы веб-админки:
bash
systemctl restart vpn-webadmin - 7
Откройте веб-админку по новому адресу:
Новый URL
https://ваш-домен.ru/MySecretPanel/
Обновление SSL-сертификата бота
/root/cert/fullchain.pem и /root/cert/privkey.pem
(см. /etc/nginx/conf.d/xuiweb.conf). Let's Encrypt хранит оригиналы в
/etc/letsencrypt/live/ваш-домен.ru/ — после продления их нужно скопировать в /root/cert/,
иначе nginx продолжит отдавать старый сертификат.
updomain.sh на время выпуска сертификата останавливает nginx (certbot standalone на порту 80).
Способ 1 — скрипт updomain.sh (рекомендуется)
Подходит и для смены домена, и для продления сертификата на текущем домене. При продлении введите тот же домен, что уже в nginx.
cd /root/bot bash updomain.sh
Скрипт выполняет:
- 1Открывает порт 80 в UFW (если UFW активен)
- 2Останавливает nginx
- 3Запрашивает сертификат:
certbot certonly --standalone -d ДОМЕН --force-renewal - 4Копирует
fullchain.pemиprivkey.pemв/root/cert/ - 5Обновляет
server_nameв/etc/nginx/conf.d/xuiweb.conf(если введён новый домен) - 6Перезапускает
nginx,xuiweb,vpn-webadmin
Способ 2 — вручную (копирование в /root/cert/)
Если certbot уже продлил сертификат (cron/timer) или вы получили его отдельной командой — достаточно скопировать файлы и перезагрузить nginx.
Замените ваш-домен.ru на ваш домен бота.
cp /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem /root/cert/fullchain.pem cp /etc/letsencrypt/live/ваш-домен.ru/privkey.pem /root/cert/privkey.pem nginx -t && systemctl reload nginx
Если сертификат ещё не продлён — сначала получите его (nginx нужно остановить, порт 80 должен быть свободен):
systemctl stop nginx certbot certonly --standalone -d ваш-домен.ru --force-renewal cp /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem /root/cert/fullchain.pem cp /etc/letsencrypt/live/ваш-домен.ru/privkey.pem /root/cert/privkey.pem nginx -t && systemctl start nginx systemctl restart xuiweb vpn-webadmin
openssl s_client -connect ваш-домен.ru:443 -servername ваш-домен.ru — смотрите notAfter (это надёжнее, чем UI браузера).
Обновление SSL — SUBPAGE
/etc/letsencrypt/live/ДОМЕН/ — копировать в /root/cert/ не нужно.
Способ 1 — standalone
Как при первой установке SUBPAGE: certbot сам поднимает временный веб-сервер на порту 80.
Замените sub.example.com на домен SUBPAGE.
systemctl stop nginx certbot certonly --standalone -d sub.example.com --force-renewal nginx -t && systemctl start nginx
Через CLI SUBPAGE тот же standalone: sudo subpage → Управление Nginx → обновление SSL.
Способ 2 — как обычно (плагин nginx)
Nginx не останавливаем. Certbot проходит проверку Let's Encrypt через уже работающий nginx.
Нужен пакет python3-certbot-nginx и рабочий server_name на этот домен.
certbot certonly --nginx -d sub.example.com --force-renewal nginx -t && systemctl reload nginx
Обновление SSL — WEBSITE (личный кабинет)
/etc/letsencrypt/live/cabinet.ваш-домен.ru/ — nginx читает его оттуда напрямую.
Способ 1 — standalone
Если плагин nginx не срабатывает или порт 80 занят самим nginx — остановите его, выпустите сертификат, запустите обратно.
Замените cabinet.ваш-домен.ru на домен кабинета.
systemctl stop nginx certbot certonly --standalone -d cabinet.ваш-домен.ru --force-renewal nginx -t && systemctl start nginx
Способ 2 — как обычно (плагин nginx)
Как при установке кабинета: nginx не останавливаем. Нужен python3-certbot-nginx.
certbot certonly --nginx -d cabinet.ваш-домен.ru --force-renewal nginx -t && systemctl reload nginx
openssl s_client -connect cabinet.ваш-домен.ru:443 -servername cabinet.ваш-домен.ru — смотрите notAfter.
Список сертификатов на сервере: certbot certificates.