# 配置与部署 ## 配置项 | 配置 | 默认 | 含义 | |---|---|---| | ConnectionStrings:DefaultConnection | LocalDB / EARSystem | 开发数据库;生产切换 SQL Server Express | | Demo:Enabled | Development=true,其余=false | 是否生成/展示快捷演示账号入口;Production 始终禁止快捷登录与自动生成 | | Demo:Longitude / Latitude | 120.155 / 30.274 | 新建演示库的杭州 GCJ-02 中心;修改后不会移动已有样本 | | AMap:WebServiceKey | 空 | 服务器坐标转换、地理编码与周边搜索 | | AMap:BrowserKey | 空 | JS API 2.0 Key,公开于需要地图的页面 | | AMap:JsSecurityCode | 空 | 安全代理补充的服务器密钥 | | AMap:AllowExternalReferences | false | 预留配置;本版不启用第三方地点持久化 | | BootstrapAdmin:Email / Password | 空 | 首次部署创建管理员,之后不会改写已有账号密码 | | AllowedHosts | localhost;127.0.0.1 | 部署时设置实际站点域名 | Development 配置支持 dotnet user-secrets。生产通过受保护的环境变量或部署系统提供配置。环境变量使用双下划线,例如 AMap__WebServiceKey 和 ConnectionStrings__DefaultConnection。不要把真实密钥或数据库密码写进仓库。 时间统一以 UTC 保存,查询与周报使用北京时间。SQL 表中主要时间字段存 UTC ticks,DemoSeededAt 为 UTC datetimeoffset;这些均由 EF 映射,无须应用自行转换。 ## LocalDB 与迁移 开发连接: ~~~text Server=(localdb)\MSSQLLocalDB;Database=EARSystem;Trusted_Connection=True;TrustServerCertificate=True ~~~ Development 启动自动迁移;生产不自动迁移。也可显式执行: ~~~powershell dotnet tool restore dotnet ef database update --project src/EARSystem.Infrastructure --startup-project src/EARSystem.Web ~~~ DesignTimeDbContextFactory 读取 ConnectionStrings__DefaultConnection 环境变量,否则使用上述开发连接。**部署迁移时务必设置该变量**;设计时工厂不读取 Web 的 user-secrets。 包含两份迁移:初始业务/Identity 模型,演示数据完成标记。标记避免重启后重新生成用户已经删除的示例内容。 演示生成器使用固定随机种子构造虚构地点、波动自评、留空日期和体验;所有密码随机生成。需要重新演示一套完整样本时,设置新的开发库名再运行 --seed-demo;该工具不执行删除或重置。 ## Windows IIS + SQL Server Express 以下为部署流程,当前交付没有向公网发布。生产数据库应与演示库分开。 1. 安装 IIS 和与 .NET 10 对应的 ASP.NET Core Hosting Bundle;为应用创建独立站点及应用池。Hosting Bundle 为 IIS 提供 ASP.NET Core 模块,发布后的 web.config 负责启动应用。[微软 IIS 部署文档](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/?view=aspnetcore-10.0) 2. 建立 SQL Server Express 数据库 EARSystemProd,给应用所用数据库身份最小必要的业务读写权限;迁移使用单独具有建表权限的部署身份。启用可信服务器证书。 3. 在管理员终端设置迁移连接字符串并执行迁移。示意连接为 Server=YOUR-SERVER\SQLEXPRESS;Database=EARSystemProd;Integrated Security=True;Encrypt=True;TrustServerCertificate=False。请替换实际服务器;不要在共享终端回显连接凭据。 4. 发布应用: ~~~powershell dotnet publish src/EARSystem.Web -c Release -o artifacts/publish ~~~ 5. 将发布目录配置为 IIS 站点根目录;配置可信 HTTPS 证书、实际主机名和防火墙规则。本站路由以根目录为基准,第一版不支持部署在虚拟子路径下。 6. 为站点配置 ASPNETCORE_ENVIRONMENT=Production、AllowedHosts、ConnectionStrings__DefaultConnection、AMap__*。保持 Demo__Enabled=false。 7. 首次启动前配置 BootstrapAdmin__Email 和一个符合 Identity 要求的强密码(至少 10 位,大小写、数字、符号)。成功建立管理员后,从部署环境移除 BootstrapAdmin__Password。已存在的管理员不会在后续启动被改密。 8. 给应用池身份发布目录的读取权限和 App_Data/keys 的读写权限;该目录用于持久化 Cookie 的 Data Protection 密钥。服务器静态文件只从 wwwroot 提供,App_Data 不可作为公共目录映射。 9. 访问 HTTPS 站点,创建普通用户,依次完成日记、在线查询、独立地点收藏、体验和回顾验收。进入管理员后台维护具有独立授权来源的地点目录。 IIS 会转发 HTTPS 协议;本应用在 Production 启用 HSTS、HTTPS 重定向以及 Secure Cookie。如果部署在其他反向代理后,需要先配置可信代理和 ForwardedHeaders,再使用重定向;当前交付以 IIS 部署为准。 SQL Server 的 Integrated Security 需要授予 IIS 应用池身份对应权限;远程数据库可采用专用服务账户或数据库身份。不要沿用 LocalDB 的 TrustServerCertificate=True 作为生产证书策略。 ## 运行与恢复 - 外部查询 8 秒超时;每个账号的地图相关入口限流 30 次/分钟,超过返回 429。 - 推荐历史只存目标、模式、算法版本、耗时和独立地点引用;不存查询坐标、距离分项、日记正文或实时供应商响应。 - SQL 日志不启用敏感数据输出;地图 HttpClient 请求日志关闭,避免记录带 Key 的 URL。 - 日记和体验用版本号检查并发。遇到 409,界面保留输入,重新加载记录后再提交。 - 保存体验并同步日记在同一事务内执行。取消同步或删除体验时保留已有日记内容,并解除关联。 - 有效氛围采用每个用户最新的一份评分统计;数据库另限制同用户同地点同一天一份体验。撤回同意、删除或修改后,下次查询重新聚合。 - 定期备份数据库和 App_Data/keys;恢复时保留一致的 Data Protection 密钥,否则旧 Cookie 会失效。生产备份与恢复操作由部署者执行。 ## 当前集成边界 提供真实高德接入代码和模拟 HTTP 测试;本次没有真实 Key,因此未完成真实配额、地图瓦片和跨设备 HTTPS 定位验收。现场演示可以全程使用演示模式;正式启用在线模式前按上述步骤进行真实服务验收。 在线地点营业状态当前显示未知,不对复杂营业时间文本作确定判断。未知价格保留,未知评分使用中性值;勾选“仅营业中”时,未知营业状态会被过滤。 演示反馈不计入 Collected 地点的真实氛围。独立样本基线保留来源说明,用户文字感受仅本人可见;匿名贡献只参与六个结构化氛围均值。