-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path.env.example
More file actions
256 lines (222 loc) · 12.7 KB
/
Copy path.env.example
File metadata and controls
256 lines (222 loc) · 12.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# Docker 镜像仓库前缀(默认留空使用 docker.io,国内网络可切换镜像源)
# 华为云 SWR:swr.cn-north-4.myhuaweicloud.com/<命名空间>/
# DaoCloud:docker.m.daocloud.io/(官方镜像可用)
# 腾讯云:mirror.ccs.tencentyun.com/
DOCKER_REGISTRY=
# 应用基础配置
APP_NAME=opencli-admin
APP_ENV=production
DEBUG=false
SECRET_KEY=change-me-in-production-use-long-random-string
# Required before saving any Provider API key. Generate once with:
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# Keep the same value for the lifetime of saved provider credentials.
CREDENTIAL_ENCRYPTION_KEY=
# Fleet 鉴权(ADR-0005):所有 /api 与 /mcp 路由的静态 Bearer Token。
# 留空 = 关闭鉴权(开发姿态,启动时仅允许绑定 localhost);
# 非 localhost 绑定(如 Docker 的 0.0.0.0)必须设置,否则启动直接拒绝。
# 前端取值:构建期 VITE_API_AUTH_TOKEN,或浏览器 localStorage 'apiAuthToken'(优先)。
# MCP server / CLI(backend/mcp_server.py、backend/cli.py)读同名环境变量。
# 一旦设置此值,边缘 Agent(backend/agent_server.py)也必须设置同值的 AGENT_API_TOKEN
# (或直接复用 API_AUTH_TOKEN)——覆盖 HTTP 注册(/api/v1/nodes/register)和
# WS 反向通道(/api/v1/nodes/ws、/api/v1/browsers/agents/ws)两条握手路径。
API_AUTH_TOKEN=
# MCP Streamable HTTP 的 DNS-rebinding 允许列表;PUBLIC_URL 已自动加入。
# 仅在同一部署还通过额外域名访问 /mcp 时补充,逗号分隔。
OPENCLI_MCP_ALLOWED_HOSTS=
OPENCLI_MCP_ALLOWED_ORIGINS=
# 组织身份验证(标准 OpenID Connect;提供方可为 Gitea、Keycloak、Authentik、
# Azure AD 或任何兼容 OIDC 的企业身份源)。
OIDC_ISSUER=
OIDC_AUDIENCE=
# 可选;留空时后端通过 <OIDC_ISSUER>/.well-known/openid-configuration 发现 jwks_uri。
OIDC_JWKS_URL=
# 仅用于首次部署或紧急恢复,不替代正式 OIDC 登录。
BOOTSTRAP_ADMIN_TOKEN=
# 服务端口(两种启动模式均生效)
API_PORT=8031 # API 服务对外端口
NOVNC_PORT=6080 # Agent 实例 1 noVNC 对外端口(docker-compose port mapping)
NOVNC_BASE_PORT=6080 # 与 NOVNC_PORT 保持一致;API 用此值推算各实例 noVNC 端口
# 中心节点对外地址(远端 Agent 注册时使用,也用于生成安装脚本里的 CENTRAL_API_URL)
# 必须是远端 Agent 能访问到的地址。留空时系统尝试从请求头推断(代理环境下可能不准确)。
# 示例:http://192.168.1.1:8031 或 https://admin.example.com
PUBLIC_URL=
# ── Fleet LAN / NetBird ─────────────────────────────────────────────────────
# NetBird 只负责 fleet 内网连通;/api 鉴权仍由 API_AUTH_TOKEN 控制。
# lan — 普通局域网/手工网络
# netbird — 生成 agent 安装脚本时注入 NetBird bootstrap 参数
FLEET_NETWORK_PROVIDER=lan
# off — 不安装/启动 NetBird client(默认)
# host — 在 agent 宿主机安装 NetBird,并运行 `netbird up --setup-key ...`
# docker — 运行 netbirdio/netbird sidecar 容器(Linux host network + privileged)
NETBIRD_MODE=off
# NetBird setup key。设置后,安装脚本默认按 host 模式入网。
# 建议用一次性或有使用次数限制的 key。
NETBIRD_SETUP_KEY=
# 自托管 NetBird management URL(可选),例如:https://api.netbird.example.com:443
NETBIRD_MANAGEMENT_URL=
NETBIRD_IMAGE_TAG=latest
# 数据库
# 默认使用 SQLite,生产环境建议切换为 PostgreSQL
DATABASE_URL=sqlite+aiosqlite:///./opencli_admin.db
# DATABASE_URL=postgresql+asyncpg://opencli:opencli_secret@localhost:5432/opencli_admin
# 任务执行模式
# local — 默认,任务在 API 进程内 asyncio 执行,无需 Redis(单机部署推荐)
# celery — 分布式执行,需要启动 Redis + Worker + Beat:
# docker-compose --profile celery up
TASK_EXECUTOR=local
# ── Dify / Graphon 兼容运行时(docker compose --profile dify up)────────────
# OpenCLI 后端访问 Sidecar 的内部地址;在宿主机单独运行时可改为 localhost。
DIFY_GRAPHON_RUNTIME_URL=http://dify-graphon-runtime:8095
DIFY_GRAPHON_PORT=8095
# Sidecar 硬限制:单次 DSL、单条输出事件、运行时长和并发执行数。
DIFY_GRAPHON_MAX_REQUEST_BYTES=1048576
DIFY_GRAPHON_MAX_OUTPUT_BYTES=1048576
DIFY_GRAPHON_EXECUTION_TIMEOUT_SECONDS=120
DIFY_GRAPHON_MAX_CONCURRENT_RUNS=2
DIFY_GRAPHON_MAX_STORED_RUNS=512
DIFY_GRAPHON_RUN_RETENTION_SECONDS=3600
DIFY_GRAPHON_TMPFS_SIZE=64m
# P0 默认不提供 Code Sandbox;留空时 code 节点始终返回 blocked。
DIFY_SANDBOX_ENDPOINT=
DIFY_SANDBOX_API_KEY=
# 可选的 dify-plugin-daemon-slim 0.6.5 可执行文件路径;P0 镜像不内置。
DIFY_GRAPHON_SLIM_PATH=
# ── Image Studio / private InvokeAI GPU sidecar ────────────────────────────
# Disabled until the operator explicitly starts the image-studio profile and
# supplies the server-side adapter configuration. Never expose these as
# NEXT_PUBLIC_* or VITE_* variables: browsers only call OpenCLI's API.
INVOKEAI_ENABLED=false
INVOKEAI_BASE_URL=http://invokeai:9090
INVOKEAI_API_TOKEN=
# Required only when starting the image-studio profile. It must be a private
# image built and attested from the approved upstream commit, expressed as
# repository@sha256:digest. The published discovery digest in upstream.json
# is deliberately not deployable because it comes from a different commit.
INVOKEAI_ATTESTED_IMAGE=
INVOKEAI_REQUEST_TIMEOUT_SECONDS=30
IMAGE_ASSET_STORAGE_PATH=/data/image-studio/assets
# JoyAI-VL-Interaction 工具节点(tool.realtime.vl.interaction)
# 自托管 vLLM-Omni 服务地址(jd-opensource/JoyAI-VL-Interaction, 8B, Apache-2.0)。
# 留空 = 节点执行降级为 error 事件, 不崩 run。可选 JOYAI_VL_API_KEY 加 Bearer。
# JOYAI_VL_URL=http://joyai-vl:8000
# JOYAI_VL_API_KEY=
# 采集编排(NAS 推荐 iii)
# admin — API 内置 scheduler.py 驱动定时采集(默认)
# iii — III engine + schedule-bootstrap 驱动 cron;见 .env.nas.example
# COLLECTION_ORCHESTRATOR=admin
# ODP_INGEST_URL=http://odp-ingest:8040
# III_URL=ws://iii-engine:49134
# ── ODP 数据面(Python 侧:backend/pipeline/odp_client.py)───────────────────
# ODP ingest(Rust 热路径)的 HTTP 地址。留空 = 不转发(走 sqlite legacy 路径)。
# ODP_INGEST_URL=http://odp-ingest:8040
# ODP HTTP 请求超时(秒)。默认 10。
# ODP_INGEST_TIMEOUT=10
# ODP 转发失败时的语义(backend/pipeline/storer.py):
# unset/false(默认,fail-open)— 转发异常仅 log warning,继续走 sqlite legacy 路径,不中断采集
# true/1/yes(fail-closed) — 转发异常直接 raise,中断该次采集任务
# ODP_INGEST_REQUIRED=false
# ── ODP 数据面(Rust 侧:odp-rs/crates/*)──────────────────────────────────
# odp-store 的 Postgres 连接串;未设置时回退读 DATABASE_URL(见 odp-store/src/main.rs)。
# ODP_DATABASE_URL=postgresql://opencli:opencli_secret@postgres:5432/opencli_admin
# odp-store 每批写入 Postgres 的最大行数。默认 500。
# ODP_STORE_BATCH_SIZE=500
# Redis Stream 消费者组名(odp-bus)。默认 "odp-store"。
# ODP_BUS_GROUP=odp-store
# Redis Stream 消费者实例名(odp-bus)。默认 "<hostname>-<pid>",同组内建议每实例唯一。
# ODP_BUS_CONSUMER=
# odp-ingest 允许无 Redis bus 启动的显式开关(commit d1f33d9)。
# 默认关闭 = fail-fast:没有可用的 Redis bus(ODP_REDIS_URL/REDIS_URL 未设置或不可达)时,
# odp-ingest 直接拒绝启动 —— 没有 bus 就没有持久化,装作 202 accepted 是在撒谎。
# =1 才是显式的 dev/test-only 例外:仅在内存里跑,事件全部当作未持久化处理(见 handlers.rs),
# 绝不能在生产/NAS 部署中打开。
# ODP_INGEST_ALLOW_NO_BUS=0
# 采集模式
# local — 默认,API 直接驱动本地 Docker 网络内的采集器(Chrome、爬虫等)
# agent — 分布式边缘采集;采集任务分发到远端 Agent 节点执行
COLLECTION_MODE=local
# ── 边缘节点 Agent 配置(在 Agent 所在机器上配置,非中心节点)─────────────────
# 中心 API 地址,Agent 启动时自动注册自己(留空则跳过自动注册)
# CENTRAL_API_URL=http://192.168.1.1:8031
# Agent 对外暴露的 URL(留空则自动检测出口 IP)
# NetBird HTTP 注册模式可填写:http://<netbird-ip-or-dns>:19823
# AGENT_ADVERTISE_URL=http://192.168.1.100:19823
# Agent 监听端口(默认 19823)
# AGENT_PORT=19823
# Agent 采集模式:cdp(推荐,直连 Chrome DevTools)| bridge(Browser Bridge 扩展)
# AGENT_MODE=cdp
# Agent 标签(默认取主机名)
# AGENT_LABEL=edge-node-1
# 注册方式:http(局域网,中心主动回调 Agent)| ws(NAT/跨网,反向 WS 通道,Phase 2)| off(不注册)
# AGENT_REGISTER=http
# Redis / Celery — 仅在 TASK_EXECUTOR=celery 时需要
REDIS_URL=redis://localhost:6379/0
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1
# 接口鉴权(可选)
API_KEY_ENABLED=false
API_KEY=
# CLI 渠道二进制白名单(ADR-0005,审计 P0-4)。cli 渠道会执行任意二进制,
# 只有列在这里的二进制才允许运行;逗号分隔完整路径/名称,留空(默认)= 全部拒绝。
# 例:CLI_CHANNEL_ALLOWED_BINARIES=/usr/bin/mycli,C:\tools\other.exe
CLI_CHANNEL_ALLOWED_BINARIES=
# 邮件发送(通知渠道使用)
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=
# 采集超时(秒)
# opencli 子进程最长执行时间(local 模式 + agent 侧)
# OPENCLI_TIMEOUT=120
# 中心 HTTP dispatch 到 LAN agent 的请求超时(建议 > OPENCLI_TIMEOUT)
# AGENT_HTTP_TIMEOUT=130
# 中心通过反向 WS 通道 dispatch 的等待超时
# AGENT_WS_TIMEOUT=130
# OpenTabs runtime adapter(agent_task runtime="opentabs")
# OpenTabs 默认本机端口为 9515;secret 来自 ~/.opentabs/extension/auth.json
# OPENTABS_BASE_URL=http://127.0.0.1:9515
# OPENTABS_SECRET=
# Webhook 签名密钥
WEBHOOK_SECRET=change-me-webhook-secret
# PostgreSQL(启用 postgres profile 时使用)
POSTGRES_DB=opencli_admin
POSTGRES_USER=opencli
POSTGRES_PASSWORD=opencli_secret
# Chrome / CDP 浏览器池
# 单实例模式(默认):API 自动使用 http://chrome-1:19222
OPENCLI_CDP_ENDPOINT=http://chrome-1:19222
# 多实例池(动态扩容):
# 1. 启动 N 个实例:./scripts/chrome-pool.sh start N
# 2. 脚本会打印 AGENT_POOL_ENDPOINTS 值,复制到此处后重启 API
# 3. 查看状态:./scripts/chrome-pool.sh status
# 4. 缩减实例:./scripts/chrome-pool.sh start 1 (stop 只保留实例 1)
# AGENT_POOL_ENDPOINTS=http://chrome-1:19222,http://chrome-2:19222,http://chrome-3:19222
AGENT_POOL_ENDPOINTS=
# ── 边缘节点 Agent 配置 ──────────────────────────────────────────────────────
# 部署方式一(推荐):All-in-one Agent 镜像(Chrome 内置,无网络隔离问题)
# docker compose --profile agent up agent
# 或独立运行:docker run xjh1994/opencli-admin-agent ...
#
# 部署方式二:分离式(agent_server.py + 外部 Chrome 容器)
# AGENT_REGISTER=http 适合局域网,中心可直接回调 agent
# AGENT_REGISTER=ws 适合 NAT/跨网,agent 主动连中心反向 WS 通道
# 中心 API 地址(运行在 agent 机器上时填写)
# CENTRAL_API_URL=http://192.168.1.1:8031
# Agent 自身的可访问地址(中心用此地址回调,ws 模式下为 agent 的标识符)
# NetBird HTTP 注册模式可填写:http://<netbird-ip-or-dns>:19823
# AGENT_ADVERTISE_URL=http://192.168.1.100:19823
# Agent HTTP 监听端口
# AGENT_PORT=19823
# 人类可读标签
# AGENT_LABEL=my-edge-node
# 注册方式:http | ws | off
# AGENT_REGISTER=http
# ── Agent 镜像变体 ────────────────────────────────────────────────────────────
# INSTALL_CHROME=false → 使用无 Chrome 镜像(~200 MB,默认),需宿主机提供 Chrome
# INSTALL_CHROME=true → 使用含 Chrome 镜像(~1.2 GB,后缀 -chrome),自包含,无需宿主机 Chrome
# 设为 true 时同时设置 CHROME_SUFFIX=-chrome,让 docker-compose 选对应镜像
INSTALL_CHROME=false
CHROME_SUFFIX=
# 默认时区
DEFAULT_TIMEZONE=Asia/Shanghai