Huly 配置参数详解
Huly selfhost 配置体系逐项详解(v0.7.426 实测):huly_v7.conf 七组顶层变量、14 个服务环境变量职责与内网依赖串、账号初始化双路径(Web 注册 vs 管理 CLI)、SMTP/SSL/默认内容/对象存储凭据实操与配置变更生效路径速查,含配置视角排障实录(2026-10-27)。
Huly 配置参数详解
目标:逐项讲清 Huly selfhost 部署的完整配置体系——顶层配置文件
huly_v7.conf的每个变量、Compose 编排中 14 个服务的环境变量职责、以及账号初始化(Web 注册与管理 CLI)两种机制,并给出 SMTP 邮件、SSL、禁用工作区默认内容等高频配置场景的实操步骤与配置视角的排障实录。部署过程本身见《Huly 0.7.426 Docker Compose 部署实战》,日常运维命令见《Huly 常用 CLI 命令与运维实战》。本文全部配置与命令在 v0.7.426 实例上实测(2026-10-27)。
一、环境信息与配置体系总览
| 项目 | 值 |
|---|---|
| Huly 版本 | v0.7.426 |
| 部署形态 | 官方 huly-selfhost 仓库 + Docker Compose |
| 配置文件 | huly_v7.conf(setup.sh 生成,软链为 .env 供 compose 读取) |
| 实测日期 | 2026-10-27 |
Huly 的配置分三层,改动前先判断目标参数在哪一层:
| 层 | 载体 | 管什么 | 典型例子 |
|---|---|---|---|
| 顶层 | huly_v7.conf | 版本、接入地址、数据库/队列凭据、数据卷路径、密钥 | HULY_VERSION、HOST_ADDRESS、CR_DB_URL |
| 服务级 | compose.yml 各服务的 environment | 服务间地址、功能开关、语言与品牌 | ACCOUNTS_URL、MODEL_ENABLED、DISABLED_FEATURES |
| 存储内置 | 各存储服务自身 | 数据库/搜索引擎/队列/对象存储的内部参数 | CockroachDB --accept-sql-without-tls、Elasticsearch ES_JAVA_OPTS |
理解三层分工的关键:compose 编排通过 ${变量} 把顶层 conf 的值注入各服务环境变量(如 DB_URL=${CR_DB_URL}),所以改顶层 conf 后重启服务即生效;而服务级 environment 里写死的值需要编辑 compose.yml 本身。
二、顶层配置 huly_v7.conf 逐项详解
setup.sh 交互生成的 huly_v7.conf 共七组变量。以下按组逐项说明(值取自本次实测实例,机密项脱敏)。
2.1 版本与编排项目名
| 变量 | 实测值 | 说明 |
|---|---|---|
HULY_VERSION | v0.7.426 | 平台版本标签,决定全部 hardcoreeng 服务程序的版本;取值参考官方 GitHub Releases 的 v* 生产标签 |
DESKTOP_CHANNEL | 0.7.426 | 桌面客户端更新通道,与 HULY_VERSION 去掉 v 前缀保持一致 |
DOCKER_NAME | huly-0.7.426-stack | Compose 项目名,同时决定各服务实例的默认命名前缀;同一宿主机跑多套 Huly 时必须改它防互串 |
版本升级注意:官方要求升级前先读 MIGRATION.md 找到目标版本的迁移说明;从 0.6.x 升 0.7.x 必须走专门的迁移流程(尤其 v0.7.204 的分步迁移),不能原地直接改版本号拉起。升级动作本身:改 HULY_VERSION/DESKTOP_CHANNEL → docker compose pull → docker compose up -d。
2.2 接入地址与 SSL
| 变量 | 实测值 | 说明 |
|---|---|---|
HOST_ADDRESS | localhost:8138 | 实例对外访问地址(域名或 IP:端口)。生产必须设为用户真实访问入口:account/front 等服务用它拼接注册回调、登录跳转等绝对地址,配错是「页面能开但注册/登录失败」的头号原因 |
SECURE | (空) | 是否启用 HTTPS/WSS。留空为 HTTP;设为 true 后服务间拼地址自动切换 https/wss 前缀(编排里的 ${SECURE:+s} 技巧) |
HTTP_PORT | 8138 | 入口监听端口(nginx 对外暴露) |
HTTP_BIND | (空) | 绑定 IP,留空绑全部网卡;只允许内网访问时填内网 IP |
SECURE/HTTP_PORT/HTTP_BIND/HOST_ADDRESS 任何一项变更后,必须重新生成 nginx 反代配置(仓库内 ./nginx.sh,只覆盖必要段落、保留自定义 SSL 配置)再重启服务,否则入口转发与实际端口/协议脱节。
2.3 产品级选项
| 变量 | 实测值 | 说明 |
|---|---|---|
TITLE | Huly | 站点标题(front 服务 TITLE 变量注入,浏览器标签页显示,可品牌化) |
DEFAULT_LANGUAGE | en | 界面默认语言;front 服务同名变量注入(可设 zh 等) |
LAST_NAME_FIRST | true | 姓名显示顺序(姓在前)。transactor 与 front 均注入该值 |
2.4 CockroachDB(主数据库)
| 变量 | 实测值 | 说明 |
|---|---|---|
CR_DATABASE | defaultdb | 业务库名。注意:主库 global_account schema 与各工作区事务库都在这一个库里(schema 级隔离) |
CR_USERNAME / CR_USER_PASSWORD | selfhost / 自动生成 | 业务连接账号与密码(setup.sh 生成 64 位十六进制) |
CR_DB_URL | postgres://selfhost:<密码>@cockroach:26257/defaultdb | 完整连接串,transactor/account/workspace/kvs 等服务共享注入;CockroachDB 兼容 PostgreSQL 线协议,故 URL 是 postgres scheme |
管理操作连接示例(实测可用;密码即 CR_USER_PASSWORD):
$ echo "SHOW DATABASES;" | ./cockroach sql --url "postgres://selfhost@localhost:26257/defaultdb?sslmode=disable"
database_name
defaultdb
postgres
system
提醒:官方 README 明确说明自托管编排中的 CockroachDB 是单节点
start-single-node形态,生产使用前应对照官方生产设置文档评估。
2.5 Redpanda(消息队列)
| 变量 | 实测值 | 说明 |
|---|---|---|
REDPANDA_ADMIN_USER | superadmin | 队列超管账号(compose 健康探针引用它;详见部署篇排障实录——探针与 dev-container 模式不匹配时显示 unhealthy,功能不受影响) |
REDPANDA_ADMIN_PWD | 自动生成 | 队列超管密码 |
应用服务连接队列用的是内网地址 redpanda:9092(各服务 QUEUE_CONFIG),不走 SASL。
2.6 数据卷路径
| 变量 | 实测值 | 说明 |
|---|---|---|
VOLUME_ELASTIC_PATH | 绝对路径 | 全文索引数据 |
VOLUME_FILES_PATH | 绝对路径 | 用户上传文件与附件(对象存储数据) |
VOLUME_CR_DATA_PATH | 绝对路径 | 数据库数据 |
VOLUME_CR_CERTS_PATH | 绝对路径 | 数据库证书目录 |
VOLUME_REDPANDA_PATH | 绝对路径 | 队列数据 |
五项留空则回退 Docker 命名卷;./setup.sh --reset-volumes 可一键全部复位为命名卷。自定义路径必须匹配服务内运行用户的 uid 属主——官方 README 原文提醒 chown -R 1000:1000 /var/huly/db(多数服务用 1000),但 redpanda 用 uid 101。本次实测正是踩了这两处(见第六节排障实录一、二)。
2.7 SECRET(服务间签名密钥)
| 变量 | 说明 |
|---|---|
SECRET | 全平台共享的签名密钥,注入各应用服务的 SERVER_SECRET,用于 JWT 签发校验与服务间信任。./setup.sh --secret 可重新生成;更换后所有已签发令牌失效,用户需重新登录 |
三、服务级环境变量详解
compose.yml 中 14 个服务的 environment 是第二层配置。顶层 conf 注入之外,服务间还有一组内网服务发现地址,逐项列表如下(均为实测编排事实)。
3.1 应用服务公共变量
| 变量 | 出现的服务 | 取值 | 说明 |
|---|---|---|---|
SERVER_SECRET | transactor/account/workspace/front/collaborator/fulltext/rekoni | ${SECRET} | 签名密钥(顶层 SECRET 注入) |
SERVER_PORT | transactor/account/front | 3333/3000/8080 | 各服务监听端口 |
DB_URL | transactor/account/workspace | ${CR_DB_URL} | 主库连接串 |
ACCOUNTS_DB_URL | workspace | ${CR_DB_URL} | 账号库连接(与主库同库) |
STORAGE_CONFIG | 全部有存储需求的服务 | `minio | minio?accessKey=minioadmin&secretKey=minioadmin` |
QUEUE_CONFIG | transactor/account/workspace/fulltext | redpanda:9092 | 队列地址(事件总线) |
ACCOUNTS_URL | transactor/collaborator/workspace | http://account:3000 或对外地址 | 账号服务地址:内网调用用服务名,对外回调用 ${HOST_ADDRESS} 拼接 |
FRONT_URL | transactor | http://localhost:8087 | 前端地址 |
STATS_URL | transactor/collaborator/account/workspace/fulltext | http://stats:4900 或对外 | 用量上报地址 |
TRANSACTOR_URL | account/workspace | ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor | 双地址分号串:分号前内网直连,分号后对外入口(经 nginx 反代路径 /_transactor) |
3.2 检索与前端专属变量
| 变量 | 出现的服务 | 取值/说明 |
|---|---|---|
ELASTIC_URL | front | http://elastic:9200 |
FULLTEXT_DB_URL | fulltext | http://elastic:9200(全文服务写索引的目标) |
ELASTIC_INDEX_NAME | fulltext | huly_storage_index(实际建出 huly_storage_index_v2,由服务端命名策略决定) |
REKONI_URL | fulltext | http://rekoni:4004(二进制文档解析服务,供附件全文提取) |
UPLOAD_URL | front | /files(上传路径前缀,nginx 转发到对象存储) |
TITLE / DEFAULT_LANGUAGE / LAST_NAME_FIRST | front | 顶层 2.3 节产品项注入 |
DISABLED_FEATURES | front | auto-translate,mailboxes(实测默认禁用自动翻译与邮箱功能) |
DESKTOP_UPDATES_CHANNEL | front | ${DESKTOP_CHANNEL} |
MODEL_ENABLED | account/workspace | *(启用全部领域模型;可用逗号清单收窄) |
3.3 值得掌握的两个编排事实
- 工作区默认内容开关:新工作区默认初始化预置内容(示例文档等)。官方 README 提供关闭方法——给 workspace 服务加环境变量指向不存在的路径即可:
workspace:
image: hardcoreeng/workspace:${HULY_VERSION}
environment:
# ...
- INIT_REPO_DIR=/no-init-scripts
- 可选服务组:
mongodb(AI 助手/日历需要)、redis+hulypulse(推送通知 HulyPulse 需要)在官方编排中默认注释。启用方式是去掉注释段并按需补VOLUME_MONGO_PATH等。基础项目管理功能(Tracker/Docs/Chat)不依赖这三者——本次实测 14 服务形态下全部核心功能可用。
四、账号初始化机制:Web 注册与管理 CLI
Huly 账号体系的存储形态:主库 global_account schema 的 person(人)、account(账号属性)、social_id(登录标识,email 类型即登录邮箱)、account_passwords(密码)等表。初始化有两条路径:
4.1 Web 注册(依赖 SMTP)
产品常规路径:入口页 Sign up → 填邮箱/姓名/密码 → 邮箱验证码 → 登录后创建或加入工作区。验证码由 account 服务经邮件服务下发,因此该路径要求配置 SMTP/邮件服务(官方仓库 guides/ 下有 SMTP 排障与 Gmail 配置指南;编排层需启用邮件服务并注入 MAIL_URL)。未配置邮件的实例,Sign up 会卡在验证码环节。
4.2 管理 CLI create-account(无邮件直落库)
管理工具(run-tool.sh 封装的 hardcoreeng/tool)创建账号直接写库且默认置为已验证,跳过邮箱验证码。实测:
$ ./run-tool.sh create-account root@huly.local -p q1w2e3r4 -f Root -l Admin
creating account Root Admin (root@huly.local)...
数据库侧验证(social_id 落库、verified_on 已置值):
type value key person_uuid created_on verified_on
email root@huly.local email:root@huly.local 5ea0f331-f8bc-49ba-8b0c-28668f021b02 1793106270129 1793106270128
两个实测确认的行为边界:
- 密码策略宽松:
q1w2e3r4(8 位纯字母数字)可被接受,无复杂度强制; - 重复创建显式报错,不覆盖已有账号:
PlatformError: ERROR: platform:status:AccountAlreadyExists {}
工作区初始化配套命令(同为实测):create-workspace demo "email:root@huly.local" 建工作区并指定所有者 social id;assign-workspace root@huly.local demo 把已有用户指派进工作区。完整命令矩阵见《Huly 常用 CLI 命令与运维实战》。
五、高频配置场景实操
5.1 从 HTTP 切换到 SSL
huly_v7.conf:SECURE=true,HOST_ADDRESS改为真实域名(443 端口经反代时可不带端口);./nginx.sh重新生成反代配置,在生成结果上补ssl_certificate/ssl_certificate_key段;docker compose up -d滚动重启应用服务(${SECURE:+s}使服务间地址自动变https/wss)。
5.2 修改对象存储凭据
编排中 STORAGE_CONFIG 写死 minioadmin/minioadmin。对象存储侧修改凭据后,需同步改 compose.yml 中所有服务的 STORAGE_CONFIG 值再 up -d——漏改任何一处都会出现「服务能起但附件读写失败」。
5.3 禁用新工作区默认内容
见 3.3 节第 1 条:workspace 服务加 INIT_REPO_DIR=/no-init-scripts。
5.4 配置变更生效路径速查
| 改动 | 生效动作 |
|---|---|
| 顶层 conf 业务项(端口/地址/版本/凭据) | docker compose up -d(滚动重建受影响服务) |
接入相关(SECURE/HTTP_PORT/HOST_ADDRESS) | 先 ./nginx.sh 重生成反代配置,再 up -d |
服务级 compose.yml 环境变量 | docker compose up -d 重建对应服务 |
SECRET | up -d 后全员重新登录(旧令牌全部失效) |
| 强依赖重启顺序 | 依赖方(如 fulltext)在依赖恢复后 docker compose restart fulltext(部署篇排障实录四) |
六、排障实录(配置视角)
6.1 Sign up 失败 / 卡验证码
官方 Troubleshooting 首条:页面能开但注册失败,先看 account 服务日志:
$ docker compose logs -f account
常见根因:HOST_ADDRESS 与实际访问地址不一致导致回调地址错误;或未配置邮件服务导致验证码无法下发。selfhost 未配 SMTP 时改用 4.2 节 CLI 路径初始化账号。
6.2 SSL wrong version number
SECURE=true 但入口实际提供 HTTP(或反代 TLS 配置缺失)时出现。核对反代证书配置、域名解析与 443 可达性;本地测试直接 SECURE= 复位为 HTTP 并重生成配置。
6.3 数据目录属主(bind mount 部署必踩)
自定义数据卷路径后,官方 README 的权限提醒(chown -R 1000:1000,redpanda 为 101)在实测中得到验证:redpanda 数据目录属主为 root 时启动报 error system:13, open: Permission denied(写 pid.lock 被拒);Elasticsearch 数据目录属主为 root 时报 AccessDeniedException: /usr/share/elasticsearch/data/nodes。修复动作与完整根因链见《Huly 0.7.426 Docker Compose 部署实战》排障实录一、二——核心是镜像内运行用户 uid 与宿主机目录属主一致。
6.4 工具命令缺环境变量
管理工具的命令需要运行参数齐备。实测 fulltext-reindex 未注入 FULLTEXT_URL 时显式报错:
please provide FULLTEXT_URL
补齐方式(挂载时注入环境变量):
RUN_TOOL_DOCKER_ARGS="-e FULLTEXT_URL=http://fulltext:4700" ./run-tool.sh fulltext-reindex demo
6.5 数据库密码认证失败排查路径
实测排查数据时曾遇到 password authentication failed for user selfhost。定位顺序:① 确认用的是 CR_USER_PASSWORD(而非容器编排里其他密码变量);② 客户端传密码的载体要与工具匹配(如 PGPASSWORD 环境变量或完整 URL);③ CockroachDB 为 --accept-sql-without-tls 模式,连接串用 sslmode=disable 但仍需密码。最终以「PGPASSWORD=$CR_USER_PASSWORD + --url postgres://selfhost@...」组合实测连通。
七、本章小结
Huly 的配置面比典型 Web 应用宽:顶层 26 个 conf 变量 + 14 个服务各自的环境变量,再加三层分工。掌握三条主线即可覆盖绝大多数场景:接入层(HOST_ADDRESS/SECURE/端口 + nginx.sh 重生成)、数据层(CR_DB_URL/STORAGE_CONFIG/QUEUE_CONFIG/ELASTIC_URL 四类内网依赖串)、初始化层(SMTP 决定 Web 注册可用性,CLI create-account 是无邮件实例的兜底路径)。配置变更后按 5.4 速查表选择生效动作,可以避免绝大多数「改了没生效」问题。