教程:使用 Kamal 部署 Rails 应用程序
Kamal 是用于部署容器化 Rails 应用程序的工具。 Kamal 不像 Capistrano 那样通过 SSH 执行任务,而是构建应用程序的 Docker 镜像,将其推送到注册表,并在服务器上以轻量容器的形式运行。
在 RubyMine 中,您可以直接从内置终端或通过 运行 Kamal 命令。 这样,您无需离开 IDE 即可触发部署、管理环境并监视日志。
在本教程中,您将了解如何使用 Kamal 将示例 Rails 应用程序部署到远程服务器。 作为应用程序服务器,Puma 将在 Docker 容器中运行,由 Kamal Proxy 处理 HTTP 和 HTTPS 流量。
先决条件
若要在 RubyMine 中完全使用 Kamal 部署 Rails 应用程序,请确保本地环境和远程服务器满足以下要求。
本地计算机
搭载 macOS 的 Mac
已安装并配置 RubyMine 用于您的 Rails 项目。
Rails 8 应用程序。 对于较旧的 Rails 版本,请将 Kamal 添加到您的 Gemfile 中或使用
gem install kamal在本地安装。项目根目录中有一个有效的
Dockerfile。本地已安装 Docker。
可访问容器注册表(如 Docker Hub、GitHub Container Registry 或私有注册表),并已安全存储凭据。
本地已配置 SSH
Web 服务器
基于 Linux 的主机。
SSH 访问权限需与 Kamal
deploy.yml(或 OpenSSH 配置)中定义的用户相同。Docker 已安装并正在运行(Kamal 可在
kamal setup期间为新主机安装 Docker)。
部署
本部分教程介绍了使用 Kamal 部署应用所需的步骤。
初始化 Kamal
在 RubyMine 中,打开终端: 。 或者,点击 IDE 左下角工具栏中的 终端 图标。
请运行以下命令:
kamal init这将创建一个 config/deploy.yml 文件。 此文件包含多个部署配置项和选项,但在本教程中,我们只关注部署所需的设置。
配置部署
编辑由 kamal init 生成的 config/deploy.yml 文件。
以下是该文件内容的一个示例:
管理密钥
在生产环境中,Rails 需要有效的 SECRET_KEY_BASE 才能进行加密和安全操作。 请按以下步骤正确配置:
运行以下任一命令以生成强
SECRET_KEY_BASE:bin/rails secret # or ruby -rsecurerandom -e 'puts SecureRandom.hex(64)' # or, if using your built Docker image: docker run --rm <your-image> ./bin/rails secret通过将生成的密钥添加到环境配置中来更新您的 config/deploy.yml 文件:
env: clear: RAILS_ENV: production PORT: "3000" SECRET_KEY_BASE: <%= ENV.fetch("SECRET_KEY_BASE") %>在运行
kamal deploy命令之前,将密钥导出到您的环境中:export SECRET_KEY_BASE="<your-generated-value>"
部署完成后,您的应用程序将使用提供的 SECRET_KEY_BASE 值来保护敏感操作。
运行首次服务器设置
运行 kamal setup 命令以准备服务器进行部署。
部署您的应用程序
现在您已经配置好部署并确保 Web 服务器已就绪,可以开始部署应用程序。
从 RubyMine 终端运行以下命令。
kamal deployKamal 将执行以下操作:
在本地构建 Docker 镜像
将其推送到您的注册表
通过 SSH 连接至服务器
拉取新镜像
在配置的环境中启动应用程序
部署完成后,打开浏览器并访问为应用程序配置的 URL。
故障排查
SSH 持续要求输入密码短语或密码
将 SSH 密钥加载到代理中以避免密码短语提示:
ssh-add ~/.ssh/id_ed25519将 SSH 密钥添加到 macOS 钥匙串以实现持久访问:
ssh-add --apple-use-keychain -K ~/.ssh/id_ed25519通过配置 ~/.ssh/config 来确保 SSH 使用正确的密钥:
Host your-server-ip User your-username IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes测试 SSH 连接以验证是否一切正常:
ssh your-username@your-server-ip
您的页面返回 404
检查请求是否到达 Rails:
# in one shell kamal app logs -f # in another shell curl -I http://app.example.com/如果日志为空,请修复 DNS 或代理。 如果 Rails 日志显示 404,请在您的应用中添加根路由。
检查代理是否正常路由及运行状况良好:
kamal proxy ps kamal proxy logs -f curl -I -H "Host: app.example.com" http://127.0.0.1在 deploy.yml 中使用返回 200 的健康检查路径(例如, /向上 ):
确认应用监听正确端口(默认 3000)并绑定
0.0.0.0:curl -I http://127.0.0.1:3000/
回滚
如果当前部署存在问题,请将应用程序回滚到先前版本。 这有助于快速恢复到稳定状态。
首先,列出可用的容器,以识别先前的版本:
kamal app containers -q然后,指定所需的版本或最新稳定版本,回滚到之前的镜像:
kamal rollback回滚后,请监控日志和应用的运行状况,以确保以前的版本正常运行。