trackica Docs

环境变量

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

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

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

生产环境最小配置

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

还需要选择一种邮件服务,否则验证码和邀请只会写入服务端日志。

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

API 与数据库

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

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

对外地址与浏览器访问

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

TRACKICA_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 校验都可能与实际域名不一致。

邮件与登录

Resend

变量默认值说明
RESEND_API_KEY空设置后启用 Resend
RESEND_FROM_EMAILnoreply@multica.ai发件地址,必须属于已验证域名

SMTP

只要 SMTP_HOST 非空,SMTP 就会优先于 Resend。

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

Google OAuth

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

注册范围

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

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

附件存储

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

S3 或兼容存储

变量默认值说明
S3_BUCKET空Bucket 名称,不要填写完整 hostname
S3_REGIONus-west-2Bucket 所在区域
AWS_ACCESS_KEY_IDSDK 默认凭据链静态 access key
AWS_SECRET_ACCESS_KEYSDK 默认凭据链静态 secret key
AWS_ENDPOINT_URL空MinIO 等 S3 兼容 endpoint
S3_USE_PATH_STYLE自定义 endpoint 时为 true是否使用 path-style 地址
ATTACHMENT_DOWNLOAD_MODEautoauto、cloudfront、presign 或 proxy
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,逗号分隔
TRACKICA_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 私钥,用途同上
飞书TRACKICA_LARK_SECRET_KEYbase64 编码的 32 字节凭据加密密钥
SlackTRACKICA_SLACK_SECRET_KEYbase64 编码的 32 字节 token 加密密钥
TelegramTRACKICA_TELEGRAM_SECRET_KEYbase64 编码的 32 字节 Bot token 加密密钥
ComposioCOMPOSIO_API_KEY启用 Composio 工具连接
ComposioCOMPOSIO_CALLBACK_BASE_URL回调 API 地址;可回退到 TRACKICA_PUBLIC_URL
ComposioCOMPOSIO_STATE_SECRETOAuth state 签名密钥;可从 JWT_SECRET 派生
自托管 GitTRACKICA_VCS_INTEGRATION_ENABLEDForgejo/Gitea/GitLab 集成开关,compose 默认开启
自托管 GitTRACKICA_VCS_SECRET_KEYbase64 编码的 32 字节加密密钥(openssl rand -base64 32);未配置时该功能整体不可用
插件TRACKICA_PLUGIN_SECRET_KEYbase64 编码的 32 字节密钥,用于加密已存 secret 和 surface 启动 URL
插件TRACKICA_PLUGIN_SURFACE_ORIGIN路由到后端的独立无 Cookie 浏览器 origin;必须不同于 app/API origin,并保留 Host
插件TRACKICA_PLUGIN_API_URL带版本的插件 Public API 完整 Base URL,例如 https://plugin-api.example.com/v1;未设置时使用 TRACKICA_PUBLIC_URL + /v1
插件TRACKICA_PLUGIN_DIR开发时用于发布本地插件包的可选绝对目录

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

配置步骤见 GitHub 集成、飞书 Bot、Slack Bot和 Telegram Bot。

服务端 LLM

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

变量默认值说明
TRACKICA_LLM_API_KEY空OpenAI 兼容 API key
TRACKICA_LLM_BASE_URL空OpenAI 兼容 endpoint
TRACKICA_LLM_DEFAULT_MODELgpt-5.6-luna请求未指定模型时使用
TRACKICA_LLM_MAX_RETRIES2单次调用的重试上限;0 表示禁用重试,1–5 表示最多重试 N 次

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

有四个功能会使用这一层,并把以下数据发送到你配置的 endpoint:

  • 对话标题自动生成 —— 发送新对话中用户的第一条消息,原文发送。附件不会包含在内。
  • 后续提问建议(智能体回复下方的按钮)—— 发送对话末尾的内容:最多 6 条消息,其中被追问的那条回复上限 3000 字符,更早的每条上限 800 字符。
  • 甘特图状态摘要 —— 发送用户选择的最多 100 个事项,包括标识、标题、描述(最多 2000 字符)、状态、优先级、日期和项目标题。
  • 项目快照摘要 —— 发送结构化项目事实:状态、负责人、里程碑、任务、交付、代码仓库检查、进度、健康信号和风险标记。不包含事项描述、评论、附件或聊天内容。 API key 与 base URL 都为空时,这一层关闭,不会发出任何上游请求——上面的功能都不再发送内容。如果你的政策不允许这一层把数据发到部署之外,这就是受支持的配置方式:对话继续使用客户端标题,后续提问与 AI 甘特图摘要不再出现,项目快照保留事实回退内容。

这只覆盖辅助生成这一层。智能体执行是另一条数据路径:守护进程调用本机已配置的 AI 编程工具,并使用该工具自己的凭据,不会把上面的 TRACKICA_LLM_* 配置传给它。已完成任务的记忆提炼也走这条本机路径:服务端为整个工作区选择一台在线的所有者或管理员机器,只有该机器能收到跨项目的提炼任务;它会在调用本机 Codex 前完成脱敏,并固定使用 gpt-5.6-sol。只有选中机器离线后,另一台管理员机器才会接管;每条任务仍保留租约作为最后一道防重保护。把上面的变量留空不影响记忆提炼。

守护进程配置

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

变量默认值说明
TRACKICA_SERVER_URLws://localhost:8080/wstrackica API / WebSocket 地址,也接受 http(s)
TRACKICA_DAEMON_DEVICE_NAME主机名运行时列表中的设备名
TRACKICA_AGENT_RUNTIME_NAMELocal Agent运行时显示名
TRACKICA_DAEMON_POLL_INTERVAL30s没有唤醒事件时的执行任务轮询间隔
TRACKICA_DAEMON_HEARTBEAT_INTERVAL15s心跳间隔
TRACKICA_DAEMON_MAX_CONCURRENT_TASKS20单个守护进程的并发执行任务上限
TRACKICA_AGENT_TIMEOUT0单次执行的绝对时限;0 表示不设置
TRACKICA_AGENT_IDLE_WATCHDOG30m没有输出且没有工具执行时的静默上限
TRACKICA_AGENT_TOOL_WATCHDOG2h单个工具调用持续静默的上限
TRACKICA_OPENCODE_IDLE_WATCHDOG10mOpenCode 专用静默阈值
TRACKICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT10mCodex 语义静默阈值
TRACKICA_CODEX_FIRST_TURN_TIMEOUT0显式覆盖 Codex 首轮无进展上限;0 保持默认值。实际首轮等待仍受 TRACKICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT 和总执行超时限制——需将 TRACKICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT 设为严格大于此值(并留出余量),否则等待会被截断至该值,且会跳过模型目录启动重试。设为相等还不够:语义计时器先启动,两者相等时仍可能丢失该重试
TRACKICA_CODEX_HANDSHAKE_TIMEOUT30sCodex app-server 启动握手上限
TRACKICA_DAEMON_AUTO_UPDATECloud true;自托管 false是否自动检查并更新 CLI
TRACKICA_DAEMON_AUTO_UPDATE_INTERVAL6h检查更新的间隔
TRACKICA_DAEMON_AUTO_RELOADtrue是否在 trackica 二进制被带外替换(brew upgrade、重新下载、本地构建)后重启到新二进制。与 TRACKICA_DAEMON_AUTO_UPDATE 相互独立
TRACKICA_WORKSPACES_ROOT~/trackica_workspaces执行任务工作目录的根目录
TRACKICA_AGENT_TEMP_BASE/tmp(Linux/macOS)仅适用于 Linux/macOS。私有 task 临时目录的父目录;必须是现有、可写的绝对路径,无效值会使 task 启动失败,不会回退到 /tmp。请选择较短的路径——子工具可能会在其中绑定 AF_UNIX socket;Linux 的 sun_path 上限为 108 字节,macOS 为 104 字节
TRACKICA_KEEP_ENV_AFTER_TASKfalse保留执行任务目录用于调试
TRACKICA_DAEMON_LOCAL_DIRECTORY_ISOLATIONtruelocal_directory 被占用时,任务是否在自己的 git worktree 中执行而不是等待。设为 false 则这类任务严格串行,详见项目资源

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

TRACKICA_CLAUDE_PATH=/opt/bin/claude
TRACKICA_CLAUDE_ARGS=--max-turns 40

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

守护进程配置的持久化

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

trackica config set poll_interval 10s
trackica config show

支持的键:

键默认值说明
server_urlws://localhost:8080/wstrackica API / WebSocket 地址
app_url空浏览器登录使用的 Web 地址
workspace_id空默认工作区
device_name主机名运行时列表中的设备名
runtime_nameLocal Agent运行时显示名
workspaces_root~ 下按 profile 区分的路径执行任务工作目录的根目录
max_concurrent_tasks20并发执行任务上限;0 或留空表示未设置
poll_interval30s执行任务轮询间隔
heartbeat_interval15s心跳间隔
agent_timeout不限制单次执行的绝对时限
codex_semantic_inactivity_timeout10mCodex 语义静默阈值
codex_handshake_timeout30sCodex app-server 握手上限
disable_auto_update跟随环境true 关闭自动更新;false 清除本地覆盖,回到环境变量或默认
auto_update_check_interval6h检查更新的间隔
disable_auto_reload跟随环境true 让守护进程不再跟随磁盘上被替换的二进制;false 清除本地覆盖。与 disable_auto_update 分开解析

几条取值规则:

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

观测与统计

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

接下来