174 lines
10 KiB
Plaintext
174 lines
10 KiB
Plaintext
# -------- 应用配置 --------
|
||
# 应用运行环境
|
||
APP_ENV = 'prod'
|
||
# 应用名称
|
||
APP_NAME = 'ShiErFeng-FastAPI'
|
||
# 应用代理路径
|
||
APP_ROOT_PATH = '/docker-api'
|
||
# 应用主机
|
||
APP_HOST = '0.0.0.0'
|
||
# 应用端口
|
||
APP_PORT = 9099
|
||
# 应用版本
|
||
APP_VERSION= '1.9.0'
|
||
# 应用是否开启热重载
|
||
APP_RELOAD = false
|
||
# 应用工作进程数
|
||
APP_WORKERS = 1
|
||
# 应用是否开启IP归属区域查询
|
||
APP_IP_LOCATION_QUERY = true
|
||
# 应用是否为演示模式
|
||
APP_DEMO_MODE = false
|
||
# 应用是否允许账号同时登录
|
||
APP_SAME_TIME_LOGIN = true
|
||
# 应用是否禁用Swagger文档
|
||
APP_DISABLE_SWAGGER = true
|
||
# 应用是否禁用ReDoc文档
|
||
APP_DISABLE_REDOC = true
|
||
# 可信代理IP列表,多个值使用逗号分隔
|
||
APP_TRUSTED_PROXY_IPS = '127.0.0.1,::1'
|
||
# 可信代理跳数,单层Nginx代理通常为1
|
||
APP_TRUSTED_PROXY_HOPS = 1
|
||
|
||
# -------- Jwt配置 --------
|
||
# Jwt秘钥
|
||
JWT_SECRET_KEY = 'b01c66dc2c58dc6a0aabfe2144256be36226de378bf87f72c0c795dda67f4d55'
|
||
# Jwt算法
|
||
JWT_ALGORITHM = 'HS256'
|
||
# 令牌过期时间
|
||
JWT_EXPIRE_MINUTES = 1440
|
||
# redis中令牌过期时间
|
||
JWT_REDIS_EXPIRE_MINUTES = 30
|
||
|
||
|
||
# -------- 数据库配置 --------
|
||
# 数据库类型,可选的有'mysql'、'postgresql',默认为'mysql'
|
||
DB_TYPE = 'postgresql'
|
||
# 数据库主机
|
||
DB_HOST = 'shierfeng-pg'
|
||
# 数据库端口
|
||
DB_PORT = 5432
|
||
# 数据库用户名
|
||
DB_USERNAME = 'postgres'
|
||
# 数据库密码
|
||
DB_PASSWORD = 'root'
|
||
# 数据库名称
|
||
DB_DATABASE = 'shierfeng-fastapi'
|
||
# 是否开启sqlalchemy日志
|
||
DB_ECHO = true
|
||
# 允许溢出连接池大小的最大连接数
|
||
DB_MAX_OVERFLOW = 10
|
||
# 连接池大小,0表示连接数无限制
|
||
DB_POOL_SIZE = 50
|
||
# 连接回收时间(单位:秒)
|
||
DB_POOL_RECYCLE = 3600
|
||
# 连接池中没有线程可用时,最多等待的时间(单位:秒)
|
||
DB_POOL_TIMEOUT = 30
|
||
|
||
# -------- Redis配置 --------
|
||
# Redis主机
|
||
REDIS_HOST = 'shierfeng-redis'
|
||
# Redis端口
|
||
REDIS_PORT = 6379
|
||
# Redis用户名
|
||
REDIS_USERNAME = ''
|
||
# Redis密码
|
||
REDIS_PASSWORD = ''
|
||
# Redis数据库
|
||
REDIS_DATABASE = 2
|
||
|
||
# -------- 日志配置 --------
|
||
# 是否启用日志脱敏
|
||
LOG_MASK_ENABLED = true
|
||
# 日志脱敏占位符
|
||
LOG_MASK_PLACEHOLDER = '******'
|
||
# 以下三项为互补关系(非互斥):
|
||
# 1) LOG_MASK_FIELDS:命中后执行全量脱敏
|
||
# 2) LOG_PARTIAL_MASK_FIELDS:命中后执行部分脱敏
|
||
# 3) LOG_CONFIG_SECRET_PATTERNS:按 configKey 关键词决定是否脱敏 configValue
|
||
# 全量脱敏字段,多个值使用逗号分隔
|
||
LOG_MASK_FIELDS = 'password,old_password,new_password,confirm_password,api_key,token,access_token,refresh_token,authorization,client_secret,secret,secret_key,private_key,private_key_pem,credential,credentials,sms_code,captcha_code,system_prompt'
|
||
# 部分脱敏字段,多个值使用逗号分隔
|
||
# 当前默认不对IP脱敏;如后期需要开启,可直接追加 ip,ipaddr,oper_ip,login_ip 并重启服务
|
||
LOG_PARTIAL_MASK_FIELDS = 'phonenumber,phone,mobile,email'
|
||
# 按配置键名识别敏感配置的关键词,多个值使用逗号分隔
|
||
LOG_CONFIG_SECRET_PATTERNS = 'password,token,secret,key,private,credential,access,jwt,captcha,sms'
|
||
# Redis Stream Key
|
||
LOG_STREAM_KEY = 'log:stream'
|
||
# Redis Stream 消费组名称
|
||
LOG_STREAM_GROUP = 'log_aggregator'
|
||
# Redis Stream 消费者名称前缀
|
||
LOG_STREAM_CONSUMER_PREFIX = 'worker'
|
||
# 每次读取的最大消息数量
|
||
LOG_STREAM_BATCH_SIZE = 100
|
||
# 阻塞读取等待时间(毫秒)
|
||
LOG_STREAM_BLOCK_MS = 2000
|
||
# Stream 最大长度(近似裁剪)
|
||
LOG_STREAM_MAXLEN = 100000
|
||
# Pending 回收最小空闲时间(毫秒)
|
||
LOG_STREAM_CLAIM_IDLE_MS = 60000
|
||
# Pending 回收检查间隔(毫秒)
|
||
LOG_STREAM_CLAIM_INTERVAL_MS = 5000
|
||
# 每次回收的最大消息数量
|
||
LOG_STREAM_CLAIM_BATCH_SIZE = 100
|
||
# 去重 Key 过期时间(秒)
|
||
LOG_STREAM_DEDUP_TTL = 3600
|
||
# 去重 Key 前缀
|
||
LOG_STREAM_DEDUP_PREFIX = 'log:dedup'
|
||
# stdout 输出是否为 JSON
|
||
LOGURU_JSON = false
|
||
# Loguru 最低输出级别
|
||
LOGURU_LEVEL = 'INFO'
|
||
# 是否输出到 stdout
|
||
LOGURU_STDOUT = true
|
||
# 是否启用文件日志
|
||
LOG_FILE_ENABLED = true
|
||
# 文件日志根目录
|
||
LOG_FILE_BASE_DIR = 'logs'
|
||
# 文件滚动策略
|
||
LOGURU_ROTATION = '50MB'
|
||
# 文件保留策略
|
||
LOGURU_RETENTION = '30 days'
|
||
# 文件压缩格式
|
||
LOGURU_COMPRESSION = 'zip'
|
||
# 实例标识(用于区分实例)
|
||
LOG_INSTANCE_ID = 'dockerpg'
|
||
# 服务名称(用于统一标识服务)
|
||
LOG_SERVICE_NAME = 'shierfeng-fastapi-backend'
|
||
# Worker 标识(auto 自动生成)
|
||
LOG_WORKER_ID = 'auto'
|
||
|
||
# -------- 传输层加解密配置 --------
|
||
# 是否启用传输层加解密
|
||
TRANSPORT_CRYPTO_ENABLED = true
|
||
# 传输层加解密模式:off=关闭,optional=明文/密文兼容,required=命中接口强制加密
|
||
TRANSPORT_CRYPTO_MODE = 'optional'
|
||
# 传输层加解密算法标识
|
||
TRANSPORT_CRYPTO_ALGORITHM = 'RSA_OAEP_AES_256_GCM'
|
||
# 当前启用的密钥版本标识
|
||
TRANSPORT_CRYPTO_KID = 'default'
|
||
# 传输层RSA位数,需与下方密钥对匹配
|
||
TRANSPORT_CRYPTO_RSA_KEY_SIZE = 4096
|
||
# 传输层公钥,默认提供一套可用示例值;Docker 部署前请替换为正式密钥
|
||
TRANSPORT_CRYPTO_PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwA2ooWpsxLzIVMJp7Wcv\nvR0Bu8paFn8NVPpzz+wGpUlwP5DGK6pBGItsglNMZx56MSYMp3zVyqB95XUVZ6Ub\nQVyHJ6BXXIMs/BpzcHCbyXR/wWG+pKxQ8UEwaHVhK8X21xW1R0kzzwhgMw51unEs\nA81kskVlDdGeNyaOJg5QuofEErCfR1y0e+iqd1PBpIwdEY5L+BzvbVtyhsPz6dBu\n9YbEbKs7JvNle5vjc72ebbMIeGejHFQRYxihuamPCAEylj1qqpHk8U+r+3icxQsj\n8F/TySLuOy37iVWfD+5ikLyou4ZDI3hOYnIYHl194ZM5xVyOGBD/xdqZadXTLqL6\nSrldwZfZDBl3EGgRby8yJqO6SqGgyvyGWXZAaHoPMmF+quu/nUooqnp0fpl+LCqX\nhK67kbYaA9xJeHRaP04cg16imB7sBIXBqzkyZtkhC2BtlL0h5X7dRlAddrQ23z6d\nWdJA3qe3iBSSM8pmedv+Jgfau/PFam2051HqFxvJEh/jnc6rq1aIjL/d4Kk5imIa\nQ6acv+v5N6QVFptlcx6I7j8yZJ7WUHZlB1IxVqfPb69+985eknZyLul60gyu0kPG\nYUecypUu2wiNDBAErZlUxEujMWgJDFYCSonHxtwr88gDInjP0lvwd/OgqjDQ7hSo\nRYxPhTbwo68RJDpImBjn+YsCAwEAAQ==\n-----END PUBLIC KEY-----'
|
||
# 传输层私钥,必须与上方公钥成对使用;Docker 部署前请替换为正式密钥
|
||
TRANSPORT_CRYPTO_PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----'
|
||
# 历史密钥对配置,JSON数组格式,密钥轮换说明见 docs/transport_crypto_deployment.md
|
||
TRANSPORT_CRYPTO_LEGACY_KEY_PAIRS = '[]'
|
||
# 公钥缓存有效期(秒)
|
||
TRANSPORT_CRYPTO_PUBLIC_KEY_TTL_SECONDS = 3600
|
||
# 前端传输加密策略缓存有效期(秒)
|
||
TRANSPORT_CRYPTO_FRONTEND_CONFIG_TTL_SECONDS = 300
|
||
# GET/DELETE 请求参数加密后的最大 URL 长度
|
||
TRANSPORT_CRYPTO_MAX_GET_URL_LENGTH = 4096
|
||
# 请求时间窗允许偏差(秒)
|
||
TRANSPORT_CRYPTO_CLOCK_SKEW_SECONDS = 120
|
||
# 防重放随机数有效期(秒)
|
||
TRANSPORT_CRYPTO_REPLAY_TTL_SECONDS = 300
|
||
# 启用传输层加密的路径列表,多个值使用逗号分隔,留空表示默认全部启用
|
||
TRANSPORT_CRYPTO_ENABLED_PATHS = ''
|
||
# 强制要求传输层加密的路径列表,多个值使用逗号分隔
|
||
TRANSPORT_CRYPTO_REQUIRED_PATHS = ''
|
||
# 排除传输层加密的路径列表,多个值使用逗号分隔
|
||
TRANSPORT_CRYPTO_EXCLUDE_PATHS = '/openapi.json,/docs,/docs/oauth2-redirect,/redoc,/transport/crypto/frontend-config,/transport/crypto/public-key,/common/download,/common/download/resource'
|