Ruby 用 kamal 部署 rails 至阿里云主机总结

flchenhp · April 13, 2026 · Last by njgzs replied at May 21, 2026 · 560 hits

需求背景

rails 开发速度很快,体验很好,但是如果无法部署到服务器上,最后也就是自己在本机玩玩,开发的网页服务不能给别人使用。 我在 deepseek 的帮助下经过一周的摸索终于实现了部署,特记录供自己后期查阅,也供其他人借鉴。真的感谢好时代,有 deepseek 不然想也不敢去想我一个个人业余开发者,身边没一个同语言开发指导老师怎么敢去想自行摸索完成部署功能。

让 deepseek 总结 kamal 一次完整部署的生命周期

下面是 Kamal 从初始化到部署完成的完整工作流程,每一步都对应具体的操作:

阶段 0:准备工作(只需一次)

  1. 初始化配置:运行 kamal init,生成 config/deploy.yml 配置文件
  2. 配置服务器列表:在 deploy.yml 中指定服务器的 IP 地址或域名
  3. 配置容器注册表:设置注册表的用户名和密码(通过环境变量加密存储)
  4. 设置 SSH 密钥:确保本地可以免密登录服务器
  5. 编写 Dockerfile:Rails 7+ 会自动生成,确保镜像构建正确

阶段 1:初始部署(kamal setup

这个命令会完成服务器的首次配置

  1. SSH 连接并安装 Docker:连接到配置文件中的服务器,如果 Docker 未安装,自动通过 apt-get 安装
  2. 登录容器注册表:在本地和远程服务器上都登录,以便推送和拉取镜像
  3. 构建 Docker 镜像:使用项目根目录的 Dockerfile 构建镜像
  4. 推送镜像到注册表:将构建好的镜像推送到配置的容器注册表
  5. 在服务器上拉取镜像:通过 SSH 命令让服务器从注册表拉取镜像
  6. 启动 Kamal Proxy:确保代理服务正在运行,并监听 80/443 端口
  7. 启动应用容器:基于拉取的镜像启动新的 Docker 容器
  8. 健康检查:验证应用是否响应 GET /up 请求(必须返回 200 OK)
  9. 清理旧资源:删除未使用的镜像和停止的容器,防止磁盘占满

阶段 2:后续部署(kamal deploy

这是日常更新应用的命令,只执行部署流程,不重复安装 Docker

  1. 构建新镜像:基于最新的代码构建新版本镜像
  2. 推送到注册表:新镜像被推送到注册表,标签通常是 Git commit hash
  3. SSH 连接服务器并拉取新镜像:服务器从注册表拉取新版本镜像
  4. 启动新容器(旧容器仍在运行):在旧容器旁边启动新容器,确保服务不中断
  5. 健康检查:等待新容器通过健康检查(GET /up
  6. Kamal Proxy 切换流量:代理原子性地将流量从旧容器切换到新容器
  7. 停止旧容器:新容器稳定运行后,停止并删除旧容器
  8. 清理资源:删除旧镜像和未使用的容器,释放磁盘空间

我理解 kamal 的功能(没怎么接触过 docker)

我理解 kamal 大致功能是先将本机的开发环境和项目通过 docker 打包成镜像,push 到镜像仓库,然后登陆服务器先下载 docker,然后从镜像仓库 pull 这个镜像再还原运行。 之前尝试过在本机和服务机均安装网络代理工具,这一步实现了,但是直接参考 rails guide 部署还是会存在问题,没搞明白。只能尝试将所有可能会用到科学上网的源替换成国内的源。

部署记录

step1:准备 hello world 项目

新建 rails 项目

ruby -v
rails -v
rails new rails106

用编辑器(我用的是 trae)打开项目,做初始化保存

#iterm
git add .
git commit -m "initial commit"

将 gem 源改成 rubychina 的源

# gemfile
-source "https://rubygems.org"
+source "https://gems.ruby-china.com"

添加 hello world 页面

#iterm
rails g controller welcome index
# app/views/welcome/index.html.erb
+<h1>hello world</h1>
-<h1>Welcome#index</h1>
-<p>Find me in app/views/welcome/index.html.erb</p>
# config/routes.rb
  root "welcome#index"
  get "welcome/index"

启动项目,查看 hello word 页面

# iterm
bin/dev

将代码加入 git 保存

# iterm
git add .
git commit -m "add hello world page"

step2:选择云主机

阿里云主机可以直接添加 docker,免去安装 docker 的麻烦。直接用 root 账号和设定的自定义密码,这个会用于远程服务器。

远程主机验证 docker 安装成功:

# 云主机命令行
docker --version
docker run hello-world

step3:申请阿里云容器镜像服务(ACR)

  1. 进入控制台:登录后搜索“容器镜像服务,或直接访问 容器镜像服务控制台
  2. 按提示创建个人版实例(下面的信息都很重要,部署的配置文件要用)
  3. 按提升建立命名空间
  4. 按提示设置密码,获取登录命令
  5. 获取个人加速器地址

step4:在本机下载 docker

  1. 访问 Docker Desktop for Mac 下载页面选择适宜自己电脑版本下载安装
  2. 点击 Mac 顶部菜单栏的 Docker 图标,选择 Settings。在左侧菜单选择 Docker Engine,将阿里云和一些其他的加速器地址填上 { "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://5ex1e6il.mirror.aliyuncs.com", "https://docker.1panel.live", "https://hub.rat.dev", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.xuanyuan.me", "https://docker.1ms.run" ] }
  3. 打开“终端”应用,运行docker --versiondocker run hello-world 进行验证 docker 是否正确安装

step5:进行部署配置

#rails106/config/deploy.yml
-image: rails106
+image: myrailsapp/rails106 # myrailsapp是阿里云的镜像仓库命名空间

-    - 192.168.0.1
+    - 47.x x.xx.236 # 这是阿里云的IP地址

-  server: localhost:5555
+  # 这里填阿里云的镜像仓库的公网地址
+  server: crpi-xxxxxxxxxxx.cn-zhangjiakou.personal.cr.aliyuncs.com 

-  # username: your-user
+  # 这里填阿里云的账号
+  username: chenxxxxxx21

-  # password:
+   # 这里填阿里云的镜像的固定秘密
+  password: cxxxxxx9

代码类似

# rails106/Dockerfile
-# syntax=docker/dockerfile:1
+# #syntax=docker/dockerfile:1 # 第一行这里要再加个注释符号注释,不然会报错,不知道为什么

-FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
+# FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
+# 要换成ruby的国内的源,不然会卡住
+FROM docker.m.daocloud.io/library/ruby:$RUBY_VERSION-slim AS base

WORKDIR /rails
+# 设定 apt 源为阿里云镜像,不然会卡住
+RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && \
+    sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources
# Install base packages
RUN apt-get update -qq && \

代码类似 加入 git 仓库

# iterm
git add .
git commit -m "add deploy set"

step6:打部署命令开始部署

# iterm
bin/kamal setup

部署成功: 浏览器输入 ip 测试 大功告成!!!

如果只部署一台服务器,且不用 docker,kamal 部署是不是有点麻烦?

好像 kamal 依赖 docker。

尝试几次 kamal 都失败告终,docker 的网络问题太麻烦了,现在还停留在 rails 7 + mina 部署,等 Ubuntu 26.04 发布了再研究

除了 setup 需要服务器上装好 docker 和 kamal-proxy,就没什么网络问题了。

平时部署,构建机可以科学上网就行,打好镜像传到自己的私有镜像仓库,服务器拉取。

最简的方案是去布署到 railway 上面。

国内再做个加速

db:migrate 在哪一步操作?

这玩意国内用真的太麻烦。甚至我宁愿用 cap

Reply to newerer

花了我好久长时间才摸索通这个部署,通了还行,不用去服务器安装 ruby 环境、不用自己去申请部署 SSL 证书,还是很便利的

直接用 AI 参照 mina 开发了一个,自己用很方便,一直用的 mina,简单高效,可惜不更新了

其实安装一个 dokku 来部署也可以 挺方便的

You need to Sign in before reply, if you don't have an account, please Sign up first.