Homarr 2.10.1 配置参数详解

Homarr v2.10.1 三层配置模型逐键详解:环境变量全表(官方文档×inspect 实测默认对照)、serverSettings 8 组、看板 settings 17 字段、用户 preferences 全键、外部 PostgreSQL/Redis 变体 compose 与启动取证、生产模板,全部 JSON 回显取自运行实例 REST/tRPC 实拉。

HomarrHomarr面板仪表盘Next.js2026/11/03

Homarr 2.10.1 配置参数详解

目标:逐键讲清 Homarr v2.10.1 的三层配置模型——环境变量(启动层)、数据库业务配置(serverSettings 8 组 / 看板 settings 17 字段 / 用户 preferences 全键)、外部 PostgreSQL/Redis 变体与生产模板。全部参数值与 JSON 回显取自 2026-11-03 运行实例的 REST/tRPC 实拉结果与 docker inspect 实测,非文档转述。

一、溯源口径与取证环境

本文参数以官方环境变量文档(2026-11-03 实查)与下表运行实例实测双向对照为准:

项目值
组件版本Homarr v2.10.1(/api/info 实测 {"version":"2.10.1"})
取证实例部署于宿主 8138 端口的生产形态实例(compose 部署全流程见《Homarr Docker Compose 部署指南》)
取证日期2026-11-03
业务配置读取通道REST(ApiKey 头认证)+ tRPC(session cookie 认证),两种通道的调用形态见第二、四节
演示账号admin / q1w2e3r4(onboarding 创建,邮箱 admin@homarr.local)

💡 选型背景(为什么配置全在数据库、没有业务配置文件)见《Homarr 介绍与选型指南》第三节。

二、三层配置模型

Homarr 的配置面分三层,修改方式、生效方式、备份面完全不同:

层内容载体修改/生效方式备份要点
启动层密钥、数据库/Redis 驱动、日志级别、外呼开关、Docker 端点发现等环境变量(第三节全表)改 compose 后重建实例生效compose 文件本身
业务层看板布局、应用、集成、用户/分组/权限、服务器设置、偏好SQLite/PostgreSQL 数据库GUI 在线改,即时生效;API/tRPC 可脚本化数据库文件 + SECRET_ENCRYPTION_KEY
管理面业务层的日常入口Management 菜单(Settings/Tools/Users/Integrations…)浏览器操作同业务层

业务层没有配置文件可 diff,读取配置走两个通道。REST 用 API key(Management → Tools → API 创建,形如 <id>.<token>,只展示一次):

$ curl -s -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" http://127.0.0.1:8138/api/info
{"version":"2.10.1"}

tRPC 是应用内部全量接口,接受同一 ApiKey 头或浏览器会话 cookie。本文第四节的服务器设置即用 session cookie 拉取(登录换 cookie 的完整命令见部署篇 4.6 节,此处复用):

$ curl -s -b cj.txt 'http://127.0.0.1:8138/api/trpc/serverSettings.getAll'

tRPC 调用形态速记:查询 GET /api/trpc/<过程名>?input={"json":…},变更 POST /api/trpc/<过程名> 且请求体为 {"json":…};响应统一包在 result.data.json 里。REST 与 tRPC 的分工原则(官方 API 文档):REST 只暴露「选定的既有控制」,高级操作走 tRPC,两者都接受 ApiKey 头。

三、环境变量全表(官方文档 × inspect 实测对照)

先给实测生效值打底——docker inspect 回显中,compose 未设置的后 6 项即服务内置默认:

$ docker inspect homarr-2-10-1-server --format '{{json .Config.Env}}'
["SECRET_ENCRYPTION_KEY_FILE=/run/secrets/secret_key","LOG_LEVEL=debug","NO_EXTERNAL_CONNECTION=true","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","DB_URL=/appdata/db/db.sqlite","DB_DIALECT=sqlite","DB_DRIVER=better-sqlite3","AUTH_PROVIDERS=credentials","REDIS_IS_EXTERNAL=false","NODE_ENV=production"]

通用机制:任何环境变量都可加 _FILE 后缀,值从文件读取(官方文档明示,配合 docker secrets 使用,部署篇 4.1 节即此用法)。

3.1 General(通用)

变量说明可选值默认
PUID / PGID运行身份的 UID/GID;改后须保证 /appdata 与所挂 socket 权限正确任意合法 ID0 / 0
LOG_LEVEL日志级别;debug 下逐条 SQL 落日志(部署篇第十节运维回显即 debug 效果)debug/info/warn/errorinfo
BASE_URL对外规范 origin,用于 MCP OAuth 元数据、origin 校验与 secure cookie;TLS 终结反代后必须设为公网 HTTPS origin(即使反代已转发宿主与协议)无路径的 HTTP(S) origin-
NO_EXTERNAL_CONNECTION关闭一切外呼:更新检查、天气、位置搜索、RSStrue/falsefalse
ENABLE_DNS_CACHINGDNS 缓存开关;Docker 服务地址经常变化或用 extra_hosts 覆盖时设 false 改用原生 DNStrue/falsetrue
HOMARR_DISABLE_IPV6强制关闭内置 nginx 的 IPv6 监听(宿主无 IPv6 时本会自动关闭)true/falsefalse
HOMARR_TRUSTED_PROXIES允许向内置 nginx 供给客户端身份的代理地址,用精确 IP 或窄 CIDR,每一跳必须净化或追加真实 TCP 对端逗号分隔 IP/CIDR无
HOMARR_REQUEST_IDENTITY_SECRET非 Compose 部署形态下可信代理身份头的认证密钥;官方形态由启动脚本每次启动自行生成(实测 run.sh:openssl rand -hex 32)64 位 hex部署形态外无默认
HOMARR_WEBSITE_URL运行时链接使用的官网/文档基址HTTP(S) URLhttps://homarr.dev
WORKSHOP_API_URL / WORKSHOP_WEB_URLWorkshop 社区生态的 API/站点地址(服务运营者另有专组变量,见官方文档 Workshop service 表,与本文应用实例无关)HTTP(S) URL派生自 HOMARR_WEBSITE_URL

PUID/PGID 实测效果(换 1000:1000 重启,健康依旧 200):

Starting with UID='1000', GID='1000'
Changing owner to 1000:1000...
Changing owner to 1000:1000, done.

3.2 Security(安全)

变量说明可选值默认
SECRET_ENCRYPTION_KEY必填。加密落库集成凭据的根密钥,64 位 hex(openssl rand -hex 32 生成)。缺失时应用层报校验错误、页面 500(实录见部署篇 FAQ 11.1);更换密钥后已存集成凭据不可解64 位 hex无

3.3 Docker(容器集成)

变量说明可选值默认
ENABLE_DOCKER设 false 隐藏 Docker 管理页/菜单并禁用容器 API 路由(demo 模式下路由仍保留)true/falsetrue
ENABLE_KUBERNETES为管理员启用 Kubernetes 工具(Management → Tools → Kubernetes)true/falsefalse
DOCKER_SOCKET_PATHS逗号分隔的已挂载 socket 路径,每个路径被发现为可选择的 Docker 环境,如 /var/run/docker.sock,/var/run/podman.sock挂载路径列表-
DOCKER_HOSTNAMES / DOCKER_PORTS明文 TCP 端点,两变量按位置配对(如 localhost,docker.example.com + 2375,2376)主机名/端口列表-
DOCKER_ENDPOINTS高级 JSON 端点描述(自定义名称、TLS、能力限制),优先级高于上面四个简单变量JSON 数组-

3.4 Database(数据库)

变量说明可选值默认(inspect 实测一致)
DB_DRIVER驱动:SQLite 用 better-sqlite3,PostgreSQL 用 node-postgres二选一better-sqlite3
DB_DIALECT迁移包方言,启动脚本按 ./db/migrations/$DB_DIALECT/migrate.cjs 选择sqlite/postgresqlsqlite
DB_URL数据库 URL;URL 优先于 HOST/PORT/NAME/USER/PASSWORD 组合合法 DB URL/appdata/db/db.sqlite
DB_HOST/DB_PORT/DB_NAME/DB_USER/DB_PASSWORD外部 PostgreSQL 的分项连接参数各自合法值-

三条硬约束(全部实测踩过):DB_DIALECT 与 DB_DRIVER 必须成对改,漏配 DIALECT 会拿 PG 连接跑 SQLite 迁移包报 SqliteError(部署篇 FAQ 11.2);MySQL 在 v2 被启动脚本直接拒绝——run.sh 里 case "$DB_DIALECT:$DB_DRIVER" in mysql:*|mariadb:*|*:mysql2|*:mysql|*:mariadb) reject_mysql ;;,报 ERROR: MySQL is no longer supported in v2;DB_MIGRATIONS_DISABLED=true 可跳过启动迁移(官方定位为 helm chart 等高级部署,误用会导致表结构缺失)。

3.5 Redis

变量说明可选值默认
REDIS_IS_EXTERNALtrue 时不拉起内置 Redis(实测日志 Starting internal Redis server 消失,改为 Using external Redis server at redis://<host>:<port>),改连外部实例true/falsefalse
REDIS_HOST / REDIS_PORT外部 Redis 主机/端口合法主机/端口- / 6379
REDIS_USERNAME / REDIS_PASSWORD外部 Redis 认证合法凭据-
REDIS_DATABASE_INDEX选择外部实例的库编号数字索引-
REDIS_TLS_CA指定后连接走 TLSCA 证书-

官方文档明示外部 Redis 暂不被 Proxmox 社区脚本支持(Docker/Compose 形态不受影响,第七节实测)。

3.6 Proxy(出网代理)

变量说明默认
HTTP_PROXY / HTTPS_PROXY / NO_PROXY标准出网代理三件套,NO_PROXY 逗号分隔排除主机-

3.7 Demo mode(演示模式)

DEMO_MODE=true 注入演示数据并让 Assistant 返回固定应答(不调模型);DEMO_READ_ONLY 默认 true 锁定看板与配置修改(登录用户仍可保存自己的 Assistant 会话),设 false 得到可编辑预览环境。

四、服务器设置:serverSettings.getAll 八组逐键详解

业务层的全局配置存 serverSetting 表,首启种子恰好创建这 8 个键(部署篇 4.4 节日志 Created serverSetting through seed key=… 与本节一一对应)。实拉全文(session cookie 通道):

$ curl -s -b cj.txt 'http://127.0.0.1:8138/api/trpc/serverSettings.getAll'
{"result":{"data":{"json":{"analytics":{"enableGeneral":false,"instanceId":"nj7suhpqjm4lpc6wba0po4bv","lastSuccessfulSnapshotAt":"2026-11-02T16:46:21.053Z"},"crawlingAndIndexing":{"noIndex":true,"noFollow":true,"noTranslate":true,"noSiteLinksSearchBox":false},"board":{"homeBoardId":"fvrcmchc1pes59jos46xushd","mobileHomeBoardId":"fvrcmchc1pes59jos46xushd","enableStatusByDefault":true,"forceDisableStatus":false},"user":{"enableGravatar":true},"appearance":{"defaultColorScheme":"dark"},"branding":{"appName":"Homarr","greeting":"","logoImageUrl":null,"faviconImageUrl":null,"primaryColor":"#fa5252","secondaryColor":"#fd7e14","lockPrimaryColor":false,"signInBackgroundImageUrl":null,"signInBackgroundOverlay":0.55,"showSignInMarquee":true,"authBranding":{"showAppName":true,"showLogo":true,"showGreeting":true},"defaultRadius":"md","customCss":""},"culture":{"defaultLocale":"en"},"search":{"defaultSearchEngineId":"h39b9uzxh9x2269blnxwdd25"}}}}}

(board.homeBoardId 与 mobileHomeBoardId 同指种子看板 fvrcmchc1pes59jos46xushd,与第五节 REST 通道读到的 id 一致。)

逐组解读(GUI 入口均在 Management → Settings):

键字段与实测值含义
analyticsenableGeneral:false;instanceId:"nj7suhpqjm4lpc6wba0po4bv";lastSuccessfulSnapshotAt:"2026-11-02T16:46:21.053Z"匿名统计开关(默认关)与实例标识。实测本实例首启日志曾出现 Sent analytics to PostHog(官方文档:NO_EXTERNAL_CONNECTION=true 或本开关关闭后不再外呼)
crawlingAndIndexingnoIndex:true、noFollow:true、noTranslate:true、noSiteLinksSearchBox:false爬虫策略四开关,默认禁止索引/跟踪/翻译
boardhomeBoardId/mobileHomeBoardId:"fvrcmchc1pes59jos46xushd";enableStatusByDefault:true;forceDisableStatus:false桌面/移动默认看板指向与状态探活的全局默认;forceDisableStatus 一键关掉所有卡片状态检查
userenableGravatar:true允许用 Gravatar 作头像源
appearancedefaultColorScheme:"dark"新用户默认配色(dark/light,用户级可覆盖,见第六节)
brandingappName:"Homarr"、greeting:""、logoImageUrl:null、faviconImageUrl:null、primaryColor:"#fa5252"、secondaryColor:"#fd7e14"、lockPrimaryColor:false、signInBackgroundImageUrl:null、signInBackgroundOverlay:0.55、showSignInMarquee:true、authBranding:{showAppName/showLogo/showGreeting 均 true}、defaultRadius:"md"、customCss:""登录页与全局品牌定制:应用名/问候语/Logo/Favicon、主辅色(lockPrimaryColor 锁定后看板不可改主色)、登录背景与遮罩浓度、跑马灯、认证页元素开关、全局圆角与自定义 CSS
culturedefaultLocale:"en"默认语言
searchdefaultSearchEngineId:"h39b9uzxh9x2269blnxwdd25"默认搜索引擎 id(指向首启种子的 3 个内置引擎之一)

五、看板设置:board settings 17 字段

每张看板有独立 settings,REST 通道 GET /api/boards/{id}/settings 实拉(看板 id 从 GET /api/boards 取得):

$ curl -s -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" http://127.0.0.1:8138/api/boards/fvrcmchc1pes59jos46xushd/settings
{"pageTitle":null,"metaTitle":null,"logoImageUrl":null,"faviconImageUrl":null,"backgroundImageUrl":null,"backgroundImageAttachment":"fixed","backgroundImageRepeat":"no-repeat","backgroundImageSize":"cover","primaryColor":"#ff0055","secondaryColor":"#00ffb2","opacity":100,"customCss":"","iconColor":null,"itemRadius":"md","disableStatus":false,"id":"fvrcmchc1pes59jos46xushd","name":"dashboard"}

15 个可配置项 + id/name 两个标识字段:

字段实测值含义
pageTitle / metaTitlenull浏览器标签页标题 / SEO meta 标题(空则用看板名)
logoImageUrl / faviconImageUrlnull看板级 Logo / Favicon 覆盖
backgroundImageUrlnull看板背景图 URL
backgroundImageAttachment / Repeat / Sizefixed / no-repeat / cover背景图的 CSS attachment/repeat/size 三属性
primaryColor / secondaryColor#ff0055 / #00ffb2本板主辅色(onboarding setup 步写入的正是这两值,见部署篇 4.6);服务器 lockPrimaryColor=true 时锁定
opacity100组件背景不透明度(0-100)
customCss""板级自定义 CSS
iconColornull图标着色覆盖
itemRadiusmd组件圆角(sm/md/lg…,PATCH 实测见下)
disableStatusfalse本板禁用状态探活(与服务器 enableStatusByDefault/forceDisableStatus 联动)

修改走 PATCH /api/boards/{id}/settings,只传变更键;实测改 itemRadius 为 lg 并回滚,两次均返回 HTTP 200、空响应体:

$ curl -s -X PATCH -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" -H 'Content-Type: application/json' --data '{"itemRadius":"lg","disableStatus":true}' http://127.0.0.1:8138/api/boards/fvrcmchc1pes59jos46xushd/settings -w '\nHTTP %{http_code}\n'

HTTP 200
$ curl -s -X PATCH -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" -H 'Content-Type: application/json' --data '{"itemRadius":"md","disableStatus":false}' http://127.0.0.1:8138/api/boards/fvrcmchc1pes59jos46xushd/settings -w '\nHTTP %{http_code}\n'

HTTP 200

回滚后再 GET 即恢复 itemRadius:"md"、disableStatus:false(第五节首条回显为最终态)。看板级另有 REST GET /api/settings/board 与 tRPC board.* 系列;布局/组件本体的自动化(PUT /api/boards/{id}/content 全量 sections/items 覆盖、PATCH /api/boards/{boardId}/items/{itemId}/layouts/{layoutId} 单件移动缩放)属 API 专题,见 CLI/API 篇。

六、用户偏好:preferences 全键

用户级偏好独立于服务器默认(defaultColorScheme 等只在用户未显式设置时生效)。REST 全量读取(不传 userId 即取 key 创建者本人):

$ curl -s -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" http://127.0.0.1:8138/api/users/preferences
{"colorScheme":"dark","byteUnitSystem":"decimal","firstDayOfWeek":1,"pingIconsEnabled":false,"enableRightClickOnWidgets":true,"homeBoardId":null,"mobileHomeBoardId":null,"defaultSearchEngineId":null,"openSearchInNewTab":true,"ddgBangs":true,"headerPreferences":{"version":3,"visible":true,"searchDisplay":"input","logoDisplay":"logoAndText","zones":{"left":[{"type":"builtin","id":"logo"}],"center":[{"type":"builtin","id":"search"}],"right":[{"type":"builtin","id":"boardEdit"},{"type":"builtin","id":"boardSettings"},{"type":"builtin","id":"user"}]}},"userId":"caduhl49zvdplppzn791z65c"}
字段实测值含义
colorSchemedark配色方案(覆盖服务器 defaultColorScheme)
byteUnitSystemdecimal字节单位制:decimal(1000) / binary(1024)
firstDayOfWeek1周起始日(1=周一)
pingIconsEnabledfalse应用卡片图标探活
enableRightClickOnWidgetstrue组件右键菜单
homeBoardId / mobileHomeBoardIdnull个人默认看板(null 即跟随服务器级 board.homeBoardId;传 null 显式清空可空引用)
defaultSearchEngineIdnull个人默认搜索引擎(同上跟随服务器值)
openSearchInNewTabtrue搜索新标签页打开
ddgBangstrueDuckDuckGo bang 语法搜索
headerPreferencesversion:3,visible:true,searchDisplay:"input",logoDisplay:"logoAndText",zones:{left:[logo],center:[search],right:[boardEdit,boardSettings,user]}顶栏布局 v3:可见性、搜索框形态、Logo 形态与左中右三区组件编排
userIdcaduhl49zvdplppzn791z65c所属用户(admin 的 id)

PATCH /api/users/preferences 只传变更值(官方 API 文档:omitted values stay unchanged;header 字段合并、显式给出的 zone 数组整体替换该 zone)。实测切 light 并回滚:

$ curl -s -H "ApiKey: a2a9dbf6.6b2e9362728ba1c909ab165fd3aba3e015f7d80c03adc363" -H 'Content-Type: application/json' --data '{"colorScheme":"light"}' -X PATCH http://127.0.0.1:8138/api/users/preferences | head -c 120; echo
{"colorScheme":"light","byteUnitSystem":"decimal","firstDayOfWeek":1,"pingIconsEnabled":false,"enableRightClickOnWidgets"

(PATCH 返回更新后的完整偏好 JSON,首键已变 light;随后以 {"colorScheme":"dark"} 回滚,第六节首条 GET 回显为回滚后终态。)除通用 PATCH 外,旧式专用路由仍在:/api/users/changeScheme、changeHome、changeSearchEngine、ddg-bangs、firstDayOfWeek、header-preferences、right-click-widgets、search-preferences(见 openapi 规范,路径清单见 CLI/API 篇)。改他人偏好需管理员权限。

七、外部 PostgreSQL / Redis 变体

默认形态(SQLite + 内置 Redis)之外,Homarr 支持把两类状态外置,compose 全文实测(与主实例并行部署,占宿主 8140、独立网段 10.89.66.0/24):

name: homarr-2-10-1-pg-stack

services:
  homarr:
    image: ghcr.io/homarr-labs/homarr:v2.10.1
    container_name: homarr-2-10-1-pg
    restart: unless-stopped
    ports:
      - '8140:7575'
    volumes:
      - /opt/apps/homarr/appdata-pg:/appdata
    environment:
      - SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY}
      - DB_DRIVER=node-postgres
      - DB_DIALECT=postgresql
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_NAME=homarr
      - DB_USER=homarr
      - DB_PASSWORD=homarr
      - REDIS_IS_EXTERNAL=true
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - homarr-pg-net

  postgres:
    image: postgres:16-alpine
    container_name: homarr-2-10-1-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=homarr
      - POSTGRES_USER=homarr
      - POSTGRES_PASSWORD=homarr
    volumes:
      - /opt/apps/homarr/pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U homarr -d homarr"]
      interval: 5s
      timeout: 3s
      retries: 10
    networks:
      - homarr-pg-net

  redis:
    image: redis:7-alpine
    container_name: homarr-2-10-1-redis
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 10
    networks:
      - homarr-pg-net

networks:
  homarr-pg-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.66.0/24
          gateway: 10.89.66.1

要点逐项:

  • SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY} 由宿主环境注入,起栈前导出:export SECRET_ENCRYPTION_KEY=$(cat /opt/apps/homarr/secrets/secret_key.txt)(生产密钥仍建议 secrets _FILE 通道,见部署篇 4.1);
  • DB_DRIVER=node-postgres + DB_DIALECT=postgresql 成对出现——漏配 DIALECT 的报错实录见部署篇 FAQ 11.2;
  • depends_on 配 condition: service_healthy + 两路 healthcheck 是 PG 就绪竞态(ECONNREFUSED 10.89.66.2:5432,实录见部署篇 FAQ 11.3)的根治写法;
  • REDIS_IS_EXTERNAL=true 后内置 Redis 不再拉起,连接串由启动脚本打印(Using external Redis server at redis://$REDIS_HOST:$REDIS_PORT,run.sh 实测逻辑)。

启动取证(迁移按 postgresql 方言执行、种子幂等跳过;表结构落在 PG 的 public schema):

$ docker logs homarr-2-10-1-pg 2>&1 | head -12
Starting with UID='0', GID='0'
Running DB migrations
Skipping seeding of group 'everyone' as it already exists
Skipping seeding of onboarding as it already exists
Skipping seeding for serverSetting as it already exists key=analytics
Skipping seeding for serverSetting as it already exists key=crawlingAndIndexing
Skipping seeding for serverSetting as it already exists key=board
Skipping seeding for serverSetting as it already exists key=user
Skipping seeding for serverSetting as it already exists key=appearance
Skipping seeding for serverSetting as it already exists key=branding
Skipping seeding for serverSetting as it already exists key=culture
Skipping seeding for serverSetting as it already exists key=search

$ docker exec homarr-2-10-1-postgres psql -U homarr -d homarr -c '\dt' 2>&1 | head -15
                   List of relations
 Schema |             Name             | Type  | Owner  
--------+------------------------------+-------+--------
 public | account                      | table | homarr
 public | apiKey                       | table | homarr
 public | app                          | table | homarr
 public | assistant_configuration      | table | homarr
 public | assistant_message            | table | homarr
 public | assistant_thread             | table | homarr
 public | board                        | table | homarr
 public | boardGroupPermission         | table | homarr
 public | boardUserPermission          | table | homarr
 public | cron_job_configuration       | table | homarr
 public | custom_widget_definition     | table | homarr
 public | custom_widget_secret         | table | homarr
(输出节选,实测首尾;完整表清单含 user/session/board 权限等 20+ 表)

$ docker exec homarr-2-10-1-postgres psql -U homarr -d homarr -tAc "select count(*) from \"user\""
0
$ curl -s -o /dev/null -w 'pg health: %{http_code}\n' http://127.0.0.1:8140/api/health/live
pg health: 200

count(*)=0 说明该变体是独立空库(与主实例 SQLite 互不相通);表名与 SQLite 完全同构,业务层配置全部随方言平移。备份注意(官方文档):使用外部 PostgreSQL 时,/appdata 打包之外必须用 PG 原生工具另行备份;/appdata 内仍会生成 db/、redis/、trusted-certificates/ 三个子目录(run.sh 固定 mkdir -p,实测 ls appdata/ 与部署篇第五节一致)。

方言选择机制一句话:启动脚本 node ./db/migrations/$DB_DIALECT/migrate.cjs ./db/migrations/$DB_DIALECT——DB_DIALECT 决定迁移包目录,DB_DRIVER 决定运行期连接库,两者共同构成「数据库层外置」的开关组。

八、生产环境模板

综合本文全部参数,生产 compose 的推荐形态(在部署篇 4.1 基础上收敛默认值):

name: homarr-stack
services:
  homarr:
    image: ghcr.io/homarr-labs/homarr:v2.10.1        # 锁版本,不用 latest(发版 17 天 5 版,见部署篇第二节)
    restart: unless-stopped
    ports:
      - '8138:7575'                                   # 反代后仅回环监听更稳:'127.0.0.1:8138:7575'
    volumes:
      - /opt/apps/homarr/appdata:/appdata             # 必持久化;docker.sock 按需再挂
    environment:
      - SECRET_ENCRYPTION_KEY_FILE=/run/secrets/secret_key   # secrets 通道,密钥文件独立备份
      - NO_EXTERNAL_CONNECTION=true                   # 内网环境关外呼
      - BASE_URL=https://homarr.example.com           # TLS 终结反代时必填(3.1 节)
      # LOG_LEVEL 不设即 info;ENABLE_DOCKER=false 可关容器管理面
    secrets:
      - secret_key
secrets:
  secret_key:
    file: ../secrets/secret_key.txt

参数取舍说明:LOG_LEVEL 留默认 info(debug 的逐条 SQL 仅排障时开,见部署篇第十节实测);反代场景务必设 BASE_URL(官方文档强调 HTTPS origin 必填,否则 secure cookie 与 origin 校验异常);多宿主 Docker 端点用 DOCKER_SOCKET_PATHS/DOCKER_ENDPOINTS(3.3 节)而非再挂 socket;需要多用户/SSO(OIDC/LDAP)时 AUTH_PROVIDERS 与单点登录参数按官方 Single Sign-On 文档扩展,属集成专题。备份三件套:/appdata 打包 + 密钥文件 + compose 文件本身(第五、六节业务配置全在 appdata/db/db.sqlite)。

九、参考链接

Homarr 2.10.1 配置参数详解 - Quzuo