尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Telegram bot @HDRezkaSeriesBot: notifications about new episodes of series and anime on HDREZKA. Python, aiogram, PostgreSQL, Docker
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗▶ Открыть бота / Try it: @HDRezkaSeriesBot — уведомления о новых сериях сериалов и аниме с HDREZKA в Telegram: постер, номер серии, озвучка и кнопка «Смотреть».
EN. A Telegram bot that watches HDREZKA for new episodes and notifies subscribers — per season or per
franchise (new seasons, films, spin-offs). Python 3.12 · aiogram 3 · PostgreSQL 17 (delivery queue on
FOR UPDATE SKIP LOCKED, pg_trgm search, Alembic) · Docker Compose · three processes (bot / poller / sender) ·
pytest on saved HTML pages. Site load does not depend on the number of users: the poller reads the site's
update feed, not subscriptions. UI in Russian, Ukrainian and English. Docs are in Russian:
ARCHITECTURE.md, PRODUCT_AND_SCALE.md.
Бот, который следит за выходом новых серий на HDREZKA и присылает уведомления. Подписаться можно на один сезон или на всю франшизу — тогда бот сообщит и о новых сезонах, фильмах и спин-оффах.
Проектные решения и факты, на которых они основаны — docs/ARCHITECTURE.md.
главная: блок «Обновления» ──► poller ──► PostgreSQL ──► sender ──► Telegram
(1 запрос раз в 3 минуты) │ ▲
страницы тайтлов: по событию, │ │
подписанные раз в 12 ч, очередь ───┘ bot (поиск, подписки; сайт — только с разрешения)
BOT_SITE_PER_*).FOR UPDATE SKIP LOCKED),
singleton-лок поллера (advisory lock). Redis и брокеры не нужны.app/i18n.py).
Новому человеку — язык его Telegram, дальше — ⚙️ Настройки → 🌐 Язык./feedback. Тема (ошибка, идея, сотрудничество,
другое), письмо уходит автору карточкой и копией — со скриншотами; автор отвечает «Ответить» на карточку,
человек получает ответ от имени бота и может ответить так же. Тексты писем в базе не хранятся.| Проблема | Решение |
|---|---|
| Дата-центровые IP банят — 403 «Ошибка доступа 105» (IP этого сервера был забанен в сентябре 2026, с октября открыт) | ходим напрямую; бан — «БАН» в логе поллера и первой строкой /stats, тогда прокси через незабаненный IP: HDREZKA_PROXY в .env |
| Anubis proof-of-work | решается в app/rezka/client.py, браузер не нужен; cookie живёт 30 дней |
Вся эта логика изолирована в RezkaClient; остальной код видит только HTML.
cp .env.example .env # BOT_TOKEN, ADMIN_IDS, POSTGRES_PASSWORD
Проверка доступа и запуск:
docker compose run --rm --no-deps poller python -m app.check_access
docker compose up -d --build # migrate → bot, poller, sender
Юнит-тесты на сохранённом HTML сайта и интеграционные — путь события от блока обновлений до уведомления
на настоящем Postgres. Интеграционные запускаются только на отдельной базе с именем *_test:
docker compose --profile test build tests
docker compose --profile test run --rm --no-deps tests
Тесты — отдельная цель образа (Dockerfile, target: test): в боевом образе нет ни tests/, ни pytest.
--no-deps обязателен: без него compose запустит сервис migrate на рабочей базе. База rezka_test создаётся
один раз: docker compose exec postgres psql -U rezka -c 'CREATE DATABASE rezka_test'. В CI Postgres поднимается
сервисом GitHub Actions. Тесты не ходят в сеть: настоящий HTTP-запрос из теста — ошибка (tests/conftest.py).
Зависимости: верхний уровень — requirements.in и requirements-dev.in, закреплённые версии с хешами —
requirements.txt и requirements-dev.txt, ставятся с --require-hashes. Обновить:
uv pip compile requirements.in --universal --python-version 3.12 --generate-hashes -o requirements.txt
uv pip compile requirements-dev.in --universal --python-version 3.12 --generate-hashes -o requirements-dev.txt
docker compose logs -f poller # что происходит
docker compose run --rm --no-deps poller python -m app.check_access # доступ после смены IP/зеркала
sudo systemctl start rezka-backup.service # бэкап вручную (deploy/backup.sh)
deploy/restore-check.sh # проверить свежий дамп восстановлением в отдельную базу
Бэкапы: deploy/rezka-backup.timer раз в сутки (03:30 UTC) делает pg_dump -Fc в /var/backups/rezka
(7 последних) и заливает в Oracle Object Storage: бакет rezka-backups, префикс daily/. Копии старше 30 дней
удаляет правило бакета; версии объектов включены — перезапись по тому же имени не теряет копию. Заливка идёт по
ссылке «только запись» (pre-authenticated request AnyObjectWrite, листинг запрещён) из deploy/backup.env
(образец backup.env.example, в git не попадает): по ней нельзя ни прочитать, ни удалить копии. Ссылка действует
до 03.10.2031 — см. docs/TODO.md. Архив прежнего офсайт-сервера (06.09–03.10.2026, 30 дампов) — префикс
archive-lv/, хранится бессрочно. Установка юнита — deploy/rezka-backup.service (команда в шапке).
Восстановление:
# из локального дампа
docker compose exec -T postgres pg_restore -U rezka -d rezka --no-owner --clean --if-exists < /var/backups/rezka/rezka-….dump
# из офсайт-копии: нужен ключ OCI API (подписанный запрос) или консоль Oracle → Buckets → rezka-backups
export OCI_HOST=objectstorage.eu-frankfurt-1.oraclecloud.com
~/.oci/oci-req.sh GET '/n/<namespace>/b/rezka-backups/o?prefix=daily/' # список
~/.oci/oci-req.sh GET /n/<namespace>/b/rezka-backups/o/daily/rezka-….dump > rezka-….dump # скачать
docker compose exec -T postgres pg_restore -U rezka -d rezka --no-owner --clean --if-exists < rezka-….dump
Новая ссылка «только запись» (старая истекла или утекла — её можно удалить в консоли, Pre-Authenticated Requests):
POST /n/<namespace>/b/rezka-backups/p/ с телом
{"name":"rezka-backup-upload","accessType":"AnyObjectWrite","bucketListingAction":"Deny","timeExpires":"…"};
OFFSITE_URL = https://objectstorage.<регион>.oraclecloud.com + accessUri из ответа.
Обновление прода — deploy/update.sh: свежий бэкап, затем docker compose up -d --build.
Правило для новых CHECK в миграциях (24.09.2026). Ограничение сначала добавляется NOT VALID (сразу, без
чтения таблицы), затем данные проверяются в самой миграции — нарушители считаются и, если есть, миграция падает
с понятным сообщением или исправляет их явно, — и только потом VALIDATE CONSTRAINT. Иначе ADD CONSTRAINT
на живых данных падает посреди деплоя, и bot, poller, sender не стартуют. Индексы — CREATE INDEX CONCURRENTLY
в op.get_context().autocommit_block(). alembic check должен проходить: индексы, созданные сырым SQL,
перечислены в migrations/env.py (SQL_ONLY_INDEXES).
Схема БД — Alembic (migrations/). Изменили app/models.py →
docker compose run --rm -v $PWD/migrations:/srv/migrations migrate alembic revision --autogenerate -m "…",
применится при следующем docker compose up.
Команда /stats в боте — для ADMIN_IDS; там же видно, если поллер молчит дольше
STALE_ALERT_MINUTES. /events — что люди делали в боте за неделю (кто, сколько действий, хвост пути),
/events <id> — путь одного человека: команды, кнопки, итог поиска и ссылок. Тексты сообщений и запросов
не пишутся; события живут 30 дней (app/events.py, таблица user_events). Технические уведомления в Telegram не отправляются никогда —
состояние смотрите в логах и в /stats.
app/rezka/client.py доступ: прокси, Anubis, зеркала, паузы
app/rezka/parser.py блок обновлений, страница тайтла (озвучки с языком, серии, франшиза, расписание), поиск
app/service.py доменные операции над БД (общие для бота и поллера); локальный поиск
app/poller.py блок обновлений → серии и озвучки → уведомления; франшизы; очередь чтения
app/sender.py очередь → Telegram (фото/дайджест, кнопки); очистка
app/health.py здоровье «события идут» — для /stats и healthcheck поллера
app/posters.py постеры: скачивание с CDN, загрузка в Telegram, кэш file_id
app/bot/main.py поиск, подписки, озвучки, Новое, Настройки, поделиться, обратная связь
app/events.py действия людей без текстов (30 дней) — для /events
app/feedback.py письма автору и ответы через «Ответить»: карточка, копия, связь сообщений
app/lifecycle.py остановка по SIGTERM, сторож зависаний, пинг мониторинга, advisory lock
app/i18n.py тексты бота и уведомлений: ru / uk / en
app/bot/search.py группировка локальной выдачи по франшизам
tests/ pytest: сохранённый HTML сайта и интеграционные тесты на Postgres
docs/ARCHITECTURE.md решения и факты; docs/PRODUCT_AND_SCALE.md — продукт и масштаб