Add sync/publish scripts for content changes made via Claude Code

Lets content edits pushed through Git reach the live admin-content
volume (and vice versa) without silently overwriting whatever was
changed through the admin editor UI in the meantime.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Pascal Scholz 2026-09-24 22:49:01 +02:00
parent a920880a20
commit f75296da44
3 changed files with 79 additions and 0 deletions

View file

@ -240,6 +240,43 @@ cd ~/stack && docker compose build admin && docker compose up -d admin
`content/site.json`, `content/theme.json` und hochgeladene Bilder bleiben unangetastet `content/site.json`, `content/theme.json` und hochgeladene Bilder bleiben unangetastet
(liegen auf eigenen Volumes, nicht im Image). (liegen auf eigenen Volumes, nicht im Image).
## Content-Updates über Git/Claude Code, ohne den Editor zu überschreiben
Seit es den Editor gibt, liegt der **echte Live-Inhalt** (`content/site.json`,
`content/theme.json`) auf eigenen Volumes auf dem Server, nicht mehr im
Git-Image – ein einfaches `git pull` + `docker compose build website`
ändert an den Live-Inhalten deshalb **nichts** mehr (das Seed-Skript befüllt
die Volumes nur einmalig, wenn sie leer sind).
Damit Claude Code trotzdem Content-Änderungen pushen kann, ohne Änderungen
zu überschreiben, die zwischenzeitlich über den Editor gemacht wurden, gibt
es zwei Skripte im Repo (auf dem Server, aus `~/stack` ausführen):
1. **Vor** einer Content-Änderung durch Claude Code: aktuellen Live-Stand
nach Git holen (nur nötig, falls seit dem letzten Mal über den Editor was
geändert wurde – bei keiner Änderung passiert nichts):
```bash
cd ~/stack
~/sites/larpaso-website/sync-content-from-live.sh
```
2. Im Chat mit Claude Code die gewünschte Änderung beschreiben – Claude
Code ändert `content/site.json`/`theme.json` lokal auf Basis des gerade
synchronisierten Stands, testet den Build und pusht nach `main`.
3. **Nach** dem Push: Git-Stand auf den Server holen und live veröffentlichen
(baut über denselben Weg wie „Speichern & veröffentlichen" im Editor,
ohne den `website`- oder `admin`-Dienst neu zu bauen):
```bash
cd ~/sites/larpaso-website && git pull
cd ~/stack
./sync-content-from-live.sh # kann man sich sparen, falls Schritt 1 schon frisch war
~/sites/larpaso-website/publish-content-to-live.sh
```
**Wichtig:** Das gilt nur für `content/site.json`/`theme.json` (Texte,
Bilder-Referenzen, Design-Werte). Änderungen am Code selbst (`admin/`,
`src/`) laufen weiterhin über den normalen Weg (`docker compose build
website`/`admin` + `up -d`, siehe oben).
## Bekannte Grenzen ## Bekannte Grenzen
- Mehrere feste Logins möglich (`ADMIN_USERNAME`/`ADMIN_PASSWORD_HASH`, `_2`, `_3`, ...), - Mehrere feste Logins möglich (`ADMIN_USERNAME`/`ADMIN_PASSWORD_HASH`, `_2`, `_3`, ...),

View file

@ -0,0 +1,20 @@
#!/bin/bash
# Spielt content/site.json + theme.json aus dem (frisch gepullten) Git-Stand
# zurück ins Admin-Volume und stößt denselben Build/Publish an, den auch der
# "Speichern & veröffentlichen"-Knopf im Editor auslöst. Auf dem Server
# ausführen, aus ~/stack, NACHDEM in ~/sites/larpaso-website ein
# `git pull` gemacht wurde:
# ./publish-content-to-live.sh ~/sites/larpaso-website
set -euo pipefail
REPO="${1:-$HOME/sites/larpaso-website}"
docker compose cp "$REPO/content/site.json" admin:/app/content/site.json
docker compose cp "$REPO/content/theme.json" admin:/app/content/theme.json
docker compose exec admin node -e "
require('/app/admin/lib/build.js').runBuild().then((r) => {
console.log(r.ok ? 'Veröffentlicht.' : ('Fehler: ' + r.error));
process.exit(r.ok ? 0 : 1);
});
"

22
sync-content-from-live.sh Normal file
View file

@ -0,0 +1,22 @@
#!/bin/bash
# Holt den aktuellen Live-Content (vom Admin-Editor bearbeitet) aus dem
# Server-Volume zurück nach Git, bevor Claude Code eine Content-Änderung
# macht. So geht nichts verloren, was seit dem letzten Sync über den
# Editor geändert wurde. Auf dem Server ausführen, aus ~/stack:
# ./sync-content-from-live.sh ~/sites/larpaso-website
set -euo pipefail
REPO="${1:-$HOME/sites/larpaso-website}"
docker compose cp admin:/app/content/site.json "$REPO/content/site.json"
docker compose cp admin:/app/content/theme.json "$REPO/content/theme.json"
cd "$REPO"
if git diff --quiet -- content/site.json content/theme.json; then
echo "Keine Änderungen – Git hat bereits den aktuellen Live-Stand."
else
git add content/site.json content/theme.json
git commit -m "Sync live content from admin panel"
git push
echo "Live-Inhalte wurden nach Git übernommen und gepusht."
fi