Skip to content

Case211/subscription-tgbot

Repository files navigation

Subscription Telegram Bot

Бот следит за сроками подписок в приватном канале/супергруппе, хранит данные в PostgreSQL, удаляет просроченных (бан+разбан), управляется через инлайн-кнопки и команды. Может работать по вебхуку за reverse proxy (Caddy/Nginx) или по long polling.

Основное

  • Кнопки: главное меню (статус, помощь, «Кто я») и админ-панель (добавить/обновить, продлить, проверить пользователя, проверить просрочки, ближайшие окончания, отмена, назад).
  • Автоудаление: периодическая проверка, бан+разбан для удаления и возможности повторного входа.
  • БД: PostgreSQL (asyncpg), upsert/продление/проверка подписок.
  • Команды: /addsub, /extendsub, /checksub, /forcecheck, /start, /whoami.
  • Инфра: docker-compose (bot + postgres + caddy), GHCR-образ (можно запускать без сборки).

Быстрый запуск (long polling, без прокси)

  1. Скопируйте .env.example в .env, задайте TELEGRAM_BOT_TOKEN, TELEGRAM_CHANNEL_ID, TELEGRAM_ADMIN_IDS. WEBHOOK_URL оставьте пустым, DATABASE_URL можно не менять (по умолчанию postgresql://bot:botpass@db:5432/subscriptions).
  2. Запустите: docker compose up -d
  3. Дайте боту права админа с баном в канале/супергруппе. Проверьте /start и кнопку «Моя подписка».

Запуск по вебхуку за reverse proxy

  1. В .env заполните:
    WEBHOOK_URL=https://your-domain.example.com
    WEBHOOK_PATH=/telegram/webhook
    WEBHOOK_SECRET=your_secret
    WEBAPP_HOST=0.0.0.0
    WEBAPP_PORT=8080
    
    Если WEBHOOK_URL пуст — бот переключится на long polling.
  2. Выберите прокси: используйте встроенный Caddy из compose или свой Nginx. Примеры конфигов ниже.
  3. Запустите: docker compose up -d
  4. Бот выставит вебхук на WEBHOOK_URL + WEBHOOK_PATH с секретом WEBHOOK_SECRET.

Caddy (пример в Caddyfile)

{
    email admin@example.com
}

example.com {
    reverse_proxy subscription-bot:8080
    encode gzip
}

Nginx (фрагмент server)

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location /telegram/webhook {
        proxy_pass http://subscription-bot:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Если используете внешний Nginx вместо Caddy — удалите сервис caddy из docker-compose.yml, убедитесь, что subscription-bot и Nginx в одной сети.

Переменные окружения

Обязательные:

  • TELEGRAM_BOT_TOKEN
  • TELEGRAM_CHANNEL_ID (обычно начинается с -100)
  • TELEGRAM_ADMIN_IDS (через запятую)
  • DATABASE_URL (postgresql://user:pass@host:5432/db)

Опционально:

  • CHECK_INTERVAL_SECONDS — период проверки просроченных (по умолчанию 60).
  • WEBHOOK_URL, WEBHOOK_PATH, WEBHOOK_SECRET, WEBAPP_HOST, WEBAPP_PORT — для вебхука (иначе long polling).

Команды управления

  • Клонировать репозиторий: https://github.com/Case211/subscription-tgbot.git && cd /opt/subscription-tgbot
  • Запуск без сборки: docker compose up -d
  • Логи бота: docker compose logs -f subscription-bot
  • Остановка: docker compose down
  • Обновить образ из GHCR: docker compose pull && docker compose down && docker compose up -d && docker compose logs -f

Структура

  • bot.py — точка входа, webhook/polling, фоновые проверки.
  • handlers/ — роутеры, FSM для админ-кнопок.
  • services/subscriptions.py — бизнес-логика, парсинг сроков, очистка просроченных.
  • storage.py — PostgreSQL (asyncpg).
  • keyboards.py — инлайн-кнопки.
  • config.py — загрузка переменных окружения.
  • docker-compose.yml — bot + postgres + caddy (можно убрать caddy, если есть свой Nginx).

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors