refactor(install): erst ALLES pruefen, dann erst aendern
Ampel / ampel (push) Successful in 28s

Commander-Einwand: "Warum macht das install script den pre-check nicht selbst
vor der Installation?" Zu Recht - es tat es nur halb.

VORHER war Pruefen und Aendern verschraenkt:
  1 Voraussetzungen  pruefen (bricht ab)
  2 Laufwerk         pruefen (warnt)
  3 Verzeichnisse    AENDERT
  4 Mount            AENDERT
  5 .env             AENDERT
  6 Bauen            AENDERT

Nur die harten Voraussetzungen liefen vorab. Verzeichnisse wurden angelegt,
bevor klar war, ob der Rest durchlaeuft - scheiterte etwas in der Mitte, blieb
ein halb eingerichteter Rechner zurueck. Und --nur-pruefen war als if-Zweig
durch FUENF Schritte gefaedelt: so etwas laeuft zwangslaeufig aus dem Ruder,
weil jede neue Aktion daran denken muesste.

JETZT zwei klar getrennte Phasen:

  Phase 1  PRUEFEN     - fuenf Pruefungen, aendert NICHTS
  Weiche               - Probleme -> Abbruch mit Liste, nichts angefasst
  Phase 2  EINRICHTEN  - Verzeichnisse, Mount, .env, bauen, starten

Es gibt damit GENAU EINEN Pruef-Pfad, den beide Modi benutzen: --nur-pruefen
heisst schlicht "nach Phase 1 aufhoeren". Die Pruefung kann nicht mehr etwas
anderes behaupten als die Installation tut.

Die Weiche unterscheidet PROBLEME (verhindern die Installation) von HINWEISEN
(halten nicht auf) und fasst am Ende beides als Liste zusammen - vorher musste
man die Ausgabe rueckwaerts lesen, um zu wissen, ob es gereicht hat.

Neu mitgeprueft, weil es jetzt an einer Stelle passt:
- Ist der Elternpfad der Verzeichnisse ueberhaupt beschreibbar? (Vorher waere
  das erst beim mkdir aufgefallen - mitten in der Aenderungsphase.)
- Freier Plattenplatz mit Schwelle 60 GB, samt Hinweis auf die Groessen
  (Blu-ray roh ~40 GB, 4K-UHD bis 100 GB).
- Ist ueberhaupt .env.example da, also stehen wir im Rippy-Repo?
- Was in die .env geschrieben WUERDE, steht jetzt in Phase 1 als Ansage.

Auf der VM gegengeprueft: aus /tmp gestartet meldet es korrekt "kein
Rippy-Repo" und bricht ab, ohne etwas anzufassen; aus dem Repo heraus laeuft
die Pruefung sauber durch ("Alles in Ordnung, keine Einschraenkungen").

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-25 22:42:31 +02:00
parent 35cfcbcb07
commit b0205c42c9
+214 -119
View File
@@ -2,19 +2,30 @@
#
# Rippy einrichten — ein Befehl, keine Handarbeit.
#
# Das Skript nimmt genau die Schritte ab, an denen man vorher scheitern konnte:
# * Laufwerk finden (BEIDE Geräteknoten — der sg-Knoten ist je Host anders,
# und ein fest eingetragener Standard ist damit auf fremden Hosts falsch)
# * Ablage- und MakeMKV-Verzeichnis anlegen
# * shared-Mount-Propagation herstellen, falls Docker sie verlangt
# * .env anlegen bzw. fehlende Werte ergänzen, ohne Bestehendes zu überschreiben
# * bauen und starten
# ## Aufbau: erst ALLES prüfen, dann erst ändern
#
# Es ist absichtlich WIEDERHOLBAR: mehrfach ausführen ändert nichts kaputt.
# Es ändert NIE einen Wert, der schon in der .env steht.
# Das Skript läuft in zwei klar getrennten Phasen:
#
# Phase 1 PRÜFEN — sieht sich alles an und ändert NICHTS.
# (Weiche) — harte Mängel → Abbruch mit Liste, nichts angefasst.
# Phase 2 EINRICHTEN — Verzeichnisse, Mount, .env, bauen, starten.
#
# Warum das wichtig ist (Commander-Einwand 25.07.2026): Die erste Fassung
# prüfte und änderte abwechselnd — Verzeichnisse wurden angelegt, bevor
# überhaupt klar war, ob der Rest durchläuft. Scheiterte etwas in der Mitte,
# blieb ein halb eingerichteter Rechner zurück. Und der Prüf-Modus war als
# `if`-Zweig durch fünf Schritte gefädelt; so etwas läuft mit der Zeit
# zwangsläufig aus dem Ruder, weil jede neue Aktion daran denken müsste.
#
# Jetzt gibt es GENAU EINEN Prüf-Pfad, den beide Modi benutzen. `--nur-pruefen`
# heißt schlicht: nach Phase 1 aufhören. Damit kann die Prüfung nicht mehr etwas
# anderes behaupten als die Installation tut.
#
# Es ist absichtlich WIEDERHOLBAR: mehrfach ausführen ändert nichts kaputt, und
# es ändert NIE einen Wert, der schon in der .env steht.
#
# Aufruf: sudo ./install.sh
# sudo ./install.sh --nur-pruefen (nichts anfassen, nur berichten)
# ./install.sh --nur-pruefen (nichts anfassen, nur berichten)
set -u
@@ -23,77 +34,80 @@ NUR_PRUEFEN=0
MEDIA_DIR="${RIPPY_MEDIA_DIR:-/srv/rippy/media}"
MAKEMKV_DIR="${RIPPY_MAKEMKV_DIR:-/srv/rippy/makemkv}"
FEHLER=0
rot() { printf '\033[31m%s\033[0m\n' "$*"; }
gruen() { printf '\033[32m%s\033[0m\n' "$*"; }
gelb() { printf '\033[33m%s\033[0m\n' "$*"; }
titel() { printf '\n\033[1m%s\033[0m\n' "$*"; }
# Befunde der Prüfphase. PROBLEME verhindern die Installation, HINWEISE nicht.
PROBLEME=""
HINWEISE=""
problem() { PROBLEME="${PROBLEME}$1"$'\n'; rot " X $1"; }
hinweis() { HINWEISE="${HINWEISE}$1"$'\n'; gelb " ! $1"; }
ok() { gruen " OK $1"; }
cd "$(dirname "$0")" || exit 1
echo "======================================================================"
echo " Rippy — Einrichtung"
echo "======================================================================"
[ "$NUR_PRUEFEN" = 1 ] && gelb "Nur-Prüfen-Modus: es wird nichts geändert."
echo " Phase 1 von 2: prüfen. Es wird noch NICHTS geändert."
# ---------------------------------------------------------------------------
# 1. Voraussetzungen
# ---------------------------------------------------------------------------
titel "1/6 Voraussetzungen"
# ===========================================================================
# PHASE 1 — PRÜFEN. Ab hier bis zur Weiche wird nichts verändert.
# ===========================================================================
# --- 1. Betriebssystem und Docker ------------------------------------------
titel "Prüfung 1/5 Betriebssystem und Docker"
if [ "$(uname -s)" != "Linux" ]; then
rot " X Das hier ist kein Linux. Rippy braucht einen Linux-Host mit Docker."
problem "Kein Linux. Rippy braucht einen Linux-Host mit Docker."
rot " (Docker Desktop unter Windows/macOS kann keine optischen Laufwerke"
rot " durchreichen — deshalb geht es dort grundsätzlich nicht.)"
exit 1
else
ok "Linux erkannt ($(uname -r))"
fi
gruen " OK Linux erkannt ($(uname -r))"
if ! command -v docker >/dev/null 2>&1; then
rot " X Docker ist nicht installiert."
problem "Docker ist nicht installiert."
rot " Installation: curl -fsSL https://get.docker.com | sudo sh"
FEHLER=1
else
gruen " OK Docker gefunden ($(docker --version 2>/dev/null | head -1))"
ok "Docker gefunden ($(docker --version 2>/dev/null | head -1))"
fi
COMPOSE=""
if docker compose version >/dev/null 2>&1; then
COMPOSE="docker compose"
gruen " OK Compose-Plugin gefunden"
ok "Compose-Plugin gefunden"
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE="docker-compose"
gelb " ! Nur das alte docker-compose gefunden — funktioniert, ist aber veraltet."
hinweis "Nur das alte docker-compose gefunden — funktioniert, ist aber veraltet."
else
rot " X Docker Compose fehlt."
problem "Docker Compose fehlt."
rot " Installation (Debian/Ubuntu): sudo apt install docker-compose-plugin"
FEHLER=1
fi
if [ "$(id -u)" = "0" ]; then
gruen " OK Als root gestartet"
ok "Als root gestartet"
elif [ "$NUR_PRUEFEN" = 1 ]; then
# Der Prüf-Modus ändert nichts und darf deshalb NICHT an root scheitern —
# Die Prüfung ändert nichts und darf deshalb NICHT an root scheitern —
# sonst kann man vor der Installation nicht nachsehen, ob alles passt.
gelb " ! Ohne root — für die Prüfung in Ordnung. Die echte Installation"
gelb " braucht sudo (Verzeichnisse unter /srv, Mount-Propagation)."
ok "Ohne root — für die Prüfung völlig in Ordnung"
else
rot " X Bitte mit sudo starten: sudo ./install.sh"
problem "Bitte mit sudo starten: sudo ./install.sh"
rot " (Verzeichnisse unter /srv und die Mount-Propagation brauchen root.)"
rot " Nur nachsehen, ohne etwas zu ändern: ./install.sh --nur-pruefen"
FEHLER=1
fi
[ "$FEHLER" = 1 ] && { rot ""; rot "Abgebrochen — bitte das Fehlende nachholen."; exit 1; }
# ---------------------------------------------------------------------------
# 2. Laufwerk suchen
# ---------------------------------------------------------------------------
titel "2/6 Optisches Laufwerk"
# --- 2. Optisches Laufwerk -------------------------------------------------
titel "Prüfung 2/5 Optisches Laufwerk"
# MakeMKV spricht Laufwerke über die SCSI-Generic-Schicht an und braucht
# deshalb ZWEI Knoten: /dev/srN und den passenden /dev/sgM. Welche sg-Nummer
# dazugehört, ist je Host anders — deshalb wird sie hier über die
# SCSI-Adresse ermittelt statt geraten. Beide Knoten zeigen in /sys auf
# dasselbe Geräteverzeichnis (z. B. 3:0:0:0), das ist der Abgleich.
# dazugehört, ist je Host anders — deshalb wird sie hier über die SCSI-Adresse
# ermittelt statt geraten. Beide Knoten zeigen in /sys auf dasselbe
# Geräteverzeichnis (z. B. 3:0:0:0), das ist der Abgleich.
SR=""
SG=""
LAUFWERK=""
@@ -114,12 +128,12 @@ for srpfad in /sys/block/sr*; do
done
if [ -n "$SR" ]; then
gruen " OK Laufwerk gefunden: $(echo "$LAUFWERK" | tr -s ' ')"
ok "Laufwerk gefunden: $(echo "$LAUFWERK" | tr -s ' ')"
gruen " $SR + $SG (SCSI-Adresse abgeglichen, nicht geraten)"
else
gelb " ! Kein optisches Laufwerk gefunden."
gelb " Rippy lässt sich trotzdem installieren und kann dann als reine"
gelb " KOMPRIMIER-Maschine für andere Rippy-Instanzen dienen."
hinweis "Kein optisches Laufwerk gefunden — Rippy kann dann nur komprimieren."
gelb " Die Installation läuft trotzdem durch; diese Maschine dient dann"
gelb " als reine KOMPRIMIER-Maschine für andere Rippy-Instanzen."
gelb " Zum Rippen fehlt das Laufwerk. Häufigste Ursachen:"
gelb " - In einer VM: Laufwerk per USB-Passthrough durchreichen"
gelb " (Proxmox: qm set <vmid> -usb0 host=<hersteller>:<produkt>,usb3=1)"
@@ -128,26 +142,38 @@ else
gelb " - Auf echter Hardware: 'ls /dev/sr*' prüfen, Kabel/Strom."
fi
# ---------------------------------------------------------------------------
# 3. Verzeichnisse
# ---------------------------------------------------------------------------
titel "3/6 Verzeichnisse"
# --- 3. Verzeichnisse und Platz -------------------------------------------
titel "Prüfung 3/5 Verzeichnisse und Plattenplatz"
for d in "$MEDIA_DIR" "$MAKEMKV_DIR"; do
if [ -d "$d" ]; then
gruen " OK $d liegt schon da"
elif [ "$NUR_PRUEFEN" = 1 ]; then
gelb " ! $d fehlt (würde angelegt)"
ok "$d liegt schon da"
else
mkdir -p "$d" && gruen " OK $d angelegt"
# Anlegen können wir nur mit root — und ob der Elternpfad beschreibbar ist,
# entscheidet, ob es später klappt. Beides hier schon sagen.
eltern="$(dirname "$d")"
while [ -n "$eltern" ] && [ ! -d "$eltern" ]; do eltern="$(dirname "$eltern")"; done
if [ "$(id -u)" = "0" ] || [ -w "$eltern" ]; then
ok "$d fehlt noch — wird in Phase 2 angelegt"
else
problem "$d fehlt und $eltern ist nicht beschreibbar."
fi
fi
done
echo " Ablage: $MEDIA_DIR (hier landen die fertigen Filme)"
echo " MakeMKV-Daten: $MAKEMKV_DIR (Schlüsselspeicher, rebuild-fest)"
# ---------------------------------------------------------------------------
# 4. Mount-Propagation
# ---------------------------------------------------------------------------
titel "4/6 Mount-Propagation (für NAS-Freigaben aus dem UI)"
FREI_GB=$(df -BG --output=avail "$(dirname "$MEDIA_DIR")" 2>/dev/null | tail -1 | tr -dc '0-9')
if [ -n "${FREI_GB:-}" ]; then
if [ "$FREI_GB" -lt 60 ]; then
hinweis "Nur ${FREI_GB} GB frei. Eine Blu-ray braucht roh rund 40 GB, eine 4K-UHD bis 100 GB."
gelb " Rippy läuft trotzdem — lege die Ablage später besser auf eine"
gelb " NAS-Freigabe (Einstellungen → Speicherziele)."
else
ok "${FREI_GB} GB frei"
fi
fi
# --- 4. Mount-Propagation --------------------------------------------------
titel "Prüfung 4/5 Mount-Propagation (für NAS-Freigaben aus dem UI)"
# Rippy hängt NAS-Freigaben aus dem UI ein. Damit die auch in den anderen
# Containern sichtbar werden, muss der Ablage-Pfad ein 'shared' Mount sein.
@@ -156,15 +182,129 @@ propagation_ok() {
findmnt -no PROPAGATION --target "$MEDIA_DIR" 2>/dev/null | grep -q shared
}
PROPAGATION_NOETIG=0
if propagation_ok; then
gruen " OK $MEDIA_DIR ist bereits 'shared' — nichts zu tun"
elif [ "$NUR_PRUEFEN" = 1 ]; then
gelb " ! Propagation fehlt (würde eingerichtet)"
ok "$MEDIA_DIR ist bereits 'shared' — nichts zu tun"
elif [ ! -d "$MEDIA_DIR" ]; then
ok "wird nach dem Anlegen des Verzeichnisses geprüft und bei Bedarf gesetzt"
PROPAGATION_NOETIG=1
else
ok "Propagation fehlt — wird in Phase 2 eingerichtet"
PROPAGATION_NOETIG=1
fi
# --- 5. Konfiguration ------------------------------------------------------
titel "Prüfung 5/5 Konfiguration (.env)"
if [ ! -f .env ]; then
if [ -f .env.example ]; then
ok ".env fehlt — wird in Phase 2 aus .env.example erzeugt"
else
problem ".env.example fehlt. Ist das wirklich das Rippy-Repo?"
fi
else
ok ".env liegt schon da — bestehende Werte bleiben unangetastet"
fi
# Was in Phase 2 in die .env geschrieben würde — hier nur ANSAGEN.
wirksamer_wert() {
schluessel="$1"; standard="$2"
wert=$(grep -E "^${schluessel}=" .env 2>/dev/null | tail -1 | cut -d= -f2-)
[ -n "${wert:-}" ] && printf '%s' "$wert" || printf '%s' "$standard"
}
for paar in "OPTICAL_SR:$SR" "OPTICAL_SG:$SG" "MAKEMKV_DATA_HOST:$MAKEMKV_DIR"; do
schluessel="${paar%%:*}"; erkannt="${paar#*:}"
if grep -qE "^${schluessel}=.+" .env 2>/dev/null; then
echo " $schluessel steht schon in der .env — bleibt unverändert"
elif [ -n "$erkannt" ]; then
echo " $schluessel wird auf $erkannt gesetzt"
fi
done
# Gegenprobe: Zeigen die WIRKSAMEN Gerätepfade auf etwas, das es hier gibt?
# Fängt den Fall "'.env' von einem anderen Rechner kopiert" und Tippfehler ab —
# sonst startet Docker mit einem Pfad, den es nicht gibt, und die Meldung ist
# kryptisch.
for paar in "OPTICAL_SR:/dev/sr0" "OPTICAL_SG:/dev/sg1"; do
schluessel="${paar%%:*}"; standard="${paar##*:}"
# Nur prüfen, was auch wirklich gelten wird
if grep -qE "^${schluessel}=.+" .env 2>/dev/null; then
wirksam=$(wirksamer_wert "$schluessel" "$standard")
elif [ -n "$SR" ]; then
continue # wird gleich korrekt gesetzt
else
wirksam="$standard"
fi
if [ ! -e "$wirksam" ]; then
hinweis "$schluessel zeigt auf $wirksam — dieses Gerät gibt es hier NICHT."
if [ -n "$SR" ]; then
gelb " Gefunden wurde stattdessen: $SR + $SG"
gelb " Trage das in der .env ein (oder lösche die Zeile $schluessel=)."
fi
fi
done
echo " API-Keys (TMDB/OMDb) brauchst du hier NICHT einzutragen —"
echo " der Einrichtungs-Assistent im Browser fragt sie ab und prüft sie."
# ===========================================================================
# WEICHE — hier wird entschieden. Bis hierher wurde NICHTS verändert.
# ===========================================================================
titel "Ergebnis der Prüfung"
ANZ_PROBLEME=$(printf '%s' "$PROBLEME" | grep -c . || true)
ANZ_HINWEISE=$(printf '%s' "$HINWEISE" | grep -c . || true)
if [ "$ANZ_PROBLEME" -gt 0 ]; then
rot " $ANZ_PROBLEME Punkt(e) verhindern die Installation:"
printf '%s' "$PROBLEME" | grep . | while IFS= read -r z; do rot " - $z"; done
rot ""
rot " Es wurde NICHTS verändert. Bitte das Obige nachholen und erneut starten."
exit 1
fi
if [ "$ANZ_HINWEISE" -gt 0 ]; then
gelb " Alles Wichtige ist da. $ANZ_HINWEISE Hinweis(e), die dich nicht aufhalten:"
printf '%s' "$HINWEISE" | grep . | while IFS= read -r z; do gelb " - $z"; done
else
gruen " Alles in Ordnung, keine Einschränkungen."
fi
if [ "$NUR_PRUEFEN" = 1 ]; then
echo ""
gruen "Prüfung fertig — es wurde nichts verändert."
echo "Zum Installieren: sudo ./install.sh"
exit 0
fi
# ===========================================================================
# PHASE 2 — EINRICHTEN. Erst ab hier wird etwas verändert.
# ===========================================================================
echo ""
echo "======================================================================"
echo " Phase 2 von 2: einrichten"
echo "======================================================================"
titel "Schritt 1/4 Verzeichnisse anlegen"
for d in "$MEDIA_DIR" "$MAKEMKV_DIR"; do
if [ -d "$d" ]; then
ok "$d war schon da"
else
mkdir -p "$d" && ok "$d angelegt"
fi
done
echo " Ablage: $MEDIA_DIR (hier landen die fertigen Filme)"
echo " MakeMKV-Daten: $MAKEMKV_DIR (Schlüsselspeicher, rebuild-fest)"
titel "Schritt 2/4 Mount-Propagation einrichten"
if propagation_ok; then
ok "war schon 'shared' — nichts zu tun"
elif [ "$PROPAGATION_NOETIG" = 1 ]; then
mount --bind "$MEDIA_DIR" "$MEDIA_DIR" 2>/dev/null
mount --make-rshared "$MEDIA_DIR" 2>/dev/null
if propagation_ok; then
gruen " OK Propagation eingerichtet"
ok "Propagation eingerichtet"
# Neustart-fest machen, sonst ist es nach dem nächsten Reboot wieder weg
# und das Einhängen aus dem UI scheitert stillschweigend.
UNIT="/etc/systemd/system/$(systemd-escape -p --suffix=mount "$MEDIA_DIR" 2>/dev/null)"
@@ -184,13 +324,15 @@ Options=bind,rshared
WantedBy=multi-user.target
UNITEOF
systemctl daemon-reload 2>/dev/null
systemctl enable "$(basename "$UNIT")" >/dev/null 2>&1 \
&& gruen " OK Neustart-fest gemacht ($(basename "$UNIT"))" \
|| gelb " ! Konnte nicht neustart-fest gemacht werden — nach einem Reboot"
gelb " ggf. dieses Skript erneut ausführen."
if systemctl enable "$(basename "$UNIT")" >/dev/null 2>&1; then
ok "neustart-fest gemacht ($(basename "$UNIT"))"
else
gelb " ! Konnte nicht neustart-fest gemacht werden — nach einem Reboot"
gelb " dieses Skript einfach erneut ausführen."
fi
fi
else
gelb " ! Propagation liess sich nicht einrichten."
gelb " ! Propagation ließ sich nicht einrichten."
gelb " Rippy läuft trotzdem — nur das Einhängen von NAS-Freigaben AUS DEM UI"
gelb " funktioniert dann nicht. Freigaben stattdessen auf dem Host einhängen,"
gelb " z. B. unter $MEDIA_DIR/nas. Betrifft nur klassisches Docker mit"
@@ -198,34 +340,21 @@ UNITEOF
fi
fi
# ---------------------------------------------------------------------------
# 5. .env
# ---------------------------------------------------------------------------
titel "5/6 Konfiguration (.env)"
cd "$(dirname "$0")" || exit 1
titel "Schritt 3/4 Konfiguration schreiben"
if [ ! -f .env ]; then
if [ "$NUR_PRUEFEN" = 1 ]; then
gelb " ! .env fehlt (würde aus .env.example erzeugt)"
else
cp .env.example .env && gruen " OK .env aus .env.example erzeugt"
fi
else
gruen " OK .env liegt schon da — bestehende Werte bleiben unangetastet"
cp .env.example .env && ok ".env aus .env.example erzeugt"
fi
# Setzt einen Wert NUR, wenn er noch nicht (unkommentiert) gesetzt ist.
setze_wenn_leer() {
schluessel="$1"; wert="$2"
[ "$NUR_PRUEFEN" = 1 ] && { echo " würde setzen: $schluessel=$wert"; return; }
[ -f .env ] || return
if grep -qE "^${schluessel}=.+" .env; then
echo " $schluessel steht schon in der .env — unverändert gelassen"
else
sed -i "/^#*${schluessel}=/d" .env
printf '%s=%s\n' "$schluessel" "$wert" >> .env
gruen " OK $schluessel=$wert eingetragen"
ok "$schluessel=$wert eingetragen"
fi
}
@@ -235,41 +364,7 @@ if [ -n "$SR" ]; then
fi
setze_wenn_leer MAKEMKV_DATA_HOST "$MAKEMKV_DIR"
echo " API-Keys (TMDB/OMDb) brauchst du hier NICHT einzutragen —"
echo " der Einrichtungs-Assistent im Browser fragt sie ab und prüft sie."
# Gegenprobe: Zeigen die WIRKSAMEN Werte auf Geräte, die es hier gibt? Fängt
# den Fall "'.env' von einem anderen Rechner kopiert" und Tippfehler ab — sonst
# startet Docker mit einem Pfad, den es nicht gibt, und die Meldung ist kryptisch.
if [ -f .env ]; then
for paar in "OPTICAL_SR:/dev/sr0" "OPTICAL_SG:/dev/sg1"; do
schluessel="${paar%%:*}"; standard="${paar##*:}"
wirksam=$(grep -E "^${schluessel}=" .env 2>/dev/null | tail -1 | cut -d= -f2-)
[ -n "${wirksam:-}" ] || wirksam="$standard"
if [ ! -e "$wirksam" ]; then
gelb " ! $schluessel zeigt auf $wirksam — dieses Gerät gibt es hier NICHT."
if [ -n "$SR" ]; then
gelb " Gefunden wurde stattdessen: $SR + $SG"
gelb " Trage das in der .env ein (oder lösche die Zeile $schluessel=)."
else
gelb " Es wurde auch kein anderes Laufwerk gefunden — siehe Schritt 2."
fi
fi
done
fi
# ---------------------------------------------------------------------------
# 6. Bauen und starten
# ---------------------------------------------------------------------------
titel "6/6 Bauen und starten"
if [ "$NUR_PRUEFEN" = 1 ]; then
gelb " ! Übersprungen (Nur-Prüfen-Modus)."
echo ""
gruen "Prüfung fertig. Ohne --nur-pruefen würde jetzt gebaut und gestartet."
exit 0
fi
titel "Schritt 4/4 Bauen und starten"
echo " Der erste Bau dauert je nach Internet 3-10 Minuten. Nur beim ersten Mal."
echo ""
if ! $COMPOSE up -d --build; then