SSH-Port-Check in Makefile und setup-ds.sh, HTTPS-Clone auf DS

This commit is contained in:
rene 2026-04-12 16:48:19 +02:00
parent e364e43480
commit 4499055b99
2 changed files with 168 additions and 60 deletions

View file

@ -6,12 +6,28 @@
# Konfiguration # Konfiguration
DS_HOST := ds DS_HOST := ds
DS_IP := 10.47.11.10
DS_SSH_PORT := 22
DS_PATH := /volume1/docker/ban-yaro DS_PATH := /volume1/docker/ban-yaro
CONTAINER := ban-yaro CONTAINER := ban-yaro
GIT_REMOTE := origin GIT_REMOTE := origin
.PHONY: help deploy push pull logs logs-f shell db restart stop status build \ .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 # Standard: Hilfe anzeigen
@ -41,7 +57,7 @@ help:
# DEPLOY: Git push → DS pull → Rebuild → Neustart # DEPLOY: Git push → DS pull → Rebuild → Neustart
# Das ist der Befehl den du am meisten nutzen wirst. # Das ist der Befehl den du am meisten nutzen wirst.
# ---------------------------------------------------------- # ----------------------------------------------------------
deploy: deploy: check-ssh
@echo "→ Git push..." @echo "→ Git push..."
@git push $(GIT_REMOTE) main @git push $(GIT_REMOTE) main
@echo "→ DS: pull + rebuild + restart..." @echo "→ DS: pull + rebuild + restart..."
@ -63,7 +79,7 @@ push:
# NUR auf DS deployen (ohne neuen Git push) # NUR auf DS deployen (ohne neuen Git push)
# z.B. wenn jemand anderes gepusht hat # z.B. wenn jemand anderes gepusht hat
# ---------------------------------------------------------- # ----------------------------------------------------------
pull: pull: check-ssh
@ssh $(DS_HOST) "cd $(DS_PATH) && \ @ssh $(DS_HOST) "cd $(DS_PATH) && \
git pull && \ git pull && \
sudo docker compose down && \ sudo docker compose down && \
@ -74,7 +90,7 @@ pull:
# Nur neustarten (kein Rebuild, kein Git) # Nur neustarten (kein Rebuild, kein Git)
# z.B. nach .env-Änderung # z.B. nach .env-Änderung
# ---------------------------------------------------------- # ----------------------------------------------------------
restart: restart: check-ssh
@ssh $(DS_HOST) "cd $(DS_PATH) && \ @ssh $(DS_HOST) "cd $(DS_PATH) && \
sudo docker compose restart $(CONTAINER) && \ sudo docker compose restart $(CONTAINER) && \
echo '✓ Container neugestartet.'" echo '✓ Container neugestartet.'"
@ -82,42 +98,42 @@ restart:
# ---------------------------------------------------------- # ----------------------------------------------------------
# Nur bauen (kein Start) # Nur bauen (kein Start)
# ---------------------------------------------------------- # ----------------------------------------------------------
build: build: check-ssh
@ssh $(DS_HOST) "cd $(DS_PATH) && \ @ssh $(DS_HOST) "cd $(DS_PATH) && \
sudo docker compose build --no-cache" sudo docker compose build --no-cache"
# ---------------------------------------------------------- # ----------------------------------------------------------
# Stoppen # Stoppen
# ---------------------------------------------------------- # ----------------------------------------------------------
stop: stop: check-ssh
@ssh $(DS_HOST) "cd $(DS_PATH) && sudo docker compose down" @ssh $(DS_HOST) "cd $(DS_PATH) && sudo docker compose down"
# ---------------------------------------------------------- # ----------------------------------------------------------
# Status # Status
# ---------------------------------------------------------- # ----------------------------------------------------------
status: status: check-ssh
@ssh $(DS_HOST) "sudo docker ps --filter name=$(CONTAINER) --format \ @ssh $(DS_HOST) "sudo docker ps --filter name=$(CONTAINER) --format \
'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
# ---------------------------------------------------------- # ----------------------------------------------------------
# LOGS # LOGS
# ---------------------------------------------------------- # ----------------------------------------------------------
logs: logs: check-ssh
@ssh $(DS_HOST) "sudo docker logs $(CONTAINER) --tail=100" @ssh $(DS_HOST) "sudo docker logs $(CONTAINER) --tail=100"
logs-f: logs-f: check-ssh
@ssh $(DS_HOST) "sudo docker logs $(CONTAINER) -f" @ssh $(DS_HOST) "sudo docker logs $(CONTAINER) -f"
# ---------------------------------------------------------- # ----------------------------------------------------------
# SHELL im Container # SHELL im Container
# ---------------------------------------------------------- # ----------------------------------------------------------
shell: shell: check-ssh
@ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) bash" @ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) bash"
# ---------------------------------------------------------- # ----------------------------------------------------------
# SQLite direkt öffnen # SQLite direkt öffnen
# ---------------------------------------------------------- # ----------------------------------------------------------
db: db: check-ssh
@ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) \ @ssh -t $(DS_HOST) "sudo docker exec -it $(CONTAINER) \
sqlite3 /data/banyaro.db" sqlite3 /data/banyaro.db"

View file

@ -1,87 +1,179 @@
#!/bin/bash #!/bin/bash
# ============================================================== # ==============================================================
# BAN YARO — Ersteinrichtung auf der DiskStation # 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 set -e
DS_HOST="ds" DS_HOST="ds"
DS_IP="10.47.11.10"
DS_SSH_PORT="22"
DS_PATH="/volume1/docker/ban-yaro" 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 "" echo ""
# ---------------------------------------------------------- # ----------------------------------------------------------
# 1. Verzeichnis anlegen und Repo klonen # 0. SSH-Port prüfen BEVOR wir irgendwas versuchen
# ---------------------------------------------------------- # ----------------------------------------------------------
echo "→ Repo klonen..." echo "→ Prüfe SSH-Erreichbarkeit (${DS_IP}:${DS_SSH_PORT})..."
ssh "$DS_HOST" "
mkdir -p $(dirname $DS_PATH) && if ! nc -z -w3 "$DS_IP" "$DS_SSH_PORT" 2>/dev/null; then
if [ -d '$DS_PATH' ]; then err "DS nicht erreichbar auf Port ${DS_SSH_PORT}!"
echo ' Verzeichnis existiert bereits, pull statt clone.' echo ""
cd '$DS_PATH' && git pull echo " Mögliche Ursachen:"
else echo " • SSH-Port in der Fritz!Box ist geschlossen"
git clone '$REPO_URL' '$DS_PATH' echo " • DS-Firewall blockiert Port ${DS_SSH_PORT}"
echo ' Geklont nach $DS_PATH' echo " • DS ist offline"
fi 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" " ssh "$DS_HOST" "
if [ ! -f '$DS_PATH/.env' ]; then mkdir -p '${DS_PATH}/data/media/dogs'
cp '$DS_PATH/.env.example' '$DS_PATH/.env' mkdir -p '${DS_PATH}/data/media/diary'
echo '' mkdir -p '${DS_PATH}/data/media/poison'
echo ' ⚠️ .env wurde angelegt. Bitte jetzt anpassen:' echo ' Verzeichnisstruktur:'
echo ' ssh ds && nano $DS_PATH/.env' find '${DS_PATH}/data' -type d | sed 's/^/ /'
echo ''
echo ' Mindestens setzen:'
echo ' JWT_SECRET=<langer-zufaelliger-string>'
echo ' KI_MODE=local'
echo ' KI_LOCAL_URL=http://10.47.11.10:1234/v1'
echo ''
else
echo ' .env existiert bereits.'
fi
" "
ok "Verzeichnisse angelegt"
# ---------------------------------------------------------- # ----------------------------------------------------------
# 3. Data-Verzeichnis mit korrekten Rechten # 2. Repo klonen oder aktualisieren
# ---------------------------------------------------------- # ----------------------------------------------------------
echo "→ Data-Verzeichnis..." echo ""
echo "→ Repository..."
ssh "$DS_HOST" " ssh "$DS_HOST" "
mkdir -p '$DS_PATH/data/media/dogs' if [ -d '${DS_PATH}/.git' ]; then
mkdir -p '$DS_PATH/data/media/diary' echo ' Existiert bereits — aktualisiere...'
mkdir -p '$DS_PATH/data/media/poison' cd '${DS_PATH}' && git pull
echo ' Verzeichnisse angelegt.' 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=<langer-zufaelliger-string> │"
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 # 4. Docker-Image bauen und starten
# ---------------------------------------------------------- # ----------------------------------------------------------
echo "→ Docker build + start..." echo ""
echo "→ Docker build (kann 2-3 Minuten dauern)..."
ssh "$DS_HOST" " ssh "$DS_HOST" "
cd '$DS_PATH' && cd '${DS_PATH}' &&
sudo docker compose build && sudo docker compose build &&
sudo docker compose up -d sudo docker compose up -d
" "
ok "Container gestartet"
# ---------------------------------------------------------- # ----------------------------------------------------------
# 5. Status prüfen # 5. Health-Check
# ---------------------------------------------------------- # ----------------------------------------------------------
echo "" echo ""
echo "→ Status:" echo "→ Warte auf App-Start..."
ssh "$DS_HOST" "sudo docker ps --filter name=ban-yaro --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" 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 ""
echo "=== Setup abgeschlossen ===" echo "=========================================="
echo "" echo ""
echo "Nächste Schritte:" ok "Setup abgeschlossen!"
echo " 1. NPM-Eintrag für banyaro.app → Port 3010" echo ""
echo " 2. Logs prüfen: make logs" echo " Nächste Schritte:"
echo " 3. App aufrufen: https://banyaro.app" 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 "" echo ""