Homepage Dashboard

Homepage to mój główny dashboard homelab — szybki, konfigurowany przez pliki YAML, git-friendly. Używam go do linków statycznych i dynamicznych (auto-discovery z Docker labels). Wbudowane pakiety ikon bardzo ułatwiają konfigurację.
Kluczowe cechy
- YAML + git — konfiguracja to kilka plików tekstowych. Diff pokazuje zmiany, przeniesienie między maszynami to kopia katalogu.
- Auto-discovery — labele
homepage.*wdocker-compose.ymlwystarczą, żeby serwis pojawił się na dashboardzie automatycznie. - Widgety integracji — 100+ serwisów (Portainer, AdGuard, Traefik, Plex, Home Assistant…) z live metrykami z API.
- Multi-host — jeden dashboard agreguje kontenery z wielu Docker hostów.
- Lekki — obraz ~150 MB, zużycie RAM poniżej 100 MB, zero bazy danych.
Moja konfiguracja
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
restart: on-failure:1
environment:
HOMEPAGE_ALLOWED_HOSTS: "nas-1.lan:8091,mini-1.lan:8091"
ports: [8091:3000]
volumes:
- ./homepage:/app/config
- ./images:/app/public/images
settings.yaml — układ i wygląd (dokumentacja)
showStats: false
hideVersion: true
fiveColumns: true
disableCollapse: true
color: gray
backgroundOpacity: 0.5
cardBlur: md
headerStyle: boxed
background: https://i.ibb.co/hMWFX6D/mountain-clouds.gif
useEqualHeights: true
bookmarksStyle: icons
layout:
Admin:
style: row
columns: 7
NAS 1:
style: row
columns: 7
Server 1:
style: row
columns: 7
Mini 1:
style: row
columns: 7
OHV VPS 1:
style: row
columns: 7
External:
style: row
columns: 7
Tools:
style: row
columns: 7
services.yaml — serwisy ręczne (dokumentacja)
Plik services.yaml definiuje serwisy, które nie używają auto-discovery (np. usługi spoza Dockera lub z hostów bez docker-socket-proxy):
- Admin:
- NAS_1:
name: nas-1.lan
icon: synology-dsm.svg
href: "https://nas-1.lan:5001/"
weight: -10
target: _self
- Webmin:
name: mini-1.lan
icon: webmin.svg
href: "https://mini-1.lan:10000"
target: _self
- Webmin:
name: server-1.lan
icon: webmin.svg
href: "https://server-1.lan:10000"
target: _self
- External:
- search-console:
name: Search console
icon: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/google-search-console.svg"
href: "https://search.google.com/..."
target: _self
- ovhcloud:
name: OVH
icon: "ovh.svg"
href: "https://manager.eu.ovhcloud.com/..."
target: _self
bookmarks.yaml — zakładki (dokumentacja)
Bookmarki to osobna sekcja poniżej serwisów.
- Links:
- github:
- name: GitHub
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/svg/github-light.svg
href: https://github.com/
target: _self
- feedly:
- name: Feedly
icon: feedly.png
href: https://feedly.com/i/collection/...
target: _self
- Other:
- home_assistant:
- name: Home Assistant
icon: home-assistant.svg
href: http://ha.lan:8123
target: _self
- UniFi:
- icon: unifi.svg
href: https://192.168.30.1/network/default/dashboard
target: _self
custom.css — dopasowanie wyglądu (dokumentacja)
.text-xl {
font-size: 1rem !important;
line-height: 1.5rem !important;
}
.services-group {
padding: 0 .25rem !important;
}
#information-widgets {
display: none;
}
ul.services-list, ul.bookmark-list {
margin-top: 0 !important;
}
Konfiguracja przez Docker labele
Zamiast ręcznie duplikować wpisy w services.yaml, można dodać labele homepage.* bezpośrednio do docker-compose.yml serwisu — Homepage wykryje kontener automatycznie (dokumentacja):
services:
adguard:
image: adguard/adguardhome
container_name: adguard
ports: ["53:53/udp", "85:85/tcp"]
labels:
homepage.group: Tools
homepage.name: AdGuard
homepage.icon: adguard-home.svg
homepage.href: http://nas-1.lan:85/
homepage.weight: 100
homepage.target: _self
Połączenie z Docker hostami
Żeby Homepage mógł odczytywać labele kontenerów, potrzebuje dostępu do Docker API (dokumentacja). Konfiguracja w docker.yaml:
nas_1:
host: nas-1.lan
port: 2375
mini_1:
host: mini-1.lan
port: 2375
Każdy wpis to osobny Docker host. Nie wystawiaj portu 2375 bezpośrednio — zamiast tego użyj Docker Socket Proxy (Tecnativa). To lekki kontener HAProxy, który montuje socket wewnętrznie i wystawia przefiltrowane, read-only API:
services:
agent_docker_proxy:
image: ghcr.io/tecnativa/docker-socket-proxy:latest
container_name: agent_docker_proxy
restart: on-failure:1
ports: [2375:2375]
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
CONTAINERS: "1"
SERVICES: "0"
TASKS: "0"
POST: "0"
POST: 0 blokuje wszystkie żądania modyfikujące — przez proxy można wyłącznie odczytywać stan kontenerów. Schemat połączeń:
graph LR
H[Homepage<br/>nas-1.lan:8091] -->|TCP 2375| P1[docker-socket-proxy<br/>nas-1.lan]
H -->|TCP 2375| P2[docker-socket-proxy<br/>mini-1.lan]
H -->|TCP 2375| P3[docker-socket-proxy<br/>server-1.lan]
P1 -->|socket| D1[Docker Engine<br/>nas-1]
P2 -->|socket| D2[Docker Engine<br/>mini-1]
P3 -->|socket| D3[Docker Engine<br/>server-1]
Ikony (dokumentacja)
Homepage obsługuje kilka źródeł ikon, które można mieszać w jednej konfiguracji:
- Dashboard Icons (Homarr Labs) — wbudowana baza ponad 1800 ikon, dostępna bezpośrednio po nazwie pliku. Nie wymaga żadnej dodatkowej konfiguracji. Przykłady:
traefik.png,portainer.svg,synology-dsm.svg,plex.png,home-assistant.svg,adguard-home.svg,freshrss.png,jellyfin.svg,nextcloud.svg,vaultwarden.svg. Galeria: dashboardicons.com. - Material Design Icons — tysiące ikon ogólnego przeznaczenia przez prefix
mdi-. Przydatne gdy aplikacja nie ma dedykowanej ikony. Przykłady:mdi-server,mdi-nas,mdi-router-network,mdi-database,mdi-shield-lock. - Simple Icons — ikony brandów i popularnych projektów open-source przez prefix
si-. Przykłady:si-github,si-grafana,si-prometheus,si-ubuntu,si-cloudflare. - URL do zewnętrznego obrazka — gdy ikony nie ma nigdzie indziej. Działa z dowolnym publicznym URL, np.
https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/google-search-console.svg. - Własny plik — obrazki zamontowane jako
./images:/app/public/imagesdostępne po nazwie pliku:my-app.png. Po dodaniu nowego pliku wymagany restart kontenera — Homepage nie wykrywa zmian w tym katalogu automatycznie.
W większości przypadków wystarczy wpisać nazwę pliku SVG lub PNG — Homepage znajdzie ikonę automatycznie.