# ============================================================== # VEREINS.HAUS — Makefile # Deploy-Strategie: SSH zur DS, Docker Compose # Stack: SvelteKit + better-sqlite3 (kein PocketBase) # ============================================================== DS_HOST := ds DS_IP := 10.47.11.10 DS_SSH_PORT := 4711 DS_PATH := /volume1/docker/vereinshaus CONTAINER_APP := vereinshaus-app DOCKER := sudo /usr/local/bin/docker STAGING_PATH := /volume1/docker/vereinshaus-staging CONTAINER_APP_STAGING := vereinshaus-staging-app TAR_EXCLUDE := --exclude='.git' \ --exclude='./app/node_modules' \ --exclude='./app/.svelte-kit' \ --exclude='./app/build' \ --exclude='./.env' \ --exclude='./.DS_Store' .PHONY: help check-ssh start stop restart status logs logs-app logs-f deploy \ staging-deploy staging-reset staging-seed staging-logs staging-status staging-stop # ---------------------------------------------------------- # Hilfe # ---------------------------------------------------------- help: @echo "" @echo " vereins.haus — verfügbare Befehle:" @echo "" @echo " make deploy App bauen + zur DS übertragen + Container neu starten" @echo " make start Container starten" @echo " make stop Container stoppen" @echo " make restart Container neu starten" @echo " make status Container-Status anzeigen" @echo " make logs App-Logs (100 Zeilen)" @echo " make logs-f App Live-Log" @echo "" @echo " make staging-deploy Staging deployen" @echo " make staging-seed Testdaten einfügen" @echo " make staging-reset Staging-DB löschen (Neustart)" @echo "" # ---------------------------------------------------------- # SSH-Prüfung # ---------------------------------------------------------- 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 ""; \ exit 1; \ fi # ---------------------------------------------------------- # DEPLOY (Production) # ---------------------------------------------------------- deploy: check-ssh @echo "→ Sync zu DS..." @COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(DS_PATH)/" @echo "→ .env auf DS aktualisieren..." @if [ -f .env ]; then \ cat .env | ssh $(DS_HOST) "cat > $(DS_PATH)/.env"; \ fi @echo "→ Docker rebuild + restart..." @ssh $(DS_HOST) " \ cd $(DS_PATH) && \ $(DOCKER) compose down && \ $(DOCKER) compose build app && \ $(DOCKER) compose up -d" @echo " ✓ Deploy fertig." @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) --tail=15" # ---------------------------------------------------------- # Container-Steuerung # ---------------------------------------------------------- start: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose up -d" @echo " ✓ Gestartet." stop: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose down" @echo " ✓ Gestoppt." restart: check-ssh @ssh $(DS_HOST) "cd $(DS_PATH) && $(DOCKER) compose restart" @echo " ✓ Neugestartet." status: check-ssh @ssh $(DS_HOST) "$(DOCKER) ps \ --filter name=vereinshaus \ --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" # ---------------------------------------------------------- # Logs # ---------------------------------------------------------- logs: check-ssh @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) --tail=100" logs-app: logs logs-f: check-ssh @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP) -f" # ============================================================== # STAGING # ============================================================== staging-deploy: check-ssh @echo "→ Sync zu DS (Staging)..." @COPYFILE_DISABLE=1 tar czf - $(TAR_EXCLUDE) . | ssh $(DS_HOST) "tar xzf - -C $(STAGING_PATH)/" @echo "→ .env auf DS (Staging)..." @if [ -f .env ]; then \ cat .env | ssh $(DS_HOST) "cat > $(STAGING_PATH)/.env"; \ fi @echo "→ Docker rebuild + restart (Staging)..." @ssh $(DS_HOST) " \ cd $(STAGING_PATH) && \ $(DOCKER) compose -f docker-compose.staging.yml down && \ $(DOCKER) compose -f docker-compose.staging.yml build app-staging && \ $(DOCKER) compose -f docker-compose.staging.yml up -d" @echo " ✓ Staging bereit." @echo " App: https://staging.vereins.haus" # Löscht die SQLite-DB auf Staging → frischer Start # Danach: make staging-deploy && make staging-seed staging-reset: check-ssh staging-stop @echo "→ Staging-Daten löschen..." @ssh $(DS_HOST) "rm -f \ $(STAGING_PATH)/data/vereinshaus.db \ $(STAGING_PATH)/data/vereinshaus.db-wal \ $(STAGING_PATH)/data/vereinshaus.db-shm && \ rm -rf $(STAGING_PATH)/data/uploads" @echo " ✓ Reset fertig. Jetzt: make staging-deploy && make staging-seed" staging-seed: @echo "→ Testdaten in Staging einfügen..." @if [ -f .env ]; then \ export $$(grep -v '^#' .env | xargs) && \ APP_URL=https://staging.vereins.haus node scripts/seed.js; \ else \ APP_URL=https://staging.vereins.haus node scripts/seed.js; \ fi staging-logs: check-ssh @ssh $(DS_HOST) "$(DOCKER) logs $(CONTAINER_APP_STAGING) --tail=50" staging-status: check-ssh @ssh $(DS_HOST) "$(DOCKER) ps \ --filter name=vereinshaus-staging \ --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" staging-stop: check-ssh @ssh $(DS_HOST) "cd $(STAGING_PATH) && $(DOCKER) compose -f docker-compose.staging.yml down" @echo " ✓ Staging gestoppt."