Try a unified api endpoint
This commit is contained in:
@@ -47,8 +47,11 @@ PROVIDER_BASE_URL_ALLOWLIST=[]
|
|||||||
|
|
||||||
PUBLIC_BASE_URL=http://localhost:8000
|
PUBLIC_BASE_URL=http://localhost:8000
|
||||||
CORS_ORIGINS=["http://localhost:5173","http://localhost:3000"]
|
CORS_ORIGINS=["http://localhost:5173","http://localhost:3000"]
|
||||||
# Used at build time for production frontend image, and at runtime in development.
|
# Leave empty to use same-origin /api/v1 through the frontend proxy.
|
||||||
|
# Set an absolute URL only when you intentionally want split-origin frontend/API traffic.
|
||||||
VITE_API_BASE=
|
VITE_API_BASE=
|
||||||
|
# Development-only Vite proxy target. Docker compose sets this to http://api:8000 automatically.
|
||||||
|
VITE_API_PROXY_TARGET=http://localhost:8000
|
||||||
# Development-only Vite host allowlist override.
|
# Development-only Vite host allowlist override.
|
||||||
VITE_ALLOWED_HOSTS=
|
VITE_ALLOWED_HOSTS=
|
||||||
|
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ Use `.env.example` as baseline. The table below documents user-managed settings
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `APP_ENV` | `development` | `production` |
|
| `APP_ENV` | `development` | `production` |
|
||||||
| `HOST_BIND_IP` | `127.0.0.1` or local LAN bind if needed | `127.0.0.1` (publish behind proxy only) |
|
| `HOST_BIND_IP` | `127.0.0.1` or local LAN bind if needed | `127.0.0.1` (publish behind proxy only) |
|
||||||
| `PUBLIC_BASE_URL` | `http://localhost:8000` | `https://api.example.com` |
|
| `PUBLIC_BASE_URL` | `http://localhost:8000` or same-origin frontend host when proxying API through frontend | `https://app.example.com` when frontend proxies `/api`, or dedicated API origin if you intentionally keep split-origin routing |
|
||||||
| `VITE_API_BASE` | empty for host-derived `http://<frontend-host>:8000/api/v1`, or explicit local URL | `https://api.example.com/api/v1` (build-time value for production frontend image) |
|
| `VITE_API_BASE` | empty to use same-origin `/api/v1` through frontend proxy, or explicit local URL when bypassing proxy | empty or `/api/v1` for same-origin production routing; only use `https://api.example.com/api/v1` when you intentionally keep split-origin frontend/API traffic |
|
||||||
| `VITE_ALLOWED_HOSTS` | optional comma-separated hostnames, for example `localhost,docs.lan` | optional comma-separated public frontend hostnames, for example `app.example.com` |
|
| `VITE_ALLOWED_HOSTS` | optional comma-separated hostnames, for example `localhost,docs.lan` | optional comma-separated public frontend hostnames, for example `app.example.com` |
|
||||||
| `CORS_ORIGINS` | `["http://localhost:5173","http://localhost:3000"]` | exact frontend origins only, for example `["https://app.example.com"]` |
|
| `CORS_ORIGINS` | `["http://localhost:5173","http://localhost:3000"]` | exact frontend origins only, for example `["https://app.example.com"]` |
|
||||||
| `REDIS_URL` | `redis://:<password>@redis:6379/0` in isolated local network | `rediss://:<password>@redis.internal:6379/0` |
|
| `REDIS_URL` | `redis://:<password>@redis:6379/0` in isolated local network | `rediss://:<password>@redis.internal:6379/0` |
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ services:
|
|||||||
VITE_API_BASE: ${VITE_API_BASE:-}
|
VITE_API_BASE: ${VITE_API_BASE:-}
|
||||||
environment:
|
environment:
|
||||||
VITE_API_BASE: ${VITE_API_BASE:-}
|
VITE_API_BASE: ${VITE_API_BASE:-}
|
||||||
|
VITE_API_PROXY_TARGET: ${VITE_API_PROXY_TARGET:-http://api:8000}
|
||||||
CORS_ORIGINS: '${CORS_ORIGINS:-["http://localhost:5173","http://localhost:3000"]}'
|
CORS_ORIGINS: '${CORS_ORIGINS:-["http://localhost:5173","http://localhost:3000"]}'
|
||||||
VITE_ALLOWED_HOSTS: ${VITE_ALLOWED_HOSTS:-}
|
VITE_ALLOWED_HOSTS: ${VITE_ALLOWED_HOSTS:-}
|
||||||
# ports:
|
# ports:
|
||||||
|
|||||||
@@ -2,10 +2,20 @@ server {
|
|||||||
listen 5173;
|
listen 5173;
|
||||||
listen [::]:5173;
|
listen [::]:5173;
|
||||||
server_name _;
|
server_name _;
|
||||||
|
client_max_body_size 100m;
|
||||||
|
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://api:8000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import type {
|
|||||||
} from '../types';
|
} from '../types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves backend base URL from environment with host-derived HTTP fallback.
|
* Resolves backend base URL from environment with same-origin proxy fallback.
|
||||||
*/
|
*/
|
||||||
function resolveApiBase(): string {
|
function resolveApiBase(): string {
|
||||||
const envValue = import.meta.env?.VITE_API_BASE;
|
const envValue = import.meta.env?.VITE_API_BASE;
|
||||||
@@ -27,8 +27,8 @@ function resolveApiBase(): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof window !== 'undefined' && window.location?.hostname) {
|
if (typeof window !== 'undefined' && window.location?.origin) {
|
||||||
return `${window.location.protocol}//${window.location.hostname}:8000/api/v1`;
|
return '/api/v1';
|
||||||
}
|
}
|
||||||
return 'http://localhost:8000/api/v1';
|
return 'http://localhost:8000/api/v1';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,11 +74,19 @@ function buildAllowedHosts(env: Record<string, string>): string[] | undefined {
|
|||||||
export default defineConfig(({ mode }) => {
|
export default defineConfig(({ mode }) => {
|
||||||
const env = loadEnv(mode, process.cwd(), '');
|
const env = loadEnv(mode, process.cwd(), '');
|
||||||
const allowedHosts = buildAllowedHosts(env);
|
const allowedHosts = buildAllowedHosts(env);
|
||||||
|
const apiProxyTarget = env.VITE_API_PROXY_TARGET?.trim() || 'http://localhost:8000';
|
||||||
|
|
||||||
return {
|
return {
|
||||||
server: {
|
server: {
|
||||||
host: '0.0.0.0',
|
host: '0.0.0.0',
|
||||||
port: 5173,
|
port: 5173,
|
||||||
|
proxy: {
|
||||||
|
'/api': {
|
||||||
|
target: apiProxyTarget,
|
||||||
|
changeOrigin: false,
|
||||||
|
secure: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
...(allowedHosts ? { allowedHosts } : {}),
|
...(allowedHosts ? { allowedHosts } : {}),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user