Add Docker Compose and deployment documentation
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
*.exe
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
README.md
|
||||||
|
bot.exe
|
||||||
|
dist/
|
||||||
|
bin/
|
||||||
@@ -3,3 +3,5 @@ BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
|
|||||||
|
|
||||||
# true — подробные логи API Telegram
|
# true — подробные логи API Telegram
|
||||||
BOT_DEBUG=false
|
BOT_DEBUG=false
|
||||||
|
|
||||||
|
# Docker Compose читает этот файл как .env (скопируйте: cp .env.example .env)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
.env
|
.env
|
||||||
|
.docker/
|
||||||
*.exe
|
*.exe
|
||||||
*.exe~
|
*.exe~
|
||||||
*.dll
|
*.dll
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
FROM golang:1.22-alpine AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apk add --no-cache git ca-certificates
|
||||||
|
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /bot .
|
||||||
|
|
||||||
|
FROM alpine:3.20
|
||||||
|
|
||||||
|
RUN apk add --no-cache ca-certificates tzdata \
|
||||||
|
&& adduser -D -H -u 10001 bot
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --from=builder /bot /app/bot
|
||||||
|
|
||||||
|
USER bot
|
||||||
|
|
||||||
|
ENTRYPOINT ["/app/bot"]
|
||||||
@@ -1,15 +1,303 @@
|
|||||||
# tgvpn
|
# tgvpn
|
||||||
|
|
||||||
Telegram-бот на Go (базовое приветствие, дальше — VPN-функции).
|
Telegram-бот на Go (базовое приветствие; далее — VPN-функции).
|
||||||
|
|
||||||
## Запуск
|
## Требования
|
||||||
|
|
||||||
1. Скопируйте `.env.example` в `.env` и укажите `BOT_TOKEN` от [@BotFather](https://t.me/BotFather).
|
| Компонент | Минимум |
|
||||||
2. `go run .`
|
|-----------|---------|
|
||||||
|
| Docker | 24+ |
|
||||||
|
| Docker Compose | v2 (`docker compose`) |
|
||||||
|
| Токен бота | [@BotFather](https://t.me/BotFather) |
|
||||||
|
| Сеть | Исходящий HTTPS к `api.telegram.org` (порт 443) |
|
||||||
|
|
||||||
|
Для запуска **без Docker**: Go 1.22+.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Быстрый старт (Docker Compose)
|
||||||
|
|
||||||
|
### 1. Клонирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://git.evilfox.cc/test/tgvpn.git
|
||||||
|
cd tgvpn
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Переменные окружения
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Отредактируйте `.env`:
|
||||||
|
|
||||||
|
```env
|
||||||
|
BOT_TOKEN=ваш_токен_от_BotFather
|
||||||
|
BOT_DEBUG=false
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Важно:** файл `.env` не попадает в git и не копируется в образ. Compose передаёт переменные в контейнер при старте.
|
||||||
|
|
||||||
|
### 3. Сборка и запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Проверка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# логи (должно быть: «бот @имя_бота запущен»)
|
||||||
|
docker compose logs -f bot
|
||||||
|
|
||||||
|
# статус контейнера
|
||||||
|
docker compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
В Telegram откройте бота и отправьте `/start`.
|
||||||
|
|
||||||
|
### 5. Остановка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Развёртывание на VPS (Linux)
|
||||||
|
|
||||||
|
Ниже — пошаговая установка на чистый сервер (Ubuntu 22.04/24.04, Debian 12). Аналогично на других дистрибутивах с Docker.
|
||||||
|
|
||||||
|
### Шаг 1. Подключение к серверу
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh user@your-server-ip
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 2. Установка Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get 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-get update
|
||||||
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
Выйдите из SSH и зайдите снова, чтобы группа `docker` применилась:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
exit
|
||||||
|
ssh user@your-server-ip
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 3. Клонирование проекта
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mkdir -p /opt/tgvpn
|
||||||
|
sudo chown $USER:$USER /opt/tgvpn
|
||||||
|
cd /opt/tgvpn
|
||||||
|
git clone https://git.evilfox.cc/test/tgvpn.git .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 4. Настройка `.env`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
nano .env # или vim / vi
|
||||||
|
```
|
||||||
|
|
||||||
|
Укажите реальный `BOT_TOKEN`. Для продакшена оставьте `BOT_DEBUG=false`.
|
||||||
|
|
||||||
|
Права на секреты:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod 600 .env
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 5. Запуск в фоне
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps
|
||||||
|
docker compose logs --tail=50 bot
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 6. Автозапуск после перезагрузки сервера
|
||||||
|
|
||||||
|
В `docker-compose.yml` уже указано `restart: unless-stopped`. После перезагрузки VPS контейнер поднимется сам, если Docker запущен:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable docker
|
||||||
|
sudo systemctl start docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 7. Обновление версии бота
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/tgvpn
|
||||||
|
git pull
|
||||||
|
docker compose up -d --build
|
||||||
|
docker compose logs --tail=30 bot
|
||||||
|
```
|
||||||
|
|
||||||
|
Старый образ можно удалить (опционально):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker image prune -f
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Развёртывание на Windows
|
||||||
|
|
||||||
|
### Docker Desktop
|
||||||
|
|
||||||
|
1. Установите [Docker Desktop](https://www.docker.com/products/docker-desktop/).
|
||||||
|
2. В PowerShell:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
git clone https://git.evilfox.cc/test/tgvpn.git
|
||||||
|
cd tgvpn
|
||||||
|
Copy-Item .env.example .env
|
||||||
|
# отредактируйте .env — вставьте BOT_TOKEN
|
||||||
|
docker compose up -d --build
|
||||||
|
docker compose logs -f bot
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Локальная разработка (без Docker)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
# укажите BOT_TOKEN в .env
|
||||||
|
go run .
|
||||||
|
```
|
||||||
|
|
||||||
|
или
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -o bot .
|
||||||
|
./bot
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Переменные окружения
|
## Переменные окружения
|
||||||
|
|
||||||
| Переменная | Описание |
|
| Переменная | Обязательно | Описание |
|
||||||
|--------------|-----------------------------------|
|
|--------------|-------------|----------|
|
||||||
| `BOT_TOKEN` | Токен бота (обязательно) |
|
| `BOT_TOKEN` | да | Токен от @BotFather |
|
||||||
| `BOT_DEBUG` | `true` — подробные логи API |
|
| `BOT_DEBUG` | нет | `true` — подробные логи Telegram API (только для отладки) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Полезные команды Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# пересобрать образ и перезапустить
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
# логи в реальном времени
|
||||||
|
docker compose logs -f bot
|
||||||
|
|
||||||
|
# последние 100 строк логов
|
||||||
|
docker compose logs --tail=100 bot
|
||||||
|
|
||||||
|
# зайти в контейнер (обычно не нужно)
|
||||||
|
docker compose exec bot sh
|
||||||
|
|
||||||
|
# удалить контейнер (образ останется)
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# удалить контейнер и неиспользуемые образы проекта
|
||||||
|
docker compose down --rmi local
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Сеть и безопасность
|
||||||
|
|
||||||
|
- Бот использует **long polling**: входящие запросы на ваш сервер **не нужны**, порты открывать не требуется.
|
||||||
|
- Нужен только **исходящий** доступ к `https://api.telegram.org`.
|
||||||
|
- Не коммитьте `.env` в git. Не публикуйте `BOT_TOKEN`.
|
||||||
|
- Контейнер запускается от непривилегированного пользователя `bot` (UID 10001).
|
||||||
|
|
||||||
|
Если позже добавите **webhook**, понадобится reverse proxy (nginx/Caddy), TLS и открытый порт 443 — это описывается отдельно при появлении функции.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
### `BOT_TOKEN не задан`
|
||||||
|
|
||||||
|
- Проверьте, что файл `.env` лежит рядом с `docker-compose.yml`.
|
||||||
|
- В `.env` нет пробелов вокруг `=`: `BOT_TOKEN=123:ABC`, не `BOT_TOKEN = ...`.
|
||||||
|
- После правки: `docker compose up -d --force-recreate`.
|
||||||
|
|
||||||
|
### `Authentication failed` / `401 Unauthorized`
|
||||||
|
|
||||||
|
- Неверный или отозванный токен. Создайте новый в @BotFather → `/token` → обновите `.env` → `docker compose up -d --force-recreate`.
|
||||||
|
|
||||||
|
### Бот не отвечает в Telegram
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps # State должен быть running
|
||||||
|
docker compose logs bot # ошибки сети, токена
|
||||||
|
```
|
||||||
|
|
||||||
|
- Убедитесь, что на сервере нет блокировки Telegram (firewall, провайдер).
|
||||||
|
- Проверьте: `curl -I https://api.telegram.org` с хоста.
|
||||||
|
|
||||||
|
### Контейнер постоянно перезапускается
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs --tail=200 bot
|
||||||
|
```
|
||||||
|
|
||||||
|
Чаще всего — пустой `BOT_TOKEN` или ошибка при старте.
|
||||||
|
|
||||||
|
### Нет доступа к `docker` без sudo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
# перелогиньтесь
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
tgvpn/
|
||||||
|
├── main.go # логика бота
|
||||||
|
├── Dockerfile # multi-stage сборка
|
||||||
|
├── docker-compose.yml # оркестрация
|
||||||
|
├── .env.example # шаблон переменных
|
||||||
|
├── .dockerignore
|
||||||
|
├── go.mod / go.sum
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Репозиторий
|
||||||
|
|
||||||
|
https://git.evilfox.cc/test/tgvpn.git
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
services:
|
||||||
|
bot:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: tgvpn-bot:latest
|
||||||
|
container_name: tgvpn-bot
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
BOT_DEBUG: ${BOT_DEBUG:-false}
|
||||||
|
# Long polling — исходящие HTTPS к api.telegram.org
|
||||||
|
# ports не нужны, пока нет webhook
|
||||||
Reference in New Issue
Block a user