/** * Windows 本地开发时,如何连接 Linux 线上服务。 * * 线上服务器(82.157.112.245 / nomadro.cn)架构: * - PocketBase:公网 https://pocketbase.nomadro.cn → 内网 127.0.0.1:8090 * - FastAPI:公网 http://api.nomadro.cn → 内网 127.0.0.1:8000 * - MinIO S3 API:仅内网 127.0.0.1:9100;公网 https://minio.nomadro.cn/hackrobot/ 只代理读路径 * - MinIO 公开文件 URL:https://minio.nomadro.cn/hackrobot/{key} * * Windows 本地推荐: * 1. 跑本地 Next.js + FastAPI * 2. POCKETBASE_URL 用 https://pocketbase.nomadro.cn * 3. MinIO 用 scripts/dev-tunnel.py 把本地 9100 隧道到服务器 9100 */ import { IS_DEVELOPMENT } from "./runtime-env"; export const REMOTE_ROOT_DOMAIN = process.env.ROOT_DOMAIN || process.env.NEXT_PUBLIC_ROOT_DOMAIN || "nomadro.cn"; export const REMOTE_SERVICE_URLS = { pocketbase: `https://pocketbase.${REMOTE_ROOT_DOMAIN}`, api: `http://api.${REMOTE_ROOT_DOMAIN}`, minioPublic: `https://minio.${REMOTE_ROOT_DOMAIN}/hackrobot`, site: `https://${REMOTE_ROOT_DOMAIN}`, mirotalk: `https://mirotalk.${REMOTE_ROOT_DOMAIN}`, lounge: `https://lounge.${REMOTE_ROOT_DOMAIN}`, listmonk: `https://listmonk.${REMOTE_ROOT_DOMAIN}`, ntfy: `https://ntfy.${REMOTE_ROOT_DOMAIN}`, } as const; /** 当前是否为「本地前端 + 远程服务」开发模式 */ export function isRemoteDevMode(): boolean { if (!IS_DEVELOPMENT) return false; const pb = (process.env.POCKETBASE_URL || "").trim(); const minio = (process.env.MINIO_ENDPOINT || "").trim(); return ( pb.includes("nomadro.cn") || pb.includes("pocketbase.") || minio === "127.0.0.1" || minio.includes("nomadro.cn") ); } export function resolvePocketBaseUrl(): string { return ( process.env.POCKETBASE_URL || process.env.NEXT_PUBLIC_POCKETBASE_URL || REMOTE_SERVICE_URLS.pocketbase ).replace(/\/$/, ""); } export function resolveMinioEndpoint(): { endPoint: string; port: number; useSSL: boolean; } { const host = (process.env.MINIO_ENDPOINT || "127.0.0.1").replace(/^https?:\/\//, ""); const isLocalHost = host === "127.0.0.1" || host === "localhost"; const isDomain = host.includes("."); if (isDomain && !isLocalHost) { return { endPoint: host, port: Number(process.env.MINIO_PORT || "443"), useSSL: process.env.MINIO_USE_SSL !== "false", }; } return { endPoint: host, port: Number(process.env.MINIO_PORT || "9100"), useSSL: process.env.MINIO_USE_SSL === "true", }; } export function resolveMinioConnection(options?: { bucket?: string }): { endPoint: string; port: number; useSSL: boolean; bucket: string; publicUrl: string; } { const bucket = options?.bucket || process.env.MINIO_BUCKET || "hackrobot"; const conn = resolveMinioEndpoint(); const publicUrl = ( process.env.MINIO_PUBLIC_URL || process.env.NEXT_PUBLIC_MINIO_PUBLIC_URL || `${REMOTE_SERVICE_URLS.minioPublic}` ).replace(/\/$/, ""); return { ...conn, bucket, publicUrl, }; }