Post

Homepage - A Fully Static, Fast And Highly Customizable Dashboard

Homepage - A Fully Static, Fast And Highly Customizable Dashboard

Homepage A modern, fully static, fast, secure fully proxied, highly customizable application dashboard with integrations for over 100 services and translations into multiple languages. Easily configured via YAML files or through docker label discovery.

You may have noticed many of my Docker Compose examples had a bunch of homepage.xxxx labels, these are used for autodiscovery of services for Homepage.

Other services which are not local Docker Containers are added manually to the services.yaml file below, these are things like Proxmox, OPNSense, Home Assistant etc.

I also use docker-socket-proxy to link Homepage to my Unraid Docker Containers as defined in the docker.yaml file below

Kubernetes Manifest

Please note i also use many other config files, due to how redacted they will need to be i will not include them here.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: homepage
    app.kubernetes.io/instance: homepage
    app.kubernetes.io/name: homepage
  name: homepage
  namespace: homepage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: homepage
  template:
    metadata:
      labels:
        app: homepage
        app.kubernetes.io/name: homepage
    spec:
      serviceAccountName: homepage
      automountServiceAccountToken: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      nodeSelector:
        worker: "true"
      containers:
        - name: homepage
          image: ghcr.io/gethomepage/homepage
          resources:
            requests:
              memory: 128Mi
              cpu: 200m
          envFrom:
            - secretRef:
                name: homepage-secret
          ports:
            - containerPort: 3000
              name: http
          volumeMounts:
            - mountPath: /app/config/custom.js
              name: homepage-config
              subPath: custom.js
            - mountPath: /app/config/custom.css
              name: homepage-config
              subPath: custom.css
            - mountPath: /app/config/bookmarks.yaml
              name: homepage-config
              subPath: bookmarks.yaml
            - mountPath: /app/config/docker.yaml
              name: homepage-config
              subPath: docker.yaml
            - mountPath: /app/config/kubernetes.yaml
              name: homepage-config
              subPath: kubernetes.yaml
            - mountPath: /app/config/services.yaml
              name: homepage-config
              subPath: services.yaml
            - mountPath: /app/config/settings.yaml
              name: homepage-config
              subPath: settings.yaml
            - mountPath: /app/config/widgets.yaml
              name: homepage-config
              subPath: widgets.yaml
            - mountPath: /app/config/logs
              name: logs
      volumes:
        - name: homepage-config
          configMap:
            name: homepage-config
        - name: logs
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: homepage
  name: homepage
  namespace: homepage 
spec:
  ports:
  - name: web-tcp
    port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: homepage
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: homepage
  namespace: homepage
  annotations: 
    kubernetes.io/ingress.class: traefik-external
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`f9.casa`)
      kind: Rule
      services:
        - name: homepage
          port: 3000
      middlewares:
        - name: default-headers
          namespace: default
        - name: authentik
          namespace: authentik
  tls:
    secretName: f9-casa-tls

Docker Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.9'
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    hostname: homepage
    networks:
      - traefik-public
    volumes:
      - /srv/cephfs/docker/appdata/homepage:/config
      - /var/run/docker.sock:/var/run/docker.sock
      - /srv/cephfs/docker/appdata/homepage/images:/app/public/images
      - /srv:/srv:ro
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.homepage.rule=Host(`f9.casa`)"
        - "traefik.http.services.homepage.loadbalancer.server.port=3000"
        - "traefik.http.routers.homepage.entrypoints=websecure"
        - "traefik.http.routers.homepage.tls=true"
        - "traefik.http.routers.homepage.tls.certresolver=letsencrypt"
        - "traefik.http.routers.homepage.middlewares=authentik@docker"
      mode: replicated
      placement:
        constraints:
          - node.role == manager
networks:
  traefik-public:
    external: true
This post is licensed under CC BY 4.0 by the author.