-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Describe the bug
Summary
After upgrading to 1.27, FreshRSS appears to apply Retry-After at the domain/host level. When one feed on a host returns 503 or 429 (often a single shaky RSSHub route), all feeds on that same host (ip address) are delayed until the retry time.
This hurts setups where a single host (e.g., RSSHub) serves many independent routes. I also run other RSS parsers on the same internal host, so one bad route effectively stalls the whole system.
Logs (example)
⚠️ 2025-08-29 22:15:03 For that domain, will first retry after 2025-08-29T22:40:03+08:00. http://172.17.0.1:2888/?view=rss&subreddit=Quest&averagePostsPerDay=2
⚠️ 2025-08-29 22:15:03 For that domain, will first retry after 2025-08-29T22:40:03+08:00. http://172.17.0.1:21200/v2ex/topics/hot
⚠️ 2025-08-29 22:15:03 HTTP 503 Service Unavailable! [http://172.17.0.1:21200/eagle/changelog]
⚠️ 2025-08-29 21:00:54 For that domain, will first retry after 2025-08-29T21:25:02+08:00. http://172.17.0.1:21200/ithome/hot
Expected behavior
Retry-Aftershould be per-feed by default (only the failing URL is delayed), or- Provide a configuration toggle to choose the scope:
feedvsdomain.- e.g.
fetch.retry_after_scope = feed | domain(default can remaindomainfor compatibility).
- e.g.
Actual behavior
- A single
503/429onhttp://172.17.0.1:21200/...causes FreshRSS to defer all feeds on172.17.0.1:xxxxuntil the same “retry after” time, even though other routes on that host are healthy.
Why this matters
- Aggregators like RSSHub multiplex many unrelated upstreams behind one host. One shaky route (or upstream rate-limit) should not block all other routes.
- Some self-hosters (like me) also run other parsers on the same internal host/port. Domain-wide backoff stalls everything.
Regression?
- On 1.26.x this did not happen (no domain-wide delay). On 1.27.x it does.
Suggested solutions (any would help)
- Config flag to control scope: per-feed (per-URL) vs domain (current behavior).
- Alternative policy: treat 429 as domain-wide, but treat 5xx (esp.
503) as per-feed by default.
Workarounds considered
- Sharding across multiple hostnames / reverse proxy: not possible in my environment.
- Caching/stale-on-error at proxy: also not available here.
- Downgrading to 1.26.3 works, but I’d prefer staying on 1.27.x.
Environment
- FreshRSS: 1.27.x (Docker)
- OS: Linux (Docker)
- Feeds: RSSHub on the same machine, accessed via
http://172.17.0.1:21200/... - Network: FreshRSS container curls the host IP directly (no reverse proxy)
Thanks
A scope toggle or a per-feed policy for Retry-After would preserve 1.27’s good intent (being nice to servers) while avoiding whole-host stalls in aggregator setups.
To Reproduce
- Run FreshRSS 1.27.x in Docker.
- Add multiple feeds that share the same host (e.g., several RSSHub routes all at
https://rsshub.app/...). - Make one route return
503(or429, with/withoutRetry-After), eg. https://rsshub.app/eagle/changelog - Observe FreshRSS logs: “For that domain, will first retry after …”, and note that all feeds on that host are delayed.
Expected behavior
No response
FreshRSS version
1.27.0
System information
FreshRSS version
1.27.0
PHP version
8.4.11
cURL version
8.14.1
OpenSSL/3.5.2
Database
sqlite
3.49.2
Server software
nginx/1.28.0
Linux 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64
Browser
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0
Additional context
No response