hot fix #2 dev day #70

This commit is contained in:
Tomas Dvorak
2025-10-24 16:28:31 +02:00
parent d7eb938d3a
commit 80f833b926
21 changed files with 115 additions and 17 deletions
+2 -2
View File
@@ -1,10 +1,10 @@
REACT_APP_API_URL=http://localhost:8080/api/v1
REACT_APP_API_URL=/api/v1
REACT_APP_NAME=Fotbal Club Manager
REACT_APP_ENV=development
# FACR API Configuration - Local instance
# Backend exposes the FACR proxy under /api/v1/facr
REACT_APP_FACR_API_BASE_URL=http://localhost:8080/api/v1/facr
REACT_APP_FACR_API_BASE_URL=/api/v1/facr
REACT_APP_FACR_API_TIMEOUT=5000 # 5 seconds
REACT_APP_FACR_CACHE_TTL=3600000 # 1 hour in milliseconds
+5 -3
View File
@@ -1,12 +1,14 @@
REACT_APP_API_URL=http://localhost:8080/api/v1
REACT_APP_API_URL=/api/v1
# Alternatively, you can set only the backend origin and the app will auto-append /api/v1
# REACT_APP_API_BASE_URL=http://localhost:8080
# REACT_APP_API_BASE_URL=https://api.example.com
# Optional: force assets (uploads, dist) to a specific domain (e.g., files.tdvorak.dev)
# REACT_APP_ASSET_BASE_URL=https://files.example.com
REACT_APP_NAME=Fotbal Club Manager
REACT_APP_ENV=development
# FACR API Configuration - Local instance
# Backend exposes the FACR proxy under /api/v1/facr
REACT_APP_FACR_API_BASE_URL=http://localhost:8080/api/v1/facr
REACT_APP_FACR_API_BASE_URL=/api/v1/facr
REACT_APP_FACR_API_TIMEOUT=5000 # 5 seconds
REACT_APP_FACR_CACHE_TTL=3600000 # 1 hour in milliseconds
+32
View File
@@ -86,6 +86,38 @@ server {
proxy_busy_buffers_size 8k;
}
# Proxy backend-served assets so the frontend can use relative URLs
location /uploads/ {
proxy_pass http://backend:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Allow long cache; backend may set ETag/Last-Modified
add_header Cache-Control "public, max-age=2592000";
}
location /dist/ {
proxy_pass http://backend:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Cache-Control "public, max-age=2592000";
}
location /cache/ {
proxy_pass http://backend:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Cache-Control "public, max-age=600";
}
# Error pages
error_page 500 502 503 504 /50x.html;
location = /50x.html {
+4 -2
View File
@@ -4,15 +4,17 @@ import { getToken } from '../utils/auth';
// Resolve API URL. Some code uses REACT_APP_API_URL (full api path including /api/v1),
// others set REACT_APP_API_BASE_URL (backend origin). Normalize so baseURL always points to API root.
const envApiUrl = process.env.REACT_APP_API_URL || process.env.REACT_APP_API_BASE_URL;
let API_URL = envApiUrl || 'http://localhost:8080/api/v1';
let API_URL = envApiUrl || '/api/v1';
// If the provided base looks like a backend origin (no /api/), append /api/v1
try {
const maybe = new URL(API_URL);
const maybe = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : undefined);
if (!/\/api\//.test(maybe.pathname)) {
// ensure single trailing slash then append api/v1
maybe.pathname = maybe.pathname.replace(/\/$/, '') + '/api/v1';
API_URL = maybe.toString();
} else {
API_URL = maybe.toString();
}
} catch {
// If URL parsing fails, keep API_URL as-is
+18 -6
View File
@@ -8,13 +8,25 @@ export function assetUrl(pathOrUrl?: string | null): string | undefined {
if (/^(?:https?:)?\/\//i.test(pathOrUrl) || /^data:/i.test(pathOrUrl)) {
return pathOrUrl;
}
// Rewrite known backend-served asset paths (/uploads, /dist)
// Known backend-served asset paths (/uploads, optionally /dist)
if (pathOrUrl.startsWith('/uploads') || pathOrUrl.startsWith('/dist')) {
const base = process.env.REACT_APP_API_BASE_URL || process.env.REACT_APP_API_URL || 'http://localhost:8080/api/v1';
// We want the backend origin, not the API path. Construct from the base.
const baseUrl = new URL(base);
baseUrl.pathname = '/';
return new URL(pathOrUrl, baseUrl).toString();
// 1) Explicit override wins
const explicit = process.env.REACT_APP_ASSET_BASE_URL || process.env.REACT_APP_API_BASE_URL || process.env.REACT_APP_API_URL || '';
if (explicit) {
const baseUrl = new URL(explicit, typeof window !== 'undefined' ? window.location.origin : undefined);
baseUrl.pathname = '/';
return new URL(pathOrUrl, baseUrl).toString();
}
// 2) Local dev/IP: talk to backend:8080 directly
if (typeof window !== 'undefined') {
const { protocol, hostname } = window.location;
const isLocal = hostname === 'localhost' || /^\d{1,3}(\.\d{1,3}){3}$/.test(hostname);
if (isLocal) {
return `${protocol}//${hostname}:8080${pathOrUrl}`;
}
}
// 3) Production/domain: keep relative so frontend Nginx/Cloudflared path proxy forwards to backend
return pathOrUrl;
}
// Otherwise return as-is (relative or other paths)
return pathOrUrl;