From f75296da44b313dbedd3305b6687ac3457501638 Mon Sep 17 00:00:00 2001
From: Pascal Scholz
Date: Thu, 24 Sep 2026 22:49:01 +0200
Subject: [PATCH] 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
---
DEPLOYMENT_ADMIN.md | 37 +++++++++++++++++++++++++++++++++++++
publish-content-to-live.sh | 20 ++++++++++++++++++++
sync-content-from-live.sh | 22 ++++++++++++++++++++++
3 files changed, 79 insertions(+)
create mode 100644 publish-content-to-live.sh
create mode 100644 sync-content-from-live.sh
diff --git a/DEPLOYMENT_ADMIN.md b/DEPLOYMENT_ADMIN.md
index 6035411..b60dbb6 100644
--- a/DEPLOYMENT_ADMIN.md
+++ b/DEPLOYMENT_ADMIN.md
@@ -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
(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
- Mehrere feste Logins möglich (`ADMIN_USERNAME`/`ADMIN_PASSWORD_HASH`, `_2`, `_3`, ...),
diff --git a/publish-content-to-live.sh b/publish-content-to-live.sh
new file mode 100644
index 0000000..28773c8
--- /dev/null
+++ b/publish-content-to-live.sh
@@ -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);
+});
+"
diff --git a/sync-content-from-live.sh b/sync-content-from-live.sh
new file mode 100644
index 0000000..f26a523
--- /dev/null
+++ b/sync-content-from-live.sh
@@ -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