解雇你的 DevOps 团队:Solo Dev 的 Kamal 2 指南
Source: Dev.to
部署困境
- PaaS 陷阱(Heroku、Render、Fly): 使用极其简便,但一旦需要超过 512 MB 的内存,费用就会从 $7 跳涨到 $50 再到 $200。你要为“便利”付税。
- 云端迷宫(AWS、Kubernetes): 拥有无限算力和更低的原始资源成本,但要部署一个“Hello World”应用,你必须精通 IAM 角色、VPC 和负载均衡器,堪称需要博士学位。
引入 Kamal。
Kamal 由 Basecamp(Rails 的制造者)创建,弥合了上述鸿沟。它让你拥有原始 VPS 硬件的所有权和低成本,同时提供 git push 风格的部署简易性。
随着 Kamal 2 的发布,它终于可以面向大众使用。下面展示我如何在不到 10 分钟的时间里,将一个生产就绪的应用部署到一台 $5 的 Hetzner 服务器上。
什么是 Kamal?
Kamal 本质上是 “容器版 Capistrano”。 它在你的笔记本电脑本地运行。当你输入 kamal deploy 时,它会:
- 在本地(或在构建器上)构建你的 Docker 镜像。
- 将镜像推送到注册表(Docker Hub、GitHub Packages 等)。
- SSH 登录到你的服务器。
- 拉取新的镜像。
- 与旧版本一起启动它。
- 使用内置代理进行流量切换(蓝绿部署)。
- 杀掉旧版本。
没有 “主节点”,也不需要管理 Kubernetes 集群状态。如果你的笔记本电脑丢失,服务器仍然会继续运行。
硬件:5 美元的强力机器
前往 Hetzner(或 DigitalOcean/Linode)购买一台廉价的 VPS。大约 5 美元 / 月 就能获得一台 2 个 vCPU、4 GB RAM 的 ARM 服务器。
在 Heroku 上,拥有相似规格的 “Performance” dyno 每月费用约 250 美元 以上。这使得 Kamal 对于单独开发者来说是一个毫无悬念的选择。
Source: …
指南:从零到 SSL
1. 安装
假设你的本地已经在运行 Docker:
gem install kamal
kamal init
2. 配置(config/deploy.yml)
Kamal 2 大幅简化了配置。以下就是你需要的全部内容:
service: my-app
image: your-username/my-app
servers:
web:
- 123.45.67.89 # 你的 VPS IP 地址
# 存放 Docker 镜像的仓库
registry:
server: ghcr.io
username: your-username
password:
- KAMAL_REGISTRY_PASSWORD
# 注入环境变量
env:
secret:
- RAILS_MASTER_KEY
- POSTGRES_PASSWORD
3. Kamal 2 的魔法:代理
在 Kamal 1 中,你必须手动配置 Traefik 来处理 SSL。Kamal 2 默认包含 kamal-proxy,它会自动处理:
- 零停机部署: 在应用重启时保持请求。
- 自动 SSL: 自动与 Let’s Encrypt 通信,为你提供 HTTPS。
在 deploy.yml 中加入以下内容:
proxy:
ssl: true
host: myapp.com
4. 数据库怎么办?
对于真正的“一人”部署,你可以在同一台 $5 服务器上使用 Accessories 运行数据库。Kamal 会启动一个 Postgres 容器并为你管理它:
accessories:
db:
image: postgres:15
host: 123.45.67.89
port: 5432
env:
POSTGRES_DB: my_app_production
POSTGRES_USER: my_app
POSTGRES_PASSWORD:
- POSTGRES_PASSWORD
files:
# 将数据持久化到宿主机磁盘,以便重启后仍然存在!
- db_data:/var/lib/postgresql/data
5. 启动
运行以下单条命令:
kamal setup
kamal setup 将会:
- SSH 登录你的 VPS 并安装 Docker。
- 启动数据库 accessory。
- 启动 Kamal 代理。
- 构建你的应用。
- 启动你的应用。
- 颁发 SSL 证书。
大约 3–5 分钟 后,你的应用就可以通过 https://myapp.com 访问了。
第 2 天 操作:轻松入眠
部署 Bug 修复
kamal rollback
Kamal 会保留旧的容器(已停止)。回滚仅仅是将代理指针切回到之前的容器,耗时约 10 秒。
运行 Rails 控制台
kamal app exec -i 'bin/rails console'
您会立即进入服务器上的远程控制台会话。
摘要
“DevOps 人员”过去是必须招聘的。随着 Kamal 2,拥有自己基础设施的门槛已经崩塌。你不需要 Kubernetes 或 AWS Lambda——只需要一台 Linux 机器、一把 SSH 密钥和 Kamal。
解雇你的 DevOps 团队(或者更确切地说,别再尝试当它了)。回归编码。