Initial commit: VPN Telegram bot (sanitized defaults)

This commit is contained in:
VPN Service
2026-07-26 23:21:41 +03:00
commit aaf04faa96
77 changed files with 33249 additions and 0 deletions
+390
View File
@@ -0,0 +1,390 @@
# VPN Telegram Bot + Remnawave Panel
Telegram-бот для выдачи VPN-подписок через API панели **Remnawave**.
Деплой: **Docker Compose** на Ubuntu (22.04 / 24.04 LTS).
Сейчас контейнер запускает проверку API (`check_api.py`). Дальше — `bot.py`.
---
## Содержание
1. [Что понадобится](#1-что-понадобится)
2. [Токен API в Remnawave](#2-токен-api-в-remnawave)
3. [Установка Docker на Ubuntu](#3-установка-docker-на-ubuntu)
4. [Установка проекта](#4-установка-проекта)
5. [Настройка `.env`](#5-настройка-env)
6. [Сборка и проверка API](#6-сборка-и-проверка-api)
7. [Структура проекта](#7-структура-проекта)
8. [Постоянный запуск бота](#8-постоянный-запуск-бота)
9. [Полезные команды](#9-полезные-команды)
10. [Частые ошибки](#10-частые-ошибки)
11. [Что дальше](#11-что-дальше)
---
## 1. Что понадобится
| Компонент | Зачем |
|-----------|--------|
| VPS / сервер Ubuntu 22.04 или 24.04 | Где крутится Docker |
| Docker + Docker Compose plugin | Сборка и запуск контейнера |
| Доступ к панели Remnawave | URL, например `https://panel.example.com` |
| API Token из панели | Авторизация запросов к API |
| [@BotFather](https://t.me/BotFather) | `BOT_TOKEN` (на следующем этапе) |
Официальные материалы Remnawave:
- Панель: [https://remna.st](https://remna.st)
- Python SDK: [https://github.com/remnawave/python-sdk](https://github.com/remnawave/python-sdk)
---
## 2. Токен API в Remnawave
1. Открой панель (например `https://panel.example.com`).
2. Войди под админом.
3. **Settings → API Tokens** — создай токен.
4. Скопируй сразу и положи в `.env` на сервере.
Если Caddy режет API отдельным ключом — понадобится ещё `CADDY_TOKEN`.
---
## 3. Установка Docker на Ubuntu
Подключись по SSH:
```bash
ssh user@your-server-ip
```
### Официальный способ (рекомендуется)
```bash
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
Проверка:
```bash
docker --version
docker compose version
sudo docker run --rm hello-world
```
Чтобы не писать `sudo` каждый раз:
```bash
sudo usermod -aG docker "$USER"
# выйди из SSH и зайди снова
newgrp docker
docker run --rm hello-world
```
### Быстрый вариант (snap, если так удобнее)
```bash
sudo snap install docker
docker --version
```
На production обычно лучше пакеты с `download.docker.com`, как выше.
---
## 4. Установка проекта
### 4.0. Установщик в 1 команду (рекомендуется)
На чистом Ubuntu 22.04 / 24.04, в каталоге с кодом:
```bash
sudo bash install.sh
```
Скрипт спросит домен, Remnawave, `BOT_TOKEN`, Postgres, логин админки, SMTP (опционально), поставит Docker при необходимости, откроет 80/443 (UFW), запишет `.env`, поднимет **Postgres + бот + Caddy (Let's Encrypt SSL)**.
Полезные флаги:
```bash
sudo bash install.sh --help
sudo bash install.sh --reinstall # пересборка без опроса (.env уже есть)
sudo bash install.sh --env-only # только пересоздать .env
```
### 4.1. Положи код на сервер
```bash
sudo mkdir -p /opt/vpn-telegram-bot
sudo chown "$USER":"$USER" /opt/vpn-telegram-bot
cd /opt/vpn-telegram-bot
```
Через git:
```bash
git clone <URL_РЕПОЗИТОРИЯ> .
```
Или с локальной машины:
```bash
scp -r ./vpn-telegram-bot/* user@your-server-ip:/opt/vpn-telegram-bot/
```
В каталоге должны быть как минимум:
- `Dockerfile`
- `docker-compose.yml`
- `requirements.txt`
- `check_api.py`
- `config.py`
- `remnawave_client.py`
- `.env.example`
### 4.2. Docker Compose не ставит Python на хост
Python и зависимости живут **внутри образа**. На хосте нужен только Docker.
---
## 5. Настройка `.env`
```bash
cd /opt/vpn-telegram-bot
cp .env.example .env
nano .env
chmod 600 .env
```
Пример:
```env
REMNAWAVE_BASE_URL=https://panel.example.com
REMNAWAVE_TOKEN=вставь_сюда_токен_панели
# Токен Telegram-бота от @BotFather
BOT_TOKEN=123456:AA...
# ID админов через запятую
ADMIN_IDS=123456789
# CADDY_TOKEN=
```
Правила:
- `REMNAWAVE_BASE_URL` — без `/` в конце, обычно без `/api`.
- `REMNAWAVE_TOKEN` — без слова `Bearer`.
- `BOT_TOKEN` — токен от [@BotFather](https://t.me/BotFather) (`/newbot`).
- `.env` не коммитить (есть в `.gitignore` и `.dockerignore`).
Compose подхватывает `.env` через `env_file` и подставляет переменные в контейнер.
---
## 6. Сборка и проверка API
Из каталога проекта:
```bash
cd /opt/vpn-telegram-bot
# собрать образ
docker compose build
# одноразовый прогон проверки API
docker compose run --rm bot
```
Или явно:
```bash
docker compose run --rm bot python check_api.py
```
Успех — в логе что-то вроде:
```text
✓ Remnawave API принимает запросы. Можно продолжать бота.
```
С verbose:
```bash
docker compose run --rm bot python check_api.py --verbose
```
Пересобрать после смены кода:
```bash
docker compose build --no-cache
```
---
## 7. Структура проекта
```text
vpn-telegram-bot/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── .env # секреты (не в git / не в образ)
├── .env.example
├── .gitignore
├── requirements.txt
├── config.py
├── remnawave_client.py
├── check_api.py
└── README.md
```
| Файл | Роль |
|------|------|
| `Dockerfile` | Образ Python 3.12 + зависимости |
| `docker-compose.yml` | Сервис `bot`, env, command |
| `check_api.py` | Проверка, что Remnawave API принимает запросы |
---
## 8. Запуск бота
`bot.py` отвечает на `/start` приветствием.
```bash
docker compose up -d --build
docker compose ps
docker compose logs -f bot
```
В Telegram открой бота и нажми **Start** (или отправь `/start`).
Остановить:
```bash
docker compose down
```
Проверка API по-прежнему:
```bash
docker compose run --rm bot python check_api.py
```
---
## 9. Полезные команды
```bash
# статус
docker compose ps
# логи
docker compose logs -f bot
# перезапуск
docker compose restart bot
# войти в контейнер
docker compose run --rm --entrypoint sh bot
# проверить сеть до панели с хоста
curl -sS -o /dev/null -w "%{http_code}\n" https://panel.example.com/api/system/health
# проверить из контейнера
docker compose run --rm bot curl -sS -o /dev/null -w "%{http_code}\n" https://panel.example.com/api/system/health
```
---
## 10. Частые ошибки
### `REMNAWAVE_TOKEN не задан`
Пустой `.env` или compose запущен не из каталога с `.env`.
```bash
cd /opt/vpn-telegram-bot
grep REMNAWAVE_ .env
docker compose run --rm bot env | grep REMNAWAVE_
```
### `401` / токен не принят
Неверный или отозванный токен, лишние пробелы/переносы в `.env`.
После правки `.env` перезапускать контейнер:
```bash
docker compose run --rm bot python check_api.py
```
### Не собирается образ / нет Docker
```bash
docker compose version
sudo systemctl status docker
sudo systemctl enable --now docker
```
### Сеть из контейнера
Если с хоста панель открывается, а из контейнера нет — DNS/firewall Docker:
```bash
docker compose run --rm bot curl -vI https://panel.example.com
```
### Permission denied на docker.sock
Пользователь не в группе `docker` — см. раздел 3 (`usermod -aG docker`).
### Caddy auth
Раскомментируй `CADDY_TOKEN` в `.env`.
---
## 11. Что дальше
1. Убедиться, что `docker compose run --rm bot` проходит проверку API.
2. Добавить `BOT_TOKEN` в `.env`.
3. Написать `bot.py` (aiogram) и сменить `command` / `restart` в compose.
4. Поднять постоянно: `docker compose up -d --build`.
---
## Краткая шпаргалка (Ubuntu + Docker Compose)
```bash
# Docker (один раз)
sudo apt update
# ... установка docker-ce и docker-compose-plugin из раздела 3 ...
# Проект
cd /opt/vpn-telegram-bot
cp .env.example .env
nano .env # REMNAWAVE_BASE_URL + REMNAWAVE_TOKEN
chmod 600 .env
docker compose build
docker compose run --rm bot
```
Если проверка прошла — можно переходить к Telegram-боту в том же Compose.