安利一个部署工具: kamal

刚刚部署后发现服务器疯狂报错,一键回滚,开始慢慢 debug。我用的是 kamal,让我生活变得更美好。因此写了这篇文章。

什么样的场景适合?

如果你之前 docker compose 部署就很满意了,那么大概率 kamal 也适合你。kamal 弥补了 docker compose 的一些不足,同时还保持了简单。可参考下面的对照表

docker compose kamal
配置文件 docker-compose.yml config/deploy.yml
Dockerfile 支持 支持
构建镜像 当前机器 可以设置远程机器
源码版本 最新文件 最后一次 git commit 的文件
运行环境 生产环境服务器 本地自动 ssh 连上远程,支持多服务器,类似 ansible
多个进程 --scale 已被废止 很遗憾不支持
证书自动生成
平滑部署
一台机器部署多个网站 得用不同端口 可以同一个,因为带 proxy
自动回滚 不行
部署多台机器 需要 docker swarm 支持

Kamal 是 37signals 的开源产品。
官方网站:https://kamal-deploy.org

如果你需要类似 Vercel 的 UI 界面,像 CoolifyDokploy 这样的方案更适合你。

番外篇:如何只用 kamal-proxy

如果你这台服务器上已经部署了 kamal,想要利用它自带的 kamal-proxy 将本机非 kamal 管理的docker 发布出来,应该怎么办?
举例,有一个 http 端口想要以 https 发布出来,或者以子目录的形式发布,比如 /docs 是单独的文档系统。

其实也很简单。首先要确保容器正确添加到 kamal 的 network。以 docker-compose.yml 举例,

services:
  app:
    networks:
      - kamal
networks:
  kamal:
    external: true

假设这是一个 node app,监听了 3000 端口。你想要把它发布到 www.example.com
重点

  1. 上面添加的 networks 是 kamal
  2. docker exec kamal-proxy kamal-proxy deploy www --host www.example.com --target app:3000 --tls --health-check-path /health

如果你写错了,可以改下参数继续执行,会 update 现有的设置。

  • 查看每个参数的含义 docker exec kamal-proxy kamal-proxy deploy --help
  • 列出所有服务 docker exec kamal-proxy kamal-proxy list
  • 如何升级 kamal-proxy
    首先在本地升级 kamal: gem install kamal 然后在本地运行 kamal proxy reboot 升级远程服务器上的 kamal-proxy