用 Homepage 整理自己部署的应用入口

把笔记、书签和监控链接集中到 Homepage。先用 SSH 转发初始化,再配置域名、登录和需要的状态组件。

笔记、书签、监控和面板的地址不好记,可以用 Homepage 放在一个页面里,按用途分组。已有机器通常就能部署。它只整理链接,不会替你登录或保护被链接的应用。

这篇先建立一个通过 SSH 访问的私人导航页,再考虑域名和状态组件。这样即使暂时没配好代理,内部地址和组件凭据也不会先暴露在公网。

先通过 SSH 转发安装

准备一台已安装 Docker Engine 与 Compose 插件的 Linux 服务器。下面把应用放在 /opt/homepage,宿主机使用 3100 端口,容器内部仍为 3000。账户需要有 Docker 权限;创建 /opt 下的目录时使用有相应权限的账户。

sudo mkdir -p /opt/homepage/config
sudo chown "$(id -u):$(id -g)" /opt/homepage/config
cd /opt/homepage
umask 077
printf 'PUID=%s\nPGID=%s\n' "$(id -u)" "$(id -g)" > .env
printf 'AUTH_SECRET=%s\n' "$(openssl rand -hex 32)" >> .env
printf 'AUTH_PASSWORD=%s\n' "$(openssl rand -hex 24)" >> .env
chmod 600 .env

密码保存在 .env,用本机可信编辑器查看并保存到密码管理器,别把整个文件提交到仓库。创建 compose.yaml:

services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:3100:3000"
    volumes:
      - ./config:/app/config
    environment:
      PUID: ${PUID:?set PUID}
      PGID: ${PGID:?set PGID}
      HOMEPAGE_ALLOWED_HOSTS: "127.0.0.1:3100,localhost:3100"
      HOMEPAGE_AUTH_ENABLED: "true"
      HOMEPAGE_AUTH_SECRET: ${AUTH_SECRET:?set AUTH_SECRET}
      HOMEPAGE_AUTH_PASSWORD: ${AUTH_PASSWORD:?set AUTH_PASSWORD}
      HOMEPAGE_EXTERNAL_URL: "http://127.0.0.1:3100"

当前 Homepage 提供内置认证;老版本教程中“只能靠外部认证”的说法不能直接沿用。这里启用密码登录,同时限制宿主机监听范围。latest 会变化,首次确认正常后记录镜像摘要,固定为已验证版本或摘要;升级前阅读对应发布说明。

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose logs --tail=80 homepage

在自己的电脑建立转发,再打开 http://127.0.0.1:3100:

ssh -N -L 127.0.0.1:3100:127.0.0.1:3100 user@YOUR_VPS_IP

本机 3100 被占用时,可以改本机转发端口,但 HOMEPAGE_EXTERNAL_URL 和允许的 Host 也要随实际浏览器地址调整。允许的 Host 使用域名及必要端口,多个值逗号分隔,不含空格;它与完整的访问 URL 是两种配置。

链接要用自己的电脑能访问的地址

应用生成配置后,编辑 config/services.yaml。下面是文件结构示例,替换成自己实际可访问的 HTTPS 地址:

- 日常使用:
    - 笔记:
        href: https://notes.example.com/
        description: 项目资料与维护记录
    - 书签:
        href: https://bookmarks.example.com/
        description: 待读资料与常用文档
- 维护:
    - 监控:
        href: https://status.example.com/
        description: 网站响应与故障记录

浏览器点击链接发生在自己的电脑上。写成 http://127.0.0.1:8080,指向的是读者电脑,通常不是 VPS;写容器服务名,电脑也未必能解析。需要 SSH 才能访问的工具,应安排对应转发或 VPN,再填写实际入口。

先检查三个链接、中文描述和手机点击,再加图标和状态组件。组件读取数据通常还需要 URL、凭据以及 Homepage 到后端的网络连通性;“链接能打开”和“组件能读 API”应分开检查。不要把管理员令牌写进可公开下载的配置。

不挂 Docker socket,也能用导航页

本例没有挂载 /var/run/docker.sock。基础导航不需要它;即便挂载后缀写了 :ro,也不能理解成 Docker API 只有查看权限。以后需要容器状态时,先选择受限制的集成方式,再核对它能执行哪些操作。

如果改用公网域名,更新允许的 Host 与 HOMEPAGE_EXTERNAL_URL,后者使用实际 HTTPS 地址。内置密码认证没有应用层的尝试速率限制,公网部署还应在网关设置相应控制。每个被链接的应用仍要保留自己的权限;导航页的密码不会自动覆盖其他服务。

备份配置、密钥和镜像版本

保留 compose.yaml、.env 和整个 config,记录镜像摘要。用受保护的异地副本保存,恢复时先在另一回环端口启动,核对分组、链接、登录和组件权限,再接回正式域名。换机器后内部 IP、网关与组件地址也可能需要修改。

少量链接可以和已有应用放在同一台 VPS 上。准备同时运行笔记、书签和监控时,再按照应用总内存、磁盘增长与备份方式比较小型 Docker 应用的 VPS 选择。只为了收拢几个入口,通常没有必要再买一台服务器。

私人导航只是少量链接时可与已有应用共机;带状态组件、同时运行笔记与数据库时,可以按合计负载比较 2 GB 或 4 GB 内存实例。新手统一管理可查看 雨云 RCS 的小应用与面板选项,自行管理可比较 Evoxt 的 Linux 实例。先核对实际访问入口与备份空间,组件凭据和 Docker 权限仍由自己管理,新增机器也不会自动限制这些权限。