1. 为什么我们需要自托管RSS阅读器

早上打开手机,微信有32条未读,微博弹出5条热点推送,邮箱里堆着17封未读邮件,Slack里还有3个团队@我的消息。这种信息过载的体验,相信每个现代职场人都深有体会。更糟的是,这些信息散落在不同平台,没有统一的阅读和管理界面。

RSS技术诞生于1999年,它的核心理念是"订阅源-聚合阅读"。相比社交媒体的算法推荐,RSS把内容选择权完全交给用户。但近年来,随着Google Reader等主流阅读器关闭,RSS似乎变成了极客的小众玩具。其实不然——在信息过载的时代,主动订阅+集中阅读的模式反而显出其独特价值。

Yarr就是这样一个开源的RSS阅读器,它的特点很明确:

  • 自托管:数据完全掌握在自己手中
  • 简约设计:专注阅读本身,无广告无干扰
  • Docker支持:一键部署,无需复杂环境配置

我选择Yarr而非其他阅读器的关键原因是它的"零配置"理念。很多自托管方案需要配置数据库、缓存等组件,而Yarr直接用SQLite存储数据,开箱即用。对于个人使用场景,这种设计既减轻了维护负担,又保证了数据便携性。

2. 部署前的环境准备

2.1 Docker基础环境搭建

在开始前,请确保你的系统已经安装Docker。以下是各平台的安装要点:

Linux系统(以Ubuntu为例)

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 设置仓库
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
sudo docker run hello-world

Windows/macOS : 直接下载Docker Desktop安装包,图形化安装即可。注意:

  • Windows需要开启WSL2支持
  • macOS建议分配至少4GB内存
  • 两者都需要在安装后重启系统

常见问题:如果遇到"virtualization support not detected"错误,需要进入BIOS开启VT-x/AMD-V虚拟化支持。具体方法因主板型号而异,一般是在Advanced或Security设置中。

2.2 网络与存储规划

Yarr作为自托管应用,需要考虑两个核心资源:

  1. 端口冲突 :默认使用7070端口,确保不被其他服务占用

    netstat -tuln | grep 7070
    

    如果端口被占,可以在启动容器时通过 -p 8080:7070 映射到其他端口

  2. 数据持久化 :虽然Yarr使用SQLite,但仍建议挂载数据卷:

    mkdir -p ~/yarr-data
    

    这样即使容器删除,订阅数据也不会丢失

3. 一键部署Yarr实战

3.1 基础Docker命令部署

最简单的启动方式:

docker run -d \
  --name yarr \
  -p 7070:7070 \
  -v ~/yarr-data:/data \
  --restart unless-stopped \
  ghcr.io/nkanaev/yarr:latest

参数解析:

  • -d :后台运行
  • --name :容器命名
  • -p :端口映射(主机端口:容器端口)
  • -v :数据卷挂载(主机路径:容器路径)
  • --restart :自动重启策略

部署完成后,访问 http://你的IP:7070 即可进入Yarr界面。

3.2 使用Docker Compose管理

对于长期使用的服务,推荐使用docker-compose.yml管理:

version: '3'

services:
  yarr:
    image: ghcr.io/nkanaev/yarr:latest
    container_name: yarr
    restart: unless-stopped
    ports:
      - "7070:7070"
    volumes:
      - ./yarr-data:/data
    environment:
      - YARR_USER=admin
      - YARR_PASS=yourpassword

启动命令:

docker-compose up -d

优势:

  1. 版本控制:配置文件可纳入git管理
  2. 环境变量:直接设置管理员账号密码
  3. 扩展方便:后续可添加Nginx反向代理等组件

3.3 安全加固措施

暴露在公网的Web服务需要基础安全防护:

  1. 修改默认凭证

    docker exec -it yarr sh -c "echo 'admin:你的密码' > /data/.htpasswd"
    
  2. Nginx反向代理 (推荐):

    server {
        listen 80;
        server_name rss.yourdomain.com;
    
        location / {
            proxy_pass http://localhost:7070;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    
        # 强制HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name rss.yourdomain.com;
    
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
    
        location / {
            proxy_pass http://localhost:7070;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
  3. 防火墙规则

    ufw allow 80/tcp
    ufw allow 443/tcp
    ufw enable
    

4. Yarr的核心功能配置

4.1 RSS源管理技巧

Yarr支持多种订阅方式:

  1. 直接添加源URL

    • 点击左上角"+"按钮
    • 输入RSS地址(如https://example.com/feed.xml)
  2. OPML导入导出

    • 导出:Settings → Export OPML
    • 导入:Settings → Import OPML
    • 适合迁移或备份订阅列表
  3. 自动发现 : 很多网站会在HTML头部包含RSS链接,格式为:

    <link rel="alternate" type="application/rss+xml" href="/feed.xml">
    

    Yarr会自动识别这类链接

优质RSS源推荐:

  • 技术博客:https://blog.golang.org/feed.atom
  • 新闻媒体:http://rss.cnn.com/rss/cnn_topstories.rss
  • GitHub仓库:https://github.com/nkanaev/yarr/releases.atom

4.2 阅读体验优化

  1. 主题切换 : Settings → Theme 可选择:

    • Auto(随系统)
    • Light(亮色)
    • Dark(暗色)
  2. 键盘快捷键

    • j / k :上下导航
    • o :打开原文
    • m :标记已读/未读
    • ? :查看全部快捷键
  3. 移动端适配 : Yarr本身响应式设计良好,但建议:

    • 添加到主屏幕(PWA支持)
    • 开启"Show thumbnails"提升浏览效率

4.3 数据备份策略

虽然SQLite数据库很小,但定期备份很有必要:

  1. 手动备份

    cp ~/yarr-data/storage.db ~/yarr-backup-$(date +%Y%m%d).db
    
  2. 自动备份脚本 (保存为 backup-yarr.sh ):

    #!/bin/bash
    BACKUP_DIR="/path/to/backups"
    DB_PATH="/home/user/yarr-data/storage.db"
    
    mkdir -p $BACKUP_DIR
    cp $DB_PATH "$BACKUP_DIR/yarr-$(date +%Y%m%d-%H%M%S).db"
    
    # 保留最近7天备份
    find $BACKUP_DIR -name "yarr-*.db" -mtime +7 -delete
    

    添加cron任务:

    crontab -e
    # 每天凌晨3点备份
    0 3 * * * /path/to/backup-yarr.sh
    
  3. Docker卷备份

    docker run --rm --volumes-from yarr -v $(pwd):/backup busybox tar cvf /backup/yarr-backup.tar /data
    

5. 常见问题排查指南

5.1 容器启动失败

症状 docker ps 看不到Yarr容器

排查步骤

  1. 查看日志:
    docker logs yarr
    
  2. 常见错误:
    • 端口冲突:修改 -p 参数为其他端口
    • 权限问题:添加 --user $(id -u):$(id -g) 参数
    • 存储不可写:检查挂载目录权限( chmod 777 ~/yarr-data

5.2 订阅不更新

症状 :文章列表长时间不刷新

解决方案

  1. 手动触发更新:

    docker exec yarr /app/yarr -cmd update
    
  2. 检查源是否有效:

    curl -I https://example.com/feed.xml
    

    应返回 200 OK Content-Type: application/xml

  3. 调整更新频率: Settings → Refresh Interval(建议30-60分钟)

5.3 性能优化

当订阅源超过100个时,可能会遇到性能问题:

  1. 数据库维护

    docker exec yarr sqlite3 /data/storage.db "VACUUM;"
    
  2. 限制并发 : 修改docker-compose.yml:

    environment:
      - YARR_FEED_CONCURRENCY=5  # 默认10
    
  3. 硬件升级

    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
    

6. 进阶玩法与生态整合

6.1 配合其他工具使用

  1. RSSHub : 为不支持RSS的网站生成订阅源

    docker run -d --name rsshub -p 1200:1200 diygod/rsshub
    

    示例源:

    • 微博用户: https://rsshub.app/weibo/user/123456
    • B站UP主: https://rsshub.app/bilibili/user/video/123456
  2. Telegram通知 : 通过IFTTT或Zapier将新文章推送到Telegram

  3. Readwise同步 : 使用浏览器书签工具将文章保存到Readwise

6.2 二次开发

Yarr是Go语言开发,代码结构清晰:

  1. 自定义构建

    git clone https://github.com/nkanaev/yarr
    cd yarr
    docker build -t my-yarr .
    
  2. 修改功能

    • 修改 server.go 调整API
    • 修改 web/app.js 调整前端
  3. 插件系统 : 虽然官方不支持插件,但可以通过挂载点扩展:

    COPY my-extension.js /app/web/extensions/
    

6.3 替代方案对比

工具 语言 特点 适合场景
Yarr Go 极简、零配置 个人快速部署
FreshRSS PHP 功能全面、多用户支持 团队使用
Miniflux Go API优先、支持PostgreSQL 开发者
TinyTinyRSS PHP 老牌、插件丰富 传统用户

选择建议:

  • 想要开箱即用:Yarr
  • 需要多用户支持:FreshRSS
  • 计划深度集成:Miniflux

7. 维护与升级策略

7.1 版本更新

Yarr更新较慢,但建议定期检查:

docker pull ghcr.io/nkanaev/yarr:latest
docker-compose down && docker-compose up -d

7.2 监控方案

基础健康检查:

# 容器状态
docker ps --filter "name=yarr"

# 服务响应
curl -I http://localhost:7070

# 资源占用
docker stats yarr

进阶方案(Prometheus监控):

# docker-compose.yml添加
services:
  yarr:
    labels:
      - "prometheus.enable=true"
      - "prometheus.port=7070"
      - "prometheus.path=/metrics"

7.3 迁移方案

完整迁移只需三步:

  1. 备份数据卷:
    tar cvf yarr-backup.tar ~/yarr-data
    
  2. 在新服务器恢复:
    tar xvf yarr-backup.tar -C ~/
    
  3. 启动容器(使用相同docker命令)

对于跨架构迁移(如x86到ARM),需要重建SQLite索引:

docker exec yarr sqlite3 /data/storage.db "REINDEX;"

8. 我的使用心得

经过三个月的实际使用,Yarr完全满足了我的核心需求——在一个界面集中阅读所有订阅内容。几点特别感受:

  1. 阅读效率提升 :以前碎片时间刷社交媒体,现在用Yarr主动获取信息,每天节省至少1小时
  2. 数据自主权 :所有阅读记录、星标文章都保存在本地,不用担心服务突然关闭
  3. 定制自由 :通过CSS注入可以完全自定义界面风格

一个小技巧:我会用标签功能分类订阅源(如#tech #news),配合过滤规则实现智能排序。例如:

/news/* → 标记为news
/tech/* → 标记为tech
priority:tech > news > others

这种工作流让我在信息海洋中始终保持专注,真正实现了"我的信息我做主"。如果你也厌倦了算法推荐的信息茧房,不妨试试这套自托管方案——它可能不会让你更高效,但一定会让你更清醒。

更多推荐