Files
Florian-netz/Makefile
Claude f71cf51eb4 deploy: Traefik-Setup an feuerwehr_dashboard angleichen
Abgeglichen mit ~/work/feuerwehr_dashboard/docker-compose.yml:
- externes Traefik-Netz heißt 'frontend' (external: true), nicht 'traefik'
- explizite Router->Service-Bindung (routers.floriannetz.service=floriannetz)
- entrypoints=websecure, tls + certresolver=letsencrypt, port 3000
- traefik.docker.network -> frontend; AUTHENTIK_ADMIN_GROUP an App durchgereicht
- internes Netz als Bridge (statt internal:true): Postgres/Geo ohne Host-Ports,
  aber App hat Egress für Authentik-OIDC
- APP_HOST-Default florian.feuerwehr-rems.at; TRAEFIK_NETWORK-Default frontend
- Doku (deployment-traefik.md) + Makefile-Kommentare angepasst

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:39:42 +02:00

146 lines
4.8 KiB
Makefile

# FlorianNetz — Makefile
# Lokale Entwicklung, Datenbank (Migrationen/Seeds) und Deployment (externes Traefik).
#
# Schnellstart (lokal, Postgres via Docker):
# make setup # install + Postgres hoch + migrate + seed-all
# make dev # Dev-Server -> http://localhost:3000
#
# Nur Build + Migrate (z. B. CI / vor Deploy):
# make build-app migrate
#
# Voll-Deploy hinter externem Traefik (Docker):
# docker network create frontend # einmalig (externes Traefik-Netz)
# make deploy
#
# `make help` listet alle Ziele.
SHELL := /bin/bash
COMPOSE = docker compose --env-file .env
# Lokale DB-Ziele binden den Dev-Override ein (veröffentlicht Postgres-Port 5432).
COMPOSE_DEV = docker compose --env-file .env -f docker-compose.yml -f docker-compose.dev.yml
.DEFAULT_GOAL := help
# ---------------------------------------------------------------------------
.PHONY: help
help: ## Diese Übersicht anzeigen
@grep -hE '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}'
# --- Umgebung -------------------------------------------------------------
.PHONY: env install
env: ## .env aus .env.example erzeugen (falls noch nicht vorhanden)
@if [ ! -f .env ]; then cp .env.example .env && echo "→ .env aus .env.example erstellt (Werte anpassen!)"; else echo "→ .env existiert bereits"; fi
install: ## npm-Abhängigkeiten installieren
npm install
# --- Lokale Entwicklung & Qualität ---------------------------------------
.PHONY: dev build-app lint typecheck test test-cov check
dev: ## Next.js Dev-Server (http://localhost:3000)
npm run dev
build-app: ## Next.js Production-Build (ohne Docker)
npm run build
lint: ## ESLint
npm run lint
typecheck: ## TypeScript prüfen (tsc --noEmit)
npm run typecheck
test: ## Unit-Tests (Vitest)
npm run test
test-cov: ## Unit-Tests mit Coverage
npm run test:coverage
check: lint typecheck test ## Lint + Typecheck + Unit-Tests (Offline-DoD)
# --- E2E (braucht laufenden Server + Browser) ----------------------------
.PHONY: e2e-install e2e e2e-gating
e2e-install: ## Playwright-Browser installieren (einmalig)
npx playwright install
e2e: ## Komplette Playwright-E2E-Suite
npm run test:e2e
e2e-gating: ## Nur die Default-deny-Gating-Suite
npm run test:e2e:gating
# --- Datenbank (lokal; Postgres via Docker, Port auf Host veröffentlicht) -
.PHONY: db-up db-down db-wait generate migrate seed-auth seed seed-all db-check studio db-reset
db-up: ## Nur Postgres starten (Docker, Port 5432 lokal)
$(COMPOSE_DEV) up -d postgres
db-down: ## Postgres-Container stoppen
$(COMPOSE_DEV) stop postgres
db-wait: ## Warten bis Postgres bereit ist (max ~60s)
@echo "→ Warte auf Postgres…"; \
for i in $$(seq 1 30); do \
if $(COMPOSE_DEV) exec -T postgres sh -c 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"' >/dev/null 2>&1; then \
echo "→ Postgres bereit."; exit 0; \
fi; sleep 2; \
done; echo "✗ Postgres nicht bereit (Timeout)."; exit 1
generate: ## Drizzle-Migration aus dem Schema generieren
npm run db:generate
migrate: ## Migrationen anwenden (DATABASE_URL aus .env -> localhost:5432)
npm run db:migrate
seed-auth: ## Ersten Platform-Admin anlegen (idempotent)
npm run db:seed-auth
seed: ## NÖ-Katalog seeden: Merkmale/Vorlagen/Kategorien (idempotent)
npm run db:seed
seed-all: seed-auth seed ## Auth- + Katalog-Seed
db-check: ## Drizzle-Schema-/Migrationskonsistenz prüfen (offline)
npm run db:check
studio: ## Drizzle Studio öffnen (DB-Browser)
npm run db:studio
db-reset: ## ACHTUNG: Postgres-Volume löschen, neu migrieren + seeden
$(COMPOSE_DEV) rm -sf postgres
-docker volume rm florian-netz_postgres-data
$(MAKE) db-up db-wait migrate seed-all
# --- Erststart (lokal, von 0) --------------------------------------------
.PHONY: setup
setup: install env db-up db-wait migrate seed-all ## Komplettes lokales Setup von 0
@echo ""
@echo "✓ Setup fertig. Login-Admin via 'make seed-auth' angelegt. Weiter mit: make dev"
# --- Deployment (externes Traefik; braucht Docker) -----------------------
# Externes Netz muss existieren: docker network create frontend
.PHONY: build up down logs ps deploy migrate-stack data config
build: ## App-Image bauen (Next.js standalone, non-root)
$(COMPOSE) build app
up: ## Stack starten (App + Postgres + Geo) hinter Traefik
$(COMPOSE) up -d
down: ## Stack stoppen
$(COMPOSE) down
logs: ## App-Logs folgen
$(COMPOSE) logs -f app
ps: ## Status der Stack-Container
$(COMPOSE) ps
deploy: build up ## build + up (Standard-Deploy; migrate läuft via Entrypoint automatisch)
migrate-stack: ## Migrationen im laufenden App-Container ausführen (manuell)
$(COMPOSE) exec app node docker/migrate.mjs
data: ## OSRM-Geodaten vorbereiten (Download + Preprocessing; viel RAM/Disk)
./scripts/prepare-osm-data.sh
config: ## Compose-Konfiguration validieren
$(COMPOSE) config --services