FreshRSS на VPS: self-hosted RSS-агрегатор вместо Feedly
FreshRSS на VPS: Docker, PostgreSQL, fever API, мобильные клиенты, фильтры, SSL и бэкапы. Приватное чтение новостей и блогов без алгоритмов Feedly.
Краткий ответ: FreshRSS — лёгкий self-hosted RSS reader. На VPS 512 MB–1 GB: Docker + PostgreSQL/SQLite + Nginx SSL. Fever API для mobile apps, WebSub для instant updates, filters для шума.
Feedly — freemium с лимитами, Google Reader мёртв, алгоритмические ленты — bubble. FreshRSS на вашем VPS — все ваши источники, keyboard shortcuts, full-text search, zero tracking.
FreshRSS vs Miniflux vs Tiny Tiny RSS vs Feedly
| Критерий | FreshRSS | Miniflux | TTRSS | Feedly |
|---|---|---|---|---|
| Self-hosted | Да | Да | Да | Нет |
| RAM | 512 MB | 256 MB | 1 GB | N/A |
| UI | Feature-rich | Minimal | Classic | Polished |
| Mobile apps | Fever API (many) | Official | Official | Official |
| Filters | Advanced | Basic | Advanced | AI |
| PostgreSQL | Да | Да | Да | N/A |
| Extension API | Google Reader API | Miniflux API | Fever | Proprietary |
FreshRSS — best balance features/resources для power readers.
Архитектура
RSS/Atom feeds on the internet
↓ polling / WebSub
FreshRSS (PHP)
↓
PostgreSQL or SQLite
↓
Nginx → Browser / Mobile app (Fever API)
↓
Optional: full-text via SQLite FTS or extensions
FreshRSS cron fetches feeds every 15–60 min. WebSub — push updates для supported feeds.
Требования к VPS
| Сценарий | RAM | CPU | Диск |
|---|---|---|---|
| <100 feeds personal | 512 MB | 1 vCPU | 5 GB |
| 500 feeds power user | 1 GB | 1 vCPU | 15 GB |
| 1000+ feeds | 2 GB | 2 vCPU | 30 GB SSD |
SQLite OK для personal, PostgreSQL для multi-user и scale.
Docker Compose
services:
freshrss:
image: freshrss/freshrss:latest
restart: unless-stopped
depends_on:
- db
environment:
CRON_MIN: "*/15 * * * *"
TZ: Europe/Moscow
volumes:
- freshrss_data:/var/www/FreshRSS/data
- freshrss_extensions:/var/www/FreshRSS/extensions
ports:
- "127.0.0.1:8080:80"
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: freshrss
POSTGRES_USER: freshrss
POSTGRES_PASSWORD: CHANGE_ME
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
freshrss_data:
freshrss_extensions:
pgdata:
SQLite alternative — уберите db service, FreshRSS auto-uses SQLite in data volume.
Nginx reverse proxy
server {
listen 443 ssl http2;
server_name rss.example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
SSL — Let’s Encrypt. Auth — built-in multi-user или Authentik proxy.
Первоначальная настройка
https://rss.example.com→ installation wizard- Check system requirements (all green)
- Database: PostgreSQL credentials
- Create admin user
- Settings → Reading — article count, default view
- Settings → Authentication — allow registration off
- Import OPML from Feedly/Inoreader
Добавление feeds
| Метод | Как |
|---|---|
| Manual | Subscribe → URL |
| OPML import | Settings → Import |
| Extension | Firefox FreshRSS subscription |
| Discovery | Auto-detect from website URL |
Рекомендуемые категории: Tech, DevOps, News, Blogs, YouTube (via RSS bridge).
Связка: читайте stormblog и devops feeds в одном UI.
Filters и labels
# Filter example: mark Kubernetes posts
IF content contains "Kubernetes" THEN add label "k8s"
# Filter: hide sponsored
IF title contains "Sponsored" THEN mark as read
# Filter: priority
IF feed is "CVE Alerts" THEN do not mark as read on scroll
Filters — мощный инструмент против noise. Regex supported.
Fever API для mobile
FreshRSS → Settings → Authentication → enable Fever API:
API URL: https://rss.example.com/api/fever.php
Username: your_user
Password: fever_api_password (separate from login)
Compatible apps:
- Reeder (iOS/macOS)
- FeedMe (Android)
- Fluent Reader (desktop)
Google Reader API (optional)
FreshRSS supports Google Reader compatible API для Newsboat, Readkit, etc. Enable in extensions/settings.
WebSub и polling
| Механизм | Latency | Feeds supported |
|---|---|---|
| WebSub (PubSubHubbub) | Seconds | Medium.com, many blogs |
| Polling CRON | 15–60 min | All RSS |
CRON_MIN: "*/15 * * * *" — balance freshness vs VPS load.
Full-text search
Enable extension full-text search или built-in depending on version. Index all article content — find old posts by keyword.
PostgreSQL backend — better search performance at scale.
Sharing и integration
- Share to n8n webhook → Telegram/Slack
- Save starred articles в Nextcloud via export
- Star → trigger PocketBase API for bookmark DB
# Export starred articles OPML
curl -u user:pass https://rss.example.com/i/export/starred.opml
Multi-user
FreshRSS supports multiple users с separate feeds or shared categories. Family server: один VPS, individual accounts.
SSO — HTTP auth proxy via Authentik.
Backup
# PostgreSQL
docker compose exec -T db pg_dump -U freshrss freshrss > freshrss-$(date +%F).sql
# Data volume (config, cache, sqlite if used)
docker run --rm -v freshrss_data:/data -v $(pwd):/backup alpine \
tar czf /backup/freshrss-data.tar.gz /data
OPML export monthly — human-readable feed list backup. 3-2-1 + Restic.
Security
| Пункт | Действие |
|---|---|
| HTTPS | Required |
| Disable public registration | After users created |
| Strong passwords | Per user |
| Tailscale | Private access option |
| Update FreshRSS | Docker pull monthly |
| API passwords | Separate from login, rotate |
RSS reader knows your interests — treat as private data.
Performance tuning
- Reduce feed count — unsubscribe dead feeds quarterly
- Increase CRON interval if CPU spikes
- PostgreSQL over SQLite for 500+ feeds
- Enable HTTP caching headers in Nginx for static assets
TTRSS_FEEDS_LIMITequivalent — archive old articles
Мониторинг
- Uptime Kuma — ping FreshRSS
- Feed errors — FreshRSS UI → feed management → error column
- ntfy alert if feed fetch fails X times (custom script)
Troubleshooting
| Проблема | Решение |
|---|---|
| Feed not updating | Check CRON, feed URL valid, error log |
| Fever API 401 | Separate API password, not login password |
| 500 after update | Check PHP extensions in container logs |
| Duplicate articles | Feed changed GUID, mark as read |
| Slow UI | Too many unread — mark all read archive |
| WebSub not working | Public URL required for callback |
| PostgreSQL connection | Credentials in FreshRSS config |
| Import OPML fail | File encoding UTF-8 |
| Mobile app empty | Wrong API URL path /api/fever.php |
| High memory | Reduce feeds or switch SQLite→PG tuning |
Связка с экосистемой
- Search — SearXNG for finding new blogs
- Automation — n8n
- VPN — Tailscale
- SSO — Authentik
- Backup — Restic
- Docker — Docker Compose
Итог
FreshRSS — must-have для тех, кто читает интернет осознанно. Без алгоритмов, без tracking, с полным контролем. 512 MB VPS хватит на сотни feeds.
VPS от 1 GB — StormNet Cloud. SSL — Let’s Encrypt. Поиск блогов — SearXNG. Backup — 3-2-1.
Рекомендуем прочитать
- Ghost CMS на VPS: self-hosted блог и newsletter без Substack
- Nginx или Caddy: какой веб-сервер выбрать на VPS
- SSL на VPS: Let's Encrypt, автообновление и типичные ошибки
- Plausible Analytics на VPS: приватная веб-аналитика
- Правило 3-2-1: стратегия бэкапов на VPS
- Tailscale на VPS: mesh VPN без настройки WireGuard
Частые вопросы
FreshRSS или Feedly для чтения новостей?
Feedly — cloud, удобно. FreshRSS self-hosted — privacy, unlimited feeds, API, mobile apps через RSS readers.
Сколько RAM нужно FreshRSS?
512 MB–1 GB для сотен feeds. PostgreSQL предпочтительнее SQLite при 500+ источниках.






