feat: Grundgeruest fertigstellen (Backend/Frontend/K8s)

Backend: Prisma-Client auf prisma-client-js + Driver-Adapter (@prisma/adapter-pg)
umgestellt (Prisma 7 verlangt Adapter, ESM-Client brach an Jest), erste Migration
erzeugt und angewendet, /api/v1 Versioning, Swagger unter /api/v1/docs, Helmet,
globale ValidationPipe, PrismaModule, HealthModule (/health, /health/ready mit
DB-Check), tsconfig.build.json Root-Dir-Fix (dist/main.js statt dist/src/main.js).

Frontend: Tailwind v4 + shadcn/ui initialisiert, TanStack Query Provider, PWA
Manifest (app/manifest.ts), Vitest + Testing Library Setup, next.config output
standalone.

deploy/k8s: Dockerfiles (Backend/Frontend, Multi-Stage) + Deployment/Service/
Ingress/ConfigMap/Secret-Vorlagen fuer beide Projekte.

Lokale Dev-/Test-Postgres-Instanz unter ApiCore-Backend/.devdb angelegt (eigene
Rolle, kein bestehendes Passwort noetig), .env/.env.test lokal befuellt.

Lint, Typecheck, Tests und Build sind fuer Backend und Frontend gruen; Server
wurde lokal gestartet und /health, /health/ready, /api/v1/docs manuell verifiziert.
This commit is contained in:
Nick Szaunig committed 2026-08-21 05:17:26 +02:00
1 parent c4a2d0648e
commit eae3fea957
57 files changed
+15114 -35

No files matched your search

@@ -0,0 +1,8 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: apicore-backend-config
data:
PORT: "3001"
JWT_ACCESS_EXPIRES_IN: "15m"
JWT_REFRESH_EXPIRES_IN: "7d"
+45
View File
@@ -0,0 +1,45 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: apicore-backend
labels:
app: apicore-backend
spec:
replicas: 2
selector:
matchLabels:
app: apicore-backend
template:
metadata:
labels:
app: apicore-backend
spec:
containers:
- name: apicore-backend
image: REGISTRY/apicore-backend:latest
ports:
- containerPort: 3001
envFrom:
- configMapRef:
name: apicore-backend-config
- secretRef:
name: apicore-backend-secret
livenessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /health/ready
port: 3001
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
+19
View File
@@ -0,0 +1,19 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: apicore-backend
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: api.apicore.example.com
http:
paths:
- path: /()(.*)
pathType: ImplementationSpecific
backend:
service:
name: apicore-backend
port:
number: 80
+11
View File
@@ -0,0 +1,11 @@
# Vorlage – keine echten Werte. Kopieren, echte Werte setzen, per `kubectl apply` außerhalb
# der Versionskontrolle anwenden (oder ueber Secret-Manager/Sealed-Secrets im Cluster).
apiVersion: v1
kind: Secret
metadata:
name: apicore-backend-secret
type: Opaque
stringData:
DATABASE_URL: "postgresql://user:password@host:5432/apicore?schema=public"
JWT_ACCESS_SECRET: "change-me-access-secret"
JWT_REFRESH_SECRET: "change-me-refresh-secret"
+11
View File
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Service
metadata:
name: apicore-backend
spec:
selector:
app: apicore-backend
ports:
- port: 80
targetPort: 3001
type: ClusterIP
@@ -0,0 +1,6 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: apicore-frontend-config
data:
NEXT_PUBLIC_API_URL: "https://api.apicore.example.com/api/v1"
+37
View File
@@ -0,0 +1,37 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: apicore-frontend
labels:
app: apicore-frontend
spec:
replicas: 2
selector:
matchLabels:
app: apicore-frontend
template:
metadata:
labels:
app: apicore-frontend
spec:
containers:
- name: apicore-frontend
image: REGISTRY/apicore-frontend:latest
ports:
- containerPort: 3000
envFrom:
- configMapRef:
name: apicore-frontend-config
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
+17
View File
@@ -0,0 +1,17 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: apicore-frontend
spec:
ingressClassName: nginx
rules:
- host: apicore.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: apicore-frontend
port:
number: 80
+11
View File
@@ -0,0 +1,11 @@
apiVersion: v1
kind: Service
metadata:
name: apicore-frontend
spec:
selector:
app: apicore-frontend
ports:
- port: 80
targetPort: 3000
type: ClusterIP