◆
{{ s.site_title || '导航页' }}
登录后查看导航内容
进入
首次使用:这里填的密码会成为管理员密码
{{ s.site_title }}
{{ s.site_subtitle }}
{{ network.mode === 'lan' ? '内网访问' : (network.mode === 'frp' ? 'FRP 访问' : '外网访问') }} {{ network.client_ip }}
{{ clock }}
{{ dateStr }}
{{ e.name }}
{{ g.name }} {{ g.items.length }}
{{ q ? '没有匹配「' + q + '」的条目' : '还没有条目,点右下角齿轮 → 扫描导入容器' }}
{{ s.footer_text }}
{{ wpop.title }} {{ wpop.sub }}
{{ d[0] }} {{ d[1] }}
布局模式 · 拖动卡片调整顺序,拖到别的分组即可换组 未保存 + 新建分组 取消 保存布局
管理控制台 刷新 退出 关闭
新增条目 补齐缺失图标 共 {{ items.length }} 条
图标名称内网地址外网地址分类操作
{{ it.name }}
docker 容器已消失 已排除 待填地址 {{ it.container_image }}
{{ it.url_lan_view || it.url_lan || '—' }} {{ it.url_wan_view || it.url_wan || '—' }} {{ catName(it.category_id) }} 反代 编辑 恢复 排除 删除
暂无条目
添加 {{ selCats.length ? '已选 ' + selCats.length + ' / ' + categories.length : '勾选后可批量删除' }} 批量删除({{ selCats.length }})
分类就是首页的分组。建好后到首页点右上角汉堡里的「编辑布局」,把卡片拖进分组即可。用「排序」列的 ↑ ↓ 调整分组在首页的先后顺序。
名称条目数卡片尺寸排序操作
{{ c.name }} {{ countInCat(c.id) }} ↑ ↓ 改名 删除
暂无分类
扫描容器 全量同步(保留我的修改) 按服务类型归类 自动扫描:{{ scanResult.auto.min ? '每 ' + scanResult.auto.min + ' 分钟' : '关闭' }}
采集源 + 添加远端主机
采集源状态容器操作
{{ src.name }} {{ src.kind === 'local' ? '本机' : 'Agent' }}
{{ src.prefix || (src.kind === 'local' ? '地址按浏览器访问地址自动展开' : '未设置地址前缀') }}
{{ src.kind === 'local' ? '实时读取' : (src.online ? '在线 · ' + agoText(src.ago) : (src.last_seen ? '离线 · ' + agoText(src.ago) : '从未上报')) }} {{ src.container_count }} 内置
点「扫描容器」列出 NAS 上的所有容器(含无端口映射的)
站点信息 {{ s.site_title || '未命名' }} ▾
使用 恢复默认
显示在左上角标题前,登录页也会用。建议正方形、128×128 以上的 PNG / SVG(透明底更好看); 当前:{{ s.site_logo ? '自定义图标' : '默认 ◆' }}
壁纸 {{ s.wallpaper ? '已自定义' : '默认渐变' }}{{ s.wallpaper_random ? ' · 每次随机' : '' }} ▾
使用 清除
×
当前:{{ s.wallpaper || '默认渐变' }} (URL,已回填到上方)
横竖屏自适应:填 /api/pc 或 /api/random 这类地址会自动按方向换成 /api/pc / /api/mobile(手机竖屏取竖图、电脑横屏取横图,旋转屏幕自动换); 其它接口可在地址里写 {orientation} 占位符。
{{ s.wallpaper_blur }}px
{{ s.wallpaper_dim }}%
每次刷新随机换一张。
卡片 卡片风格与信息量 ▾
0=自适应,1=每个分类独占一行
在「项目」里给条目配上 API 地址,卡片就会显示下载速度、正在播放等实时信息(数据只在内网抓取,需登录可见)。
秒
关掉更干净;单个条目可在编辑弹窗里单独覆盖。
容器卡片图标右下角的小圆点:绿=正常、黄=延迟偏高、红=访问不了(悬停看毫秒数)。 由面板从内网探测,跟随上面的刷新间隔;网站收藏卡片不显示。
毫秒,超过显示黄点
站内抓不到时,用 favicon.im 按域名再取一次(能救回被 Cloudflare 拦的站点);「首字母占位」给纯 API 容器本地生成字母图,不联网。抓取顺序:首页声明的 icon → 常见路径 → 在线图标库。
保存外观设置 改动即自动保存,按钮用于手动确认
地址与域名 外网域名 {{ s.host_wan || '未填' }} ▾
留空最省事:用内网 IP 打开面板,链接就自动用它。
用于自动拼外网地址。
frp 直通 TCP 时只有 http 能开,填 https 会打不开链接。
逗号分隔,用于判定「内网访问」。
网络判定 服务端怎么认内网 / 外网 ▾
从 frp / 反代进来时服务端看到的仍是内网 IP,填上外网域名才判得准(支持 *.example.com)。
内网也用域名访问(本地 DNS 解析到 NAS)就关掉。
frp 的 HTTP 代理可在 frpc 里加 requestHeaders.set.X-Navpage-Net = wan,比按域名判更稳;TCP 代理不支持加头。
反向代理后面才需要开。
切换与访问 {{ s.auto_switch ? '自动内网/外网切换' : ('固定' + (s.default_mode === 'wan' ? '外网' : '内网')) }} ▾
由浏览器探测内网是否可达来自动选链接;顶栏手动选内网 / 外网会覆盖它。
扫描行为 扫描排除与空端口容器 ▾
在「项目」页点「排除」会自动写进这里,重新扫描也不会再导回来;「恢复」反向操作。
默认关闭:这类容器也会生成卡片,地址留空,到「项目」里手动补端口。
分钟,填 0 = 关闭
开启后后台按这个间隔扫一遍 Docker:新容器自动建卡,并按网关设置补齐反代 / FRP 地址(手填过的地址不会被覆盖)。
管理员密码 修改登录密码 ▾
修改
当前判定 排查内外网判断问题时看这里 ▾
模式{{ network.mode }}(服务端判定 {{ network.auto_mode }}) 切换模式 {{ modeChoice === 'auto' ? '自动(按探测结果)' : (modeChoice === 'lan' ? '手动锁定 = 内网' : '手动锁定 = 外网') }} 客户端 IP{{ network.client_ip }} · 来源 {{ network.source }} 局域网探测{{ probeText }} 探测地址{{ probeUrlText }}
保存网络设置 重新探测内网 {{ autoSaveAt ? '已自动保存 ' + autoSaveAt : '改动即自动保存,按钮用于手动确认' }}
{{ (gw.proxy && gw.proxy.running) ? '反代运行中' : '反代未启动' }} · HTTP {{ gw.proxy.http_port }} / HTTPS {{ gw.proxy.https_port }} · 路由 {{ (gw.proxy.routes || []).length }} 条 {{ gw.proxy.error }} 重载 保存并应用
反向代理 {{ s.gw_enabled ? ('监听 ' + s.gw_http_port + ' / ' + s.gw_https_port) : '未启用' }} ▾
启用后,卡片上的反代域名会被这个进程接住并转发到内网容器,不再需要 Lucky / Gately。
容器里这两个端口要映射出来(compose 已默认 8081/18443)。NAS 的 80/443 被 fnOS 占着时,用路由器或 fnOS 的端口转发把外网 80/443 指到这两个端口即可。
卡片的反代域名默认是 容器名.根域名,可逐条改。
开:只签 *.根域名 一张,所有卡片共用(推荐,续期也只有一张)。关:每个域名单独签。
生成的反代地址用 http 还是 https。
卡片内网地址里的 {host} / 127.0.0.1 会换成这个主机;留空时自动用默认网关(即 NAS 宿主机),端口用容器映射出来的端口。
标签是「校验证书」:容器自签证书就关掉(默认关)。协议本身按端口猜:443/8443 → https,其余 http。
WAF 防火墙 {{ s.waf_enabled ? (s.waf_mode === 'monitor' ? '观察模式(只记日志)' : '拦截模式') : '未启用' }} ▾
内置反代收到请求后先过一遍下面这些规则;命中就拦(或只记日志)。只作用于经过内置反代的域名。
先开「观察」跑几天,看下面的日志确认不误伤自己人,再切「拦截」。
支持单个 IP 和 CIDR,逗号或换行分隔。
填了就只用你填的关键词;想在内置基线外再加,把基线关键词一起写上。
按「包含」匹配,不分大小写。
这类方法正常业务用不到,被探测时常见。
每 IP 在窗口内超过这个请求数就拦,0 = 不限速。压测/大流量下载时别开太小。
规则试跑 试跑 {{ wafT.verdict === 'allow' ? '放行' : ('命中:' + (wafT.rule || '')) }}
拦截日志 共检查 {{ (gw.waf && gw.waf.counters.checked) || 0 }} 次 · 拦截 {{ (gw.waf && gw.waf.counters.blocked) || 0 }} · 观察 {{ (gw.waf && gw.waf.counters.monitored) || 0 }} 刷新 清空
时间来源 IP域名 路径命中规则动作
{{ hhmmss(h.t) }} {{ h.ip || '-' }} {{ h.host }} {{ h.path }} {{ h.rule }} {{ h.action === 'block' ? '拦截' : '观察' }}
还没有命中记录。
证书(自动申请 / 续期) {{ (gw.certs || []).length }} 张 ▾
到期前 {{ s.gw_cert_days }} 天自动续。走 DNS-01:只需要下面 DNS 凭据,不占 80 端口。
Let's Encrypt 的到期提醒邮箱,也是账号标识。
只给自建 Pebble / step-ca 测试用。
{{ c.name }} {{ (c.domains || []).join(', ') }}
{{ c.days }} 天 删除
还没有证书
立即签发 / 续期 {{ gw.cert_error }}
DNS 凭据(证书 + DDNS 共用) {{ s.dns_provider || '未配置' }} ▾
测试凭据 保存 写 TXT 后等待解析生效的秒数(默认 15,慢的供应商加到 60)。
卡片自动联动 {{ s.gw_auto_proxy ? '新容器自动反代' : '手动生成' }} ▾
扫描导入 / 全量同步 / 自动扫描时,给新卡片补 容器名.根域名 的反代地址、外网地址;开了 FRP 就一起补 FRP 地址,开了自动签发就顺带签证书。手填过的地址不会被覆盖。
同步所有卡片 按当前卡片重算一遍反代域名 / FRP 地址(已有的不覆盖)。
反代规则永远等于卡片数据:改卡片的「内网地址」或「反代域名」,路由下一次请求就生效,不用重启。
{{ (gw.ddns && gw.ddns.enabled) ? 'DDNS 已启用' : 'DDNS 未启用' }} · 当前公网 IP {{ gw.ddns.ip }} 立即更新
动态域名 {{ s.ddns_record || '未填记录' }} ▾
A 记录会指向家里当前公网 IP;记录不存在会自动创建。DNS 服务商用「网关」页签里那套凭据。
只在 IP 变化时才调 API。
逗号分隔的 URL,返回纯文本 IP 或 JSON 都行;留空时依次试 ipify / ipip / cloudflare。
保存并应用 {{ gw.ddns.error }} 上次更新 {{ agoText(gw.ddns.at) }} · {{ gw.ddns.result || '' }}
{{ (gw.frp && gw.frp.running) ? 'frpc 运行中' : 'frpc 未运行' }} · {{ gw.frp.proxies }} 条隧道 · PID {{ gw.frp.pid }} {{ gw.frp.error }} 应用配置
frps 服务器 {{ s.frp_server ? (s.frp_server + ':' + s.frp_port) : '未配置' }} ▾
本机跑 frpc 连到你自己的 frps(甲骨文 / 其他公网 VPS),每条卡片一条 HTTP 隧道。
frps 挂在 nginx/OpenResty 后面、对外只有 443 时选 wss,端口填 443。
同一个 frps 上还有别的 frpc(比如你原来的图形客户端)时,前缀能避免「proxy already exists」重名报错。
frps 配了 subdomainHost 才用这一项(frps 的 vhost 端口在 80/443 时最省事)。
frps 没开 subdomainHost 时用这个:每条卡片按 容器名.后缀 注册 customDomains,DNS 需把 *.后缀 解析到 frps,并由 frps 前面的 nginx 把该域名转到 frps 的 vhost HTTP 端口。
不是 80/443 时,生成的地址会自动带端口。
保存 应用配置
运行日志 最近 30 行 ▾
{{ (gw.frp && gw.frp.log) ? gw.frp.log.join('\n') : '(暂无日志)' }}
填一台裸 VPS(能 SSH + 装了 Docker 就行,不需要 1Panel / 宝塔),点「部署」会自动: 装 frps(可选 Caddy 终止 TLS)、补 *.{{ nodeForm.root_domain || 'frp.你的域名' }} 通配 A 记录、 用内置 ACME 签通配证书推过去;之后点「用这个节点」就把参数写进 FRP 客户端。 重复部署 = 更新配置,幂等。
节点配置 {{ nodeForm.root_domain ? (nodeForm.root_domain + ' · ' + nodeForm.host) : '未填写' }} ▾
需要 root,或能免密执行 docker 的用户(部署要跑 docker compose)。
密码 私钥
只存在本地数据库,接口返回一律打码。
支持 ed25519 / ecdsa / rsa(OpenSSH 格式)。
Caddy 形态:站点走 https:443,frpc 直连 tcp:7000(TLS);纯 HTTP 形态:全走 http:80 + tcp:7000。
卡片地址 = 容器名.这个后缀;自动加的记录是 *.{{ nodeForm.root_domain || 'frp.example.com' }}(走「设置 → 证书」里的 DNS 服务商)。
frps 的 bindPort(frpc 直连用的那个),不是 vhost 端口。
80/443 已被别的服务占用,或者想用非标准端口时填这里(如 8180)。
测试连接 部署 / 更新 新建节点
已部署节点 {{ gwNodes.length }} 个 ▾
还没有节点。上面填好点「部署 / 更新」。
{{ n.name || n.host }} {{ n.mode === 'caddy' ? 'Caddy/443' : 'HTTP/' + (n.vhost_port || 80) }} {{ n.root_domain }} 证书 OK 编辑 同步证书 用这个节点 删除
{{ n.ssh_user }}@{{ n.host }}:{{ n.ssh_port }} · 公网 {{ n.last.host_ip }} · 上次部署 {{ new Date(n.last.at * 1000).toLocaleString() }}
部署日志 {{ nodeSteps.length }} 步 ▾
{{ nodeLogText() }}
点「测试连接」或「部署 / 更新」后,每一步的结果会显示在这里。
检查更新 更新全部 {{ imgOutdated }} 个 共 {{ imgRows.length }} 个容器 · {{ imgOutdated }} 个可更新 · 上次检查:{{ imgCheckedText }}
这里显示的是上一次检查的结果(打开页面不会自动去查,省得每次进来都等和耗 Docker Hub 配额); 要看最新状态点左上「检查更新」,一次检查的结果缓存 {{ Math.round((s.image_check_cache || 3600) / 60) }} 分钟。 Docker Hub 按 IP 限流匿名查询,一次扫几十个很容易整片 429(现象就是「一直显示不出来更新」),填镜像源可绕开。
更新设置 镜像源 {{ s.image_mirror ? '已配置' : '直连' }} · 缓存 {{ Math.round((s.image_check_cache || 3600) / 60) }} 分钟 ▾
直连镜像站、不占 Docker Hub 配额,通常 1~3 秒返回;查不到时自动回退下面的代理。
秒
面板没挂 docker.sock,要用它更新得两把锁同时打开:① 这个开关; ② 给 navpage-socket-proxy 加上 POST=1 ALLOW_START=1 ALLOW_STOP=1 并重启它。 只开①会报 403。②等于把宿主机 root 能力交给面板,请自行权衡;不开也能用「检查更新」手动更新。
定时自动检查 到点检查 {{ (imgAuto && imgAuto.desc) || s.image_auto_cron }} 已关闭 ▾
关掉时后台完全不跑
上次运行({{ fmtTs(imgAuto.last.ts) }}):{{ autoLastText }}
定时清理未使用镜像 清理 {{ (pruneSt && pruneSt.desc) || s.image_auto_prune_cron }} · {{ s.image_prune_mode === 'dangling' ? '悬空镜像' : '未被使用' }} 已关闭 ▾
关掉时后台完全不跑
悬空镜像:没有标签的 <none> 中间层,最安全(等同 docker image prune)。 未被使用:连有标签但没容器用的也删(等同 docker image prune -a, 会删掉「拉过还没跑」的镜像和上一版备份,删了就没了)。 两种范围都不会碰正在或曾经被容器用过的镜像——停止中的容器也算「在用」。
添加
{{ k }}
白名单里的镜像永远不清理,支持 * 通配(如 linuxserver/*)。
预览可清理 立即清理
可清理 {{ prunePrev.count }} 个,共 {{ prunePrev.bytes_text }}
上次清理出错:{{ pruneSt.last.error }}
上次清理({{ fmtTs(pruneSt.last.ts) }}):{{ pruneLastText }}
{{ imgError }}
{{ imgUpdatingName }} {{ imgStep || '准备中…' }}
镜像拉取 {{ imgPct }}% 正在执行:{{ imgPhase === 'recreate' ? '重建容器' : (imgPhase === 'rollback' ? '回滚' : '准备') }} · 已用 {{ imgElapsed }}s · 更新期间容器会短暂中断,完成前请勿关闭面板
更新日志 {{ imgLog.length ? imgLog.length + ' 条' : '暂无' }} ▾
{{ imgLog.join('\n') }}
上次:{{ imgLast.container }} {{ imgLast.success === true ? '成功' : (imgLast.success === false ? '失败' : '结果未知') }} ({{ ago(imgLast.ts) }} · 用时 {{ imgLast.elapsed }}s) {{ imgLast.message }}
容器镜像状态 本地 / 远程自动更新操作
{{ r.container }}
{{ r.project }} {{ r.state }}
{{ r.image }} {{ r.local_only ? '本地镜像' : (r.status === 'outdated' ? '可更新' : (r.status === 'current' ? '已最新' : '未知')) }} {{ r.local_digest || '—' }}
{{ r.remote_digest || '—' }}
{{ imgPct > 0 && imgPhase === 'pull' ? imgPct + '%' : '进行中' }}
{{ r.local_only ? '重建' : '更新' }}
点「检查更新」比对本地镜像和 registry 的最新版本
保存镜像设置 改动即自动保存,按钮用于手动确认
扫描 {{ cmpRoot || '/vol1/1000/docker' }} 下的 compose 文件,可直接改 YAML 并「保存并重构」。 保存前会跑 docker compose config 校验,写不进去的坏配置不会落盘; 每次保存会在同目录留一份 .bak-时间戳(只留最近 10 份)。
新建项目 重新扫描 共 {{ cmpRows.length }} 个项目 {{ cmpError }}
项目 服务 容器 文件 操作
{{ r.project }} 重复
{{ r.dir }}
{{ r.services.length }} 个 未创建 {{ c.name }} {{ r.path.split('/').slice(-2).join('/') }} 编辑 重构
没有找到 compose 文件
上次重构:{{ cmpLast.project }} {{ cmpLast.ok ? '成功' : '失败' }}
{{ cmpLast.message || '(没有输出)' }}
一个备份包 = 全部卡片与分类 + 全部设置(图标地址、内网/外网地址、外观、网关、FRP、DDNS、WAF、自动扫描等) + 本地图标库、壁纸、左上角 logo、网关证书。 新建容器后装好导航页,在这里恢复这一个 zip,就回到和现在一模一样的状态。
备份包含密码哈希、DDNS/FRP 令牌、证书私钥,请当作机密文件保管。
备份并下载 备份到服务器 刷新 每天自动备份一次({{ bkAuto ? '已开启' : '已关闭' }}),每种保留最近 {{ bkKeep }} 份
从备份恢复 恢复 = 整体替换,会先自动留一份「恢复前」快照用于回滚
选择备份包… {{ bkPickName }} 上传并恢复
连管理员密码一起恢复(不勾选 = 恢复后仍用当前密码登录)
{{ bkLastMsg }}
服务器上的备份 {{ bkFiles.length }} 份 {{ bkDir }}
文件 大小 时间 来源 操作
{{ b.name }} {{ bkSize(b.size) }} {{ bkTime(b.mtime) }} {{ bkKind(b.kind) }} 下载 恢复 删除
服务器上还没有备份,点「备份到服务器」留一份(存在数据卷里,换容器也在)
:
:
:
在「设置 → FRP」里开了隧道后,点下面的「生成反代 / FRP 地址」会自动填好。
「跟随右上角」= 你点 自动/内网/外网/FRP 时它跟着变;选了固定档就永远用那一个,那一档没地址时自动回落。
生成反代 / FRP 地址 反代域名:{{ editItem.proxy_domain }}
地址和端口分开填:平时换服务只需要改右边端口号,地址({scheme}://{host} 或内网 IP)不用动。 端口留空就是不加端口。
支持占位符:{host} 换成当前访问地址的主机名(局域网访问就是 NAS 的 IP, 外网访问就是域名),{scheme} 换成当前模式对应的协议。 扫描导入的条目默认写成 {scheme}://{host}:端口,内网外网自动各用各的地址。
{{ initial(editItem.name) || '?' }} 抓取图标 图标库
「抓取图标」= 拿上面填的网址去站点抓 favicon 存进本地图标库(换个地址再点一次即可重抓)。 抓不到多半是站点没有 favicon,或要登录才能打开。
在线图标库来自 GitHub 公开仓库(默认 homarr-labs/dashboard-icons,可在图标库弹窗的 「图标源管理」里添加更多仓库,支持多个)。 选中的图标会下载到数据目录 data/icons/ 永久保存,其他卡片也能直接复用。
状态小组件(可选)
{{ wdgHint }}
{{ gwDlg.name }} 转发到 {{ gwDlg.target || '卡片没填内网地址' }}。这里改的域名就是内置网关里的那条路由,保存后立即重载生效。
不勾也能用(浏览器会提示证书不匹配);配好 DNS 凭据后可自动签通配符证书。
内置反代现在是关闭状态:域名会照常写进卡片,外网要等「设置 → 网关」里开启并配好端口才生效。
{{ gwDlg.msg }}
{{ gwDlg.err }}
共 {{ iconList.length }} 个 · 上传和选用过的都永久存在 data/icons/ 刷新
{{ f.name }} 上传 库 ×
还没有图标 —— 上传一个,或从「在线图标库」挑一个
搜索 更新清单
{{ iconLibErr }}
共 {{ iconTotal }} 个图标 · 来自 {{ iconLibs.length }} 个图标库 · 清单 {{ fmtAgo(iconLibAt) }} —— 图标源可在「图标源管理」里增删
{{ it.name }} {{ it.lib_label }} …
加载更多({{ iconResults.length }} / {{ iconTotal }})
{{ iconQ ? '没搜到「' + iconQ + '」—— 换个关键词,或在「图标源管理」里加一个图标库' : '这个图标库还没拉清单,点「更新清单」' }}
添加
支持任意 GitHub 公开仓库(可以是几个图标的仓库,也可以是几万个的图标库)。 识别 svg / png / webp / ico / jpg / gif,一级子目录自动当格式分组(默认优先 svg)。 清单缓存 7 天,加进来时会自动拉一次;搜索时缺清单也会按需拉。
{{ l.label }} {{ l.id }}@{{ l.branch }}{{ l.sub ? '/' + l.sub : '' }} · {{ l.count ? l.count + ' 个图标' : '未拉取清单' }} · {{ fmtAgo(l.cached_at) }} {{ l.error }}
更新清单 移除
一个图标库都没有了 —— 填个地址加回来,如 homarr-labs/dashboard-icons
全部更新清单 示例:selfhst/icons、homarr-labs/dashboard-icons、walkxcode/dashboard-icons
NavPagev{{ appMeta.version || '未知' }}
自托管的个人导航页
当前版本 v{{ appMeta.version || '未知' }}
项目地址 {{ appMetaShort }}
更新日志 查看更新日志 ↗
{{ cmpDlg.path }} · 有未保存的改动 · {{ cmpDlg.containers.length }} 个容器
{{ cmpDlg.msg }}
将创建: {{ cmpRoot }}/{{ cmpNew.name || '项目名' }}/docker-compose.yml
{{ cmpNew.msg }}
卡片内网地址 = 前缀 + 容器端口;容器有 nav.url.lan 标签时以标签为准。
上报的新容器自动建成卡片(落「未分类」)
在对端主机(需要 docker)执行下面这条命令即可,纯出站上报,不用开放任何端口。 令牌只显示一次:换机器或重装时点「轮换令牌」重新生成。
{{ agentCmd }}
面板和对端不在同一台机器、命令里又要填 127.0.0.1 时,给 docker run 加 --network host。
{{ ctxMenu.item && ctxMenu.item.name }}
编辑名称 / 地址 / 图标
删除从导航页移除