diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5ebafc7 --- /dev/null +++ b/.dockerignore @@ -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 diff --git a/.env.example b/.env.example index 139f7ad..2c307c6 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ BOT_TOKEN=123456:ABC-DEF MANAGER_GROUP_ID=-1001234567890 +# Local: data/bot.db — Docker Compose sets /app/data/bot.db DATABASE_PATH=data/bot.db # Optional text overrides (per language). Prefer _RU / _UK. # Bare WELCOME_TEXT / ACK_TEXT / COOLDOWN_TEXT apply only to RU diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a2a82af --- /dev/null +++ b/Dockerfile @@ -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"] diff --git a/README.md b/README.md index bd48ae4..953490e 100644 --- a/README.md +++ b/README.md @@ -70,3 +70,31 @@ python -m bot Рядом с `bot.db` могут появляться файлы `-wal` / `-shm` (режим WAL) — их тоже не нужно коммитить (`data/` в `.gitignore`). При старте бот проверяет `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 && 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 +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ee6d9ce --- /dev/null +++ b/docker-compose.yml @@ -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.