124 lines
4.8 KiB
Markdown
124 lines
4.8 KiB
Markdown
# DEPLOYMENT_CLAUDE.md – Claude-Remote-Server auf dem VPS
|
||
|
||
Auf dem VPS laufen für Pascal und Lara je ein Claude-Code-Container im
|
||
Remote-Control-Server-Modus. Sitzungen startet ihr über
|
||
[claude.ai/code](https://claude.ai/code) oder die Claude-App (auch vom
|
||
Tablet). Die Sitzungen von Pascal und Lara reden über ein gemeinsames
|
||
MCP-Postfach miteinander.
|
||
|
||
Quellcode: Ordner `claude-remote/` in diesem Repo. Auf dem Server liegt eine
|
||
Kopie unter `~/claude-stack` (Compose-Projekt `claude`).
|
||
|
||
## Aufbau
|
||
|
||
| Container | Aufgabe |
|
||
| --- | --- |
|
||
| `claude-pascal` | Claude Code mit Pascals Login, je ein Remote-Control-Server für `larpaso` und `youtube` |
|
||
| `claude-lara` | dasselbe mit Laras Login |
|
||
| `claude-postfach-1` | MCP-Postfach (Nachrichten zwischen den beiden) |
|
||
|
||
- Eigenes Docker-Netz `claude_claude`. **Kein** Zugang zum Netz `web`, keine
|
||
Host-Ports, kein Caddy-Eintrag, **kein Docker-Socket**. Remote Control
|
||
baut nur ausgehende Verbindungen zu Anthropic auf.
|
||
- Projekte im Container: `~/projekte/larpaso`, `~/projekte/youtube`.
|
||
Neue Sitzungen bekommen je einen eigenen Git-Worktree (`--spawn worktree`).
|
||
- `/shared` ist ein gemeinsamer Ordner beider Container für große Dateien
|
||
(Videos, Audio).
|
||
- Limits: je Claude-Container 1,5 CPU / 2,5 GB RAM, Postfach 128 MB.
|
||
- Deployment der Website bleibt bei Pascal per SSH. Die Claude-Container
|
||
können nichts deployen.
|
||
|
||
## Einmalige Einrichtung (noch offen)
|
||
|
||
### 1. Repo `youtube` in Forgejo anlegen (Pascal)
|
||
Forgejo → Neues Repository → Besitzer `pascal`, Name `youtube`, **leer**
|
||
(keine README, keine .gitignore). Lara bei Bedarf als Mitarbeiterin
|
||
eintragen.
|
||
|
||
Danach die vorbereitete Grundstruktur pushen (Claude erledigt das auf
|
||
Zuruf).
|
||
|
||
### 2. SSH-Keys der Container in Forgejo eintragen
|
||
Die Keys stehen im Log der Container:
|
||
```
|
||
docker logs claude-pascal 2>&1 | grep -A1 "Forgejo-SSH-Key"
|
||
docker logs claude-lara 2>&1 | grep -A1 "Forgejo-SSH-Key"
|
||
```
|
||
- Pascals Key → in Pascals Forgejo-Profil (Einstellungen → SSH-Schlüssel).
|
||
- Laras Key → in Laras Forgejo-Profil.
|
||
|
||
Der Container klont die Repos danach von selbst (Versuch jede Minute).
|
||
|
||
### 3. Claude-Login und Freigaben (jede Person für ihren Container)
|
||
Per SSH auf den Server, dann:
|
||
```
|
||
docker exec -it claude-pascal claude
|
||
```
|
||
(Lara: `claude-lara`.) Dort `/login` ausführen, den angezeigten Link im
|
||
Browser öffnen, **mit dem eigenen Claude-Account** anmelden, Code
|
||
zurückkopieren. Mit `/exit` beenden.
|
||
|
||
Danach einmalig die Rückfragen von Remote Control beantworten:
|
||
```
|
||
docker exec -it claude-pascal tmux attach -t larpaso
|
||
```
|
||
- `Trust …? [y/N]` → `y`
|
||
- `Enable Remote Control? (y/n)` → `y`
|
||
- ggf. Spawn-Modus → `2` (worktree)
|
||
|
||
Mit **Strg+b, dann d** lösen (nicht Strg+C, das beendet den Server). Dasselbe
|
||
für `-t youtube`.
|
||
|
||
Lara hat keinen SSH-Zugang – den Login-Schritt für sie macht Pascal per
|
||
`docker exec` und schickt Lara den Login-Link. Sie meldet sich an und gibt
|
||
ihm den Code zurück.
|
||
|
||
### 4. Testen
|
||
claude.ai/code bzw. Claude-App öffnen → die Umgebungen `larpaso` und
|
||
`youtube` auf `claude-pascal` erscheinen → neue Sitzung starten.
|
||
|
||
## Postfach
|
||
|
||
MCP-Server `postfach` mit den Tools `send_message`, `read_messages` und
|
||
`list_messages`. Ungelesene Nachrichten meldet ein Hook automatisch beim
|
||
Start einer Sitzung und bei jedem Prompt. Die Nachrichten liegen im Volume
|
||
`claude_postfach-data` (`messages.json`).
|
||
|
||
Ihr könnt Claude auch direkt bitten, z. B.: „Schreib Lara ins Postfach,
|
||
dass die Startseite überarbeitet ist."
|
||
|
||
## Gemeinsamer Ordner auf dem Host (`/srv/shared`)
|
||
|
||
Das Volume `claude_shared` (in den Containern `/shared`) ist auf dem Host
|
||
unter `/srv/shared` eingehängt, damit Pascal und Lara per `scp` ohne `sudo`
|
||
Dateien hochladen und holen können (Anleitung: `ONBOARDING_LARA.md`,
|
||
Abschnitt 9). Ordner darin sind gruppen-schreibbar mit gesetztem
|
||
Gruppen-Bit (Gruppe gid 1000 = Container-Nutzer `node`).
|
||
|
||
Einmalig einrichten:
|
||
```
|
||
sudo mkdir -p /srv/shared
|
||
echo '/var/lib/docker/volumes/claude_shared/_data /srv/shared none bind 0 0' | sudo tee -a /etc/fstab
|
||
sudo systemctl daemon-reload
|
||
sudo mount /srv/shared
|
||
# daemon-reload
|
||
```
|
||
Hochgeladen wird als `deploy` (uid/gid 1000, also schon in der richtigen
|
||
Gruppe). Ein anderer Nutzer bräuchte
|
||
`sudo usermod -aG deploy <user>` und eine neue Anmeldung.
|
||
|
||
## Betrieb
|
||
|
||
```
|
||
cd ~/claude-stack
|
||
docker compose -p claude ps # Status
|
||
docker compose -p claude logs -f claude-pascal # Logs
|
||
docker compose -p claude restart claude-lara # Neustart
|
||
docker compose -p claude build --pull && docker compose -p claude up -d # Claude Code aktualisieren
|
||
```
|
||
Nach Änderungen an `claude-remote/` im Repo den Ordner nach `~/claude-stack`
|
||
kopieren und neu bauen. Logins, SSH-Keys und Projekte bleiben erhalten (sie
|
||
liegen in den Volumes `claude_home-pascal` / `claude_home-lara`).
|
||
|
||
**Nicht** `docker compose -p claude down -v` – das löscht die Volumes mit
|
||
Logins, Keys, nicht gepushter Arbeit und dem Postfach.
|