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