├── README.md
├── docker-compose
├── always-on.yml
└── falcon.yml
├── homer
└── homer.yml
└── systemd
└── mfs-media.service
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Homelab Setup
3 |
4 | My servers setup at home
5 |
6 | - [Homelab Setup](#homelab-setup)
7 | - [Hardware](#hardware)
8 | - [NAS/media server](#nasmedia-server)
9 | - [DNS/proxy server](#dnsproxy-server)
10 | - [Cloud VMs](#cloud-vms)
11 | - [Unified access](#unified-access)
12 | - [File management](#file-management)
13 | - [Cloud storage](#cloud-storage)
14 | - [Local storage](#local-storage)
15 |
16 | ## Hardware
17 |
18 | I run two Raspberry Pi 4Bs as servers currently.
19 |
20 | ### NAS/media server
21 |
22 |
23 |
24 | `falcon`
25 |
26 | - ⚡ Raspberry Pi 4B (8GB model)
27 | - Ubuntu Server 22.04 LTS
28 | - Overclocked to 2.0GHz
29 | - 🔌 Powered USB 3.0 hub
30 | - TP-Link TL-UH700
31 | - 📼 Primary storage
32 | - Sandisk Ultra microSD card (8GB, boot)
33 | - Crucial BX500 SSD (480GB, root FS)
34 | - 📀 Secondary storage
35 | - Crucial BX500 SSD (480GB)
36 | - Seagate Barracuda 2.5" 1TB
37 | - Seagate Expansion 4TB
38 | - WD My Passport 1TB
39 | - Sony HD-B1 1TB
40 | - 🌐 Gigabit ethernet
41 | - TP-Link TL-SG1008D
42 | - 🔊 3.5mm out...
43 | - Fenda E200 Plus
44 |
45 | Main server that runs the majority of my self-hosted apps, runs the media stack, functions as a NAS and audio server using the likes of `librespot`, `shairport-sync`, and `mpv`.
46 |
47 | Runs in Docker containers:
48 |
49 | [🔗 **Docker Compose**](./docker-compose/falcon.yml)
50 |
51 | - 💡 [Home Assistant](https://github.com/agneevx/my-ha-setup)
52 | - �📽 Plex Media Server
53 | - 📺 Servarr media stack
54 | - 🧲 qBittorrent
55 |
56 | ### DNS/proxy server
57 |
58 |
59 |
60 | `always-on`
61 |
62 | - ⚡ Raspberry Pi 4 (4GB model)
63 | - Ubuntu Server 22.04 LTS
64 | - 📼 32GB microSD card
65 | - 🌐 Gigabit ethernet
66 |
67 | [DNS/DHCP server](#dns), monitors network latency and speed using tools like Smokeping and Speedtest-tracker, handles the Traefik network proxy over Tailscale. Also runs Portainer, which is used to monitor Docker hosts across all machines, cloud or local.
68 |
69 | Since this server runs on a SD card, `log2ram` is used to store system logs in memory to reduce writes to disk.
70 |
71 | Runs in Docker containers:
72 |
73 | [🔗 **Docker Compose**](./docker-compose/always-on.yml)
74 |
75 | ### Cloud VMs
76 |
77 | - Oracle Cloud
78 | - Google Cloud Platform (`e2-micro`)
79 | - Digital Ocean Droplets
80 |
81 | [🔗 **Docker Compose**](./docker-compose/oracle1.yml)
82 |
83 | ---
84 |
85 | ### DNS
86 |
87 | [AdGuard Home](https://github.com/AdguardTeam/AdGuardHome) blocks ads and trackers, manages DNS and DHCP in the local network.
88 |
89 | For DNS resolution, I use Cloudflare Zero Trust over DoH3, which is similar to 1.1.1.1 but supports EDNS Client Subnet, which enables devices to connect to servers located closer to me and thus makes stuff load faster.
90 |
91 | AdGuard has optimistic caching enabled which accelerates web page loading due to low latency lookups.
92 |
93 |
94 |
95 |
96 |
97 | 
98 |
99 | ## Unified access
100 |
101 | I use Tailscale to access devices and services. Cloud VMs have their storages securely mounted locally over NFS or FTP.
102 |
103 | Some apps are hosted in cloud to balance system resources. I use Traefik to access them as if they're hosted locally, using the format `http://..nt`.
104 |
105 | This requires Traefik and containers on all VMs, with Traefik routers created locally (for each VM) that proxy requests to remote Traefik instances.
106 |
107 | ## File management
108 |
109 | Files are stored both in the cloud and locally.
110 |
111 | ### Media storage
112 |
113 | mergerfs is used to pool together local drive mounts so they appear as a single mount that can be bind-mounted to Docker containers.
114 |
--------------------------------------------------------------------------------
/docker-compose/always-on.yml:
--------------------------------------------------------------------------------
1 | x-env: &env
2 | PGID: 1001
3 | PUID: 1001
4 | UMASK: 002
5 | TZ: Asia/Kolkata
6 |
7 | x-timezone: &tz
8 | TZ: Asia/Kolkata
9 |
10 | x-logging: &log
11 | logging:
12 | driver: journald
13 |
14 | networks:
15 |
16 | vlan:
17 | name: vlan
18 | driver: macvlan
19 | driver_opts:
20 | parent: eth0
21 | ipam:
22 | config:
23 | - subnet: 10.0.0.1/24
24 | gateway: 10.0.0.1
25 | ip_range: 10.0.0.96/30 # 10.0.0.96 - 10.0.0.99
26 |
27 | default:
28 | name: network1
29 | ipam:
30 | config:
31 | - subnet: 172.18.0.0/16
32 |
33 | proxy:
34 | name: proxy
35 | ipam:
36 | config:
37 | - subnet: 172.19.1.0/24
38 |
39 | dns:
40 | name: dns
41 | ipam:
42 | config:
43 | - subnet: 172.19.2.0/24
44 |
45 | services:
46 |
47 | dpiproxy:
48 | container_name: dpi-proxy
49 | image: hectorm/demergi
50 | restart: unless-stopped
51 | command: --dns-mode plain
52 | ports:
53 | - 2000:8080
54 |
55 | adguard:
56 | container_name: adguard
57 | image: adguard/adguardhome:v0.107.29
58 | restart: unless-stopped
59 | expose: ['80']
60 | healthcheck:
61 | disable: true
62 | environment:
63 | <<: *tz
64 | networks:
65 | dns:
66 | vlan:
67 | ipv4_address: 10.0.0.99
68 | volumes:
69 | - /opt/appdata/adguardhome/data:/opt/adguardhome/work
70 | - /opt/appdata/adguardhome/config:/opt/adguardhome/conf
71 | labels:
72 | traefik.enable: true
73 | traefik.name: dns
74 | traefik.docker.network: dns
75 | traefik.http.services.adguard.loadbalancer.server.port: 80
76 | traefik.http.routers.adguard.middlewares: adguard-themepark
77 | traefik.http.middlewares.adguard-themepark.plugin.rewritebody.rewrites.regex:
78 | traefik.http.middlewares.adguard-themepark.plugin.rewritebody.rewrites.replacement:
79 | traefik.http.middlewares.adguard-themepark.plugin.rewritebody.rewrites.type: text/html
80 |
81 | # webtools:
82 | # container_name: web-tools
83 | # image: agneev/webnet-tools
84 | # restart: unless-stopped
85 | # labels:
86 | # traefik.enable: true
87 | # traefik.name: netdiags
88 |
89 | iperf3:
90 | container_name: iperf3
91 | image: taoyou/iperf3-alpine
92 | restart: unless-stopped
93 | ports:
94 | - 5201:5201/tcp
95 | - 5201:5201/udp
96 |
97 | dashdot:
98 | container_name: dash.
99 | image: mauricenino/dashdot
100 | restart: unless-stopped
101 | privileged: true
102 | environment:
103 | DASHDOT_NETWORK_SHOWN_DATAPOINTS: 30
104 | DASHDOT_SPEED_TEST_INTERVAL: 1440
105 |
106 | DASHDOT_PAGE_TITLE: dash. - always-on
107 |
108 | DASHDOT_ENABLE_CPU_TEMPS: true
109 | DASHDOT_ENABLE_STORAGE_SPLIT_VIEW: true
110 | DASHDOT_ALWAYS_SHOW_PERCENTAGES: true
111 | DASHDOT_ACCEPT_OOKLA_EULA: true
112 | ports:
113 | - 90:3001
114 | volumes:
115 | - /:/mnt/host:ro
116 | labels:
117 | traefik.enable: true
118 | traefik.http.routers.dashdot.rule: Host(`always-on.nt`)
119 |
120 | smokeping:
121 | container_name: smokeping
122 | image: linuxserver/smokeping:2.7.3-r5-ls12
123 | restart: unless-stopped
124 | dns:
125 | - 8.8.8.8
126 | networks:
127 | proxy:
128 | vlan:
129 | ipv4_address: 10.0.0.97
130 | environment:
131 | <<: *env
132 | volumes:
133 | - /opt/appdata/smokeping/config:/config
134 | - /var/log/smokeping_data:/data
135 | labels:
136 | traefik.enable: true
137 | traefik.docker.network: proxy
138 | traefik.http.routers.smokeping.rule: Host(`smokeping.nt`) || Host(`ping-agneev.duckdns.org`)
139 | traefik.http.routers.smokeping.middlewares: smokeping-redirect,smokeping-themecolor
140 | traefik.http.middlewares.smokeping-redirect.redirectRegex.regex: \/$
141 | traefik.http.middlewares.smokeping-redirect.redirectRegex.replacement: /smokeping/?target=isp-network.wan-gateway
142 | traefik.http.middlewares.smokeping-themecolor.plugin.rewritebody.rewrites.regex:
143 | traefik.http.middlewares.smokeping-themecolor.plugin.rewritebody.rewrites.replacement:
144 | traefik.http.middlewares.smokeping-themecolor.plugin.rewritebody.rewrites.type: text/html
145 |
146 | themepark:
147 | container_name: theme.park
148 | image: gilbn/theme.park
149 | restart: unless-stopped
150 | environment:
151 | TP_SCHEME: http
152 | <<: *env
153 | ports:
154 | - 7070:80
155 | tmpfs:
156 | - /config:size=150m
157 |
158 | dozzle:
159 | container_name: dozzle
160 | image: amir20/dozzle
161 | restart: always
162 | environment:
163 | DOZZLE_REMOTE_HOST: tcp://falcon:2375,tcp://oc-bom1:2000,tcp://gcp1:2375
164 | DOZZLE_USERNAME: ${DOZZLE_USERNAME}
165 | DOZZLE_PASSWORD: ${DOZZLE_PASSWORD}
166 | DOZZLE_NO_ANALYTICS: true
167 | ports:
168 | - 8000:8080
169 | volumes:
170 | - /var/run/docker.sock:/var/run/docker.sock:ro
171 | labels:
172 | traefik.enable: true
173 | traefik.name: logs
174 |
175 | airconnect:
176 | container_name: airconnect
177 | image: 1activegeek/airconnect
178 | restart: unless-stopped
179 | network_mode: host
180 | environment:
181 | ARCH_VAR: aarch64
182 |
183 | vnstat:
184 | container_name: vnstat
185 | image: vergoh/vnstat
186 | restart: unless-stopped
187 | network_mode: host
188 | environment:
189 | SERVER_NAME: always-on
190 | HTTP_PORT: 7000
191 | LARGE_FONTS: 1
192 | HTTP_LOG: /dev/null
193 | <<: *tz
194 | volumes:
195 | - /opt/appdata/vnstat:/var/lib/vnstat
196 | labels:
197 | traefik.enable: true
198 | traefik.name: vnstat
199 | traefik.http.services.vnstat.loadbalancer.server.port: 7000
200 |
201 | vnstat2:
202 | container_name: vnstat-router
203 | image: vergoh/vnstat
204 | environment:
205 | SERVER_NAME: orbi
206 | LARGE_FONTS: 1
207 | HTTP_LOG: /dev/null
208 | RUN_VNSTATD: 0
209 | <<: *tz
210 | ports:
211 | - 8660:8685
212 | volumes:
213 | - /mnt/res2:/var/lib/vnstat:ro
214 | labels:
215 | traefik.enable: true
216 | traefik.http.routers.vnstat-router.rule: Host(`vnstat.router.nt`)
217 |
218 | traefik:
219 | container_name: traefik
220 | image: traefik
221 | restart: unless-stopped
222 | mem_limit: 200m
223 | command:
224 | - --api.insecure=true
225 | - --log.level=INFO
226 | - --global.checknewversion=false
227 | - --global.sendanonymoususage=false
228 | - --experimental.localplugins.rewritebody.modulename=github.com/packruler/rewrite-body
229 | - --providers.docker=true
230 | - --providers.docker.exposedByDefault=false
231 | - --providers.docker.defaultRule=Host(`{{ index .Labels "traefik.name" }}.nt`)
232 | - --providers.file.filename=/etc/traefik/file-provider.yml
233 | - --providers.file.watch=true
234 | extra_hosts:
235 | - "host.docker.internal:10.0.0.10"
236 | networks:
237 | - default
238 | - proxy
239 | - dns
240 | ports:
241 | - 80:80/tcp
242 | - 8090:8080/tcp
243 | volumes:
244 | - /opt/appdata/traefik/config:/etc/traefik
245 | - /opt/appdata/traefik/plugins:/plugins-local
246 | - /var/run/docker.sock:/var/run/docker.sock:ro
247 | labels:
248 | traefik.enable: true
249 | traefik.http.routers.web.rule: Host(`web.nt`) || Host(`10.0.0.10`) || Host(`always-on`)
250 | traefik.http.routers.web.service: api@internal
251 | traefik.http.middlewares.to-https.redirectscheme.scheme: https
252 | traefik.http.middlewares.homer-cors.headers.accessControlAllowMethods: GET # PUT,OPTIONS
253 | traefik.http.middlewares.homer-cors.headers.accessControlAllowOriginList: http://home.lab
254 |
255 | filebrowser:
256 | container_name: filebrowser
257 | image: filebrowser/filebrowser
258 | restart: unless-stopped
259 | user: "1001:1001"
260 | healthcheck:
261 | disable: true
262 | environment:
263 | FB_DATABASE: /config/database.db
264 | FB_DISABLE-EXEC: true
265 | FB_DISABLE-TYPE-DETECTION-BY-HEADER: true
266 | FB_DISABLE-PREVIEW-RESIZE: true
267 | volumes:
268 | - /opt/appdata/filebrowser:/config
269 | - /home/agneev:/srv/home
270 | - /opt/appdata:/srv/appdata
271 | - /mnt:/srv/mnt
272 | labels:
273 | traefik.enable: true
274 | traefik.name: files
275 |
276 | homer:
277 | container_name: homer
278 | image: b4bz/homer
279 | restart: unless-stopped
280 | user: 1001:1001
281 | healthcheck:
282 | disable: true
283 | volumes:
284 | - /opt/appdata/homer:/www/assets
285 | labels:
286 | traefik.enable: true
287 | traefik.http.routers.homer.rule: Host(`home.lab`)
288 |
289 | speedtesttracker:
290 | container_name: speedtest-tracker
291 | image: henrywhitaker3/speedtest-tracker:dev-arm
292 | restart: unless-stopped
293 | ports:
294 | - 8700:80
295 | environment:
296 | OOKLA_EULA_GDPR: true
297 | <<: *env
298 | tmpfs:
299 | - /config/www:size=500m
300 | - /config/log:size=32m
301 | volumes:
302 | - /opt/appdata/speedtest-tracker/app:/config/www/app/Bin
303 | - /opt/appdata/speedtest-tracker:/config
304 | labels:
305 | traefik.enable: true
306 | traefik.name: speedtest
307 | traefik.http.routers.speedtesttracker.middlewares: homer-cors
308 |
309 | openspeedtest:
310 | container_name: openspeedtest
311 | image: openspeedtest/latest
312 | restart: unless-stopped
313 | ports:
314 | - 9999:3000
315 |
316 | homebridge:
317 | image: oznu/homebridge
318 | container_name: homebridge
319 | restart: unless-stopped
320 | networks:
321 | - default
322 | - vlan
323 | environment:
324 | <<: *env
325 | volumes:
326 | - /opt/appdata/homebridge:/homebridge
327 | labels:
328 | traefik.enable: true
329 | traefik.name: homebridge
330 | traefik.docker.network: network1
331 |
332 | portainer:
333 | container_name: portainer
334 | image: portainer/portainer-ee:2.14.2
335 | restart: always
336 | logging:
337 | driver: none
338 | ports:
339 | - 9000:9000
340 | volumes:
341 | - /opt/appdata/portainer:/data
342 | - /var/run/docker.sock:/var/run/docker.sock
343 | labels:
344 | traefik.enable: true
345 | traefik.name: portainer
346 | traefik.http.services.portainer.loadbalancer.server.port: 9000
347 | traefik.http.routers.portainer.middlewares: portainer-themecolor,portainer-cors,homer-cors
348 | traefik.http.middlewares.portainer-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#ffffff"/>
349 | traefik.http.middlewares.portainer-themecolor.plugin.rewritebody.rewrites.replacement:
350 | traefik.http.middlewares.portainer-themecolor.plugin.rewritebody.rewrites.type: text/html
351 | traefik.http.middlewares.portainer-cors.headers.accessControlAllowHeaders: X-Api-Key
352 |
--------------------------------------------------------------------------------
/docker-compose/falcon.yml:
--------------------------------------------------------------------------------
1 | volumes:
2 | netdata-lib:
3 | netdata-cache:
4 |
5 | x-timezone: &tz
6 | TZ: Asia/Kolkata
7 |
8 | x-environment-vars: &env
9 | PUID: 1001
10 | PGID: 1001
11 | UMASK: 002
12 | <<: *tz
13 |
14 | networks:
15 | default:
16 | name: network1
17 | ipam:
18 | config:
19 | - subnet: 172.18.0.0/16
20 |
21 | mqtt:
22 | external: true
23 |
24 | vlan:
25 | name: vlan
26 | driver: macvlan
27 | driver_opts:
28 | parent: eth0
29 | ipam:
30 | config:
31 | - subnet: 10.0.0.1/24
32 | gateway: 10.0.0.1
33 | ip_range: 10.0.0.80/28 # 10.0.0.80 - 10.0.0.95
34 |
35 | proxy:
36 | name: proxy
37 | ipam:
38 | config:
39 | - subnet: 172.19.2.0/24
40 |
41 | media:
42 | name: media
43 | ipam:
44 | config:
45 | - subnet: 172.19.3.0/24
46 |
47 | services:
48 |
49 | overseerr:
50 | container_name: overseerr
51 | image: linuxserver/overseerr
52 | restart: unless-stopped
53 | environment:
54 | <<: *env
55 | networks:
56 | - media
57 | volumes:
58 | - /opt/appdata/overseerr:/config
59 | labels:
60 | traefik.enable: true
61 | traefik.name: overseerr
62 |
63 | dashdot:
64 | container_name: dash.
65 | image: mauricenino/dashdot
66 | restart: unless-stopped
67 | privileged: true
68 | environment:
69 | DASHDOT_CPU_POLL_INTERVAL: 1500
70 | DASHDOT_NETWORK_POLL_INTERVAL: 1500
71 | DASHDOT_NETWORK_SHOWN_DATAPOINTS: 30
72 | DASHDOT_SPEED_TEST_INTERVAL: 1440
73 | DASHDOT_PAGE_TITLE: dash. - falcon
74 | DASHDOT_ENABLE_CPU_TEMPS: true
75 | DASHDOT_ENABLE_STORAGE_SPLIT_VIEW: true
76 | DASHDOT_ALWAYS_SHOW_PERCENTAGES: true
77 | DASHDOT_ACCEPT_OOKLA_EULA: true
78 | ports:
79 | - 81:3001
80 | volumes:
81 | - /:/mnt/host:ro
82 | labels:
83 | traefik.enable: true
84 | traefik.http.routers.dashdot.rule: Host(`falcon.nt`)
85 |
86 | samba:
87 | container_name: samba
88 | image: elswork/samba
89 | restart: unless-stopped
90 | command: ${SAMBA_COMMAND}
91 | healthcheck:
92 | disable: true
93 | logging:
94 | driver: none
95 | environment:
96 | <<: *tz
97 | ports:
98 | - 445:445/tcp
99 | volumes:
100 | - /opt/appdata/samba:/etc/samba
101 | - /mnt:/mnt
102 | - ~/:/ssd
103 | - /opt/storage:/nas
104 |
105 | pts:
106 | container_name: plextraktsync
107 | image: ghcr.io/taxel/plextraktsync
108 | restart: unless-stopped
109 | user: 1001:1001
110 | command: watch
111 | depends_on:
112 | - plex
113 | networks:
114 | - media
115 | environment:
116 | PTS_LOG_DIR: /logs
117 | <<: *tz
118 | tmpfs:
119 | - /logs:size=10m,uid=1001,gid=1001
120 | volumes:
121 | - /opt/appdata/plextraktsync:/app/config
122 |
123 | aria2:
124 | container_name: aria2
125 | image: hurlenko/aria2-ariang
126 | restart: unless-stopped
127 | environment:
128 | ARIA2RPCPORT: 80
129 | <<: *env
130 | volumes:
131 | - /opt/appdata/aria2:/aria2/conf
132 | - /opt/storage/downloads:/aria2/data
133 | labels:
134 | traefik.enable: true
135 | traefik.name: aria2
136 |
137 | vnstat:
138 | image: vergoh/vnstat
139 | container_name: vnstat
140 | restart: unless-stopped
141 | network_mode: host
142 | environment:
143 | SERVER_NAME: falcon
144 | HTTP_PORT: 7077
145 | LARGE_FONTS: 1
146 | HTTP_LOG: /dev/null
147 | <<: *tz
148 | volumes:
149 | - /opt/appdata/vnstat/vnstat.conf:/etc/vnstat.conf
150 | - /opt/appdata/vnstat:/var/lib/vnstat
151 | labels:
152 | traefik.enable: true
153 | traefik.name: vnstat
154 | traefik.http.services.vnstat.loadbalancer.server.port: 7077
155 | traefik.http.routers.vnstat.middlewares: vnstat-themecolor
156 | traefik.http.middlewares.vnstat-themecolor.plugin.rewritebody.rewrites.regex:
157 | traefik.http.middlewares.vnstat-themecolor.plugin.rewritebody.rewrites.replacement:
158 | traefik.http.middlewares.vnstat-themecolor.plugin.rewritebody.rewrites.type: text/html
159 |
160 | traefik:
161 | container_name: traefik
162 | image: traefik
163 | restart: unless-stopped
164 | mem_limit: 200m
165 | command:
166 | - --log.level=INFO
167 | - --api.insecure=true
168 | - --global.checknewversion=false
169 | - --global.sendanonymoususage=false
170 | - --experimental.localplugins.rewritebody.modulename=github.com/packruler/rewrite-body
171 | - --providers.docker=true
172 | - --providers.docker.exposedByDefault=false
173 | - --providers.docker.defaultRule=Host(`{{ index .Labels "traefik.name" }}.falcon.nt`)
174 | extra_hosts:
175 | - "host.docker.internal:10.0.0.11"
176 | networks:
177 | - default
178 | - proxy
179 | - media
180 | ports:
181 | - 80:80/tcp
182 | volumes:
183 | - /opt/appdata/traefik/plugins:/plugins-local
184 | - /var/run/docker.sock:/var/run/docker.sock
185 | labels:
186 | traefik.enable: true
187 | traefik.http.routers.traefik.rule: Host(`web.falcon.nt`) || Host(`10.0.0.11`) || Host(`falcon`)
188 | traefik.http.routers.traefik.service: api@internal
189 | traefik.http.middlewares.homer-cors.headers.accessControlAllowMethods: GET #,PUT,OPTIONS
190 | traefik.http.middlewares.homer-cors.headers.accessControlAllowOriginList: http://home.lab
191 |
192 | archive:
193 | container_name: archivebox
194 | image: archivebox/archivebox
195 | restart: unless-stopped
196 | environment:
197 | MEDIA_MAX_SIZE: 750m
198 | <<: *env
199 | volumes:
200 | - /opt/appdata/archivebox:/data
201 | labels:
202 | traefik.enable: true
203 | traefik.name: archives
204 |
205 | filebrowser:
206 | image: filebrowser/filebrowser
207 | container_name: filebrowser
208 | restart: unless-stopped
209 | user: 1001:1001
210 | healthcheck:
211 | disable: true
212 | environment:
213 | FB_DATABASE: /config/database.db
214 | FB_DISABLE-EXEC: true
215 | FB_DISABLE-TYPE-DETECTION-BY-HEADER: true
216 | FB_DISABLE-PREVIEW-RESIZE: true
217 | volumes:
218 | - /opt/appdata/filebrowser:/config
219 | - ~/:/srv/home
220 | - /opt/storage:/srv/storage
221 | - /opt/appdata:/srv/appdata
222 | - /mnt:/srv/mnt
223 | labels:
224 | traefik.enable: true
225 | traefik.name: files
226 |
227 | shairport:
228 | container_name: shairport-sync
229 | image: mikebrady/shairport-sync
230 | restart: unless-stopped
231 | networks:
232 | - vlan
233 | - mqtt
234 | volumes:
235 | - /opt/appdata/shairport-sync/config.conf:/etc/shairport-sync.conf
236 | devices:
237 | - /dev/snd:/dev/snd
238 |
239 | freshrss:
240 | image: linuxserver/freshrss
241 | container_name: freshrss
242 | restart: unless-stopped
243 | environment:
244 | <<: *env
245 | tmpfs:
246 | - /config/log:size=50m,uid=1001,gid=1001
247 | volumes:
248 | - /opt/appdata/freshrss:/config
249 | labels:
250 | traefik.enable: true
251 | traefik.name: rss
252 |
253 | scrutiny:
254 | container_name: scrutiny
255 | image: ghcr.io/analogj/scrutiny
256 | restart: unless-stopped
257 | privileged: true
258 | volumes:
259 | - /opt/appdata/scrutiny/config:/opt/scrutiny/config
260 | - /opt/appdata/scrutiny/db:/opt/scrutiny/influxdb
261 | - /run/udev:/run/udev:ro
262 | - /dev:/dev
263 | labels:
264 | traefik.enable: true
265 | traefik.name: drives
266 |
267 | hassio:
268 | container_name: home-assistant
269 | image: homeassistant/home-assistant
270 | restart: unless-stopped
271 | expose: ['80']
272 | networks:
273 | - media
274 | - mqtt
275 | - vlan
276 | environment:
277 | <<: *tz
278 | volumes:
279 | - /opt/appdata/homeassistant:/config
280 | labels:
281 | traefik.enable: true
282 | traefik.docker.network: media
283 | traefik.http.routers.hassio.rule: Host(`home-assistant.falcon.nt`)
284 | traefik.http.routers.hassio-web.rule: Host(`home-assistant-agneev.duckdns.org`)
285 | traefik.http.routers.hassio-ts.rule: Host(`falcon.tailnet-d10c.ts.net`)
286 |
287 | qbittorrent-wg:
288 | container_name: qbittorrent-wg
289 | image: hotio/qbittorrent
290 | restart: unless-stopped
291 | cap_add:
292 | - NET_ADMIN
293 | sysctls:
294 | - net.ipv4.conf.all.src_valid_mark=1
295 | - net.ipv6.conf.all.disable_ipv6=1
296 | ports:
297 | - 8000:8080
298 | - 8118:8118
299 | networks:
300 | - media
301 | environment:
302 | <<: *env
303 | VPN_ENABLED: true
304 | VPN_LAN_NETWORK: 10.0.0.0/24
305 | PRIVOXY_ENABLED: true
306 | volumes:
307 | - /opt/appdata/qbittorrent/wg:/config
308 | - ~/scripts/qbt_post_dl.sh:/script.sh:ro
309 | - /mnt/mfs-media/local/qbt:/media/local/qbt
310 | labels:
311 | traefik.enable: true
312 | traefik.name: qbt-wg
313 | traefik.http.services.app.loadbalancer.server.port: 8080
314 |
315 | qbittorrent:
316 | container_name: qbittorrent
317 | image: linuxserver/qbittorrent
318 | restart: unless-stopped
319 | environment:
320 | <<: *env
321 | networks:
322 | - media
323 | volumes:
324 | - /opt/appdata/qbittorrent/lsio:/config
325 | - ~/scripts/qbt_post_dl.sh:/script.sh:ro
326 | - /mnt/mfs-media/local/qbt:/media/local/qbt
327 | labels:
328 | traefik.enable: true
329 | traefik.name: qbt
330 | traefik.http.services.qbittorrent.loadbalancer.server.port: 8080
331 |
332 | flood:
333 | container_name: qbittorrent-flood
334 | image: jesec/flood:master
335 | restart: unless-stopped
336 | user: 1001:1001
337 | command: --rundir /config --qburl http://qbittorrent:8080 --qbuser abc --qbpass abc
338 | depends_on:
339 | - qbittorrent
340 | networks:
341 | - media
342 | volumes:
343 | - /opt/appdata/qbittorrent/flood:/config
344 | - /opt/storage/downloads:/downloads
345 | - /mnt/mfs-media/local/qbt:/media/local/qbt
346 | labels:
347 | traefik.enable: true
348 | traefik.name: qbt-flood
349 | traefik.http.routers.flood.middlewares: flood-themecolor
350 | traefik.http.middlewares.flood-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#000000"
351 | traefik.http.middlewares.flood-themecolor.plugin.rewritebody.rewrites.replacement: name="theme-color" content="#111418"
352 |
353 | plex:
354 | container_name: plex
355 | image: hotio/plex
356 | restart: unless-stopped
357 | environment:
358 | <<: *env
359 | ports:
360 | - 32400:32400
361 | networks:
362 | - media
363 | - vlan
364 | tmpfs:
365 | - /transcode:size=4g
366 | - /tmp:size=1g
367 | volumes:
368 | - "/opt/appdata/plex/Library/Application Support/Plex Media Server:/config"
369 | - /mnt/mfs-media:/media
370 | labels:
371 | traefik.enable: true
372 | traefik.name: plex
373 | traefik.docker.network: media
374 | traefik.http.services.plex.loadbalancer.server.port: 32400
375 | traefik.http.routers.plex.middlewares: plex-themecolor
376 | traefik.http.middlewares.plex-themecolor.plugin.rewritebody.rewrites.regex:
377 | traefik.http.middlewares.plex-themecolor.plugin.rewritebody.rewrites.replacement:
378 | traefik.http.middlewares.plex-themecolor.plugin.rewritebody.rewrites.type: text/html
379 |
380 | tautulli:
381 | container_name: tautulli
382 | image: linuxserver/tautulli
383 | restart: unless-stopped
384 | environment:
385 | <<: *env
386 | networks:
387 | - media
388 | ports:
389 | - 8181:8181/tcp
390 | volumes:
391 | - /opt/appdata/tautulli:/config
392 | - /opt/appdata/plex/Logs:/plex-logs:ro
393 | labels:
394 | traefik.enable: true
395 | traefik.name: stats.plex
396 | traefik.http.routers.tautulli.middlewares: homer-cors,tautulli-themecolor
397 | traefik.http.middlewares.tautulli-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#282a2d"
398 | traefik.http.middlewares.tautulli-themecolor.plugin.rewritebody.rewrites.replacement: name="theme-color" content="#000000"
399 | traefik.http.middlewares.tautulli-themecolor.plugin.rewritebody.rewrites.type: text/html
400 |
401 | autoscan:
402 | container_name: autoscan
403 | image: cloudb0x/autoscan
404 | restart: unless-stopped
405 | depends_on:
406 | - plex
407 | environment:
408 | <<: *env
409 | networks:
410 | - media
411 | volumes:
412 | - /opt/appdata/autoscan:/config
413 |
414 | radarr:
415 | container_name: radarr
416 | image: linuxserver/radarr
417 | restart: unless-stopped
418 | expose: ['80']
419 | depends_on:
420 | - prowlarr
421 | - qbittorrent
422 | environment:
423 | <<: *env
424 | networks:
425 | - media
426 | volumes:
427 | - /opt/appdata/radarr:/config
428 | - ~/scripts/radarr_connect.sh:/script.sh
429 | - /mnt/mfs-media:/media
430 | labels:
431 | traefik.enable: true
432 | traefik.name: radarr
433 | traefik.http.routers.radarr.middlewares: homer-cors
434 |
435 | radarr4k:
436 | container_name: radarr4k
437 | image: linuxserver/radarr
438 | restart: unless-stopped
439 | expose: ['80']
440 | depends_on:
441 | - prowlarr
442 | - qbittorrent
443 | environment:
444 | TP_THEME: pine-shadow
445 | TP_COMMUNITY_THEME: true
446 | TP_ADDON: radarr-4k-logo|radarr-alt-calendar
447 | TP_SCHEME: http
448 | TP_DOMAIN: 10.0.0.10:7070
449 | DOCKER_MODS: gilbn/theme.park:radarr
450 | <<: *env
451 | networks:
452 | - media
453 | volumes:
454 | - /opt/appdata/radarr4k:/config
455 | - ~/scripts/radarr_connect.sh:/script.sh
456 | - /mnt/mfs-media:/media
457 | labels:
458 | traefik.enable: true
459 | traefik.name: radarr4k
460 | traefik.http.routers.radarr4k.middlewares: homer-cors,radarr4k-themecolor
461 | traefik.http.middlewares.radarr4k-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#3a3f51"
462 | traefik.http.middlewares.radarr4k-themecolor.plugin.rewritebody.rewrites.replacement: name="theme-color" content="#0F1112"
463 | traefik.http.middlewares.radarr4k-themecolor.plugin.rewritebody.rewrites.type: text/html
464 |
465 | sonarr:
466 | container_name: sonarr
467 | image: linuxserver/sonarr:develop
468 | restart: unless-stopped
469 | expose: ['80']
470 | depends_on:
471 | - prowlarr
472 | - qbittorrent
473 | environment:
474 | <<: *env
475 | networks:
476 | - media
477 | volumes:
478 | - /opt/appdata/sonarr:/config
479 | - /mnt/mfs-media:/media
480 | labels:
481 | traefik.enable: true
482 | traefik.name: sonarr
483 | traefik.http.routers.sonarr.middlewares: homer-cors
484 |
485 | sonarr4k:
486 | container_name: sonarr4k
487 | image: linuxserver/sonarr:develop
488 | restart: unless-stopped
489 | expose: ['80']
490 | depends_on:
491 | - prowlarr
492 | - qbittorrent
493 | environment:
494 | TP_THEME: plex
495 | TP_ADDON: sonarr-4k-text-logo
496 | TP_SCHEME: http
497 | TP_DOMAIN: 10.0.0.10:7070
498 | DOCKER_MODS: gilbn/theme.park:sonarr
499 | <<: *env
500 | networks:
501 | - media
502 | volumes:
503 | - /opt/appdata/sonarr4k:/config
504 | - /mnt/mfs-media:/media
505 | labels:
506 | traefik.enable: true
507 | traefik.name: sonarr4k
508 | traefik.http.routers.sonarr4k.middlewares: homer-cors,sonarr4k-themecolor
509 | traefik.http.middlewares.sonarr4k-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#3a3f51"
510 | traefik.http.middlewares.sonarr4k-themecolor.plugin.rewritebody.rewrites.replacement: name="theme-color" content="#141414"
511 | traefik.http.middlewares.sonarr4k-themecolor.plugin.rewritebody.rewrites.type: text/html
512 |
513 | prowlarr:
514 | container_name: prowlarr
515 | image: linuxserver/prowlarr
516 | restart: unless-stopped
517 | expose: ['80']
518 | environment:
519 | <<: *env
520 | networks:
521 | - media
522 | volumes:
523 | - /opt/appdata/prowlarr:/config
524 | labels:
525 | traefik.enable: true
526 | traefik.name: prowlarr
527 | traefik.http.routers.prowlarr.middlewares: prowlarr-themecolor
528 | traefik.http.middlewares.prowlarr-themecolor.plugin.rewritebody.rewrites.regex: name="theme-color" content="#e66001"
529 | traefik.http.middlewares.prowlarr-themecolor.plugin.rewritebody.rewrites.replacement: name="theme-color" content="#595959"
530 | traefik.http.middlewares.prowlarr-themecolor.plugin.rewritebody.rewrites.type: text/html
531 |
532 | recyclarr:
533 | container_name: recyclarr
534 | image: recyclarr/recyclarr
535 | restart: unless-stopped
536 | user: 1001:1001
537 | depends_on:
538 | - radarr
539 | - radarr4k
540 | - sonarr
541 | - sonarr4k
542 | environment:
543 | <<: *tz
544 | networks:
545 | - media
546 | volumes:
547 | - /opt/appdata/recyclarr:/config
548 |
549 | unpackerr:
550 | container_name: unpackerr
551 | image: golift/unpackerr
552 | restart: unless-stopped
553 | user: 1001:1001
554 | environment:
555 | UN_SONARR_0_URL: http://sonarr
556 | UN_SONARR_0_API_KEY: ${SONARR_API_KEY}
557 | UN_SONARR_1_URL: http://sonarr4k
558 | UN_SONARR_1_API_KEY: ${SONARR4K_API_KEY}
559 | UN_RADARR_0_URL: http://radarr
560 | UN_RADARR_0_API_KEY: ${RADARR_API_KEY}
561 | UN_RADARR_1_URL: http://radarr4k
562 | UN_RADARR_1_API_KEY: ${RADARR4K_API_KEY}
563 | <<: *tz
564 | networks:
565 | - media
566 | volumes:
567 | - /mnt/mfs-media/local/qbt:/media/local/qbt
568 |
569 | librespot:
570 | container_name: librespot
571 | image: agneev/librespot-java
572 | restart: unless-stopped
573 | networks:
574 | - vlan
575 | devices:
576 | - /dev/snd:/dev/snd
577 | volumes:
578 | - /opt/appdata/librespot-java:/config
579 |
--------------------------------------------------------------------------------
/homer/homer.yml:
--------------------------------------------------------------------------------
1 | title: Homelab Dash
2 | subtitle: always-on
3 | documentTitle: Homelab Dash
4 | logo: logo.png
5 |
6 | columns: 3
7 | header: true
8 | footer: false
9 |
10 | # stylesheet:
11 | # - assets/homer-theme/assets/custom.css
12 |
13 | theme: default
14 | colors:
15 | light:
16 | highlight-primary: "#3367d6"
17 | highlight-secondary: "#4285f4"
18 | highlight-hover: "#5a95f5"
19 | background: "#f5f5f5"
20 | card-background: "#ffffff"
21 | text: "#363636"
22 | text-header: "#ffffff"
23 | text-title: "#303030"
24 | text-subtitle: "#424242"
25 | card-shadow: "rgba(0, 0, 0, 0.1)"
26 | link-hover: "#363636"
27 | dark:
28 | highlight-primary: "#1B3E88"
29 | highlight-secondary: "#1b4d9e"
30 | highlight-hover: "#2b579e"
31 | background: "#121212"
32 | card-background: "#1D1D1D"
33 | text: "#eaeaea"
34 | text-header: "#f7f7f7"
35 | text-title: "#fafafa"
36 | text-subtitle: "#f5f5f5"
37 | card-shadow: "rgba(0, 0, 0, 0.4)"
38 | link-hover: "#ffdd57"
39 |
40 | # message:
41 | # url: https://api.chucknorris.io/jokes/random
42 | # mapping:
43 | # title: 'updated_at'
44 | # content: 'value'
45 |
46 | links:
47 |
48 | - icon: far fa-edit
49 | url: http://files.nt/files/appdata/homer/config.yml
50 | target: _blank
51 |
52 | - icon: fab fa-docker
53 | url: http://files.falcon.nt/files/home/compose.yml
54 | target: _blank
55 |
56 | - name: 2
57 | icon: fab fa-docker
58 | url: http://files.nt/files/home/compose.yml
59 | target: _blank
60 | - name: 2
61 | icon: fas fa-folder-open
62 | url: http://files.nt/files
63 | target: _blank
64 |
65 | - name: 2
66 | icon: fas fa-traffic-light
67 | url: http://web.nt
68 | target: _blank
69 |
70 | # - icon: fas fa-fire
71 | # url: http://prometheus.falcon.nt
72 | # target: _blank
73 |
74 | - icon: fas fa-network-wired
75 | url: http://vnstat.falcon.nt
76 | target: _blank
77 |
78 | - name: 2
79 | icon: fas fa-network-wired
80 | url: http://vnstat.nt
81 | target: _blank
82 |
83 | - icon: fas fa-wifi
84 | url: http://routerlogin.net/
85 | target: _blank
86 |
87 | - icon: fas fa-satellite-dish
88 | url: http://satellite.lan/
89 | target: _blank
90 |
91 | - icon: fas fa-cloud-download-alt
92 | url: http://qbittorrent.oc1.nt
93 | target: _blank
94 |
95 | - name: 2
96 | icon: fas fa-cloud-download-alt
97 | url: http://qbittorrent.oc2.nt
98 | target: _blank
99 |
100 | # - name: 4K
101 | # icon: fas fa-closed-captioning
102 | # url: http://bazarr4k.oc1.nt
103 | # target: _blank
104 |
105 | # - name: "Page 2"
106 | # icon: "fas fa-columns"
107 | # url: "#additionnal-page"
108 |
109 | services:
110 | - name: Media
111 | icon: fas fa-film
112 | items:
113 |
114 | - name: Overseerr
115 | subtitle: Discover new media
116 | url: http://overseerr.falcon.nt
117 | logo: assets/third-party/homer-icons/svg/overseerr.svg
118 | target: _blank
119 |
120 | - name: Tautulli
121 | subtitle: Stats from Plex
122 | url: http://stats.plex.falcon.nt
123 | logo: assets/third-party/homer-icons/png/tautulli.png
124 | target: _blank
125 |
126 | - name: Radarr
127 | subtitle: Manage HD movies
128 | url: http://radarr.falcon.nt
129 | logo: assets/third-party/homer-icons/png/radarr.png
130 | target: _blank
131 |
132 | - name: Radarr4K
133 | subtitle: Manage 4K movies
134 | url: http://radarr4k.falcon.nt
135 | logo: assets/custom/radarr4k.png
136 | target: _blank
137 |
138 | - name: Sonarr
139 | subtitle: Manage HD TV Shows
140 | url: http://sonarr.falcon.nt
141 | logo: assets/third-party/homer-icons/svg/sonarr.svg
142 | target: _blank
143 |
144 | - name: Sonarr4K
145 | subtitle: Manage 4K TV Shows
146 | url: http://sonarr4k.falcon.nt
147 | logo: assets/custom/sonarr4k.png
148 | target: _blank
149 |
150 | - name: Flood
151 | subtitle: Next-gen torrent GUI
152 | url: http://qbt-flood.falcon.nt
153 | logo: assets/third-party/homer-icons/png/flood.png
154 | target: _blank
155 |
156 | - name: Plex
157 | subtitle: Media server
158 | url: http://plex.falcon.nt/web/index.html
159 | logo: assets/third-party/homer-icons/png/plex.png
160 | target: _blank
161 |
162 |
163 | - name: Applications
164 | icon: fas fa-rocket
165 | items:
166 |
167 | # - name: Code-server
168 | # subtitle: Edit code in a browser
169 | # url: https://code.agneev.ml
170 | # logo: assets/custom/code-server.png
171 | # target: _blank
172 |
173 | # - name: Grafana
174 | # subtitle: Visualize metrics
175 | # url: http://grafana.falcon.nt
176 | # logo: assets/third-party/homer-icons/png/grafana.png
177 | # target: _blank
178 |
179 | - name: Web Net Tools
180 | subtitle: Network diagnostic tools
181 | url: http://diagnostics.nt
182 | target: _blank
183 |
184 | - name: Home Assistant
185 | subtitle: Next-gen smart home
186 | url: http://home-assistant.falcon.nt
187 | logo: assets/custom/home-assistant.png
188 | target: _blank
189 |
190 | - name: Homebridge
191 | subtitle: HomeKit all things
192 | url: http://homebridge.nt
193 | logo: assets/third-party/homer-icons/png/homebridge.png
194 | target: _blank
195 |
196 | - name: FreshRSS
197 | subtitle: Reading for days
198 | url: http://rss.falcon.nt
199 | logo: assets/third-party/homer-icons/png/freshrss.png
200 | target: _blank
201 |
202 | # - name: YouTube-DL Material
203 | # subtitle: Store YT videos locally
204 | # url: http://youtube-dl.falcon.nt
205 | # # logo: assets/third-party/homer-icons/png/grafana.png
206 | # target: _blank
207 |
208 | - name: MeTube
209 | subtitle: Store YT videos locally
210 | url: http://ytdl.falcon.nt
211 | # logo: assets/third-party/homer-icons/png/grafana.png
212 | target: _blank
213 |
214 | - name: SFTP-go
215 | subtitle: SFTP/WebDAV web GUI
216 | url: http://sftp-go.falcon.nt
217 | # logo: assets/third-party/homer-icons/png/grafana.png
218 | target: _blank
219 |
220 | - name: Manage
221 | icon: fas fa-user-shield
222 | items:
223 |
224 | - name: Portainer
225 | subtitle: Advanced Docker GUI
226 | url: http://portainer.nt
227 | logo: assets/third-party/homer-icons/png/portainer.png
228 | target: _blank
229 |
230 | - name: Netmaker
231 | subtitle: Self-hosted Wireguard VPN
232 | url: https://dash.nm.jaydns.de/login
233 | target: _blank
234 |
235 | # - name: pgAdmin
236 | # subtitle: PostgreSQL admin GUI
237 | # url: http://pgadmin.falcon.nt
238 | # logo: assets/third-party/homer-icons/png/pgadmin.png
239 | # target: _blank
240 |
241 | - name: Dozzle
242 | subtitle: Docker container logs
243 | url: http://logs.nt
244 | logo: assets/third-party/homer-icons/png/dozzle.png
245 | target: _blank
246 |
247 | - name: Traefik
248 | subtitle: Docker network proxy
249 | url: http://traefik.falcon.nt/dashboard/
250 | logo: assets/third-party/homer-icons/png/traefik.png
251 | target: _blank
252 |
253 | - name: Smokeping
254 | subtitle: Monitor network hosts
255 | url: http://smokeping.nt
256 | logo: assets/custom/monitor.png
257 | target: _blank
258 |
259 | # - name: Netdata (falcon)
260 | # url: http://netdata.falcon.nt/#after=-300;before=0"
261 | # logo: assets/third-party/homer-icons/png/netdata.png
262 | # target: _blank
263 |
264 | # - name: Netdata (always-on)
265 | # url: http://netdata.nt/#after=-300;before=0"
266 | # logo: assets/custom/netdata-alt.png
267 | # target: _blank
268 |
269 | # - name: Yacht
270 | # subtitle: Material UI Docker manager
271 | # url: http://yacht.falcon.nt
272 | # logo: assets/third-party/homer-icons/png/yacht.png
273 | # target: _blank
274 |
275 | - name: Network
276 | icon: fas fa-project-diagram
277 | items:
278 |
279 | - name: AdGuard Home
280 | subtitle: Network DNS/DHCP server
281 | url: http://dns.nt/
282 | logo: assets/third-party/homer-icons/svg/adguardhome.svg
283 | target: _blank
284 |
285 | # - name: PowerDNS
286 | # subtitle: Fast recursor
287 | # url: http://pdns.nt/
288 | # logo: assets/custom/powerdns.png
289 | # target: _blank
290 |
291 | # - name: DNSDist
292 | # subtitle: DNS load-balancer
293 | # url: http://dns-lb.nt/
294 | # logo: assets/custom/powerdns.png
295 | # target: _blank
296 |
297 | - name: Speedtest tracker
298 | subtitle: Automated speed tests
299 | url: http://speedtest.nt
300 | logo: assets/custom/speedtest-tracker.png
301 | target: _blank
302 |
303 | - name: Router
304 | subtitle: Metrics from router Netdata
305 | url: http://routerlogin.net:19999/#menu_net_submenu_eth0;theme=slate;help=false
306 | logo: assets/third-party/homer-icons/png/netdata.png
307 | target: _blank
308 |
309 | - name: Router vnstat
310 | subtitle: Internet usage graphs
311 | url: http://vnstat.router.nt
312 | logo: assets/custom/vnstat.png
313 | target: _blank
314 |
315 | # - name: Uptime-kuma
316 | # subtitle: Service monitoring
317 | # url: http://uptime-kuma.nt
318 | # logo: assets/custom/uptime-kuma.svg
319 | # target: _blank
320 |
321 | - name: OpenSpeedTest
322 | subtitle: LAN speed tests
323 | url: http://always-on.nt:9999/
324 | logo: assets/third-party/homer-icons/png/openspeedtest.png
325 | target: _blank
326 |
327 | - name: Files
328 | icon: fas fa-server
329 | items:
330 |
331 | - name: Syncthing
332 | subtitle: Effortless files syncing
333 | url: http://syncthing.falcon.nt
334 | logo: assets/third-party/homer-icons/png/syncthing.png
335 | target: _blank
336 |
337 | - name: File Browser
338 | subtitle: Manage files on NAS
339 | url: http://files.falcon.nt
340 | logo: assets/third-party/homer-icons/svg/filebrowser.svg
341 | target: _blank
342 |
343 | - name: aria2
344 | subtitle: HTTP downloader
345 | url: http://aria2.falcon.nt
346 | logo: assets/third-party/homer-icons/png/ariang.png
347 | target: _blank
348 |
349 | - name: qBittorrent
350 | subtitle: Best torrent client
351 | url: http://qbt.falcon.nt
352 | logo: assets/third-party/homer-icons/png/qbittorrent.png
353 | target: _blank
354 |
355 | - name: ArchiveBox
356 | subtitle: Archive websites with ease
357 | url: http://archive.falcon.nt/admin/core/snapshot/
358 | logo: assets/third-party/homer-icons/png/archivebox.png
359 | target: _blank
360 |
361 | # - name: Duplicacy
362 | # subtitle: Incremental backups
363 | # url: http://duplicacy.falcon.nt
364 | # logo: assets/third-party/homer-icons/png/duplicacy.png
365 | # target: _blank
366 |
367 | - name: Tools
368 | icon: fas fa-toolbox
369 | items:
370 |
371 | - name: Prowlarr
372 | subtitle: Indexer manager
373 | url: http://prowlarr.oc2.nt
374 | logo: assets/third-party/homer-icons/svg/prowlarr.svg
375 | target: _blank
376 |
377 | - name: Scrutiny
378 | subtitle: Visualized SMART data
379 | url: http://drives.falcon.nt
380 | logo: assets/third-party/homer-icons/png/scrutiny.png
381 | target: _blank
382 |
383 | # - name: Prometheus
384 | # subtitle: Metrics collector
385 | # url: http://prom.falcon.nt
386 | # logo: assets/third-party/homer-icons/png/prometheus.png
387 | # target: _blank
388 |
389 | - name: Node-RED
390 | subtitle: Programming tool
391 | url: http://nodered.falcon.nt
392 | logo: assets/third-party/homer-icons/png/nodered.png
393 | target: _blank
394 |
395 | - name: Bazarr
396 | subtitle: Subtitles for HD media
397 | url: http://bazarr.falcon.nt
398 | logo: assets/third-party/homer-icons/svg/bazarr.svg
399 | target: _blank
400 |
401 | - name: Bazarr4K
402 | subtitle: Subtitles for 4K media
403 | url: http://bazarr4k.falcon.nt
404 | logo: assets/third-party/homer-icons/svg/bazarr.svg
405 | target: _blank
406 |
407 | - name: Jackett
408 | subtitle: All indexers in one place
409 | url: http://jackett.oc2.nt
410 | logo: assets/third-party/homer-icons/png/jackett.png
411 | target: _blank
412 |
413 | # - name: Petio
414 | # subtitle: "Plex companion"
415 | # url: http://petio.oc1.nt
416 | # logo: https://raw.githubusercontent.com/petio-team/petio/master/frontend/public/favicon/android-icon-192x192.png
417 | # target: _blank
418 |
419 | # - name: Chronograf
420 | # subtitle: "Metrics visualizations"
421 | # url: http://chronograf.falcon.nt
422 | # logo: assets/third-party/homer-icons/png/chronograf.png
423 | # target: _blank
424 |
425 | # - name: InfluxDB
426 | # subtitle: "Modern metrics recorder"
427 | # url: http://influxdb.falcon.nt
428 | # logo: assets/custom/influxdb.png
429 | # target: _blank
430 |
431 | # - name: Cockpit
432 | # subtitle: "Server manager"
433 | # url: http://cockpit.falcon.nt:9090/
434 | # logo: assets/third-party/homer-icons/png/cockpit.png
435 | # target: _blank
436 |
437 |
--------------------------------------------------------------------------------
/systemd/mfs-media.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description = mergerFS media combined mount
3 |
4 | [Service]
5 | Type = forking
6 |
7 | ExecStart = mergerfs \
8 | /opt/media-files=RW,6G:/mnt/D2/media:/mnt/HG500/media \
9 | /mnt/mfs-media \
10 | -o category.create=mfs,category.action=all \
11 | -o func.getattr=newest,fsname=mfs-media \
12 | -o dropcacheonclose=true,cache.files=partial
13 |
14 | ExecStop = umount -v /mnt/mfs-media
15 |
16 | [Install]
17 | WantedBy = default.target
--------------------------------------------------------------------------------