Loading...
Loading...
Compare original and translation side by side
WebFetch(url: "https://kamal-deploy.org/docs/installation/", prompt: "Extract complete installation and setup guide")WebFetch(url: "https://kamal-deploy.org/docs/configuration/overview/", prompt: "Extract all configuration options and deploy.yml structure")WebFetch(url: "https://kamal-deploy.org/docs/commands/view-all-commands/", prompt: "Extract all Kamal commands and usage")WebFetch(url: "https://kamal-deploy.org/docs/configuration/proxy/", prompt: "Extract proxy, SSL, and health check configuration")https://kamal-deploy.org/docs/configuration/servers/https://kamal-deploy.org/docs/configuration/accessories/https://kamal-deploy.org/docs/configuration/environment-variables/https://kamal-deploy.org/docs/configuration/builders/https://kamal-deploy.org/docs/hooks/overview/https://kamal-deploy.org/docs/upgrading/overview/WebFetch(url: "https://kamal-deploy.org/docs/installation/", prompt: "Extract complete installation and setup guide")WebFetch(url: "https://kamal-deploy.org/docs/configuration/overview/", prompt: "Extract all configuration options and deploy.yml structure")WebFetch(url: "https://kamal-deploy.org/docs/commands/view-all-commands/", prompt: "Extract all Kamal commands and usage")WebFetch(url: "https://kamal-deploy.org/docs/configuration/proxy/", prompt: "Extract proxy, SSL, and health check configuration")https://kamal-deploy.org/docs/configuration/servers/https://kamal-deploy.org/docs/configuration/accessories/https://kamal-deploy.org/docs/configuration/environment-variables/https://kamal-deploy.org/docs/configuration/builders/https://kamal-deploy.org/docs/hooks/overview/https://kamal-deploy.org/docs/upgrading/overview/kamal versiongem install kamaltraefikproxybuilder:
arch: amd64
remote: ssh://root@SERVER_IP.env.erbop: command not foundkamal versiongem install kamaltraefikproxybuilder:
arch: amd64
remote: ssh://root@SERVER_IP.env.erbop: command not foundundefinedundefinedundefinedundefined| Command | Purpose |
|---|---|
| First deploy - installs Docker, proxy, deploys |
| Deploy new version |
| Revert to previous version |
| View application logs |
| SSH into running container |
| Start accessory (db, redis) |
| Restart kamal-proxy |
| Remove everything from servers |
| 命令 | 用途 |
|---|---|
| 首次部署 - 安装Docker、代理、部署应用 |
| 部署新版本 |
| 回滚到上一个版本 |
| 查看应用日志 |
| 进入运行中的容器 |
| 启动附属组件(数据库、Redis) |
| 重启kamal-proxy |
| 移除服务器上的所有相关组件 |
service: my-app
image: username/my-app
servers:
- 123.45.67.89
registry:
username: username
password:
- KAMAL_REGISTRY_PASSWORD
proxy:
ssl: true
host: myapp.com
env:
secret:
- RAILS_MASTER_KEY
- DATABASE_URLservice: my-app
image: username/my-app
servers:
- 123.45.67.89
registry:
username: username
password:
- KAMAL_REGISTRY_PASSWORD
proxy:
ssl: true
host: myapp.com
env:
secret:
- RAILS_MASTER_KEY
- DATABASE_URL.kamal/secretsundefined.kamal/secretsundefined
Reference in deploy.yml:
```yaml
env:
clear:
RAILS_ENV: production
secret:
- RAILS_MASTER_KEY
- DATABASE_URL
在deploy.yml中引用:
```yaml
env:
clear:
RAILS_ENV: production
secret:
- RAILS_MASTER_KEY
- DATABASE_URLservers:
web:
hosts:
- 123.45.67.89
- 123.45.67.90
workers:
hosts:
- 123.45.67.91
cmd: bin/jobs
proxy: false # Workers don't need proxyservers:
web:
hosts:
- 123.45.67.89
- 123.45.67.90
workers:
hosts:
- 123.45.67.91
cmd: bin/jobs
proxy: false # 工作节点不需要代理accessories:
db:
image: postgres:16
host: 123.45.67.89
port: 5432
env:
clear:
POSTGRES_DB: app_production
secret:
- POSTGRES_PASSWORD
directories:
- data:/var/lib/postgresql/data
redis:
image: redis:7
host: 123.45.67.89
port: 6379
directories:
- data:/dataaccessories:
db:
image: postgres:16
host: 123.45.67.89
port: 5432
env:
clear:
POSTGRES_DB: app_production
secret:
- POSTGRES_PASSWORD
directories:
- data:/var/lib/postgresql/data
redis:
image: redis:7
host: 123.45.67.89
port: 6379
directories:
- data:/dataproxy:
ssl: true
host: myapp.com # Must point to server IPproxy:
ssl:
certificate_pem:
- SSL_CERTIFICATE
private_key_pem:
- SSL_PRIVATE_KEYproxy:
ssl: true
host: myapp.com # 必须指向服务器IPproxy:
ssl:
certificate_pem:
- SSL_CERTIFICATE
private_key_pem:
- SSL_PRIVATE_KEYproxy:
healthcheck:
interval: 3
path: /up
timeout: 3/upproxy:
healthcheck:
interval: 3
path: /up
timeout: 3/upconfig/deploy.staging.ymlservers:
- staging.myapp.com
proxy:
host: staging.myapp.comkamal deploy -d staging.kamal/secrets.stagingconfig/deploy.staging.ymlservers:
- staging.myapp.com
proxy:
host: staging.myapp.comkamal deploy -d staging.kamal/secrets.staging.kamal/hooks/pre-connectpre-buildpre-deploypost-deploypre-app-bootpost-app-bootpre-proxy-rebootpost-proxy-reboot.kamal/hooks/post-deploy#!/bin/bash
curl -X POST "https://api.honeybadger.io/v1/deploys" \
-d "deploy[revision]=$KAMAL_VERSION".kamal/hooks/pre-connectpre-buildpre-deploypost-deploypre-app-bootpost-app-bootpre-proxy-rebootpost-proxy-reboot.kamal/hooks/post-deploy#!/bin/bash
curl -X POST "https://api.honeybadger.io/v1/deploys" \
-d "deploy[revision]=$KAMAL_VERSION"FROM ruby:3.3-slim
WORKDIR /appFROM ruby:3.3-slim
WORKDIR /app
Note: Kamal 2.x defaults to port 80 (not 3000).
注意:Kamal 2.x默认使用80端口(而非3000)。/updeploy_timeoutkamal app logsssh-add ~/.ssh/id_rsaKAMAL_REGISTRY_PASSWORD.kamal/secretswrite:packageskamal proxy rebootdocker ps/updeploy_timeoutkamal app logsssh-add ~/.ssh/id_rsa.kamal/secretsKAMAL_REGISTRY_PASSWORDwrite:packageskamal proxy rebootdocker ps| Kamal | Kubernetes | Heroku | |
|---|---|---|---|
| Complexity | Low | High | None |
| Cost | VPS only | VPS + overhead | $$$ |
| Control | Full | Full | Limited |
| Zero-downtime | Yes | Yes | Yes |
| SSL | Auto | Manual | Auto |
| Learning curve | Hours | Weeks | Minutes |
| Kamal | Kubernetes | Heroku | |
|---|---|---|---|
| 复杂度 | 低 | 高 | 无 |
| 成本 | 仅VPS费用 | VPS费用+额外开销 | 高 |
| 控制权 | 完全控制 | 完全控制 | 有限 |
| 零停机部署 | 支持 | 支持 | 支持 |
| SSL | 自动配置 | 手动配置 | 自动配置 |
| 学习曲线 | 数小时 | 数周 | 数分钟 |
docker build . && docker run -p 3000:80 <image>.kamal/secrets.gitignoreasset_path: /app/public/assetsdocker build . && docker run -p 3000:80 <image>.kamal/secrets.gitignoreasset_path: /app/public/assets