Homepage¶
概述¶
Homepage 係一套開源、自承辦嘅導航儀表板,用嚟將分散喺內網嘅服務集中喺一個網頁入口。本實例部署喺 Oracle Cloud Infrastructure (OCI) 香港區 always-free VM,採用 Docker Compose 管理,一律匯聚咗 68 個運行中容器嘅狀態,包括可用性、CPU/記憶體使用率同個別服務嘅快捷連結。使用者只要開啟 https://homepage.benhoweb.com,就唔使再記低每個服務嘅 IP、port 或路徑,達到真正單一入口嘅效果。
架構¶
Homepage 容器行喺 OCI 彈性 VM 上,歸入外部 bridge network cf_network,固定 IPv4 地址為 172.21.0.26。同一網絡亦連住 cloudflared(Cloudflare Tunnel),將公網 HTTPS 流量轉發到容器嘅 3000 port。呢個設計令 Homepage 唔需要對公網暴露任何 port,大幅減少攻擊面。
主要組件:
- homepage container:鏡像 ghcr.io/gethomepage/homepage:latest
- 配置目錄:/home/opc/homepage/config,掛載到 /app/config
- Docker Socket:唯讀掛載 /var/run/docker.sock,用嚟讀取容器狀態
- 時區:TZ=Asia/Hong_Kong,確保時間顯示正確
部署(Docker Compose 片段)¶
喺 /home/opc/homepage/ 建立 docker-compose.yml。因為 cf_network 係由多個服務共用嘅外部網絡,必須聲明為 external: true。
version: '3'
networks:
cf_network:
external: true
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
environment:
- TZ=Asia/Hong_Kong
- HOMEPAGE_ALLOWED_HOSTS=${HOMEPAGE_DOMAIN:-homepage.benhoweb.com}
volumes:
- /usr/share/zoneinfo:/usr/share/zoneinfo:ro
- /home/opc/homepage/config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "127.0.0.1:3000:3000" # 只反綁本機,公網走 Tunnel
restart: unless-stopped
networks:
cf_network:
ipv4_address: 172.21.0.26
啟動指令:
cd /home/opc/homepage
export HOMEPAGE_DOMAIN=homepage.benhoweb.com
docker compose up -d
docker compose ps
配置與環境變數¶
重要環境變數:
- TZ:必須設為 Asia/Hong_Kong,否則所有時間會以 UTC 顯示,造成排程同日誌誤判。
- HOMEPAGE_ALLOWED_HOSTS:控制 HTTP Host header 驗證。當你加入新網址,一定要補上呢個值,否則會出現 400 invalid hostname。
- HOMEPAGE_DOCKER_HOST:一般唔需要設定,Homepage 預設使用 /var/run/docker.sock;如果行 rootless Docker,就要改為 unix:///run/user/1000/docker.sock。
配置文件全部放喺 /home/opc/homepage/config,掛載到容器 /app/config。常用檔案:
- settings.yml:語言、主題、佈局。
- services.yaml:定義 68 個容器嘅群組、圖標、URL 同 Docker 名稱,例如 homepage。
- bookmarks.yaml:常用書籤。
- widgets.yaml:頂部 widget,例如 CPU/RAM、天氣、時間。
每次修改 YAML 後,可以用以下方式重新載入,或者直接 restart 容器:
docker exec homepage pkill -HUP node
維運與監控¶
日常檢查指令:
# 睇 logs
docker logs --tail=200 -f homepage
# 檢查容器狀態
docker ps | grep homepage
# 直接喺內網 curl,測試唔經 Tunnel 嘅連線
curl -H 'Host: homepage.benhoweb.com' http://172.21.0.26:3000
# 重啟服務
docker restart homepage
Homepage 本身極輕量,一般只用唔夠 50 MB RAM。如果發現頁面載入慢,多數係因為同時監察 68 個服務嘅狀態,可以喺 services.yaml 設定 siteMonitor: false,或者調低 refreshInterval 去減低網絡負載。
備份配置目錄係最重要嘅維運動作:
mkdir -p /home/opc/backup
tar czf /home/opc/backup/homepage_config_$(date +%F).tgz /home/opc/homepage/config
常見問題¶
- 公網開啟後顯示 400 Bad Request:多數係
HOMEPAGE_ALLOWED_HOSTS冇包含正確域名,尤其用咗 Cloudflare Tunnel 之後 Host header 會變成真實網址,一定要將homepage.benhoweb.com加入白名單。 - 睇唔到容器狀態,只剩一頁空白/只有 Homepage 一個:檢查
/var/run/docker.sock是否正確掛載;如果係 rootless Docker,要用HOMEPAGE_DOCKER_HOST指去正確 socket 路徑。 - Cloudflare Tunnel 連唔到 Homepage:確認
cloudflared同 homepage 都喺cf_network,而且 tunnel 嘅 target 係172.21.0.26:3000,唔好用localhost,因為容器各自有獨立 network namespace。 - 改完
services.yaml之後無反應:先檢查 YAML 語法,再用docker compose exec homepage cat /app/config/services.yaml確認檔案有正確掛載入容器。