1. Что такое Glance и зачем он нужен
Glance — это персональный стартовый дашборд. Открываешь браузер, видишь одну страницу: слева закладки на все свои сервисы, посередине свежие новости или RSS-ленты, справа — погода и курсы валют. Снизу — статус всех сайтов: зелёный/красный в зависимости от доступности.
Идея простая: вместо того чтобы держать двадцать вкладок или помнить, на каком порту что крутится, всё — на одном экране.
📌 Закладки на все сервисы
Gitea, Nextcloud, Grafana, Jellyfin — все ссылки на одной странице, сгруппированные по категориям.
🌤 Погода
Текущая температура, почасовой и семидневный прогноз. Данные с open-meteo.com без ключей API.
📰 RSS-ленты и новости
Hacker News, Reddit, собственные RSS — последние посты прямо на дашборде.
🟢 Мониторинг сайтов
Виджет monitor проверяет доступность URLs и показывает зелёный/красный статус.
🐙 GitHub-релизы
Следите за новыми версиями любых репозиториев — обновления всех ваших self-hosted инструментов в одном месте.
📈 Курсы и котировки
Акции, криптовалюта, валюты — живые данные без внешних сервисов.
🐳 Статус Docker-контейнеров
Какой контейнер запущен, какой упал — прямо из дашборда.
⚡ Почти нет требований
Go-бинарник весит 20 МБ, потребляет 30–60 МБ RAM. Работает на любом VPS.
Glance vs Homepage vs Dashy
Все три — self-hosted дашборды, но у каждого своя специализация. Homepage и Dashy богаче виджетами и интеграциями, но тяжелее (Node.js). Glance написан на Go: запускается мгновенно, ест минимум памяти, страница открывается быстрее — хороший выбор для бюджетного VPS.
2. Требования к серверу
Glance один из самых лёгких self-hosted проектов. Ставить его можно на тот же VPS, где уже что-то работает — лишних ресурсов почти не возьмёт.
| Параметр | Минимум | Примечание |
|---|---|---|
| RAM | 30–60 МБ | Активно потребляет только при обращении к странице |
| CPU | 1 vCPU | Нагрузка только при загрузке виджетов |
| Диск | < 100 МБ | Docker-образ ~20 МБ, данные не хранятся локально |
| ОС | Ubuntu 20.04+, Debian 11+ | Любая ОС с Docker |
| Docker | v20+ | Нужен только Docker Engine |
Можно поставить на уже занятый VPS
Glance отлично живёт рядом с Nginx, Nextcloud, Gitea и другими сервисами. Отдельный сервер для него не нужен — это просто лёгкое веб-приложение.
3. Установка через Docker
Glance запускается одним контейнером. Конфиг хранится в файле glance.yml на хосте — его удобно редактировать и версионировать в Git.
Установить Docker
Если Docker ещё не установлен — один скрипт поставит всё необходимое:
curl -fsSL https://get.docker.com | shСоздать структуру папок
mkdir -p ~/glance/config
cd ~/glanceСоздать docker-compose.yml
services:
glance:
image: glanceapp/glance
container_name: glance
restart: unless-stopped
volumes:
- ./config:/app/config
ports:
- "127.0.0.1:8080:8080"Почему 127.0.0.1:8080, а не просто 8080?
Привязка к 127.0.0.1 означает, что порт 8080 не будет виден снаружи VPS — доступ только через Nginx, который настроим дальше. Если написать просто 8080:8080, Glance окажется открыт по IP:8080 без пароля и HTTPS.
Создать минимальный конфиг
Без конфига контейнер не запустится. Создайте пустой рабочий файл:
server:
port: 8080
pages:
- name: Главная
columns:
- size: full
widgets:
- type: clock
hour-format: 24hЗапустить контейнер
docker compose up -dПроверьте, что контейнер запустился:
docker compose ps
# Должно быть: glance Up 127.0.0.1:8080->8080/tcp
docker compose logs glance
# Должно быть: "Glance is listening on :8080"Временно можно открыть напрямую, пока не настроен Nginx:
ufw allow 8080/tcp
# Открыть в браузере: http://IP_СЕРВЕРА:80804. Первый конфиг: три колонки за 10 минут
Весь дашборд описан в glance.yml. После каждого изменения файла нужно перезапустить контейнер: docker compose restart glance.
Структура страницы
Каждая страница делится на колонки. Бывает два типа:
| Тип | Ширина | Когда использовать |
|---|---|---|
| size: small | ~300 пикселей | Боковые: погода, часы, закладки |
| size: full | Оставшееся место | Центр: новости, RSS, Hacker News |
Важное правило: обязательно нужна хотя бы одна колонка full
Допустимые комбинации: small + full, full + small, small + full + small. Две колонки small без full — конфиг не загрузится, будет ошибка.
Практический пример: дашборд с тремя колонками
server:
port: 8080
proxied: true # включите, если за Nginx
pages:
- name: Главная
columns:
# Левая колонка: часы + закладки на сервисы
- size: small
widgets:
- type: clock
hour-format: 24h
- type: bookmarks
groups:
- title: Мои сервисы
links:
- title: Gitea
url: https://git.ваш-домен.ru
icon: si:gitea
- title: Nextcloud
url: https://cloud.ваш-домен.ru
icon: si:nextcloud
- title: Grafana
url: https://grafana.ваш-домен.ru
icon: si:grafana
- title: Uptime Kuma
url: https://status.ваш-домен.ru
icon: si:uptimekuma
- title: Полезные ресурсы
links:
- title: GitHub
url: https://github.com
icon: si:github
- title: Docker Hub
url: https://hub.docker.com
icon: si:docker
# Центральная колонка: новости
- size: full
widgets:
- type: hacker-news
limit: 15
collapse-after: 5
- type: reddit
subreddit: selfhosted
style: vertical-list
limit: 10
collapse-after: 5
sort-by: hot
# Правая колонка: погода + мониторинг
- size: small
widgets:
- type: weather
location: Moscow, Russia
units: metric
hour-format: 24h
- type: monitor
title: Мои сайты
sites:
- title: Основной сайт
url: https://ваш-домен.ru
- title: Gitea
url: https://git.ваш-домен.ru
- title: Nextcloud
url: https://cloud.ваш-домен.ruПосле сохранения файла — перезапустите контейнер, чтобы конфиг применился:
docker compose restart glanceЕсли конфиг не применился — смотрите логи
Ошибки синтаксиса YAML видны сразу: docker compose logs glance. Чаще всего проблема — лишние пробелы или tab вместо пробелов (YAML требует только пробелы).
5. Полезные виджеты с примерами
У Glance больше 20 типов виджетов. Вот самые полезные с рабочими конфигами.
RSS-ленты
Читайте нужные блоги и новости прямо на дашборде, без алгоритмов и рекламы. Стиль vertical-list — компактный список заголовков.
- type: rss
title: Новости
style: vertical-list
limit: 20
collapse-after: 5
feeds:
- url: https://habr.com/ru/rss/hubs/all/
title: Хабр
- url: https://nplus1.ru/rss
title: N+1
- url: https://tproger.ru/feed/
title: TprogerРелизы GitHub
Следите за обновлениями всего, что установлено на VPS. Вышел новый Gitea — сразу видно. Без GitHub-токена API ограничен 60 запросами в час — на небольшой список репозиториев хватает.
- type: releases
title: Обновления
show-source-icon: true
collapse-after: 5
repositories:
- go-gitea/gitea
- nextcloud/server
- glanceapp/glance
- louislam/uptime-kuma
- immich-app/immich
- jellyfin/jellyfinМониторинг сайтов
Виджет проверяет доступность URL каждые несколько минут. Зелёный — работает, красный — нет. Не замена Uptime Kuma (нет уведомлений и истории), но удобен для быстрой проверки.
- type: monitor
title: Статус сервисов
cache: 2m
sites:
- title: Основной сайт
url: https://ваш-домен.ru
icon: si:googlechrome
- title: Gitea
url: https://git.ваш-домен.ru
icon: si:gitea
- title: Nextcloud
url: https://cloud.ваш-домен.ru
icon: si:nextcloud
- title: Grafana
url: https://grafana.ваш-домен.ru
icon: si:grafanaКурсы валют и акции
Данные через Yahoo Finance API — ключи не нужны. Работает для акций (SPY, NVDA), крипты (BTC-USD, ETH-USD) и валютных пар (RUB=X, USDRUB=X).
- type: markets
title: Рынки
markets:
- symbol: BTC-USD
name: Bitcoin
- symbol: ETH-USD
name: Ethereum
- symbol: NVDA
name: NVIDIA
- symbol: SPY
name: S&P 500Статус Docker-контейнеров
Чтобы Glance видел Docker, нужно пробросить сокет в контейнер. Добавьте строку в docker-compose.yml:
services:
glance:
image: glanceapp/glance
container_name: glance
restart: unless-stopped
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro # добавить эту строку
ports:
- "127.0.0.1:8080:8080"После пересоздания контейнера (docker compose up -d --force-recreate) добавьте виджет:
- type: docker-containers
title: Контейнеры
sort-by: stateНесколько страниц
Если виджетов много — разбейте по страницам. Каждая страница — отдельная вкладка в верхнем меню Glance.
pages:
- name: Главная
columns:
- size: small
widgets:
- type: clock
hour-format: 24h
- size: full
widgets:
- type: hacker-news
- name: Девопс
columns:
- size: full
widgets:
- type: releases
repositories:
- go-gitea/gitea
- nextcloud/server
- size: small
widgets:
- type: monitor
sites:
- title: Gitea
url: https://git.ваш-домен.ru6. Nginx + SSL
Glance работает по обычному HTTP — Nginx выступает как reverse proxy и обеспечивает HTTPS.
Шаг 1: настройка DNS
Добавьте A-запись у вашего регистратора. Имя домена придумайте сами — например, dash.ваш-домен.ru:
dash.ваш-домен.ru → A → IP_СЕРВЕРАШаг 2: конфиг Nginx
server {
listen 80;
server_name dash.ваш-домен.ru;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
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;
}
}ln -s /etc/nginx/sites-available/glance /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginxШаг 3: SSL-сертификат
apt install -y certbot python3-certbot-nginx
certbot --nginx -d dash.ваш-домен.ruCertbot сам обновит конфиг Nginx для HTTPS. После этого закройте прямой порт:
ufw delete allow 8080/tcp
ufw reloadВключите proxied в glance.yml
Когда Glance находится за Nginx, добавьте в конфиг строку proxied: true в раздел server:. Тогда Glance будет корректно определять IP клиентов из заголовка X-Forwarded-For.
7. Защита паролем
По умолчанию Glance открыт всем — любой, кто знает ваш домен, увидит дашборд. Если на дашборде есть внутренние ссылки или приватная информация, защитите его паролем.
Добавить аутентификацию в glance.yml
Сначала сгенерируйте секретный ключ — он нужен для шифрования сессий:
docker run --rm glanceapp/glance secret:make
# Выведет строку вида: 8f3a2b9c1d4e7f0a...
# Скопируйте еёДобавьте блок auth: в конфиг:
server:
port: 8080
proxied: true
auth:
secret-key: 8f3a2b9c1d4e7f0a... # ключ из команды выше
users:
admin:
password: ВашПароль
pages:
# ... остальной конфигdocker compose restart glanceТеперь при открытии дашборда появится форма входа. После логина браузер запомнит сессию — повторно вводить пароль не нужно.
Хешированный пароль (безопаснее)
Хранить пароль в открытом виде в конфиге — не лучшая практика. Можно сохранить bcrypt-хеш:
docker run --rm glanceapp/glance password:hash ВашПароль
# Выведет: $2a$10$...Замените password: на password-hash: с полученным хешем.
8. Обновление
Glance не хранит данные внутри контейнера (весь конфиг — в ./config/ на хосте), поэтому обновление полностью безопасно — ничего не потеряется.
cd ~/glance
docker compose pull
docker compose up -dDocker скачает новый образ и перезапустит контейнер. Конфиг остаётся нетронутым.