├── 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 | ![Cloudflare Gateway DNS](https://user-images.githubusercontent.com/19761269/187674721-02be2231-9b3d-4eef-b3d7-08de09b8794e.png) 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 --------------------------------------------------------------------------------