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

flchenhp · 2026年04月13日 · 26 次阅读

需求背景

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 测试 大功告成!!!

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号