├── .env.example ├── .github └── workflows │ └── lint.yml ├── .gitignore ├── Caddyfile ├── README.md ├── caddy.Dockerfile ├── docker-compose.yml ├── frigate └── config.yml ├── homeassistant ├── .gitignore ├── README.md ├── automations.yaml ├── configuration.yaml ├── go2rtc.yaml ├── groups.yaml ├── scenes.yaml ├── scripts.yaml └── secrets.sample.yaml ├── homepage └── config │ ├── docker.yaml │ ├── services.yaml │ ├── settings.yaml │ └── widgets.yaml ├── huginn.Dockerfile ├── plex-meta-manager └── martins.yml ├── plextraktsync └── config.yml ├── recyclarr └── recyclarr.yml ├── romm └── config │ └── config.yml └── scrutiny └── config └── collector.yaml /.env.example: -------------------------------------------------------------------------------- 1 | # dotenv-linter:off UnorderedKey 2 | 3 | PUID=1027 # 'docker' user 4 | PGID=100 5 | TZ=America/New_York 6 | PLEX_CLAIM= 7 | DOCKER_CONF_DIR=/volume1/docker/appdata 8 | DOCKER_DATA_DIR=/volume1/data 9 | DOCKER_MEDIA_DIR=/volume1/data/media 10 | DOCKER_TORRENTS_DIR=/volume1/data/downloads/torrents 11 | DOCKER_DOWNLOADS_DIR=/volume1/data/downloads 12 | STATIC_IP= 13 | TRANSMISSION_USERNAME= 14 | TRANSMISSION_PASSWORD= 15 | SONARR_API_KEY= 16 | RADARR_API_KEY= 17 | LIDARR_API_KEY= 18 | 19 | # For caddy 20 | CLOUDFLARE_API_TOKEN=xyz 21 | CADDY_TLS_EMAIL=you@yourdomain.com 22 | CADDY_HOSTNAME=yourdomain.com 23 | CADDY_HOSTNAME_DNS=dns.yourdomain.com 24 | CADDY_HOSTNAME_HOMEASSISTANT=homeassistant.yourdomain.com 25 | CADDY_HOSTNAME_PLEX=plex.yourdomain.com 26 | CADDY_HOSTNAME_JACKETT=jackett.yourdomain.com 27 | CADDY_HOSTNAME_RADARR=movies.yourdomain.com 28 | CADDY_HOSTNAME_LIDARR=music.yourdomain.com 29 | CADDY_HOSTNAME_SONARR=tv.yourdomain.com 30 | CADDY_HOSTNAME_BAZARR=subtitles.yourdomain.com 31 | CADDY_HOSTNAME_HUGINN=h.yourdomain.com 32 | CADDY_HOSTNAME_TRANSMISSION=torrents.yourdomain.com 33 | CADDY_HOSTNAME_NAS=nas.yourdomain.com 34 | CADDY_HOSTNAME_TAUTULLI=tautulli.yourdomain.com 35 | 36 | DISCORD_NOTIFICATION_URL= 37 | 38 | HUGINN_TIMEZONE= 39 | HUGINN_EMAIL_FROM_ADDRESS= 40 | HUGINN_SMTP_DOMAIN= 41 | HUGINN_SMTP_PASSWORD= 42 | HUGINN_INVITATION_CODE= 43 | SMTP_USER_NAME= 44 | SMTP_SERVER= 45 | 46 | POSTGRES_PASSWORD= 47 | 48 | WIREGUARD_PRIVATE_KEY= 49 | WIREGUARD_ADDRESSES= 50 | GLUETUN_CITIES= 51 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Lint 3 | 4 | on: 5 | push: 6 | schedule: 7 | - cron: "0 9 * * *" # every day at 9am 8 | 9 | jobs: 10 | super-lint: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v2 15 | with: 16 | fetch-depth: 0 17 | 18 | - name: Lint Code Base 19 | uses: github/super-linter@v4 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | homeassistant-config: 24 | runs-on: ubuntu-latest 25 | 26 | defaults: 27 | run: 28 | working-directory: homeassistant 29 | 30 | steps: 31 | - name: Checkout code 32 | uses: actions/checkout@v2 33 | 34 | - name: Install python 35 | uses: actions/setup-python@v1 36 | with: 37 | python-version: '3.9' 38 | 39 | - name: Install dependencies 40 | run: pip install homeassistant 41 | 42 | - name: Copy secrets 43 | run: mv secrets.sample.yaml secrets.yaml 44 | 45 | - name: Check configuration 46 | run: hass -c . --script check_config 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | * -------------------------------------------------------------------------------- /Caddyfile: -------------------------------------------------------------------------------- 1 | { 2 | admin 0.0.0.0:2019 3 | crowdsec { 4 | api_url http://192.168.1.1:8089 5 | api_key {env.CROWDSEC_API_KEY} 6 | ticker_interval 15s 7 | #disable_streaming 8 | #enable_hard_fails 9 | } 10 | order crowdsec first 11 | } 12 | 13 | *.martinbjeldbak.com { 14 | reverse_proxy { 15 | trusted_proxies private_ranges # TODO: hardcode authentik-server 16 | } 17 | tls { 18 | dns cloudflare { 19 | zone_token {env.CLOUDFLARE_ZONE_TOKEN} 20 | api_token {env.CLOUDFLARE_API_TOKEN} 21 | } 22 | } 23 | log { 24 | output file /data/access-external.log 25 | } 26 | 27 | @invidious host invidious.martinbjeldbak.com 28 | handle @invidious { 29 | reverse_proxy invidious:3000 30 | } 31 | 32 | @dawarich host dawarich.martinbjeldbak.com 33 | handle @dawarich { 34 | reverse_proxy dawarich:3000 35 | } 36 | } 37 | 38 | *.local.martinbjeldbak.com { 39 | reverse_proxy { 40 | trusted_proxies private_ranges # TODO: hardcode authentik-server 41 | } 42 | 43 | tls { 44 | dns cloudflare { 45 | zone_token {env.CLOUDFLARE_ZONE_TOKEN} 46 | api_token {env.CLOUDFLARE_API_TOKEN} 47 | } 48 | } 49 | 50 | log { 51 | output file /data/access-internal.log 52 | } 53 | 54 | @nas host nas.local.martinbjeldbak.com 55 | handle @nas { 56 | reverse_proxy {env.NAS_IP}:5000 57 | 58 | encode gzip 59 | } 60 | 61 | #@huginn host h.local.martinbjeldbak.com 62 | #handle @huginn { 63 | # reverse_proxy huginn:3000 64 | 65 | # encode gzip 66 | #} 67 | 68 | @homeassistant host homeassistant.local.martinbjeldbak.com 69 | handle @homeassistant { 70 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 71 | 72 | forward_auth http://authentik-server:9000 { 73 | uri /outpost.goauthentik.io/auth/caddy 74 | 75 | # capitalization of the headers is important, otherwise they will be empty 76 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version 77 | } 78 | reverse_proxy homeassistant:8123 79 | } 80 | 81 | @tautulli host tautulli.local.martinbjeldbak.com 82 | handle @tautulli { 83 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 84 | 85 | forward_auth http://authentik-server:9000 { 86 | uri /outpost.goauthentik.io/auth/caddy 87 | 88 | # capitalization of the headers is important, otherwise they will be empty 89 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version 90 | } 91 | reverse_proxy tautulli:8181 92 | } 93 | 94 | @esphome host esphome.local.martinbjeldbak.com 95 | handle @esphome { 96 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 97 | 98 | forward_auth http://authentik-server:9000 { 99 | uri /outpost.goauthentik.io/auth/caddy 100 | 101 | # capitalization of the headers is important, otherwise they will be empty 102 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlementp X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 103 | } 104 | 105 | reverse_proxy esphome:6052 106 | } 107 | 108 | @speedtest host speedtest.local.martinbjeldbak.com 109 | handle @speedtest { 110 | # always forward outpost path to actual outpost 111 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 112 | 113 | # forward authentication to outpost 114 | forward_auth http://authentik-server:9000 { 115 | uri /outpost.goauthentik.io/auth/caddy 116 | 117 | # capitalization of the headers is important, otherwise they will be empty 118 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 119 | } 120 | 121 | reverse_proxy speedtest-tracker:80 122 | } 123 | 124 | @tv host tv.local.martinbjeldbak.com 125 | handle @tv { 126 | # always forward outpost path to actual outpost 127 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 128 | 129 | # forward authentication to outpost 130 | forward_auth http://authentik-server:9000 { 131 | uri /outpost.goauthentik.io/auth/caddy 132 | 133 | # capitalization of the headers is important, otherwise they will be empty 134 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 135 | } 136 | 137 | reverse_proxy sonarr:8989 138 | } 139 | 140 | @movies host movies.local.martinbjeldbak.com 141 | handle @movies { 142 | # always forward outpost path to actual outpost 143 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 144 | 145 | # forward authentication to outpost 146 | forward_auth http://authentik-server:9000 { 147 | uri /outpost.goauthentik.io/auth/caddy 148 | 149 | # capitalization of the headers is important, otherwise they will be empty 150 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 151 | } 152 | 153 | reverse_proxy radarr:7878 154 | } 155 | 156 | @torrents host torrents.local.martinbjeldbak.com 157 | handle @torrents { 158 | # always forward outpost path to actual outpost 159 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 160 | 161 | # forward authentication to outpost 162 | forward_auth http://authentik-server:9000 { 163 | uri /outpost.goauthentik.io/auth/caddy 164 | 165 | # capitalization of the headers is important, otherwise they will be empty 166 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 167 | } 168 | 169 | reverse_proxy gluetun:9091 170 | } 171 | 172 | @slzb-06m host slzb-06m.local.martinbjeldbak.com 173 | handle @slzb-06m { 174 | # always forward outpost path to actual outpost 175 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 176 | 177 | # forward authentication to outpost 178 | forward_auth http://authentik-server:9000 { 179 | uri /outpost.goauthentik.io/auth/caddy 180 | 181 | # capitalization of the headers is important, otherwise they will be empty 182 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 183 | } 184 | 185 | reverse_proxy {env.SLZB06M_IP}:80 186 | } 187 | 188 | @dns host dns.local.martinbjeldbak.com 189 | handle @dns { 190 | # always forward outpost path to actual outpost 191 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 192 | 193 | # forward authentication to outpost 194 | forward_auth http://authentik-server:9000 { 195 | uri /outpost.goauthentik.io/auth/caddy 196 | 197 | # capitalization of the headers is important, otherwise they will be empty 198 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 199 | } 200 | 201 | reverse_proxy 192.168.1.1:3000 202 | } 203 | 204 | @dns2 host dns2.local.martinbjeldbak.com 205 | handle @dns2 { 206 | # always forward outpost path to actual outpost 207 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 208 | 209 | # forward authentication to outpost 210 | forward_auth http://authentik-server:9000 { 211 | uri /outpost.goauthentik.io/auth/caddy 212 | 213 | # capitalization of the headers is important, otherwise they will be empty 214 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 215 | } 216 | 217 | reverse_proxy adguardhome:3000 218 | } 219 | 220 | @prowlarr host prowlarr.local.martinbjeldbak.com 221 | handle @prowlarr { 222 | # always forward outpost path to actual outpost 223 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 224 | 225 | # forward authentication to outpost 226 | forward_auth http://authentik-server:9000 { 227 | uri /outpost.goauthentik.io/auth/caddy 228 | 229 | # capitalization of the headers is important, otherwise they will be empty 230 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 231 | } 232 | 233 | reverse_proxy gluetun:9696 234 | } 235 | 236 | @subtitles host subtitles.local.martinbjeldbak.com 237 | handle @subtitles { 238 | # always forward outpost path to actual outpost 239 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 240 | 241 | # forward authentication to outpost 242 | forward_auth http://authentik-server:9000 { 243 | uri /outpost.goauthentik.io/auth/caddy 244 | 245 | # capitalization of the headers is important, otherwise they will be empty 246 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 247 | } 248 | 249 | reverse_proxy bazarr:6767 250 | } 251 | 252 | @dozzle host dozzle.local.martinbjeldbak.com 253 | handle @dozzle { 254 | # always forward outpost path to actual outpost 255 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 256 | 257 | # forward authentication to outpost 258 | forward_auth http://authentik-server:9000 { 259 | uri /outpost.goauthentik.io/auth/caddy 260 | 261 | copy_headers Remote-User Remote-Email Remote-Name Remote-Filter 262 | } 263 | 264 | reverse_proxy dozzle:8080 265 | } 266 | 267 | @calibre-web host calibre-web.local.martinbjeldbak.com 268 | handle @calibre-web { 269 | # always forward outpost path to actual outpost 270 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 271 | 272 | # forward authentication to outpost 273 | forward_auth http://authentik-server:9000 { 274 | uri /outpost.goauthentik.io/auth/caddy 275 | 276 | # capitalization of the headers is important, otherwise they will be empty 277 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 278 | } 279 | 280 | reverse_proxy calibre-web:8083 281 | } 282 | 283 | @syncthing host syncthing.local.martinbjeldbak.com 284 | handle @syncthing { 285 | # always forward outpost path to actual outpost 286 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 287 | 288 | # forward authentication to outpost 289 | forward_auth http://authentik-server:9000 { 290 | uri /outpost.goauthentik.io/auth/caddy 291 | 292 | # capitalization of the headers is important, otherwise they will be empty 293 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 294 | } 295 | 296 | reverse_proxy syncthing:8384 297 | } 298 | 299 | @readarr host readarr.local.martinbjeldbak.com 300 | handle @readarr { 301 | # always forward outpost path to actual outpost 302 | reverse_proxy /outpost.goauthentik.io/* http://authentik-server:9000 303 | 304 | # forward authentication to outpost 305 | forward_auth http://authentik-server:9000 { 306 | uri /outpost.goauthentik.io/auth/caddy 307 | 308 | # capitalization of the headers is important, otherwise they will be empty 309 | copy_headers X-Authentik-Username X-Authentik-Groups X-Authentik-Entitlements X-Authentik-Email X-Authentik-Name X-Authentik-Uid X-Authentik-Jwt X-Authentik-Meta-Jwks X-Authentik-Meta-Outpost X-Authentik-Meta-Provider X-Authentik-Meta-App X-Authentik-Meta-Version Authorization 310 | } 311 | 312 | reverse_proxy readarr:8787 313 | } 314 | 315 | @unifi host unifi.local.martinbjeldbak.com 316 | handle @unifi { 317 | reverse_proxy https://192.168.1.1:8443 { 318 | transport http { 319 | tls_insecure_skip_verify 320 | } 321 | } 322 | 323 | encode gzip 324 | } 325 | 326 | @router host opnsense.local.martinbjeldbak.com 327 | handle @router { 328 | reverse_proxy https://192.168.1.1:443 { 329 | transport http { 330 | tls_insecure_skip_verify 331 | } 332 | } 333 | 334 | encode gzip 335 | } 336 | 337 | #@pterodactyllocal host panel.local.martinbjeldbak.com 338 | #handle @pterodactyllocal { 339 | # reverse_proxy panel:80 340 | 341 | # encode gzip 342 | #} 343 | 344 | #@pterodactylmartin host node-martin.local.martinbjeldbak.com 345 | #handle @pterodactylmartin { 346 | # reverse_proxy 192.168.1.14:443 347 | 348 | # encode gzip 349 | #} 350 | 351 | @elmbot host elmbot.local.martinbjeldbak.com 352 | handle @elmbot { 353 | reverse_proxy elmbot:54377 354 | 355 | encode gzip 356 | } 357 | 358 | @autobrr host autobrr.local.martinbjeldbak.com 359 | handle @autobrr { 360 | reverse_proxy autobrr:7474 361 | 362 | encode gzip 363 | } 364 | 365 | @epicgames host epicgames.local.martinbjeldbak.com 366 | handle @epicgames { 367 | reverse_proxy epicgames-freegames:3000 368 | 369 | encode gzip 370 | } 371 | 372 | @plex host plex.local.martinbjeldbak.com 373 | handle @plex { 374 | reverse_proxy plex:32400 375 | 376 | encode gzip 377 | } 378 | 379 | @invidious host invidious.local.martinbjeldbak.com 380 | handle @invidious { 381 | reverse_proxy invidious:3000 382 | 383 | encode gzip 384 | } 385 | 386 | @scrypted host scrypted.local.martinbjeldbak.com 387 | handle @scrypted { 388 | reverse_proxy scrypted:11080 389 | 390 | encode gzip 391 | } 392 | 393 | @request host request.local.martinbjeldbak.com 394 | handle @request { 395 | reverse_proxy overseerr:5055 396 | 397 | encode gzip 398 | } 399 | 400 | @homepage host homepage.local.martinbjeldbak.com 401 | handle @homepage { 402 | reverse_proxy homepage:3000 403 | 404 | encode gzip 405 | } 406 | 407 | @peanut host peanut-eaton-5e-1100i.local.martinbjeldbak.com 408 | handle @peanut { 409 | reverse_proxy peanut-eaton-5e-1100i:8080 410 | 411 | encode gzip 412 | } 413 | 414 | @scrutiny host scrutiny.local.martinbjeldbak.com 415 | handle @scrutiny { 416 | reverse_proxy scrutiny-web:8080 417 | 418 | encode gzip 419 | } 420 | 421 | @paperless host paperless.local.martinbjeldbak.com 422 | handle @paperless { 423 | reverse_proxy paperless:8000 424 | 425 | encode gzip 426 | } 427 | 428 | @roms host roms.local.martinbjeldbak.com 429 | handle @roms { 430 | reverse_proxy romm:8080 431 | 432 | encode gzip 433 | } 434 | 435 | @icloudpd-n host icloudpd-n.local.martinbjeldbak.com 436 | handle @icloudpd-n { 437 | reverse_proxy icloudpd-n:8080 438 | 439 | encode gzip 440 | } 441 | 442 | # Forward proxy auth breaks websocket auth 443 | @zigbee2mqtt host zigbee2mqtt.local.martinbjeldbak.com 444 | handle @zigbee2mqtt { 445 | reverse_proxy zigbee2mqtt:8080 446 | 447 | encode gzip 448 | } 449 | 450 | # OAuth support: https://github.com/Freika/dawarich/discussions/66 451 | @dawarich host dawarich.local.martinbjeldbak.com 452 | handle @dawarich { 453 | reverse_proxy dawarich:3000 454 | 455 | encode gzip 456 | } 457 | 458 | @lubelogger host lubelogger.local.martinbjeldbak.com 459 | handle @lubelogger { 460 | reverse_proxy lubelogger:8080 461 | 462 | encode gzip 463 | } 464 | 465 | @calibre host calibre.local.martinbjeldbak.com 466 | handle @calibre { 467 | reverse_proxy calibre:8080 468 | 469 | encode gzip 470 | } 471 | 472 | @calibre-server host calibre-server.local.martinbjeldbak.com 473 | handle @calibre-server { 474 | reverse_proxy calibre:8081 475 | 476 | encode gzip 477 | } 478 | 479 | @immich host immich.local.martinbjeldbak.com 480 | handle @immich { 481 | reverse_proxy immich-server:2283 482 | 483 | encode gzip 484 | } 485 | 486 | @authentik host auth.local.martinbjeldbak.com 487 | handle @authentik { 488 | reverse_proxy authentik-server:9000 489 | 490 | encode gzip 491 | } 492 | 493 | @thelounge host thelounge.local.martinbjeldbak.com 494 | handle @thelounge { 495 | reverse_proxy thelounge:9000 496 | 497 | encode gzip 498 | } 499 | 500 | 501 | # REMEMBER TO ADD HOSTS TO UNBOUND 502 | 503 | # Fallback for otherwise unhandled domains 504 | handle { 505 | abort 506 | } 507 | } 508 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Martin's Self-hosting setup 2 | [![Lint](https://github.com/martinbjeldbak/self-hosting/actions/workflows/lint.yml/badge.svg)](https://github.com/martinbjeldbak/self-hosting/actions/workflows/lint.yml) 3 | 4 | Inspired by Ben Balter's [blog](https://ben.balter.com/2020/12/04/over-engineered-home-network-for-privacy-and-security/) [posts](https://ben.balter.com/2021/09/01/how-i-re-over-engineered-my-home-network/) and his repository [benbalter/pi-hole-cloudflared-docker-compose-ansible-caddy](https://github.com/benbalter/pi-hole-cloudflared-docker-compose-ansible-caddy) and 5 | 6 | ```mermaid 7 | flowchart TD 8 | subgraph HTPC/Download Server 9 | subgraph *arrs 10 | direction TB 11 | S[Sonarr] 12 | R[Radarr] 13 | end 14 | *arrs-->J 15 | 16 | *arrs-->TM[Transmission] 17 | TM-->O[Wireguard\nClient] 18 | TM-.->D[Download\ndirectory] 19 | D<-.->L[Library\ndirectory] 20 | P[Plex Media\nServer]-->L 21 | *arrs-.-> L & D 22 | PTS[plextraktsync]-->P 23 | PMM[plex-meta-manager]-->P 24 | TAUT[Tautulli]-->P 25 | BARR[Bazarr]-->*arrs 26 | U[Unpackerr]-->*arrs 27 | end 28 | 29 | J[Jackett]-->T[Torrent\nindexers] 30 | O-->V[VPN Server] 31 | V-->B[Bittorrent\nPeers] 32 | 33 | subgraph media metadata 34 | PTS-->TR[Trakt.tv] 35 | PMM-->TR 36 | PMM-->RT[Rotten\nTomatoes] 37 | PMM-->IMDB[IMDb] 38 | PMM-->*arrs 39 | PMM-->TMDB[tMDB] 40 | end 41 | 42 | subgraph subtitle providers 43 | BARR-->OS[Opensubtitles] 44 | BARR-->addic7ed 45 | BARR-->subscene 46 | BARR-->podnapisi 47 | end 48 | 49 | subgraph other 50 | AH[AdGuard\nHome] 51 | H[Huginn] 52 | HA[Home\nAssistant] 53 | C[Caddy] 54 | W[Watchtower] 55 | PG[Postgres] 56 | 57 | H-->PG 58 | end 59 | 60 | W-->DISCORD[Discord] 61 | 62 | C-->AH 63 | C-->HA 64 | C-->P 65 | C-->J 66 | C-->R 67 | C-->S 68 | C-->TM 69 | C-->BARR 70 | C-->H 71 | C-->TAUT 72 | 73 | linkStyle 3,4,5,6,7 stroke:blue; 74 | classDef internet stroke:#f66; 75 | classDef folder stroke:blue,fill:none,stroke-dasharray: 5 5; 76 | class L,D folder 77 | class T,V,B,TR,RT,IMDB,OS,addic7ed,subscene,podnapisi,DISCORD,TMDB internet 78 | ``` 79 | 80 | * [Adguard Home](https://github.com/AdguardTeam/AdGuardHome) - self-hosted DNS server with ad-blocking 81 | * [Plex Media Server](https://www.plex.tv) - connects to my Synology NAS and hosts database 82 | * [PlexTraktSync](https://github.com/Taxel/PlexTraktSync) - syncs library and watch status to Trakt.tv 83 | * [Plex Meta Manager](https://metamanager.wiki/en/latest/) - maintains Plex collections and playlists from configuration files 84 | * [Tautulli](https://tautulli.com/) - UI to monitor Plex statistics 85 | * [Home Assistant](https://www.home-assistant.io) - integrates all my IoT devices 86 | * [Transmission](https://transmissionbt.com) - torrent client used by Radarr and Sonarr to fetch media 87 | * [Radarr](https://radarr.video) - monitor & download movies 88 | * [Sonarr](https://sonarr.tv) - monitor & download TV shows 89 | * [Lidarr](https://lidarr.audio) - monitor & download albums 90 | * [Bazarr](https://github.com/morpheus65535/bazarr) - fetch subtitles for Sonarr and Radarr 91 | * [Jackett](https://github.com/Jackett/Jackett) - proxy supporting private torrent tracker integration with Radarr, Sonarr, Lidarr 92 | * [Unpackerr](https://github.com/davidnewhall/unpackerr) - extracts files for Radarr, Sonarr, Lidarr 93 | * [Caddy](https://caddyserver.com) - reverse proxy server 94 | * [Gluetun](https://github.com/qdm12/gluetun) - VPN client with Wireguard support. Transmission and Jackett connections are tunneled through this 95 | * [Watchtower](https://containrrr.dev/watchtower/) - check for container updates nightly 96 | * [Huginn](https://github.com/huginn/huginn) - allows configuring agents 97 | * [PostgreSQL](https://www.postgresql.org/) - for any apps that need a database. Huginn only at the moment 98 | 99 | all of these services are managed via docker using docker-compose. 100 | 101 | Once running, many need to be configured via their UIs. In my case, volume folders are backed up using Synology Hyper Backup to Backblaze B2. 102 | -------------------------------------------------------------------------------- /caddy.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM caddy:2.9.1-builder AS builder 2 | 3 | RUN xcaddy build \ 4 | --with github.com/caddy-dns/cloudflare \ 5 | --with github.com/hslatman/caddy-crowdsec-bouncer/http 6 | 7 | FROM caddy:2.9.0 8 | 9 | COPY --from=builder /usr/bin/caddy /usr/bin/caddy 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | x-env: &env 3 | PUID: ${PUID} 4 | PGID: ${PGID} 5 | TZ: ${TZ} 6 | # UMASK: 022 7 | 8 | services: 9 | adguardhome: 10 | image: adguard/adguardhome 11 | container_name: adguardhome 12 | ports: 13 | - 53:53/tcp # plain DNS 14 | - 53:53/udp # plain DNS 15 | expose: 16 | - 3000 17 | networks: 18 | macvlan: 19 | ipv4_address: 192.168.10.15 20 | frontend: 21 | ipv4_address: 172.20.0.98 22 | backend: # for access from sync 23 | environment: 24 | <<: *env 25 | volumes: 26 | - ./adguardhome/work:/opt/adguardhome/work 27 | - ./adguardhome/conf:/opt/adguardhome/conf 28 | - /etc/localtime:/etc/localtime:ro 29 | restart: unless-stopped 30 | 31 | homeassistant: 32 | image: ghcr.io/home-assistant/home-assistant:stable 33 | container_name: homeassistant 34 | # depends_on: 35 | # - mqtt 36 | # - zigbee2mqtt 37 | expose: 38 | - 8123 # UI 39 | networks: 40 | frontend: 41 | ipv4_address: 172.20.0.201 # static ip for NUT. Allowlisted on Synology NAS, access to mqtt 42 | macvlan: 43 | ipv4_address: 192.168.10.16 # enable homekit & WOL functionality 44 | environment: 45 | <<: *env 46 | volumes: 47 | - ./homeassistant:/config 48 | - /etc/localtime:/etc/localtime:ro 49 | - /var/run/docker.sock:/var/run/docker.sock 50 | restart: always 51 | 52 | mqtt: 53 | container_name: mqtt 54 | networks: 55 | - frontend 56 | environment: 57 | <<: *env 58 | image: eclipse-mosquitto 59 | restart: unless-stopped 60 | volumes: 61 | - /etc/localtime:/etc/localtime:ro 62 | - ./mqtt/data:/mosquitto 63 | command: mosquitto -c /mosquitto-no-auth.conf 64 | 65 | zigbee2mqtt: 66 | image: koenkk/zigbee2mqtt 67 | user: ${PUID}:${PGID} 68 | container_name: zigbee2mqtt 69 | privileged: true 70 | networks: 71 | iot_macvlan: 72 | ipv4_address: 192.168.30.101 73 | frontend: # expose ui, connect to mqtt 74 | expose: 75 | - 8080 # frontend port 76 | environment: 77 | <<: *env 78 | Z2M_WATCHDOG: default # been needing to restart container 79 | restart: unless-stopped 80 | volumes: 81 | - /etc/localtime:/etc/localtime:ro 82 | - ./zigbee2mqtt/data:/app/data 83 | 84 | plex: 85 | image: ghcr.io/linuxserver/plex 86 | container_name: plex 87 | restart: unless-stopped 88 | ports: 89 | # Source: https://support.plex.tv/articles/201543147-what-network-ports-do-i-need-to-allow-through-my-firewall/ 90 | #- 1900:1900/udp # access to the Plex DLNA Server # NOTE: already in use 91 | - 32400:32400/tcp # access to the Plex Media Server 92 | - 32410:32410/udp # current GDM network discovery 93 | - 32412:32412/udp # current GDM network discovery 94 | - 32413:32413/udp # current GDM network discovery 95 | - 32414:32414/udp # current GDM network discovery 96 | - 32469:32469/tcp # access to the Plex DLNA Server 97 | networks: 98 | - frontend 99 | - backend 100 | environment: 101 | VERSION: docker 102 | PLEX_CLAIM: ${PLEX_CLAIM} 103 | <<: *env 104 | volumes: 105 | - ./plex/database:/config 106 | - ./plex/transcode:/transcode 107 | - ${DOCKER_MEDIA_DIR}:/data 108 | devices: 109 | - /dev/dri:/dev/dri # Synology w/ Intel CPU for hardware encoding 110 | 111 | # NOTE: this is a once-off task and runs using cron in synology "Tasks" section 112 | plextraktsync: 113 | image: ghcr.io/taxel/plextraktsync 114 | command: sync 115 | container_name: plextraktsync 116 | networks: 117 | - backend 118 | volumes: 119 | - ./plextraktsync:/app/config 120 | depends_on: 121 | - plex 122 | environment: 123 | <<: *env 124 | 125 | # NOTE: this is a once-off task and runs using cron in synology "Tasks" section 126 | kometa: 127 | image: kometateam/kometa 128 | container_name: kometa 129 | command: --run 130 | networks: 131 | - backend 132 | restart: "no" 133 | environment: 134 | PMM_NO_MISSING: 'true' 135 | volumes: 136 | - ./plex-meta-manager:/config 137 | depends_on: 138 | - plex 139 | 140 | radarr: 141 | image: ghcr.io/linuxserver/radarr 142 | container_name: radarr 143 | expose: 144 | - 7878 145 | restart: unless-stopped 146 | networks: 147 | frontend: 148 | ipv4_address: 172.20.0.101 # for access from prowlarr 149 | backend: 150 | environment: 151 | <<: *env 152 | volumes: 153 | - ./radarr:/config 154 | - ${DOCKER_DATA_DIR}:/data 155 | 156 | sonarr: 157 | image: ghcr.io/linuxserver/sonarr 158 | networks: 159 | frontend: 160 | ipv4_address: 172.20.0.102 # for access from prowlarr 161 | backend: 162 | container_name: sonarr 163 | expose: 164 | - 8989 165 | environment: 166 | <<: *env 167 | restart: unless-stopped 168 | volumes: 169 | - ./sonarr:/config 170 | - ${DOCKER_DATA_DIR}:/data 171 | 172 | readarr: 173 | image: lscr.io/linuxserver/readarr:develop 174 | networks: 175 | frontend: 176 | ipv4_address: 172.20.0.100 # for access from prowlarr 177 | backend: 178 | container_name: readarr 179 | expose: 180 | - 8787 # web UI 181 | environment: 182 | <<: *env 183 | restart: unless-stopped 184 | volumes: 185 | - ./readarr:/config 186 | - ${DOCKER_DATA_DIR}:/data 187 | 188 | tautulli: 189 | image: ghcr.io/linuxserver/tautulli 190 | networks: 191 | - frontend 192 | container_name: tautulli 193 | restart: unless-stopped 194 | volumes: 195 | - ./tautulli:/config 196 | environment: 197 | <<: *env 198 | expose: 199 | - 8181 # UI 200 | 201 | bazarr: # subtitles 202 | image: lscr.io/linuxserver/bazarr 203 | networks: 204 | - frontend 205 | container_name: bazarr 206 | environment: 207 | <<: *env 208 | # UMASK: # reset this, for some reason it prevents start 209 | expose: 210 | - 6767 211 | restart: unless-stopped 212 | volumes: 213 | - ./bazarr:/config 214 | - ${DOCKER_MEDIA_DIR}:/data/media 215 | 216 | gluetun: 217 | image: qmcgaw/gluetun 218 | networks: 219 | - frontend 220 | container_name: gluetun 221 | restart: always 222 | cap_add: 223 | - NET_ADMIN 224 | devices: 225 | - /dev/net/tun:/dev/net/tun 226 | volumes: 227 | - ./gluetun:/gluetun # for mullvad servers 228 | environment: 229 | <<: *env 230 | VPN_SERVICE_PROVIDER: airvpn 231 | VPN_TYPE: wireguard 232 | WIREGUARD_PRIVATE_KEY: ${GLUETUN_WIREGUARD_PRIVATE_KEY} 233 | WIREGUARD_PRESHARED_KEY: ${GLUETUN_WIREGUARD_PRESHARED_KEY} 234 | WIREGUARD_ADDRESSES: ${GLUETUN_WIREGUARD_ADDRESSES} 235 | SERVER_REGIONS: ${GLUETUN_REGIONS} 236 | FIREWALL_VPN_INPUT_PORTS: ${GLUETUN_INPUT_PORTS} 237 | UPDATER_PERIOD: 48h # update servers.json 238 | expose: 239 | - 9091 # transmission UI 240 | - 9696 # Prowlarr 241 | - 8000 # http control server, used by homepage 242 | labels: 243 | - com.centurylinklabs.watchtower.enable=false 244 | security_opt: 245 | - no-new-privileges:true 246 | 247 | transmission: 248 | image: ghcr.io/linuxserver/transmission 249 | container_name: transmission 250 | restart: unless-stopped 251 | network_mode: "service:gluetun" 252 | environment: 253 | USER: ${TRANSMISSION_USERNAME} 254 | PASS: ${TRANSMISSION_PASSWORD} 255 | <<: *env 256 | volumes: 257 | - ./transmission:/config 258 | - ${DOCKER_TORRENTS_DIR}:/data/downloads/torrents 259 | - ${DOCKER_TORRENTS_DIR}/watch:/watch 260 | 261 | caddy: 262 | build: 263 | context: . 264 | dockerfile: caddy.Dockerfile 265 | network: host 266 | container_name: caddy 267 | ports: 268 | - 443:443 269 | - 80:80 270 | expose: 271 | - 2019 # admin port 272 | - 443 # all the https 273 | networks: 274 | - frontend 275 | restart: unless-stopped 276 | environment: 277 | <<: *env 278 | CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN} 279 | CLOUDFLARE_ZONE_TOKEN: ${CLOUDFLARE_ZONE_TOKEN} 280 | CROWDSEC_API_KEY: ${CROWDSEC_API_KEY} 281 | NAS_IP: ${STATIC_IP} 282 | SLZB06M_IP: ${SLZB06M_IP} 283 | TLS_EMAIL: ${CADDY_TLS_EMAIL} 284 | volumes: 285 | - ./Caddyfile:/etc/caddy/Caddyfile:ro 286 | - ./caddy/config:/config 287 | - ./caddy/data:/data 288 | healthcheck: 289 | test: ["CMD", "caddy", "version"] 290 | 291 | #watchtower: 292 | # image: containrrr/watchtower 293 | # container_name: watchtower 294 | # restart: unless-stopped 295 | # volumes: 296 | # - /var/run/docker.sock:/var/run/docker.sock 297 | # - /etc/localtime:/etc/localtime:ro 298 | # expose: 299 | # - 8080 # https://containrrr.dev/watchtower/metrics/ 300 | # environment: 301 | # WATCHTOWER_NOTIFICATIONS: shoutrrr 302 | # WATCHTOWER_NOTIFICATION_URL: ${DISCORD_NOTIFICATION_URL} 303 | # WATCHTOWER_REMOVE_VOLUMES: true 304 | # WATCHTOWER_CLEANUP: true 305 | # WATCHTOWER_INCLUDE_STOPPED: true 306 | # WATCHTOWER_REVIVE_STOPPED: true 307 | # WATCHTOWER_SCHEDULE: 0 0 2 * * * 308 | # WATCHTOWER_HTTP_API_METRICS: true 309 | # WATCHTOWER_HTTP_API_TOKEN: ${WATCHTOWER_API_TOKEN} 310 | # WATCHTOWER_MONITOR_ONLY: true # so many broken upgrades! 311 | 312 | #huginn-postgres: 313 | # image: postgres:14.6-alpine 314 | # container_name: huginn-postgres 315 | # restart: unless-stopped 316 | # volumes: 317 | # - ./huginn-postgres:/var/lib/postgresql/data 318 | # environment: 319 | # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 320 | # networks: 321 | # - backend 322 | 323 | #huginn: 324 | # image: ghcr.io/huginn/huginn 325 | # container_name: huginn 326 | # restart: unless-stopped 327 | # expose: 328 | # - 3000 329 | # networks: 330 | # - frontend 331 | # - backend 332 | # environment: 333 | # TIMEZONE: ${HUGINN_TIMEZONE} 334 | # EMAIL_FROM_ADDRESS: ${HUGINN_EMAIL_FROM_ADDRESS} 335 | # SMTP_DOMAIN: ${HUGINN_SMTP_DOMAIN} 336 | # SMTP_PASSWORD: ${HUGINN_SMTP_PASSWORD} 337 | # INVITATION_CODE: ${HUGINN_INVITATION_CODE} 338 | # SMTP_USER_NAME: ${SMTP_USER_NAME} 339 | # SMTP_SERVER: ${SMTP_SERVER} 340 | # SMTP_PORT: 465 341 | # SMTP_SSL: 'true' 342 | # SMTP_AUTHENTICATION: plain 343 | # ENABLE_INSECURE_AGENTS: 'true' # trust all users 344 | # DATABASE_ADAPTER: postgresql 345 | # DATABASE_USERNAME: postgres 346 | # DATABASE_PASSWORD: ${POSTGRES_PASSWORD} 347 | # DATABASE_HOST: huginn-postgres 348 | # depends_on: 349 | # - huginn-postgres 350 | 351 | prowlarr: 352 | image: ghcr.io/linuxserver/prowlarr:latest 353 | container_name: prowlarr 354 | network_mode: "service:gluetun" 355 | restart: unless-stopped 356 | environment: 357 | <<: *env 358 | volumes: 359 | - ./prowlarr:/config 360 | 361 | recyclarr: 362 | image: ghcr.io/recyclarr/recyclarr 363 | container_name: recyclarr 364 | restart: unless-stopped 365 | user: ${PUID}:${PGID} 366 | networks: 367 | - backend 368 | volumes: 369 | - ./recyclarr:/config 370 | environment: 371 | <<: *env 372 | RECYCLARR_CREATE_CONFIG: "true" 373 | CRON_SCHEDULE: "@daily" 374 | RADARR_API_KEY: ${RADARR_API_KEY} 375 | RADARR_BASE_URL: http://radarr:7878 376 | SONARR_API_KEY: ${SONARR_API_KEY} 377 | SONARR_BASE_URL: http://sonarr:8989 378 | 379 | 380 | 381 | # NOTE: this is a once-off task and runs using cron in synology "Tasks" section 382 | adguardhome-sync: 383 | image: ghcr.io/bakito/adguardhome-sync 384 | container_name: adguardhome-sync 385 | command: run 386 | environment: 387 | LOG_LEVEL: "info" 388 | ORIGIN_URL: "http://192.168.1.1:3000" 389 | ORIGIN_USERNAME: ${ADGUARD_HOME_ORIGIN_USERNAME} 390 | ORIGIN_PASSWORD: ${ADGUARD_HOME_ORIGIN_PASSWORD} 391 | REPLICA_URL: "http://adguardhome:3000" 392 | REPLICA_USERNAME: ${ADGUARD_HOME_REPLICA_USERNAME} 393 | REPLICA_PASSWORD: ${ADGUARD_HOME_REPLICA_PASSWORD} 394 | CRON: "" # run only once (triggers via Synology tasks) 395 | RUN_ON_START: true 396 | API_PORT: 0 # Disable sync API server 397 | FEATURES_DNS_SERVER_CONFIG: false # replica needs to point to Unbound on router IP, not localhost 398 | networks: 399 | - backend 400 | 401 | acestream-http-proxy: 402 | image: ghcr.io/martinbjeldbak/acestream-http-proxy 403 | container_name: acestream-http-proxy 404 | ports: 405 | - '6878:6878' 406 | networks: 407 | - frontend 408 | 409 | esphome: 410 | container_name: esphome 411 | image: ghcr.io/esphome/esphome 412 | volumes: 413 | - ./esphome/config:/config 414 | - /etc/localtime:/etc/localtime:ro 415 | restart: always 416 | privileged: true 417 | expose: 418 | - 6052 # UI 419 | environment: 420 | ESPHOME_DASHBOARD_USE_PING: true 421 | USERNAME: ${ESPHOME_USERNAME} 422 | PASSWORD: ${ESPHOME_PASSWORD} 423 | networks: 424 | - frontend 425 | 426 | epicgames-freegames: 427 | image: ghcr.io/claabs/epicgames-freegames-node 428 | container_name: epicgames-freegames 429 | restart: unless-stopped 430 | expose: 431 | - 3000 432 | volumes: 433 | # Setting the web portal URL is not supported using env variables, 434 | # mount volume and manually set in config 435 | - ./epicgames-freegames/config:/usr/app/config 436 | environment: 437 | <<: *env 438 | EMAIL: ${SMTP_USER_NAME} 439 | SMTP_HOST: ${SMTP_SERVER} 440 | SMTP_PORT: 465 441 | EMAIL_SENDER_ADDRESS: epicgames@martinbjeldbak.com 442 | EMAIL_SENDER_NAME: Epic Games Captcha 443 | EMAIL_RECIPIENT_ADDRESS: ${SMTP_USER_NAME} 444 | SMTP_SECURE: true 445 | SMTP_USERNAME: ${SMTP_USER_NAME} 446 | SMTP_PASSWORD: ${HUGINN_SMTP_PASSWORD} 447 | RUN_ON_STARTUP: true 448 | CRON_SCHEDULE: 0 0,6,12,18 * * * # (every six hours) 449 | networks: 450 | - frontend 451 | 452 | # scrypted: 453 | # container_name: scrypted 454 | # restart: unless-stopped 455 | # image: ghcr.io/koush/scrypted 456 | # environment: 457 | # SCRYPTED_NVR_VOLUME: /nvr 458 | # SCRYPTED_WEBHOOK_UPDATE_AUTHORIZATION: Bearer ${SCRYPTED_BEARER_TOKEN} 459 | # SCRYPTED_WEBHOOK_UPDATE: http://localhost:10444/v1/update 460 | # volumes: 461 | # - ./scrypted/nvr:/nvr 462 | # - ./scrypted/volume:/server/volume 463 | # logging: 464 | # driver: "json-file" 465 | # options: 466 | # max-size: "10m" 467 | # max-file: "10" 468 | # labels: 469 | # - "com.centurylinklabs.watchtower.scope=scrypted" 470 | # networks: 471 | # macvlan: 472 | # ipv4_address: 192.168.10.17 473 | # frontend: 474 | # expose: 475 | # - 10443 # scrypted https 476 | # - 11080 # scrypted http (used by Caddy) 477 | # - 31797 # homekit port Pan/Tilt 478 | 479 | overseerr: 480 | container_name: overseerr 481 | image: sctx/overseerr 482 | restart: unless-stopped 483 | environment: 484 | <<: *env 485 | networks: 486 | - frontend 487 | expose: 488 | - 5055 489 | volumes: 490 | - ./overseerr/config:/app/config 491 | 492 | plex-auto-languages: 493 | image: remirigal/plex-auto-languages 494 | container_name: plex-auto-languages 495 | environment: 496 | <<: *env 497 | PLEX_TOKEN: ${PLEX_TOKEN} 498 | PLEX_URL: http://plex:32400 499 | networks: 500 | - backend 501 | volumes: 502 | - ./plex-auto-languages/config:/config 503 | 504 | homepage: 505 | image: ghcr.io/gethomepage/homepage 506 | container_name: homepage 507 | expose: 508 | - 3000 509 | networks: 510 | - frontend 511 | - backend 512 | volumes: 513 | - ./homepage/config:/app/config 514 | environment: 515 | <<: *env 516 | HOMEPAGE_VAR_SONARR_API_KEY: ${SONARR_API_KEY} 517 | HOMEPAGE_VAR_PLEX_TOKEN: ${PLEX_TOKEN} 518 | HOMEPAGE_VAR_TAUTULLI_API_KEY: ${TAUTULLI_API_KEY} 519 | HOMEPAGE_VAR_HOMEASSISTANT_ACCESS_TOKEN: ${HOMEASSISTANT_ACCESS_TOKEN} 520 | HOMEPAGE_VAR_OPENWEATHERMAP_API_KEY: ${OPENWEATHERMAP_API_KEY} 521 | HOMEPAGE_VAR_ADGUARD_HOME_ORIGIN_USERNAME: ${ADGUARD_HOME_ORIGIN_USERNAME} 522 | HOMEPAGE_VAR_ADGUARD_HOME_ORIGIN_PASSWORD: ${ADGUARD_HOME_ORIGIN_PASSWORD} 523 | HOMEPAGE_VAR_ADGUARD_HOME_REPLICA_USERNAME: ${ADGUARD_HOME_REPLICA_USERNAME} 524 | HOMEPAGE_VAR_ADGUARD_HOME_REPLICA_PASSWORD: ${ADGUARD_HOME_REPLICA_PASSWORD} 525 | HOMEPAGE_VAR_BAZARR_API_KEY: ${BAZARR_API_KEY} 526 | HOMEPAGE_VAR_CROWDSEC_USERNAME: ${CROWDSEC_USERNAME} 527 | HOMEPAGE_VAR_CROWDSEC_PASSWORD: ${CROWDSEC_PASSWORD} 528 | HOMEPAGE_VAR_SYNOLOGY_STATS_USERNAME: ${SYNOLOGY_STATS_USERNAME} 529 | HOMEPAGE_VAR_SYNOLOGY_STATS_PASSWORD: ${SYNOLOGY_STATS_PASSWORD} 530 | HOMEPAGE_VAR_OPNSENSE_HOMEPAGE_USERNAME: ${OPNSENSE_HOMEPAGE_USERNAME} 531 | HOMEPAGE_VAR_OPNSENSE_HOMEPAGE_PASSWORD: ${OPNSENSE_HOMEPAGE_PASSWORD} 532 | HOMEPAGE_VAR_OVERSEERR_API_KEY: ${OVERSEERR_API_KEY} 533 | HOMEPAGE_VAR_PROWLARR_API_KEY: ${PROWLARR_API_KEY} 534 | HOMEPAGE_VAR_RADARR_API_KEY: ${RADARR_API_KEY} 535 | HOMEPAGE_VAR_TAILSCALE_DEVICE_ID: ${TAILSCALE_DEVICE_ID} 536 | HOMEPAGE_VAR_TAILSCALE_API_KEY: ${TAILSCALE_API_KEY} 537 | HOMEPAGE_VAR_TRANSMISSION_USERNAME: ${TRANSMISSION_USERNAME} 538 | HOMEPAGE_VAR_TRANSMISSION_PASSWORD: ${TRANSMISSION_PASSWORD} 539 | HOMEPAGE_VAR_UNIFI_USERNAME: ${UNIFI_USERNAME} 540 | HOMEPAGE_VAR_UNIFI_PASSWORD: ${UNIFI_PASSWORD} 541 | HOMEPAGE_VAR_UPTIME_ROBOT_HOME_INTERNET_API_KEY: ${UPTIME_ROBOT_HOME_INTERNET_API_KEY} 542 | HOMEPAGE_VAR_WATCHTOWER_API_TOKEN: ${WATCHTOWER_API_TOKEN} 543 | HOMEPAGE_VAR_PAPERLESS_KEY: ${PAPERLESS_KEY} 544 | HOMEPAGE_VAR_ROMM_USERNAME: ${ROMM_USERNAME} 545 | HOMEPAGE_VAR_ROMM_PASSWORD: ${ROMM_PASSWORD} 546 | HOMEPAGE_VAR_CALIBRE_WEB_USERNAME: ${CALIBRE_WEB_USERNAME} 547 | HOMEPAGE_VAR_CALIBRE_WEB_PASSWORD: ${CALIBRE_WEB_PASSWORD} 548 | HOMEPAGE_VAR_GLUETUN_KEY: ${GLUETUN_KEY} 549 | HOMEPAGE_VAR_READARR_API_KEY: ${READARR_API_KEY} 550 | HOMEPAGE_VAR_IMMICH_KEY: ${IMMICH_KEY} 551 | HOMEPAGE_VAR_AUTHENTIK_API_KEY: ${AUTHENTIK_API_KEY} 552 | HOMEPAGE_VAR_ESPHOME_USERNAME: ${ESPHOME_USERNAME} 553 | HOMEPAGE_VAR_ESPHOME_PASSWORD: ${ESPHOME_PASSWORD} 554 | HOMEPAGE_VAR_AUTOBRR_KEY: ${AUTOBRR_HOMEPAGE_KEY} 555 | restart: unless-stopped 556 | 557 | dockerproxy: 558 | image: ghcr.io/tecnativa/docker-socket-proxy 559 | container_name: dockerproxy 560 | environment: 561 | CONTAINERS: 1 # Allow access to viewing containers 562 | SERVICES: 1 # Allow access to viewing services (necessary when using Docker Swarm) 563 | TASKS: 1 # Allow access to viewing tasks (necessary when using Docker Swarm) 564 | # See https://github.com/goauthentik/authentik/discussions/5417#discussioncomment-7710921 565 | POST: 0 # Disallow any POST operations (effectively read-only) 566 | IMAGES: 1 567 | INFO: 1 568 | networks: 569 | - backend 570 | expose: 571 | - 2375 572 | volumes: 573 | - /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only 574 | restart: unless-stopped 575 | 576 | speedtest-tracker: 577 | container_name: speedtest-tracker 578 | image: lscr.io/linuxserver/speedtest-tracker 579 | environment: 580 | <<: *env 581 | APP_KEY: ${SPEEDTEST_TRACKER_APP_KEY} 582 | APP_URL: https://speedtest.local.martinbjeldbak.com 583 | APP_TIMEZONE: ${TZ} 584 | DISPLAY_TIMEZONE: ${TZ} 585 | SPEEDTEST_SCHEDULE: "0 * * * *" # every hour 586 | SPEEDTEST_SERVERS: "25134,14670,12491,13275,60412,18714" 587 | DB_CONNECTION: sqlite 588 | MAIL_MAILER: smtp 589 | MAIL_HOST: ${SMTP_SERVER} 590 | MAIL_PORT: 465 591 | MAIL_USERNAME: ${SMTP_USER_NAME} 592 | MAIL_PASSWORD: ${HUGINN_SMTP_PASSWORD} 593 | MAIL_ENCRYPTION: 'ssl' 594 | MAIL_FROM_ADDRESS: "speedtest-tracker@martinbjeldbak.com" 595 | MAIL_FROM_NAME: "Speedtest Tracker" 596 | expose: 597 | - 80 # http 598 | - 443 # https 599 | restart: unless-stopped 600 | networks: 601 | - frontend 602 | volumes: 603 | - ./speedtest-tracker/config:/config 604 | 605 | peanut-eaton-5e-1100i: 606 | image: brandawg93/peanut 607 | container_name: peanut-eaton-5e-1100i 608 | restart: unless-stopped 609 | expose: 610 | - 8080 # web UI 611 | networks: 612 | frontend: 613 | ipv4_address: 172.20.0.202 # static ip for NUT. Allowlisted on Synology NAS 614 | environment: 615 | NUT_HOST: 172.20.0.1 616 | NUT_PORT: 3493 617 | WEB_PORT: 8080 618 | 619 | scrutiny-influxdb: 620 | image: influxdb:2.2 621 | container_name: scrutiny-influxdb 622 | restart: unless-stopped 623 | expose: 624 | - 8086 625 | volumes: 626 | - ./scrutiny/influxdb:/var/lib/influxdb2 627 | networks: 628 | - backend 629 | healthcheck: 630 | test: ["CMD", "curl", "-f", "http://localhost:8086/health"] 631 | interval: 5s 632 | timeout: 10s 633 | retries: 20 634 | 635 | scrutiny-web: 636 | image: ghcr.io/analogj/scrutiny:master-web 637 | container_name: scrutiny-web 638 | expose: 639 | - 8080 # web ui 640 | volumes: 641 | - ./scrutiny/config:/opt/scrutiny/config 642 | networks: 643 | - frontend 644 | - backend 645 | environment: 646 | SCRUTINY_WEB_INFLUXDB_HOST: 'scrutiny-influxdb' 647 | restart: unless-stopped 648 | depends_on: 649 | scrutiny-influxdb: 650 | condition: service_healthy 651 | healthcheck: 652 | test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] 653 | interval: 5s 654 | timeout: 10s 655 | retries: 20 656 | start_period: 10s 657 | 658 | scrutiny-collector: 659 | image: ghcr.io/analogj/scrutiny:master-collector 660 | container_name: scrutiny-collector 661 | restart: unless-stopped 662 | cap_add: 663 | - SYS_RAWIO 664 | - SYS_ADMIN 665 | volumes: 666 | - '/run/udev:/run/udev:ro' 667 | - ./scrutiny/config:/opt/scrutiny/config 668 | networks: 669 | - backend 670 | environment: 671 | COLLECTOR_API_ENDPOINT: 'http://scrutiny-web:8080' 672 | COLLECTOR_HOST_ID: 'synology-ds-920' 673 | depends_on: 674 | scrutiny-web: 675 | condition: service_healthy 676 | devices: 677 | - "/dev/nvme0n1" 678 | - "/dev/sata1" 679 | - "/dev/sata2" 680 | - "/dev/sata3" 681 | - "/dev/sata4" 682 | 683 | paperless: 684 | container_name: paperless 685 | image: ghcr.io/paperless-ngx/paperless-ngx:latest 686 | restart: unless-stopped 687 | networks: 688 | - frontend 689 | - backend 690 | expose: 691 | - 8000 # UI 692 | security_opt: 693 | - no-new-privileges:true 694 | depends_on: 695 | - paperless-postgres 696 | - paperless-redis 697 | - tika 698 | - gotenberg 699 | volumes: 700 | - ./paperless/paperless:/usr/src/paperless/data # container data 701 | - ./paperless/paperless:/usr/src/paperless/media # documents 702 | - ./paperless/paperless:/usr/src/paperless/export # backups 703 | - ${PAPERLESS_INBOX_PATH}:/usr/src/paperless/consume # watch folder 704 | environment: 705 | USERMAP_UID: $PUID 706 | USERMAP_GID: $PGID 707 | PAPERLESS_URL: https://paperless.local.martinbjeldbak.com 708 | PAPERLESS_TIME_ZONE: $TZ 709 | PAPERLESS_OCR_LANGUAGES: dan 710 | PAPERLESS_OCR_LANGUAGE: dan+eng 711 | PAPERLESS_ENABLE_UPDATE_CHECK: "true" 712 | PAPERLESS_REDIS: redis://paperless-redis:6379 713 | PAPERLESS_DBHOST: paperless-postgres 714 | PAPERLESS_DBNAME: paperless 715 | PAPERLESS_DBUSER: paperless 716 | PAPERLESS_DBPASS: $PAPERLESS_POSTGRES_PASSWORD 717 | PAPERLESS_FILENAME_FORMAT: "{created_year}/{correspondent}/{created} {title}" 718 | PAPERLESS_TIKA_ENABLED: 1 719 | PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 720 | PAPERLESS_TIKA_ENDPOINT: http://tika:9998 721 | PAPERLESS_OCR_USER_ARGS: '{"invalidate_digital_signatures": true}' 722 | PAPERLESS_APPS: allauth.socialaccount.providers.openid_connect 723 | PAPERLESS_SOCIALACCOUNT_PROVIDERS: > 724 | { 725 | "openid_connect": { 726 | "APPS": [ 727 | { 728 | "provider_id": "authentik", 729 | "name": "Authentik", 730 | "client_id": "${PAPERLESS_AUTHENTIK_CLIENT_ID}", 731 | "secret": "${PAPERLESS_AUTHENTIK_CLIENT_SECRET}", 732 | "settings": { 733 | "server_url": "https://auth.local.martinbjeldbak.com/application/o/paperless/.well-known/openid-configuration" 734 | } 735 | } 736 | ], 737 | "OAUTH_PKCE_ENABLED": "True" 738 | } 739 | } 740 | paperless-postgres: 741 | container_name: paperless-postgres 742 | image: postgres:16 743 | restart: unless-stopped 744 | networks: 745 | - backend 746 | volumes: 747 | - ./paperless/postgres:/var/lib/postgresql/data 748 | environment: 749 | POSTGRES_USER: paperless 750 | POSTGRES_PASSWORD: $PAPERLESS_POSTGRES_PASSWORD 751 | 752 | paperless-redis: 753 | image: redis:7-alpine 754 | container_name: paperless-redis 755 | restart: unless-stopped 756 | volumes: 757 | - ./paperless/redis:/data 758 | networks: 759 | - backend 760 | 761 | gotenberg: 762 | image: gotenberg/gotenberg:8.9 763 | container_name: gotenberg 764 | restart: unless-stopped 765 | networks: 766 | - backend 767 | expose: 768 | - 3000 769 | # The gotenberg chromium route is used to convert .eml files. We do not 770 | # want to allow external content like tracking pixels or even javascript. 771 | # https://github.com/gotenberg/gotenberg/issues/577#issuecomment-2249616949 772 | command: 773 | - "gotenberg" 774 | - "--chromium-disable-javascript=true" 775 | - "--libreoffice-auto-start=true" 776 | - "--libreoffice-start-timeout=301s" 777 | - "--api-timeout=900s" 778 | - "--log-level=debug" 779 | 780 | tika: 781 | image: ghcr.io/paperless-ngx/tika 782 | container_name: tika 783 | networks: 784 | - backend 785 | expose: 786 | - 9999 787 | restart: unless-stopped 788 | 789 | romm: 790 | image: rommapp/romm:latest 791 | container_name: romm 792 | restart: unless-stopped 793 | user: ${PUID}:${PGID} 794 | networks: 795 | - frontend 796 | - backend 797 | environment: 798 | <<: *env 799 | DB_HOST: romm-db 800 | DB_NAME: romm 801 | DB_USER: romm-user 802 | DB_PASSWD: ${ROMM_DB_USER_PASSWORD} 803 | ROMM_AUTH_SECRET_KEY: ${ROMM_AUTH_SECRET_KEY} 804 | IGDB_CLIENT_ID: ${IGDB_CLIENT_ID} 805 | IGDB_CLIENT_SECRET: ${IGDB_CLIENT_SECRET} 806 | MOBYGAMES_API_KEY: ${MOBYGAMES_API_KEY} 807 | STEAMGRIDDB_API_KEY: ${STEAMGRIDDB_API_KEY} 808 | ROMM_AUTH_USERNAME: ${ROMM_USERNAME} 809 | ROMM_AUTH_PASSWORD: ${ROMM_PASSWORD} 810 | OIDC_ENABLED: true 811 | OIDC_PROVIDER: authentik 812 | OIDC_CLIENT_ID: ${AUTHENTIK_ROMM_CLIENT_ID} 813 | OIDC_CLIENT_SECRET: ${AUTHENTIK_ROMM_OIDC_CLIENT_SECRET} 814 | OIDC_REDIRECT_URI: https://roms.local.martinbjeldbak.com/api/oauth/openid 815 | OIDC_SERVER_APPLICATION_URL: https://auth.local.martinbjeldbak.com/application/o/romm 816 | volumes: 817 | - ./romm/resources:/romm/resources # Resources fetched from IGDB (covers, screenshots, etc.) 818 | - ./romm/redis:/redis-data # Cached data for background tasks 819 | - ${DOCKER_DATA_DIR}/emulators:/romm/library 820 | - ./romm/assets:/romm/assets # Uploaded saves, states, etc. 821 | - ./romm/config:/romm/config # Path where config.yml is stored 822 | expose: 823 | - 8080 824 | depends_on: 825 | - romm-db 826 | 827 | romm-db: 828 | image: mariadb:latest 829 | container_name: romm-db 830 | restart: unless-stopped 831 | user: ${PUID}:${PGID} 832 | environment: 833 | MYSQL_ROOT_PASSWORD: ${ROMM_DB_ROOT_PASSWORD} 834 | MYSQL_DATABASE: romm 835 | MYSQL_USER: romm-user 836 | MYSQL_PASSWORD: ${ROMM_DB_USER_PASSWORD} 837 | volumes: 838 | - ./romm/database:/var/lib/mysql 839 | networks: 840 | - backend 841 | 842 | icloudpd-n: 843 | container_name: icloudpd-n 844 | image: icloudpd/icloudpd 845 | environment: 846 | TZ: ${TZ} 847 | networks: 848 | - frontend 849 | expose: 850 | - 8080 # web ui 851 | volumes: 852 | - ${N_PHOTO_VOLUME}/icloudpd:/data 853 | # NOTE: if reauth needed (every ~2 months), run sudo docker-compose run icloudpd-n icloudpd --username ${ICLOUD_N_USERNAME} --password ${ICLOUD_N_PASSWORD} --auth-only 854 | - ./icloudpd/n/cookies:/root/.pyicloud # so we don't need to keep reauthing 855 | command: > 856 | icloudpd 857 | --directory /data 858 | --username ${ICLOUD_N_USERNAME} 859 | --password ${ICLOUD_N_PASSWORD} 860 | --password-provider webui 861 | --mfa-provider webui 862 | --watch-with-interval 3600 863 | 864 | dawarich-redis: 865 | image: redis:7.0-alpine 866 | container_name: dawarich-redis 867 | command: redis-server 868 | networks: 869 | - backend 870 | volumes: 871 | - ./dawarich/shared:/data 872 | restart: always 873 | dawarich-postgres: 874 | image: postgres:16 875 | shm_size: 1G 876 | container_name: dawarich-postgres 877 | restart: always 878 | networks: 879 | - backend 880 | volumes: 881 | - ./dawarich/postgres:/var/lib/postgresql/data 882 | - ./dawarich/shared:/var/shared 883 | - ./dawarich/postgresql.conf:/etc/postgresql/postgresql.conf 884 | environment: 885 | POSTGRES_USER: dawarich 886 | POSTGRES_PASSWORD: $DAWARICH_POSTGRES_PASSWORD 887 | healthcheck: 888 | test: [ "CMD-SHELL", "pg_isready -U postgres -d dawarich_development" ] 889 | interval: 10s 890 | retries: 5 891 | start_period: 30s 892 | timeout: 10s 893 | command: postgres -c config_file=/etc/postgresql/postgresql.conf # Use custom config, uncomment if you want to use a custom config 894 | dawarich: 895 | image: freikin/dawarich 896 | container_name: dawarich 897 | volumes: 898 | - ./dawarich/public:/var/app/public 899 | networks: 900 | - frontend 901 | - backend 902 | expose: 903 | - 3000 904 | stdin_open: true 905 | tty: true 906 | command: ['bin/rails', 'server', '-p', '3000', '-b', '::'] 907 | command: ['bin/dev'] 908 | restart: on-failure 909 | environment: 910 | RAILS_ENV: development 911 | REDIS_URL: redis://dawarich-redis:6379/0 912 | DATABASE_HOST: dawarich-postgres 913 | DATABASE_USERNAME: dawarich 914 | DATABASE_PASSWORD: $DAWARICH_POSTGRES_PASSWORD 915 | DATABASE_NAME: dawarich_development 916 | MIN_MINUTES_SPENT_IN_CITY: 60 917 | APPLICATION_HOST: localhost 918 | APPLICATION_HOSTS: localhost,dawarich.local.martinbjeldbak.com,dawarich.martinbjeldbak.com 919 | TIME_ZONE: $TZ 920 | APPLICATION_PROTOCOL: http 921 | REVERSE_GEOCODING_ENABLED: true 922 | logging: 923 | driver: "json-file" 924 | options: 925 | max-size: "100m" 926 | max-file: "5" 927 | depends_on: 928 | - dawarich-postgres 929 | - dawarich-redis 930 | dawarich-sidekiq: 931 | image: freikin/dawarich 932 | container_name: dawarich-sidekiq 933 | volumes: 934 | - ./dawarich/public:/var/app/public 935 | networks: 936 | - backend 937 | stdin_open: true 938 | tty: true 939 | entrypoint: sidekiq-entrypoint.sh 940 | command: ['bundle', 'exec', 'sidekiq'] 941 | restart: on-failure 942 | environment: 943 | RAILS_ENV: development 944 | REDIS_URL: redis://dawarich-redis:6379/0 945 | DATABASE_HOST: dawarich-postgres 946 | DATABASE_USERNAME: dawarich 947 | DATABASE_PASSWORD: $DAWARICH_POSTGRES_PASSWORD 948 | DATABASE_NAME: dawarich_development 949 | APPLICATION_HOST: localhost 950 | APPLICATION_HOSTS: localhost 951 | BACKGROUND_PROCESSING_CONCURRENCY: 10 952 | APPLICATION_PROTOCOL: http 953 | REVERSE_GEOCODING_ENABLED: true 954 | logging: 955 | driver: "json-file" 956 | options: 957 | max-size: "100m" 958 | max-file: "5" 959 | depends_on: 960 | - dawarich-postgres 961 | - dawarich-redis 962 | - dawarich 963 | dozzle: 964 | container_name: dozzle 965 | image: amir20/dozzle 966 | restart: unless-stopped 967 | volumes: 968 | - /var/run/docker.sock:/var/run/docker.sock 969 | expose: 970 | - 8080 971 | networks: 972 | - frontend 973 | environment: 974 | DOZZLE_AUTH_PROVIDER: forward-proxy 975 | 976 | unpackerr: 977 | image: golift/unpackerr 978 | container_name: unpackerr 979 | volumes: 980 | - ${DOCKER_DATA_DIR}:/data 981 | restart: unless-stopped 982 | user: ${PUID}:${PGID} 983 | networks: 984 | - backend 985 | environment: 986 | - TZ=${TZ} 987 | ## Global Settings 988 | - UN_DEBUG=false 989 | - UN_QUIET=false 990 | - UN_ERROR_STDERR=false 991 | - UN_ACTIVITY=false 992 | - UN_LOG_QUEUES=1m 993 | - UN_LOG_FILE=/data/unpackerr.log 994 | - UN_LOG_FILES=10 995 | - UN_LOG_FILE_MB=10 996 | - UN_INTERVAL=2m 997 | - UN_START_DELAY=1m 998 | - UN_RETRY_DELAY=5m 999 | - UN_MAX_RETRIES=3 1000 | - UN_PARALLEL=1 1001 | - UN_FILE_MODE=0644 1002 | - UN_DIR_MODE=0755 1003 | ## Folder Settings 1004 | - UN_FOLDERS_INTERVAL=1s 1005 | - UN_FOLDERS_BUFFER=20000 1006 | ## Sonarr Settings 1007 | - UN_SONARR_0_URL=http://sonarr:8989 1008 | - UN_SONARR_0_API_KEY=${SONARR_API_KEY} 1009 | - UN_SONARR_0_PATHS_0=/downloads 1010 | - UN_SONARR_0_PROTOCOLS=torrent 1011 | - UN_SONARR_0_TIMEOUT=10s 1012 | - UN_SONARR_0_DELETE_DELAY=5m 1013 | - UN_SONARR_0_DELETE_ORIG=false 1014 | - UN_SONARR_0_SYNCTHING=false 1015 | ## Radarr Settings 1016 | - UN_RADARR_0_URL=http://radarr:7878 1017 | - UN_RADARR_0_API_KEY=${RADARR_API_KEY} 1018 | - UN_RADARR_0_PATHS_0=/downloads 1019 | - UN_RADARR_0_PROTOCOLS=torrent 1020 | - UN_RADARR_0_TIMEOUT=10s 1021 | - UN_RADARR_0_DELETE_DELAY=5m 1022 | - UN_RADARR_0_DELETE_ORIG=false 1023 | - UN_RADARR_0_SYNCTHING=false 1024 | 1025 | lubelogger: 1026 | image: ghcr.io/hargata/lubelogger 1027 | container_name: lubelogger 1028 | restart: unless-stopped 1029 | user: ${PUID}:${PGID} 1030 | depends_on: 1031 | - lubelogger-postgres 1032 | volumes: 1033 | - ./lubelogger/config:/App/config 1034 | - ./lubelogger/data:/App/data 1035 | - ./lubelogger/translations:/App/wwwroot/translations 1036 | - ./lubelogger/documents:/App/wwwroot/documents 1037 | - ./lubelogger/images:/App/wwwroot/images 1038 | - ./lubelogger/temp:/App/wwwroot/temp 1039 | - ./lubelogger/log:/App/log 1040 | - ./lubelogger/keys:/root/.aspnet/DataProtection-Keys 1041 | # expose port and/or use serving via traefik 1042 | expose: 1043 | - 8080 # ui 1044 | networks: 1045 | - frontend 1046 | - backend 1047 | environment: 1048 | <<: *env 1049 | POSTGRES_CONNECTION: Host=lubelogger-postgres:5432;Username=lubelogger;Password=$LUBELOGGER_POSTGRES_PASSWORD;Database=lubelogger; 1050 | 1051 | lubelogger-postgres: 1052 | container_name: lubelogger-postgres 1053 | image: postgres:17 1054 | restart: unless-stopped 1055 | user: ${PUID}:${PGID} 1056 | networks: 1057 | - backend 1058 | volumes: 1059 | - ./lubelogger/init.sql:/docker-entrypoint-initdb.d/init.sql 1060 | - ./lubelogger/postgres:/var/lib/postgresql/data 1061 | - /etc/localtime:/etc/localtime:ro 1062 | environment: 1063 | POSTGRES_DB: lubelogger 1064 | POSTGRES_USER: lubelogger 1065 | POSTGRES_PASSWORD: $LUBELOGGER_POSTGRES_PASSWORD 1066 | 1067 | syncthing: 1068 | image: ghcr.io/linuxserver/syncthing 1069 | container_name: syncthing 1070 | networks: 1071 | frontend: 1072 | macvlan: 1073 | ipv4_address: 192.168.10.18 # for discovery 1074 | hostname: ${HOSTNAME} 1075 | environment: 1076 | <<: *env 1077 | volumes: 1078 | - ./syncthing/config:/config 1079 | - ${SYNCTHING_DATA_DIR_1}:/data 1080 | expose: 1081 | - 8384 # web UI 1082 | - 22000/tcp # listening port (TCP) 1083 | - 22000/udp # listening port (UDP) 1084 | - 21027/udp # protocol discovery 1085 | restart: unless-stopped 1086 | healthcheck: 1087 | test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1 1088 | interval: 1m 1089 | timeout: 10s 1090 | 1091 | calibre: 1092 | image: lscr.io/linuxserver/calibre 1093 | container_name: calibre 1094 | networks: 1095 | - frontend 1096 | environment: 1097 | <<: *env 1098 | volumes: 1099 | - ./calibre/config:/config 1100 | - ${DOCKER_DATA_DIR}:/data 1101 | expose: 1102 | - 8080 # UI 1103 | - 8181 # UI (HTTPS), not used 1104 | - 8081 # Content Server UI 1105 | restart: unless-stopped 1106 | 1107 | calibre-web: 1108 | image: lscr.io/linuxserver/calibre-web 1109 | container_name: calibre-web 1110 | networks: 1111 | - frontend 1112 | environment: 1113 | <<: *env 1114 | DOCKER_MODS: lscr.io/linuxserver/mods:universal-calibre-v7.16.0 # synology on 4.4 kernel, see https://github.com/linuxserver/docker-calibre-web/issues/306 1115 | OAUTHLIB_RELAX_TOKEN_SCOPE: 1 #optional 1116 | volumes: 1117 | - ${DOCKER_DATA_DIR}/media/books:/books 1118 | - ./calibre-web/config:/config 1119 | expose: 1120 | - 8083 # UI 1121 | restart: unless-stopped 1122 | 1123 | invidious: 1124 | container_name: invidious 1125 | image: quay.io/invidious/invidious:latest 1126 | restart: unless-stopped 1127 | expose: 1128 | - 3000 # UI 1129 | environment: 1130 | INVIDIOUS_CONFIG: | 1131 | database_url: postgres://postgres:${INVIDIOUS_DB_PASSWORD}@invidious-db:5432/postgres 1132 | check_tables: true 1133 | signature_server: invidious_sig_helper:12999 1134 | visitor_data: ${INVIDIOUS_VISITOR_DATA} 1135 | po_token: ${INVIDIOUS_PO_TOKEN} 1136 | https_only: true 1137 | domain: invidious.martinbjeldbak.com 1138 | external_port: 443 1139 | hmac_key: ${INVIDIOUS_HMAC_KEY} 1140 | admins: ["martinbjeldbak"] 1141 | use_innertube_for_captions: true 1142 | captcha_enabled: false 1143 | player_style: youtube 1144 | comments: ["youtube", "reddit"] 1145 | autoplay: true 1146 | continue: true 1147 | quality: dash 1148 | quality_dash: best 1149 | save_player_pos: true 1150 | registration_enabled: false 1151 | default_user_preferences: 1152 | region: AU 1153 | captions: ["English", "Danish", "Burmese"] 1154 | save_player_pos: true 1155 | healthcheck: 1156 | test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1 1157 | interval: 30s 1158 | timeout: 5s 1159 | retries: 2 1160 | logging: 1161 | options: 1162 | max-size: "1G" 1163 | max-file: "4" 1164 | depends_on: 1165 | - invidious-db 1166 | networks: 1167 | - frontend 1168 | - backend 1169 | 1170 | invidious_sig_helper: 1171 | container_name: invidious_sig_helper 1172 | image: quay.io/invidious/inv-sig-helper:latest 1173 | init: true 1174 | command: ["--tcp", "0.0.0.0:12999"] 1175 | environment: 1176 | - RUST_LOG=info 1177 | restart: unless-stopped 1178 | cap_drop: 1179 | - ALL 1180 | read_only: true 1181 | security_opt: 1182 | - no-new-privileges:true 1183 | networks: 1184 | - backend 1185 | 1186 | invidious-db: 1187 | container_name: invidious-db 1188 | image: docker.io/library/postgres:17.2 1189 | restart: unless-stopped 1190 | volumes: 1191 | - ./invidious/db:/var/lib/postgresql/data 1192 | - ./invidious/repo/config/sql:/config/sql 1193 | - ./invidious/repo/docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh 1194 | environment: 1195 | POSTGRES_DB: invidious 1196 | POSTGRES_USER: postgres 1197 | POSTGRES_PASSWORD: kba.tft.DRE8tnt4cvy 1198 | healthcheck: 1199 | test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] 1200 | networks: 1201 | - backend 1202 | 1203 | immich-server: 1204 | container_name: immich-server 1205 | image: ghcr.io/immich-app/immich-server:release 1206 | volumes: 1207 | - ${IMMICH_UPLOAD_LOCATION}:/usr/src/app/upload 1208 | - ${N_PHOTO_VOLUME}/icloudpd:/mnt/icloudpd-n/ 1209 | - /etc/localtime:/etc/localtime:ro 1210 | expose: 1211 | - 2283 1212 | depends_on: 1213 | - immich-redis 1214 | - immich-postgres 1215 | environment: 1216 | TZ: ${TZ} 1217 | REDIS_HOSTNAME: immich-redis 1218 | DB_HOSTNAME: immich-postgres 1219 | DB_PASSWORD: ${IMMICH_DB_PASSWORD} 1220 | restart: always 1221 | healthcheck: 1222 | disable: false 1223 | networks: 1224 | - frontend 1225 | - backend 1226 | 1227 | immich-machine-learning: 1228 | container_name: immich-machine-learning 1229 | image: ghcr.io/immich-app/immich-machine-learning:release 1230 | volumes: 1231 | - ./immich/model-cache:/cache 1232 | restart: always 1233 | healthcheck: 1234 | disable: false 1235 | networks: 1236 | - backend 1237 | 1238 | immich-redis: 1239 | container_name: immich-redis 1240 | image: docker.io/redis:6.2-alpine 1241 | healthcheck: 1242 | test: redis-cli ping || exit 1 1243 | restart: always 1244 | networks: 1245 | - backend 1246 | 1247 | immich-postgres: 1248 | container_name: immich-postgres 1249 | image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 1250 | environment: 1251 | POSTGRES_USER: postgres 1252 | POSTGRES_PASSWORD: ${IMMICH_DB_PASSWORD} 1253 | POSTGRES_DB: immich 1254 | POSTGRES_INITDB_ARGS: '--data-checksums' 1255 | volumes: 1256 | # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file 1257 | - ./immich/postgres:/var/lib/postgresql/data 1258 | healthcheck: 1259 | test: >- 1260 | pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; 1261 | Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align 1262 | --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; 1263 | echo "checksum failure count is $$Chksum"; 1264 | [ "$$Chksum" = '0' ] || exit 1 1265 | interval: 5m 1266 | start_period: 5m 1267 | command: >- 1268 | postgres 1269 | -c shared_preload_libraries=vectors.so 1270 | -c 'search_path="$$user", public, vectors' 1271 | -c logging_collector=on 1272 | -c max_wal_size=2GB 1273 | -c shared_buffers=512MB 1274 | -c wal_compression=on 1275 | restart: always 1276 | networks: 1277 | - backend 1278 | 1279 | authentik-postgres: 1280 | image: docker.io/library/postgres:16-alpine 1281 | restart: unless-stopped 1282 | container_name: authentik-postgres 1283 | healthcheck: 1284 | test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] 1285 | start_period: 20s 1286 | interval: 30s 1287 | retries: 5 1288 | timeout: 5s 1289 | volumes: 1290 | - authentik-database-v2:/var/lib/postgresql/data 1291 | environment: 1292 | POSTGRES_PASSWORD: ${AUTHENTIK_PG_PASS:?database password required} 1293 | POSTGRES_USER: authentik 1294 | POSTGRES_DB: authentik 1295 | networks: 1296 | - backend 1297 | 1298 | authentik-redis: 1299 | image: redis:alpine 1300 | container_name: authentik-redis 1301 | command: --save 60 1 --loglevel warning 1302 | restart: unless-stopped 1303 | healthcheck: 1304 | test: ["CMD-SHELL", "redis-cli ping | grep PONG"] 1305 | start_period: 20s 1306 | interval: 30s 1307 | retries: 5 1308 | timeout: 3s 1309 | volumes: 1310 | - authentik-redis-v2:/data 1311 | networks: 1312 | - backend 1313 | 1314 | authentik-server: 1315 | image: ghcr.io/goauthentik/server:2024.12.2 1316 | container_name: authentik-server 1317 | restart: unless-stopped 1318 | command: server 1319 | environment: 1320 | AUTHENTIK_REDIS__HOST: authentik-redis 1321 | AUTHENTIK_POSTGRESQL__HOST: authentik-postgres 1322 | AUTHENTIK_POSTGRESQL__USER: authentik 1323 | AUTHENTIK_POSTGRESQL__NAME: authentik 1324 | AUTHENTIK_POSTGRESQL__PASSWORD: ${AUTHENTIK_PG_PASS} 1325 | AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY} 1326 | volumes: 1327 | - ./authentik/media:/media 1328 | - ./authentik/custom-templates:/templates 1329 | expose: 1330 | - 9000 # http 1331 | - 9443 # https 1332 | depends_on: 1333 | authentik-postgres: 1334 | condition: service_healthy 1335 | authentik-redis: 1336 | condition: service_healthy 1337 | networks: 1338 | - frontend 1339 | - backend 1340 | authentik-worker: 1341 | image: ghcr.io/goauthentik/server:2024.12.2 1342 | container_name: authentik-worker 1343 | restart: unless-stopped 1344 | command: worker 1345 | environment: 1346 | AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY} 1347 | AUTHENTIK_REDIS__HOST: authentik-redis 1348 | AUTHENTIK_POSTGRESQL__HOST: authentik-postgres 1349 | AUTHENTIK_POSTGRESQL__USER: authentik 1350 | AUTHENTIK_POSTGRESQL__NAME: authentik 1351 | AUTHENTIK_POSTGRESQL__PASSWORD: ${AUTHENTIK_PG_PASS} 1352 | AUTHENTIK_EMAIL__HOST: ${SMTP_SERVER} 1353 | AUTHENTIK_EMAIL__PORT: 465 1354 | AUTHENTIK_EMAIL__USE_TLS: "true" 1355 | AUTHENTIK_EMAIL__USERNAME: ${SMTP_USER_NAME} 1356 | AUTHENTIK_EMAIL__PASSWORD: ${HUGINN_SMTP_PASSWORD} 1357 | AUTHENTIK_EMAIL__FROM: authentik@martinbjeldbak.com 1358 | volumes: 1359 | - ./authentik/media:/media 1360 | - ./authentik/certs:/certs 1361 | - ./authentik/custom-templates:/templates 1362 | depends_on: 1363 | authentik-postgres: 1364 | condition: service_healthy 1365 | authentik-redis: 1366 | condition: service_healthy 1367 | networks: 1368 | - backend 1369 | 1370 | autobrr: 1371 | container_name: autobrr 1372 | image: ghcr.io/autobrr/autobrr 1373 | restart: unless-stopped 1374 | user: ${PUID}:${PGID} 1375 | environment: 1376 | TZ: ${TZ} 1377 | volumes: 1378 | - ./autobrr/config:/config 1379 | expose: 1380 | - 7474 1381 | networks: 1382 | - frontend 1383 | - backend 1384 | environment: 1385 | AUTOBRR__OIDC_ENABLED: true 1386 | AUTOBRR__OIDC_ISSUER: https://auth.local.martinbjeldbak.com/application/o/autobrr/ 1387 | AUTOBRR__OIDC_CLIENT_ID: ${AUTOBRR_AUTHENTIK_CLIENT_ID} 1388 | AUTOBRR__OIDC_CLIENT_SECRET: ${AUTOBRR_AUTHENTIK_CLIENT_SECRET} 1389 | AUTOBRR__OIDC_REDIRECT_URL: https://autobrr.local.martinbjeldbak.com/api/auth/oidc/callback 1390 | 1391 | 1392 | thelounge: 1393 | image: ghcr.io/thelounge/thelounge 1394 | container_name: thelounge 1395 | user: ${PUID}:${PGID} 1396 | expose: 1397 | - 9000 1398 | restart: unless-stopped 1399 | volumes: 1400 | - ./thelounge:/var/opt/thelounge 1401 | networks: 1402 | - frontend 1403 | 1404 | volumes: 1405 | authentik-database-v2: 1406 | driver: local 1407 | authentik-redis-v2: 1408 | driver: local 1409 | 1410 | networks: 1411 | backend: 1412 | iot_macvlan: 1413 | name: iot_macvlan 1414 | driver: macvlan 1415 | enable_ipv6: false 1416 | driver_opts: 1417 | parent: eth1 1418 | ipam: 1419 | config: 1420 | - subnet: 192.168.30.0/24 1421 | gateway: 192.168.30.1 1422 | macvlan: 1423 | name: docker_macvlan 1424 | driver: macvlan 1425 | enable_ipv6: false 1426 | driver_opts: 1427 | parent: eth0 1428 | ipam: 1429 | config: 1430 | - subnet: 192.168.10.0/24 1431 | gateway: 192.168.10.1 1432 | frontend: 1433 | name: docker_frontend 1434 | driver: bridge 1435 | enable_ipv6: false 1436 | ipam: 1437 | config: 1438 | - subnet: 172.20.0.0/24 # subnet for all containers 1439 | gateway: 172.20.0.1 1440 | -------------------------------------------------------------------------------- /frigate/config.yml: -------------------------------------------------------------------------------- 1 | mqtt: 2 | host: mqtt 3 | user: "{FRIGATE_MQTT_USER}" 4 | password: "{FRIGATE_MQTT_PASSWORD}" 5 | 6 | ffmpeg: 7 | hwaccel_args: preset-vaapi 8 | 9 | detectors: 10 | ov: 11 | type: openvino 12 | device: AUTO 13 | model: 14 | path: /openvino-model/ssdlite_mobilenet_v2.xml 15 | 16 | birdseye: 17 | enabled: True 18 | mode: continuous 19 | 20 | model: 21 | width: 300 22 | height: 300 23 | input_tensor: nhwc 24 | input_pixel_format: bgr 25 | labelmap_path: /openvino-model/coco_91cl_bkgr.txt 26 | 27 | objects: 28 | track: 29 | - person 30 | - cat 31 | 32 | timestamp_style: 33 | position: "tl" 34 | effect: shadow 35 | 36 | ui: 37 | live_mode: webrtc 38 | 39 | record: 40 | enabled: true 41 | retain: 42 | days: 7 43 | mode: motion 44 | events: 45 | retain: 46 | default: 14 47 | mode: active_objects 48 | 49 | snapshots: 50 | enabled: true 51 | retain: 52 | default: 10 53 | 54 | go2rtc: 55 | streams: 56 | eufy_indoor_2k: 57 | - rtsp://{FRIGATE_EUFY_INDOOR_RTSP_USER}:{FRIGATE_EUFY_INDOOR_RTSP_PASSWORD}@192.168.50.10/live0 58 | - "ffmpeg:eufy_indoor_2k#audio=opus" # <- copy of the stream which transcodes audio to the missing codec 59 | eufy_indoor_pan_tilt: 60 | - rtsp://{FRIGATE_EUFY_PAN_TILT_RTSP_USER}:{FRIGATE_EUFY_PAN_TILT_RTSP_PASSWORD}@192.168.50.11/live0 61 | - "ffmpeg:eufy_indoor_pan_tilt#audio=opus" # <- copy of the stream which transcodes audio to the missing codec 62 | webrtc: 63 | candidates: 64 | - 192.168.10.10:8555 65 | - stun:8555 66 | 67 | cameras: 68 | eufy_indoor_2k: 69 | ffmpeg: 70 | inputs: 71 | - path: rtsp://127.0.0.1:8554/eufy_indoor_2k 72 | input_args: preset-rtsp-restream 73 | roles: 74 | - detect 75 | - record 76 | detect: 77 | width: 1920 78 | height: 1080 79 | eufy_indoor_pan_tilt: 80 | ffmpeg: 81 | inputs: 82 | - path: rtsp://127.0.0.1:8554/eufy_indoor_pan_tilt 83 | input_args: preset-rtsp-restream 84 | roles: 85 | - detect 86 | - record 87 | detect: 88 | width: 1920 89 | height: 1080 90 | 91 | telemetry: 92 | version_check: false # watchtower will watch versions 93 | -------------------------------------------------------------------------------- /homeassistant/.gitignore: -------------------------------------------------------------------------------- 1 | # Example .gitignore file for your config dir. 2 | # An * ensures that everything will be ignored. 3 | * 4 | 5 | # You can whitelist files/folders with !, these will not be ignored. 6 | !*.yaml 7 | !.gitignore 8 | !*.md 9 | 10 | # Ignore folders. 11 | .storage 12 | .cloud 13 | .google.token 14 | 15 | # Ensure these YAML files are ignored, otherwise your secret data/credentials will leak. 16 | ip_bans.yaml 17 | secrets.yaml 18 | known_devices.yaml 19 | -------------------------------------------------------------------------------- /homeassistant/README.md: -------------------------------------------------------------------------------- 1 | # My Home Assistant Configuration 2 | ![Home Assistant configuration check status](https://github.com/martinbjeldbak/home-assistant-config/workflows/Check%20Home%20Assistant%20configuration/badge.svg) 3 | 4 | This repository contains a backup of my Home Assistant configuration. 5 | 6 | Home assistant is installed via [hass.io](https://www.home-assistant.io/hassio/) on a Raspberry Pi 3 Model B connected to my home network. 7 | 8 | ## Home Assistant Integrations 9 | 10 | I have the following integrations set up via the UI 11 | 12 | * AdGuard Home 13 | * Apple TV (from HACS, see below) 14 | * HTTPS Certificate Expiry 15 | * Philips Hue 16 | * Apple iCloud 17 | * Met.no 18 | * Plex 19 | * Spotify 20 | * Transmission 21 | 22 | ## Home Assistant Custom Components 23 | 24 | I am also using [HACS](https://hacs.xyz) for improved Apple TV support, TP-Link Tapo integration, among other addons. -------------------------------------------------------------------------------- /homeassistant/automations.yaml: -------------------------------------------------------------------------------- 1 | - id: '1687322185169' 2 | alias: Turn off air purifier 3 | description: '' 4 | trigger: 5 | - platform: time 6 | at: 09:00:00 7 | condition: [] 8 | action: 9 | - type: turn_off 10 | device_id: a974d5ae993c3a8ac8fe4b666c2ff223 11 | entity_id: fan.mi_air_purifier_3h 12 | domain: fan 13 | mode: single 14 | - id: '1687322354221' 15 | alias: Turn on Air Purifier 16 | description: Before bed 17 | trigger: 18 | - platform: time 19 | at: '22:00:00' 20 | condition: 21 | - condition: or 22 | conditions: 23 | - condition: zone 24 | entity_id: person.martin_madsen 25 | zone: zone.home 26 | - condition: zone 27 | entity_id: person.nandar 28 | zone: zone.home 29 | action: 30 | - type: turn_on 31 | device_id: a974d5ae993c3a8ac8fe4b666c2ff223 32 | entity_id: fan.mi_air_purifier_3h 33 | domain: fan 34 | mode: single 35 | - id: '1687613174907' 36 | alias: Plex off lights when watching tv at night 37 | description: '' 38 | trigger: 39 | - platform: device 40 | device_id: f196d9f15d0b393d82a9b7945b6cc269 41 | domain: media_player 42 | entity_id: e1137ef10ecb8f6ba5e2d71968e84f8d 43 | type: playing 44 | condition: 45 | - condition: sun 46 | after: sunset 47 | after_offset: -01:00:00 48 | action: 49 | - service: light.turn_off 50 | data: 51 | transition: 10 52 | target: 53 | area_id: living_room 54 | mode: single 55 | - id: '1687613224875' 56 | alias: Plex Movie paused at night 57 | description: '' 58 | trigger: 59 | - platform: device 60 | device_id: f196d9f15d0b393d82a9b7945b6cc269 61 | domain: media_player 62 | entity_id: e1137ef10ecb8f6ba5e2d71968e84f8d 63 | type: paused 64 | condition: 65 | - condition: sun 66 | after: sunset 67 | after_offset: -01:00:00 68 | action: 69 | - target: 70 | entity_id: scene.watching_tv 71 | metadata: {} 72 | action: scene.turn_on 73 | mode: single 74 | - id: '1694783062795' 75 | alias: Hue Dimmer Nandar Laptop WOL 76 | description: WOL integration to turn on Nandar's laptop via Hue Dimmer switch 77 | trigger: 78 | - platform: device 79 | domain: mqtt 80 | device_id: 04229db32395a8222ce78362a5da4c8b 81 | type: action 82 | subtype: up-hold 83 | condition: [] 84 | action: 85 | - parallel: 86 | - data: {} 87 | target: 88 | entity_id: switch.nandar_work_laptop 89 | action: switch.turn_on 90 | - data: {} 91 | target: 92 | entity_id: switch.nandar_work_laptop_wifi 93 | action: switch.turn_on 94 | mode: single 95 | - id: '1694784402214' 96 | alias: Hue Dimmer Turn on living room 97 | description: Living room lights 98 | trigger: 99 | - platform: device 100 | domain: mqtt 101 | device_id: 04229db32395a8222ce78362a5da4c8b 102 | type: action 103 | subtype: on_press 104 | condition: [] 105 | action: 106 | - action: light.toggle 107 | data: {} 108 | target: 109 | area_id: living_room 110 | mode: single 111 | - id: '1694784530273' 112 | alias: Hue Dimmer turn off living room 113 | description: Living room lights 114 | trigger: 115 | - platform: device 116 | domain: mqtt 117 | device_id: 04229db32395a8222ce78362a5da4c8b 118 | type: action 119 | subtype: off_press 120 | condition: [] 121 | action: 122 | - data: {} 123 | target: 124 | area_id: living_room 125 | action: light.turn_off 126 | mode: single 127 | - id: '1694785112288' 128 | alias: 'Adaptive lighting: reset manual_control after 1 hour' 129 | description: 'Source: https://github.com/basnijholt/adaptive-lighting/tree/5cd060a37c2cdad3c7e266b937dc50e4b1c79711#robot-automation-examples' 130 | trigger: 131 | platform: event 132 | event_type: adaptive_lighting.manual_control 133 | action: 134 | - delay: 01:00:00 135 | - condition: template 136 | value_template: '{{ light in state_attr(switch, ''manual_control'') }}' 137 | - service: adaptive_lighting.set_manual_control 138 | data: 139 | entity_id: '{{ switch }}' 140 | lights: '{{ light }}' 141 | manual_control: false 142 | mode: parallel 143 | variables: 144 | light: '{{ trigger.event.data.entity_id }}' 145 | switch: '{{ trigger.event.data.switch }}' 146 | - id: '1694785300713' 147 | alias: 'Hue Dimmer: Increase brightness' 148 | description: '' 149 | trigger: 150 | - platform: device 151 | domain: mqtt 152 | device_id: 04229db32395a8222ce78362a5da4c8b 153 | type: action 154 | subtype: up_press 155 | condition: [] 156 | action: 157 | - data: 158 | manual_control: true 159 | entity_id: switch.adaptive_lighting_living_room 160 | action: adaptive_lighting.set_manual_control 161 | enabled: false 162 | - data: 163 | brightness_step_pct: 20 164 | transition: 2 165 | target: 166 | area_id: living_room 167 | action: light.turn_on 168 | mode: single 169 | - id: '1694785348532' 170 | alias: 'Hue Dimmer: Decrease brightness' 171 | description: '' 172 | trigger: 173 | - platform: device 174 | domain: mqtt 175 | device_id: 04229db32395a8222ce78362a5da4c8b 176 | type: action 177 | subtype: down_press 178 | condition: [] 179 | action: 180 | - data: 181 | brightness_step_pct: -20 182 | transition: 2 183 | target: 184 | area_id: living_room 185 | action: light.turn_on 186 | - data: 187 | manual_control: true 188 | entity_id: switch.adaptive_lighting_living_room 189 | action: adaptive_lighting.set_manual_control 190 | enabled: false 191 | mode: single 192 | - id: '1704424867342' 193 | alias: Aranet low battery notification 194 | description: Notify on low battery 195 | trigger: 196 | - type: battery_level 197 | platform: device 198 | device_id: 4d9c607685d2fb9bf51b4c55ab3c1a50 199 | entity_id: 8cbb96637c2ea92e52ad0b387bf1c7b6 200 | domain: sensor 201 | below: 10 202 | for: 203 | hours: 0 204 | minutes: 2 205 | seconds: 0 206 | condition: [] 207 | action: 208 | - service: notify.mobile_app_dagobah 209 | metadata: {} 210 | data: 211 | message: Aranet battery is below 10% 212 | title: Aranet battery low 213 | mode: single 214 | - id: '1709210255854' 215 | alias: Longfan Oscilate after turn on 216 | description: '' 217 | trigger: 218 | - platform: state 219 | entity_id: 220 | - switch.longfan 221 | condition: [] 222 | action: 223 | - service: script.longfan_oscillate 224 | metadata: {} 225 | data: {} 226 | mode: single 227 | - id: '1724334337502' 228 | alias: Apply adaptive lighting 229 | description: Living room lights 230 | trigger: 231 | - platform: device 232 | domain: mqtt 233 | device_id: 04229db32395a8222ce78362a5da4c8b 234 | type: action 235 | subtype: on-hold 236 | condition: [] 237 | action: 238 | - action: adaptive_lighting.apply 239 | metadata: {} 240 | data: 241 | adapt_color: true 242 | adapt_brightness: true 243 | turn_on_lights: true 244 | lights: 245 | - light.hue_living_room_filament_bulb 246 | - light.hue_living_room_light_strip 247 | - light.hue_living_room_white_bulb 248 | entity_id: switch.adaptive_lighting_living_room 249 | mode: single 250 | - id: '1724497467298' 251 | alias: 'Bedroom Dimmer: Turn on' 252 | description: Beroom lights 253 | trigger: 254 | - platform: device 255 | domain: mqtt 256 | device_id: 11fe4eb3d9903045257bbbed8af16b4a 257 | type: action 258 | subtype: on_press 259 | condition: [] 260 | action: 261 | - if: 262 | - condition: time 263 | after: '21:00:00' 264 | then: 265 | - action: switch.turn_on 266 | metadata: {} 267 | data: {} 268 | target: 269 | entity_id: switch.adaptive_lighting_sleep_mode_bedroom 270 | enabled: false 271 | - action: light.toggle 272 | target: 273 | entity_id: 274 | - light.bedroom_lights 275 | data: {} 276 | mode: single 277 | - id: '1724497757357' 278 | alias: 'Hue Dimmer: Turn off bedroom lights' 279 | description: '' 280 | trigger: 281 | - platform: device 282 | domain: mqtt 283 | device_id: 11fe4eb3d9903045257bbbed8af16b4a 284 | type: action 285 | subtype: off_press 286 | condition: [] 287 | action: 288 | - data: {} 289 | action: light.turn_off 290 | target: 291 | entity_id: light.bedroom_lights 292 | mode: single 293 | - id: '1724497874059' 294 | alias: Bedroom turn down brightness 295 | description: '' 296 | trigger: 297 | - platform: device 298 | domain: mqtt 299 | device_id: 11fe4eb3d9903045257bbbed8af16b4a 300 | type: action 301 | subtype: down_press 302 | condition: [] 303 | action: 304 | - data: 305 | brightness_step_pct: -20 306 | transition: 2 307 | target: 308 | area_id: living_room 309 | action: light.turn_on 310 | - data: 311 | manual_control: true 312 | entity_id: switch.adaptive_lighting_bedroom 313 | action: adaptive_lighting.set_manual_control 314 | mode: single 315 | - id: '1724497930665' 316 | alias: Bedroom increase brightness 317 | description: '' 318 | trigger: 319 | - platform: device 320 | domain: mqtt 321 | device_id: 11fe4eb3d9903045257bbbed8af16b4a 322 | type: action 323 | subtype: up_press 324 | condition: [] 325 | action: 326 | - data: 327 | manual_control: true 328 | entity_id: switch.adaptive_lighting_bedroom 329 | action: adaptive_lighting.set_manual_control 330 | - data: 331 | brightness_step_pct: 20 332 | transition: 2 333 | action: light.turn_on 334 | target: 335 | area_id: bedroom 336 | mode: single 337 | - id: '1724629229771' 338 | alias: Turn off sleep mode when sun rises 339 | description: '' 340 | trigger: 341 | - platform: sun 342 | event: sunrise 343 | offset: 0 344 | condition: [] 345 | action: 346 | - action: switch.turn_off 347 | metadata: {} 348 | data: {} 349 | target: 350 | entity_id: switch.adaptive_lighting_sleep_mode_bedroom 351 | mode: single 352 | - id: '1724677054506' 353 | alias: Apply adaptive-lighting Bedroom 354 | description: Bedroom room lights 355 | trigger: 356 | - platform: device 357 | domain: mqtt 358 | device_id: 11fe4eb3d9903045257bbbed8af16b4a 359 | type: action 360 | subtype: on_hold 361 | condition: [] 362 | action: 363 | - action: adaptive_lighting.apply 364 | metadata: {} 365 | data: 366 | adapt_color: true 367 | adapt_brightness: true 368 | turn_on_lights: true 369 | lights: 370 | - light.hue_bedroom_light_strip 371 | - light.hue_martin_side 372 | - light.hue_nandar_side_lamp 373 | entity_id: switch.adaptive_lighting_bedroom 374 | mode: single 375 | - id: '1727478901057' 376 | alias: Backup configuration 377 | description: '' 378 | trigger: 379 | - platform: time 380 | at: 01:00:00 381 | condition: [] 382 | action: 383 | - action: backup.create 384 | metadata: {} 385 | data: {} 386 | mode: single 387 | - id: '1727673306499' 388 | alias: Adguard Home re-enable protection 389 | description: '' 390 | trigger: 391 | - platform: device 392 | type: turned_off 393 | device_id: 01e54bbfb54d47bf1c8fd90f8c19b1aa 394 | entity_id: 87e151a8d51720b2ace6a8e9cc5b56e1 395 | domain: switch 396 | condition: [] 397 | action: 398 | - delay: 399 | hours: 2 400 | minutes: 0 401 | seconds: 0 402 | milliseconds: 0 403 | - type: turn_on 404 | device_id: 01e54bbfb54d47bf1c8fd90f8c19b1aa 405 | entity_id: 87e151a8d51720b2ace6a8e9cc5b56e1 406 | domain: switch 407 | mode: single 408 | - id: '1727673671554' 409 | alias: AdGuard Protection On 410 | description: '' 411 | trigger: 412 | - platform: device 413 | type: turned_on 414 | device_id: 01e54bbfb54d47bf1c8fd90f8c19b1aa 415 | entity_id: 87e151a8d51720b2ace6a8e9cc5b56e1 416 | domain: switch 417 | condition: [] 418 | action: 419 | - type: turn_on 420 | device_id: ca4923919fa9ac181bc629a20ad6b7b0 421 | entity_id: 1d947504c00931fd8b19e2ae28c28b66 422 | domain: switch 423 | mode: single 424 | - id: '1727673692327' 425 | alias: AdGuard Protection Off 426 | description: '' 427 | trigger: 428 | - platform: device 429 | type: turned_off 430 | device_id: 01e54bbfb54d47bf1c8fd90f8c19b1aa 431 | entity_id: 87e151a8d51720b2ace6a8e9cc5b56e1 432 | domain: switch 433 | condition: [] 434 | action: 435 | - type: turn_off 436 | device_id: ca4923919fa9ac181bc629a20ad6b7b0 437 | entity_id: 1d947504c00931fd8b19e2ae28c28b66 438 | domain: switch 439 | mode: single 440 | - id: '1728990137117' 441 | alias: Outside water flowing notification 442 | description: To catch any leaks 443 | triggers: 444 | - type: value 445 | device_id: fb1b4a5297db45ef6fb5f7f910ae8c83 446 | entity_id: e6dcbc82e9d4165a7b511a0e8fbcf3c6 447 | domain: sensor 448 | trigger: device 449 | above: 0 450 | conditions: [] 451 | actions: 452 | - action: notify.martin_s_devices 453 | metadata: {} 454 | data: 455 | title: Water flowing in valve 456 | message: Valve was turned on and is flowing 457 | mode: single 458 | - id: '1729301727323' 459 | alias: Turn off water valve automatically 460 | description: To make sure we don't accidentally leave it open and cause leaks 461 | triggers: 462 | - type: turned_on 463 | device_id: fb1b4a5297db45ef6fb5f7f910ae8c83 464 | entity_id: ea62c05b6e5050ddfe2adf567499a31b 465 | domain: switch 466 | trigger: device 467 | for: 468 | hours: 0 469 | minutes: 30 470 | seconds: 0 471 | conditions: [] 472 | actions: 473 | - type: turn_off 474 | device_id: fb1b4a5297db45ef6fb5f7f910ae8c83 475 | entity_id: ea62c05b6e5050ddfe2adf567499a31b 476 | domain: switch 477 | mode: single 478 | - id: '1729319892883' 479 | alias: Turn on Air Purifier when someone in office 480 | description: '' 481 | triggers: 482 | - trigger: state 483 | entity_id: 484 | - device_tracker.nandar_gigabyte_laptop 485 | - device_tracker.nandar_s_gigabyte_laptop 486 | to: home 487 | conditions: [] 488 | actions: 489 | - type: turn_on 490 | device_id: a974d5ae993c3a8ac8fe4b666c2ff223 491 | entity_id: a46393b355794e72b229815d644cf743 492 | domain: fan 493 | mode: single 494 | - id: '1729426288351' 495 | alias: Restart zigbee2mqtt 496 | description: Otherwise it seems to randomly bug out 497 | triggers: 498 | - trigger: time 499 | at: 00:00:00 500 | conditions: [] 501 | actions: 502 | - action: switch.turn_off 503 | metadata: {} 504 | data: {} 505 | target: 506 | entity_id: switch.docker_zigbee2mqtt 507 | - delay: 508 | hours: 0 509 | minutes: 0 510 | seconds: 30 511 | milliseconds: 0 512 | - action: switch.turn_on 513 | target: 514 | entity_id: 515 | - switch.docker_zigbee2mqtt 516 | data: {} 517 | mode: single 518 | -------------------------------------------------------------------------------- /homeassistant/configuration.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Configure a default setup of Home Assistant (frontend, api, etc) 3 | default_config: 4 | http: 5 | trusted_proxies: 6 | - 172.20.0.0/24 7 | - 172.20.0.25 8 | - 172.20.0.7 # no idea why this not covered 9 | - 0.0.0.0/0 10 | use_x_forwarded_for: true 11 | ip_ban_enabled: true 12 | login_attempts_threshold: 5 13 | 14 | notify: 15 | - name: Martin's email 16 | platform: smtp 17 | sender: homeassistant@martinbjeldbak.com 18 | recipient: me@martinbjeldbak.com 19 | server: !secret smtp_server 20 | port: 465 # SSL 21 | username: !secret smtp_username 22 | password: !secret smtp_password 23 | encryption: tls 24 | sender_name: Martin's Home Assistant 25 | - platform: group 26 | name: "Martin's devices" 27 | services: 28 | - action: mobile_app_dagobah 29 | - action: martin_s_email 30 | rest_command: 31 | wake_nandar_work_laptop: 32 | url: https://192.168.1.1/api/wol/wol/set 33 | verify_ssl: false 34 | method: POST 35 | payload: '{"wake":{"interface": "opt3","mac": "80:fa:5b:90:f0:fd"}}' 36 | content_type: application/json 37 | username: !secret opnsense_user 38 | password: !secret opnsense_key 39 | wake_nandar_work_laptop_wifi: 40 | url: https://192.168.1.1/api/wol/wol/set 41 | verify_ssl: false 42 | method: POST 43 | payload: '{"wake":{"interface": "opt3","mac": "64:bc:58:b7:46:ca"}}' 44 | content_type: application/json 45 | username: !secret opnsense_user 46 | password: !secret opnsense_key 47 | wake_martin_gaming_pc: 48 | url: https://192.168.1.1/api/wol/wol/set 49 | verify_ssl: false 50 | method: POST 51 | payload: '{"wake":{"interface": "opt3","mac": "b4:2e:99:ee:96:73"}}' 52 | content_type: application/json 53 | username: !secret opnsense_user 54 | password: !secret opnsense_key 55 | wake_living_room_tv: 56 | url: https://192.168.1.1/api/wol/wol/set 57 | verify_ssl: false 58 | method: POST 59 | payload: '{"wake":{"interface": "opt4","mac": "58:fd:b1:a5:d7:e4"}}' 60 | content_type: application/json 61 | username: !secret opnsense_user 62 | password: !secret opnsense_key 63 | switch: 64 | - platform: broadlink 65 | mac: E8:16:56:7D:9B:AA 66 | switches: 67 | - name: Longfan 68 | command_on: JgDIACoOKg8NKSkOKBAMKgwrDCoNKg0oDikq5ikPKQ8MKygQKA8NKgwqDSoMKwwqDCopAAEKKg4qDg0pKg4qDg0pDikNKgwqDSoMKirmKQ8pDg0qKQ4pDg0qDSkNKgwqDCoNKigAAQooDygPDCsnDikODSoNKQ0pDSoMKgwqKOYpDigODikpDigPDSkMKg0qDCoNKgwqKAABCygOKQ4NKSkOKQ4NKQ4pDSkNKgwqDSoo5ikPKQ4NKSkOKQ4NKgwqDCoNKgwqDCsnAA0F 69 | command_off: JgDIACoOKg8NKSkOKBAMKgwrDCoNKg0oDikq5ikPKQ8MKygQKA8NKgwqDSoMKwwqDCopAAEKKg4qDg0pKg4qDg0pDikNKgwqDSoMKirmKQ8pDg0qKQ4pDg0qDSkNKgwqDCoNKigAAQooDygPDCsnDikODSoNKQ0pDSoMKgwqKOYpDigODikpDigPDSkMKg0qDCoNKgwqKAABCygOKQ4NKSkOKQ4NKQ4pDSkNKgwqDSoo5ikPKQ4NKSkOKQ4NKgwqDCoNKgwqDCsnAA0F 70 | - platform: template 71 | switches: 72 | martin_gaming_pc: 73 | unique_id: martin_gaming_pc 74 | friendly_name: Martin's Gaming PC 75 | value_template: '{{ is_state(''binary_sensor.martins_gaming_pc_local_martinbjeldbak_com'', ''on'') }}' 76 | turn_on: 77 | service: rest_command.wake_martin_gaming_pc 78 | turn_off: 79 | service: switch.turn_off 80 | target: 81 | entity_id: switch.martin_s_gaming_pc 82 | icon_template: |- 83 | {% if is_state('binary_sensor.martin_s_gaming_pc', 'on') %} 84 | mdi:laptop 85 | {% else %} 86 | mdi:laptop-off 87 | {% endif %} 88 | - platform: template 89 | switches: 90 | nandar_work_laptop: 91 | unique_id: nandar_work_laptop 92 | friendly_name: Nandar's Work Laptop (ethernet) 93 | value_template: '{{ is_state(''binary_sensor.nandar_s_work_laptop'', ''on'') }}' 94 | turn_on: 95 | service: rest_command.wake_nandar_work_laptop 96 | turn_off: # Added as required, no way to wake-off-lan without running script 97 | icon_template: |- 98 | {% if is_state('binary_sensor.nandar_s_work_laptop', 'on') %} 99 | mdi:laptop 100 | {% else %} 101 | mdi:laptop-off 102 | {% endif %} 103 | - platform: template 104 | switches: 105 | nandar_work_laptop_wifi: 106 | unique_id: nandar_work_laptop_wifi 107 | friendly_name: Nandar's Work Laptop (wifi) 108 | value_template: '{{ is_state(''binary_sensor.nandar_s_work_laptop_wifi'', ''on'') }}' 109 | turn_on: 110 | service: rest_command.wake_nandar_work_laptop_wifi 111 | turn_off: # Added as required, no way to wake-off-lan without running script 112 | icon_template: |- 113 | {% if is_state('binary_sensor.nandar_s_work_laptop_wifi', 'on') %} 114 | mdi:laptop 115 | {% else %} 116 | mdi:laptop-off 117 | {% endif %} 118 | - platform: template 119 | switches: 120 | living_room_tv_wol: 121 | unique_id: living_room_tv_wol 122 | friendly_name: Living Room TV WOL 123 | value_template: '{{ is_state(''media_player.lg_webos_smart_tv'', ''on'') }}' 124 | turn_on: 125 | service: rest_command.wake_living_room_tv 126 | turn_off: 127 | action: media_player.turn_off 128 | target: 129 | entity_id: media_player.lg_webos_smart_tv 130 | icon_template: |- 131 | {% if is_state('media_player.lg_webos_smart_tv', 'on') %} 132 | mdi:television 133 | {% else %} 134 | mdi:television-off 135 | {% endif %} 136 | homeassistant: 137 | name: Home 138 | unit_system: metric 139 | time_zone: !secret tz 140 | latitude: !secret latitude 141 | longitude: !secret longitude 142 | currency: AUD 143 | internal_url: !secret external_url 144 | external_url: !secret external_url 145 | logger: 146 | default: info 147 | homekit: 148 | advertise_ip: 192.168.10.16 149 | filter: 150 | include_domains: 151 | - sensor 152 | - fan 153 | - climate 154 | - light 155 | - valve 156 | include_entity_globs: 157 | - binary_sensor.*_contact # e.g. door and window sensors 158 | - binary_sensor.*_water_leak # water leak sensors 159 | - binary_sensor.*_occupancy 160 | include_entities: 161 | - light.bedroom_lights # not sure why not deleted. it removed in z2m 162 | - switch.martin_gaming_pc_2 # WOL for martins desktop 163 | exclude_entity_globs: 164 | - sensor.opnsense_* 165 | exclude_entities: 166 | - sensor.electricity_maps_grid_fossil_fuel_percentage 167 | - sensor.electricity_maps_co2_intensity 168 | entity_config: 169 | fan.mi_air_purifier_3h: 170 | name: Air Purifier 171 | binary_sensor.front_door_contact: 172 | linked_battery_sensor: sensor.front_door_battery 173 | low_battery_threshold: 31 174 | binary_sensor.bedroom_window_sensor_contact: 175 | linked_battery_sensor: sensor.bedroom_window_sensor_battery 176 | low_battery_threshold: 31 177 | sensor.aranet4_20b7d_carbon_dioxide: 178 | co2_threshold: 1500 # keep from annoying us 179 | media_player.lg_webos_smart_tv: 180 | feature_list: 181 | - feature: on_off 182 | - feature: play_pause 183 | - feature: play_stop 184 | - feature: toggle_mute 185 | binary_sensor.laundry_water_leak: 186 | linked_battery_sensor: sensor.laundry_battery 187 | low_battery_threshold: 31 188 | binary_sensor.kitchen_sink_water_leak: 189 | linked_battery_sensor: sensor.kitchen_sink_battery 190 | low_battery_threshold: 31 191 | valve.outside_water_valve: 192 | name: Water Valve 193 | linked_battery_sensor: sensor.outside_water_valve_battery 194 | low_battery_threshold: 31 195 | adaptive_lighting: 196 | group: !include groups.yaml 197 | automation: !include automations.yaml 198 | script: !include scripts.yaml 199 | scene: !include scenes.yaml 200 | smartir: 201 | check_updates: false # installed via HACS https://github.com/smartHomeHub/SmartIR?tab=readme-ov-file#hacs 202 | # 2024-08-21: disabled as no longer have broadlink AC 203 | #climate: 204 | # - platform: smartir 205 | # name: Living room AC 206 | # unique_id: living_room_ac 207 | # device_code: 1135 # source: https://github.com/smartHomeHub/SmartIR/blob/master/docs/CLIMATE.md#available-codes-for-climate-devices 208 | # controller_data: remote.living_room_broadlink 209 | # temperature_sensor: sensor.living_room_broadlink_temperature 210 | # humidity_sensor: sensor.living_room_broadlink_humidity 211 | 212 | command_line: 213 | - switch: 214 | name: Martin's Gaming PC 215 | unique_id: martin_gaming_pc_ssh 216 | command_off: ssh -o StrictHostKeyChecking=no -i id_ed25519 homeassistant@martins-gaming-pc.local.martinbjeldbak.com -t "systemctl suspend -i" 217 | - switch: 218 | name: Start Steam 219 | unique_id: martin_gaming_pc_ssh_steam 220 | command_on: ssh -o StrictHostKeyChecking=no -i id_ed25519 martin@martins-gaming-pc.local.martinbjeldbak.com -t "pkill steam && systemd-run --user steam-runtime && pactl set-default-sink alsa_output.pci-0000_09_00.1.hdmi-stereo" 221 | command_off: ssh -o StrictHostKeyChecking=no -i id_ed25519 martin@martins-gaming-pc.local.martinbjeldbak.com -t "pkill steam" 222 | monitor_docker: 223 | - name: Docker 224 | containers: 225 | - adguardhome 226 | - homeassistant 227 | - mqtt 228 | - zigbee2mqtt 229 | - plex 230 | - radarr 231 | - sonarr 232 | - tautulli 233 | - bazarr 234 | - gluetun 235 | - transmission 236 | - caddy 237 | - prowlarr 238 | - esphome 239 | - epicgames-freegames 240 | - overseerr 241 | - homepage 242 | - speedtest-tracker 243 | - paperless 244 | - romm 245 | - icloudpd-n 246 | - dawarich 247 | - scrypted 248 | rename: 249 | adguardhome: AdGuard Home 250 | homeassistant: Home Assistant 251 | mqtt: Mosquitto 252 | zigbee2mqtt: Zigbee2MQTT 253 | plex: Plex 254 | radarr: Radarr 255 | sonarr: Sonarr 256 | tautulli: Tautulli 257 | bazarr: Bazarr 258 | gluetun: Gluetun 259 | transmission: Transmission 260 | caddy: Caddy 261 | prowlarr: Prowlarr 262 | esphome: ESPHome 263 | epicgames-freegames: Epic Games Store Weekly Free Games 264 | overseerr: Overseerr 265 | homepage: Homepage 266 | speedtest-tracker: Speedtest Tracker 267 | paperless: Paperless 268 | romm: ROMM 269 | icloudpd-n: iCloud Photos Downloader 270 | dawarich: Dawarich 271 | scrypted: Scrypted 272 | monitored_conditions: 273 | - version 274 | - containers_running 275 | - containers_total 276 | - containers_cpu_percentage 277 | - containers_memory 278 | - containers_memory_percentage 279 | - state 280 | - status 281 | - health 282 | - uptime 283 | - image 284 | - cpu_percentage 285 | - memory 286 | - memory_percentage 287 | - network_speed_up 288 | - network_speed_down 289 | - network_total_up 290 | - network_total_down 291 | 292 | alert: 293 | laundry_water_leak: 294 | name: Laundry leak sensor detects moisture 295 | done_message: Sensor no longer detects moisture 296 | entity_id: binary_sensor.laundry_water_leak 297 | state: "on" 298 | repeat: 15 299 | can_acknowledge: true 300 | notifiers: 301 | - martin_s_devices 302 | kitchen_sink_leak: 303 | name: Kitchen sink leak sensor detects moisture 304 | done_message: Sensor no longer detects moisture 305 | entity_id: binary_sensor.kitchen_sink_water_leak 306 | state: "on" 307 | repeat: 15 308 | can_acknowledge: true 309 | notifiers: 310 | - martin_s_devices 311 | -------------------------------------------------------------------------------- /homeassistant/go2rtc.yaml: -------------------------------------------------------------------------------- 1 | api: 2 | listen: 127.0.0.1:1984 3 | rtsp: 4 | listen: 127.0.0.1:8554 5 | -------------------------------------------------------------------------------- /homeassistant/groups.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martinbjeldbak/self-hosted/44534d9c76c21caf8c6c75d77011e31377af41f7/homeassistant/groups.yaml -------------------------------------------------------------------------------- /homeassistant/scenes.yaml: -------------------------------------------------------------------------------- 1 | - id: '1724333606484' 2 | name: Watching TV 3 | entities: 4 | light.hue_living_room_light_strip: 5 | min_color_temp_kelvin: 2000 6 | max_color_temp_kelvin: 6535 7 | min_mireds: 153 8 | max_mireds: 500 9 | effect_list: 10 | - blink 11 | - breathe 12 | - okay 13 | - channel_change 14 | - candle 15 | - fireplace 16 | - colorloop 17 | - finish_effect 18 | - stop_effect 19 | - stop_hue_effect 20 | supported_color_modes: 21 | - color_temp 22 | - xy 23 | effect: 24 | color_mode: 25 | brightness: 26 | color_temp_kelvin: 27 | color_temp: 28 | hs_color: 29 | rgb_color: 30 | xy_color: 31 | friendly_name: Hue Living Room Light Strip 32 | supported_features: 44 33 | color: 34 | x: 0.4042 35 | y: 0.3902 36 | linkquality: 200 37 | update: 38 | installed_version: 16783104 39 | latest_version: 16783104 40 | state: idle 41 | update_available: false 42 | state: 'off' 43 | icon: mdi:television 44 | metadata: {} 45 | -------------------------------------------------------------------------------- /homeassistant/scripts.yaml: -------------------------------------------------------------------------------- 1 | longfan_on: 2 | sequence: 3 | - service: remote.send_command 4 | target: 5 | entity_id: remote.broadlink_rm4_mini_bedroom 6 | data: 7 | device: longfan 8 | command: 9 | - power 10 | - oscillate 11 | longfan_power: 12 | sequence: 13 | - service: remote.send_command 14 | target: 15 | entity_id: remote.broadlink_rm4_mini_bedroom 16 | data: 17 | device: longfan 18 | command: power 19 | longfan_speed: 20 | sequence: 21 | - service: remote.send_command 22 | target: 23 | entity_id: remote.broadlink_rm4_mini_bedroom 24 | data: 25 | device: longfan 26 | command: speed 27 | longfan_oscillate: 28 | sequence: 29 | - service: remote.send_command 30 | target: 31 | entity_id: remote.broadlink_rm4_mini_bedroom 32 | data: 33 | device: longfan 34 | command: oscillate 35 | learn_longfan_commands: 36 | sequence: 37 | - service: remote.learn_command 38 | target: 39 | entity_id: remote.broadlink_rm4_mini_bedroom 40 | data: 41 | device: longfan 42 | command: 43 | - power 44 | - speed 45 | - oscillate 46 | gaming_time: 47 | alias: Gaming time 48 | sequence: 49 | - action: switch.turn_on 50 | metadata: {} 51 | data: {} 52 | target: 53 | entity_id: 54 | - switch.lg_tv_wol 55 | - delay: 56 | hours: 0 57 | minutes: 0 58 | seconds: 10 59 | milliseconds: 0 60 | - action: switch.turn_on 61 | metadata: {} 62 | data: {} 63 | target: 64 | entity_id: 65 | - switch.martin_gaming_pc_2 66 | - delay: 67 | hours: 0 68 | minutes: 0 69 | seconds: 15 70 | milliseconds: 0 71 | - parallel: 72 | - action: media_player.select_source 73 | metadata: {} 74 | data: 75 | source: HDMI 1 76 | target: 77 | entity_id: media_player.lg_webos_smart_tv 78 | - action: switch.turn_on 79 | metadata: {} 80 | data: {} 81 | target: 82 | entity_id: switch.start_steam 83 | description: '' 84 | icon: mdi:microsoft-xbox 85 | -------------------------------------------------------------------------------- /homeassistant/secrets.sample.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | tz: Australia/Melbourne 3 | latitude: 37.773972 4 | longitude: -122.431297 5 | routerpassword: hunter22 6 | nas_url: http://duck.com 7 | transmission_url: http://hckrnews.com 8 | adguard_url: http://localhost:3000 9 | external_url: https://homeassistant.example.com 10 | plex_url: https://plex.example.com 11 | sonarr_url: https://sonarr.example.com 12 | radarr_url: https://radarr.example.com 13 | jackett_url: https://jackett.example.com 14 | bazarr_url: https://bazarr.example.com 15 | -------------------------------------------------------------------------------- /homepage/config/docker.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # For configuration options and examples, please see: 3 | # https://gethomepage.dev/latest/configs/docker/ 4 | 5 | # my-docker: 6 | # host: 127.0.0.1 7 | # port: 2375 8 | 9 | # my-docker: 10 | # socket: /var/run/docker.sock 11 | 12 | localdocker: 13 | host: dockerproxy 14 | port: 2375 -------------------------------------------------------------------------------- /homepage/config/services.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - Media: 3 | - Plex: 4 | icon: plex.svg 5 | href: "https://plex.local.martinbjeldbak.com" 6 | description: media server 7 | server: localdocker 8 | container: plex 9 | widget: 10 | type: plex 11 | url: http://plex:32400 12 | key: {{HOMEPAGE_VAR_PLEX_TOKEN}} 13 | - Tautulli: 14 | icon: tautulli.svg 15 | href: "https://tautulli.local.martinbjeldbak.com" 16 | description: plex monitoring and history database 17 | server: localdocker 18 | container: tautulli 19 | widget: 20 | type: tautulli 21 | url: http://tautulli:8181 22 | key: {{HOMEPAGE_VAR_TAUTULLI_API_KEY}} 23 | - Sonarr: 24 | icon: sonarr.svg 25 | description: tv 26 | href: "https://tv.local.martinbjeldbak.com" 27 | server: localdocker 28 | container: sonarr 29 | widget: 30 | type: sonarr 31 | url: http://sonarr:8989 32 | key: {{HOMEPAGE_VAR_SONARR_API_KEY}} 33 | - Bazarr: 34 | icon: bazarr.svg 35 | description: subtitles 36 | href: "https://subtitles.local.martinbjeldbak.com" 37 | server: localdocker 38 | container: bazarr 39 | widget: 40 | type: bazarr 41 | url: http://bazarr:6767 42 | key: {{HOMEPAGE_VAR_BAZARR_API_KEY}} 43 | 44 | - Readarr: 45 | icon: readarr.svg 46 | description: books 47 | href: "https://readarr.local.martinbjeldbak.com" 48 | server: localdocker 49 | container: readarr 50 | widget: 51 | type: readarr 52 | url: http://readarr:8787 53 | key: {{HOMEPAGE_VAR_READARR_API_KEY}} 54 | - Synology: 55 | icon: synology.svg 56 | description: diskstation 57 | ping: 192.168.10.10 58 | href: "https://nas.local.martinbjeldbak.com" 59 | widget: 60 | type: diskstation 61 | url: http://192.168.10.10:5000 62 | username: {{HOMEPAGE_VAR_SYNOLOGY_STATS_USERNAME}} 63 | password: {{HOMEPAGE_VAR_SYNOLOGY_STATS_PASSWORD}} 64 | volume: volume_3 65 | - Overseerr: 66 | icon: overseerr.svg 67 | description: plex media requests 68 | href: "https://request.local.martinbjeldbak.com" 69 | server: localdocker 70 | container: overseerr 71 | widget: 72 | type: overseerr 73 | url: http://overseerr:5055 74 | key: {{HOMEPAGE_VAR_OVERSEERR_API_KEY}} 75 | - Prowlarr: 76 | icon: prowlarr.svg 77 | description: indexer 78 | href: "https://prowlarr.local.martinbjeldbak.com" 79 | server: localdocker 80 | container: prowlarr 81 | widget: 82 | type: prowlarr 83 | url: http://gluetun:9696 84 | key: {{HOMEPAGE_VAR_PROWLARR_API_KEY}} 85 | - Radarr: 86 | icon: radarr.svg 87 | description: movies 88 | href: "https://movies.local.martinbjeldbak.com" 89 | server: localdocker 90 | container: radarr 91 | widget: 92 | type: radarr 93 | url: http://radarr:7878 94 | key: {{HOMEPAGE_VAR_RADARR_API_KEY}} 95 | - Transmission: 96 | icon: transmission.svg 97 | description: torrents 98 | href: "https://torrents.local.martinbjeldbak.com" 99 | server: localdocker 100 | container: transmission 101 | widget: 102 | type: transmission 103 | url: http://gluetun:9091 104 | username: {{HOMEPAGE_VAR_TRANSMISSION_USERNAME}} 105 | password: {{HOMEPAGE_VAR_TRANSMISSION_PASSWORD}} 106 | - Romm: 107 | icon: romm.svg 108 | description: roms 109 | href: "https://roms.local.martinbjeldbak.com" 110 | server: localdocker 111 | container: romm 112 | widget: 113 | type: romm 114 | url: http://romm:8080 115 | username: {{HOMEPAGE_VAR_ROMM_USERNAME}} 116 | password: {{HOMEPAGE_VAR_ROMM_PASSWORD}} 117 | 118 | - Calibre-web: 119 | icon: calibreweb.svg 120 | description: ebooks 121 | href: "https://calibre-web.local.martinbjeldbak.com" 122 | server: localdocker 123 | container: calibre-web 124 | widget: 125 | type: calibreweb 126 | url: http://calibre-web:8083 127 | username: {{HOMEPAGE_VAR_CALIBRE_WEB_USERNAME}} 128 | password: {{HOMEPAGE_VAR_CALIBRE_WEB_PASSWORD}} 129 | 130 | - Releases: 131 | - Calendar: 132 | description: tv and movie releases 133 | widget: 134 | type: calendar 135 | integrations: 136 | - type: sonarr 137 | service_group: Media 138 | service_name: Sonarr 139 | - type: radarr 140 | service_group: Media 141 | service_name: Radarr 142 | 143 | - Applications: 144 | - Authentik: 145 | icon: authentik.svg 146 | href: "https://auth.local.martinbjeldbak.com" 147 | description: authentication erver 148 | server: localdocker 149 | container: authentik-server 150 | widget: 151 | type: authentik 152 | url: http://authentik-server:9000 153 | key: {{HOMEPAGE_VAR_AUTHENTIK_API_KEY}} 154 | - Paperless-ngx: 155 | icon: paperless-ngx.svg 156 | href: "https://paperless.local.martinbjeldbak.com" 157 | description: document storage 158 | server: localdocker 159 | container: paperless 160 | widget: 161 | type: paperlessngx 162 | url: http://paperless:8000 163 | key: {{HOMEPAGE_VAR_PAPERLESS_KEY}} 164 | - lubelogger: 165 | icon: "https://lubelogger.local.martinbjeldbak.com/defaults/lubelogger_icon_192.png" 166 | href: "https://lubelogger.local.martinbjeldbak.com" 167 | description: car maintenence 168 | server: localdocker 169 | container: lubelogger 170 | widget: 171 | type: lubelogger 172 | url: http://lubelogger:8080 173 | vehicleID: 1 174 | - Watchtower: 175 | icon: watchtower.svg 176 | description: docker updates 177 | server: localdocker 178 | container: watchtower 179 | widget: 180 | type: watchtower 181 | url: http://watchtower:8080 182 | key: {{HOMEPAGE_VAR_WATCHTOWER_API_TOKEN}} 183 | - Peanut Eaton 5E 1100i: 184 | icon: peanut.svg 185 | href: "https://peanut-eaton-5e-1100i.local.martinbjeldbak.com" 186 | description: ups monitoring 187 | server: localdocker 188 | container: peanut-eaton-5e-1100i 189 | widget: 190 | type: peanut 191 | url: http://peanut-eaton-5e-1100i:8080 192 | key: ups 193 | - Scrutiny: 194 | icon: scrutiny.svg 195 | href: "https://scrutiny.local.martinbjeldbak.com" 196 | description: s.m.a.r.t. tools 197 | server: localdocker 198 | container: scrutiny-web 199 | widget: 200 | type: scrutiny 201 | url: http://scrutiny-web:8080 202 | - Speedtest Tracker: 203 | icon: "https://speedtest.local.martinbjeldbak.com/img/speedtest-tracker-icon.png" 204 | href: "https://speedtest.local.martinbjeldbak.com" 205 | server: localdocker 206 | container: speedtest-tracker 207 | widget: 208 | type: speedtest 209 | url: http://speedtest-tracker 210 | - Immich: 211 | icon: immich.svg 212 | href: "https://immich.local.martinbjeldbak.com" 213 | server: localdocker 214 | container: immich-server 215 | widget: 216 | type: immich 217 | url: http://immich-server:2283 218 | key: {{HOMEPAGE_VAR_IMMICH_KEY}} 219 | version: 2 220 | - icloudpd: 221 | icon: docker.svg 222 | description: icloud photos downloader for backup to NAS 223 | href: https://icloudpd-n.local.martinbjeldbak.com 224 | server: localdocker 225 | container: icloudpd-n 226 | - dawarich: 227 | icon: docker.svg 228 | description: Location tracking 229 | href: https://dawarich.local.martinbjeldbak.com 230 | server: localdocker 231 | container: dawarich 232 | - dozzle: 233 | icon: docker.svg 234 | description: Docker logs 235 | href: https://dozzle.local.martinbjeldbak.com 236 | server: localdocker 237 | container: dozzle 238 | - syncthing: 239 | icon: syncthing.svg 240 | description: File syncing 241 | href: https://syncthing.local.martinbjeldbak.com 242 | server: localdocker 243 | container: syncthing 244 | 245 | - AdGuard: 246 | - AdGuard Home: 247 | icon: adguard-home.svg 248 | href: "https://dns.local.martinbjeldbak.com" 249 | description: main dns 250 | ping: dns.local.martinbjeldbak.com 251 | widget: 252 | type: adguard 253 | url: "https://dns.local.martinbjeldbak.com" 254 | username: {{HOMEPAGE_VAR_ADGUARD_HOME_ORIGIN_USERNAME}} 255 | password: {{HOMEPAGE_VAR_ADGUARD_HOME_ORIGIN_PASSWORD}} 256 | - AdGuard Home Replica: 257 | icon: adguard-home.svg 258 | href: "https://dns2.local.martinbjeldbak.com" 259 | description: secondary dns 260 | server: localdocker 261 | container: adguardhome 262 | widget: 263 | type: adguard 264 | url: http://adguardhome:3000 265 | username: {{HOMEPAGE_VAR_ADGUARD_HOME_REPLICA_USERNAME}} 266 | password: {{HOMEPAGE_VAR_ADGUARD_HOME_REPLICA_PASSWORD}} 267 | 268 | - Home Automation: 269 | - Home Assistant: 270 | icon: home-assistant.svg 271 | href: "https://homeassistant.local.martinbjeldbak.com" 272 | description: homeassistant 273 | server: localdocker 274 | container: homeassistant 275 | widget: 276 | type: homeassistant 277 | url: http://homeassistant:8123 278 | key: {{HOMEPAGE_VAR_HOMEASSISTANT_ACCESS_TOKEN}} 279 | - Scrypted: 280 | icon: https://www.scrypted.app/images/web_hi_res_512.png 281 | href: "https://scrypted.local.martinbjeldbak.com" 282 | description: cameras 283 | server: localdocker 284 | container: scrypted 285 | - ESPHome: 286 | icon: esphome.svg 287 | href: "https://esphome.local.martinbjeldbak.com" 288 | description: esp32 configuration 289 | server: localdocker 290 | container: esphome 291 | widget: 292 | type: esphome 293 | url: http://esphome:6052 294 | - zigbee2mqtt: 295 | icon: "https://zigbee2mqtt.local.martinbjeldbak.com/assets/favicon-a8299d0b.ico" 296 | description: z2m integration 297 | href: https://zigbee2mqtt.local.martinbjeldbak.com 298 | server: localdocker 299 | container: zigbee2mqtt 300 | - SLZB-06M: 301 | icon: "https://slzb-06m.local.martinbjeldbak.com/icons.svg?upd=1#SMLogo" 302 | description: zigbee hub 303 | href: https://slzb-06m.local.martinbjeldbak.com 304 | 305 | 306 | - Network: 307 | - OPNSense: 308 | icon: opnsense.svg 309 | description: firewall and router 310 | href: https://opnsense.local.martinbjeldbak.com/ 311 | ping: 192.168.1.1 312 | widget: 313 | type: opnsense 314 | url: https://192.168.1.1 315 | username: {{HOMEPAGE_VAR_OPNSENSE_HOMEPAGE_USERNAME}} 316 | password: {{HOMEPAGE_VAR_OPNSENSE_HOMEPAGE_PASSWORD}} 317 | - Crowdsec: 318 | icon: crowdsec.svg 319 | description: ids/ips 320 | ping: 192.168.1.1 321 | widget: 322 | type: crowdsec 323 | url: http://192.168.1.1:8089 324 | username: {{HOMEPAGE_VAR_CROWDSEC_USERNAME}} 325 | password: {{HOMEPAGE_VAR_CROWDSEC_PASSWORD}} 326 | - Unifi: 327 | icon: unifi.svg 328 | description: network infra 329 | href: "https://unifi.local.martinbjeldbak.com" 330 | ping: unifi.local.martinbjeldbak.com 331 | widget: 332 | type: unifi 333 | url: https://unifi.local.martinbjeldbak.com 334 | username: {{HOMEPAGE_VAR_UNIFI_USERNAME}} 335 | password: {{HOMEPAGE_VAR_UNIFI_PASSWORD}} 336 | - Caddy: 337 | icon: caddy.png 338 | description: web server 339 | server: localdocker 340 | container: caddy 341 | widget: 342 | type: caddy 343 | url: http://caddy:2019 344 | - Gluetun: 345 | icon: gluetun.svg 346 | description: vpn 347 | server: localdocker 348 | container: gluetun 349 | widget: 350 | type: gluetun 351 | url: http://gluetun:8000 352 | key: {{HOMEPAGE_VAR_GLUETUN_KEY}} 353 | - Tailscale Alderaan: 354 | icon: tailscale.svg 355 | description: mesh network 356 | href: "https://login.tailscale.com" 357 | widget: 358 | type: tailscale 359 | deviceid: {{HOMEPAGE_VAR_TAILSCALE_DEVICE_ID}} 360 | key: {{HOMEPAGE_VAR_TAILSCALE_API_KEY}} 361 | - Uptime Robot Home Internet: 362 | icon: "https://uptimerobot.com/assets/ico/favicon.ico" 363 | description: uptime monitoring 364 | href: "https://dashboard.uptimerobot.com/monitors/796218287" 365 | widget: 366 | type: uptimerobot 367 | url: https://api.uptimerobot.com 368 | key: {{HOMEPAGE_VAR_UPTIME_ROBOT_HOME_INTERNET_API_KEY}} 369 | -------------------------------------------------------------------------------- /homepage/config/settings.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # For configuration options and examples, please see: 3 | # https://gethomepage.dev/latest/configs/settings 4 | 5 | theme: dark 6 | color: slate 7 | providers: 8 | openweathermap: {{HOMEPAGE_VAR_OPENWEATHERMAP_API_KEY}} 9 | layout: 10 | Media: 11 | style: row 12 | columns: 4 13 | Network: 14 | style: row 15 | columns: 4 -------------------------------------------------------------------------------- /homepage/config/widgets.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # For configuration options and examples, please see: 3 | # https://gethomepage.dev/latest/configs/widgets 4 | 5 | - resources: 6 | cpu: true 7 | memory: true 8 | disk: / 9 | - search: 10 | provider: custom 11 | url: https://kagi.com/search?q= 12 | target: _blank 13 | suggestionUrl: https://kagi.com/api/autosuggest?q= 14 | showSearchSuggestions: true 15 | - openweathermap: 16 | label: Melbourne 17 | latitude: -37.8145996894535 18 | longitude: 144.94083240519333 19 | units: metric 20 | provider: openweathermap 21 | cache: 5 22 | format: 23 | maximumFractionDigits: 1 24 | - unifi_console: 25 | url: https://unifi.local.martinbjeldbak.com 26 | username: {{HOMEPAGE_VAR_UNIFI_USERNAME}} 27 | password: {{HOMEPAGE_VAR_UNIFI_PASSWORD}} 28 | - datetime: 29 | text_size: xl 30 | locale: da 31 | format: 32 | timeStyle: short 33 | hourCycle: h23 34 | -------------------------------------------------------------------------------- /huginn.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/huginn/huginn:latest 2 | 3 | USER root 4 | 5 | # Install extra dependencies to run `whois` and other commands using "Shell Command Agent" type 6 | RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C && \ 7 | apt-get update && \ 8 | apt-get install --no-install-recommends -y netbase whois && \ 9 | apt-get clean && \ 10 | rm -rf /var/lib/apt/lists/* 11 | 12 | USER 1001 13 | -------------------------------------------------------------------------------- /plex-meta-manager/martins.yml: -------------------------------------------------------------------------------- 1 | collections: 2 | The Lord of the Rings Extended Editions: 3 | plex_all: true 4 | filters: 5 | # Src: https://github.com/meisnate12/Plex-Meta-Manager-Configs/blob/b16bfc9e5dda2d7d5625dbce2826bfdfea3cf971/PMM/overlays/special_release.yml#L88 6 | filepath.regex: 7 | - '(?<=[0-9]{4}[)}>\]]\s).*\bExtended\b' 8 | title: The Lord of the Rings 9 | 10 | The Lord of the Rings: # try to override existing collection to get rid of extended 11 | plex_all: true 12 | filters: 13 | filepath.regex: 14 | - '(?<=[0-9]{4}[)}>\]]\s).*\bTheatrical\b' 15 | title: The Lord of the Rings 16 | 17 | The Hobbit Extended Editions: 18 | plex_all: true 19 | filters: 20 | filepath.regex: 21 | - '(?<=[0-9]{4}[)}>\]]\s).*\bExtended\b' 22 | title: The Hobbit 23 | 24 | # 2022-08-11 NOTE: Might have to manually collection first, still unsure 25 | The Hobbit: 26 | plex_all: true 27 | filters: 28 | filepath.regex: 29 | - '(?<=[0-9]{4}[)}>\]]\s).*\bTheatrical\b' 30 | title: The Hobbit 31 | 32 | Middle Earth Extended Editions: 33 | plex_all: true 34 | filters: 35 | filepath.regex: 36 | - '(?<=[0-9]{4}[)}>\]]\s).*\bExtended\b' 37 | title.regex: '(?i)\b(The Lord of the Rings)|(The Hobbit)\b' 38 | 39 | # 2022-08-11 NOTE: Might have to manually collection first, still unsure 40 | Middle Earth: 41 | plex_all: true 42 | filters: 43 | filepath.regex: 44 | - '(?<=[0-9]{4}[)}>\]]\s).*\bTheatrical\b' 45 | title.regex: '(?i)\b(The Lord of the Rings)|(The Hobbit)\b' 46 | 47 | Star Wars the Complete Collection: 48 | trakt_list: 49 | - https://trakt.tv/users/darkman1498/lists/star-wars 50 | collection_order: custom 51 | sync_mode: sync 52 | radarr_add_missing: true 53 | radarr_add_existing: true 54 | radarr_monitor: true 55 | radarr_quality: Ultra-HD 56 | -------------------------------------------------------------------------------- /plextraktsync/config.yml: -------------------------------------------------------------------------------- 1 | cache: 2 | path: $PTS_CACHE_DIR/trakt_cache 3 | logging: 4 | append: true 5 | debug: false 6 | filename: plextraktsync.log 7 | sync: 8 | plex_to_trakt: 9 | collection: true 10 | ratings: true 11 | watched_status: true 12 | trakt_to_plex: 13 | liked_lists: true 14 | ratings: true 15 | watched_status: true 16 | watchlist: true 17 | watch: 18 | add_collection: false 19 | remove_collection: false 20 | scrobble_threshold: 80 21 | username_filter: true 22 | xbmc-providers: 23 | movies: imdb 24 | shows: tvdb 25 | -------------------------------------------------------------------------------- /recyclarr/recyclarr.yml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/recyclarr/recyclarr/master/schemas/config-schema.json 2 | 3 | # A starter config to use with Recyclarr. Most values are set to "reasonable defaults". Update the 4 | # values below as needed for your instance. You will be required to update the API Key and URL for 5 | # each instance you want to use. 6 | # 7 | # Many optional settings have been omitted to keep this template simple. Note that there's no "one 8 | # size fits all" configuration. Please refer to the guide to understand how to build the appropriate 9 | # configuration based on your hardware setup and capabilities. 10 | # 11 | # For any lines that mention uncommenting YAML, you simply need to remove the leading hash (`#`). 12 | # The YAML comments will already be at the appropriate indentation. 13 | # 14 | # For more details on the configuration, see the Configuration Reference on the wiki here: 15 | # https://recyclarr.dev/wiki/reference/config-reference 16 | 17 | # Configuration specific to Sonarr 18 | sonarr: 19 | main_sonarr: 20 | # Set the URL/API Key to your actual instance 21 | base_url: !env_var SONARR_BASE_URL 22 | api_key: !env_var SONARR_API_KEY 23 | 24 | delete_old_custom_formats: true 25 | replace_existing_custom_formats: true 26 | 27 | # Quality definitions from the guide to sync to Sonarr. Choices: series, anime 28 | quality_definition: 29 | type: series 30 | 31 | quality_profiles: 32 | - name: Main v2 33 | reset_unmatched_scores: 34 | enabled: true 35 | upgrade: 36 | allowed: true 37 | until_quality: Bluray-2160p 38 | until_score: 50 39 | min_format_score: 50 40 | score_set: default 41 | quality_sort: top 42 | qualities: 43 | - name: Bluray-2160p 44 | - name: WEB 2160p 45 | qualities: 46 | - WEBRip-2160p 47 | - WEBDL-2160p 48 | - name: HDTV-2160p 49 | - name: Bluray-1080p 50 | - name: WEB 1080p 51 | qualities: 52 | - WEBRip-1080p 53 | - WEBDL-1080p 54 | - name: HDTV-1080p 55 | - name: Bluray-720p 56 | - name: WEB 720p 57 | qualities: 58 | - WEBRip-720p 59 | - WEBDL-720p 60 | - name: HDTV-720p 61 | 62 | 63 | custom_formats: 64 | - trash_ids: 65 | # [No Category] 66 | - 290078c8b266272a5cc8e251b5e2eb0b # 1080p 67 | - 1bef6c151fa35093015b0bfef18279e5 # 2160p 68 | - c99279ee27a154c2f20d1d505cc99e25 # 720p 69 | - 6f808933a71bd9666531610cb8c059cc # BR-DISK (BTN) 70 | - 5d9fd1b1e06cd8a475462f40214b7df6 # FLUX 71 | - 4a20cfb76b5f92a8ca22b894b32e71be # Multi-Episode 72 | - e0c1a67f23908a55b6ae9834e8ed6727 # Single Episode 73 | 74 | # Anime Misc 75 | - d2d7b8a9d39413da5f44054080e028a3 # v0 76 | - 273bd326df95955e1b6c26527d1df89b # v1 77 | - 228b8ee9aa0a609463efca874524a6b8 # v2 78 | - 0e5833d3af2cc5fa96a0c29cd4477feb # v3 79 | - 4fc15eeb8f2f9a749f918217d4234ad8 # v4 80 | 81 | # Anime Optional 82 | - b2550eb333d27b75833e25b8c2557b38 # 10bit 83 | - 418f50b10f1907201b6cfdf881f467b7 # Anime Dual Audio 84 | - 9c14d194486c4014d422adc64092d794 # Dubs Only 85 | - 026d5aadd1a6b4e550b134cb6c72b3ca # Uncensored 86 | 87 | # Anime Source Groups 88 | - 949c16fe0a8147f50ba82cc2df9411c9 # Anime BD Tier 01 (Top SeaDex Muxers) 89 | - ed7f1e315e000aef424a58517fa48727 # Anime BD Tier 02 (SeaDex Muxers) 90 | - 096e406c92baa713da4a72d88030b815 # Anime BD Tier 03 (SeaDex Muxers) 91 | - 30feba9da3030c5ed1e0f7d610bcadc4 # Anime BD Tier 04 (SeaDex Muxers) 92 | - 545a76b14ddc349b8b185a6344e28b04 # Anime BD Tier 05 (Remuxes) 93 | - 25d2afecab632b1582eaf03b63055f72 # Anime BD Tier 06 (FanSubs) 94 | - 0329044e3d9137b08502a9f84a7e58db # Anime BD Tier 07 (P2P/Scene) 95 | - c81bbfb47fed3d5a3ad027d077f889de # Anime BD Tier 08 (Mini Encodes) 96 | - e3515e519f3b1360cbfc17651944354c # Anime LQ Groups 97 | - b4a1b3d705159cdca36d71e57ca86871 # Anime Raws 98 | - e0014372773c8f0e1bef8824f00c7dc4 # Anime Web Tier 01 (Muxers) 99 | - 19180499de5ef2b84b6ec59aae444696 # Anime Web Tier 02 (Top FanSubs) 100 | - c27f2ae6a4e82373b0f1da094e2489ad # Anime Web Tier 03 (Official Subs) 101 | - 4fd5528a3a8024e6b49f9c67053ea5f3 # Anime Web Tier 04 (Official Subs) 102 | - 29c2a13d091144f63307e4a8ce963a39 # Anime Web Tier 05 (FanSubs) 103 | - dc262f88d74c651b12e9d90b39f6c753 # Anime Web Tier 06 (FanSubs) 104 | 105 | # Anime Streaming Services 106 | - a370d974bc7b80374de1d9ba7519760b # ABEMA 107 | - d54cd2bf1326287275b56bccedb72ee2 # ADN 108 | - 7dd31f3dee6d2ef8eeaa156e23c3857e # B-Global 109 | - 4c67ff059210182b59cdd41697b8cb08 # Bilibili 110 | - 3e0b26604165f463f3e8e192261e7284 # CR 111 | - 1284d18e693de8efe0fe7d6b3e0b9170 # FUNi 112 | - 570b03b3145a25011bf073274a407259 # HIDIVE 113 | - 44a8ee6403071dd7b8a3a8dd3fe8cb20 # VRV 114 | - e5e6405d439dcd1af90962538acd4fe0 # WKN 115 | 116 | # Asian Streaming Services 117 | - 7be9c0572d8cd4f81785dacf7e85985e # FOD 118 | - 4404ad44d87ccbb82746e180713112fb # HTSR 119 | - 86f8d3b8761de651aa355d46d5d8db3e # TVING 120 | - d100ea972d1af2150b65b1cffb80f6b5 # TVer 121 | - 0e99e7cc719a8a73b2668c3a0c3fe10c # U-NEXT 122 | - 93c9d1e566dca8b34d57f5efbbf85f28 # VIU 123 | 124 | # Audio Advanced #1 125 | - b6fbafa7942952a13e17e2b1152b539a # ATMOS (undefined) 126 | - 63487786a8b01b7f20dd2bc90dd4a477 # DD+ 127 | - 4232a509ce60c4e208d13825b7c06264 # DD+ ATMOS 128 | - 5964f2a8b3be407d083498e4459d05d0 # DTS 129 | - 9d00418ba386a083fbf4d58235fc37ef # DTS X 130 | - c1a25cd67b5d2e08287c957b1eb903ec # DTS-ES 131 | - c429417a57ea8c41d57e6990a8b0033f # DTS-HD MA 132 | - 1808e4b9cee74e064dfae3f1db99dbfe # TrueHD 133 | - 0d7824bb924701997f874e7ff7d4844a # TrueHD ATMOS 134 | 135 | # Audio Advanced #2 136 | - a50b8a0c62274a7c38b09a9619ba9d86 # AAC 137 | - dbe00161b08a25ac6154c55f95e6318d # DD 138 | - cfa5fbd8f02a86fc55d8d223d06a5e1f # DTS-HD HRA 139 | - 851bd64e04c9374c51102be3dd9ae4cc # FLAC 140 | - 3e8b714263b26f486972ee1e0fe7606c # MP3 141 | - 28f6ef16d61e2d1adfce3156ed8257e3 # Opus 142 | - 30f70576671ca933adbdcfc736a69718 # PCM 143 | 144 | # Audio Channels 145 | - bd6dd5e043aa27ff4696a08d011c7d96 # 1.0 Mono 146 | - 834e534f103938853ffced4203b53e72 # 2.0 Stereo 147 | - 42cba7e38c7947a6d1d0a62580ee6d62 # 3.0 Sound 148 | - 1895195e84767de180653914ce207245 # 4.0 Sound 149 | - 3fbafa924f361e66fbc6187af82dfa85 # 5.1 Surround 150 | - 9fb6d778592c293467437593ef394bf1 # 6.1 Surround 151 | - 204c8c3e7315bb0ea81332774fa888d6 # 7.1 Surround 152 | 153 | # Dutch Streaming Services 154 | - b2b980877494b560443631eb1f473867 # NLZ 155 | - 5d2317d99af813b6529c7ebf01c83533 # VDL 156 | 157 | # French Audio Version 158 | - 84f0acbda9c0c9de783894fb66df25aa # FanSUB 159 | - ea0bb4b6ba388992fad1092703b5ff7b # FastSUB 160 | - 4721382d9ee05f1b4967a25e75072911 # French Audio 161 | - 2f6e84efc47246ec9071e311e71c4953 # Multi-Audio 162 | - 7982e39789f17864f57b11f1996844f4 # Multi-French 163 | - 34789ec3caa819f087e23bbf9999daf7 # VF2 164 | - 0ce1e39a4676c6692ce47935278dac76 # VFB 165 | - 2c29a39a4fdfd6d258799bc4c09731b9 # VFF 166 | - b6816a0e1d4b64bf3550ad3b74b009b6 # VFI 167 | - 7a7f4e4f58bd1058440236d033a90b67 # VFQ 168 | - 7ae924ee9b2f39df3283c6c0beb8a2aa # VOF 169 | - 802dd70b856c423a9b0cb7f34ac42be1 # VOQ 170 | - 07a32f77690263bb9fda1842db7e273f # VOSTFR 171 | - 82085412d9a53ba8d8e46fc624eb701d # VQ 172 | 173 | # French Source Groups 174 | - 44b6c964dad997577d793fd004a39224 # FR Anime FanSub 175 | - db13a377f7afb29975ea39470434d2ef # FR Anime Tier 01 176 | - 4e6134a384dbc0ef166234cc0e45d26d # FR Anime Tier 02 177 | - db34d4357937fbfe89b63ba095f22155 # FR Anime Tier 03 178 | - d844321db5e126d2e7e46152f0706532 # FR HD Bluray Tier 01 179 | - 3ba797e5dc13af4b8d9bb25e83d90de2 # FR LQ 180 | - b8e91cc8fb2bd96468fab74730c30d18 # FR Remux Tier 01 181 | - 2f3422339d185eb227a324644a2fbfca # FR Scene Groups 182 | - ddb8eaa9c85a549c50034d280539d54d # FR WEB Tier 01 183 | - a4c51febd4d8b2a0db10a3c974f21d92 # FR WEB Tier 02 184 | - dbfc0a4b5cb4cbd693311c4482ae9683 # FR WEB Tier 03 185 | 186 | # French Streaming Services 187 | - f27d46a831e6b16fa3fee2c4e5d10984 # CANAL+ 188 | - b0d6195c23ae254932da00512db7e8a8 # RTBF 189 | - 0455d6519a550dbf648c97b56e7231d2 # SALTO 190 | 191 | # General Streaming Services 192 | - d660701077794679fd59e8bdf4ce3a29 # AMZN 193 | - f67c9ca88f463a48346062e8ad07713f # ATVP 194 | - 77a7b25585c18af08f60b1547bb9b4fb # CC 195 | - 36b72f59f4ea20aad9316f475f2d9fbb # DCU 196 | - 89358767a60cc28783cdc3d0be9388a4 # DSNP 197 | - 7a235133c87f7da4c8cccceca7e3c7a6 # HBO 198 | - a880d6abc21e7c16884f3ae393f84179 # HMAX 199 | - f6cce30f1733d5c8194222a7507909bb # HULU 200 | - 81d1fbf600e2540cee87f3a23f9d3c1c # MAX 201 | - d34870697c9db575f17700212167be23 # NF 202 | - 1656adc6d7bb2c8cca6acfb6592db421 # PCOK 203 | - c67a75ae4a1715f2bb4d492755ba4195 # PMTP 204 | - ae58039e1319178e6be73caab5c42166 # SHO 205 | - 1efe8da11bfd74fbbcd4d8117ddb9213 # STAN 206 | - 9623c5c9cac8e939c1b9aedd32f640bf # SYFY 207 | - 0ac24a2a68a9700bcb7eeca8e5cd644c # iT 208 | 209 | # HDR Formats 210 | - 6d0d8de7b57e35518ac0308b0ddf404e # DV 211 | - 7878c33f1963fefb3d6c8657d46c2f0a # DV HDR10 212 | - 2b239ed870daba8126a53bd5dc8dc1c8 # DV HDR10+ 213 | - 1f733af03141f068a540eec352589a89 # DV HLG 214 | - 27954b0a80aab882522a88a4d9eae1cd # DV SDR 215 | - 3e2c4e748b64a1a1118e0ea3f4cf6875 # HDR 216 | - bb019e1cd00f304f80971c965de064dc # HDR (undefined) 217 | - 3497799d29a085e2ac2df9d468413c94 # HDR10 218 | - a3d82cbef5039f8d295478d28a887159 # HDR10+ 219 | - 17e889ce13117940092308f48b48b45b # HLG 220 | - 2a7e3be05d3861d6df7171ec74cad727 # PQ 221 | 222 | # HQ Source Groups 223 | - d6819cba26b1a6508138d25fb5e32293 # HD Bluray Tier 01 224 | - c2216b7b8aa545dc1ce8388c618f8d57 # HD Bluray Tier 02 225 | - 9965a052eb87b0d10313b1cea89eb451 # Remux Tier 01 226 | - 8a1d0c3d7497e741736761a1da866a2e # Remux Tier 02 227 | - d0c516558625b04b363fa6c5c2c7cfd4 # WEB Scene 228 | - e6258996055b9fbab7e9cb2f75819294 # WEB Tier 01 229 | - 58790d4e2fdcd9733aa7ae68ba2bb503 # WEB Tier 02 230 | - d84935abd3f8556dcd51d4f27e22d0a6 # WEB Tier 03 231 | 232 | # Misc 233 | - d7c747094a7c65f4c2de083c24899e8b # FreeLeech 234 | - 4aee45b0868229c4fbd8bad3e315f1d0 # MPEG2 235 | - 7ba05c6e0e14e793538174c679126996 # Multi 236 | - eb3d5cc0a2be0db205fb823640db6a3c # Repack v2 237 | - 44e7c4de10ae50265753082e5dc76047 # Repack v3 238 | - ec8fa7296b64e8cd390a1600981f3923 # Repack/Proper 239 | - cddfb4e32db826151d97352b8e37c648 # x264 240 | - c9eafd50846d299b862ca9bb6ea91950 # x265 241 | - 041d90b435ebd773271cea047a457a6a # x266 242 | 243 | # Misc Streaming Services 244 | - 4e9a630db98d5391aec1368a0256e2fe # CRAV 245 | - dc5f2bb0e0262155b5fedd0f6c5d2b55 # DSCP 246 | - fb1a91cdc0f26f7ca0696e0e95274645 # OViD 247 | - 3ac5d84fce98bab1b531393e9c82f467 # QIBI 248 | - c30d2958827d1867c73318a5a2957eb1 # RED 249 | - fe4062eac43d4ea75955f8ae48adcf1e # STRP 250 | 251 | # Optional 252 | - 32b367365729d530ca1c124a0b180c64 # Bad Dual Groups 253 | - ef4963043b0987f8485bc9106f16db38 # DV (Disk) 254 | - 9b27ab6498ec0f31a3353992e19434ca # DV (WEBDL) 255 | - 385e9e8581d33133c3961bdcdeffb7b4 # DV HDR10+ Boost 256 | - 0dad0a507451acddd754fe6dc3a7f5e7 # HDR10+ Boost 257 | - 1bd69272e23c5e6c5b1d6c8a36fce95e # HFR 258 | - 5ab46ff851b76c337e13e81a4353875f # INTERNAL 259 | - 82d40da2bc6923f41e14394075dd4b03 # No-RlsGroup 260 | - e1a997ddb54e3ecbfe06341ad323c458 # Obfuscated 261 | - 06d66ab109d4d2eddb2794d21526d140 # Retags 262 | - 2016d1676f5ee13a5b7257ff86ac9a93 # SDR 263 | - 83304f261cf516bb208c18c54c0adf97 # SDR (no WEBDL) 264 | - 1b3994c551cbb92a2c781af061f4ab44 # Scene 265 | - 3bc5f395426614e155e585a2f056cdf1 # Season Pack 266 | - 90501962793d580d011511155c97e4e5 # VP9 267 | - 9b64dff695c2115facf1b6ea59c9bd07 # x265 (no HDR/DV) 268 | 269 | # Optional Streaming Services 270 | - 43b3cf48cb385cd3eac608ee6bca7f09 # UHD Streaming Boost 271 | - d2d299244a92b8a52d4921ce3897a256 # UHD Streaming Cut 272 | 273 | # Series Versions 274 | - 3a4127d8aa781b44120d907f2cd62627 # Hybrid 275 | - b735f09d3c025cbb7d75a5d38325b73b # Remaster 276 | 277 | # UK Streaming Services 278 | - bbcaf03147de0f73be2be4a9078dfa03 # 4OD 279 | - fcc09418f67ccaddcf3b641a22c5cfd7 # ALL4 280 | - dc503e2425126fa1d0a9ad6168c83b3f # IP 281 | - fa5a16b951004c23e980d2913694a137 # ITVX 282 | - b66a699fba6f9df91becab798d7502e5 # NOW 283 | 284 | # Unwanted 285 | - 15a05bc7c1a36e2b57fd628f8977e2fc # AV1 286 | - 85c61753df5da1fb2aab6f2a47426b09 # BR-DISK 287 | - fbcb31d8dabd2a319072b84fc0b7249c # Extras 288 | - 9c11cd3f07101cdba90a2d81cf0e56b4 # LQ 289 | - e2315f990da2e2cbfc9fa5b7a6fcfe48 # LQ (Release Title) 290 | - 23297a736ca77c0fc8e70f8edd7ee56c # Upscaled 291 | - 47435ece6b99a0b477caf360e79ba0bb # x265 (HD) 292 | assign_scores_to: 293 | - name: Main v2 294 | 295 | 296 | 297 | 298 | # Configuration specific to Radarr. 299 | radarr: 300 | main_radarr: 301 | # Set the URL/API Key to your actual instance 302 | base_url: !env_var RADARR_BASE_URL 303 | api_key: !env_var RADARR_API_KEY 304 | 305 | # Set to 'true' to automatically remove custom formats from Radarr when they are removed from 306 | # the guide or your configuration. This will NEVER delete custom formats you manually created! 307 | delete_old_custom_formats: true 308 | replace_existing_custom_formats: true 309 | 310 | # Which quality definition in the guide to sync to Radarr. Only choice right now is 'movie' 311 | quality_definition: 312 | type: movie 313 | 314 | quality_profiles: 315 | - name: Main v2 316 | reset_unmatched_scores: 317 | enabled: true 318 | upgrade: 319 | allowed: true 320 | until_quality: Bluray-2160p 321 | until_score: 50 322 | min_format_score: 50 323 | score_set: default 324 | quality_sort: top 325 | qualities: 326 | - name: Bluray-2160p 327 | - name: WEB 2160p 328 | qualities: 329 | - WEBRip-2160p 330 | - WEBDL-2160p 331 | - name: HDTV-2160p 332 | - name: Bluray-1080p 333 | - name: WEB 1080p 334 | qualities: 335 | - WEBRip-1080p 336 | - WEBDL-1080p 337 | - name: HDTV-1080p 338 | - name: Remux-2160p # these files are gigantic. ordered last 339 | - name: Remux-1080p # these files are gigantic. ordered last 340 | - name: Bluray-720p 341 | - name: WEB 720p 342 | qualities: 343 | - WEBRip-720p 344 | - WEBDL-720p 345 | - name: HDTV-720p 346 | 347 | custom_formats: 348 | # A list of custom formats to sync to Radarr. 349 | # Use `recyclarr radarr --list-custom-formats` for values you can put here. 350 | # https://trash-guides.info/Radarr/Radarr-collection-of-custom-formats/ 351 | - trash_ids: 352 | # [No Category] 353 | - 820b09bb9acbfde9c35c71e0e565dad8 # 1080p 354 | - fb392fb0d61a010ae38e49ceaa24a1ef # 2160p 355 | - b2be17d608fc88818940cd1833b0b24c # 720p 356 | - 5153ec7413d9dae44e24275589b5e944 # BHDStudio 357 | - e098247bc6652dd88c76644b275260ed # FLUX 358 | - ff5bc9e8ce91d46c997ca3ac6994d6f8 # FraMeSToR 359 | - 8cd3ac70db7ac318cf9a0e01333940a4 # SiC 360 | - 7a0d1ad358fee9f5b074af3ef3f9d9ef # hallowed 361 | 362 | # Anime 363 | - fb3ccc5d5cc8f77c9055d4cb4561dded # Anime BD Tier 01 (Top SeaDex Muxers) 364 | - 66926c8fa9312bc74ab71bf69aae4f4a # Anime BD Tier 02 (SeaDex Muxers) 365 | - fa857662bad28d5ff21a6e611869a0ff # Anime BD Tier 03 (SeaDex Muxers) 366 | - f262f1299d99b1a2263375e8fa2ddbb3 # Anime BD Tier 04 (SeaDex Muxers) 367 | - ca864ed93c7b431150cc6748dc34875d # Anime BD Tier 05 (Remuxes) 368 | - 9dce189b960fddf47891b7484ee886ca # Anime BD Tier 06 (FanSubs) 369 | - 1ef101b3a82646b40e0cab7fc92cd896 # Anime BD Tier 07 (P2P/Scene) 370 | - 6115ccd6640b978234cc47f2c1f2cadc # Anime BD Tier 08 (Mini Encodes) 371 | - b0fdc5897f68c9a68c70c25169f77447 # Anime LQ Groups 372 | - 06b6542a47037d1e33b15aa3677c2365 # Anime Raws 373 | - 8167cffba4febfb9a6988ef24f274e7e # Anime Web Tier 01 (Muxers) 374 | - 8526c54e36b4962d340fce52ef030e76 # Anime Web Tier 02 (Top FanSubs) 375 | - de41e72708d2c856fa261094c85e965d # Anime Web Tier 03 (Official Subs) 376 | - 9edaeee9ea3bcd585da9b7c0ac3fc54f # Anime Web Tier 04 (Official Subs) 377 | - 22d953bbe897857b517928f3652b8dd3 # Anime Web Tier 05 (FanSubs) 378 | - a786fbc0eae05afe3bb51aee3c83a9d4 # Anime Web Tier 06 (FanSubs) 379 | - c259005cbaeb5ab44c06eddb4751e70c # v0 380 | - 5f400539421b8fcf71d51e6384434573 # v1 381 | - 3df5e6dfef4b09bb6002f732bed5b774 # v2 382 | - db92c27ba606996b146b57fbe6d09186 # v3 383 | - d4e5e842fad129a3c097bdb2d20d31a0 # v4 384 | 385 | # Anime Optional 386 | - a5d148168c4506b55cf53984107c396e # 10bit 387 | - 4a3b087eea2ce012fcc1ce319259a3be # Anime Dual Audio 388 | - b23eae459cc960816f2d6ba84af45055 # Dubs Only 389 | - 064af5f084a0a24458cc8ecd3220f93f # Uncensored 390 | 391 | # Anime Streaming Services 392 | - 60f6d50cbd3cfc3e9a8c00e3a30c3114 # VRV 393 | 394 | # Asian Streaming Services 395 | - 917d1f2c845b2b466036b0cc2d7c72a3 # FOD 396 | - 834b2c0ba0a8596029b4479a29e1a032 # HTSR 397 | - 26df36e3d2a96de2f8b7166ae37d3c33 # TVING 398 | - f1b0bae9bc222dab32c1b38b5a7a1088 # TVer 399 | - 279bda7434fd9075786de274e6c3c202 # U-NEXT 400 | - 1b355ff093fd1064b75ea98c616881b1 # VIU 401 | 402 | # Audio Advanced #1 403 | - 417804f7f2c4308c1f4c5d380d4c4475 # ATMOS (undefined) 404 | - 185f1dd7264c4562b9022d963ac37424 # DD+ 405 | - 1af239278386be2919e1bcee0bde047e # DD+ ATMOS 406 | - 1c1a4c5e823891c75bc50380a6866f73 # DTS 407 | - 2f22d89048b01681dde8afe203bf2e95 # DTS X 408 | - f9f847ac70a0af62ea4a08280b859636 # DTS-ES 409 | - dcf3ec6938fa32445f590a4da84256cd # DTS-HD MA 410 | - 3cafb66171b47f226146a0770576870f # TrueHD 411 | - 496f355514737f7d83bf7aa4d24f8169 # TrueHD ATMOS 412 | 413 | # Audio Advanced #2 414 | - 240770601cc226190c367ef59aba7463 # AAC 415 | - c2998bd0d90ed5621d8df281e839436e # DD 416 | - 8e109e50e0a0b83a5098b056e13bf6db # DTS-HD HRA 417 | - a570d4a0e56a2874b64e5bfa55202a1b # FLAC 418 | - 6ba9033150e7896bdc9ec4b44f2b230f # MP3 419 | - a061e2e700f81932daf888599f8a8273 # Opus 420 | - e7c2fcae07cbada050a0af3357491d7b # PCM 421 | 422 | # Audio Channels 423 | - b124be9b146540f8e62f98fe32e49a2a # 1.0 Mono 424 | - 89dac1be53d5268a7e10a19d3c896826 # 2.0 Stereo 425 | - 205125755c411c3b8622ca3175d27b37 # 3.0 Sound 426 | - 373b58bd188fc00c817bd8c7470ea285 # 4.0 Sound 427 | - 77ff61788dfe1097194fd8743d7b4524 # 5.1 Surround 428 | - 6fd7b090c3f7317502ab3b63cc7f51e3 # 6.1 Surround 429 | - e77382bcfeba57cb83744c9c5449b401 # 7.1 Surround 430 | 431 | # Dutch Streaming Services 432 | - bf7e73dd1d85b12cc527dc619761c840 # Pathe 433 | - 996e8ce50025e8b1e8fa95fcb28c4e5a # VDL 434 | 435 | # French Audio Version 436 | - 02e48d30a176c91baf9e15de05e5dc6a # FanSUB 437 | - 7f9b93f82b7e996391525f2be1d891e0 # FastSUB 438 | - 6d27683346c78d6a3f772e30877910a7 # French Audio 439 | - 72b1548df1ac3175ca105a9ce7043c91 # Multi-Audio 440 | - d5f3a1afdb77e6b95e489f7654532d04 # Multi-French 441 | - 29b5f7b1a5f20f64228786c3ab1bdc7d # VF2 442 | - b3fb499641d7b3c2006be1d9eb014cb3 # VFB 443 | - 404c08fd0bd67f39b4d8e5709319094e # VFF 444 | - 52772f1cad6b5d26c2551f79bc538a50 # VFI 445 | - b6ace47331a1d3b77942fc18156f6df6 # VFQ 446 | - 4cafa20d5584f6ba1871d1b8941aa3cb # VOF 447 | - f7caa1942be5cc547c266bd3dbc2cda9 # VOQ 448 | - 9172b2f683f6223e3a1846427b417a3d # VOSTFR 449 | - 95aa50f71a01c82354a7a2b385f1c4d8 # VQ 450 | 451 | # French Source Groups 452 | - 5322da05b19d857acc1e75be3edf47b3 # FR HD Bluray Tier 01 453 | - 57f34251344be2e283fc30e00e458be6 # FR HD Bluray Tier 02 454 | - 48f031e76111f17ea94898f4cdc34fdc # FR LQ 455 | - 5583260016e0b9f683f53af41fb42e4a # FR Remux Tier 01 456 | - 9019d81307e68cd4a7eb06a567e833b8 # FR Remux Tier 02 457 | - 0d94489c0d5828cd3bf9409d309fb32b # FR Scene Groups 458 | - 64f8f12bbf7472a6ccf838bfd6b5e3e8 # FR UHD Bluray Tier 01 459 | - 0dcf0c8a386d82e3f2d424189af14065 # FR UHD Bluray Tier 02 460 | - 9790a618cec1aeac8ce75601a17ea40d # FR WEB Tier 01 461 | - 3c83a765f84239716bd5fd2d7af188f9 # FR WEB Tier 02 462 | 463 | # General Streaming Services 464 | - b3b3a6ac74ecbd56bcdbefa4799fb9df # AMZN 465 | - 40e9380490e748672c2522eaaeb692f7 # ATVP 466 | - cc5e51a9e85a6296ceefe097a77f12f4 # BCORE 467 | - 16622a6911d1ab5d5b8b713d5b0036d4 # CRiT 468 | - 84272245b2988854bfb76a16e60baea5 # DSNP 469 | - 509e5f41146e278f9eab1ddaceb34515 # HBO 470 | - 5763d1b0ce84aff3b21038eea8e9b8ad # HMAX 471 | - 526d445d4c16214309f0fd2b3be18a89 # Hulu 472 | - 2a6039655313bf5dab1e43523b62c374 # MA 473 | - 6a061313d22e51e0f25b7cd4dc065233 # MAX 474 | - 170b1d363bd8516fbf3a3eb05d4faff6 # NF 475 | - c9fd353f8f5f1baf56dc601c4cb29920 # PCOK 476 | - e36a0ba1bc902b26ee40818a1d59b8bd # PMTP 477 | - c2863d2a50c9acad1fb50e53ece60817 # STAN 478 | - e0ec9672be6cac914ffad34a6b077209 # iT 479 | 480 | # HDR Formats 481 | - 58d6a88f13e2db7f5059c41047876f00 # DV 482 | - e23edd2482476e595fb990b12e7c609c # DV HDR10 483 | - c53085ddbd027d9624b320627748612f # DV HDR10+ 484 | - 55d53828b9d81cbe20b02efd00aa0efd # DV HLG 485 | - a3e19f8f627608af0211acd02bf89735 # DV SDR 486 | - e61e28db95d22bedcadf030b8f156d96 # HDR 487 | - 2a4d9069cc1fe3242ff9bdaebed239bb # HDR (undefined) 488 | - dfb86d5941bc9075d6af23b09c2aeecd # HDR10 489 | - b974a6cd08c1066250f1f177d7aa1225 # HDR10+ 490 | - 9364dd386c9b4a1100dde8264690add7 # HLG 491 | - 08d6d8834ad9ec87b1dc7ec8148e7a1f # PQ 492 | 493 | # HQ Release Groups 494 | - ed27ebfef2f323e964fb1f61391bcb35 # HD Bluray Tier 01 495 | - c20c8647f2746a1f4c4262b0fbbeeeae # HD Bluray Tier 02 496 | - 5608c71bcebba0a5e666223bae8c9227 # HD Bluray Tier 03 497 | - 3a3ff47579026e76d6504ebea39390de # Remux Tier 01 498 | - 9f98181fe5a3fbeb0cc29340da2a468a # Remux Tier 02 499 | - 8baaf0b3142bf4d94c42a724f034e27a # Remux Tier 03 500 | - 4d74ac4c4db0b64bff6ce0cffef99bf0 # UHD Bluray Tier 01 501 | - a58f517a70193f8e578056642178419d # UHD Bluray Tier 02 502 | - e71939fae578037e7aed3ee219bbe7c1 # UHD Bluray Tier 03 503 | - c20f169ef63c5f40c2def54abaf4438e # WEB Tier 01 504 | - 403816d65392c79236dcb6dd591aeda4 # WEB Tier 02 505 | - af94e0fe497124d1f9ce732069ec8c3b # WEB Tier 03 506 | 507 | # Misc 508 | - 9de657fd3d327ecf144ec73dfe3a3e9a # Dutch Groups 509 | - 0d91270a7255a1e388fa85e959f359d8 # FreeLeech 510 | - ff86c4326018682f817830ced463332b # MPEG2 511 | - 4b900e171accbfb172729b63323ea8ca # Multi 512 | - e7718d7a3ce595f289bfee26adc178f5 # Repack/Proper 513 | - ae43b294509409a6a13919dedd4764c4 # Repack2 514 | - 5caaaa1c08c1742aa4342d8c4cc463f2 # Repack3 515 | - 2899d84dc9372de3408e6d8cc18e9666 # x264 516 | - 9170d55c319f4fe40da8711ba9d8050d # x265 517 | - 390455c22a9cac81a738f6cbad705c3c # x266 518 | 519 | # Misc Streaming Services 520 | - f6ff65b3f4b464a79dcc75950fe20382 # CRAV 521 | - fbca986396c5e695ef7b2def3c755d01 # OViD 522 | - ab56ccdc473a1f2897c76187ea365be2 # STRP 523 | 524 | # Movie Versions 525 | - eca37840c13c6ef2dd0262b141a5482f # 4K Remaster 526 | - e0c07d59beb37348e975a930d5e50319 # Criterion Collection 527 | - 0f12c086e289cf966fa5948eac571f44 # Hybrid 528 | - eecf3a857724171f968a66cb5719e152 # IMAX 529 | - 9f6cbff8cfe4ebbc1bde14c7b7bec0de # IMAX Enhanced 530 | - 9d27d9d2181838f76dee150882bdc58c # Masters of Cinema 531 | - 09d9dd29a0fc958f9796e65c2a8864b4 # Open Matte 532 | - 570bc9ebecd92723d2d21500f4be314c # Remaster 533 | - 957d0f44b592285f26449575e8b1167e # Special Edition 534 | - e9001909a4c88013a359d0b9920d7bea # Theatrical Cut 535 | - db9b4c4b53d312a3ca5f1378f6440fc9 # Vinegar Syndrome 536 | 537 | # Optional 538 | - b6832f586342ef70d9c128d40c07b872 # Bad Dual Groups 539 | - f700d29429c023a5734505e77daeaea7 # DV (Disk) 540 | - 923b6abef9b17f937fab56cfcf89e1f1 # DV (WEBDL) 541 | - 55a5b50cb416dea5a50c4955896217ab # DV HDR10+ Boost 542 | - 90cedc1fea7ea5d11298bebd3d1d3223 # EVO (no WEBDL) 543 | - b17886cb4158d9fea189859409975758 # HDR10+ Boost 544 | - 73613461ac2cea99d52c4cd6e177ab82 # HFR 545 | - 182fa1c42a2468f8488e6dcf75a81b81 # INTERNAL 546 | - c465ccc73923871b3eb1802042331306 # Line/Mic Dubbed 547 | - ae9b7c9ebde1f3bd336a8cbd1ec4c5e5 # No-RlsGroup 548 | - 7357cf5161efbf8c4d5d0c30b4815ee2 # Obfuscated 549 | - 5c44f52a8714fdd79bb4d98e2673be1f # Retags 550 | - 9c38ebb7384dada637be8899efa68e6f # SDR 551 | - 25c12f78430a3a23413652cbd1d48d77 # SDR (no WEBDL) 552 | - f537cf427b64c38c8e36298f657e4828 # Scene 553 | - ae4cfaa9283a4f2150ac3da08e388723 # VP9 554 | - 839bea857ed2c0a8e084f3cbdbd65ecb # x265 (no HDR/DV) 555 | 556 | # UK Streaming Services 557 | - 6185878161f1e2eef9cd0641a0d09eae # IP 558 | - c3492a26af412e385404eade438ec51c # ITVX 559 | - 3dce1fce9ac06d1349dfbd9186289385 # NOW 560 | 561 | # Unwanted 562 | - b8cd450cbfa689c0259a01d9e29ba3d6 # 3D 563 | - cae4ca30163749b891686f95532519bd # AV1 564 | - ed38b889b31be83fda192888e2286d83 # BR-DISK 565 | - 0a3f082873eb454bde444150b70253cc # Extras 566 | - 90a6f9a284dff5103f6346090e6280c8 # LQ 567 | - e204b80c87be9497a8a6eaff48f72905 # LQ (Release Title) 568 | - bfd8eb01832d646a0a89c4deb46f8564 # Upscaled 569 | - dc98083864ea246d05a42df0d05f81cc # x265 (HD) 570 | assign_scores_to: 571 | - name: Main v2 572 | 573 | -------------------------------------------------------------------------------- /romm/config/config.yml: -------------------------------------------------------------------------------- 1 | exclude: 2 | # Exclude platforms to be scanned 3 | platforms: ["@Eadir"] # ['my_excluded_platform_1', 'my_excluded_platform_2'] 4 | 5 | # Exclude roms or parts of roms to be scanned 6 | roms: 7 | # Single file games section. 8 | # Will not apply to files that are in sub-folders (multi-disc roms, games with updates, DLC, patches, etc.) 9 | single_file: 10 | # Exclude all files with certain extensions to be scanned 11 | extensions: [] # ['xml', 'txt'] 12 | 13 | # Exclude matched file names to be scanned. 14 | # Supports unix filename pattern matching 15 | # Can also exclude files by extension 16 | names: ['.DS_Store'] # ['info.txt', '._*', '*.nfo'] 17 | 18 | # Multi files games section 19 | # Will apply to files that are in sub-folders (multi-disc roms, games with updates, DLC, patches, etc.) 20 | multi_file: 21 | # Exclude matched 'folder' names to be scanned (RomM identifies folders as multi file games) 22 | names: ['@eaDir'] # ['my_multi_file_game', 'DLC'] 23 | 24 | # Exclude files within sub-folders. 25 | parts: 26 | # Exclude matched file names to be scanned from multi file roms 27 | # Keep in mind that RomM doesn't scan folders inside multi files games, 28 | # so there is no need to exclude folders from inside of multi files games. 29 | names: [] # ['data.xml', '._*'] # Supports unix filename pattern matching 30 | 31 | # Exclude all files with certain extensions to be scanned from multi file roms 32 | extensions: [] # ['xml', 'txt'] 33 | 34 | system: 35 | # Asociate different platform names to your current file system platform names 36 | # [your custom platform folder name]: [RomM platform name] 37 | # In this example if you have a 'gc' folder, RomM will treat it like the 'ngc' folder and if you have a 'psx' folder, RomM will treat it like the 'ps' folder 38 | platforms: {} # { gc: 'ngc', psx: 'ps' } 39 | 40 | # Asociate one platform to it's main version 41 | versions: {} # { naomi: 'arcade' } 42 | 43 | # The folder name where your roms are located 44 | filesystem: {} # { roms_folder: 'roms' } For example if your folder structure is /home/user/library/roms_folder 45 | -------------------------------------------------------------------------------- /scrutiny/config/collector.yaml: -------------------------------------------------------------------------------- 1 | # Version 2 | # 3 | # version specifies the version of this configuration file schema, not 4 | # the scrutiny binary. There is only 1 version available at the moment 5 | version: 1 6 | 7 | # This block allows you to override/customize the settings for devices detected by 8 | # Scrutiny via `smartctl --scan` 9 | # See the "--device=TYPE" section of https://linux.die.net/man/8/smartctl 10 | # type can be a 'string' or a 'list' 11 | devices: 12 | - device: /dev/nvme0n1 13 | type: auto 14 | - device: /dev/sata1 15 | type: sat 16 | - device: /dev/sata2 17 | type: sat 18 | - device: /dev/sata3 19 | type: sat 20 | - device: /dev/sata4 21 | type: sat --------------------------------------------------------------------------------