ShellHub 配置参数详解
ShellHub v0.27.4 自托管配置体系全解:.env 配置链读取顺序、网络/TLS/代理/数据库/日志/功能与企业版变量逐项说明,锁出策略与日志级别等 7 项行为实测验证,密钥挂载与配置最佳实践。
ShellHub 配置参数详解
目标:把 ShellHub v0.27.4 社区版自托管部署的全部配置项讲透——配置文件的读取链路、环境变量逐项含义与实测行为、密钥挂载与编排细节。逐项参数以官方
.env注释与 docs.shellhub.io 环境变量清单为基准,行为结论全部来自本机实测(2026-10-27,部署过程见 《ShellHub Docker Compose 部署实战》,选型认知见 《ShellHub 介绍与选型指南》)。
一、环境信息
- 实测版本:ShellHub v0.27.4 社区版(Apache-2.0,官方 Compose 编排)
- 实测环境:Ubuntu 24.04.5 LTS / Docker 29.9.2 / Docker Compose v5.6.1(见部署篇)
- 服务栈:gateway、server、ui、postgres:18.0、valkey(redis) 五服务
- 实验地址:shellhub.lab(hosts 模拟),HTTP 8131 / SSH 8133
- 溯源基准:仓库
.env(v0.27.4 标签)、docs.shellhub.io/selfhosted/environment-variables(2026-10-27 查询)
二、配置体系总览
ShellHub 自托管的配置分三层,只有环境变量链需要用户动手:
- 环境变量链:由官方包装器
./bin/docker-compose按固定顺序加载,后读的覆盖先读的:.env—— 默认值(官方明确警告:不要编辑,升级会被覆盖);.env.enterprise—— 企业版默认(仅当SHELLHUB_EDITION非 community 时加载);../cloud/.env—— Cloud 部署专用(存在时);.env.override—— 用户的配置文件,优先生效于以上一切。
- Docker secrets:三份密钥文件由
make keygen生成(api_private_key、api_public_key、ssh_private_key),编排内以 secrets 机制挂进 server,不落环境变量; - 编排文件:
docker-compose.yml(主编排)+docker-compose.postgres.yml(PostgreSQL 扩展层)+ 可选docker-compose.override.yml(用户自定义编排扩展,如持久化卷)。包装器负责按 edition 拼装文件列表——因此任何手工编排操作必须走./bin/docker-compose,裸docker compose会漏掉 PostgreSQL 层(实测 server 无库可连,见部署篇 R5)。
所有变量统一 SHELLHUB_ 前缀。修改变量后执行 make restart 生效(官方文档的 Applying changes 原话)。
三、环境变量逐项详解
3.1 网络与端口
| 变量 | 默认值 | 说明(含实测) |
|---|---|---|
SHELLHUB_BIND_ADDRESS | 0.0.0.0 | 网关绑定地址。实测渲染进 gateway 配置 |
SHELLHUB_HTTP_PORT | 80 | Web/API/agent 回连端口。实测 8131 后 docker-compose config 渲染出 published: 8131 -> 80 |
SHELLHUB_HTTPS_PORT | 443 | HTTPS 端口,仅 SHELLHUB_AUTO_SSL=true 时才会绑定发布 |
SHELLHUB_SSH_PORT | 22 | SSH 网关入口。实测 8133 后渲染出 server 服务的 published: 8133 -> 2222——端口由 server 发布而非 gateway(前置负载均衡时关键) |
SHELLHUB_DOMAIN | localhost | 服务公共域名。必须合法 hostname:实测填 IP 时 gateway 启动即报 Field validation for 'Domain' failed on the 'hostname' tag 并崩溃循环(部署篇 R2) |
SHELLHUB_NETWORK | shellhub_network | 实例网络名。实测覆盖为自建网络名并与 _EXTERNAL=true 配合 |
SHELLHUB_NETWORK_EXTERNAL | false | true 时加入既存网络而不新建(网络须先存在;down 不删网络)。实测:自建 10.89.66.0/24 桥接网络并显式 --subnet,agent 与服务栈同网互通 |
3.2 TLS 与证书
| 变量 | 默认值 | 说明 |
|---|---|---|
SHELLHUB_AUTO_SSL | false | 向 Let's Encrypt 自动签发证书。开启后 HTTPS 端口才生效,且要求 SHELLHUB_DOMAIN 是可公网解析的真实域名 |
SHELLHUB_TLS_CERT_FILE | 空 | 自带证书路径(gateway 内路径)。官方注释:这是让内网主机名跑 HTTPS 的唯一方式;与 _TLS_KEY_FILE 必须成对设置,否则 gateway 拒绝启动 |
SHELLHUB_TLS_KEY_FILE | 空 | 证书私钥路径 |
SHELLHUB_ACME_CA_SERVER | 空 | ACME 目录地址,空即 Let's Encrypt 生产环境;可指向 staging 端点做演练(staging 证书浏览器不信任,仅验证流程) |
实验环境用 http:// 明文(AUTO_SSL 默认 false),生产建议 AUTO_SSL=true 或在前面负载均衡终结 TLS。
3.3 反向代理与公共地址
| 变量 | 默认值 | 说明(含实测) |
|---|---|---|
SHELLHUB_PUBLIC_URL | 由 DOMAIN+AUTO_SSL 推导 | 用户实际访问的 URL(仅 http/https + 主机 + 可选端口,不能带路径)。实测改它需 make restart;TLS 终结在外部入口时必须显式设置,否则 SSH 审批链接等会以错误协议开头 |
SHELLHUB_PROXY | false | 网关接受四层负载均衡的 PROXY protocol |
SHELLHUB_PROXY_TRUSTED_IPS | "0.0.0.0/0 ::/0" | 允许声明客户端地址的 CIDR(作用于 HTTP/HTTPS,影响登录锁出与 GeoIP 的来源 IP 判定)。默认信任所有人对裸部署无意义,上了负载均衡应收窄到负载均衡网段 |
SHELLHUB_SSH_PROXY_TRUSTED_IPS | 空 | SSH 端口的 PROXY 头来源白名单(回环恒信任)。不要包含 Docker 桥接网段:userland 代理让所有外部客户端看起来都来自桥接网段,等于允许地址伪造。v0.27.2 新增 |
SHELLHUB_TUNNEL_PING_INTERVAL | 空(v1 30s/v2 35s 默认) | 服务端对设备隧道的 ping 间隔。路径上有短空闲超时的 NAT/负载均衡时调小;须为正的时长且小于 1 分钟,服务端拒绝非法值启动。设备距最后 ping 2 分钟判离线 |
3.4 数据库
| 变量 | 默认值 | 说明(含实测) |
|---|---|---|
SHELLHUB_DATABASE | postgres | 存储引擎。实测确认 v0.27 已无 MongoDB 选项,填其他值仅告警并回退 postgres |
SHELLHUB_POSTGRES_HOST | postgres | 主机名(编排内服务名;外部库填可达地址) |
SHELLHUB_POSTGRES_EXTERNAL | false | true 时使用编排外 PostgreSQL,内置 postgres 服务不启动(需自备实例与备份) |
SHELLHUB_POSTGRES_PORT | 5432 | 端口 |
SHELLHUB_POSTGRES_USERNAME | admin | 后缀是 _USERNAME 不是 _USER(官方特意强调) |
SHELLHUB_POSTGRES_PASSWORD | admin | 必改。实测改为强口令后服务正常 |
SHELLHUB_POSTGRES_DATABASE | main | 库名,后缀是 _DATABASE 不是 _DB |
SHELLHUB_POSTGRES_EXTRA_ARGS | 空 | 附加到 postgres 启动命令的参数(如 -c shared_buffers=4GB),重启生效 |
SHELLHUB_POSTGRES_LOG_LEVEL / _LOG_VERBOSE | INFO / false | 数据库侧日志 |
⚠️ 持久化注意:内置 postgres 服务官方默认不挂卷,实例删除即丢数据。必须自行在
docker-compose.override.yml补命名卷,且 postgres:18 镜像的挂载点须为/var/lib/postgresql(挂旧路径/.../data会被 18 版判定无用挂载拒启,实测见部署篇 R1)。
3.5 日志与可观测
| 变量 | 默认值 | 说明(含实测) |
|---|---|---|
SHELLHUB_LOG_LEVEL | info | trace/debug/info/warn/error/fatal。实测在 .env.override 写 debug 后 make restart,server 日志出现 debug 级输出,改回后恢复 |
SHELLHUB_LOG_FORMAT | text | text 或 json(采集管道建议 json) |
SHELLHUB_GATEWAY_ACCESS_LOGS | true | 网关访问日志开关 |
SHELLHUB_METRICS | false | 指标端点开关 |
SHELLHUB_SENTRY_DSN | 空 | 错误上报 |
3.6 功能与行为
| 变量 | 默认值 | 说明(含实测) |
|---|---|---|
SHELLHUB_EDITION | community | community/enterprise/cloud。社区版单命名空间:实测第二个命名空间创建被拒 |
SHELLHUB_VERSION | 所检出的 release | 全栈镜像版本统一驱动器,升级只改它 |
SHELLHUB_PAYWALL | true | 社区版界面是否展示企业功能入口 |
SHELLHUB_MAXIMUM_ACCOUNT_LOCKOUT | 60 | 反复登录失败后的最大锁出分钟数,0 关闭 |
SHELLHUB_ACCOUNT_LOCKOUT_BASE | 1m | 首次锁出时长(Go duration,≥1s),之后每次 4 倍递增、封顶于上一项。实测验证:连错 2 次密码返回 401,第 3 次起 429,且锁出期内正确密码也 429;约 1 分钟后(BASE 时长)自动解锁恢复 200 |
SHELLHUB_PERMIT_EMPTY_PASSWORDS | false | agent 侧:设备上是否允许空密码系统账号经 SSH 登录 |
SHELLHUB_WORKER_SCHEDULE | @daily | 后台任务(Go cron 格式,如临时设备清理) |
SHELLHUB_ASYNQ_UNIQUENESS_TIMEOUT | 24 | 任务队列唯一锁时长(小时),≤0 关闭 |
SHELLHUB_REDIS_CACHE_POOL_SIZE | 0 | 0 即驱动默认值 |
SHELLHUB_ONBOARDING_URL | 官方问卷地址 | 首账号向导问卷;置空禁用(内网环境实测置空后 /setup 直接进账号表单) |
SHELLHUB_PROVISIONING_KEY_WEBHOOK_ALLOWED_CIDRS | 空 | 预配密钥 webhook 模式可访问的网段;空=禁止全部私网/回环/元数据地址(SSRF 防线,放行私网集成器才改) |
SHELLHUB_ALLOW_PUBLIC_KEY_ACCESS_BELLOW_0_6_0 | false | 允许 0.6.0 以下旧 agent 走公钥认证。变量名确实拼错为 BELLOW,官方文档明示照抄(实测按原样可渲染) |
SHELLHUB_CONNECTOR | true | 连接器(容器会话)特性开关 |
SHELLHUB_NAMESPACE_REQUIRE_VERIFIED_DEVICE_KEY | true | 新建命名空间默认开启「设备签名强制」(既有命名空间不受影响) |
3.7 企业版变量(.env.enterprise)
SHELLHUB_ENTERPRISE_ADMIN_USERNAME/PASSWORD(企业管理控制台)、SHELLHUB_SAML_SECRET(SP 密钥加密)、SHELLHUB_WEB_ENDPOINTS*(Web 端点发布域与 DNS 提供商)、SHELLHUB_OBJECT_STORAGE_*(会话录制存储,默认 MinIO;_ACCESS_KEY/_SECRET_KEY 默认 username/password 必改)、SHELLHUB_MAXMIND_LICENSE(GeoIP)。社区版部署不加载这些值(edition 非 community 时由包装器自动带上 .env.enterprise)。
四、实测验证记录
配置行为的实测证据(全部可复现):
- 锁出策略:
{"username":"admin","password":"wrongpassN"}连续提交——第 1/2 次401,第 3 次起429(响应体 too many requests),锁出期内正确密码同样 429;1 分钟后(SHELLHUB_ACCOUNT_LOCKOUT_BASE=1m)正确密码恢复200。服务端日志同时记录了 429 的完整请求元数据(remote_ip、latency、uri)。 - 日志级别:
.env.override追加SHELLHUB_LOG_LEVEL=debug→make restart→ server 出现 debug 级日志;删除后重启恢复 info。 - 端口与发布者:
SHELLHUB_HTTP_PORT=8131、SHELLHUB_SSH_PORT=8133后./bin/docker-compose config渲染:gateway 发布8131->80、server 发布8133->2222(SSH 在 server,验证官方「SSH 端口不是网关发布」的说明)。 - 域名校验:
SHELLHUB_DOMAIN=192.168.146.128时 gateway 崩溃循环(hostname 校验失败,部署篇 R2);改为shellhub.lab后正常。 - Host 匹配兜底:域名未对齐时访问返回空 404——网关配置含显式兜底规则,官方注释称这是为防 agent 把错误 200 空响应当服务信息(部署篇 R3)。
- 外部网络:
SHELLHUB_NETWORK=shellhub-v0.27.4-net+SHELLHUB_NETWORK_EXTERNAL=true,预建显式子网桥接网络,五服务与 agent 同网互达;down后网络保留。 - Compose 项目名:项目名含点号(如
shellhub-v0.27.4-stack)被 Compose 拒绝(invalid project name),改用shellhub-v0274-stack。多实例共存时注意项目名与网络名都要错开。
五、密钥与挂载
- 三份 secrets(
make keygen产物)→ 编排以 Docker secrets 挂载:/run/secrets/api_private_key、/run/secrets/api_public_key、/run/secrets/ssh_private_key。API 密钥对签发与校验 JWT;SSH 主机密钥是 SSH 网关的 host key。重新生成 SSH 主机密钥 = 全网客户端指纹报警,务必先备份; - PostgreSQL 卷:官方默认无卷,按部署篇 4.4 节的 override 补命名卷(挂载点
/var/lib/postgresql); - agent 侧挂载(由官方 install.sh 处理,手动等价时注意):agent 镜像为极简构造,需特权 + 宿主根文件系统挂载(
/:/host)+ Docker 套接字,缺任一即启动失败(部署篇 R4);设备私钥路径由 agent 环境变量SHELLHUB_PRIVATE_KEY指定,默认生成于设备/etc/shellhub.key。
六、配置最佳实践
- 一切自定义进
.env.override,永不改.env(升级安全); - 上线前必改三项:
SHELLHUB_POSTGRES_PASSWORD、SHELLHUB_DOMAIN(真实域名)、SHELLHUB_ONBOARDING_URL(内网置空); - 上了负载均衡/TLS 卸载:
SHELLHUB_PUBLIC_URL设为https://入口、SHELLHUB_PROXY_TRUSTED_IPS与SHELLHUB_SSH_PROXY_TRUSTED_IPS收窄到负载均衡网段(且不写 Docker 桥段); - NAT 空闲超时 < 35s 的链路:调低
SHELLHUB_TUNNEL_PING_INTERVAL; - 多实例同机:错开
SHELLHUB_HTTP_PORT/SHELLHUB_SSH_PORT/SHELLHUB_NETWORK与 Compose 项目名; - 面向自动化管道:评估
SHELLHUB_MAXIMUM_ACCOUNT_LOCKOUT对脚本重试的影响(429 会连带正确密码一起锁); - 变更后
make restart生效;升级改SHELLHUB_VERSION后阅读官方 Upgrade 文档再动。
七、配置相关排障速查
| 症状 | 根因与处置(均为实测) |
|---|---|
gateway 秒级重启,日志 hostname 校验失败 | SHELLHUB_DOMAIN 填了 IP;改域名(部署篇 R2) |
| 服务 healthy 但 API 全 404 | 访问 Host 与 SHELLHUB_DOMAIN 不一致;统一域名访问(部署篇 R3) |
| postgres 起不来,日志提示 unused mount/volume | postgres:18 挂载点须为 /var/lib/postgresql(部署篇 R1) |
| server 连不上数据库 | 用了裸 docker compose,漏了 PostgreSQL 编排层;改走 ./bin/docker-compose(部署篇 R5) |
| Compose 拒绝项目名 | 项目名只允许字母数字与连字符,去掉点号(本文 4.7) |
| 登录 429 | 触发锁出(默认连错 2 次即锁 1 分钟,4 倍递增);等期满或调 SHELLHUB_ACCOUNT_LOCKOUT_* |
| 公钥注册 422 illegal base64 data | v0.27 接口 data 字段要求 base64 编码的公钥文本(部署篇 R6) |
/setup 出现外部问卷加载慢 | 内网环境置空 SHELLHUB_ONBOARDING_URL |
八、参考链接
- 官方环境变量清单:https://docs.shellhub.io/selfhosted/environment-variables
.env(v0.27.4 标签):https://github.com/shellhub-io/shellhub/blob/v0.27.4/.env- 端口与连通性:https://docs.shellhub.io/about/ports-and-connectivity
- 管理界面设置(设备签名强制等):https://docs.shellhub.io/manage/settings
- 本站姊妹篇:《ShellHub 介绍与选型指南》、《ShellHub Docker Compose 部署实战》、《ShellHub 常用 CLI 命令详解》