Makefile: lokale Dev-/DB-Ziele (build, migrate, seed, setup) ergänzen

- docker-compose.dev.yml: veröffentlicht Postgres-Port 5432 für Host-läufige
  Migrationen/Seeds (Produktiv-Postgres bleibt app-intern).
- Makefile: help-Default + Ziele install/dev/build-app/lint/typecheck/test,
  db-up/db-wait/migrate/seed/seed-auth/seed-all/generate/db-check/studio/db-reset,
  one-shot 'setup', E2E-Ziele; bestehende Deploy-Ziele (build/up/deploy/data) erhalten.
  'make build-app migrate' bzw. 'make setup' decken den gewünschten Build+Migrate-Flow ab.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude
2026-06-09 15:18:13 +02:00
parent 2e56a92b70
commit a8d07ba2ab
2 changed files with 139 additions and 21 deletions

147
Makefile
View File

@@ -1,38 +1,145 @@
# FlorianNetz — Deployment-Makefile (externes Traefik). # FlorianNetz — Makefile
# Lokale Entwicklung, Datenbank (Migrationen/Seeds) und Deployment (externes Traefik).
# #
# Ziele: # Schnellstart (lokal, Postgres via Docker):
# make build - baut das App-Image (Next.js standalone, non-root) # make setup # install + Postgres hoch + migrate + seed-all
# make up - startet den Stack (App + Postgres + Geo) hinter Traefik # make dev # Dev-Server -> http://localhost:3000
# make down - stoppt den Stack
# make logs - folgt den App-Logs
# make deploy - build + up (Standard-Deploy)
# make data - bereitet die OSRM-Geodaten vor (Download + Preprocessing)
# make config - validiert die Compose-Konfiguration
# #
# Hinweis: up/data/deploy benötigen Docker (+ Netzzugriff/RAM/Disk) und werden # Nur Build + Migrate (z. B. CI / vor Deploy):
# NICHT in CI/Sandbox ausgeführt. Das externe Traefik-Netz muss existieren: # make build-app migrate
# docker network create traefik #
# Voll-Deploy hinter externem Traefik (Docker):
# docker network create traefik # einmalig
# make deploy
#
# `make help` listet alle Ziele.
SHELL := /bin/bash
COMPOSE = docker compose --env-file .env 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
.PHONY: build up down logs deploy data config .DEFAULT_GOAL := help
build: # ---------------------------------------------------------------------------
.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 traefik
.PHONY: build up down logs ps deploy migrate-stack data config
build: ## App-Image bauen (Next.js standalone, non-root)
$(COMPOSE) build app $(COMPOSE) build app
up: up: ## Stack starten (App + Postgres + Geo) hinter Traefik
$(COMPOSE) up -d $(COMPOSE) up -d
down: down: ## Stack stoppen
$(COMPOSE) down $(COMPOSE) down
logs: logs: ## App-Logs folgen
$(COMPOSE) logs -f app $(COMPOSE) logs -f app
deploy: build up ps: ## Status der Stack-Container
$(COMPOSE) ps
data: 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 ./scripts/prepare-osm-data.sh
config: config: ## Compose-Konfiguration validieren
$(COMPOSE) config --services $(COMPOSE) config --services

11
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,11 @@
# Lokale Entwicklung: veröffentlicht den Postgres-Port auf dem Host (5432),
# damit auf dem HOST laufende Befehle (`make migrate`, `make seed`, `npm run db:*`)
# die Datenbank über DATABASE_URL (…@localhost:5432/…) erreichen.
#
# Wird NUR von den lokalen DB-Zielen des Makefiles eingebunden
# (docker compose -f docker-compose.yml -f docker-compose.dev.yml …),
# NICHT vom Produktiv-Deploy — dort bleibt Postgres app-intern (kein offener Port).
services:
postgres:
ports:
- "5432:5432"