feat: 补充数据库脚本和配置
This commit is contained in:
@@ -1,62 +1,57 @@
|
||||
# TODO Roadmap
|
||||
# TODO Roadmap
|
||||
|
||||
说明:本清单覆盖当前阶段的骨架搭建与核心基础能力(不含部署与CI/CD,留到项目跑通后再做)。
|
||||
> 当前列表为原 11 号文档中的待办事项,已迁移到此处并统一以复选框形式标记。若无特殊说明,均尚未完成。
|
||||
|
||||
## A. 基础骨架与规范
|
||||
- [x] 统一返回结果/异常处理中间件(Shared.Web)
|
||||
- [x] 模型验证、验证失败统一输出(Shared.Web)
|
||||
- [x] 统一日志(Serilog)与请求日志/TraceId(Shared.Web)
|
||||
- [x] API 版本化与分组(AdminApi、MiniApi、UserApi)
|
||||
- [x] Swagger 定制(鉴权按钮、分组说明、示例)
|
||||
- [x] 安全中间件:Security Headers、CORS 策略(按端区分)
|
||||
## 1. 配置与基础设施(高优)
|
||||
- [x] Development/Production 数据库连接与 Secret 落地(Staging 暂不需要)。
|
||||
- [x] Redis 服务部署完毕并记录配置。
|
||||
- [x] RabbitMQ 服务部署完毕并记录配置。
|
||||
- [x] COS 密钥配置补录完毕。
|
||||
- [ ] OSS 密钥配置补录完毕(待采购)。
|
||||
- [ ] SMS 平台密钥配置补录完毕(待采购)。
|
||||
- [x] WeChat Mini 程序密钥配置补录完毕(AppID:wx30f91e6afe79f405,AppSecret:64324a7f604245301066ba7c3add488e,已同步到 admin/mini 配置并登记更新人)。
|
||||
- [x] PostgreSQL 基础实例部署完毕并记录配置。
|
||||
- [x] Postgres/Redis 接入文档 + IaC/脚本补齐(见 Document/infra/postgres_redis.md 与 deploy/postgres|redis)。
|
||||
- [x] RabbitMQ/Redis/Hangfire storage scripts available (see deploy/postgres and deploy/redis).
|
||||
- [ ] admin/mini/user/gateway 网关域名、证书、CORS 列表整理完成。
|
||||
- [ ] Hangfire Dashboard 启用并新增 Admin 角色验证/网关白名单。
|
||||
|
||||
## B. 认证与权限
|
||||
- [x] JWT 颁发与刷新(AdminApi、MiniApi)
|
||||
- [x] RBAC 权限模型(角色/权限/策略)与特性授权(AdminApi)
|
||||
- [x] 小程序登录(微信 code2Session)并绑定用户账户(MiniApi)
|
||||
- [x] 登录防刷限流(MiniApi)
|
||||
## 2. 数据与迁移(高优)
|
||||
- [ ] App/Identity/Dictionary/Hangfire 四个 DbContext 均生成初始 Migration 并成功 update database。
|
||||
- [ ] 商户/门店/商品/订单/支付/配送等实体与仓储实现完成,提供 CRUD + 查询。
|
||||
- [ ] 系统参数、默认租户、管理员账号、基础字典的种子脚本可重复执行。
|
||||
|
||||
## C. 多租户与参数字典
|
||||
- [x] 多租户中间件:从 Header/域名解析租户(Shared.Web + Tenancy)
|
||||
- [x] EF Core 全局查询过滤(tenant_id)
|
||||
- [x] 参数字典模块(系统参数/业务参数)CRUD 与缓存(Dictionary 模块)
|
||||
## 3. 稳定性与质量
|
||||
- [ ] Dictionary/Identity/Storage/Sms/Messaging/Scheduler 的 xUnit+FluentAssertions 单元测试框架搭建。
|
||||
- [ ] WebApplicationFactory + Testcontainers 拉起 Postgres/Redis/RabbitMQ/MinIO 的集成测试模板。
|
||||
- [ ] .editorconfig、.globalconfig、Roslyn 分析器配置仓库通用规则并启用 CI 检查。
|
||||
|
||||
## D. 数据访问与多数据源
|
||||
- [x] EF Core 10 基础上下文、实体基类、审计字段
|
||||
- [x] 读写分离/多数据源配置(主写、从读)
|
||||
- [x] Dapper 基础设施封装(统计/报表类查询)
|
||||
## 4. 安全与合规
|
||||
- [ ] RBAC 权限、租户隔离、用户/权限洞察 API 完整演示并在 Swagger 中提供示例。
|
||||
- [ ] 登录/刷新流程增加 IP 校验、租户隔离、验证码/频率限制。
|
||||
- [ ] 登录/权限/敏感操作日志可追溯,提供查询接口或 Kibana Saved Search。
|
||||
- [ ] Secret Store/KeyVault/KMS 管理敏感配置,禁止密钥写入 Git/数据库明文。
|
||||
|
||||
## E. 文件与存储
|
||||
- [x] 存储模块抽象(腾讯云COS/七牛云/阿里云OSS)
|
||||
- [x] 上传接口(AdminApi、MiniApi)与签名直传预留
|
||||
- [x] 图片/文件访问安全策略(防盗链、过期签名)
|
||||
## 5. 观测与运维
|
||||
- [ ] TraceId 贯通,并在 Serilog 中输出 Console/File/ELK 三种目标。
|
||||
- [ ] Prometheus exporter 暴露关键指标,/health 探针与告警规则同步推送。
|
||||
- [ ] PostgreSQL 全量/增量备份脚本及一次真实恢复演练报告。
|
||||
|
||||
## F. 短信与消息队列
|
||||
- [x] 短信模块(阿里云/腾讯云 适配占位)与验证码发送
|
||||
- [x] MQ 模块(RabbitMQ)Publisher/Subscriber 抽象
|
||||
- [x] 业务事件定义(订单创建/支付成功等)与事件发布入口
|
||||
## 6. 业务能力补全
|
||||
- [ ] 商户/门店/菜品 API 完成并在 MQ 中投递上架/支付成功事件。
|
||||
- [ ] 配送对接 API 支持下单/取消/查询并完成签名验签中间件。
|
||||
- [ ] 小程序端商品浏览、下单、支付、评价、图片直传等 API 可闭环跑通。
|
||||
|
||||
## G. 调度与定时任务
|
||||
- [x] 调度模块(Quartz/Hangfire 二选一,默认 Hangfire)
|
||||
- [x] 基础任务:订单超时取消、优惠券过期处理、日志清理
|
||||
- [x] 调度面板(后续 AdminUI 对接)
|
||||
## 7. 前后台 UI 对接
|
||||
- [ ] Admin UI 通过 OpenAPI 生成或手写界面,接入 Hangfire Dashboard/MQ 监控只读模式。
|
||||
- [ ] 小程序端完成登录、菜单浏览、下单、支付、物流轨迹、素材直传闭环。
|
||||
|
||||
## H. 第三方配送对接(仅第三方)
|
||||
- [ ] 配送适配抽象(达达/闪送/顺丰同城等)
|
||||
- [ ] 统一下单/取消/查询接口与回调验签
|
||||
- [ ] AdminApi 后台运力单查询与补单
|
||||
## 8. CI/CD 与发布
|
||||
- [ ] CI/CD 流水线覆盖构建、发布、静态扫描、数据库迁移。
|
||||
- [ ] Dev/Staging/Prod 多环境配置矩阵 + 基础设施 IaC 脚本。
|
||||
- [ ] 版本与发布说明模板整理并在仓库中提供示例。
|
||||
|
||||
## I. 网关与横切能力
|
||||
- [x] YARP 路由拆分(/api/admin、/api/mini、/api/user)
|
||||
- [x] 网关级限流与请求日志
|
||||
- [x] 透传鉴权/租户标识与统一错误页
|
||||
|
||||
## J. 测试与质量
|
||||
- [ ] 单元测试工程骨架(xUnit + FluentAssertions)
|
||||
- [ ] 集成测试基座(WebApplicationFactory、测试容器)
|
||||
- [ ] 静态分析与风格规范(.editorconfig)
|
||||
|
||||
## K. 文档与规范落地
|
||||
- [ ] 在文档中补充:仅第三方配送的接口与回调规范
|
||||
- [ ] MiniApi 认证流程图(微信登录)与错误码
|
||||
- [ ] 模块间调用关系图与依赖边界
|
||||
## 9. 文档与知识库
|
||||
- [ ] 接口文档、领域模型、关键约束使用 Markdown 或 API Portal 完整记录。
|
||||
- [ ] 运行手册包含部署步骤、资源拓扑、故障排查手册。
|
||||
- [ ] 安全合规模板覆盖数据分级、密钥管理、审计流程并形成可复用表格。
|
||||
|
||||
@@ -1,49 +1,53 @@
|
||||
# 下一步 TODO(骨架完成后)
|
||||
# 里程碑待办追踪
|
||||
|
||||
说明:当前骨架已覆盖认证、权限、多租户、存储、短信、MQ、调度、网关等基础能力。下面的清单用于进入“可运行/可上线”的补全与质量阶段,可按优先级推进。
|
||||
> 按“小程序版模块规划”划分四个里程碑;每个里程碑只含对应范围的任务,便于分阶段推进。
|
||||
|
||||
## 1. 配置与基础设施落地(高优)
|
||||
- 补充真实配置:数据库/Redis/RabbitMQ/对象存储/SMS/WeChat Mini/身份密钥,并分环境管理(Development/Staging/Production)。
|
||||
- 准备基础设施:PostgreSQL 主从、Redis(哨兵/集群)、RabbitMQ、COS/OSS、Hangfire 存储库;完善 docker-compose 与部署说明。
|
||||
- 网关与服务域名规划:为 admin/mini/user/gateway 配置实际域名、TLS 证书与 CORS 列表。
|
||||
- Hangfire Dashboard 鉴权:开启并加上 Admin 角色校验或网关白名单。
|
||||
---
|
||||
## Phase 1(当前阶段):租户/商家入驻、门店与菜品、扫码堂食、基础下单支付、预购自提、第三方配送骨架
|
||||
- [ ] 管理端租户 API:注册、实名认证、套餐订阅/续费/升降配、审核流,Swagger ≥6 个端点,含审核日志。
|
||||
- [ ] 商家入驻 API:证照上传、合同管理、类目选择,驱动待审/审核/驳回/通过状态机,文件持久在 COS。
|
||||
- [ ] RBAC 模板:平台管理员、租户管理员、店长、店员四角色模板;API 可复制并允许租户自定义扩展。
|
||||
- [ ] 配额与套餐:TenantPackage CRUD、订阅/续费/配额校验(门店/账号/短信/配送单量),超额返回 409 并记录 TenantQuotaUsage。
|
||||
- [ ] 租户运营面板:欠费/到期告警、账单列表、公告通知接口,支持已读状态并在 Admin UI 展示。
|
||||
- [ ] 门店管理:Store/StoreBusinessHour/StoreDeliveryZone/StoreHoliday CRUD 完整,含 GeoJSON 配送范围及能力开关。
|
||||
- [ ] 桌码管理:批量生成桌码、绑定区域/容量、导出二维码 ZIP(POST /api/admin/stores/{id}/tables 可下载)。
|
||||
- [ ] 员工排班:创建员工、绑定门店角色、维护 StoreEmployeeShift,可查询未来 7 日排班。
|
||||
- [ ] 桌码扫码入口:Mini 端解析二维码,GET /api/mini/tables/{code}/context 返回门店、桌台、公告。
|
||||
- [ ] 菜品建模:分类、SPU、SKU、规格/加料组、价格策略、媒资 CRUD + 上下架流程;Mini 端可拉取完整 JSON。
|
||||
- [ ] 库存体系:SKU 库存、批次、调整、售罄管理,支持预售/档期锁定并在订单中扣减/释放。
|
||||
- [ ] 自提档期:门店配置自提时间窗、容量、截单时间;Mini 端据此限制下单时间。
|
||||
- [ ] 购物车服务:ShoppingCart/CartItem/CartItemAddon API 支持并发锁、限购、券/积分预校验,保证并发无脏数据。
|
||||
- [ ] 订单与支付:堂食/自提/配送下单、微信/支付宝支付、优惠券/积分抵扣、订单状态机与通知链路齐全。
|
||||
- [ ] 桌台账单:合单/拆单、结账、电子小票、桌台释放,完成结账后恢复 Idle 并生成票据 URL。
|
||||
- [ ] 自配送骨架:骑手管理、取送件信息录入、费用补贴记录,Admin 端可派单并更新 DeliveryOrder。
|
||||
- [ ] 第三方配送抽象:统一下单/取消/加价/查询接口,支持达达、美团、闪送等,含回调验签与异常补偿骨架。
|
||||
- [ ] 预购自提核销:提货码生成、手机号/二维码核销、自提柜/前台流程,超时自动取消或退款,记录操作者与时间。
|
||||
- [ ] 指标与日志:Prometheus 输出订单创建、支付成功率、配送回调耗时等,Grafana ≥8 个图表;关键流程日志记录 TraceId + 业务 ID。
|
||||
- [ ] 测试:Phase 1 核心 API 具备 ≥30 条自动化用例(单元 + 集成),覆盖租户→商户→下单链路。
|
||||
|
||||
## 2. 数据与迁移(高优)
|
||||
- 建立 EF Core Migration 基线并生成数据库(App/Identity/Dictionary/Hangfire)。
|
||||
- 设计并落地核心业务表(商户/门店/商品/订单/支付/配送等),补齐 Domain 与 Infrastructure 仓储。
|
||||
- 数据初始化/种子:系统参数、默认租户、管理员、基础字典。
|
||||
---
|
||||
## Phase 2(下一阶段):拼单、优惠券与基础营销、会员积分/会员日、客服聊天、同城自配送调度、搜索
|
||||
- [ ] 拼单引擎:GroupOrder/Participant CRUD、发起/加入/成团条件、自动解散与退款、团内消息与提醒。
|
||||
- [ ] 优惠券与基础营销:模板管理、领券、核销、库存/有效期/叠加规则,基础抽奖/秒杀/满减活动。
|
||||
- [ ] 会员与积分:会员档案、等级/成长值、会员日通知;积分获取/消耗、有效期、黑名单。
|
||||
- [ ] 客服聊天:实时会话、机器人/人工切换、排队/转接、消息模板、敏感词审查、工单流转与评价。
|
||||
- [ ] 同城自配送调度:骑手智能指派、路线估时、无接触配送、费用补贴策略、调度看板。
|
||||
- [ ] 搜索:门店/菜品/活动/优惠券搜索,过滤/排序、热门/历史记录、联想与纠错。
|
||||
|
||||
## 3. 质量与测试(高优)
|
||||
- 单元测试骨架:xUnit + FluentAssertions(Dictionary、Identity、Storage、Sms、Messaging、Scheduler)。
|
||||
- 集成测试基座:WebApplicationFactory + Testcontainers(Postgres/Redis/RabbitMQ/MinIO 可选)。
|
||||
- 静态分析:添加 .editorconfig/.globalconfig,启用可空警告、风格规则,接入 Roslyn 分析器。
|
||||
---
|
||||
## Phase 3:分销返利、签到打卡、预约预订、地图导航、社区、高阶营销、风控与补偿
|
||||
- [ ] 分销返利:AffiliatePartner/Order/Payout 管理,佣金阶梯、结算周期、税务信息、违规处理。
|
||||
- [ ] 签到打卡:CheckInCampaign/Record、连签奖励、补签、积分/券/成长值奖励、反作弊机制。
|
||||
- [ ] 预约预订:档期/资源占用、预约下单/支付、提醒/改期/取消、到店核销与履约记录。
|
||||
- [ ] 地图导航扩展:附近门店/推荐、距离/路线规划、跳转原生导航、导航请求埋点。
|
||||
- [ ] 社区:动态发布、评论、点赞、话题/标签、图片/视频审核、举报与风控,店铺口碑展示。
|
||||
- [ ] 高阶营销:秒杀/抽奖/裂变、裂变海报、爆款推荐位、多渠道投放分析。
|
||||
- [ ] 风控与审计:黑名单、频率限制、异常行为监控、审计日志、补偿与告警体系。
|
||||
|
||||
## 4. 安全与合规
|
||||
- 完善鉴权:网关透传与后端校验的租户/用户/权限;Swagger 鉴权示例。
|
||||
- 输入校验与防刷:全局限流策略(按 IP/租户),登录与验证码防刷策略参数化。
|
||||
- 日志与审计:敏感字段脱敏,登录/权限/管理操作审计日志模型与落库。
|
||||
- 配置机密:使用 Secret Store/环境变量/KMS 管理密钥,禁止明文提交。
|
||||
|
||||
## 5. 可观测性与运维
|
||||
- 日志链路:统一 TraceId 透传(网关→服务),配置 Serilog 输出(Console/File/ELK)与留存策略。
|
||||
- 指标/监控:Prometheus exporter、健康检查探针(/health)、告警规则草案。
|
||||
- 备份恢复:PostgreSQL 全量/增量备份脚本,恢复演练记录。
|
||||
|
||||
## 6. 业务功能补全
|
||||
- 订单/商品/商户等领域建模与应用服务接口实现,结合 MQ 事件发布(订单创建、支付成功等)。
|
||||
- 配送对接抽象实现(达达/闪送/顺丰同城)占位,提供下单/取消/查询接口与回调验签。
|
||||
- 小程序端接口补齐:商品浏览、下单、支付、评价、上传图片直传联调。
|
||||
|
||||
## 7. 前台/后台 UI 对接
|
||||
- Admin UI:接入 Swagger 导出的 OpenAPI,生成或手写管理端界面;接入 Hangfire Dashboard/MQ 监控只读访问。
|
||||
- MiniApp:小程序登录流程与错误码文档完善,联调上传、下单、支付链路。
|
||||
|
||||
## 8. CI/CD 与发布
|
||||
- 建立流水线:构建/测试/扫描(SAST)、镜像推送、数据库迁移步骤。
|
||||
- 多环境部署策略:Dev/Staging/Prod 配置隔离,蓝绿或滚动发布方案草拟。
|
||||
- 版本与变更管理:约定版本号/发布说明模板。
|
||||
|
||||
## 9. 文档补全
|
||||
- 更新接口文档(新增业务 API、错误码、回调规范)、模块依赖关系图。
|
||||
- 运维手册:启动参数、环境变量列表、端口/域名映射、常见故障排查。
|
||||
- 安全与合规清单:数据分类分级、审计、留存周期。
|
||||
---
|
||||
## Phase 4:性能优化、缓存、运营大盘、测试与文档、上线与监控
|
||||
- [ ] 性能与缓存:热点接口缓存、慢查询治理、批处理优化、异步化改造。
|
||||
- [ ] 可靠性:幂等与重试策略、任务调度补偿、链路追踪、告警联动。
|
||||
- [ ] 运营大盘:交易/营销/履约/用户维度的细分报表、GMV/成本/毛利分析。
|
||||
- [ ] 文档与测试:完整测试矩阵、性能测试报告、上线手册、回滚方案。
|
||||
- [ ] 监控与运维:上线发布流程、灰度/回滚策略、系统稳定性指标、24x7 监控与告警。
|
||||
|
||||
89
Document/16_设计时DbContext配置指引.md
Normal file
89
Document/16_设计时DbContext配置指引.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# 设计时 DbContext 配置指引
|
||||
|
||||
> 目的:在执行 `dotnet ef` 命令时无需硬编码数据库连接,可根据 appsettings 与环境变量自动加载。本文覆盖环境变量设置、配置目录指定等细节。
|
||||
|
||||
## 一、设计时工厂读取逻辑概述
|
||||
设计时工厂(`DesignTimeDbContextFactoryBase<T>`)按下面顺序解析连接串:
|
||||
1. 若设置了 `TAKEOUTSAAS_APP_CONNECTION` / `TAKEOUTSAAS_IDENTITY_CONNECTION` / `TAKEOUTSAAS_DICTIONARY_CONNECTION` 等环境变量,则优先使用。
|
||||
2. 否则查找配置文件:
|
||||
- 从当前目录开始向上找到含 `TakeoutSaaS.sln` 的仓库根。
|
||||
- 依次检查 `src/Api/TakeoutSaaS.AdminApi`、`src/Api/TakeoutSaaS.UserApi`、`src/Api/TakeoutSaaS.MiniApi` 等目录,如果存在 `appsettings.json` 或 `appsettings.{Environment}.json` 则加载。
|
||||
- 若未找到,可通过环境变量 `TAKEOUTSAAS_APPSETTINGS_DIR` 指定包含 appsettings 文件的目录。
|
||||
|
||||
配置结构示例(出现在 AdminApi/MiniApi/UserApi 的 appsettings):
|
||||
```json
|
||||
"Database": {
|
||||
"DataSources": {
|
||||
"AppDatabase": {
|
||||
"Write": "Host=120.53...;Database=takeout_app_db;Username=...;Password=...",
|
||||
"Reads": [
|
||||
"Host=120.53...;Database=takeout_app_db;Username=...;Password=..."
|
||||
]
|
||||
},
|
||||
"IdentityDatabase": {
|
||||
"Write": "...",
|
||||
"Reads": [ "..." ]
|
||||
},
|
||||
"DictionaryDatabase": {
|
||||
"Write": "...",
|
||||
"Reads": [ "..." ]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
设计时工厂会根据数据源名称(`DatabaseConstants.AppDataSource` 等)读取 `Write` 连接串,实现与运行时一致。
|
||||
|
||||
## 二、环境变量配置
|
||||
### 1. Windows PowerShell
|
||||
```powershell
|
||||
# 指向包含 appsettings.json 的目录
|
||||
$env:TAKEOUTSAAS_APPSETTINGS_DIR = \"D:\\HAZCode\\TakeOut\\src\\Api\\TakeoutSaaS.AdminApi\"
|
||||
|
||||
#(可选)覆盖 AppDatabase 连接串
|
||||
$env:TAKEOUTSAAS_APP_CONNECTION = \"Host=120.53.222.17;Port=5432;Database=takeout_app_db;Username=app_user;Password=***\"
|
||||
|
||||
#(可选)覆盖 IdentityDatabase 连接串
|
||||
$env:TAKEOUTSAAS_IDENTITY_CONNECTION = \"Host=...;Database=takeout_identity_db;Username=...;Password=...\"
|
||||
|
||||
#<23><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DictionaryDatabase <20><><EFBFBD>Ӵ<EFBFBD>
|
||||
$env:TAKEOUTSAAS_DICTIONARY_CONNECTION = "Host=...;Database=takeout_dictionary_db;Username=...;Password=..."
|
||||
```
|
||||
|
||||
### 2. Linux / macOS
|
||||
```bash
|
||||
export TAKEOUTSAAS_APPSETTINGS_DIR=/home/user/TakeOut/src/Api/TakeoutSaaS.AdminApi
|
||||
export TAKEOUTSAAS_APP_CONNECTION=\"Host=120.53.222.17;Port=5432;Database=takeout_app_db;Username=app_user;Password=***\"
|
||||
export TAKEOUTSAAS_IDENTITY_CONNECTION=\"Host=...;Database=takeout_identity_db;Username=...;Password=...\"
|
||||
export TAKEOUTSAAS_DICTIONARY_CONNECTION="Host=...;Database=takeout_dictionary_db;Username=...;Password=..."
|
||||
```
|
||||
|
||||
> 注意:若设置了 `TAKEOUTSAAS_APP_CONNECTION`,则无需在 appsettings 中提供 `Write` 连接串,反之亦然。不要将明文密码写入代码仓库,建议使用 Secret Manager 或部署环境的安全存储。
|
||||
|
||||
## 三、执行脚本示例
|
||||
完成上述环境变量配置后即可执行:
|
||||
```powershell
|
||||
# TakeoutAppDbContext(业务库)
|
||||
dotnet tool run dotnet-ef database update `
|
||||
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--context TakeoutSaaS.Infrastructure.App.Persistence.TakeoutAppDbContext
|
||||
|
||||
# IdentityDbContext(身份库)
|
||||
dotnet tool run dotnet-ef database update `
|
||||
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--context TakeoutSaaS.Infrastructure.Identity.Persistence.IdentityDbContext
|
||||
|
||||
# DictionaryDbContext(字典库)
|
||||
dotnet tool run dotnet-ef database update `
|
||||
--project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--startup-project src/Infrastructure/TakeoutSaaS.Infrastructure/TakeoutSaaS.Infrastructure.csproj `
|
||||
--context TakeoutSaaS.Infrastructure.Dictionary.Persistence.DictionaryDbContext
|
||||
```
|
||||
|
||||
若需迁移 Identity/Dictionary 等上下文,替换 `--context` 参数为对应类型即可。
|
||||
|
||||
## 四、常见问题
|
||||
1. **未找到 appsettings**:确保 `TAKEOUTSAAS_APPSETTINGS_DIR` 指向存在 `appsettings.json` 的目录,或将命令在 API 项目目录中执行。
|
||||
2. **密码错误**:确认远程 PostgreSQL 用户/密码是否与 appsettings 或环境变量一致,避免在 CLI 中使用默认的账号。
|
||||
3. **多环境配置**:`ASPNETCORE_ENVIRONMENT` 变量可控制加载 `appsettings.{Environment}.json`;默认是 Development。
|
||||
101
Document/infra/postgres_redis.md
Normal file
101
Document/infra/postgres_redis.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# PostgreSQL 与 Redis 接入手册
|
||||
|
||||
> 本文档补齐 `Document/10_TODO.md` 中“Postgres/Redis 接入文档与 IaC/脚本”的要求,统一描述连接信息、账号权限、运维流程,以及可复用的部署脚本位置。
|
||||
|
||||
## 1. 运行环境总览
|
||||
|
||||
| 组件 | 地址/端口 | 主要数据库/实例 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| PostgreSQL | `120.53.222.17:5432` | `takeout_app_db`、`takeout_identity_db`、`takeout_dictionary_db`、`takeout_hangfire_db` | 线上实例,所有业务上下文共用。 |
|
||||
| Redis | `49.232.6.45:6379` | 单节点 | 业务缓存/登录限流/刷新令牌存储。 |
|
||||
|
||||
> 注意:所有业务账号都只具备既有库的读写权限,无 `CREATEDB`。若需新库,需使用平台管理员账号(`postgres`)或联系 DBA。
|
||||
|
||||
## 2. 账号与库映射
|
||||
|
||||
| 数据库 | 角色 | 密码 | 用途 |
|
||||
| --- | --- | --- | --- |
|
||||
| `takeout_app_db` | `app_user` | `AppUser112233` | 业务域 (`TakeoutAppDbContext`) |
|
||||
| `takeout_identity_db` | `identity_user` | `IdentityUser112233` | 身份域 (`IdentityDbContext`) |
|
||||
| `takeout_dictionary_db` | `dictionary_user` | `DictionaryUser112233` | 字典域 (`DictionaryDbContext`) |
|
||||
| `takeout_hangfire_db` | `hangfire_user` | `HangFire112233` | 后台调度/Hangfire |
|
||||
|
||||
Redis 密码:`MsuMshk112233`,见 `appsettings.*.json -> Redis`。
|
||||
|
||||
## 3. 环境变量/配置注入
|
||||
|
||||
### PowerShell
|
||||
|
||||
```powershell
|
||||
$env:TAKEOUTSAAS_APPSETTINGS_DIR = "D:\HAZCode\TakeOut\src\Api\TakeoutSaaS.AdminApi"
|
||||
$env:TAKEOUTSAAS_APP_CONNECTION = "Host=120.53.222.17;Port=5432;Database=takeout_app_db;Username=app_user;Password=AppUser112233;Pooling=true"
|
||||
$env:TAKEOUTSAAS_IDENTITY_CONNECTION = "Host=120.53.222.17;Port=5432;Database=takeout_identity_db;Username=identity_user;Password=IdentityUser112233;Pooling=true"
|
||||
$env:TAKEOUTSAAS_DICTIONARY_CONNECTION = "Host=120.53.222.17;Port=5432;Database=takeout_dictionary_db;Username=dictionary_user;Password=DictionaryUser112233;Pooling=true"
|
||||
```
|
||||
|
||||
### Bash
|
||||
|
||||
```bash
|
||||
export TAKEOUTSAAS_APPSETTINGS_DIR=/home/user/TakeOut/src/Api/TakeoutSaaS.AdminApi
|
||||
export TAKEOUTSAAS_APP_CONNECTION="Host=120.53.222.17;Port=5432;Database=takeout_app_db;Username=app_user;Password=AppUser112233;Pooling=true"
|
||||
export TAKEOUTSAAS_IDENTITY_CONNECTION="Host=120.53.222.17;Port=5432;Database=takeout_identity_db;Username=identity_user;Password=IdentityUser112233;Pooling=true"
|
||||
export TAKEOUTSAAS_DICTIONARY_CONNECTION="Host=120.53.222.17;Port=5432;Database=takeout_dictionary_db;Username=dictionary_user;Password=DictionaryUser112233;Pooling=true"
|
||||
```
|
||||
|
||||
Redis 连接字符串直接写入 `appsettings.*.json` 即可,如:
|
||||
|
||||
```jsonc
|
||||
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false"
|
||||
```
|
||||
|
||||
## 4. 运维指南
|
||||
|
||||
### PostgreSQL
|
||||
|
||||
1. **只读账号验证**
|
||||
```powershell
|
||||
psql "host=120.53.222.17 port=5432 dbname=takeout_app_db user=app_user password=AppUser112233"
|
||||
```
|
||||
2. **备份**
|
||||
```bash
|
||||
pg_dump -h 120.53.222.17 -p 5432 -U postgres -F c -d takeout_app_db -f backup/takeout_app_db_$(date +%Y%m%d).dump
|
||||
pg_dumpall -h 120.53.222.17 -p 5432 -U postgres > backup/all_$(date +%Y%m%d).sql
|
||||
```
|
||||
3. **恢复**
|
||||
```bash
|
||||
pg_restore -h 120.53.222.17 -p 5432 -U postgres -d takeout_app_db backup/takeout_app_db_xxx.dump
|
||||
psql -h 120.53.222.17 -p 5432 -U postgres -f backup/all_yyyymmdd.sql
|
||||
```
|
||||
4. **账号/权限策略**
|
||||
- `app_user` / `identity_user` / `dictionary_user` 拥有 `CONNECT`、`TEMP`、Schema `public` 的 CRUD 权限。
|
||||
- `hangfire_user` 仅能访问 `takeout_hangfire_db`,不可访问业务库。
|
||||
- 创建新表/列时,通过 EF Migration 自动添加 COMMENT。
|
||||
|
||||
### Redis
|
||||
|
||||
1. **连接验证**
|
||||
```bash
|
||||
redis-cli -h 49.232.6.45 -p 6379 -a MsuMshk112233 ping
|
||||
```
|
||||
2. **备份**
|
||||
```bash
|
||||
redis-cli -h 49.232.6.45 -p 6379 -a MsuMshk112233 save # 触发 RDB
|
||||
redis-cli -h 49.232.6.45 -p 6379 -a MsuMshk112233 bgsave # 后台
|
||||
```
|
||||
RDB/AOF 文件在服务器 `redis.conf` 定义的目录(默认 `/var/lib/redis`)。
|
||||
3. **常见运维项**
|
||||
- `CONFIG GET dir` / `CONFIG GET dbfilename` 可查看持久化路径。
|
||||
- `INFO memory` 监控内存;开启 `maxmemory` + `allkeys-lru` 保护。
|
||||
|
||||
## 5. IaC / 脚本
|
||||
|
||||
| 文件 | 说明 |
|
||||
| --- | --- |
|
||||
| `deploy/postgres/create_databases.sql` | 基于 `postgres` 管理员执行,创建四个业务库及角色、授予权限、补 COMMENT。 |
|
||||
| `deploy/postgres/bootstrap.ps1` | PowerShell 包装脚本,调用 `psql` 执行上面的 SQL(默认读取 `postgres` 管理员账号)。 |
|
||||
| `deploy/postgres/README.md` | 介绍如何在本地/测试环境执行 bootstrap 并校验连接。 |
|
||||
| `deploy/redis/docker-compose.yml` | 可复用的 Redis 部署(Redis 7 + AOF),便于本地或测试环境一键拉起。 |
|
||||
| `deploy/redis/redis.conf` | compose/裸机均可共用的配置(`requirepass`、持久化等已写好)。 |
|
||||
| `deploy/redis/README.md` | 说明如何使用 compose 或将 `redis.conf` 部署到现有实例。 |
|
||||
|
||||
> 线上目前为裸机安装(非容器),如需创建新环境/快速恢复,可直接运行上述脚本达到同样配置;即使在现有机器上,也可把 SQL/配置当作“最终规范”确保环境一致性。
|
||||
Reference in New Issue
Block a user