# -------- 应用配置 -------- # 应用运行环境 APP_ENV = 'dev' # 应用名称 APP_NAME = 'ShiErFeng-FastAPI' # 应用代理路径 APP_ROOT_PATH = '/dev-api' # 应用主机 APP_HOST = '0.0.0.0' # 应用端口 APP_PORT = 9099 # 应用版本 APP_VERSION= '1.9.0' # 应用是否开启热重载 APP_RELOAD = true # 应用工作进程数 APP_WORKERS = 1 # 应用是否开启IP归属区域查询 APP_IP_LOCATION_QUERY = true # 应用是否允许账号同时登录 APP_SAME_TIME_LOGIN = true # 应用是否为演示模式 APP_DEMO_MODE = false # 应用是否禁用Swagger文档 APP_DISABLE_SWAGGER = false # 应用是否禁用ReDoc文档 APP_DISABLE_REDOC = false # 可信代理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 = 'mysql' # 数据库主机 DB_HOST = '127.0.0.1' # 数据库端口 DB_PORT = 3306 # 数据库用户名 DB_USERNAME = 'root' # 数据库密码 DB_PASSWORD = 'mysqlroot' # 数据库名称 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 = '127.0.0.1' # Redis端口 REDIS_PORT = 6379 # Redis用户名 REDIS_USERNAME = '' # Redis密码 REDIS_PASSWORD = '' # Redis数据库 REDIS_DATABASE = 2 # -------- 日志配置 -------- # 是否启用日志脱敏 LOG_MASK_ENABLED = false # 日志脱敏占位符 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 = 'dev' # 服务名称(用于统一标识服务) LOG_SERVICE_NAME = 'shierfeng-fastapi-backend' # Worker 标识(auto 自动生成) LOG_WORKER_ID = 'auto' # -------- 传输层加解密配置 -------- # 是否启用传输层加解密 TRANSPORT_CRYPTO_ENABLED = false # 传输层加解密模式:off=关闭,optional=明文/密文兼容,required=命中接口强制加密 TRANSPORT_CRYPTO_MODE = 'off' # 传输层加解密算法标识 TRANSPORT_CRYPTO_ALGORITHM = 'RSA_OAEP_AES_256_GCM' # 当前启用的密钥版本标识 TRANSPORT_CRYPTO_KID = 'default' # 传输层RSA位数,需与下方密钥对匹配 TRANSPORT_CRYPTO_RSA_KEY_SIZE = 4096 # 传输层公钥,默认提供一套可用示例值;团队使用时可按需替换 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-----' # 传输层私钥,必须与上方公钥成对使用 TRANSPORT_CRYPTO_PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----' # 历史密钥对配置,JSON数组格式 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'