Ubuntu Weekly Recipe

第918回homepageでクールな家庭内ポータル兼サービスダッシュボードを作ろう

家庭内で様々なサーバーやWebアプリを動かしていると、それらをまとめたダッシュボードがほしくなりますよね。今回はそうしたサービスダッシュボードを手軽に作れるhomepageを紹介します。

homepageとは

homepageという非常に検索しづらい名前を持つこのプロダクトは、手軽で便利なサービスダッシュボードです。そしてその主用途は、一言で言えば「便利なホームページ」を作ることでしょう。ここで言うホームページとは、一般的なWebサイトの意味ではなく、本来のホームページです。つまりWebブラウザを起動した際に、最初に表示されるページのことを指しています。

homepageの説明を意訳すると、⁠完全静的、高速で安全、プロキシ対応、高度にカスタマイズ可能でモダンなアプリケーションダッシュボードを作れます。100以上のサービスとの連携機能と、多言語翻訳機能を搭載。YAMLファイルまたは、Dockerラベルの自動検出により簡単に設定できます」とのことです。

筆者も家庭内で様々なサーバーやWebアプリを動かしていますが、どのドメインで何が動いているかは、筆者の記憶ベースの運用になっています。そこで常々、これらを俯瞰し、簡単にアクセスできるホームページ(にできるサービスダッシュボード)がほしいと考えていました。homepageはまさにそうした用途にうってつけのプロダクトです。

企業であれば、社内ドキュメント、事務系のアプリ、タイムカード、ファイルサーバー、コードホスティグサーバー、チケットシステム、社内Wiki等々、多数のシステムが社内/社外を問わず存在するはずです。またチームごとに、個別のサーバーもあるでしょう。従来であれば、こうしたリンクはWikiやREADME.mdなどにまとめていたかもしれません。ですがhomepageを使えばよりクールで、かつリンク先のシステムと連携した、ちょっとリッチなリンク集を簡単に実現できます。そして新人には「とりあえずこのページをブラウザのホームに設定しとけ」と言えるわけです。便利ですね。

homepageのインストールと起動

homepageも今時のアプリの例に漏れず、Dockerで動かすのが簡単です。まずはDockerとComposeをインストールしておきましょう。

Dockerのインストール
$ sudo apt install -U -y docker.io docker-compose-v2

homepage用のディレクトリと、コンフィグを保存するconfigディレクトリを作成します。またcompose.yamlを以下のように作成してください。homepageのバージョンは、2026年6月にリリースされた1.13を設定しています。より新しいバージョンが存在する場合は、適宜変更してください。タグに「v1」を指定すれば、バージョン1系の最新を追従します。

compose.yamlの用意
$ mkdir -p ~/homepage/config
$ cat > ~/homepage/compose.yaml <<EOF
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:v1.13
    restart: unless-stopped
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - ./config:/app/config
    environment:
      HOMEPAGE_ALLOWED_HOSTS: home.exemple.com
EOF

環境変数HOMEPAGE_ALLOWED_HOSTSは、homepageへのアクセスに利用するドメイン、またはIPアドレスです。環境に応じて適宜変更してください。またここにはポート番号も含む必要があります。なおここに書かれていないURLやIPアドレスでhomepageにアクセスすると、以下のエラーが表示され、アクセスは拒否されます。

図1 設定されていないIPアドレスでアクセスした例。この例ではHOMEPAGE_ALLOWED_HOSTSに192.168.1.244:3000を設定する必要がある

設定ができたら、以下のコマンドでコンテナを起動してください。

homepageの起動
$ sudo docker compose -f ~/homepage/compose.yaml up -d

homepageの設定

設定したドメイン、もしくはIPアドレスでhomepageにアクセスしてみましょう。以下の画面が表示されます。

図2 デフォルト状態のhomepageの画面

サンプルとなるリンクがいくつか登録されていますね。これらデフォルトの設定は、~/homepage/configディレクトリ以下にYAML形式で出力されています。それではこれらの設定を、自分用の設定に書き換えていきましょう。なお書き換えた設定は自動でリロードされるため、都度のコンテナの再起動は不要です[1]

settings.yaml

settings.yamlでは、homepageの全体的なレイアウトや見た目を設定します。

「title」はその名の通り、ページのタイトルになります。ここでは「Home Lab」としました。⁠theme」はカラーテーマです。今風の流行りに乗って「dark」としています。⁠color」はカラーパレットの指定です。ここでは「slate」としていますが、別の色を指定して見た目のイメージを変えてもよいでしょう。⁠language」は言語の指定となります。

「layout」は、この後で定義するservices.yamlとbookmarks.yamlのレイアウトの指定です。ここでは「Infrastructure」⁠Network」⁠Storage」⁠Security」という4つのグループに対し、それぞれ行ベースでレイアウトし、そのカラム数を4に設定しています。

settings.yamlの例
title: Home Lab
theme: dark
color: slate
language: ja
layout:
  Infrastructure:
    style: row
    columns: 4
  Network:
    style: row
    columns: 4
  Storage:
    style: row
    columns: 4
  Security:
    style: row
    columns: 4

より詳しい設定については、ドキュメントを参照してください。たとえば壁紙のように、ページ背景に任意の画像を表示するようなカスタマイズも可能です。

widgets.yaml

widgets.yamlでは、ページの最上部に表示されるインフォーメーションウィジェットを定義します。おもにシステムや環境に関する情報を表示するのに使います。ウィジェットはファイル内で定義された順番に表示されるため、順番を入れ替えることでレイアウトを変更できます。ただし強制的に画面の右側に表示されるウィジェットも存在するため、完全にコントロールできるわけではない点に注意してください。

以下の例では検索バー、札幌の天気、時計、リソース情報を表示するよう設定していますが、時計は必ず右側に表示されるため、実際の表示は左からリソース、検索バー、天気、時計の順番になります。

widgets.yamlの例
- search:
    provider: google
    target: _blank

- openmeteo:
    label: Sapporo
    latitude: 43.0667
    longitude: 141.35
    timezone: Asia/Tokyo
    units: metric
    cache: 5

- datetime:
    text_size: xl
    format:
      dateStyle: short
      timeStyle: short

- resources:
    cpu: true
    memory: true
    disk: /

指定できるウィジェットの一覧はドキュメントで確認してください。

図3 widgets.yamlを実際に設定した状態

service.yamlの例

service.yamlはhomepageのメインとなるセクションで、グループ分けされた具体的なサービスを定義します。グループは任意に作成でき、グループ内に登録するサービスの数も任意です。サービスは以下のように記述します。

サービスの書き方
- グループ名:
    - サービス名:
        icon: アイコンファイル
        href: サービスのURL
        description: サービスの解説

以下は筆者宅のservice.yamlの例です。先ほどsettings.yamlで定義した通り、⁠Infrastructure」⁠Network」⁠Storage」⁠Security」の4つのグループを定義し、その中に各サービスへのリンクを設定しています。具体的には、InfrastructureにはProxmox、Uptime KumaNginx Proxy ManagerBeszel。NetworkにはルーターとPangolin。StorageにはNextcloud。SecurityにはVaultwardenを登録しました。筆者が自宅で運用している主要なアプリですね。

service.yamlの例
- Infrastructure:
    - Proxmox:
        icon: proxmox.svg
        href: https://pve.example.com:8006
        description: Virtualization cluster

    - Uptime Kuma:
        icon: uptime-kuma.svg
        href: https://kuma.example.com
        description: Service monitoring

    - Nginx Proxy Manager:
        icon: nginx-proxy-manager.svg
        href: http://docker.example.com:81
        description: Reverse proxy admin

    - Beszel:
        icon: beszel.svg
        href: https://beszel.example.com
        description: Lightweight server monitoring

- Network:
    - Router:
        icon: router.svg
        href: http://192.168.1.1
        description: Home router

    - Pangolin:
        icon: pangolin.svg
        href: https://pangolin.example.com
        description: Private access gateway

- Storage:
    - Nextcloud:
        icon: nextcloud.svg
        href: https://next.example.com
        description: Private cloud

- Security:
    - Vaultwarden:
        icon: vaultwarden.svg
        href: https://vault.example.com
        description: Password manager
図4 サービスを登録した状態。settings.yamlで設定したレイアウト通りに、各サービスへのリンクが登録された

サービスウィジェットを使う

homepageでは、各サービスに対してサービスウィジェットを追加できます。サービスウィジェットを使うと、そのサービスと連携し、追加の情報を表示できるようになります。サービスと連携できるウィジェットの一覧は、こちらにまとまっています。ここではProxmoxサービスウィジェットを追加して、起動中のVMとコンテナ数、使用中のCPU、メモリ量を表示させてみましょう。

あらかじめProxmox側で、APIを叩くためのユーザーを作成し、トークンを発行しておいてください。権限はPVEAuditorでよいでしょう。

図5 Proxmox側でAPIコール用のユーザーを作成し、トークンを発行しておく

service.yamlに以下のような記述を追加します。

サービスウィジェットの例
- Infrastructure:
    - Proxmox:
        (略)
        widget:
          type: proxmox
          url: https://pve.example.com:8006
          username: ユーザー名@レルム!トークン名
          password: "{{HOMEPAGE_VAR_PROXMOX_TOKEN}}"

widgetのtypeは「proxmox⁠⁠、urlはProxmoxのURL、usernameには「ユーザー名@レルム!作成したトークン名⁠⁠、passwordには実際のトークンを指定してください。なおトークンはservice.yaml内にベタ書きせず、compose.yamlから環境変数経由で渡すほうがよいでしょう。

compose.yamlの環境変数でトークンを設定する例
services:
  homepage:
    (略)
    environment:
      HOMEPAGE_ALLOWED_HOSTS: home.example.com
      HOMEPAGE_VAR_PROXMOX_TOKEN: "Proxmoxのトークン"

Uptime Kumaにもサービスウィジェットがあるため、こちらも設定してみました。ただしUptime Kumaには完全なAPIが存在しないため、ステータスページからデータを取得する方式です。こちらの具体的な設定方法は割愛しますので、ウィジェットのドキュメントを参照してください。これで監視中のサービスのUP/DOWN数と、稼働率を表示できます。

図6 サービスウィジェットを設定した例。ProxmoxとKumaの簡単な情報が追加で表示されるようになる

bookmark.yaml

bookmark.yamlは文字通り、ブックマークを設定するファイルです。グループやリストの仕組みはservice.yamlとほぼ同じですが、こちらはリンクを提供する以外の機能はなく、非常にシンプルです。ダッシュボードの末尾に「便利なリンク集」を追加するような用途で使用します。

以下は具体的なbookmark.yamlの例になります。

bookmark.yamlの例
- Cloud:
    - AWS Console:
        - icon: aws.svg
          href: https://console.aws.amazon.com/
    - Sakura VPS:
        - icon: mdi-server
          href: https://secure.sakura.ad.jp/vps/

- Development:
    - GitHub:
        - icon: github.svg
          href: https://github.com/
    - GitLab:
        - icon: gitlab.svg
          href: https://gitlab.com/

- Media:
    - YouTube:
        - icon: youtube.svg
          href: https://www.youtube.com/

- Documentation:
    - Proxmox Docs:
        - icon: proxmox.svg
          href: https://pve.proxmox.com/wiki/Main_Page
    - Docker Docs:
        - icon: docker.svg
          href: https://docs.docker.com/

「Cloud」⁠Development」⁠Media」⁠Documentation」の4つのグループを作り、筆者がよく使うサイトを登録してみました。各リンクにはサービスのアイコンを設定できます。これらはデフォルトでDashboard Iconsを参照するのですが、さくらのVPSのアイコンが存在しないため、ここではMaterial Designアイコンを指定しています[2]

図7 ブックマークの例

Proxmoxとの連携

homepageはProxmoxと連携し、個々のサービスのCPU使用率やメモリ使用量を取得できます。まずproxmox.yamlでProxmoxのノードを設定します。

proxmox.yamlの例
pve:
  url: https://pve.example.com:8006
  token: ユーザー名@レルム!トークン名
  secret: "{{HOMEPAGE_VAR_PROXMOX_TOKEN}}"

設定する項目は、Proxmoxのサービスウィジェットと同様です。⁠url」にはProxmoxのURL、⁠token」には「ユーザー名@レルム!トークン名⁠⁠、⁠secret」には実際のトークンを設定します。ここもトークンはベタ書きせず、環境変数経由で設定するとよいでしょう。

続いてservice.yamlに登録されているサービスで、Proxmox上で動作しているVMないしLXCコンテナに対し、Proxmoxの設定オプションを追加します。筆者の環境では、NextcloudがProxmoxのVM上で動作しているため、以下の設定を追加しました。

Proxmox上で動作しているサービスに対し、設定オプションを追加する
- Storage:
    - Nextcloud:
        icon: nextcloud.svg
        href: https://next.example.com
        description: Private cloud
        proxmoxNode: pve
        proxmoxVMID: 105
        proxmoxType: qemu

「proxmoxNode」は、Proxmoxのノード名です。これはproxmox.yamlで設定したものと揃える必要があります(ここではpve⁠⁠。⁠proxmoxVMID」は、対象のVMIDです。⁠proxmoxType」は、対象がVMの場合は「qemu⁠⁠、コンテナの場合は「lxc」を指定してください。これでVMの稼動状況と、消費リソースが表示されるようになりました。

図8 右上に「起動中」の表示が追加され、ここをクリックすると消費リソースが表示される

Dockerとの連携

Proxmoxと同様に、Dockerとも連携し、各コンテナの情報を追加で表示することも可能です。今回はhomepage本体をDockerで動かしているため、ホストのDockerと連携してみましょう。まずcompose.yamlに以下の記述を追加し、Dockerのソケットをコンテナ内にマウントします[3]

コンテナ内のソケットをマウントする
services:
  homepage:
    (略)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

続いてdocker.yamlにソケットの設定を追記します。

docker.yamlの例
docker:
  socket: /var/run/docker.sock

最後にservice.yamlに登録されているサービスのうち、登録したDockerホスト上のコンテナとして動作しているものに対し、Dockerの設定オプションを追加します。

コンテナに対し、設定オプションを追加する
services:
    - Beszel:
        icon: beszel.svg
        href: https://beszel.mizuno-as.net
        description: Lightweight server monitoring
        server: docker
        container: beszel-server

「server」はDockerホスト名です。docker.yamlの設定名と揃えてください。⁠container」はコンテナ名です。コンテナ名を指定する必要があるため、各コンテナはComposeで管理することを推奨します。

図9 コンテナも右上に「起動中」の表示が追加され、ここをクリックすると消費リソースが表示される

図10 完成したサービスダッシュボード

これでサービスダッシュボードが完成しました。とりあえずこのページをホームに登録しておけば、家庭内で迷子にならなくて済みそうです。

ぜひ情報ウィジェットにロゴを表示する、背景に画像を表示する、ウィジェットをカスタマイズしてみる、便利なブックマークを充実させるなど、より便利なカスタマイズを施して、時間を無限に溶かしてみてください。

おすすめ記事

記事・ニュース一覧