aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: fc440340f1308ccf94ea1c760a32e06a38ed3118 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Ship

Deploy Go binaries and static sites to a VPS. Automatic HTTPS. No daemon. Just SSH, systemd, and Caddy doing their jobs.

## How it works

Ship is a set of Claude skills. Tell Claude what to deploy. Claude handles it. Server is source of truth — ask Claude what's running and it checks the server, not a file that lies to you.

## Skills

| Skill | What it does |
|-------|-------------|
| `/ship-setup` | One-time VPS setup. Installs Caddy, saves host config |
| `/ship-status` | What's running, what port, how much disk. Asks server directly |
| `/ship-deploy` | Deploy something. Claude asks what it needs to know |
| `/ship-binary` | Upload binary, wire up systemd + Caddy, back up SQLite first |
| `/ship-static` | Rsync dist folder, Caddy serves it |
| `/ship-env` | Read/write env vars. Never wipes what's already there |
| `/ship-caddy` | Manage per-app Caddy config. Validates before reloading |
| `/ship-service` | Start, stop, restart, logs |

## Install

```bash
cp -r skills/ship-* ~/.claude/skills/
```

## Quick start

### 1. Set up VPS

```
/ship-setup
```

Claude asks for SSH host, domain, nickname. Done. Or skip Claude entirely:

```bash
bash ~/.claude/skills/ship-setup/setup.sh ubuntu@1.2.3.4 example.com prod --default
```

### 2. Deploy

```
/ship-deploy
```

Claude asks a few questions. Deploys. You go touch grass.

### 3. Check what's running

```
/ship-status
```

## Config

`~/.config/ship/config.json` — lives on your machine, created by `/ship-setup`.

```json
{
  "default": "prod",
  "hosts": {
    "prod": {
      "host": "ubuntu@1.2.3.4",
      "domain": "example.com"
    },
    "staging": {
      "host": "ubuntu@5.6.7.8",
      "domain": "staging.example.com"
    }
  }
}
```

Multiple hosts supported. "Deploy to staging" just works.

## Server layout

```
/usr/local/bin/<name>                 # binary
/var/lib/<name>/data/                 # persistent data (SQLite lives here)
/var/lib/<name>/backups/              # SQLite backups before each deploy
/var/www/<name>/                      # static site files
/etc/systemd/system/<name>.service    # systemd unit
/etc/caddy/sites-enabled/<name>.caddy # Caddy config
/etc/ship/env/<name>.env              # env vars
/etc/ship/ports/<name>                # allocated port
```

## Requirements

- Ubuntu 20.04+ or Debian 11+
- SSH access
- Claude Code

## License

MIT