Files

391 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.