xiangning 2f32b74687 feat(config): Consul ACL token 支持 + 8520 端口
- Program.cs 加 Consul:Token 配置(ACL 开启后 api 必须带 token)
- 默认端口改 8520(非标准,配合安全组+ACL 三重防护)
- token 通过环境变量注入(compose Consul__Token),不进代码
2026-07-17 17:34:13 +08:00

55 lines
2.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using BuildFlow.Host;
using BuildFlow.Host.Configuration;
using OpenTelemetry.Logs;
using Winton.Extensions.Configuration.Consul;
var builder = WebApplication.CreateBuilder(args);
// 敏感配置(连接串/密钥)从本地 appsettings.Secrets.json 覆盖,该文件不入库(见 .gitignore)。
// 不存在时 optional:true 静默跳过,回退到 appsettings.json 中的占位符。
builder.Configuration.AddJsonFile("appsettings.Secrets.json", optional: true, reloadOnChange: true);
// Consul KV 配置中心(优先级最高,覆盖本地 json + secrets,作为生产配置真相源)。
// 加载顺序决定优先级:后注册的覆盖先注册的,故 Consul 在 Secrets 之后。
// 鸡生蛋问题:Consul 地址本身用环境变量 Consul__Host 注入(compose 配置),
// 默认回退到 middleware 公网地址。Consul 不可用时 Optional=true 回退本地 json,不阻断启动。
var consulHost = builder.Configuration["Consul:Host"] ?? "http://43.134.235.58:8520";
var consulToken = builder.Configuration["Consul:Token"] ?? "";
builder.Configuration.AddConsul(
"buildflow/",
options =>
{
options.ConsulConfigurationOptions = co =>
{
co.Address = new Uri(consulHost);
// ACL token:Consul 开启了 ACL(default deny),api 必须带专用 token 才能读写 KV
// token 通过环境变量 Consul:Token 注入(compose),不进代码/镜像
if (!string.IsNullOrEmpty(consulToken))
co.Token = consulToken;
};
options.Optional = true; // Consul 不可用不阻断启动,回退本地 appsettings
options.ReloadOnChange = true; // KV 变更自动刷新 IConfiguration(热重载基础)
options.OnLoadException = ex => ex.Ignore = true; // 容错:Consul 抖动不影响应用
});
// OTel 日志导出
var otlpEndpoint = builder.Configuration["OpenTelemetry:OtlpEndpoint"] ?? "http://localhost:4316";
builder.Logging.AddOpenTelemetry(logging =>
{
logging.AddOtlpExporter(options => options.Endpoint = new Uri(otlpEndpoint));
});
// ABP 模块化引导:
// 1) 注册 ObjectAccessor,打通 ABP 模块与 ASP.NET Core 管线(模块内 MapHub/UseMiddleware 依赖)
// 2) 按 [DependsOn] 加载 platform/rag/file/im/workflow 各模块的 Application/Infrastructure 层
builder.Services.AddHostObjectAccessors();
await builder.AddApplicationAsync<BuildFlowHostModule>();
var app = builder.Build();
await app.InitializeApplicationAsync();
// 启动期数据库初始化:迁移各库 + IM MongoDB 建索引 + 种子数据(单库失败不影响其他库)
await DatabaseInitializer.RunAsync(app.Services);
await app.RunAsync();