Add Docker Compose deploy setup for VPS.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Artemii Peretiachenko 2026-07-25 17:30:49 +02:00
parent 8f6d2c07d6
commit 501c2a5985
5 changed files with 77 additions and 0 deletions

16
.dockerignore Normal file
View file

@ -0,0 +1,16 @@
.git
.venv
venv
__pycache__
*.py[cod]
*.egg-info
.pytest_cache
.mypy_cache
.env
data
*.db
.DS_Store
README.md
.dockerignore
Dockerfile
docker-compose.yml

View file

@ -1,5 +1,6 @@
BOT_TOKEN=123456:ABC-DEF BOT_TOKEN=123456:ABC-DEF
MANAGER_GROUP_ID=-1001234567890 MANAGER_GROUP_ID=-1001234567890
# Local: data/bot.db — Docker Compose sets /app/data/bot.db
DATABASE_PATH=data/bot.db DATABASE_PATH=data/bot.db
# Optional text overrides (per language). Prefer _RU / _UK. # Optional text overrides (per language). Prefer _RU / _UK.
# Bare WELCOME_TEXT / ACK_TEXT / COOLDOWN_TEXT apply only to RU # Bare WELCOME_TEXT / ACK_TEXT / COOLDOWN_TEXT apply only to RU

20
Dockerfile Normal file
View file

@ -0,0 +1,20 @@
FROM python:3.12-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
DATABASE_PATH=/app/data/bot.db
RUN adduser --disabled-password --gecos "" --uid 1000 bot \
&& mkdir -p /app/data \
&& chown bot:bot /app/data
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY --chown=bot:bot bot ./bot
USER bot
CMD ["python", "-m", "bot"]

View file

@ -70,3 +70,31 @@ python -m bot
Рядом с `bot.db` могут появляться файлы `-wal` / `-shm` (режим WAL) — их тоже не нужно коммитить (`data/` в `.gitignore`). Рядом с `bot.db` могут появляться файлы `-wal` / `-shm` (режим WAL) — их тоже не нужно коммитить (`data/` в `.gitignore`).
При старте бот проверяет `MANAGER_GROUP_ID`: супергруппа с Topics, бот — админ с правами Manage topics и Delete messages. При ошибке процесс завершится с понятным текстом в логе и stderr. При старте бот проверяет `MANAGER_GROUP_ID`: супергруппа с Topics, бот — админ с правами Manage topics и Delete messages. При ошибке процесс завершится с понятным текстом в логе и stderr.
## Деплой на VPS (Docker)
Нужны Docker и Docker Compose. Бот работает через long-polling — открывать порты не нужно, достаточно исходящего HTTPS к `api.telegram.org`. Запускайте **один** контейнер на один `BOT_TOKEN`.
```bash
git clone <repo-url> && cd 428th-exchange-bot
cp .env.example .env
# заполните BOT_TOKEN и MANAGER_GROUP_ID
mkdir -p data
# каталог должен быть доступен пользователю контейнера (uid 1000)
sudo chown -R 1000:1000 data
docker compose up -d --build
docker compose logs -f
```
SQLite лежит в `./data` на хосте (`DATABASE_PATH=/app/data/bot.db` внутри контейнера). Бэкапьте эту папку (вместе с `-wal` / `-shm`, если они есть).
Полезные команды:
```bash
docker compose ps
docker compose restart
docker compose down # остановить без удаления ./data
docker compose up -d --build # обновить код после git pull
```

12
docker-compose.yml Normal file
View file

@ -0,0 +1,12 @@
services:
bot:
build: .
container_name: exchange-bot
restart: unless-stopped
env_file:
- .env
environment:
DATABASE_PATH: /app/data/bot.db
volumes:
- ./data:/app/data
# Long-polling: no published ports. Needs outbound HTTPS to api.telegram.org.