# 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