从代码到生产环境:Dato.RSS使用Capistrano部署上云的完整指南
【免费下载链接】dato.rssThe best RSS Search experience you can find项目地址: https://gitcode.com/gh_mirrors/da/dato.rss
Dato.RSS 是一个开箱即用的 RSS 搜索引擎与 RESTful API 服务,它能把你的 RSS/Atom 源变成可搜索、可订阅的数据接口,并用机器学习(Dandelion)为每篇文章自动提取语义与情感标签。本文将带你用 Capistrano 把它从零部署到自己的云服务器上,全程大约 30 分钟。
🧩 Dato.RSS 的技术栈与部署架构
在部署前,先了解它运行所依赖的组件,这决定了服务器要装哪些软件:
- Ruby on Rails 6.1— 核心 Web 框架,提供网页与 JSON API
- PostgreSQL— 主数据库,同时承担全文搜索(pg_search + tsvector 索引)
- Redis— 缓存与 Action Cable 的传输层
- Sidekiq— 后台任务队列,负责抓取 Feed、发送 Webhook
- Nginx + Phusion Passenger— Capistrano 通过
capistrano-passenger插件自动集成 - Node.js / Yarn— Webpacker 编译前端资源(TailwindCSS 等)
一次部署后,Capistrano 会在服务器上按releases目录版本化管理代码,支持秒级回滚。
⚙️ 一键部署前的服务器准备清单
以 Ubuntu 20.04/22.04 为例,按下面顺序安装依赖:
- 创建专用部署用户(与
config/deploy/production.rb中的user: 'deploy'保持一致) - Ruby 环境:安装
git、rbenv,并安装Ruby 3.0.0——版本号由 Capfile 中的set :rbenv_ruby, '3.0.0'指定,Gemfile 也锁定了同一版本 - 前端依赖:Node.js 16+ 与 Yarn
- 数据库与缓存:PostgreSQL(启用
pgcrypto扩展,项目首个迁移会自动安装)、Redis - Web 服务器:Nginx + Phusion Passenger 模块
- SSH 免密登录:把本地公钥写入
~/.ssh/authorized_keys
📦 获取代码并配置 Capistrano
克隆项目(部署账号需对仓库有访问权限):
git clone https://gitcode.com/gh_mirrors/da/dato.rss cd dato.rss bundle install部署相关文件都集中在两处,理解它们就理解了整个流程:
| 文件 | 作用 |
|---|---|
| Capfile | 声明使用 deploy、rails、passenger、rbenv 插件与 git 源 |
| config/deploy.rb | 应用名datorss、部署目录/home/deploy/datorss、保留最近 5 个版本 |
| config/deploy/production.rb | 生产服务器地址、用户与角色(app / db / web) |
只需把 config/deploy/production.rb 里的 IP 换成你的服务器地址,并把 config/deploy.rb 中的repo_url改为你自己的仓库地址即可。
几个值得注意的配置细节:
set :keep_releases, 5— 只保留最近 5 次发布,节省磁盘空间append :linked_dirs, 'log', 'tmp/pids', ...— 日志与临时目录跨版本软链,发布后数据不丢失set :whenever_identifier— 让定时任务标识随环境区分,避免多台机器 cron 冲突
🚀 执行第一次 Capistrano 部署
在本地项目根目录运行:
cap production deployCapistrano 会依次完成:检出代码 →bundle install(部署到vendor/bundle)→yarn install并预编译 Webpacker 资源 → 自动创建并迁移 PostgreSQL 数据库 → 配置 Passenger 并重启 Nginx。
生产环境的数据库连接串通过环境变量DATABASE_URL注入,见 config/database.yml;生产连接池设为 15。建议把DATABASE_URL、RAILS_MASTER_KEY等写入服务器部署用户的~/.profile,Capistrano 执行远程命令时会自动加载。
⏰ 让 RSS 自动更新:Sidekiq 与定时任务
部署完成后,别忘了启动"引擎":
启动 Sidekiq:生产并发数与队列配置在 config/sidekiq.yml(production 并发 10,队列为
critical/default/low)。可用 systemd 管理,例如:cd /home/deploy/datorss/current bundle exec sidekiq -C config/sidekiq.yml安装定时任务:Capfile 引入了
whenever/capistrano,部署时会自动把 config/schedule.rb 注册为 cron——每 8 小时执行一次rake 'importer:run',该任务(lib/tasks/importer.rake)会过期待用 Token 并运行Service::Importer全量抓取已订阅的 Feed。
这样一来,新文章会被自动拉入数据库、建立全文索引,并通过 Webhook 推给你的订阅者。
✅ 部署验证与常用运维命令
部署完成后按下面几步验证:
- 浏览器访问
https://你的域名,应看到 Dato.RSS 首页 - 调用搜索接口:
curl https://你的域名/api/searches?q=ruby,返回 JSON:API 格式的文章列表 - 访问
/feeds/new添加你的第一个 Feed,稍后在首页确认条目已被抓取
日常运维命令速查:
| 场景 | 命令 |
|---|---|
| 发布新版本 | cap production deploy |
| 一键回滚到上一版本 | cap production deploy:previous |
| 重启应用 | cap production restart |
| 重新编译前端资源 | cap production assets:precompile |
| 查看定时任务 | cap production whenever:update |
💡 部署常见问题排查
- Passenger 启动失败:检查 config/puma.rb 依赖的
WEB_CONCURRENCY环境变量,以及 Passenger 文档链接是否指向current目录 - 数据库迁移卡住:确认服务器上已安装
pgcrypto扩展,首次迁移会用到 - 前端样式缺失:重新执行
cap production assets:precompile,并检查服务器 Node 版本 - 定时抓取没跑:
crontab -l查看任务是否存在,日志输出在log/schedule.log
掌握以上流程后,你不仅能让 Dato.RSS 稳定运行,也等于掌握了任何 Rails 项目上云的通用套路。祝你部署顺利!🎉
【免费下载链接】dato.rssThe best RSS Search experience you can find项目地址: https://gitcode.com/gh_mirrors/da/dato.rss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考