Ermöglicht Deploy ohne OSRM/Nominatim (deren Preprocessing/Import viel RAM braucht; Austria-Extrakt OOM-te beim osrm-extract). App läuft mit Haversine-Fallback; Geo später via 'make data' + 'make up' nachziehen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
152 lines
5.1 KiB
Makefile
152 lines
5.1 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 up-core down logs ps deploy deploy-core 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
|
|
|
|
up-core: ## Nur App + Postgres starten (OHNE Geo/OSRM/Nominatim) — wenig RAM nötig
|
|
$(COMPOSE) up -d --build app postgres
|
|
|
|
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 (voller Stack inkl. Geo; migrate via Entrypoint)
|
|
|
|
deploy-core: ## build + up-core (App + Postgres, ohne Geo; Geo später per 'make data' + 'make up')
|
|
$(MAKE) up-core
|
|
|
|
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
|