---
title: "Glance — Self-hosted Dashboard"
aliases: [glance, homelab-dashboard]
tags: [homelab, docker, dashboard, glance]
created: 2026-04-29
updated: 2026-05-03
status: live
---

## Overview

[Glance](https://github.com/glanceapp/glance) — лёгкий self-hosted dashboard на Go. Заменил Homarr в апреле 2026.

- **URL:** https://home.ai-impress.com
- **Internal:** http://192.168.1.225:8085
- **Config:** `/opt/services/glance/config/glance.yml`
- **Auth:** admin / (пароль из `.env`)

## Files (CT102)

```
/opt/services/glance/
├── docker-compose.yml
├── .env                    ← SECRET_KEY, ADMIN_PASSWORD_HASH, TZ
└── config/
    └── glance.yml          ← всё в одном файле (5 страниц)
```

## Docker Compose

```yaml
services:
  glance:
    image: glanceapp/glance:latest
    container_name: glance
    restart: unless-stopped
    ports:
      - "8085:8080"
    volumes:
      - ./config:/app/config:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    env_file: .env
    environment:
      TZ: ${TZ:-Europe/London}
```

## Dashboard Decision (2026-05-03)

Dashy и Dashbrr были развёрнуты для сравнения A/B/C. После ревью оставили **только Glance** — Dashy и Dashbrr удалены полностью (контейнеры, директории `/opt/services/`, NPM proxy hosts).

## Pages / Tabs

| Вкладка | Виджеты |
|---------|---------|
| Home | clock (Henley/Kyiv/UTC), weather, monitor (критические сервисы), alerts (Alertmanager), server-stats CT102, power (RAPL Вт), CPU temp, disk (root NVMe + data HDD), Jellyfin live sessions, Radarr/Sonarr history, qBit active downloads, quick bookmarks |
| Services | docker-containers (авто, все контейнеры), full monitor (28+ сервисов CT102 + CT111), server-stats |
| Reference | Все сервисы с IP/портами/публичными URL и иконками — одна страница вместо поиска |
| Energy | live power draw (RAPL), PSYS total, CPU temp, graph 24h, £/day forecast |
| Media | *arr stack monitor, Sonarr/Radarr queue, bookmarks |
| News | Hacker News, RSS Habr (ИИ/ML/Нейросети/LLM/DevOps/IoT/Умный дом), RSS EN (HuggingFace/Simon Willison/n8n), Reddit (selfhosted/MachineLearning/homelab), weather |

## Key Config Patterns

### Monitor — внутренние IP обязательны
```yaml
- type: monitor
  sites:
    - title: Portainer
      url: https://192.168.1.225:9443   # HTTPS + allow-insecure
      allow-insecure: true
```
**Никогда не использовать Cloudflare-домены** — hairpin NAT не работает изнутри CT102, все запросы будут timeout.

### Custom-API для Prometheus RAPL-метрик
```yaml
- type: custom-api
  url: http://192.168.1.225:9090/api/v1/query?query=rate(node_rapl_package_joules_total%5B1m%5D)
  template: |
    {{ .JSON.Float "data.result.0.value.1" | printf "%.1f" }} W
```
Метрики: `node_rapl_package_joules_total` (CPU package), `node_rapl_psys_joules_total` (вся система), `node_hwmon_temp_celsius{chip="platform_coretemp_0"}` (температура).

### $include не работает для pages
Glance merge-ит `$include` inline — нельзя использовать для отдельных страниц. Все `pages:` должны быть в одном файле `glance.yml`.

## Смена пароля

```bash
# Сгенерировать хеш нового пароля
ssh pve "pct exec 102 -- bash -lc 'docker run --rm glanceapp/glance password:hash <новый_пароль>'"

# Записать в .env
# ADMIN_PASSWORD_HASH=<хеш>

# Перезапустить
ssh pve "pct exec 102 -- bash -lc 'cd /opt/services/glance && docker compose restart'"
```

Минимальная длина пароля — 6 символов.

## Known Gotchas

### Jellyfin sessions — правильный способ

Токен передавать через `headers:`, не query param. Проверять наличие `NowPlayingItem` через `.Exists`, а не вложенный путь `.String "NowPlayingItem.Name"` (вложенный путь в range-блоке ненадёжен):

```yaml
- type: custom-api
  url: http://192.168.1.230:8096/Sessions
  headers:
    X-MediaBrowser-Token: <api_key>
  template: |
    {{ $playing := false }}
    {{ range .JSON.Array "" }}
      {{ if .Exists "NowPlayingItem" }}
        {{ $playing = true }}
        ...{{ .String "NowPlayingItem.Name" }}...
      {{ end }}
    {{ end }}
    {{ if not $playing }}<div>Никто не смотрит</div>{{ end }}
```

### Data HDD — правильный mountpoint

CT102 монтирует data-hdd в `/mnt/data` (не `/mnt/media` — это CT111). В Prometheus-запросе:
```
node_filesystem_avail_bytes{mountpoint="/mnt/data",instance="docker-host"}
```

### RSS Habr — правильный URL-формат

Используй `hubs` (множественное число), не `hub`:
```
✅ https://habr.com/ru/rss/hubs/artificial_intelligence/articles/all/
❌ https://habr.com/ru/rss/hub/artificial_intelligence/articles/all/  ← 404
```
Рабочие хабы: `artificial_intelligence`, `machine_learning`, `neural_networks`, `llm_tools`, `devops`, `sysadm`, `iot`, `smart_home`.

## Related

- [[homelab-services-map]] — полная карта сервисов
- [[homelab-media-stack]] — media stack (*arr)
- [[proxmox-install-setup-2025]] — Proxmox setup
