Statische Oberfläche vor Aether und InkNote: kein Backend, kein Build, nginx liefert web/ aus. Jede App bleibt ihre eigene PWA auf ihrer eigenen Domain – HoneyOS ist Startpunkt und Umschalter, kein iframe-Rahmen. - zwei Betriebsarten aus einem Datenstand: Terminal (Kacheln, Tastatur) und Desktop (Symbole, verschiebbare Fenster, Taskleiste) - honeybar.js als Drop-in für die Apps, rendert im Shadow DOM, damit Tailwind und die InkNote-Palette einander nicht in die Quere kommen - Konfiguration vollständig aus der .env: das Skript in /docker-entrypoint.d/ schreibt config.json beim Containerstart - optionaler _ME-Pfad pro App zeigt an, wer angemeldet ist; ohne CORS bleibt die Anzeige leer, ohne dass etwas kaputtgeht Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
80 lines
2.5 KiB
Bash
Executable File
80 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# Schreibt config.json aus den Umgebungsvariablen — läuft vor nginx.
|
|
#
|
|
# Das nginx-Image führt alles in /docker-entrypoint.d/ beim Start aus. Damit
|
|
# braucht HoneyOS keinen eigenen Entrypoint und kein Backend: die Konfiguration
|
|
# entsteht einmal beim Hochfahren, danach ist es wieder reines Ausliefern.
|
|
#
|
|
# Ohne HONEYOS_APP_1_URL bleibt die eingebackene config.json unangetastet —
|
|
# ein `docker run` ohne .env zeigt also weiter die Standard-Apps.
|
|
set -eu
|
|
|
|
TARGET=/usr/share/nginx/html/config.json
|
|
MAX_APPS=12
|
|
|
|
# Wert einer Variablen holen, deren Name erst zur Laufzeit feststeht.
|
|
get() { eval "printf '%s' \"\${$1:-}\""; }
|
|
|
|
# Für JSON entschärfen: Backslash und Anführungszeichen. Zeilenumbrüche haben
|
|
# in diesen Feldern nichts zu suchen und fliegen raus.
|
|
esc() { printf '%s' "$1" | tr -d '\n\r' | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'; }
|
|
|
|
# Ein Feld nur schreiben, wenn es gesetzt ist — leere Schlüssel wären Lärm.
|
|
field() {
|
|
[ -n "$2" ] || return 0
|
|
printf ',"%s":"%s"' "$1" "$(esc "$2")"
|
|
}
|
|
|
|
if [ -z "$(get HONEYOS_APP_1_URL)" ]; then
|
|
echo "honeyos: keine HONEYOS_APP_*-Variablen gesetzt — eingebackene config.json bleibt"
|
|
exit 0
|
|
fi
|
|
|
|
if [ ! -w "$(dirname "$TARGET")" ]; then
|
|
echo "honeyos: $(dirname "$TARGET") ist nicht beschreibbar (read-only mount?) — config.json bleibt wie sie ist"
|
|
exit 0
|
|
fi
|
|
|
|
tmp="${TARGET}.tmp"
|
|
{
|
|
printf '{'
|
|
printf '"user":"%s"' "$(esc "$(get HONEYOS_USER)")"
|
|
printf ',"hostname":"%s"' "$(esc "${HONEYOS_HOSTNAME:-honeyos}")"
|
|
printf ',"version":"%s"' "$(esc "${HONEYOS_VERSION:-0.1}")"
|
|
printf ',"apps":['
|
|
|
|
n=1
|
|
first=1
|
|
while [ "$n" -le "$MAX_APPS" ]; do
|
|
url=$(get "HONEYOS_APP_${n}_URL")
|
|
if [ -z "$url" ]; then
|
|
n=$((n + 1))
|
|
continue
|
|
fi
|
|
|
|
id=$(get "HONEYOS_APP_${n}_ID")
|
|
[ -n "$id" ] || id="app${n}"
|
|
name=$(get "HONEYOS_APP_${n}_NAME")
|
|
[ -n "$name" ] || name=$(printf '%s' "$id" | tr '[:lower:]' '[:upper:]')
|
|
|
|
[ "$first" -eq 1 ] || printf ','
|
|
first=0
|
|
|
|
printf '{"id":"%s","name":"%s","url":"%s"' "$(esc "$id")" "$(esc "$name")" "$(esc "$url")"
|
|
field subtitle "$(get "HONEYOS_APP_${n}_SUBTITLE")"
|
|
field glyph "$(get "HONEYOS_APP_${n}_GLYPH")"
|
|
field key "$(get "HONEYOS_APP_${n}_KEY")"
|
|
field me "$(get "HONEYOS_APP_${n}_ME")"
|
|
field tokenKey "$(get "HONEYOS_APP_${n}_TOKEN_KEY")"
|
|
printf '}'
|
|
|
|
n=$((n + 1))
|
|
done
|
|
|
|
printf ']}'
|
|
} > "$tmp"
|
|
|
|
mv "$tmp" "$TARGET"
|
|
count=$(tr -cd '{' < "$TARGET" | wc -c)
|
|
echo "honeyos: config.json geschrieben ($((count - 1)) App(s))"
|