This commit is contained in:
eric
2026-06-07 23:57:52 -05:00
parent 6d479c9f94
commit 47b1ae8514
56 changed files with 4163 additions and 874 deletions

95
config/remote-services.ts Normal file
View File

@@ -0,0 +1,95 @@
/**
* 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 公开文件 URLhttps://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}`,
} 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,
};
}