Files
dimon bf52bc3079
build-and-push / docker (push) Has been cancelled
RSS → ntfy bridge with modern web UI
Features: feed CRUD, per-feed ntfy target (incl. private servers),
Telegram/webhook channels, keyword filters, image attachments,
per-feed intervals, OPML import/export, notification history & stats,
users with roles, admin alerts, RU/EN i18n, light/dark theme,
notification preview, history search, activity chart. Dockerized.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 21:11:57 +08:00

132 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📡 RSS → ntfy
Лёгкое приложение на Python (FastAPI), которое следит за RSS/Atom-лентами и при
появлении новых записей рассылает их в [ntfy](https://ntfy.sh), Telegram и/или
через webhook. Управление — через современную веб-панель.
![tech](https://img.shields.io/badge/FastAPI-009688?logo=fastapi&logoColor=white)
![tech](https://img.shields.io/badge/Docker-2496ED?logo=docker&logoColor=white)
![tech](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white)
## Возможности
**Основное**
- ✅ Добавление, редактирование и удаление RSS-лент через веб-интерфейс
- ✅ Свой ntfy-сервер и тема для каждой ленты (или общий по умолчанию)
- ✅ Приоритет и теги/эмодзи для каждой ленты
- ✅ Опциональная авторизация при входе в веб-панель (вкл/выкл из UI)
- ✅ Настраиваемый интервал проверки и кнопки «Проверить сейчас» / «тест»
- ✅ Защита от дублей: при первом добавлении ленты история не рассылается
**Расширенные возможности**
- 🔐 **Приватные ntfy-серверы** — Bearer-токен или Basic-авторизация на ленту
- ✈️ **Telegram** — дублирование уведомлений через бота (вкл. на нужных лентах)
- 🔗 **Webhook** — POST с JSON в произвольный URL как ещё один канал
- 🖼️ **Картинки** — первое изображение записи прикрепляется к ntfy-уведомлению
- 🧩 **Фильтры по ключевым словам** — include/exclude на каждую ленту
- ⏱️ **Индивидуальный интервал** проверки для каждой ленты (0 = общий)
- 📊 **История и статистика** — лог всех отправок (успех/ошибка) + сводка
- 👥 **Несколько пользователей и роли**`admin` (полный доступ) и `viewer`
- 🩺 **Алерты администратора** — ntfy-уведомление, если лента падает N раз подряд
- 🔁 **Импорт/экспорт OPML** — перенос списка лент из/в другие ридеры
**Интерфейс**
- 🌗 **Светлая и тёмная тема** — переключатель, выбор запоминается
- 🌍 **Локализация RU / EN** — переключение языка на лету
- 👁 **Предпросмотр уведомления** — как будет выглядеть последняя запись ленты
- 🔍 **Поиск по истории** + фильтр «только ошибки»
- 📈 **График активности** за 14 дней (отправлено / сбои)
Готов к запуску в Docker, данные хранятся в томе. Внешняя БД не нужна (SQLite).
Инструкция по развёртыванию через Gitea — в [DEPLOY.md](DEPLOY.md).
## Быстрый старт (Docker Compose)
```bash
docker compose up -d --build
```
Откройте **http://localhost:8000**. Логин/пароль по умолчанию — `admin` / `admin`
(вход требуется только если включить авторизацию в настройках).
> ⚠️ Поменяйте `ADMIN_USERNAME` / `ADMIN_PASSWORD` в `docker-compose.yml`
> **до первого запуска**, либо смените пароль во вкладке «Пользователи».
> Эти переменные применяются только при создании базы данных.
## Запуск без Docker
```bash
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
```
## Как пользоваться
1. **Настройки → ntfy**: укажите сервер по умолчанию и отправьте тест.
2. **Ленты → Добавить ленту**: вставьте URL RSS и тему ntfy (например `my-news`).
В расширенном блоке можно задать токен приватного сервера, фильтры по словам,
личный интервал и включить дублирование в Telegram/webhook.
3. Подпишитесь на тему в приложении ntfy или на `https://ntfy.sh/my-news`.
4. **История** — журнал отправленных и неудачных уведомлений.
5. **Пользователи** — добавьте учётки с ролями (нужно для включения авторизации).
6. **Настройки → Авторизация** — включите требование входа в панель.
### Telegram
1. Создайте бота через [@BotFather](https://t.me/BotFather), получите токен.
2. Добавьте бота в чат/канал и узнайте `chat_id`
(например, через [@userinfobot](https://t.me/userinfobot) или `getUpdates`).
3. **Настройки → Telegram**: включите канал, вставьте токен и `chat_id`.
4. В нужных лентах поставьте галочку «Дублировать в Telegram».
### Webhook
**Настройки → Webhook** → включите и укажите URL. На каждую новую запись
придёт `POST` с JSON:
```json
{ "feed": "...", "feed_url": "...", "title": "...", "body": "...", "link": "...", "image": "..." }
```
## Конфигурация (переменные окружения)
| Переменная | По умолчанию | Описание |
|---|---|---|
| `DEFAULT_NTFY_SERVER` | `https://ntfy.sh` | Сервер для лент без своего |
| `DEFAULT_CHECK_INTERVAL` | `5` | Интервал проверки по умолчанию, минуты |
| `ADMIN_USERNAME` | `admin` | Логин админа (только при первом старте) |
| `ADMIN_PASSWORD` | `admin` | Пароль админа (только при первом старте) |
| `SECRET_KEY` | автогенерация | Секрет для подписи cookie сессии |
| `DATA_DIR` | `./data` (`/data` в Docker) | Где лежит БД и ключ |
## Архитектура
```
app/
├── main.py # FastAPI: страницы, JSON API, авторизация, роли
├── models.py # таблицы SQLModel (Feed, SeenEntry, Notification, User, Settings)
├── database.py # движок БД, инициализация, авто-миграция колонок
├── checker.py # парсинг лент, фильтры, картинки, история, алерты
├── delivery.py # доставка по каналам (ntfy + Telegram + webhook)
├── ntfy.py # публикация в ntfy (авторизация, вложения)
├── scheduler.py # тик раз в минуту, интервалы считаются на лету
├── opml.py # импорт/экспорт OPML
├── auth.py # хеширование пароля (PBKDF2, stdlib)
├── schemas.py # валидация запросов API
├── templates/ # Jinja2 (index, login, base)
└── static/ # style.css, app.js, i18n.js (RU/EN словари)
```
Хранилище — SQLite (один файл в `DATA_DIR`). При добавлении новых полей в моделях
схема существующей БД обновляется автоматически (`ALTER TABLE ... ADD COLUMN`).
## Идеи для дальнейшего развития
- 📨 Доставка по e-mail (SMTP) как ещё один канал
- 🔑 OAuth/OIDC для входа в больших инсталляциях
- 📊 Детализация графиков по конкретной ленте
- 🏷️ Группы/папки лент и массовые операции
- 🌐 Поддержка прокси для доступа к лентам
## Лицензия
MIT — используйте свободно.