Loading...
Loading...
Deploy containerized web applications to any Linux server using Kamal. Use when users need to deploy, configure, debug, or manage Kamal deployments including initial setup, configuration of deploy.yml, deployment workflows, rollbacks, managing accessories (databases, Redis), troubleshooting deployment issues, or understanding Kamal commands and best practices.
npx skill4agent add el-feo/ai-context kamalconfig/deploy.yml# 1. Install Kamal
gem install kamal
# 2. Initialize configuration
cd your-app
kamal init
# 3. Edit config/deploy.yml
# - Set service name and image
# - Add server IP addresses
# - Configure registry credentials
# - Set environment variables
# 4. Configure secrets in .kamal/secrets
KAMAL_REGISTRY_PASSWORD=your-token
RAILS_MASTER_KEY=your-key
# 5. Run initial setup (installs Docker, deploys everything)
kamal setupkamal deploy # Build, push, deploy with zero downtime
kamal deploy -d staging # Deploy to staging environment
kamal app logs -f # Follow application logskamal app exec -i --reuse "bin/rails console" # Rails console
kamal app logs -g "error" # Search logs
kamal rollback <version> # Rollback
kamal app maintenance # Maintenance mode
kamal app live # Exit maintenanceservice: myapp
image: username/myapp
servers:
web:
- 192.168.1.10
registry:
server: ghcr.io
username: myuser
password:
- KAMAL_REGISTRY_PASSWORD
env:
secret:
- RAILS_MASTER_KEY
clear:
RAILS_ENV: production
proxy:
ssl: true
host: example.comservers:
web:
hosts:
- 192.168.1.10
- 192.168.1.11
worker:
hosts:
- 192.168.1.12
cmd: bundle exec sidekiqaccessories:
postgres:
image: postgres:15
host: 192.168.1.20
port: 5432
env:
secret:
- POSTGRES_PASSWORD
clear:
POSTGRES_DB: myapp_production
directories:
- data:/var/lib/postgresql/data
redis:
image: redis:7
host: 192.168.1.21
directories:
- data:/datakamal initkamal setupkamal deploykamal redeploykamal rollback VERSIONkamal app logs [-f]kamal app exec "COMMAND"kamal app exec -i --reuse "bash"kamal app maintenancekamal app livekamal app containerskamal app versionkamal accessory boot NAMEkamal accessory logs NAME [-f]kamal accessory exec NAME "CMD"kamal configkamal lock statuskamal lock releasekamal server exec "CMD"kamal deploy -d stagingkamal deploy -h 192.168.1.10kamal deploy -r web.kamal/hooks/pre-deploy#!/bin/bash
kamal app exec -p -q "bin/rails db:migrate"chmod +x .kamal/hooks/pre-deploy
kamal deploy# Check what went wrong
kamal app logs
# List available versions
kamal app containers
# Rollback to previous version
kamal rollback abc123defkamal app logs -n 500kamal server exec "docker ps -a"kamal app exec "curl localhost:3000/up"kamal configkamal lock releaseconfig/deploy.ymlconfig/deploy.staging.ymlkamal setup -d staging
kamal deploy -d staging
kamal deploy # production# PostgreSQL
kamal accessory exec postgres "psql -U myapp"
kamal accessory exec postgres "pg_dump -U myapp myapp_production" > backup.sql
# Redis
kamal accessory exec redis "redis-cli"
# MySQL
kamal accessory exec mysql "mysql -u root -p myapp_production"kamal accessory exec litestream "litestream generations /data/production.sqlite3"
kamal accessory exec litestream "litestream restore /data/production.sqlite3"ssh:
user: deploy
port: 2222builder:
context: .
dockerfile: Dockerfile.production
args:
RUBY_VERSION: 3.2.0healthcheck:
path: /up
port: 3000
interval: 10
max_attempts: 7aliases:
console: app exec --interactive --reuse "bin/rails console"
shell: app exec --interactive --reuse "bash"
logs: app logs -fkamal console- name: Deploy
env:
KAMAL_REGISTRY_PASSWORD: ${{ secrets.REGISTRY_TOKEN }}
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
run: |
gem install kamal
kamal deployconfig/deploy.yml