Бот следит за сроками подписок в приватном канале/супергруппе, хранит данные в PostgreSQL, удаляет просроченных (бан+разбан), управляется через инлайн-кнопки и команды. Может работать по вебхуку за reverse proxy (Caddy/Nginx) или по long polling.
- Кнопки: главное меню (статус, помощь, «Кто я») и админ-панель (добавить/обновить, продлить, проверить пользователя, проверить просрочки, ближайшие окончания, отмена, назад).
- Автоудаление: периодическая проверка, бан+разбан для удаления и возможности повторного входа.
- БД: PostgreSQL (asyncpg), upsert/продление/проверка подписок.
- Команды:
/addsub,/extendsub,/checksub,/forcecheck,/start,/whoami. - Инфра: docker-compose (bot + postgres + caddy), GHCR-образ (можно запускать без сборки).
- Скопируйте
.env.exampleв.env, задайтеTELEGRAM_BOT_TOKEN,TELEGRAM_CHANNEL_ID,TELEGRAM_ADMIN_IDS.WEBHOOK_URLоставьте пустым,DATABASE_URLможно не менять (по умолчаниюpostgresql://bot:botpass@db:5432/subscriptions). - Запустите:
docker compose up -d - Дайте боту права админа с баном в канале/супергруппе. Проверьте
/startи кнопку «Моя подписка».
- В
.envзаполните:ЕслиWEBHOOK_URL=https://your-domain.example.com WEBHOOK_PATH=/telegram/webhook WEBHOOK_SECRET=your_secret WEBAPP_HOST=0.0.0.0 WEBAPP_PORT=8080WEBHOOK_URLпуст — бот переключится на long polling. - Выберите прокси: используйте встроенный Caddy из compose или свой Nginx. Примеры конфигов ниже.
- Запустите:
docker compose up -d - Бот выставит вебхук на
WEBHOOK_URL + WEBHOOK_PATHс секретомWEBHOOK_SECRET.
{
email admin@example.com
}
example.com {
reverse_proxy subscription-bot:8080
encode gzip
}
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_TOKENTELEGRAM_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).