安装

如果你拥有的 Ruby 环境可用,你可以通过以下方式安装全局 Kamal

gem install kamal

否则,你可以通过别名运行 dockerized 版本(将其添加到你的 ~/.bashrc 或类似的方式,以简化重新使用)。

在 macOS 上,使用

alias kamal='docker run -it --rm -v "${PWD}:/workdir" -v "/run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock" -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock" -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/basecamp/kamal:latest'

在 Linux 上,使用

alias kamal='docker run -it --rm -v "${PWD}:/workdir" -v "${SSH_AUTH_SOCK}:/ssh-agent" -v /var/run/docker.sock:/var/run/docker.sock -e "SSH_AUTH_SOCK=/ssh-agent" ghcr.io/basecamp/kamal:latest'

然后,在你的应用目录内,运行 kamal init。现在,编辑新文件 config/deploy.yml。它可能看起来像这样简单

service: hey
image: 37s/hey
servers:
  - 192.168.0.1
  - 192.168.0.2
registry:
  username: registry-user-name
  password:
    - KAMAL_REGISTRY_PASSWORD
env:
  secret:
    - RAILS_MASTER_KEY

然后编辑 .env 文件,把你的 registry 密码添加为 KAMAL_REGISTRY_PASSWORD(以及使用 Rails 应用生产的 RAILS_MASTER_KEY)。

现在,你可以部署到服务器

kamal setup

这将

  1. 通过 SSH 连接到服务器(默认使用 root,通过你的 ssh 密钥验证身份)。
  2. 在任何可能缺少它(使用 apt-get)的服务器上安装 Docker 和 curl:为此,需要通过 ssh 获得 root 访问权限。
  3. 登录本地和远程的 registry。
  4. 使用应用程序根目录中的标准 Dockerfile 构建镜像。
  5. 把镜像推送到 registry。
  6. 从 registry 拉取镜像到服务器。
  7. 从 .env 将 ENV 变量推送到服务器。
  8. 确保 Traefik 正在运行,并接受端口 80 上的流量。
  9. 确保你的应用使用 200 OK 响应 GET /up(你必须在你的应用镜像内安装 curl!)。
  10. 启动一个新的容器,其应用版本与当前 git 版本哈希匹配。
  11. 停止运行应用先前版本的旧容器。
  12. 移除未使用的镜像和已停止的容器,以确保服务器不会满。

瞧!所有服务器现在都在端口 80 上提供应用。如果你只是在运行一台服务器,你就可以开始了。如果你正在运行多台服务器,你需要在它们前面放置一个负载均衡器。对于后续部署,或者如果你的服务器已经安装了 Docker 和 curl,你可以只运行 kamal deploy