我如何使用 Rails 8 构建完整功能的 SaaS 并一键部署
Source: Dev.to

当我决定构建 MatGoat,一个武术学院管理平台时,我只有一个目标:保持简单。
没有 Kubernetes。没有微服务。没有复杂的 CI/CD 流水线。只用一个可以通过单条命令部署的 Rails 单体应用。
下面就是我的实现方式。
技术栈
- Rails 8.1 搭配 Hotwire(Turbo + Stimulus)
- PostgreSQL 作为数据库
- Kamal 2 用于部署
- Hetzner Cloud 托管(约 €20/月)
- Solid Queue 处理后台任务
- Tailwind CSS 负责样式
仅此而已。没有 webpack。没有 Node.js 构建步骤。没有 Redis 集群。没有独立的任务服务器基础设施。
为什么 Rails 8 改变了一切
Rails 8 引入了我称之为 “Solid 三位一体” 的特性:
- Solid Queue – 基于数据库的任务处理
- Solid Cache – 基于数据库的缓存
- Solid Cable – 基于数据库的 Action Cable
这意味着在大多数场景下我不需要 Redis。我的后台任务、缓存和实时更新都运行在同一个处理业务数据的 PostgreSQL 数据库上。
少管理一个服务,少出错一个点。
一条命令完成部署
完整的部署过程只有:
kamal deploy
Kamal 会处理:
- 构建 Docker 镜像
- 推送到镜像仓库
- 零停机时间发布新版本
- 执行数据库迁移
- 通过 Let’s Encrypt 管理 SSL 证书
我的 deploy.yml 只有约 100 行,定义了 Web 服务器、任务工作者、PostgreSQL 数据库、Redis(生产环境下用于 Action Cable)以及自动备份到 S3 的数据库。
向下扩展的架构
大多数架构文章都在讨论向上扩展。但对独立开发者和小团队而言,向下扩展更有价值。
MatGoat 运行在 Hetzner 上。整个基础设施每月花费不足 Netflix 订阅费用,却能支撑:
- 多租户学院管理
- 通过 WebSocket 实时课堂报名
- 视频内容分发
- 学员进度追踪
- 自动化课程排程
当(如果)需要扩容时,我只需在 Kamal 配置的 servers 数组中再添加一台服务器。就是这么简单。
我没有的东西
- 没有容器编排平台
- 没有托管数据库服务
- 没有独立的 CDN 配置
- 基础设施即代码仅限于 Kamal 配置
我一点也不想念这些。
维护故事
每天,我都会运行:
kamal deploy
如果出现问题:
kamal rollback
需要查看日志?
kamal logs
需要打开 Rails 控制台?
kamal console
精神负担极低。我把时间花在开发功能上,而不是与基础设施搏斗。
收获
你并不需要复杂的架构就能打造真实的产品。Rails 8 加上 Kamal 为你提供:
- 简洁:一种语言、一个框架、一个部署工具
- 快速:几分钟完成部署,而不是数小时
- 成本效益:所有东西都运行在单台 VPS 上
- 可维护性:部件更少,故障点更少
如果你是独立开发者或小团队,考虑一下是否真的需要那个 Kubernetes 集群。有时,乏味的方案才是正确的选择。