aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 27ed219dcbd71655eb57a239451500258ba3bc44 (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
100
101
102
103
104
105
106
# Ship

Deploy Go binaries and static sites to a VPS with automatic HTTPS. No agent on the server — just SSH, systemd, and Caddy.

## How it works

Ship is a set of Claude skills. Instead of a rigid CLI that bakes in assumptions, Claude reasons about what to do using a family of narrow, composable skills. The server is the source of truth — no local state file that can go stale.

## Skills

| Skill | What it does |
|-------|-------------|
| `/ship-setup` | One-time VPS config. Installs Caddy, creates directories, saves host to `~/.config/ship/config.json` |
| `/ship-status` | Show all running apps, ports, domains, and disk usage — derived live from server |
| `/ship-deploy` | Deploy a binary or static site — orchestrates the skills below |
| `/ship-binary` | Upload a pre-built binary, configure systemd + Caddy, back up SQLite |
| `/ship-static` | Rsync a dist folder, configure Caddy to serve it |
| `/ship-env` | Read/write env vars with merge semantics — never wipes existing vars |
| `/ship-caddy` | Manage per-app Caddyfile — validates before reloading |
| `/ship-service` | systemd control: start, stop, restart, logs |

## Install

Copy the `skills/` directory into `~/.claude/skills/`:

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

## Quick start

### 1. Set up your VPS

```
/ship-setup
```

Claude asks for SSH host, domain, and nickname. Saves to `~/.config/ship/config.json`. Installs Caddy on the server.

Or run the script directly:

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

### 2. Deploy

```
/ship-deploy
```

Claude asks what you're deploying (binary or static site), where it is, what to call it, and any env vars. Handles the rest.

### 3. Check status

```
/ship-status
```

Shows all running apps, ports, URLs, and disk usage — no local state file, reads directly from server.

## Config

`~/.config/ship/config.json` — created by `/ship-setup`. Supports multiple hosts:

```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"
    }
  }
}
```

Deploy to a specific host: "deploy foodtracker to staging"

## Server layout

```
/usr/local/bin/<name>                    # binary
/var/lib/<name>/                         # work directory
/var/lib/<name>/data/                    # persistent data (SQLite lives here)
/var/lib/<name>/backups/                 # SQLite backups (made before each binary swap)
/var/www/<name>/                         # static site files
/etc/systemd/system/<name>.service       # systemd unit
/etc/caddy/sites-enabled/<name>.caddy    # per-app Caddy config
/etc/ship/env/<name>.env                 # environment variables
/etc/ship/ports/<name>                   # allocated port number
```

## Requirements

- VPS running Ubuntu 20.04+ or Debian 11+
- SSH access
- Claude Code with skills support

## License

MIT