# ============================================================== # BAN YARO — Makefile # Deploy-Strategie: rsync vom Mac zur DS (kein git auf DS nötig) # Git wird nur lokal auf dem Mac und für Forgejo-Backup genutzt. # ============================================================== DS_HOST := ds DS_IP := 10.47.11.10 # Hinweis: NPM braucht 10.47.11.99 als Forward-IP (Macvlan-Shim), nicht .10 DS_SSH_PORT := 4711 DS_PATH := /volume1/docker/banyaro CONTAINER := banyaro # container_name (für docker logs/exec) SERVICE := banyaro # service-name in docker-compose.yml (für docker compose restart) GIT_REMOTE := origin DOCKER := sudo /usr/local/bin/docker # tar: was NICHT auf die DS übertragen wird TAR_EXCLUDE := --exclude='.git' \ --exclude='./data' \ --exclude='./backend/venv' \ --exclude='./backend/__pycache__' \ --exclude='./.env' \ --exclude='./*.db' \ --exclude='./.DS_Store' .PHONY: help deploy deploy-clean sync push restart build stop status \ logs logs-f shell db dev clean-cache check-ssh # ---------------------------------------------------------- # SSH-Prüfung — Abhängigkeit aller DS-Befehle # ---------------------------------------------------------- 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 offline."; \ echo " → Port in Fritz!Box / DS-Firewall öffnen, dann erneut versuchen."; \ echo ""; \ exit 1; \ fi # ---------------------------------------------------------- # Hilfe # ---------------------------------------------------------- help: @echo "" @echo " Ban Yaro — verfügbare Befehle:" @echo "" @echo " make deploy Sync + Rebuild + Neustart (mit Layer-Cache, häufigster Befehl)" @echo " make deploy-clean Wie deploy, aber --no-cache (bei requirements-Änderungen)" @echo " make sync Nur Dateien zur DS übertragen (ohne Rebuild)" @echo " make push Nur Git push zu Forgejo (Backup/Versionierung)" @echo " make restart Container neustarten (kein Rebuild)" @echo " make build Docker neu bauen (ohne Neustart)" @echo " make stop Container stoppen" @echo " make status Container-Status anzeigen" @echo "" @echo " make logs Letzte 100 Zeilen" @echo " make logs-f Live-Log-Stream" @echo " make shell Bash im Container" @echo " make db SQLite-Shell" @echo "" @echo " make dev Lokaler Dev-Server auf Mac (Port 8001)" @echo " make clean-cache SW-Cache-Version erhöhen + restart" @echo "" # ---------------------------------------------------------- # DEPLOY — der Haupt-Befehl # 1. Git push (Backup) # 2. rsync zum DS # 3. Docker rebuild + restart # ---------------------------------------------------------- deploy: check-ssh @echo "→ Git push (Backup)..." @git push $(GIT_REMOTE) main @echo "→ Sync zu DS..." @COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/" @echo "→ Docker rebuild + restart (mit Layer-Cache)..." @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ $(DOCKER) compose down && \ $(DOCKER) compose build && \ $(DOCKER) compose up -d" @echo "" @echo " ✓ Deploy fertig. Letzte Logs:" @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=15" # ---------------------------------------------------------- # DEPLOY-CLEAN — erzwingt Neuaufbau ohne Layer-Cache # Nötig wenn: requirements.txt geändert, System-Pakete aktualisiert, # oder nach einem kaputten Image-State # ---------------------------------------------------------- deploy-clean: check-ssh @echo "→ Git push (Backup)..." @git push $(GIT_REMOTE) main @echo "→ Sync zu DS..." @COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/" @echo "→ Docker rebuild (--no-cache) + restart..." @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ $(DOCKER) compose down && \ $(DOCKER) compose build --no-cache && \ $(DOCKER) compose up -d" @echo "" @echo " ✓ Deploy fertig. Letzte Logs:" @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=15" # ---------------------------------------------------------- # SYNC — nur Dateien zur DS übertragen, kein Docker-Rebuild # ACHTUNG: ALLE Dateien (CSS/JS/HTML/Python) sind ins Image gebacken! # sync+restart reicht für NICHTS — immer: make deploy # ---------------------------------------------------------- sync: check-ssh @echo "→ Sync zu DS..." @COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/" @echo " ✓ Sync fertig." # ---------------------------------------------------------- # PUSH — nur Git, ohne DS-Deploy # ---------------------------------------------------------- push: git push $(GIT_REMOTE) main # ---------------------------------------------------------- # RESTART — kein Rebuild, nur Container neu starten # Reicht nur für Umgebungsvariablen-Änderungen (.env) # ---------------------------------------------------------- restart: check-ssh @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ $(DOCKER) compose restart $(SERVICE)" @echo " ✓ Neugestartet." # ---------------------------------------------------------- # BUILD — nur Docker-Image neu bauen (mit Layer-Cache) # ---------------------------------------------------------- build: check-ssh @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ $(DOCKER) compose build" # ---------------------------------------------------------- # STOP # ---------------------------------------------------------- stop: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose down" @echo " ✓ Gestoppt." # ---------------------------------------------------------- # STATUS # ---------------------------------------------------------- status: check-ssh @ssh $(DS_HOST) "$(DOCKER) ps \ --filter name=$(CONTAINER) \ --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" # ---------------------------------------------------------- # LOGS # ---------------------------------------------------------- logs: check-ssh @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) --tail=100" logs-f: check-ssh @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER) -f" # ---------------------------------------------------------- # SHELL im Container # ---------------------------------------------------------- shell: check-ssh @ssh -t $(DS_HOST) "$(DOCKER) exec -it $(CONTAINER) bash" # ---------------------------------------------------------- # SQLite # ---------------------------------------------------------- db: check-ssh @ssh -t $(DS_HOST) "$(DOCKER) exec -it $(CONTAINER) \ sqlite3 /data/banyaro.db" # ---------------------------------------------------------- # DEV — lokaler Server auf Mac (kein Docker, kein DS) # ---------------------------------------------------------- dev: @cd backend && \ test -d venv || python3 -m venv venv && \ . venv/bin/activate && \ pip install -q -r requirements.txt && \ KI_MODE=off ENV=development \ JWT_SECRET=dev-secret \ DB_PATH=./dev.db \ uvicorn main:app --reload --port 8001 # ---------------------------------------------------------- # CACHE leeren — SW-Version erhöhen, dann restart # Nach größeren CSS/JS-Änderungen wenn SW gecacht hat # ---------------------------------------------------------- clean-cache: check-ssh @NEW_VER="by-v$$(date +%s)"; \ ssh $(DS_HOST) " \ sed -i \"s/by-v[0-9]*/$$NEW_VER/g\" \ $(DS_PATH)/backend/static/sw.js" @$(MAKE) restart @echo " ✓ Cache-Version erhöht."