Коли вдома крутиться з десяток сервісів - Proxmox, пара баз, медіасервер, моніторинг - рано чи пізно ти ловиш себе на тому, що тримаєш їхні адреси в закладках, а паролі від портів - у голові. Homepage (він же gethomepage) розвʼязує це просто: одна стартова сторінка, де всі твої сервіси зібрані в акуратні групи, з іконками, а де треба - і зі статусом прямо з Docker. Ніякої бази даних, ніякого важкого бекенду - усе налаштовується кількома YAML-файлами, а піднімається за хвилину в контейнері.
Що потрібно зробити?#
Підняти Homepage у Docker, задати йому кілька груп сервісів, додати закладки й верхні інфо-віджети (погода, ресурси, годинник, пошук), підключити docker-сокет - щоб картки показували стан контейнерів. І одразу глянути, як це виглядає в браузері. Усю консоль, як завжди, записав у терміналі.
З чим працюю?#
Свіжий Debian/Ubuntu з уже встановленим Docker (якщо його ще нема - це на одну команду). Беру офіційний образ ghcr.io/gethomepage/homepage, фіксую версію v2.4.0 (щоб поведінка й вигляд збігались із цим текстом), контейнер слухає порт 3000.
Піднімаємо контейнер#
Homepage зручно тримати через compose. Створюємо каталог проєкту і кладемо compose.yml:
| |
Запускаємо:
На першому старті Homepage сам кладе в порожній config/ кілька файлів-скелетів (settings.yaml, services.yaml, widgets.yaml і решту) і одразу показує демо-дашборд. Далі ми їх просто замінимо своїми.
Головна пастка: HOMEPAGE_ALLOWED_HOSTS#
Ось на чому спотикаються всі, хто ставить Homepage уперше. Починаючи з версії 1.0, якщо заходити не через localhost, Homepage вимагає змінну HOMEPAGE_ALLOWED_HOSTS зі списком дозволених хостів. Нема її (або значення не те) - замість дашборда отримаєш помилку валідації хоста.
- Формат - список через кому без пробілів, кожен запис може містити порт:
homepage.example.com,192.168.1.50:3000. localhost:3000і127.0.0.1:3000дозволені завжди, їх додавати не треба.- Якщо бачиш помилку - подивись у лог контейнера (
docker compose logs homepage): там надруковано хост рівно так, як його бачить Homepage. Саме це значення й додаєш у список.
Коротко: впиши сюди той IP:порт (або домен), за яким реально відкриватимеш дашборд, - і проблеми не буде.
Налаштовуємо під себе#
Усі файли лежать у config/. Homepage підхоплює зміни на льоту - зберіг YAML, оновив сторінку в браузері, і готово (рестарт потрібен хіба що коли додаєш власні локальні іконки).
settings.yaml - загальний вигляд#
| |
services.yaml - власне сервіси#
Структура проста: група -> назва сервісу -> поля. Мінімально потрібен лише href:
| |
Іконки беруться автоматично: просто icon: sonarr.png (з dashboard-icons), або з префіксом - mdi-server-network (Material Design), si-docker (бренди Simple Icons). Можна й повний https://... на свою картинку.
Деякі віджети сервісів уміють тягнути статистику з самого додатка - але для цього потрібен API-ключ, а це вже секрет. У конфіг кладемо тільки плейсхолдер, реальний ключ у git не комітимо:
| |
widgets.yaml - верхній рядок#
Це той рядок зверху: привітання, годинник, погода, ресурси хоста, пошук. Погода через openmeteo - приємно тим, що не потребує ключа й реєстрації:
| |
docker.yaml - статус контейнерів без ключів#
Найприємніша частина. Монтуємо docker-сокет (ми вже зробили це в compose.yml) і описуємо інстанс:
| |
Тепер будь-який сервіс із server: my-docker + container: <імʼя> показує статус і статистику контейнера - без жодного API-ключа, дані беруться напряму з Docker.
bookmarks.yaml - закладки#
| |
А тепер - у браузер#
Зберегли файли, оновили сторінку - і ось що виходить:

Зверху - привітання, дата, погода (OpenMeteo, без ключа) і ресурси хоста. Нижче - наші групи. Найцікавіше - група Docker: картки тягнуть статус і статистику прямо з docker-сокета, тож видно і стан контейнера (RUNNING / HEALTHY), і його CPU, памʼять та трафік:

І все це - без жодного API-ключа, лише завдяки змонтованому сокету.
Куди далі#
Homepage тягне ще багато всього: власні іконки (том на /app/public/icons), десятки готових віджетів під конкретні застосунки, автодискавері контейнерів через Docker-мітки, інтеграцію з Kubernetes. Але головне ти вже вмієш: групи, сервіси, статус із Docker, інфо-віджети.
Дві речі наостанок. Перше - секрети: ключі у віджетах не комітимо в git і не світимо в скриншотах. Друге - фіксуй версію образу (:v2.4.0, а не :latest), щоб наступне оновлення не змінило вигляд і поведінку несподівано. А коли захочеш виставити дашборд назовні з нормальним HTTPS - це вже робота для reverse proxy, але то окрема історія.



