From 4499055b99c2b5e8717d792e13c36940839cdd1b Mon Sep 17 00:00:00 2001 From: rene Date: Sun, 12 Apr 2026 16:48:19 +0200 Subject: [PATCH] SSH-Port-Check in Makefile und setup-ds.sh, HTTPS-Clone auf DS --- Makefile | 38 ++++++--- scripts/setup-ds.sh | 190 ++++++++++++++++++++++++++++++++------------ 2 files changed, 168 insertions(+), 60 deletions(-) diff --git a/Makefile b/Makefile index 68bc09a..151c2d0 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,28 @@ # Konfiguration DS_HOST := ds +DS_IP := 10.47.11.10 +DS_SSH_PORT := 22 DS_PATH := /volume1/docker/ban-yaro CONTAINER := ban-yaro GIT_REMOTE := origin .PHONY: help deploy push pull logs logs-f shell db restart stop status build \ - clean-cache dev lint + clean-cache dev lint check-ssh + +# ---------------------------------------------------------- +# SSH-Prüfung — intern, wird von allen DS-Befehlen genutzt +# ---------------------------------------------------------- +check-ssh: + @if ! nc -z -w3 $(DS_IP) $(DS_SSH_PORT) 2>/dev/null; then \ + echo ""; \ + echo " ✗ DS nicht erreichbar ($(DS_IP):$(DS_SSH_PORT))"; \ + echo ""; \ + echo " SSH-Port $(DS_SSH_PORT) ist geschlossen oder DS ist offline."; \ + echo " → Port in der Fritz!Box / DS-Firewall öffnen, dann erneut versuchen."; \ + echo ""; \ + exit 1; \ + fi # ---------------------------------------------------------- # Standard: Hilfe anzeigen @@ -41,7 +57,7 @@ help: # DEPLOY: Git push → DS pull → Rebuild → Neustart # Das ist der Befehl den du am meisten nutzen wirst. # ---------------------------------------------------------- -deploy: +deploy: check-ssh @echo "→ Git push..." @git push $(GIT_REMOTE) main @echo "→ DS: pull + rebuild + restart..." @@ -63,7 +79,7 @@ push: # NUR auf DS deployen (ohne neuen Git push) # z.B. wenn jemand anderes gepusht hat # ---------------------------------------------------------- -pull: +pull: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && \ git pull && \ sudo docker compose down && \ @@ -74,7 +90,7 @@ pull: # Nur neustarten (kein Rebuild, kein Git) # z.B. nach .env-Änderung # ---------------------------------------------------------- -restart: +restart: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && \ sudo docker compose restart $(CONTAINER) && \ echo '✓ Container neugestartet.'" @@ -82,42 +98,42 @@ restart: # ---------------------------------------------------------- # Nur bauen (kein Start) # ---------------------------------------------------------- -build: +build: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && \ sudo docker compose build --no-cache" # ---------------------------------------------------------- # Stoppen # ---------------------------------------------------------- -stop: +stop: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && sudo docker compose down" # ---------------------------------------------------------- # Status # ---------------------------------------------------------- -status: +status: check-ssh @ssh $(DS_HOST) "sudo docker ps --filter name=$(CONTAINER) --format \ 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" # ---------------------------------------------------------- # LOGS # ---------------------------------------------------------- -logs: +logs: check-ssh @ssh $(DS_HOST) "sudo docker logs $(CONTAINER) --tail=100" -logs-f: +logs-f: check-ssh @ssh $(DS_HOST) "sudo docker logs $(CONTAINER) -f" # ---------------------------------------------------------- # SHELL im Container # ---------------------------------------------------------- -shell: +shell: check-ssh @ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) bash" # ---------------------------------------------------------- # SQLite direkt öffnen # ---------------------------------------------------------- -db: +db: check-ssh @ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) \ sqlite3 /data/banyaro.db" diff --git a/scripts/setup-ds.sh b/scripts/setup-ds.sh index 6dc6600..49ba02d 100755 --- a/scripts/setup-ds.sh +++ b/scripts/setup-ds.sh @@ -1,87 +1,179 @@ #!/bin/bash # ============================================================== # BAN YARO — Ersteinrichtung auf der DiskStation -# Einmalig ausführen: bash scripts/setup-ds.sh +# +# Läuft auf deinem MAC und richtet die DS per SSH ein. +# Du musst dieses Skript NICHT auf die DS kopieren. +# +# Voraussetzung: SSH-Port auf DS offen, SSH-Key eingerichtet +# Aufruf: bash scripts/setup-ds.sh # ============================================================== set -e DS_HOST="ds" +DS_IP="10.47.11.10" +DS_SSH_PORT="22" DS_PATH="/volume1/docker/ban-yaro" -REPO_URL="ssh://git@dsm.motocamp.de:2222/rene/banyaro.git" +REPO_URL="https://git.motocamp.de/rene/banyaro.git" # HTTPS, kein SSH-Key auf DS nötig -echo "=== Ban Yaro Setup auf DS1621 ===" +# Farben +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' +ok() { echo -e "${GREEN} ✓ $1${NC}"; } +warn() { echo -e "${YELLOW} ⚠ $1${NC}"; } +err() { echo -e "${RED} ✗ $1${NC}"; } + +echo "" +echo "=== Ban Yaro — Ersteinrichtung DS1621 ===" echo "" # ---------------------------------------------------------- -# 1. Verzeichnis anlegen und Repo klonen +# 0. SSH-Port prüfen BEVOR wir irgendwas versuchen # ---------------------------------------------------------- -echo "→ Repo klonen..." -ssh "$DS_HOST" " - mkdir -p $(dirname $DS_PATH) && - if [ -d '$DS_PATH' ]; then - echo ' Verzeichnis existiert bereits, pull statt clone.' - cd '$DS_PATH' && git pull - else - git clone '$REPO_URL' '$DS_PATH' - echo ' Geklont nach $DS_PATH' - fi -" +echo "→ Prüfe SSH-Erreichbarkeit (${DS_IP}:${DS_SSH_PORT})..." + +if ! nc -z -w3 "$DS_IP" "$DS_SSH_PORT" 2>/dev/null; then + err "DS nicht erreichbar auf Port ${DS_SSH_PORT}!" + echo "" + echo " Mögliche Ursachen:" + echo " • SSH-Port in der Fritz!Box ist geschlossen" + echo " • DS-Firewall blockiert Port ${DS_SSH_PORT}" + echo " • DS ist offline" + echo "" + echo " → SSH-Port öffnen, dann erneut ausführen." + echo "" + exit 1 +fi +ok "SSH-Port ${DS_SSH_PORT} erreichbar" + +# SSH-Verbindung selbst testen +if ! ssh -q -o ConnectTimeout=5 -o BatchMode=yes "$DS_HOST" exit 2>/dev/null; then + err "SSH-Verbindung zu '${DS_HOST}' fehlgeschlagen!" + echo "" + echo " Prüfe: ssh ${DS_HOST} (muss ohne Passwort funktionieren)" + echo "" + exit 1 +fi +ok "SSH-Verbindung funktioniert" # ---------------------------------------------------------- -# 2. .env anlegen falls nicht vorhanden +# 1. Verzeichnisse anlegen # ---------------------------------------------------------- -echo "→ .env prüfen..." +echo "" +echo "→ Verzeichnisse anlegen..." + ssh "$DS_HOST" " - if [ ! -f '$DS_PATH/.env' ]; then - cp '$DS_PATH/.env.example' '$DS_PATH/.env' - echo '' - echo ' ⚠️ .env wurde angelegt. Bitte jetzt anpassen:' - echo ' ssh ds && nano $DS_PATH/.env' - echo '' - echo ' Mindestens setzen:' - echo ' JWT_SECRET=' - echo ' KI_MODE=local' - echo ' KI_LOCAL_URL=http://10.47.11.10:1234/v1' - echo '' - else - echo ' .env existiert bereits.' - fi + mkdir -p '${DS_PATH}/data/media/dogs' + mkdir -p '${DS_PATH}/data/media/diary' + mkdir -p '${DS_PATH}/data/media/poison' + echo ' Verzeichnisstruktur:' + find '${DS_PATH}/data' -type d | sed 's/^/ /' " +ok "Verzeichnisse angelegt" # ---------------------------------------------------------- -# 3. Data-Verzeichnis mit korrekten Rechten +# 2. Repo klonen oder aktualisieren # ---------------------------------------------------------- -echo "→ Data-Verzeichnis..." +echo "" +echo "→ Repository..." + ssh "$DS_HOST" " - mkdir -p '$DS_PATH/data/media/dogs' - mkdir -p '$DS_PATH/data/media/diary' - mkdir -p '$DS_PATH/data/media/poison' - echo ' Verzeichnisse angelegt.' + if [ -d '${DS_PATH}/.git' ]; then + echo ' Existiert bereits — aktualisiere...' + cd '${DS_PATH}' && git pull + else + echo ' Klone von ${REPO_URL}...' + git clone '${REPO_URL}' '${DS_PATH}' + fi " +ok "Repository bereit" + +# ---------------------------------------------------------- +# 3. .env anlegen +# ---------------------------------------------------------- +echo "" +echo "→ Konfiguration (.env)..." + +ssh "$DS_HOST" " + if [ -f '${DS_PATH}/.env' ]; then + echo ' .env existiert bereits — wird nicht überschrieben.' + else + cp '${DS_PATH}/.env.example' '${DS_PATH}/.env' + echo ' .env angelegt aus .env.example' + fi +" + +# Prüfen ob JWT_SECRET noch der Default ist +JWT_CHECK=$(ssh "$DS_HOST" "grep 'JWT_SECRET' '${DS_PATH}/.env' | grep -c 'bitte-aendern'" 2>/dev/null || true) +if [ "$JWT_CHECK" -gt "0" ]; then + warn ".env muss noch angepasst werden!" + echo "" + echo " Mindestens setzen:" + echo "" + echo " ssh ${DS_HOST}" + echo " nano ${DS_PATH}/.env" + echo "" + echo " ┌─────────────────────────────────────────────────────┐" + echo " │ JWT_SECRET= │" + echo " │ KI_MODE=local │" + echo " │ KI_LOCAL_URL=http://10.47.11.10:1234/v1 │" + echo " └─────────────────────────────────────────────────────┘" + echo "" + read -r -p " .env jetzt bearbeiten? [J/n] " REPLY + if [[ "${REPLY}" =~ ^[Jj]$ ]] || [[ -z "${REPLY}" ]]; then + ssh -t "$DS_HOST" "nano '${DS_PATH}/.env'" + else + warn "Nicht vergessen: .env vor dem nächsten Start anpassen!" + fi +else + ok ".env konfiguriert" +fi # ---------------------------------------------------------- # 4. Docker-Image bauen und starten # ---------------------------------------------------------- -echo "→ Docker build + start..." +echo "" +echo "→ Docker build (kann 2-3 Minuten dauern)..." + ssh "$DS_HOST" " - cd '$DS_PATH' && - sudo docker compose build && - sudo docker compose up -d + cd '${DS_PATH}' && + sudo docker compose build && + sudo docker compose up -d " +ok "Container gestartet" # ---------------------------------------------------------- -# 5. Status prüfen +# 5. Health-Check # ---------------------------------------------------------- echo "" -echo "→ Status:" -ssh "$DS_HOST" "sudo docker ps --filter name=ban-yaro --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" +echo "→ Warte auf App-Start..." +sleep 4 +STATUS=$(ssh "$DS_HOST" "sudo docker ps --filter name=ban-yaro --format '{{.Status}}'" 2>/dev/null || true) +if echo "$STATUS" | grep -q "Up"; then + ok "Container läuft: ${STATUS}" +else + err "Container-Status: ${STATUS}" + echo " → Logs prüfen: make logs" +fi + +# ---------------------------------------------------------- +# 6. Zusammenfassung +# ---------------------------------------------------------- echo "" -echo "=== Setup abgeschlossen ===" +echo "==========================================" echo "" -echo "Nächste Schritte:" -echo " 1. NPM-Eintrag für banyaro.app → Port 3010" -echo " 2. Logs prüfen: make logs" -echo " 3. App aufrufen: https://banyaro.app" +ok "Setup abgeschlossen!" +echo "" +echo " Nächste Schritte:" +echo "" +echo " 1. NPM-Eintrag anlegen:" +echo " Host: banyaro.app" +echo " Ziel: http://10.47.11.10:3010" +echo "" +echo " 2. Logs prüfen:" +echo " make logs" +echo "" +echo " 3. App aufrufen:" +echo " https://banyaro.app" echo ""