一天一个开源项目

一天一个开源项目(第218篇):Homepage —— 给你所有自托管服务配一个优雅的统一面板

Homepage 是一个现代化、高度可定制的自托管服务仪表盘,用 YAML 配置服务分组、书签和 Widget,支持 Docker Label 自动发现容器、150+ 服务 API 集成、40+ 语言本地化。32.6k Stars,GPL-3.0,Next.js 构建,静态生成极速加载。

·约 9 分钟阅读·工具推荐

引言

"服务越来越多,书签越来越长,每次找个东西都要想半天——该有个面板了。"

这是"一天一个开源项目"系列的第 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   → 直接展示关键指标(剧集数、正在播放、磁盘使用率……)

使用场景

  1. 家庭服务器 / NAS 管理面板

    • 把所有自托管服务汇聚到一个页面,局域网内所有设备的统一入口
  2. 媒体中心看板

    • Jellyfin/Plex 正在播放什么、Sonarr/Radarr 下载队列状态、磁盘使用情况——一眼看清
  3. 网络与安全监控

    • AdGuard Home 拦截统计、Uptime Kuma 在线率、Traefik 路由状态——实时呈现
  4. 团队内部工具导航

    • 小团队的内部服务入口页,代替手动维护书签
  5. 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-key

4. 安全的密钥管理

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

在安全敏感的环境里,方案二更合适。

与同类工具的对比

维度HomepageHomarrHeimdallDashdot
配置方式YAML 文件图形化拖拽图形化YAML
Docker 自动发现✅ Label 自动
Service Widget 数量150+50+
API 代理(密钥安全)✅ 后端代理部分
静态生成
配置版本控制✅ 天然支持❌ 存 DB❌ 存 DB
Stars32.6k7k+6k+3k+

Homepage 的核心优势在于:Widget 数量最多 + YAML 配置可版本控制 + 后端代理保护密钥。代价是上手门槛比拖拽式工具稍高。


项目地址与资源

官方资源

相关资源


总结与展望

核心要点回顾

  1. YAML 配置中心化:services、widgets、bookmarks、settings 四个文件,配置即文档,天然支持 Git 版本控制
  2. Docker Label 自动发现:新容器加上 homepage.* 标签就自动出现在面板,无需手动维护
  3. 150+ Service Widget:从 *arr 系列到 AdGuard Home,API 数据直接展示在卡片上
  4. 后端代理保护密钥:API Key 永不暴露给浏览器,环境变量注入让配置可以安全提交
  5. Next.js 静态生成:页面骨架即时加载,Widget 数据异步填充,单个服务慢不影响整体

适合谁

  • 家庭服务器 / NAS 爱好者:跑了一堆自托管服务,需要一个统一入口
  • 折腾党:喜欢通过 YAML 精确控制每个细节,而不是拖拽
  • 重视安全的自托管用户:不想把 API Key 暴露在前端
  • *arr 媒体栈用户:Sonarr + Radarr + Jellyfin 全家桶,Homepage 的 Widget 覆盖最全

一句话评价

Homepage 做的是一件小而精的事:把你分散在各个端口的服务,用一份 YAML 文件和一个优雅的页面统一起来。


欢迎访问 PrimeSkills —— 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。

更多实用知识和有趣产品,欢迎访问我的个人主页