FreshRSS + RSSHub + Cloudflare Tunnel 部署记录
CYY

这篇文章记录我在一台 Ubuntu 服务器上搭建 FreshRSS + RSSHub + Cloudflare Tunnel 的完整过程,目标是:

  • 自托管 RSS 阅读器(FreshRSS)
  • 用 RSSHub 给无原生 RSS 的站点补源
  • 通过 Cloudflare Tunnel 对外发布,尽量不直接暴露源站端口
  • 给后续“每日资讯摘要 / 推送自动化”打基础

一、最终架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Browser/Mobile]
|
v
[Cloudflare Edge + Tunnel]
|
v
[cloudflared container]
|
+--> freshrss:80
|
+--> rsshub:1200

Local Docker Network:
- freshrss
- freshrss-db (PostgreSQL)
- rsshub
- rsshub-redis
- cloudflared

域名路由:

  • rss.yangc.cc.cd -> http://freshrss:80
  • hub.yangc.cc.cd -> http://rsshub:1200

二、部署内容

1) Docker 与 Compose

服务器已安装 Docker Engine(含 compose 插件),服务运行正常。

2) 项目目录

  • services/rss-stack/docker-compose.yml
  • services/rss-stack/.env.example
  • services/rss-stack/.gitignore

3) 服务清单

  • freshrss-db:PostgreSQL 16
  • freshrss:FreshRSS
  • rsshub-redis:Redis 7
  • rsshub:RSSHub
  • cloudflared:Cloudflare Tunnel Connector

当时用于调试的端口映射:

  • 8081:80(FreshRSS)
  • 1200:1200(RSSHub)

三、关键配置

FreshRSS

  • TZ=Asia/Shanghai
  • 自动安装参数(启用 API、数据库连接、默认 admin 用户)

RSSHub

  • NODE_ENV=production
  • CACHE_TYPE=redis
  • REDIS_URL=redis://rsshub-redis:6379/

Cloudflared

Token 模式启动:

1
tunnel --no-autoupdate run --token ${CF_TUNNEL_TOKEN}

四、Cloudflare Tunnel 路由

同一个 Tunnel(rss-stack)下配置两条 Public Hostname:

  1. rss.yangc.cc.cd -> http://freshrss:80
  2. hub.yangc.cc.cd -> http://rsshub:1200

说明:

  • 一个 Tunnel 承载多个子域名即可。
  • Path 建议留空(匹配所有路径),避免误配置导致访问异常。

五、验证结果

服务状态

docker compose ps 显示 5 个容器全部正常。

健康检查

  • https://hub.yangc.cc.cd/healthz 返回 ok
  • https://rss.yangc.cc.cd 返回 302(跳转 FreshRSS 登录页)

一次典型问题

出现过“手机可访问、电脑报 ERR_CONNECTION_CLOSED”的情况,最终判断:

  • 服务端与 Tunnel 正常
  • 更可能是本地网络 / DNS / 代理环境问题

排查建议:

  • 关闭本机代理/VPN
  • 清 DNS 缓存或切换 DNS
  • 无痕模式 / 更换浏览器
  • 手机热点测试,排除当前网络拦截

六、完整配置示例(已脱敏)

以下配置可直接参考使用;所有密钥、密码、Token 均已替换为占位符,请按你自己的环境填写。

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
services:
freshrss-db:
image: postgres:16-alpine
container_name: freshrss-db
restart: unless-stopped
environment:
POSTGRES_USER: freshrss
POSTGRES_PASSWORD: <输入你的数据库密码>
POSTGRES_DB: freshrss
volumes:
- ./data/postgres:/var/lib/postgresql/data

freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
restart: unless-stopped
depends_on:
- freshrss-db
ports:
- "8081:80"
environment:
TZ: Asia/Shanghai
CRON_MIN: "*/20"
FRESHRSS_INSTALL: |-
--api-enabled
--base-url http://localhost:8081
--db-base freshrss
--db-host freshrss-db
--db-password <输入你的数据库密码>
--db-type pgsql
--db-user freshrss
--default_user admin
--language zh-cn
FRESHRSS_USER: |-
--user admin
--password <输入你的FreshRSS管理员密码>
volumes:
- ./data/freshrss:/var/www/FreshRSS/data
- ./extensions:/var/www/FreshRSS/extensions

rsshub-redis:
image: redis:7-alpine
container_name: rsshub-redis
restart: unless-stopped
volumes:
- ./data/redis:/data

rsshub:
image: diygod/rsshub:latest
container_name: rsshub
restart: unless-stopped
depends_on:
- rsshub-redis
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: redis://rsshub-redis:6379/
TZ: Asia/Shanghai

cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token ${CF_TUNNEL_TOKEN}
depends_on:
- freshrss
- rsshub

.env.example

1
2
# Cloudflare Tunnel Token(替换为你自己的)
CF_TUNNEL_TOKEN=<输入你的Cloudflare_Tunnel_Token>

七、常用运维命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启动 / 更新栈
cd /root/.openclaw/workspace/services/rss-stack
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f cloudflared
docker compose logs -f freshrss
docker compose logs -f rsshub

# 健康检查
curl -I https://rss.yangc.cc.cd
curl https://hub.yangc.cc.cd/healthz

八、下一步

  • 在 FreshRSS 里按主题做分类(技术 / AI / 安全 / 产品)
  • 用 RSSHub 补齐没有原生 RSS 的信源
  • 固定“每日摘要模板”,形成稳定输入
  • 接入 agent 定时任务,自动生成并推送日报

如果你也在做“个人信息流基础设施”,这套组合(FreshRSS + RSSHub + Tunnel)非常值得一试:成本低、可控性高、可持续迭代。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep