Initial commit: VPN Telegram bot (sanitized defaults)
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user