同步配置与运维TODO

This commit is contained in:
贺爱泽
2025-12-01 12:06:39 +08:00
parent bc1daf9d5d
commit a08804658b
17 changed files with 386 additions and 158 deletions

View File

@@ -508,6 +508,14 @@ crontab -e
0 2 * * * /path/to/backup_db.sh >> /var/log/backup.log 2>&1
```
## TODO基础设施部署脚本
- [ ] PostgreSQL 主从:整理主库/从库初始化脚本、basebackup 步骤与故障切换手册。
- [ ] Redis 哨兵/集群:补充 redis.conf/sentinel.conf 模板以及一主两从搭建命令。
- [ ] RabbitMQ编写单节点到镜像队列的安装脚本记录 VHost、用户、权限、监控等操作。
- [ ] 腾讯云 COS整理桶创建、ACL、CDN 绑定与密钥轮换流程,并提供 coscmd/SDK 示例。
- [ ] Hangfire 存储:确认 PostgreSQL Schema 初始化脚本,补充定期备份、清理、监控的 SOP。
## 6. Redis部署
### 6.1 Redis哨兵模式

View File

@@ -3,7 +3,7 @@
## 基础信息
- IP: 47.94.199.87
- 账户: root
- 密码: C3SyytfBPAU#Ts8a
- 密码: cJ5q2k2iW7XnMA^!
- 配置: 2 核 CPU / 2 GB 内存(阿里云)
- 地点: 北京
- 用途: 网关

View File

@@ -4,7 +4,7 @@
- IP: 120.53.222.17
- 账户: ubuntu
- 密码: P3y$nJt#zaa4%fh5
- 配置: 2 核 CPU / 4 GB 内存(轻量应用服务器,腾讯云)
- 配置: 2 核 CPU / 4 GB 内存
- 地点: 北京
- 用途: 主 PostgreSQL / 数据库服务器
- 到期时间: 2026-11-26 11:22:01

View File

@@ -1,17 +0,0 @@
# 腾讯云主应用服务器
## 基础信息
- IP: 43.142.81.224
- 账户: ubuntu
- 密码: hN~~^2NZ+s_%A%tk
- 配置: 4 核 CPU / 4 GB 内存(轻量应用服务器,腾讯云)
- 地点: 上海
- 用途: 主应用服务器
- 到期时间: 2026-11-21
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`
- 带宽/磁盘: 待补充
- 安全组/开放端口: 待补充
- 备份与监控: 待补充
- 变更记录: 待补充

View File

@@ -1,18 +0,0 @@
# 天翼云主 PostgreSQL 服务器
## 基础信息
- IP: 49.7.179.246
- 账户: root
- 密码: 7zE&84XI6~w57W7N
- 配置: 4 核 CPU / 8 GB 内存(天翼云)
- 地点: 北京
- 用途: 主 PostgreSQL 服务器
- 到期时间: 2027-10-04 17:17:57
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`
- 带宽/磁盘: 待补充
- 数据目录: 待补充(如 `/var/lib/postgresql`
- 数据备份/监控: 待补充
- 安全组/开放端口: 待补充
- 变更记录: 待补充

View File

@@ -1,13 +1,13 @@
# 腾讯云 Redis/RabbitMQ 服务器(待购)
# 腾讯云 Redis/RabbitMQ 服务器
## 基础信息(待补充)
- IP: 待补充
- 账户: 待补充
- 密码: 待补充
- 配置: 2 核 CPU / 4 GB 内存(腾讯云)
- 地点: 待补充
- IP: 49.232.6.45
- 账户: ubuntu
- 密码: Z7NsRjT&XnWg7%7X
- 配置: 2 核 CPU / 4 GB 内存
- 地点: 北京
- 用途: Redis 与 RabbitMQ
- 到期时间: 待补充
- 到期时间: 2028-11-26
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`

View File

@@ -1,35 +0,0 @@
<<<<<<< HEAD
# 腾讯云 Redis/RabbitMQ 服务器(待购)
## 基础信息(待补充)
- IP: 待补充
- 账户: 待补充
- 密码: 待补充
- 配置: 2 核 CPU / 4 GB 内存(腾讯云)
- 地点: 待补充
- 用途: Redis 与 RabbitMQ
- 到期时间: 待补充
=======
# 腾讯云 Redis/RabbitMQ 服务器(待购)
## 基础信息(待补充)
- IP: 49.232.6.45
- 账户: ubuntu
- 密码: Z7NsRjT&XnWg7%7X
- 配置: 2 核 CPU / 4 GB 内存(腾讯云)
- 地点: 北京
- 用途: Redis 与 RabbitMQ
- 到期时间: 2028-11-26
>>>>>>> dc9b853c5c2f2aa40c102df54f9097c31fddf97b
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`
- 带宽/磁盘: 待补充
- 安全组/开放端口: 待补充Redis 6379RabbitMQ 5672/15672 等)
- 数据持久化与备份: 待补充
- 监控与告警: 待补充
- 变更记录: 待补充
<<<<<<< HEAD
=======
>>>>>>> dc9b853c5c2f2aa40c102df54f9097c31fddf97b

View File

@@ -1,18 +0,0 @@
# 腾讯云 Redis/RabbitMQ 服务器(待购)
## 基础信息(待补充)
- IP: 待补充
- 账户: 待补充
- 密码: 待补充
- 配置: 2 核 CPU / 4 GB 内存(腾讯云)
- 地点: 待补充
- 用途: Redis 与 RabbitMQ
- 到期时间: 待补充
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`
- 带宽/磁盘: 待补充
- 安全组/开放端口: 待补充Redis 6379RabbitMQ 5672/15672 等)
- 数据持久化与备份: 待补充
- 监控与告警: 待补充
- 变更记录: 待补充

View File

@@ -1,19 +0,0 @@
# 腾讯云 Redis/RabbitMQ 服务器(待购)
## 基础信息(待补充)
- IP: 49.232.6.45
- 账户: ubuntu
- 密码: Z7NsRjT&XnWg7%7X
- 配置: 2 核 CPU / 4 GB 内存(腾讯云)
- 地点: 北京
- 用途: Redis 与 RabbitMQ
- 到期时间: 2028-11-26
## 建议补充
- 系统版本: 待补充(如 `cat /etc/os-release`
- 带宽/磁盘: 待补充
- 安全组/开放端口: 待补充Redis 6379RabbitMQ 5672/15672 等)
- 数据持久化与备份: 待补充
- 监控与告警: 待补充
- 变更记录: 待补充

View File

@@ -2,18 +2,18 @@
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
@@ -21,12 +21,12 @@
}
}
},
"Redis": "localhost:6379,abortConnect=false",
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "ReplaceWithA32CharLongSecretKey_____",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},
@@ -54,14 +54,14 @@
},
"Storage": {
"Provider": "TencentCos",
"CdnBaseUrl": "https://cdn.example.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"TencentCos": {
"SecretId": "COS_SECRET_ID",
"SecretKey": "COS_SECRET_KEY",
"Region": "ap-guangzhou",
"Bucket": "takeout-bucket-123456",
"Endpoint": "",
"CdnBaseUrl": "https://cdn.example.com",
"SecretId": "AKID52mHageV8ZnnY5NRL3Xq270fAcw2vb5R",
"SecretKey": "B8sPitsiEXcS4ScaMvGMErFOL3ZqsgFa",
"Region": "ap-beijing",
"Bucket": "saas2025-1388556178",
"Endpoint": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"UseHttps": true,
"ForcePathStyle": false
},
@@ -101,7 +101,7 @@
"SecretKey": "TENCENT_SMS_SECRET_KEY",
"SdkAppId": "1400000000",
"SignName": "外卖SaaS",
"Region": "ap-guangzhou",
"Region": "ap-beijing",
"Endpoint": "https://sms.tencentcloudapi.com"
},
"Aliyun": {
@@ -124,17 +124,17 @@
}
},
"RabbitMQ": {
"Host": "localhost",
"Host": "49.232.6.45",
"Port": 5672,
"Username": "admin",
"Password": "password",
"Username": "Admin",
"Password": "MsuMshk112233",
"VirtualHost": "/",
"Exchange": "takeout.events",
"ExchangeType": "topic",
"PrefetchCount": 20
},
"Scheduler": {
"ConnectionString": "Host=localhost;Port=5432;Database=takeout_saas_scheduler;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_scheduler;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"WorkerCount": 5,
"DashboardEnabled": false,
"DashboardPath": "/hangfire"

View File

@@ -0,0 +1,142 @@
{
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
}
}
},
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},
"LoginRateLimit": {
"WindowSeconds": 60,
"MaxAttempts": 5
},
"RefreshTokenStore": {
"Prefix": "identity:refresh:"
},
"AdminSeed": {
"Users": []
}
},
"Dictionary": {
"Cache": {
"SlidingExpiration": "00:30:00"
}
},
"Tenancy": {
"TenantIdHeaderName": "X-Tenant-Id",
"TenantCodeHeaderName": "X-Tenant-Code",
"IgnoredPaths": [ "/health" ],
"RootDomain": ""
},
"Storage": {
"Provider": "TencentCos",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"TencentCos": {
"SecretId": "AKID52mHageV8ZnnY5NRL3Xq270fAcw2vb5R",
"SecretKey": "B8sPitsiEXcS4ScaMvGMErFOL3ZqsgFa",
"Region": "ap-beijing",
"Bucket": "saas2025-1388556178",
"Endpoint": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"UseHttps": true,
"ForcePathStyle": false
},
"QiniuKodo": {
"AccessKey": "QINIU_ACCESS_KEY",
"SecretKey": "QINIU_SECRET_KEY",
"Bucket": "takeout-files",
"DownloadDomain": "",
"Endpoint": "",
"UseHttps": true,
"SignedUrlExpirationMinutes": 30
},
"AliyunOss": {
"AccessKeyId": "OSS_ACCESS_KEY_ID",
"AccessKeySecret": "OSS_ACCESS_KEY_SECRET",
"Endpoint": "https://oss-cn-hangzhou.aliyuncs.com",
"Bucket": "takeout-files",
"CdnBaseUrl": "",
"UseHttps": true
},
"Security": {
"MaxFileSizeBytes": 10485760,
"AllowedImageExtensions": [ ".jpg", ".jpeg", ".png", ".webp", ".gif" ],
"AllowedFileExtensions": [ ".jpg", ".jpeg", ".png", ".webp", ".gif", ".pdf" ],
"DefaultUrlExpirationMinutes": 30,
"EnableRefererValidation": true,
"AllowedReferers": [ "https://admin.example.com", "https://miniapp.example.com" ],
"AntiLeechTokenSecret": "ReplaceWithARandomToken"
}
},
"Sms": {
"Provider": "Tencent",
"DefaultSignName": "外卖SaaS",
"UseMock": true,
"Tencent": {
"SecretId": "TENCENT_SMS_SECRET_ID",
"SecretKey": "TENCENT_SMS_SECRET_KEY",
"SdkAppId": "1400000000",
"SignName": "外卖SaaS",
"Region": "ap-beijing",
"Endpoint": "https://sms.tencentcloudapi.com"
},
"Aliyun": {
"AccessKeyId": "ALIYUN_SMS_AK",
"AccessKeySecret": "ALIYUN_SMS_SK",
"Endpoint": "dysmsapi.aliyuncs.com",
"SignName": "外卖SaaS",
"Region": "cn-hangzhou"
},
"SceneTemplates": {
"login": "LOGIN_TEMPLATE_ID",
"register": "REGISTER_TEMPLATE_ID",
"reset": "RESET_TEMPLATE_ID"
},
"VerificationCode": {
"CodeLength": 6,
"ExpireMinutes": 5,
"CooldownSeconds": 60,
"CachePrefix": "sms:code"
}
},
"RabbitMQ": {
"Host": "49.232.6.45",
"Port": 5672,
"Username": "Admin",
"Password": "MsuMshk112233",
"VirtualHost": "/",
"Exchange": "takeout.events",
"ExchangeType": "topic",
"PrefetchCount": 20
},
"Scheduler": {
"ConnectionString": "Host=120.53.222.17;Port=5432;Database=takeout_saas_scheduler;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"WorkerCount": 5,
"DashboardEnabled": false,
"DashboardPath": "/hangfire"
}
}

View File

@@ -2,18 +2,18 @@
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
@@ -21,12 +21,12 @@
}
}
},
"Redis": "localhost:6379,abortConnect=false",
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "ReplaceWithA32CharLongSecretKey_____",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},
@@ -51,14 +51,14 @@
},
"Storage": {
"Provider": "TencentCos",
"CdnBaseUrl": "https://cdn.example.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"TencentCos": {
"SecretId": "COS_SECRET_ID",
"SecretKey": "COS_SECRET_KEY",
"Region": "ap-guangzhou",
"Bucket": "takeout-bucket-123456",
"Endpoint": "",
"CdnBaseUrl": "https://cdn.example.com",
"SecretId": "AKID52mHageV8ZnnY5NRL3Xq270fAcw2vb5R",
"SecretKey": "B8sPitsiEXcS4ScaMvGMErFOL3ZqsgFa",
"Region": "ap-beijing",
"Bucket": "saas2025-1388556178",
"Endpoint": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"UseHttps": true,
"ForcePathStyle": false
},
@@ -98,7 +98,7 @@
"SecretKey": "TENCENT_SMS_SECRET_KEY",
"SdkAppId": "1400000000",
"SignName": "外卖SaaS",
"Region": "ap-guangzhou",
"Region": "ap-beijing",
"Endpoint": "https://sms.tencentcloudapi.com"
},
"Aliyun": {
@@ -121,10 +121,10 @@
}
},
"RabbitMQ": {
"Host": "localhost",
"Host": "49.232.6.45",
"Port": 5672,
"Username": "admin",
"Password": "password",
"Username": "Admin",
"Password": "MsuMshk112233",
"VirtualHost": "/",
"Exchange": "takeout.events",
"ExchangeType": "topic",

View File

@@ -0,0 +1,133 @@
{
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
}
}
},
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},
"LoginRateLimit": {
"WindowSeconds": 60,
"MaxAttempts": 5
},
"RefreshTokenStore": {
"Prefix": "identity:refresh:"
}
},
"Dictionary": {
"Cache": {
"SlidingExpiration": "00:30:00"
}
},
"Tenancy": {
"TenantIdHeaderName": "X-Tenant-Id",
"TenantCodeHeaderName": "X-Tenant-Code",
"IgnoredPaths": [ "/health" ],
"RootDomain": ""
},
"Storage": {
"Provider": "TencentCos",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"TencentCos": {
"SecretId": "AKID52mHageV8ZnnY5NRL3Xq270fAcw2vb5R",
"SecretKey": "B8sPitsiEXcS4ScaMvGMErFOL3ZqsgFa",
"Region": "ap-beijing",
"Bucket": "saas2025-1388556178",
"Endpoint": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"CdnBaseUrl": "https://saas2025-1388556178.cos.ap-beijing.myqcloud.com",
"UseHttps": true,
"ForcePathStyle": false
},
"QiniuKodo": {
"AccessKey": "QINIU_ACCESS_KEY",
"SecretKey": "QINIU_SECRET_KEY",
"Bucket": "takeout-files",
"DownloadDomain": "",
"Endpoint": "",
"UseHttps": true,
"SignedUrlExpirationMinutes": 30
},
"AliyunOss": {
"AccessKeyId": "OSS_ACCESS_KEY_ID",
"AccessKeySecret": "OSS_ACCESS_KEY_SECRET",
"Endpoint": "https://oss-cn-hangzhou.aliyuncs.com",
"Bucket": "takeout-files",
"CdnBaseUrl": "",
"UseHttps": true
},
"Security": {
"MaxFileSizeBytes": 10485760,
"AllowedImageExtensions": [ ".jpg", ".jpeg", ".png", ".webp", ".gif" ],
"AllowedFileExtensions": [ ".jpg", ".jpeg", ".png", ".webp", ".gif", ".pdf" ],
"DefaultUrlExpirationMinutes": 30,
"EnableRefererValidation": true,
"AllowedReferers": [ "https://admin.example.com", "https://miniapp.example.com" ],
"AntiLeechTokenSecret": "ReplaceWithARandomToken"
}
},
"Sms": {
"Provider": "Tencent",
"DefaultSignName": "外卖SaaS",
"UseMock": true,
"Tencent": {
"SecretId": "TENCENT_SMS_SECRET_ID",
"SecretKey": "TENCENT_SMS_SECRET_KEY",
"SdkAppId": "1400000000",
"SignName": "外卖SaaS",
"Region": "ap-beijing",
"Endpoint": "https://sms.tencentcloudapi.com"
},
"Aliyun": {
"AccessKeyId": "ALIYUN_SMS_AK",
"AccessKeySecret": "ALIYUN_SMS_SK",
"Endpoint": "dysmsapi.aliyuncs.com",
"SignName": "外卖SaaS",
"Region": "cn-hangzhou"
},
"SceneTemplates": {
"login": "LOGIN_TEMPLATE_ID",
"register": "REGISTER_TEMPLATE_ID",
"reset": "RESET_TEMPLATE_ID"
},
"VerificationCode": {
"CodeLength": 6,
"ExpireMinutes": 5,
"CooldownSeconds": 60,
"CachePrefix": "sms:code"
}
},
"RabbitMQ": {
"Host": "49.232.6.45",
"Port": 5672,
"Username": "Admin",
"Password": "MsuMshk112233",
"VirtualHost": "/",
"Exchange": "takeout.events",
"ExchangeType": "topic",
"PrefetchCount": 20
}
}

View File

@@ -2,18 +2,18 @@
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_app;Username=app_user;Password=app_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=localhost;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=identity_password;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
@@ -21,12 +21,12 @@
}
}
},
"Redis": "localhost:6379,abortConnect=false",
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "ReplaceWithA32CharLongSecretKey_____",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},

View File

@@ -0,0 +1,52 @@
{
"Database": {
"DataSources": {
"AppDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_app;Username=app_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
},
"IdentityDatabase": {
"Write": "Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50",
"Reads": [
"Host=120.53.222.17;Port=5432;Database=takeout_saas_identity;Username=identity_user;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=50"
],
"CommandTimeoutSeconds": 30,
"MaxRetryCount": 3,
"MaxRetryDelaySeconds": 5
}
}
},
"Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
"Audience": "takeout-saas-clients",
"Secret": "psZEx_O##]Mq(W.1$?8Aia*LM03sXGGx",
"AccessTokenExpirationMinutes": 120,
"RefreshTokenExpirationMinutes": 10080
},
"LoginRateLimit": {
"WindowSeconds": 60,
"MaxAttempts": 5
},
"RefreshTokenStore": {
"Prefix": "identity:refresh:"
}
},
"Dictionary": {
"Cache": {
"SlidingExpiration": "00:30:00"
}
},
"Tenancy": {
"TenantIdHeaderName": "X-Tenant-Id",
"TenantCodeHeaderName": "X-Tenant-Code",
"IgnoredPaths": [ "/health" ],
"RootDomain": ""
}
}

View File

@@ -110,7 +110,7 @@ public sealed class DatabaseConnectionFactory(
private DatabaseConnectionDetails BuildFallbackConnection()
{
const string fallback = "Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=postgres;Pooling=true;Minimum Pool Size=1;Maximum Pool Size=20";
const string fallback = "Host=120.53.222.17;Port=5432;Database=postgres;Username=postgres;Password=MsuMshk112233;Pooling=true;Minimum Pool Size=1;Maximum Pool Size=20";
logger.LogWarning("使用默认回退连接串:{Connection}", fallback);
return new DatabaseConnectionDetails(
fallback,