В экосистеме self-hosted сервисов персональные стартовые страницы и дашборды стали неотъемлемой частью рабочего пространства разработчиков и системных администраторов. Они служат единой точкой входа для управления инфраструктурой: отображают статус контейнеров, быстрые закладки на веб-интерфейсы, котировки, погоду, свежие посты с профильных сабреддитов и RSS-ленты технических блогов.
Однако большинство популярных решений (таких как Dashy или Heimdall) страдают от избыточной тяжеловесности. Построенные на базе массивных JavaScript-фреймворков и среды выполнения Node.js, они нередко потребляют от 250 до 600 МБ оперативной памяти, требуют компиляции фронтенда и создают ощутимую задержку при открытии страницы на мобильных устройствах или слабых VDS. Появившийся как легкая альтернатива Glance кардинально меняет правила игры: написанный на скомпилированном языке Go (Golang), он потребляет в базовом режиме всего 15–25 МБ RAM (и не более 35–40 МБ при интенсивном параллельном опросе десятков лент) и отрисовывает чистый легковесный интерфейс мгновенно.
1. Преимущества Glance перед Homepage и Dashy: 15 МБ RAM на Go против тяжелого стека Node.js
Главное архитектурное отличие Glance от таких панелей, как Homepage, Dashy или Flame — отказ от прожорливого клиентского рендеринга на тяжелых JS-библиотеках в пользу компактного серверного шаблонизатора на Go. Весь сервис поставляется в виде одного оптимизированного Docker-образа размером менее 30 МБ, запускается за доли секунды и не требует внешних реляционных СУБД (PostgreSQL, MySQL) или кэшей Redis.
Вся конфигурация страниц, колонок, виджетов и учетных записей описывается в единственном декларативном файле glance.yml. При этом движок Glance непрерывно отслеживает состояние файла на диске (через системные события inotify) и мгновенно применяет изменения в браузере без необходимости перезапускать контейнер или сбрасывать пользовательские сессии.
| Критерий сравнения | Glance (Go) | Homepage (Next.js) | Dashy (Vue.js) | Flame (Node.js) |
|---|---|---|---|---|
| Язык и runtime | Go (Golang) |
Node.js / React |
Node.js / Vue.js |
Node.js / React |
| Потребление памяти (RAM) |
15–25 МБ (базовое)до 35–40 МБ при активном RSS |
80–180 МБ |
180–350 МБ |
60–120 МБ |
| Формат конфигурации | Один файл glance.yml |
Множество файлов YAML | Большой conf.yml |
SQLite + веб-UI |
| Горячая перезагрузка (Hot-reload) | Мгновенно (inotify) | Частично | Требует ребилд | В реальном времени |
| Встроенная авторизация | Да (bcrypt / сессии) | Нет (через прокси) | Да (Keycloak / basic) | Да (пароль) |
💡 Совет инженера
Если на вашем сервере уже крутится связка сервисов (Vaultwarden, Seafile, база данных PostgreSQL и бэкенды), выделять полгигабайта RAM под один лишь визуальный дашборд крайне нерационально. Glance потребляет меньше оперативной памяти, чем стандартный фоновый воркер Nginx, поэтому идеально подходит для компактных тарифов VDS с 1–2 ГБ памяти.
2. Подготовка сервера и развертывание Glance в Docker Compose
Для надежной промышленной эксплуатации развернем Glance в изолированном каталоге /opt/glance с жесткой привязкой порта к локальной петле 127.0.0.1. Это ключевой элемент безопасности: если указать порт как 8080:8080 (без префикса IP), демон Docker по умолчанию создаст в обход брандмауэра UFW сквозные правила в цепочках iptables, открыв незащищенный веб-интерфейс Glance всему миру (подробнее об этом механизме читайте в разборе обхода UFW портами Docker).
Подключитесь к вашему VDS по SSH и создайте рабочую директорию со структурой подкаталога для конфигурации:
sudo mkdir -p /opt/glance/config
cd /opt/glance
Создайте файл описания сервиса docker-compose.yml:
services:
glance:
# Фиксируем актуальный стабильный релиз вместо плавающего тега :latest
image: glanceapp/glance:v0.8.6
container_name: glance
restart: unless-stopped
ports:
# Привязка строго к локальной петле 127.0.0.1 защищает порт от внешнего сканирования
- "127.0.0.1:8080:8080"
volumes:
- ./config:/app/config
# Монтирование системного часового пояса для точного времени в виджетах
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
environment:
- TZ=Europe/Moscow
# Ограничения ресурсов Compose Specification (cgroups)
mem_limit: 128m
cpus: 0.50
Пояснение по версии и лимитам ресурсов: В production-среде крайне важно фиксировать конкретную версию образа (в нашем примере — проверенный стабильный релиз glanceapp/glance:v0.8.6). Использование тега :latest несет риски, так как авторы проекта активно развивают движок, и неожиданное автоматическое обновление может нарушить синтаксис виджетов в вашем glance.yml.
Что касается ограничений ресурсов: в современной спецификации Compose Specification (Docker Compose v2+) поддерживаются как лаконичные директивы mem_limit: 128m и cpus: 0.50 на верхнем уровне описания сервиса, так и блок deploy.resources.limits (который начиная с Compose v2 применяется и в стандартном автономном режиме, а не только в Swarm). Мы используем прямой синтаксис mem_limit и cpus как наиболее компактный: демон Docker напрямую передает эти параметры ядру Linux в подсистему cgroups, жестко гарантируя, что даже при обработке огромных списков RSS контейнер не создаст риска OOM-сбоя для других служб сервера. Подробнее об этом читайте в руководстве по лимитам памяти и CPU в Docker Compose.
Загрузите эталонный стартовый шаблон конфигурации в каталог config/:
curl -sSL -o config/glance.yml https://raw.githubusercontent.com/glanceapp/glance/refs/heads/main/docs/glance.yml
Запустите контейнер в фоновом режиме через утилиту Docker Compose:
docker compose up -d
Проверка сетевой изоляции и брандмауэра:
Убедитесь, что порт 8080 слушает исключительно локальный интерфейс 127.0.0.1, а не публичный 0.0.0.0:
# Проверка сокетов ядра Linux:
sudo ss -tulpn | grep 8080
# Вывод должен содержать строго 127.0.0.1:8080, например:
# tcp LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=...))
Дополнительно проверьте активность брандмауэра UFW командой sudo ufw status verbose. На публичных сетевых интерфейсах должны быть открыты только порты 22 (SSH), 80 (HTTP) и 443 (HTTPS). Верифицировать недоступность порта 8080 из внешнего интернета можно прямо сейчас через сетевую утилиту SysKit Сканер сетевых портов онлайн.
3. Настройка встроенной аутентификации и защита дашборда паролем
Персональный дашборд аккумулирует конфиденциальные данные о вашей серверной инфраструктуре: доменные имена локальных сервисов, структуру портов, приватные закладки, состояние бэкапов и финансовые котировки. Оставлять веб-интерфейс открытым для любого пользователя сети категорически запрещено — боты-сканеры моментально обнаружат панель и попытаются использовать ее для разведки целевых уязвимостей.
Разработчики Glance предусмотрели встроенный модуль сессионной аутентификации, который не требует внешних баз данных или тяжелых SSO-серверов. Авторизация настраивается в три простых шага через CLI-утилиты, упакованные прямо в Docker-образ приложения.
Шаг 1. Генерация секретного ключа сессий:
Секретный ключ (secret key) используется Glance для криптографической подписи сессионных cookie в браузере. Если ваш контейнер Glance уже запущен, быстрее всего сгенерировать ключ прямо внутри работающего сервиса одной командой:
# Способ 1: внутри уже работающего контейнера Glance (рекомендуется)
docker compose exec glance glance secret:make
# Способ 2: через отдельный временный контейнер
docker run --rm glanceapp/glance:v0.8.6 secret:make
Команда выведет строку случайных байт вида: 7c3a9f8b1e4d2a6c8e5f0b3a1d9e7c5a8b2f4d6e1a9c3b7e5f0a2d8b4e6c1a9f. Сохраните ее.
Шаг 2. Генерация стойкого bcrypt-хэша пароля:
Glance не хранит пароли в открытом виде, а сверяет их по стойкому криптографическому хэшу bcrypt. Сгенерируйте надежный пароль длиной от 16 символов (для создания стойкой комбинации воспользуйтесь сервисом Генератор надежных паролей) и передайте его во встроенный хэшер:
# Генерация bcrypt-хэша внутри контейнера:
docker compose exec glance glance password:hash 'ВашСложныйПароль2026!'
# Либо через docker run:
docker run --rm glanceapp/glance:v0.8.6 password:hash 'ВашСложныйПароль2026!'
В терминале появится вычисленный bcrypt-хэш, начинающийся с символов $2a$10$... или $2a$14$....
Шаг 3. Внедрение блока auth в glance.yml:
Откройте файл /opt/glance/config/glance.yml в текстовом редакторе и добавьте в самый верх файла секцию auth:
auth:
secret-key: "ВСТАВЬТЕ_СЮДА_СГЕНЕРИРОВАННЫЙ_SECRET_KEY"
users:
admin:
password-hash: "ВСТАВЬТЕ_СЮДА_ХЭШ_ПАРОЛЯ_BCRYPT"
💡 Рекомендация по безопасности при первичной настройке
Движок Glance отслеживает файл glance.yml через inotify в режиме реального времени. Тем не менее, при первоначальном создании и вставке секретного ключа рекомендуется выполнить профилактический перезапуск docker compose restart glance. Это инженерная лучшая практика (best practice), позволяющая гарантированно сбросить ранее открытые сессии и убедиться в валидности синтаксиса блока авторизации.
Все последующие действия (добавление дополнительных учетных записей в список users, смена паролей, добавление виджетов и закладок) подхватываются на лету автоматически без перезагрузки контейнера.
После сохранения файла при первом открытии веб-страницы Glance перенаправит вас на минималистичную форму авторизации с полями логина и пароля. Успешный вход сохраняет защищенную сессию в браузере.
4. Тонкая настройка glance.yml: закладки, RSS-ленты, сабреддиты, погода и релизы GitHub
Конфигурация интерфейса Glance строится на древовидной иерархии: страницы (pages) разбиваются на колонки (columns), внутри которых располагаются виджеты (widgets). Для колонок доступны размеры small (узкая колонка, идеальная для часов, погоды, виджетов статуса) и full (адаптивная широкая область под новости, графики и карточки).
Ниже представлен проверенный в production готовый шаблон glance.yml, объединяющий мониторинг инфраструктуры, закладки со встроенными иконками Simple Icons, ленты новостей и виджеты отслеживания релизов:
auth:
secret-key: "СГЕНЕРИРОВАННЫЙ_КЛЮЧ"
users:
admin:
password-hash: "СГЕНЕРИРОВАННЫЙ_ХЭШ"
# Настройки оформления и поведения
theme:
# Поддержка светлой и темной темы с автоопределением по системным настройкам
contrast: normal
pages:
- name: Дашборд
columns:
# Левая узкая колонка: системные утилиты, погода, закладки
- size: small
widgets:
- type: calendar
first-day-of-week: monday
- type: weather
location: Moscow, Russia
units: metric
hour-format: 24h
- type: bookmarks
groups:
- title: Инфраструктура
color: 215 70 50
links:
- title: Portainer / Dockge
url: https://dockge.example.com
icon: si:docker
- title: Мониторинг Beszel
url: https://beszel.example.com
icon: si:grafana
- title: Менеджер паролей
url: https://pass.example.com
icon: si:bitwarden
- title: Разработка и облако
color: 145 60 45
links:
- title: Личный Git-сервер
url: https://git.example.com
icon: si:gitea
- title: Облако Seafile
url: https://files.example.com
icon: si:nextcloud
- title: Репозиторий GitHub
url: https://github.com
icon: si:github
- type: markets
markets:
- symbol: BTC-USD
name: Bitcoin
- symbol: ETH-USD
name: Ethereum
# Правая широкая колонка: агрегаторы контента и технические новости
- size: full
widgets:
- type: group
widgets:
- type: hacker-news
limit: 8
- type: reddit
subreddit: selfhosted
limit: 8
show-thumbnails: true
- type: rss
limit: 12
collapse-after: 4
cache: 1h
feeds:
- url: https://habr.com/ru/rss/hubs/devops/all/
title: Хабр DevOps
limit: 4
- url: https://www.opennet.ru/opennews/opennews_mini_security.rss
title: OpenNET Безопасность
limit: 4
- url: https://selfh.st/rss/
title: Selfh.st Digest
limit: 4
- type: releases
cache: 6h
# Необязательный токен GitHub для обхода ограничений API (60 req/h):
# token: ghp_yourPersonalAccessTokenHere
repositories:
- glanceapp/glance
- immich-app/immich
- louislam/uptime-kuma
Рассмотрим ключевые параметры настройки виджетов:
- Иконки закладок (Simple Icons): Glance «из коробки» содержит каталог тысяч векторных иконок. Достаточно указать префикс
si:и название сервиса (например,si:docker,si:github,si:cloudflare,si:telegram), чтобы карточка ссылки получила аутентичный логотип. - Кэширование RSS и релизов (
cache: 1h / 6h): Задает периодичность опроса внешних серверов. Это снижает нагрузку на сеть хоста и исключает блокировку по Rate Limit со стороны внешних источников. - Сворачивание списков (
collapse-after: 4): При получении большого количества новостей виджет покажет первые 4 заголовка и аккуратную кнопку «Показать еще», сохраняя опрятный вид страницы.
5. Мониторинг доступности серверов и контейнеров через виджет Monitor
Одной из мощнейших функций Glance является встроенный виджет monitor. Он позволяет отказаться от отдельных тяжелых статус-страниц для персонального использования и выводит состояние работоспособности ваших ключевых сервисов прямо в шапку или боковую панель дашборда.
Виджет периодически опрашивает указанные веб-адреса с помощью легковесных HTTP-запросов и отображает аккуратный индикатор доступности: зеленый маркер при ответе 200 OK или красный бейдж со статусом ошибки (например, 502 Bad Gateway или таймаут соединения).
- type: monitor
title: Мониторинг серверов и сервисов
cache: 1m
sites:
- title: Корпоративный портал
url: https://syskit.ru
icon: si:nginx
- title: Менеджер паролей
url: https://pass.example.com
icon: si:bitwarden
- title: Облачное хранилище
url: https://files.example.com
icon: si:nextcloud
- title: Домашний AdGuard DNS
url: http://127.0.0.1:3000
icon: si:adguard
Параметр cache: 1m задает интервал опроса в одну минуту. Glance выполняет сетевые запросы в параллельных неблокирующих горутинах (goroutines), поэтому задержка ответа одного из внешних сайтов не замедляет отрисовку остальных блоков дашборда.
Если вам требуется не просто моментальный срез доступности, а накопление долгосрочной истории сбоев, графики нагрузки на процессор и алерты в Telegram, дополните Glance связкой специализированных инструментов: легковесным агентом метрик Beszel и Telegram-ботом SysKit Uptime & SSL Monitor.
6. Публикация в интернет: Nginx Reverse Proxy и автоматический SSL-сертификат
Поскольку контейнер Glance жестко привязан к локальному порту 127.0.0.1:8080, для доступа к нему из внешнего интернета по безопасному протоколу HTTPS настроим классический обратный прокси-сервер на базе Nginx с полным комплектом защитных заголовков.
Установите веб-сервер Nginx и утилиту Certbot на операционную систему вашего сервера Ubuntu или Debian:
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
Создайте конфигурационный файл виртуального хоста /etc/nginx/sites-available/glance.conf (заменив dash.example.com на ваш фактический поддомен):
server {
listen 80;
listen [::]:80;
server_name dash.example.com;
# Ограничение размера тела запроса (дашборд не принимает файлы)
client_max_body_size 1m;
# Защитные заголовки промышленного стандарта
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# HSTS: принудительный переход на HTTPS на 1 год с поддоменами
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
location / {
# Запрет неиспользуемых HTTP-методов (DELETE, PUT, TRACE)
limit_except GET POST HEAD {
deny all;
}
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
# Проброс заголовков клиента и поддержка WebSocket (для Hot-Reload)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Отключение буферизации для мгновенного стриминга событий
proxy_buffering off;
proxy_read_timeout 90s;
}
}
Активируйте созданный виртуальный хост, создав символическую ссылку в каталоге sites-enabled, и проверьте корректность синтаксиса директив:
sudo ln -s /etc/nginx/sites-available/glance.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Выпустите бесплатный криптографический сертификат Let's Encrypt с автоматической настройкой перенаправления с HTTP на HTTPS:
sudo certbot --nginx -d dash.example.com --redirect --agree-tos --no-eff-email -m admin@example.com
Флаг --redirect гарантирует автоматическую генерацию безопасного 301-редиректа на защищенный порт 443. После успешного выпуска сертификата проверьте корректность TLS-цепочки и дату окончания действия с помощью инструмента Проверка SSL / TLS сертификата онлайн. Для генерации альтернативных конфигураций веб-серверов воспользуйтесь генератором Nginx Reverse Proxy или Caddy Reverse Proxy.
7. Автоматическое обновление через Watchtower и резервное копирование glance.yml
Архитектурная красота Glance заключается в полном отсутствии изменяемого состояния (stateless-дизайн). В отличие от сложных систем с базами данных, где при обновлении требуется контролировать миграции схем, для 100% сохранения всех данных Glance достаточно иметь копию единственного файла glance.yml.
Для создания регулярных бэкапов конфигурации настройте простое задание в системном планировщике crontab:
# Ежедневный бэкап конфигурации в архивы tar.gz с сохранением за 14 дней
0 3 * * * tar -czf /opt/backups/glance-$(date +%F).tar.gz -C /opt/glance/config glance.yml && find /opt/backups/ -name "glance-*.tar.gz" -mtime +14 -delete
Полноценный стек с автообновлением Watchtower:
Если вы хотите настроить автоматическое применение патчей в рамках вашей ветки релизов, разверните утилиту Watchtower прямо внутри того же манифеста docker-compose.yml. Использование флага WATCHTOWER_LABEL_ENABLE=true гарантирует, что Watchtower будет обновлять строго те контейнеры, где явно указана метка com.centurylinklabs.watchtower.enable=true, не трогая другие сервисы хоста:
services:
glance:
# Зафиксированная стабильная версия
image: glanceapp/glance:v0.8.6
container_name: glance
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
volumes:
- ./config:/app/config
labels:
- "com.centurylinklabs.watchtower.enable=true"
mem_limit: 128m
cpus: 0.50
watchtower:
# Зафиксированная проверенная стабильная версия Watchtower
image: containrrr/watchtower:1.7.1
container_name: glance-watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
# Удалять старые неиспользуемые слои образов
- WATCHTOWER_CLEANUP=true
# Обновлять только контейнеры с разрешающей меткой
- WATCHTOWER_LABEL_ENABLE=true
# Интервал проверки обновлений (раз в 24 часа = 86400 сек)
- WATCHTOWER_POLL_INTERVAL=86400
- TZ=Europe/Moscow
mem_limit: 64m
cpus: 0.25
💡 Совет по безопасным обновлениям версий в Production
В примере зафиксированы проверенные стабильные релизы обоих сервисов: glanceapp/glance:v0.8.6 и containrrr/watchtower:1.7.1. Единый стандарт явного указания тегов исключает случайное применение несовместимых мажорных изменений, сохраняя полную надежность вашей серверной среды.
Чтобы планово перейти на следующий стабильный релиз Glance (например, v0.8.7), достаточно обновить тег в docker-compose.yml и применить изменение командой docker compose pull && docker compose up -d. А отслеживать появление новых версий можно прямо на дашборде через встроенный виджет releases!
Glance доказывает, что современный персональный дашборд может быть одновременно функциональным, визуально привлекательным и потрясающе быстрым, не расходуя ценные вычислительные ресурсы сервера. Развернув его однажды, вы получаете надежный командный центр для всех ваших домашних и серверных проектов.
🎯 Разверните персональный дашборд Glance на быстром NVMe VDS
Для мгновенного рендеринга виджетов и постоянного мониторинга серверов 24/7 выбирайте надежный облачный сервер с низким пингом и защитой от сетевых атак.
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Быстрые NVMe VDS для self-hosted дашборда
Низкий пинг до российских провайдеров, моментальный запуск контейнеров Glance и бесплатный круглосуточный DNS для вашего поддомена.
Selectel — Надежные VDS в Tier III дата-центрах
Стабильная сетевая связность, выделенный белый IPv4 и безупречный аптайм для постоянного мониторинга инфраструктуры 24/7.
Beget — Доступные облачные серверы для домашних утилит
Почасовая тарификация, удобная панель управления и моментальный деплой стека Docker Compose для персональных сервисов.