You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
9.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 查价中台环境变量模板(本地开发)
# 生产部署请使用:cp deploy/.env.production.example .env && bash deploy/install.sh
# 详见 deploy/README.md
MYSQL_HOST_PORT=3307
MYSQL_ROOT_PASSWORD=changeme
JWT_SECRET=your-256-bit-secret-change-in-production
# 宿主 Service Token 映射(JSON):token → { customerId, permissions[] }
HOST_SERVICE_TOKENS={"demo-host-token":{"customerId":"CUST_001","permissions":["pricing:markup:write"]}}
# 本地 development 默认跳过宿主 Token 鉴权(npm run dev);生产环境无效
# 若要在本地也校验 Token,设为 false
# HOST_SERVICE_AUTH_DISABLED=false
# 管理端可见客户列表(逗号分隔,与 HOST_SERVICE_TOKENS 合并)
CUSTOMER_REGISTRY=CUST_001,CUST_002,CUST_003
# 宿主两步公开接口(美美与共等):true=免 Token;后期改 false 并走 Service Token
HOST_PUBLIC_API_ENABLED=false
HOST_PUBLIC_DEFAULT_CUSTOMER_ID=CUST_001
# ── RPA(PRD v0.6 GD-15,headed 录制后填入)────────────────────────
# 逗号分隔、按序探测;禁止 dashboard.mothership.com / www.mothership.com/quote
# 英文 locale 避免中文精简 widget(无 cargo editor);首页 + en-US 为推荐组合
MOTHERSHIP_QUOTE_URLS=https://www.mothership.com/
# 留空则 Playwright 默认;en-US headless 仅显示 zip 精简条,与地址 RPA 不兼容
# RPA_BROWSER_LOCALE=en-US
RPA_STORAGE_STATE_PATH=.rpa/mothership-storage.json
# 登录后查价录制专用 storage(与匿名隔离;npm run record:mothership -- --logged-in)
# RPA_LOGGED_IN_STORAGE_STATE_PATH=.rpa/mothership-logged-in-storage.json
# 缺会话文件时 headless 自动访问 MOTHERSHIP_QUOTE_URLS 获取 cookies(默认 true;设 false 则须手动 record:mothership)
# RPA_AUTO_BOOTSTRAP_STORAGE=true
RPA_MOCK_MODE=false
# Flock Freight(PRD §14 / 技术设计 §7.6;默认关闭,Mock 或显式 true 可联调)
# Flock Freight(本地开发默认开启;生产请显式 FLOCK_RPA_ENABLED=true)
FLOCK_RPA_ENABLED=true
FLOCK_QUOTE_URL=https://app.flockfreight.com/get-a-quote
# direct | dom | direct_then_dom(默认 Direct 优先,失败回退 DOM 填表)
FLOCK_QUOTE_MODE=direct_then_dom
FLOCK_STORAGE_STATE_PATH=.rpa/flock-storage.json
# 登录后查价录制产物(与匿名 flock-storage.json 隔离;npm run record:flock -- --logged-in)
# FLOCK_LOGGED_IN_STORAGE_STATE_PATH=.rpa/flock-logged-in-storage.json
# DOM/RPA 保障路径:账号密码登录(配置后禁用 random_qq / 无痕注册;勿提交真实密码)
# FLOCK_LOGIN_EMAIL=
# FLOCK_LOGIN_PASSWORD=
# FLOCK_LOGIN_URL=https://app.flockfreight.com/login
# FLOCK_SELECTOR_LOGIN_EMAIL=input[type="email"], input[name="email"]
# FLOCK_SELECTOR_LOGIN_PASSWORD=input[type="password"], input[name="password"]
# FLOCK_SELECTOR_LOGIN_SUBMIT=button[type="submit"]
# 默认加载 .rpa/flock-storage.json(登录成功后回写;可跳过重复登录)
# FLOCK_LOAD_STORAGE_STATE=false
# 登录模式默认写回 storage;显式 false 可关闭
# FLOCK_SAVE_STORAGE_AFTER_QUOTE=false
# 卡顿 ≥20s 自动截图目录 .rpa/flock-stalls/(识别是否报价上限)
# FLOCK_STALL_MS=20000
# Flock selector(npm run record:flock 产出;未配时使用录制内置回退)
# FLOCK_SELECTOR_PICKUP_ZIP=role=textbox[name="Pickup ZIP Code"]
# FLOCK_SELECTOR_DELIVERY_ZIP=role=textbox[name="Delivery ZIP Code"]
# FLOCK_SELECTOR_PALLET_COUNT=role=textbox[name="Number of pallets"]
# FLOCK_SELECTOR_TOTAL_WEIGHT=role=textbox[name="Total shipment weight (lbs)"]
# FLOCK_SELECTOR_NEXT=[data-testid="anonymous_marketing_lead_quote_request_page__quote_request__submit_button"]
# FLOCK_TEST_EMAIL=3457189488@qq.com
# FLOCK_TEST_PHONE=7536407420
# 无登录凭据时的探针:无痕 + random_qq(有 FLOCK_LOGIN_* 时自动关闭)
# FLOCK_FRESH_SESSION_PER_QUOTE=true
# FLOCK_RANDOM_ACCOUNT_PER_QUOTE=true
# FLOCK_EMAIL_MODE=random_qq
# FLOCK_QUOTES_PER_EMAIL=3
FLOCK_WORKER_REUSE_SESSION=false
FLOCK_MIN_QUOTES=1
FLOCK_QUOTE_WAIT_MS=20000
FLOCK_FORM_WAIT_MS=20000
FLOCK_FIELD_PAUSE_MS=1000
FLOCK_SESSION_MAX_ROTATIONS=3
FLOCK_POLL_TIMEOUT_MS=210000
NEXT_PUBLIC_FLOCK_POLL_TIMEOUT_MS=210000
# qq.qqdna.com 号码库:FLOCK_EMAIL_MODE=qqdna
# Gmail/Outlook 别名基址(可选):
# FLOCK_EMAIL_ALIAS_BASE=yourname@gmail.com
# FLOCK_EMAIL_POOL=aa@gmail.com,bb@outlook.com
# FLOCK_PHONE_POOL=7536407420,18692104118
# 地址 commit 隔离:real=真实 MotherShip;mock=仅替代 commit(prove-rpa-chain 下游验证用)
RPA_ADDRESS_MODE=real
# 报价模式:direct=直连 axel API(默认,embed-demo 推荐)| widget=Playwright 页面交互
RPA_QUOTE_MODE=direct
# 方案 A:widget 双地址 vault 注入(widget 模式默认 true;显式 false 可关闭)
# RPA_DUAL_ADDRESS_PATCH=true
# place commit 修复模式:event=Google事件触发(默认) | state=React注入 | legacy=原逻辑
RPA_PLACE_FIX_MODE=event
# true 时注入 P0 实例拓扑/监听器指纹 + P2 fetch 劫持,fix-place 各阶段落盘 .rpa/place-diagnostic/
RPA_PLACE_DIAG=false
# 有头调试:RPA_HEADED=true 强制弹窗(MotherShip / Flock 共用);或 RPA_HEADLESS=false
RPA_HEADLESS=true
# RPA_HEADED=true
# RPA_SLOW_MO_MS=200
# 货物 drawer 填写完成后 page.pause()(仅人工验收时开启)
# RPA_CARGO_DRAWER_PAUSE=true
RPA_BROWSER_LOCALE=en-US
RPA_USE_PATCHRIGHT=false
# 反爬:playwright-extra stealth(与 patchright 二选一;部分页面会破坏 widget,默认 false)
RPA_USE_STEALTH=false
# 使用本机 Chrome/Edge,降低 HeadlessChrome 指纹(Flock 推荐 chrome)
RPA_BROWSER_CHANNEL=chrome
# 真人入口流:先打开首页再点 Get Quote(携带 Referer/Cookie)
# RPA_HUMAN_ENTRY_FLOW=true
# RPA_QUOTE_WARMUP_URL=https://www.mothership.com/
# headed 调试:慢动作毫秒;RPA_NETWORK_DEBUG=true 输出全部请求
# RPA_SLOW_MO_MS=100
# RPA_NETWORK_DEBUG=false
RPA_WORKER_ID=
RPA_QUEUE_ENABLED=true
# 驻留页单次会话加速(实验性,默认关;true 时需 worker + confirm 全链路)
RPA_PARKED_SESSION=false
# Selector(Playwright codegen / record-mothership 产出,填表 + submit)
# 录制 115541 / 115059 — 中英双语,逗号分隔按序尝试
RPA_SELECTOR_PICKUP_SECTION=#react-quoter-landing-plugin >> text=Pick up from,#react-quoter-landing-plugin >> text=Where to pick up,#react-quoter-landing-plugin >> text=从何处取货
RPA_SELECTOR_DELIVERY_SECTION=#react-quoter-landing-plugin >> text=Deliver to,#react-quoter-landing-plugin >> text=Delivery to,#react-quoter-landing-plugin >> text=送货至
RPA_SELECTOR_QUOTE_WIDGET=#react-quoter-landing-plugin
RPA_SELECTOR_PICKUP_STREET=#react-quoter-landing-plugin >> placeholder=Search by address,#react-quoter-landing-plugin >> role=textbox[name="Search by address"],#react-quoter-landing-plugin >> role=textbox[name="Search address"],#react-quoter-landing-plugin >> role=textbox[name="搜索地址"]
RPA_SELECTOR_DELIVERY_STREET=#react-quoter-landing-plugin >> placeholder=Search by address,#react-quoter-landing-plugin >> role=textbox[name="Search by address"],#react-quoter-landing-plugin >> role=textbox[name="Search address"],#react-quoter-landing-plugin >> role=textbox[name="搜索地址"]
RPA_SELECTOR_ADDRESS_SUGGESTION=#react-quoter-landing-plugin >> [role="listbox"] [role="option"],#react-quoter-landing-plugin >> li,.pac-item,[role="option"]
RPA_SELECTOR_CARGO_SECTION=#react-quoter-landing-plugin >> filter:text=Shipment details>>nth=4,#react-quoter-landing-plugin >> filter:text=Freight details>>nth=4,#react-quoter-landing-plugin >> filter:text=货运详情>>nth=4
RPA_SELECTOR_SUBMIT=role=button[name="GET QUOTE"],role=button[name="Get freight quote"],role=button[name="Get a freight quote"],role=button[name="获取货运报价"]
# 报价 tab/price selector 已废弃(Network-First);可留空
# RPA_SELECTOR_STANDARD_TAB=
# RPA_SELECTOR_GUARANTEED_TAB=
# RPA_SELECTOR_LOWEST_OPTION=
# RPA_SELECTOR_FASTEST_OPTION=
# RPA_SELECTOR_PRICE=
# 报价 API endpoint(HAR 校准辅助,仅 telemetry;不参与 runtime 匹配)
# 阶段0 录证白名单:services.mothership.com/axel/quote
MOTHERSHIP_QUOTE_API_URL_PATTERNS=services.mothership.com/axel/quote
# 设为 true 时输出全部 REQ/RESP(定位 json=0)
RPA_QUOTE_NETWORK_VISIBILITY=false
# 设为 true 时契约失败日志输出 raw JSON body
RPA_QUOTE_DEBUG_RAW=false
# 设为 true 时日志输出 JSON 候选 URL(校准 HAR pinned 用)
RPA_QUOTE_NETWORK_SNIFF=false
# Priority1 worker 填表提速(生产建议)
# RPA_DWELL_MS=0
# RPA_SLOW_MO_MS=0
# RPA_QUOTE_POLL_MS=600
# RPA_QUOTE_WAIT_MS=90000
# RPA_PRIORITY1_WORKER_FAST=true
RPA_SELECTOR_TRANSIT=text=business days
# 货物字段已改为 fillCargoInDrawer 动态 placeholder 定位,下列 env 仅兼容旧脚本,runtime 不再读取
# RPA_SELECTOR_PALLET_QTY=...
# RPA_SELECTOR_WEIGHT=...
# RPA_SELECTOR_LENGTH=...
# RPA_SELECTOR_WIDTH=...
# RPA_SELECTOR_HEIGHT=...
# 可选:仅当入口跳转 login / 客户账密登录后查价时使用
MOTHERSHIP_EMAIL=
MOTHERSHIP_PASSWORD=
# 登录态 dashboard Direct(跳过 DOM 填表);默认开,设 false 强制 DOM
# MS_DASHBOARD_DIRECT_QUOTE=true
# session-manager loginIfNeeded 使用(2026-07-15 登录页实探)
# RPA_SELECTOR_LOGIN_EMAIL=role=textbox[name="Email address"]
# RPA_SELECTOR_LOGIN_PASSWORD=role=textbox[name="Password"]
# RPA_SELECTOR_LOGIN_SUBMIT=role=button[name="Sign in"]
# ── MotherShip 登录后查价(Step 12.61;npm run record:mothership -- --logged-in 产出后回填)──
# 详见 docs/rpa-mothership-logged-in-sop.md;勿手猜 selector
# RPA_SELECTOR_MS_LOGGED_IN_ENTRY=
# RPA_SELECTOR_MS_LOGGED_IN_FORM_MARKER=
# RPA_SELECTOR_MS_LOGGED_IN_PICKUP=
# RPA_SELECTOR_MS_LOGGED_IN_DELIVERY=
# RPA_SELECTOR_MS_LOGGED_IN_CARGO=
# RPA_SELECTOR_MS_LOGGED_IN_SUBMIT=
# 已废弃:请改用 MOTHERSHIP_QUOTE_URLS
# MOTHERSHIP_QUOTE_URL=
# 开发基础设施模式: auto | docker | native
DEV_INFRA_MODE=native
# 本地 prisma migrate/seed 使用宿主机端口;容器内仍用 mysql:3306
DATABASE_URL=mysql://root:changeme@localhost:3307/chajia
REDIS_URL=redis://localhost:6379