Der Reverse-Proxy des Frontend-Containers hatte kein client_max_body_size (Default 1 MB) → 413 bei größeren Uploads (RennmausPro-Backups, Foto-Anhänge, und v. a. resolved_import.json ~6,6 MB für /api/import/ingest-resolved/upload). Limit auf 50m angehoben, damit der Prod-Re-Ingest per HTTP-Upload ohne SSH funktioniert. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
53 lines
1.8 KiB
Docker
53 lines
1.8 KiB
Docker
# Build context: repo root (Dockerfile liest aus gerbil-manager-web/).
|
|
# docker build -f gerbil-manager-web/Dockerfile -t gerbilmanager-frontend .
|
|
#
|
|
# Produktion: kein VITE_API_BASE_URL nötig — client.ts fällt auf '/api' zurück,
|
|
# nginx proxyt /api/* transparent zum API-Container (keine Host-Kopplung zur Build-Zeit).
|
|
|
|
FROM node:22-alpine AS build
|
|
WORKDIR /app
|
|
COPY gerbil-manager-web/package.json gerbil-manager-web/package-lock.json ./
|
|
RUN npm ci
|
|
COPY gerbil-manager-web/ .
|
|
RUN npm run build
|
|
|
|
FROM nginx:alpine
|
|
COPY --from=build /app/dist /usr/share/nginx/html
|
|
|
|
# nginx: SPA-Fallback + Reverse-Proxy für /api, /scalar, /openapi zum API-Container.
|
|
RUN printf 'server {\n\
|
|
listen 80;\n\
|
|
root /usr/share/nginx/html;\n\
|
|
index index.html;\n\
|
|
\n\
|
|
# Upload-Groesse: erlaubt grosse /api-Uploads (RennmausPro-Backups, Foto-Anhaenge,\n\
|
|
# resolved_import.json fuer den Prod-Re-Ingest via /api/import/ingest-resolved/upload).\n\
|
|
client_max_body_size 50m;\n\
|
|
\n\
|
|
# API-Aufrufe: /api/* -> API-Container /* (Praefix wird entfernt)\n\
|
|
location /api/ {\n\
|
|
proxy_pass http://api:8080/;\n\
|
|
proxy_set_header Host $host;\n\
|
|
proxy_set_header X-Real-IP $remote_addr;\n\
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\
|
|
}\n\
|
|
\n\
|
|
# Scalar API-Doku und OpenAPI-Spec direkt vom Backend\n\
|
|
location /scalar {\n\
|
|
proxy_pass http://api:8080/scalar;\n\
|
|
proxy_set_header Host $host;\n\
|
|
}\n\
|
|
location /openapi/ {\n\
|
|
proxy_pass http://api:8080/openapi/;\n\
|
|
proxy_set_header Host $host;\n\
|
|
}\n\
|
|
\n\
|
|
# SPA-Fallback: alle anderen Pfade laden index.html (React Router)\n\
|
|
location / {\n\
|
|
try_files $uri $uri/ /index.html;\n\
|
|
}\n\
|
|
}\n' > /etc/nginx/conf.d/default.conf
|
|
|
|
EXPOSE 80
|
|
CMD ["nginx", "-g", "daemon off;"]
|