{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "Yarp": "Information" } }, "AllowedHosts": "*", "Cors": { "Origins": [ "http://localhost:5173", "http://127.0.0.1:5173" ] }, "Jwt": { "Secret": "REPLACE_ME", "Issuer": "migu.server", "Audience": "migu.client", "LifetimeMinutes": 1440 }, "Internal": { "Token": "REPLACE_ME" }, "_comment_SimpleLite": "登录后拉起 SimpleLite;改路径请编辑下方 SimpleLite 节点。诊断: http://localhost:8080/api/health/simplelite", "SimpleLite": { "Enabled": true, "ExecutablePath": "D:\\工作\\stand\\SimpleLite\\SimpleLite.exe", "WorkingDirectory": "D:\\工作\\stand\\SimpleLite", "Arguments": "", "ReadinessTimeoutMs": 15000, "ReadinessPollIntervalMs": 250, "ProjectionPort": 8222, "FollowParent": false }, "Auth": { "Users": { "admin": { "Password": "admin" }, "ops": { "Password": "ops" } } }, "_comment_Ops": "运维操作真实下发映射(M4)。opCode → 'kind:Method',Method 必须是 SimpleLite 反射 [MethodMember] 的真实方法名(车辆 kind=car,见 Car.cs:OnlineCar/OfflineCar/DisableCar/EnableCar/Repair/Blown/Reset 等;任务 kind=mission)。运营白名单的 pause/resume/gohome/manualCharge 内核暂无一一对应方法——留空则仅记审计并向前端如实返回『未下发』,按现场内核能力填写后即真实生效。示例: 'ops.car.gohome': 'car:Reset'", "Ops": { "Dispatch": { } }, "_comment_Ota": "车辆 OTA:包与任务落盘 DataRoot;WatchDog:9776。拉包时车会 POST 到 WatchDog 配置的 serverIP:ReceivePort/upload-mdcs/*(默认 8000,与旧 Electron OTA 一致)。请把各车 watch_dog.json 的 serverIP 设为本机局域网 IP。", "Ota": { "DataRoot": "data/ota", "WatchDogPort": 9776, "ReceivePort": 8000, "RequestTimeoutMs": 60000, "UploadTimeoutMs": 600000, "PublicBaseUrl": "" }, "_comment_ReverseProxy": "sl-route 兜底 AnyAuthed(投影只读 + SSE)。管理面路径(map-edit / ai-config / reflection 写操作)单独拆路由挂 PlatformScope,防止运营账号经反代直达地图编辑与任意反射调用。", "ReverseProxy": { "Routes": { "sl-mapedit-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "PlatformScope", "Order": -2, "Match": { "Path": "/api/sl/projection/map-edit/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "sl-aiconfig-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "PlatformScope", "Order": -2, "Match": { "Path": "/api/sl/projection/ai-config/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "sl-assistant-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "PlatformScope", "Order": -2, "Match": { "Path": "/api/sl/projection/assistant/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "sl-reflection-selection-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "AnyAuthed", "Order": -3, "Match": { "Path": "/api/sl/projection/reflection/selection/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "sl-reflection-write-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "PlatformScope", "Order": -1, "Match": { "Path": "/api/sl/projection/reflection/{**catch-all}", "Methods": [ "POST", "PUT", "PATCH", "DELETE" ] }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "sl-route": { "ClusterId": "sl-cluster", "AuthorizationPolicy": "AnyAuthed", "Match": { "Path": "/api/sl/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/api/sl" } ] }, "vrender-route": { "ClusterId": "vrender-cluster", "Match": { "Path": "/vr/{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/vr" } ] } }, "Clusters": { "sl-cluster": { "Destinations": { "sl1": { "Address": "http://127.0.0.1:8222/" } } }, "vrender-cluster": { "Destinations": { "vr1": { "Address": "http://127.0.0.1:8223/" } } } } }, "Database": { "Provider": "sqlite", "SchemaMode": "Migrate", "ApplyDataMigratorsOnStartup": true }, "ConnectionStrings": { "Platform": "Data Source=data/platform.db" } }