# Kamal Deploy

> Deploy Docker applications using Kamal 2 with zero-downtime and automatic SSL. Use this skill when (1) setting up new Kamal deployments, (2) generating deploy.yml configuration, (3) deploying apps that lack health endpoints (using Caddy workaround).

- Skill: `majiayu000/kamal-deploy` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/kamal-deploy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/kamal-deploy/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/kamal-deploy

---


# Kamal 2 Deployment

## Workflow

Ask user for:
1. **Domain** — e.g., `app.example.com` (service name: `app_example_com`)
2. **Server IP(s)**
3. **Health endpoint** — Does app return 200 on `/up` without auth?

## Generate config/deploy.yml

```yaml
service: {{DOMAIN_UNDERSCORED}}
image: jalen0x/{{DOMAIN_UNDERSCORED}}

servers:
  web:
    hosts:
      - {{SERVER_IP}}

proxy:
  ssl: true
  host: {{DOMAIN}}

registry:
  username: jalen0x
  password:
    - KAMAL_REGISTRY_PASSWORD

ssh:
  user: ubuntu

builder:
  arch: amd64
```

## Health Endpoint

App must respond 200 on `/up` at port 80 (default).

**Custom path**: Add `healthcheck.path` to proxy config.

**No health endpoint**: Use Caddy. Copy templates from `assets/` and customize:
- `assets/Caddyfile` → project `Caddyfile`
- `assets/start.sh` → project `start.sh`

Generate Dockerfile:
```dockerfile
FROM {{BASE_IMAGE}}
RUN apk add --no-cache caddy
COPY Caddyfile /Caddyfile
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/bin/sh", "/start.sh"]
```

## Commands

```bash
kamal setup   # First-time
kamal deploy  # Deploy
```

