R26-1 R26-2 R26-3: 修复 env 注入并补部署校验与 smoke
这个提交包含在:
+157
-107
@@ -1,5 +1,11 @@
|
||||
## hyb-oa 试运行环境变量示例(单机)
|
||||
##
|
||||
## 说明:
|
||||
## - 统一以 deploy/trialrun/.env 作为 trialrun 部署事实源。
|
||||
## - 默认使用 env_file 注入 server / worker / init 容器环境。
|
||||
## - 推荐使用无引号值;旧的带引号写法当前仍兼容,但建议后续逐步改成无引号。
|
||||
## - 普通字符串、布尔值、数字、cron 都可直接写为无引号值。
|
||||
##
|
||||
## 使用方式:
|
||||
## cp deploy/trialrun/.env.example deploy/trialrun/.env
|
||||
## 然后按需修改 deploy/trialrun/.env 中的值(不要提交 .env)
|
||||
@@ -9,128 +15,172 @@
|
||||
## - OA 单独使用 oa.example.com 一类二级域名
|
||||
## - 正式公网环境请保持 APP_ORIGIN=https://oa.example.com
|
||||
## - 正式公网环境请保持 COOKIE_SECURE=true
|
||||
## - 若仅做本机临时演练,再改回 http://127.0.0.1:3000 和 COOKIE_SECURE=false
|
||||
##
|
||||
|
||||
# ===== 基础域名(用于 refresh cookie 的 origin 校验)=====
|
||||
# 单域托管模式下,前端与后端同域访问(建议生产/试运行)。
|
||||
APP_ORIGIN="https://oa.example.com"
|
||||
# ===== 运行模式与基础域名 =====
|
||||
NODE_ENV=production
|
||||
APP_ORIGIN=https://oa.example.com
|
||||
APP_TIMEZONE=Asia/Shanghai
|
||||
HOST=0.0.0.0
|
||||
PORT=3000
|
||||
COOKIE_SECURE=true
|
||||
OPENAPI_DOCS_ENABLED=false
|
||||
SERVE_CLIENT_DIST=true
|
||||
CLIENT_DIST_DIR=../client/dist
|
||||
SIGNED_URL_TTL_SECONDS=600
|
||||
MAX_UPLOAD_SIZE_BYTES=10485760
|
||||
|
||||
# ===== 服务端密钥(必须修改)=====
|
||||
JWT_SECRET="change_me_in_trialrun"
|
||||
# ===== 敏感字段加密(F25)=====
|
||||
# 生成方式示例:openssl rand -base64 32
|
||||
FIELD_ENCRYPTION_KEY=""
|
||||
# ===== 服务端密钥(必须修改) =====
|
||||
JWT_SECRET=change_me_in_trialrun
|
||||
FIELD_ENCRYPTION_KEY=
|
||||
|
||||
# ===== OIDC/SSO(F23,可选)=====
|
||||
# OIDC_ENABLED="true"
|
||||
# OIDC_ISSUER_URL=""
|
||||
# OIDC_CLIENT_ID=""
|
||||
# OIDC_CLIENT_SECRET=""
|
||||
# OIDC_REDIRECT_URI="http://127.0.0.1:3000/api/auth/oidc/callback"
|
||||
# OIDC_SCOPES="openid profile email"
|
||||
# ===== 密码 / 登录安全 =====
|
||||
PASSWORD_RESET_CODE_TTL_SECONDS=600
|
||||
DEV_SHOW_PASSWORD_RESET_CODE=false
|
||||
AUTH_LOGIN_FAIL_WINDOW_SECONDS=900
|
||||
AUTH_LOGIN_FAIL_MAX_ATTEMPTS=5
|
||||
AUTH_LOGIN_LOCK_SECONDS=1800
|
||||
RATE_LIMIT_ENABLED=true
|
||||
RATE_LIMIT_LOGIN_MAX=10
|
||||
RATE_LIMIT_LOGIN_WINDOW=1 minute
|
||||
PUBLIC_SECURITY_HARDENING_ENABLED=true
|
||||
|
||||
# ===== 企业微信入口 / OAuth(R18,可选) =====
|
||||
WECOM_ENABLED="false"
|
||||
WECOM_ENTRY_ENABLED="false"
|
||||
WECOM_CORP_ID=""
|
||||
WECOM_AGENT_ID=""
|
||||
WECOM_AGENT_SECRET=""
|
||||
WECOM_OAUTH_ENABLED="false"
|
||||
WECOM_REDIRECT_URI="https://oa.example.com/api/auth/wecom/callback"
|
||||
# 可填写多个 host,逗号分隔,用于企微回跳和公网 returnTo 白名单
|
||||
WECOM_ALLOWED_RETURN_HOSTS="oa.example.com"
|
||||
IM_NOTIFIER_ENABLED="true"
|
||||
# ===== 可观测性 =====
|
||||
METRICS_ENABLED=true
|
||||
OTEL_TRACES_ENABLED=false
|
||||
|
||||
# ===== 数据库(Compose 内部连接)=====
|
||||
POSTGRES_DB="hyb_oa"
|
||||
POSTGRES_USER="hyboa_user"
|
||||
POSTGRES_PASSWORD="hyboa_password"
|
||||
DATABASE_URL="postgresql://hyboa_user:hyboa_password@db:5432/hyb_oa?schema=public"
|
||||
# ===== OIDC / SSO(可选) =====
|
||||
OIDC_ENABLED=false
|
||||
OIDC_ISSUER_URL=
|
||||
OIDC_CLIENT_ID=
|
||||
OIDC_CLIENT_SECRET=
|
||||
OIDC_REDIRECT_URI=https://oa.example.com/api/auth/oidc/callback
|
||||
OIDC_SCOPES=openid profile email
|
||||
|
||||
# ===== 存储(票据上传目录)=====
|
||||
# 在 deploy/trialrun/docker-compose.yml 中映射到宿主机 deploy/trialrun/data/storage
|
||||
STORAGE_DIR="/data/storage"
|
||||
# 可选:对象存储(MinIO/S3 兼容,F21)
|
||||
# - 默认 local:文件写到 STORAGE_DIR
|
||||
# - 启用 MinIO:STORAGE_DRIVER="s3" 并启用 compose profile:--profile minio
|
||||
STORAGE_DRIVER="local" # local|s3
|
||||
S3_ENDPOINT="http://minio:9000"
|
||||
S3_REGION="us-east-1"
|
||||
S3_BUCKET="hyb-oa"
|
||||
S3_ACCESS_KEY_ID="minioadmin"
|
||||
S3_SECRET_ACCESS_KEY="minioadmin"
|
||||
S3_FORCE_PATH_STYLE="true"
|
||||
# ===== 企业微信入口 / OAuth(可选) =====
|
||||
WECOM_ENABLED=false
|
||||
WECOM_ENTRY_ENABLED=false
|
||||
WECOM_CORP_ID=
|
||||
WECOM_AGENT_ID=
|
||||
WECOM_AGENT_SECRET=
|
||||
WECOM_OAUTH_ENABLED=false
|
||||
WECOM_REDIRECT_URI=https://oa.example.com/api/auth/wecom/callback
|
||||
WECOM_ALLOWED_RETURN_HOSTS=oa.example.com
|
||||
IM_NOTIFIER_ENABLED=true
|
||||
|
||||
MINIO_ROOT_USER="minioadmin"
|
||||
MINIO_ROOT_PASSWORD="minioadmin"
|
||||
# ===== 数据库(Compose 内部连接) =====
|
||||
POSTGRES_DB=hyb_oa
|
||||
POSTGRES_USER=hyboa_user
|
||||
POSTGRES_PASSWORD=hyboa_password
|
||||
DATABASE_URL=postgresql://hyboa_user:hyboa_password@db:5432/hyb_oa?schema=public
|
||||
# SHADOW_DATABASE_URL=postgresql://hyboa_user:hyboa_password@db:5432/hyb_oa_shadow
|
||||
|
||||
# ===== 单域托管 client/dist =====
|
||||
SERVE_CLIENT_DIST="true"
|
||||
CLIENT_DIST_DIR="../client/dist"
|
||||
OPENAPI_DOCS_ENABLED="false"
|
||||
# ===== 存储与上传 =====
|
||||
STORAGE_DIR=/data/storage
|
||||
STORAGE_DRIVER=local
|
||||
S3_ENDPOINT=http://minio:9000
|
||||
S3_REGION=us-east-1
|
||||
S3_BUCKET=hyb-oa
|
||||
S3_ACCESS_KEY_ID=minioadmin
|
||||
S3_SECRET_ACCESS_KEY=minioadmin
|
||||
S3_FORCE_PATH_STYLE=true
|
||||
MINIO_ROOT_USER=minioadmin
|
||||
MINIO_ROOT_PASSWORD=minioadmin
|
||||
|
||||
# ===== 网络与端口 =====
|
||||
HOST="0.0.0.0"
|
||||
PORT="3000"
|
||||
# ===== OCR(off | mock | tencent) =====
|
||||
OCR_PROVIDER=mock
|
||||
OCR_CRON_ENABLED=true
|
||||
OCR_MAX_ATTEMPTS=3
|
||||
OCR_POLL_CRON=*/5 * * * * *
|
||||
OCR_BATCH_SIZE=10
|
||||
OCR_LOCK_TTL_SECONDS=300
|
||||
OCR_TIMEOUT_MS=5000
|
||||
TENCENT_SECRET_ID=
|
||||
TENCENT_SECRET_KEY=
|
||||
TENCENT_OCR_REGION=ap-beijing
|
||||
|
||||
# ===== Cookie 安全(HTTPS 反代时建议 true)=====
|
||||
COOKIE_SECURE="true"
|
||||
# ===== 验真 / 发票 / 节假日 =====
|
||||
INVOICE_VERIFICATION_ENABLED=false
|
||||
LEAVE_HOLIDAY_CALENDAR_ENABLED=false
|
||||
VERIFICATION_PROVIDER=mock
|
||||
VERIFICATION_POLL_CRON=* * * * *
|
||||
VERIFICATION_MAX_ATTEMPTS=3
|
||||
VERIFICATION_RETRY_COOLDOWN_SECONDS=60
|
||||
VERIFICATION_TIMEOUT_MS=5000
|
||||
INVOICE_ARCHIVE_CRON=30 2 * * *
|
||||
INVOICE_ARCHIVE_UNUSED_DAYS=90
|
||||
INVOICE_ARCHIVE_BATCH_SIZE=200
|
||||
|
||||
# ===== Metrics(Prometheus)=====
|
||||
METRICS_ENABLED="true"
|
||||
# ===== 预算 / 费控 =====
|
||||
BUDGET_CONTROL_MODE=warn
|
||||
BUDGET_PRECHECK_ENABLED=false
|
||||
PAYMENT_BATCH_ENABLED=false
|
||||
|
||||
# ===== 安全基线(试运行建议打开)=====
|
||||
RATE_LIMIT_ENABLED="true"
|
||||
RATE_LIMIT_LOGIN_MAX="10"
|
||||
RATE_LIMIT_LOGIN_WINDOW="1 minute"
|
||||
# ===== 周边集成 / ERP =====
|
||||
ERP_SYNC_ENABLED=false
|
||||
ERP_SYNC_PROVIDER=mock
|
||||
ERP_SYNC_ENDPOINT=
|
||||
ERP_SYNC_TIMEOUT_MS=5000
|
||||
ERP_SYNC_AUTH_TOKEN=
|
||||
ERP_JOURNAL_EXPORT_ENDPOINT=
|
||||
ERP_PROCUREMENT_EXPORT_ENDPOINT=
|
||||
ERP_ASSET_EXPORT_ENDPOINT=
|
||||
ERP_MASTER_DATA_ENDPOINT=
|
||||
ERP_PROCUREMENT_TIMEOUT_MS=5000
|
||||
ERP_ASSET_TIMEOUT_MS=5000
|
||||
ERP_MASTER_DATA_TIMEOUT_MS=5000
|
||||
ERP_MASTER_DATA_SYNC_CRON=
|
||||
TRAVEL_SYNC_ENABLED=false
|
||||
INTEGRATION_OUTBOX_CRON=* * * * *
|
||||
INTEGRATION_OUTBOX_BATCH_SIZE=20
|
||||
INTEGRATION_OUTBOX_MAX_ATTEMPTS=5
|
||||
INTEGRATION_OUTBOX_RETRY_SECONDS=120
|
||||
|
||||
# ===== OCR(试运行可先用 mock)=====
|
||||
OCR_PROVIDER="mock" # off|mock|tencent
|
||||
OCR_MAX_ATTEMPTS="3"
|
||||
OCR_POLL_CRON="*/5 * * * * *" # 试运行/演练可用秒级;生产建议分钟级
|
||||
OCR_BATCH_SIZE="10"
|
||||
OCR_LOCK_TTL_SECONDS="300"
|
||||
OCR_TIMEOUT_MS="5000"
|
||||
TENCENT_SECRET_ID=""
|
||||
TENCENT_SECRET_KEY=""
|
||||
TENCENT_OCR_REGION="ap-beijing"
|
||||
# ===== 邮件 =====
|
||||
EMAIL_ENABLED=false
|
||||
EMAIL_FROM=[email protected]
|
||||
EMAIL_BASE_URL=https://oa.example.com
|
||||
SMTP_HOST=
|
||||
SMTP_PORT=587
|
||||
SMTP_SECURE=false
|
||||
SMTP_USER=
|
||||
SMTP_PASS=
|
||||
|
||||
# ===== 委派回收 =====
|
||||
DELEGATION_REVOKE_CRON="0 * * * *"
|
||||
# ===== 委派 / 作业 =====
|
||||
DELEGATION_REVOKE_CRON=0 * * * *
|
||||
JOB_DRIVER=pgboss
|
||||
JOBS_ENABLED=true
|
||||
PG_BOSS_SCHEMA=pgboss
|
||||
|
||||
# ===== 作业系统(pg-boss,可回滚到 cron)=====
|
||||
JOB_DRIVER="pgboss" # cron|pgboss
|
||||
JOBS_ENABLED="true" # false 时整体关闭作业(排障/回滚/或启用 worker 拆分)
|
||||
PG_BOSS_SCHEMA="pgboss" # pg-boss 在 PG 内的 schema
|
||||
# ===== AI(默认关闭) =====
|
||||
AI_ASSIST_ENABLED=false
|
||||
AI_PROVIDER=mock
|
||||
AI_BASE_URL=
|
||||
AI_MODEL=
|
||||
AI_TIMEOUT_MS=10000
|
||||
AI_AUTH_TOKEN=
|
||||
|
||||
# ===== Worker 拆分(可选,F20)=====
|
||||
# 如需启用“API 进程 + Worker 进程”:
|
||||
# 1) 设置 JOBS_ENABLED="false"(server 不跑作业)
|
||||
# 2) 启动 compose 时加:--profile worker(会启动 worker 容器,worker 内强制 JOBS_ENABLED=true)
|
||||
# ===== Trialrun 初始化管理员 =====
|
||||
TRIALRUN_ADMIN_EMAIL=[email protected]
|
||||
TRIALRUN_ADMIN_PHONE=13800000000
|
||||
TRIALRUN_ADMIN_PASSWORD=
|
||||
TRIALRUN_ADMIN_EMPLOYEE_NO=T0000
|
||||
TRIALRUN_ADMIN_NAME=Trialrun Admin
|
||||
TRIALRUN_ADMIN_TITLE=系统管理员
|
||||
TRIALRUN_ADMIN_HIRE_DATE=2020-01-01
|
||||
|
||||
# ===== 试运行引导管理员(E20)=====
|
||||
TRIALRUN_ADMIN_EMAIL="[email protected]"
|
||||
TRIALRUN_ADMIN_PHONE="13800000000"
|
||||
# 留空则首次 seed 自动生成并打印一次性口令
|
||||
TRIALRUN_ADMIN_PASSWORD=""
|
||||
|
||||
# ===== Prisma Migration Diff(本地维护 migration 可选) =====
|
||||
# SHADOW_DATABASE_URL="postgresql://hyboa_user:hyboa_password@db:5432/hyb_oa_shadow"
|
||||
|
||||
# ===== R13-R17 小团队内部管理默认上线建议 =====
|
||||
PORTAL_HOME_ENABLED="true"
|
||||
GLOBAL_SEARCH_ENABLED="true"
|
||||
ANNOUNCEMENTS_ENABLED="true"
|
||||
PRESENCE_BOARD_ENABLED="true"
|
||||
WEEKLY_REPORT_ENABLED="true"
|
||||
EMPLOYEE_LIFECYCLE_ENABLED="true"
|
||||
TODO_BOARD_ENABLED="true"
|
||||
PROJECT_DOMAIN_ENABLED="true"
|
||||
PROJECT_LINKING_ENABLED="true"
|
||||
PROJECT_COMMUNICATION_LOG_ENABLED="true"
|
||||
PROJECT_CLOSURE_CHECKLIST_ENABLED="true"
|
||||
CONFIDENTIAL_DOC_REFS_ENABLED="true"
|
||||
PUBLIC_SECURITY_HARDENING_ENABLED="true"
|
||||
PAYMENT_BATCH_ENABLED="false"
|
||||
CUTOVER_CONSOLE_ENABLED="false"
|
||||
# ===== 功能开关环境闸门(trialrun 推荐) =====
|
||||
PORTAL_HOME_ENABLED=true
|
||||
GLOBAL_SEARCH_ENABLED=true
|
||||
ANNOUNCEMENTS_ENABLED=true
|
||||
PRESENCE_BOARD_ENABLED=true
|
||||
WEEKLY_REPORT_ENABLED=true
|
||||
EMPLOYEE_LIFECYCLE_ENABLED=true
|
||||
TODO_BOARD_ENABLED=true
|
||||
WORKFLOW_DEFINITION_ADMIN_ENABLED=false
|
||||
CUTOVER_CONSOLE_ENABLED=false
|
||||
PROJECT_DOMAIN_ENABLED=true
|
||||
PROJECT_LINKING_ENABLED=true
|
||||
PROJECT_COMMUNICATION_LOG_ENABLED=true
|
||||
PROJECT_CLOSURE_CHECKLIST_ENABLED=true
|
||||
CONFIDENTIAL_DOC_REFS_ENABLED=true
|
||||
|
||||
在新工单中引用
屏蔽一个用户