130 lines
5.3 KiB
Markdown
130 lines
5.3 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."
|
||
|
||
## Dateien hochladen (SFTP zu `/shared`)
|
||
|
||
Für große Dateien vom eigenen Rechner (Videos, Hörproben) gibt es einen
|
||
reinen SFTP-Zugang: nur Dateien, keine Shell, kein Docker, eingesperrt auf
|
||
`/shared`. Er startet im Eingangsordner `/shared/youtube/upload`.
|
||
|
||
**Einrichten (Pascal, einmalig je Person):** Die Person erzeugt einen
|
||
Schlüssel (siehe `ONBOARDING_LARA.md`, Abschnitt 9) und schickt den
|
||
**öffentlichen** Teil (`.pub`). Dann auf dem Server:
|
||
```
|
||
scp claude-remote/sftp-upload.sh <server>:~/claude-stack/ # oder nach dem Kopieren von claude-remote/
|
||
ssh <server>
|
||
sudo bash ~/claude-stack/sftp-upload.sh "ssh-ed25519 AAAA… lara"
|
||
```
|
||
Das Skript legt den Nutzer `lara-upload` an (Gruppe wie die Container, damit
|
||
hochgeladene Dateien dort beschreibbar sind), hängt das Volume
|
||
`claude_shared` unter `/srv/sftp/lara-upload/shared` ein (Eintrag in
|
||
`/etc/fstab`) und schreibt `/etc/ssh/sshd_config.d/sftp-lara-upload.conf`.
|
||
Es prüft die sshd-Konfiguration vor dem Neuladen. Port 22 wie bei deinem
|
||
SSH-Zugang.
|
||
|
||
**Schlüssel tauschen:** Skript mit dem neuen Schlüssel erneut ausführen.
|
||
**Entfernen:** `/etc/ssh/sshd_config.d/sftp-lara-upload.conf` löschen,
|
||
`systemctl reload ssh`, Zeile in `/etc/fstab` entfernen,
|
||
`umount /srv/sftp/lara-upload/shared`, `userdel lara-upload`.
|
||
|
||
## 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.
|