Multica Docs

环境变量

自托管 Multica 常用的服务端、存储、集成和运行时配置。

Multica 在进程启动时读取环境变量。修改后通常需要重启对应的 API、Web 或守护进程。Docker Compose 的 docker compose restart 不会重新读取 .env,要用 up -d 重建容器才能生效。

本页只列面向部署者的配置;测试变量和内部 task 变量不在这里展开。本页是分组参考;完整部署步骤见自托管快速上手

生产环境最小配置

DATABASE_URL=postgres://user:password@postgres:5432/multica?sslmode=require
JWT_SECRET=<long-random-secret>
APP_ENV=production
FRONTEND_ORIGIN=https://multica.example.com
MULTICA_APP_URL=https://multica.example.com
MULTICA_PUBLIC_URL=https://api.multica.example.com

还需要选择一种验证码投递服务,否则验证码只会写入服务端日志。工作区邀请邮件仍需要 Resend 或 SMTP。

JWT_SECRET 在生产环境为必填:当 APP_ENV=production 时,后端会在密钥为空或等于已知占位值时拒绝启动(用 openssl rand -hex 32 生成)。也不要在生产环境设置 MULTICA_DEV_VERIFICATION_CODE

API 与数据库

变量默认值说明
DATABASE_URL本地 multica 数据库PostgreSQL 连接地址
DATABASE_MAX_CONNS25单个 API 进程的最大数据库连接数
DATABASE_MIN_CONNS5单个 API 进程保留的最小连接数
MULTICA_DATABASE_STARTUP_TIMEOUT3m容器启动过程中,migration 与 API 共享的暂时性数据库故障重试时长;设为 0 时每个阶段只尝试一次
MULTICA_DATABASE_CONNECT_TIMEOUT5s启动期间单次数据库连接的兜底超时;pgx 原生 connect_timeoutPGCONNECT_TIMEOUT 或 service 配置优先
PORT8080API 监听端口
JWT_SECRET生产环境必填登录 JWT、部分签名流程使用的密钥;生产环境对空值或已知占位值拒绝启动
APP_ENV生产环境设为 production
AUTH_TOKEN_TTL720h(30 天)浏览器 JWT 与 cookie 有效期;接受 Go duration 或正整数秒数
LOG_LEVEL应用默认日志级别
MULTICA_SHUTDOWN_HOLD_DURATION0收到终止信号后,开始优雅退出前等待多久
MULTICA_RUNTIME_RECONNECT_GRACE3h运行时离线后可重新连接且不终止在途 task 的宽限时间;低于 150s 时按 150s 处理

在 Kubernetes 中设置 shutdown hold 时,terminationGracePeriodSeconds 要大于 hold 与实际退出所需时间之和。

对外地址与浏览器访问

变量默认值说明
FRONTEND_ORIGIN用户访问的前端 origin;用于 CORS、cookie 和邀请链接
MULTICA_APP_URL回退到 FRONTEND_ORIGIN用户可访问的 Web 地址;CLI 登录和账号绑定链接使用它
MULTICA_PUBLIC_URL公网 API 地址;用于 webhook URL 和运行时连接说明
MULTICA_DAEMON_SERVER_URL回退到 MULTICA_PUBLIC_URL,再回退到 MULTICA_APP_URL / FRONTEND_ORIGINAPI 进程写入 multica setup self-host 命令的服务端地址;守护进程访问 API 的地址与公网 webhook 地址不同时设置
CORS_ALLOWED_ORIGINS额外允许的 HTTP origin,逗号分隔
ALLOWED_ORIGINS回退到 CORS / 前端地址WebSocket origin 白名单,逗号分隔
COOKIE_DOMAIN前后端不同 host 且浏览器直接访问 API 域时必须设置;单域部署保持为空

MULTICA_DAEMON_SERVER_URL 会由无需认证的 /api/config 接口返回,客户端可以读取。请将它视为公开配置,切勿填入凭据、令牌或其他密钥。

前端和 API 使用不同 host、且浏览器直接访问 API 域时,必须设置 COOKIE_DOMAIN,否则浏览器读不到 CSRF cookie——所有写请求返回 403 CSRF validation failed,而读请求一切正常。取值用能同时覆盖两个 host 的最窄父域(.agent.example.com 优于 .example.com)。它会把登录会话 cookie 扩散到该域下的所有 host,只有这些 host 都由同一可信主体运维时才可用。修改后需要在两个 host 上清除旧 cookie 并重新登录。若采用自托管快速上手的同源配方(浏览器只访问 app 域),保持为空即可。不要填写 IP 地址,浏览器会忽略带 IP Domain 的 cookie。

自托管部署需要设置 FRONTEND_ORIGIN。缺少它时,邀请链接、cookie 安全属性和 WebSocket origin 校验都可能与实际域名不一致。

验证码与登录

飞书验证码 Webhook

只要任一飞书配置存在,所有登录验证码就只会发送到飞书,配置或发送失败时不会回退到邮件。两个变量都必须设置。工作区邀请邮件仍使用 Resend 或 SMTP。

变量默认值说明
MULTICA_VERIFICATION_FEISHU_WEBHOOK_URL包含凭据的自定义机器人 Webhook 地址
MULTICA_VERIFICATION_FEISHU_SIGN_SECRET飞书时间戳签名所需的密钥

Resend

变量默认值说明
RESEND_API_KEY设置后启用 Resend
RESEND_FROM_EMAIL[email protected]发件地址,必须属于已验证域名

SMTP

两个飞书配置都为空时,只要 SMTP_HOST 非空,SMTP 就会优先于 Resend。

变量默认值说明
SMTP_HOSTSMTP 主机;设置后启用 SMTP
SMTP_PORT25常见值:25、587、465
SMTP_USERNAME用户名;匿名 relay 留空
SMTP_PASSWORD密码
SMTP_FROM_EMAIL回退到 RESEND_FROM_EMAILEnvelope From 与邮件 From
SMTP_TLSstarttlsimplicitsmtpsssl 表示隐式 TLS;465 会自动启用
SMTP_TLS_INSECUREfalse跳过证书校验,仅用于可信内网
SMTP_EHLO_NAME主机名严格 relay 要求的 EHLO/FQDN

Google OAuth

变量默认值说明
GOOGLE_CLIENT_IDGoogle OAuth client ID
GOOGLE_CLIENT_SECRETGoogle OAuth client secret
GOOGLE_REDIRECT_URIhttp://localhost:3000/auth/callback必须与 Google Console 中的回调地址完全一致

注册范围

变量默认值说明
ALLOW_SIGNUPtrue未配置任何白名单时是否允许创建新账号
ALLOWED_EMAILS允许注册的完整邮箱,逗号分隔
ALLOWED_EMAIL_DOMAINS允许注册的邮箱域名,逗号分隔
DISABLE_WORKSPACE_CREATIONfalse禁止所有用户新建工作区;没有 owner/admin 例外
MULTICA_DEV_VERIFICATION_CODE非 production 环境使用的固定 6 位测试验证码

白名单的准确判断顺序见登录与注册

附件存储

没有设置 S3_BUCKET 时,Multica 使用本地磁盘。

S3 或兼容存储

变量默认值说明
S3_BUCKETBucket 名称,不要填写完整 hostname
S3_REGIONus-west-2Bucket 所在区域
AWS_ACCESS_KEY_IDSDK 默认凭据链静态 access key
AWS_SECRET_ACCESS_KEYSDK 默认凭据链静态 secret key
AWS_ENDPOINT_URLMinIO 等 S3 兼容 endpoint
S3_USE_PATH_STYLE自定义 endpoint 时为 true是否使用 path-style 地址
ATTACHMENT_DOWNLOAD_MODEautoautocloudfrontpresignproxy
ATTACHMENT_DOWNLOAD_URL_TTL30m签名下载地址的有效期

内网 MinIO 等 endpoint 无法被浏览器直接访问时,使用 ATTACHMENT_DOWNLOAD_MODE=proxy

本地磁盘

变量默认值说明
LOCAL_UPLOAD_DIR./data/uploads文件与 metadata 的保存目录,需要持久化卷
LOCAL_UPLOAD_BASE_URL可选的公开 base URL;留空时返回站内相对地址

CloudFront

变量说明
CLOUDFRONT_DOMAINCDN 域名
CLOUDFRONT_KEY_PAIR_IDCloudFront key pair ID
CLOUDFRONT_PRIVATE_KEY完整私钥
CLOUDFRONT_PRIVATE_KEY_SECRET从 Secrets Manager 读取私钥时使用

Redis 与限流

变量默认值说明
REDIS_URL用于共享限流、实时事件和 token cache;未设置时实时事件和邀请限流回退到进程内存,认证限流不生效
REDIS_DISABLE_CLIENT_NAMEfalse托管 Redis 禁止 CLIENT SETNAME 时设为 true
RATE_LIMIT_AUTH5单 IP 每分钟发送验证码或发起 Google 登录的次数
RATE_LIMIT_AUTH_VERIFY20单 IP 每分钟验证验证码的次数
RATE_LIMIT_INVITATION_ACTOR_10M10每位邀请人在 10 分钟滑动窗口内可创建的工作区邀请数;设为 0 可关闭此项限流
RATE_LIMIT_INVITATION_WORKSPACE_24H50同一工作区内所有管理员在 24 小时滑动窗口内可创建的邀请总数;设为 0 可关闭此项限流
RATE_LIMIT_INVITATION_RECIPIENT_24H6同一规范化收件邮箱跨工作区在 24 小时滑动窗口内可收到的邀请数;设为 0 可关闭此项限流
RATE_LIMIT_TRUSTED_PROXIES允许提供 X-Forwarded-For 的代理 CIDR,逗号分隔
MULTICA_TRUSTED_PROXIES自动化 webhook 与实时连接使用的可信代理 CIDR

反向代理后的部署需要填写真实代理网段。不要直接信任所有来源,否则客户端可以伪造转发 IP。

认证限流需要配置 REDIS_URL;未配置时,启动日志会提示认证限流已关闭。邀请限流在没有 Redis 时仍使用进程内存,配置 Redis 后则在多个副本间共享额度。如果已配置的 Redis 临时不可用,认证限流仍选择放行,而邀请创建会返回可重试的 503,不会在失去防护时发送邮件。

外部集成

集成变量说明
GitHubGITHUB_APP_SLUGGitHub App slug
GitHubGITHUB_WEBHOOK_SECRETWebhook HMAC 与连接 state 签名密钥
GitHubGITHUB_APP_IDPR 卡片的 CI 状态、可合并性和"从 GitHub 选择"仓库都需要它
GitHubGITHUB_APP_PRIVATE_KEY与 App ID 配套的完整 PEM 私钥,用途同上
飞书MULTICA_LARK_SECRET_KEYbase64 编码的 32 字节凭据加密密钥
SlackMULTICA_SLACK_SECRET_KEYbase64 编码的 32 字节 token 加密密钥
TelegramMULTICA_TELEGRAM_SECRET_KEYbase64 编码的 32 字节 Bot token 加密密钥
ComposioCOMPOSIO_API_KEY启用 Composio 工具连接
ComposioCOMPOSIO_CALLBACK_BASE_URL回调 API 地址;可回退到 MULTICA_PUBLIC_URL
ComposioCOMPOSIO_STATE_SECRETOAuth state 签名密钥;可从 JWT_SECRET 派生
自托管 GitMULTICA_VCS_INTEGRATION_ENABLEDForgejo/Gitea/GitLab 集成开关,compose 默认开启
自托管 GitMULTICA_VCS_SECRET_KEYbase64 编码的 32 字节加密密钥(openssl rand -base64 32);未配置时该功能整体不可用
插件MULTICA_PLUGIN_SECRET_KEYbase64 编码的 32 字节密钥,用于加密已存 secret 和 surface 启动 URL
插件MULTICA_PLUGIN_SURFACE_ORIGIN路由到后端的独立无 Cookie 浏览器 origin;必须不同于 app/API origin,并保留 Host
插件MULTICA_PLUGIN_API_URL带版本的插件 Public API 完整 Base URL,例如 https://plugin-api.example.com/v1;未设置时使用 MULTICA_PUBLIC_URL + /v1
插件MULTICA_PLUGIN_DIR开发时用于发布本地插件包的可选绝对目录

不配置 GITHUB_APP_ID 和私钥时,PR 仍会正常关联、镜像和触发合并转 done,但卡片上不显示 CI 与可合并状态,"从 GitHub 选择"仓库入口也会禁用。

配置步骤见 GitHub 集成飞书 BotSlack BotTelegram Bot

服务端 LLM

这组配置用于服务端的辅助生成能力,例如对话标题;它不是智能体 task 时使用的 AI 编程工具凭据。

变量默认值说明
MULTICA_LLM_API_KEYOpenAI 兼容 API key
MULTICA_LLM_BASE_URLOpenAI 兼容 endpoint
MULTICA_LLM_DEFAULT_MODELgpt-5.6-luna请求未指定模型时使用
MULTICA_LLM_MAX_RETRIES2单次调用的重试上限;0 表示禁用重试,15 表示最多重试 N 次

MULTICA_LLM_MAX_RETRIES 是重试策略的唯一配置源。不设置时使用默认的 2 次;设为 0 表示每次调用只发一个请求;设为 1–5 表示最多重试这么多次。它是上限而不是配额:只有可重试的失败才会消耗它,请求成功或调用方自身的超时都会让调用提前结束。其它取值(负数、非数字、大于 5)会让服务启动失败,而不是被静默纠正。上限是一个延迟预算:退避从 0.5s 开始翻倍,上限 8s,更大的预算会超出调用方自身的超时,把可重试的失败变成超时失败。重试覆盖连接失败以及 HTTP 408、409、429 和 5xx;其余 4xx 直接返回。服务启动时会以 llm retry policy 打印生效策略,其中不包含任何凭据。

有两个功能会使用这一层,它们都会把聊天内容发送到你配置的 endpoint:

  • 对话标题自动生成 —— 发送新对话中用户的第一条消息,原文发送。附件不会包含在内。
  • 后续提问建议(智能体回复下方的按钮)—— 发送对话末尾的内容:最多 6 条消息,其中被追问的那条回复上限 3000 字符,更早的每条上限 800 字符。

API key 与 base URL 都为空时,这一层关闭,不会发出任何上游请求——上面两个功能都不再发送内容。如果你的政策不允许这一层把聊天内容发到部署之外,这就是受支持的配置方式:对话继续使用客户端根据第一条消息生成的标题,后续提问按钮不再出现,其余功能不受影响。

这只覆盖辅助生成这一层。智能体执行是另一条数据路径:智能体回复对话时,由你的守护进程调用该智能体的 AI 编程工具,用的是那个工具自己的凭据,守护进程不会把上面的 MULTICA_LLM_* 配置传给它。(智能体自身需要的 task 级 Multica 连接变量由守护进程单独注入。)把上面的变量留空不影响这条路径——它由智能体的运行时配置决定。

守护进程配置

下面的变量在运行智能体的电脑上读取,不是在 API 容器中读取。

变量默认值说明
MULTICA_SERVER_URLws://localhost:8080/wsMultica API / WebSocket 地址,也接受 http(s)
MULTICA_DAEMON_DEVICE_NAME主机名运行时列表中的设备名
MULTICA_AGENT_RUNTIME_NAMELocal Agent运行时显示名
MULTICA_DAEMON_POLL_INTERVAL30s没有唤醒事件时的 task 轮询间隔
MULTICA_DAEMON_HEARTBEAT_INTERVAL15s心跳间隔
MULTICA_DAEMON_MAX_CONCURRENT_TASKS20单个守护进程的并发 task 上限
MULTICA_AGENT_TIMEOUT0单次执行的绝对时限;0 表示不设置
MULTICA_AGENT_IDLE_WATCHDOG2h没有输出且没有工具执行时的静默上限;0 表示整套 watchdog 关闭
MULTICA_AGENT_TOOL_WATCHDOGMULTICA_AGENT_IDLE_WATCHDOG单个工具调用持续静默的上限;只有希望工具比模型有更多余量时才单独设置,0 表示工具执行期间永不强制停止
MULTICA_OPENCODE_IDLE_WATCHDOG10mOpenCode 专用静默阈值
MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUTMULTICA_AGENT_IDLE_WATCHDOGCodex 语义静默阈值。Codex 自己的计时器看不到工具是否在执行,因此跟随 idle / tool 预算中较大的那个,而不再单独保留一个更短的上限
MULTICA_CODEX_FIRST_TURN_TIMEOUT0显式覆盖 Codex 首轮无进展上限;0 保持默认值。实际首轮等待仍受 MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT 和总执行超时限制——需将 MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT 设为严格大于此值(并留出余量),否则等待会被截断至该值,且会跳过模型目录启动重试。设为相等还不够:语义计时器先启动,两者相等时仍可能丢失该重试
MULTICA_CODEX_HANDSHAKE_TIMEOUT30sthread/startthread/resume60sCodex app-server 启动握手上限;显式设置后会统一覆盖两类预算
MULTICA_DAEMON_AUTO_UPDATECloud true;自托管 false是否自动检查并更新 CLI
MULTICA_DAEMON_AUTO_UPDATE_INTERVAL6h检查更新的间隔
MULTICA_DAEMON_AUTO_RELOADtrue是否在 multica 二进制被带外替换(brew upgrade、重新下载、本地构建)后重启到新二进制。与 MULTICA_DAEMON_AUTO_UPDATE 相互独立
MULTICA_WORKSPACES_ROOT~/multica_workspacestask 工作目录的根目录
MULTICA_AGENT_TEMP_BASE/tmp(Linux/macOS)仅适用于 Linux/macOS。私有 task 临时目录的父目录;必须是现有、可写的绝对路径,无效值会使 task 启动失败,不会回退到 /tmp。请选择较短的路径——子工具可能会在其中绑定 AF_UNIX socket;Linux 的 sun_path 上限为 108 字节,macOS 为 104 字节
MULTICA_KEEP_ENV_AFTER_TASKfalse保留 task 目录用于调试

守护进程注入智能体 task 的内部上下文见 Task 运行时环境

各 AI 编程工具可以使用 MULTICA_<PROVIDER>_PATH 覆盖命令路径;支持模型覆盖的工具还可以使用 MULTICA_<PROVIDER>_MODEL。QwenPaw 和 MiniMax Code 没有模型变量,因为 Multica 不会向它们传模型;MiniMax Code 的路径变量是 MULTICA_MCODE_PATH。详见 AI 编程工具对比。DeepSeek Harness 支持 MULTICA_DSH_PATHMULTICA_DSH_MODEL(取值为 dsh 模型目录中的模型 id,例如 deepseek-official/deepseek-chat)。ZeroClaw 支持 MULTICA_ZEROCLAW_PATH,但没有模型变量;模型由 ZeroClaw 的智能体配置管理。全机默认参数 MULTICA_<PROVIDER>_ARGS 目前支持 Claude Code、Codex、CodeBuddy、Qwen Code 和 QwenPaw 五款工具。对应变量是 MULTICA_CLAUDE_ARGSMULTICA_CODEX_ARGSMULTICA_CODEBUDDY_ARGSMULTICA_QWEN_ARGSMULTICA_QWENPAW_ARGS。例如:

MULTICA_CLAUDE_PATH=/opt/bin/claude
MULTICA_CLAUDE_ARGS=--max-turns 40

优先级为命令行 flag → 环境变量 → ~/.multica/config.json → 内置默认。watchdog 的行为见守护进程与运行时

守护进程配置的持久化

守护进程侧的常用配置也可以写入 ~/.multica/config.json,不必依赖 shell 环境变量;命名 profile 的配置文件在 ~/.multica/profiles/<name>/config.json

multica config set poll_interval 10s
multica config show

支持的键:

默认值说明
server_urlws://localhost:8080/wsMultica API / WebSocket 地址
app_url浏览器登录使用的 Web 地址
workspace_id默认工作区
device_name主机名运行时列表中的设备名
runtime_nameLocal Agent运行时显示名
workspaces_root~ 下按 profile 区分的路径task 工作目录的根目录
max_concurrent_tasks20并发 task 上限;0 或留空表示未设置
poll_interval30stask 轮询间隔
heartbeat_interval15s心跳间隔
agent_timeout不限制单次执行的绝对时限
codex_semantic_inactivity_timeout派生Codex 语义静默阈值。未设置时取 idle 与 tool watchdog 预算中较大的那个;tool 预算为 0 时回落到 idle 预算;只有整套 watchdog 关闭时才保留 Codex 自己的 10m
codex_handshake_timeout30sthread/startthread/resume60sCodex app-server 启动握手上限;显式设置后会统一覆盖两类预算
disable_auto_update跟随环境true 关闭自动更新;false 清除本地覆盖,回到环境变量或默认
auto_update_check_interval6h检查更新的间隔
disable_auto_reload跟随环境true 让守护进程不再跟随磁盘上被替换的二进制;false 清除本地覆盖。与 disable_auto_update 分开解析

几条取值规则:

  • duration 类键接受正的 Go duration(如 10s2h),0s 和负值会被拒绝。唯一例外是 agent_timeout0s 合法,表示明确关闭执行时限。
  • 传空字符串清除已持久化的值,回到环境变量或内置默认,例如 multica config set poll_interval ""
  • max_concurrent_tasks 要求非负整数。
  • 相对的 workspaces_root 值在保存时会转换为绝对路径。

观测与统计

变量默认值说明
ANALYTICS_DISABLEDfalse设为 true 关闭 PostHog 上报
POSTHOG_API_KEY不设置时统计上报关闭;接入自己的 PostHog 项目时填写
POSTHOG_HOSThttps://us.i.posthog.comPostHog 地址
METRICS_ADDRPrometheus metrics 监听地址;空表示不启动
REALTIME_METRICS_TOKEN保护 /health/realtime 的 bearer token

接下来