安装
如果你拥有的 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
这将
- 通过 SSH 连接到服务器(默认使用 root,通过你的 ssh 密钥验证身份)。
- 在任何可能缺少它(使用 apt-get)的服务器上安装 Docker 和 curl:为此,需要通过 ssh 获得 root 访问权限。
- 登录本地和远程的 registry。
- 使用应用程序根目录中的标准 Dockerfile 构建镜像。
- 把镜像推送到 registry。
- 从 registry 拉取镜像到服务器。
- 从 .env 将 ENV 变量推送到服务器。
- 确保 Traefik 正在运行,并接受端口 80 上的流量。
- 确保你的应用使用
200 OK
响应GET /up
(你必须在你的应用镜像内安装 curl!)。 - 启动一个新的容器,其应用版本与当前 git 版本哈希匹配。
- 停止运行应用先前版本的旧容器。
- 移除未使用的镜像和已停止的容器,以确保服务器不会满。
瞧!所有服务器现在都在端口 80 上提供应用。如果你只是在运行一台服务器,你就可以开始了。如果你正在运行多台服务器,你需要在它们前面放置一个负载均衡器。对于后续部署,或者如果你的服务器已经安装了 Docker 和 curl,你可以只运行 kamal deploy
。