Ein reiner Docker-Host hat kein Node installiert. Die Anleitung verlangte trotzdem "node scripts/setup.mjs", und update.sh las die Versionsnummer mit "node -p" - beides waere dort gescheitert. scripts/setup.sh macht dasselbe wie die .mjs-Fassung in reinem POSIX-Shell: .env aus der Vorlage anlegen, ein APP_SECRET wuerfeln (openssl, sonst /dev/urandom) und die Rechte auf 600 setzen. Ersetzt wird zeilenweise statt mit einem sed-Ausdruck, weil base64 Schraegstriche enthaelt. update.sh liest die Version jetzt selbst aus der package.json. Dabei fielen zwei Fehler auf, die mein eigener Rat verursacht hat. Die Anleitung empfiehlt APP_PORT="127.0.0.1:3000", damit die Anwendung nur hinter dem Reverse Proxy erreichbar ist - die Gesundheitspruefung baute daraus aber "http://127.0.0.1:127.0.0.1:3000". Und curl ist auf einem Docker-Host nicht garantiert. Gefragt wird deshalb jetzt der Container selbst ueber seinen HEALTHCHECK; curl liefert nur noch die Antwort zum Anzeigen, wenn es da ist. Am Ende nannte das Skript den Sicherungspfad mit Anfuehrungszeichen - so liess er sich nicht kopieren. Nachgewiesen: dreimal gegen die laufende Instanz durchgelaufen, jedes Mal mit Sicherung, Bau, Neustart und gesunder Antwort. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
#!/bin/sh
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# Legt die .env an und wuerfelt ein APP_SECRET.
|
||||
#
|
||||
# Dasselbe wie scripts/setup.mjs, aber ohne Node: auf einem reinen
|
||||
# Docker-Host ist keins installiert, und nur zum Erzeugen einer Textdatei
|
||||
# eines zu verlangen waere albern. Braucht nichts ausser einer POSIX-Shell.
|
||||
#
|
||||
# Aufruf: ./scripts/setup.sh
|
||||
# ./scripts/setup.sh --force (vorhandene .env ueberschreiben)
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
set -eu
|
||||
|
||||
root="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
env_datei="$root/.env"
|
||||
vorlage="$root/.env.example"
|
||||
force=0
|
||||
|
||||
[ "${1:-}" = "--force" ] && force=1
|
||||
|
||||
if [ -t 1 ]; then
|
||||
gruen=$'\033[32m'; gelb=$'\033[33m'; cyan=$'\033[36m'; dim=$'\033[2m'; aus=$'\033[0m'
|
||||
else
|
||||
gruen=""; gelb=""; cyan=""; dim=""; aus=""
|
||||
fi
|
||||
|
||||
[ -f "$vorlage" ] || { echo "${gelb}.env.example nicht gefunden – abgebrochen.${aus}" >&2; exit 1; }
|
||||
|
||||
# ── Zufall ───────────────────────────────────────────────────
|
||||
# openssl ist auf den meisten Systemen da, aber nicht auf allen. /dev/urandom
|
||||
# gibt es ueberall, wo diese Shell laeuft – und base64 ebenso.
|
||||
zufall() {
|
||||
if command -v openssl >/dev/null 2>&1; then
|
||||
openssl rand -base64 32
|
||||
else
|
||||
head -c 32 /dev/urandom | base64
|
||||
fi | tr -d '\n'
|
||||
}
|
||||
|
||||
if [ -f "$env_datei" ] && [ "$force" -eq 0 ]; then
|
||||
echo "${gelb}·${aus} .env existiert bereits – sie wird nicht ueberschrieben."
|
||||
echo " ${dim}Mit --force neu anlegen (die alte wird gesichert).${aus}"
|
||||
else
|
||||
if [ -f "$env_datei" ]; then
|
||||
sicherung="$env_datei.$(date +%Y%m%d%H%M%S).bak"
|
||||
cp "$env_datei" "$sicherung"
|
||||
echo "${gelb}·${aus} Alte .env gesichert: $(basename "$sicherung")"
|
||||
fi
|
||||
|
||||
secret="$(zufall)"
|
||||
# Das Geheimnis kann / und + enthalten; als sed-Ersetzung waeren das
|
||||
# Sonderzeichen. Deshalb zeilenweise ersetzen statt mit einem Ausdruck.
|
||||
: > "$env_datei"
|
||||
while IFS= read -r zeile || [ -n "$zeile" ]; do
|
||||
case "$zeile" in
|
||||
APP_SECRET=*) printf 'APP_SECRET="%s"\n' "$secret" >> "$env_datei" ;;
|
||||
*) printf '%s\n' "$zeile" >> "$env_datei" ;;
|
||||
esac
|
||||
done < "$vorlage"
|
||||
|
||||
chmod 600 "$env_datei"
|
||||
echo "${gruen}✓${aus} .env angelegt, APP_SECRET zufaellig erzeugt, Rechte auf 600."
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "${cyan}Noch anzupassen${aus}"
|
||||
echo "${dim}─────────────────────────────────────────────${aus}"
|
||||
echo " APP_URL die Adresse, unter der du Nebula aufrufst"
|
||||
echo " ${dim}bestimmt die WebAuthn-rpID – passt sie nicht, scheitern Passkeys${aus}"
|
||||
echo " POSTGRES_PASSWORD die Voreinstellung ist fuer Entwicklung gedacht"
|
||||
echo " APP_PORT auf einem Server: 127.0.0.1:3000 hinter den Reverse Proxy"
|
||||
echo
|
||||
echo "${cyan}Danach${aus}"
|
||||
echo "${dim}─────────────────────────────────────────────${aus}"
|
||||
echo " docker compose --profile full up -d --build"
|
||||
echo " ${dim}Der Container spielt die Migrationen beim Start selbst ein.${aus}"
|
||||
echo
|
||||
echo " Ausfuehrlich: DEPLOYMENT.md"
|
||||
echo
|
||||
Reference in New Issue
Block a user