引言
"服务越来越多,书签越来越长,每次找个东西都要想半天——该有个面板了。"
这是"一天一个开源项目"系列的第 218 篇。今天的项目是 Homepage。
如果你有一台家庭服务器或 NAS,上面跑着 Jellyfin、Nextcloud、Sonarr、Portainer……那你一定遇到过这个问题:每个服务一个端口,全靠记忆或书签管理,状态正不正常只能一个个打开看。
Homepage 解决的正是这件事。它是一个自托管服务的统一入口面板,用 YAML 配置你所有的服务,自动发现 Docker 容器,实时显示服务状态和关键指标——一个页面看清楚所有东西。
32.6k Stars,GPL-3.0,200+ 贡献者,Next.js 静态生成保证极速加载。
你将学到什么
- Homepage 的 YAML 配置体系(services、widgets、bookmarks、settings 四大文件)
- Docker Label 自动发现容器的工作原理
- 150+ Service Widget 的集成方式(以 Sonarr、AdGuard Home 等为例)
- 环境变量密钥注入的安全实践
- 与同类工具(Dashdot、Heimdall、Homarr)的定位对比
前置知识
- 了解 Docker 和 docker-compose 的基本用法
- 熟悉 YAML 格式
项目背景
项目简介
Homepage 定位是以配置为中心的自托管服务面板。它不是拖拽式可视化编辑器,而是通过 YAML 文件精确描述你的服务布局和集成配置。这个设计决策带来两个好处:配置文件可以版本控制,也可以在多台机器之间复用。
所有 API 请求由后端代理转发,浏览器端永远看不到你的 API Key——这解决了很多同类工具"把密钥暴露给浏览器"的安全隐患。
作者与团队
- 主要维护者:@shamoon
- 贡献者:200+
- 协议:GPL-3.0
项目数据
- ⭐ GitHub Stars:32,600+
- 🍴 Forks:2,100+
- 📄 协议:GPL-3.0
- 💻 技术栈:Next.js(React)+ YAML 配置
- 🌐 官网:gethomepage.dev
- 🐳 镜像:
ghcr.io/gethomepage/homepage:latest
主要功能
解决什么问题
没有面板的自托管生活:
Jellyfin → http://192.168.1.100:8096
Nextcloud → http://192.168.1.100:8080
Sonarr → http://192.168.1.100:8989
Portainer → http://192.168.1.100:9000
Grafana → http://192.168.1.100:3000
……(还有十几个)
问题:
- IP + 端口全靠记忆或书签
- 服务挂了不知道,等到用时才发现
- 媒体库新增了什么、下载队列有多少——要进去才能看
有了 Homepage:
一个页面 → 所有服务入口
服务卡片 → 实时显示状态(在线/离线/响应时间)
Widget → 直接展示关键指标(剧集数、正在播放、磁盘使用率……)使用场景
-
家庭服务器 / NAS 管理面板
- 把所有自托管服务汇聚到一个页面,局域网内所有设备的统一入口
-
媒体中心看板
- Jellyfin/Plex 正在播放什么、Sonarr/Radarr 下载队列状态、磁盘使用情况——一眼看清
-
网络与安全监控
- AdGuard Home 拦截统计、Uptime Kuma 在线率、Traefik 路由状态——实时呈现
-
团队内部工具导航
- 小团队的内部服务入口页,代替手动维护书签
-
VPS 多服务管理
- 把 VPS 上的各个服务统一管理,搭配反向代理在外网安全访问
快速开始
最简 docker-compose 部署:
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- 3000:3000
volumes:
- ./config:/app/config # YAML 配置目录
- /var/run/docker.sock:/var/run/docker.sock:ro # Docker 自动发现(可选)
environment:
HOMEPAGE_ALLOWED_HOSTS: your-domain.dev # 或局域网 IP
restart: unless-stopped启动后访问 http://localhost:3000,然后在 ./config/ 目录下编辑 YAML 文件配置你的服务。
核心特性
1. 四大 YAML 配置文件
| 文件 | 作用 |
|---|---|
services.yaml | 定义服务分组和服务卡片 |
widgets.yaml | 页面顶部的信息组件(时间、天气、搜索栏等) |
bookmarks.yaml | 快速书签链接 |
settings.yaml | 全局设置(标题、主题、布局、语言等) |
2. 150+ Service Widget 集成
每个服务卡片可以内嵌一个 Widget,直接从对应服务的 API 拉取实时数据展示:
| 类别 | 代表服务 |
|---|---|
| 媒体管理 | Sonarr、Radarr、Lidarr、Readarr、Bazarr |
| 媒体服务器 | Jellyfin、Plex、Emby、Navidrome |
| 下载工具 | qBittorrent、Transmission、Deluge、SABnzbd、NZBGet |
| 网络工具 | AdGuard Home、Pi-hole、Traefik、Nginx Proxy Manager |
| 监控 | Uptime Kuma、Grafana、Prometheus、Netdata、Glances |
| 存储/云 | TrueNAS、Nextcloud、Portainer |
| 系统信息 | CPU、内存、磁盘、网络用量(内置) |
3. Docker Label 自动发现
挂载 Docker socket 后,只需在容器上添加 homepage.* 标签,服务自动出现在面板上,无需修改 services.yaml:
# 在其他容器的 docker-compose 中添加 labels
services:
sonarr:
image: linuxserver/sonarr
labels:
homepage.group: Media
homepage.name: Sonarr
homepage.icon: sonarr.png
homepage.href: http://sonarr:8989/
homepage.description: Series management
homepage.widget.type: sonarr
homepage.widget.url: http://sonarr:8989
homepage.widget.key: your-api-key4. 安全的密钥管理
API Key 不写在 YAML 里,用环境变量替代:
# services.yaml 中用占位符
widget:
type: sonarr
url: http://sonarr:8989
key: {{HOMEPAGE_VAR_SONARR_KEY}} # 占位符
# docker-compose.yml 中注入真实值
environment:
HOMEPAGE_VAR_SONARR_KEY: your-actual-api-key这样配置文件可以安全地提交到 Git。
5. 多平台与本地化
- 支持 AMD64 / ARM64,覆盖树莓派等 ARM 设备
- 40+ 语言国际化支持
- 亮色/暗色主题切换
深入剖析
配置体系详解
一份典型的 services.yaml 长这样:
- 媒体:
- Jellyfin:
icon: jellyfin.png
href: http://jellyfin:8096/
description: 媒体服务器
siteMonitor: http://jellyfin:8096/
widget:
type: jellyfin
url: http://jellyfin:8096
key: {{HOMEPAGE_VAR_JELLYFIN_KEY}}
fields: ["movies", "series", "episodes"]
- Sonarr:
icon: sonarr.png
href: http://sonarr:8989/
description: 剧集管理
widget:
type: sonarr
url: http://sonarr:8989
key: {{HOMEPAGE_VAR_SONARR_KEY}}
fields: ["wanted", "queued", "series"]
- 网络:
- AdGuard Home:
icon: adguard-home.png
href: http://adguard:80/
widget:
type: adguard
url: http://adguard:80
username: admin
password: {{HOMEPAGE_VAR_ADGUARD_PASS}}
fields: ["queries", "blocked", "filtered"]siteMonitor 字段会定期发送 HTTP HEAD 请求,在卡片上显示服务的在线状态和响应时间——不需要 API 集成,任何 HTTP 服务都能监控。
Next.js 静态生成的架构选择
Homepage 用 Next.js 构建,但采用了特殊的渲染策略:
大多数 Dashboard 工具的渲染方式:
浏览器请求页面 → 服务端每次动态渲染 → 返回 HTML
↑ 每次加载都有延迟
Homepage 的方式:
构建时静态生成 HTML/CSS/JS → 直接返回静态文件
Widget 数据 → 单独的 API 路由实时拉取
↑ 页面骨架秒开,Widget 数据异步填充这带来的体验是:页面几乎瞬间加载,Widget 数据随后异步出现,不会因为某个服务慢而阻塞整个页面。
Docker Socket 的安全考量
挂载 /var/run/docker.sock 让 Homepage 可以自动发现容器,但这等于给了它 Docker 守护进程的完整权限——是个值得注意的安全面。
常见的缓解方案:
# 方案一:只读挂载(Homepage 只需读权限)
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# 方案二:使用 Docker Socket Proxy(推荐)
# 在 Homepage 和 Docker socket 之间加一个代理,只开放只读 API
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
environment:
CONTAINERS: 1 # 只允许读容器信息
POST: 0 # 禁止所有写操作
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
homepage:
environment:
# 连接代理而非直接 socket
HOMEPAGE_DOCKER_HOST: socket-proxy
HOMEPAGE_DOCKER_PORT: 2375在安全敏感的环境里,方案二更合适。
与同类工具的对比
| 维度 | Homepage | Homarr | Heimdall | Dashdot |
|---|---|---|---|---|
| 配置方式 | YAML 文件 | 图形化拖拽 | 图形化 | YAML |
| Docker 自动发现 | ✅ Label 自动 | ✅ | ❌ | ❌ |
| Service Widget 数量 | 150+ | 50+ | 少 | 少 |
| API 代理(密钥安全) | ✅ 后端代理 | 部分 | ❌ | ❌ |
| 静态生成 | ✅ | ❌ | ❌ | ❌ |
| 配置版本控制 | ✅ 天然支持 | ❌ 存 DB | ❌ 存 DB | ✅ |
| Stars | 32.6k | 7k+ | 6k+ | 3k+ |
Homepage 的核心优势在于:Widget 数量最多 + YAML 配置可版本控制 + 后端代理保护密钥。代价是上手门槛比拖拽式工具稍高。
项目地址与资源
官方资源
- 🌟 GitHub:https://github.com/gethomepage/homepage
- 📚 文档:https://gethomepage.dev
- 🐳 Docker 镜像:
ghcr.io/gethomepage/homepage:latest - 💬 Discord:Homepage Discord 社区
- 🐛 Issues:GitHub Issues
相关资源
- awesome-selfhosted — 自托管软件大全,寻找可放进面板的服务
- Uptime Kuma — 与 Homepage 集成极好的自托管监控工具
- tecnativa/docker-socket-proxy — Docker socket 安全代理,推荐与 Homepage 配合使用
总结与展望
核心要点回顾
- YAML 配置中心化:services、widgets、bookmarks、settings 四个文件,配置即文档,天然支持 Git 版本控制
- Docker Label 自动发现:新容器加上
homepage.*标签就自动出现在面板,无需手动维护 - 150+ Service Widget:从 *arr 系列到 AdGuard Home,API 数据直接展示在卡片上
- 后端代理保护密钥:API Key 永不暴露给浏览器,环境变量注入让配置可以安全提交
- Next.js 静态生成:页面骨架即时加载,Widget 数据异步填充,单个服务慢不影响整体
适合谁
- 家庭服务器 / NAS 爱好者:跑了一堆自托管服务,需要一个统一入口
- 折腾党:喜欢通过 YAML 精确控制每个细节,而不是拖拽
- 重视安全的自托管用户:不想把 API Key 暴露在前端
- *arr 媒体栈用户:Sonarr + Radarr + Jellyfin 全家桶,Homepage 的 Widget 覆盖最全
一句话评价
Homepage 做的是一件小而精的事:把你分散在各个端口的服务,用一份 YAML 文件和一个优雅的页面统一起来。
欢迎访问 PrimeSkills —— 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。
更多实用知识和有趣产品,欢迎访问我的个人主页