From 8b27ca20208804d200ebe297b4821d8dbbc81ffa Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Tue, 20 Aug 2024 22:43:56 -0400 Subject: [PATCH 01/18] add maintainerr container --- .github/extra-vars.yml | 9 +++++ README.md | 1 + docs/Container Map.md | 5 +-- .../hmsdocker/defaults/main/container_map.yml | 8 +++++ .../tasks/generate_compose_files.yml | 21 +++++++++++ roles/hmsdocker/tasks/main.yml | 3 ++ .../templates/containers/maintainerr.yml.j2 | 35 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 5 +++ roles/hmsdocker/vars/main.yml | 5 +++ 9 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 roles/hmsdocker/tasks/generate_compose_files.yml create mode 100644 roles/hmsdocker/templates/containers/maintainerr.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 05d9c0d..dbba6b3 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -250,6 +250,15 @@ "expose_to_public": false, "homepage": true, "homepage_stats": false + }, + "maintainerr": { + "enabled": true, + "proxy_host_rule": "maintainerr", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, } } } diff --git a/README.md b/README.md index d677fa7..2fceb02 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Requestrr](https://github.com/thomst08/requestrr): chat client for requests - [Calibre](https://github.com/linuxserver/docker-calibre): ebook management - [Tdarr](https://github.com/HaveAGitGat/Tdarr): media transcoding +- [Maintainerr](https://github.com/jorenn92/Maintainerr): media management ### Download Clients diff --git a/docs/Container Map.md b/docs/Container Map.md index f0f1e66..89902ba 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -42,7 +42,8 @@ If you choose to expose the container ports on the host (by setting `container_e | Readarr | ☐ | `readarr` | `8787` | `8787` | ☑ | | Kavita | ☐ | `kavita` | `5000` | `5000` | ☑ | | Calibre | ☐ | `calibre` | `8083`, `8182`, `8084` | `8080`, `8181`, `8081`| ☑ | -| Jellyfin | ☐ | `Jellyfin` | `8096`, `8920`, `7359`, `1900` | `8096`, `8920`, `7359`, `1900` | ☑ | -| Emby | ☐ | `Emby` | `8096`, `8920` | `8096`, `8920`| ☑ | +| Jellyfin | ☐ | `jellyfin` | `8096`, `8920`, `7359`, `1900` | `8096`, `8920`, `7359`, `1900` | ☑ | +| Emby | ☐ | `emby` | `8096`, `8920` | `8096`, `8920` | ☑ | +| Maintainerr | ☐ | `maintainerr` | `6246` | `6246` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 3518432..2e59075 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -230,4 +230,12 @@ hms_docker_container_map: expose_to_public: no homepage: yes homepage_stats: yes + maintainerr: + enabled: no + proxy_host_rule: maintainerr + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml new file mode 100644 index 0000000..21507e6 --- /dev/null +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -0,0 +1,21 @@ +- name: Generate Docker Compose files for include + ansible.builtin.file: + dest: "{{ hms_docker_data_path }}/compose_files" + state: directory + mode: 0755 + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + register: compose_dir + +- name: Generate Docker Compose file for Maintainerr + when: hmsdocker_container_enabled_maintainerr + ansible.builtin.template: + src: containers/maintainerr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/maintainerr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: maintainerr_compose_file + diff --git a/roles/hmsdocker/tasks/main.yml b/roles/hmsdocker/tasks/main.yml index 1ddf8c3..f299015 100644 --- a/roles/hmsdocker/tasks/main.yml +++ b/roles/hmsdocker/tasks/main.yml @@ -130,6 +130,9 @@ sabnzbd_key: "{{ slurped_api_key_sabnzbd['content'] | b64decode | regex_search('(?<=api_key = )\\w*') | default('') }}" readarr_key: "{{ slurped_api_key_readarr['content'] | b64decode | regex_search(arr_apikey) | default('') }}" +- name: Ensure App Compose Files + ansible.builtin.import_tasks: "generate_compose_files.yml" + - name: Ensure docker-compose.yml file. ansible.builtin.template: src: docker-compose.yml.j2 diff --git a/roles/hmsdocker/templates/containers/maintainerr.yml.j2 b/roles/hmsdocker/templates/containers/maintainerr.yml.j2 new file mode 100644 index 0000000..0fa8e11 --- /dev/null +++ b/roles/hmsdocker/templates/containers/maintainerr.yml.j2 @@ -0,0 +1,35 @@ +services: + maintainerr: + image: ghcr.io/jorenn92/maintainerr:latest + container_name: maintainerr + restart: ${RESTART_POLICY} + networks: + - proxy_net + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + user: ${PUID}:${PGID} + volumes: + - ${HMSD_APPS_PATH}/maintainerr/config:/opt/data + environment: + - TZ=${TIMEZONE} + {% if hmsdocker_expose_ports_enabled_maintainerr %} + ports: + - 6246:6246 + {% endif %} + {% if hmsdocker_traefik_enabled_maintainerr or hmsdocker_homepage_enabled_maintainerr %} + labels: + {% if hmsdocker_traefik_enabled_maintainerr %} + - traefik.enable=true + - traefik.http.services.maintainerr-${COMPOSE_PROJECT}.loadbalancer.server.port=6246 + - traefik.http.routers.maintainerr-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['maintainerr']['proxy_host_rule'] | default('maintainerr') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_maintainerr %} + - traefik.http.routers.maintainerr-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_maintainerr %} + - traefik.http.routers.maintainerr-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-maintainerr-midware@docker + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 63ccb53..0737dd8 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1462,6 +1462,11 @@ services: {% endif %} {% endif %} +{% if hmsdocker_container_enabled_maintainerr %} +include: + - compose_files/maintainerr.yml +{% endif %} + networks: "download_net": driver: bridge diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 49d909b..24cf0e5 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -32,6 +32,7 @@ hmsdocker_container_enabled_kavita: "{{ hms_docker_container_map['kavita']['enab hmsdocker_container_enabled_calibre: "{{ hms_docker_container_map['calibre']['enabled'] | default(False) }}" hmsdocker_container_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['enabled'] | default(False) }}" hmsdocker_container_enabled_emby: "{{ hms_docker_container_map['emby']['enabled'] | default(False) }}" +hmsdocker_container_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['enabled'] | default(False) }}" # Traefik computed variables @@ -59,6 +60,7 @@ hmsdocker_traefik_enabled_kavita: "{{ hms_docker_container_map['kavita']['traefi hmsdocker_traefik_enabled_calibre: "{{ hms_docker_container_map['calibre']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_emby: "{{ hms_docker_container_map['emby']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -85,6 +87,7 @@ hmsdocker_expose_public_enabled_kavita: "{{ hms_docker_container_map['kavita'][' hmsdocker_expose_public_enabled_calibre: "{{ hms_docker_container_map['calibre']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_emby: "{{ hms_docker_container_map['emby']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -112,6 +115,7 @@ hmsdocker_expose_ports_enabled_kavita: "{{ True if (container_expose_ports or no hmsdocker_expose_ports_enabled_calibre: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_calibre) else False }}" hmsdocker_expose_ports_enabled_jellyfin: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_jellyfin) else False }}" hmsdocker_expose_ports_enabled_emby: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_emby) else False }}" +hmsdocker_expose_ports_enabled_maintainerr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_maintainerr) else False }}" # Authentik computed variables # Controls global authentik variables @@ -142,6 +146,7 @@ hmsdocker_authentik_enabled_kavita: "{{ hms_docker_container_map['kavita']['auth hmsdocker_authentik_enabled_calibre: "{{ hms_docker_container_map['calibre']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['calibre']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['jellyfin']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_emby: "{{ hms_docker_container_map['emby']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['emby']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['maintainerr']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage From 6b4fe47b818484965f04223979432ff0a399d849 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:09:49 -0400 Subject: [PATCH 02/18] add unpackerr --- .github/extra-vars.yml | 9 ++++ README.md | 3 +- .../hmsdocker/defaults/main/container_map.yml | 8 +++ .../hmsdocker/defaults/main/service_misc.yml | 22 ++++++++ .../tasks/generate_compose_files.yml | 11 ++++ .../templates/containers/unpackerr.yml.j2 | 53 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 5 +- roles/hmsdocker/vars/main.yml | 1 + 8 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 roles/hmsdocker/templates/containers/unpackerr.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index dbba6b3..ff4a2d0 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -259,6 +259,15 @@ "authentik": false, "authentik_provider_type": "proxy", "expose_to_public": false, + }, + "unpackerr": { + "enabled": true, + "proxy_host_rule": "unpackerr", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, } } } diff --git a/README.md b/README.md index 2fceb02..097d4c1 100644 --- a/README.md +++ b/README.md @@ -63,10 +63,11 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Portainer](https://hub.docker.com/r/portainer/portainer): container management GUI - [Watchtower](https://github.com/containrrr/watchtower): automatic container updates (if enabled) -- [Authentik](https://github.com/goauthentik/authentik): SSO +- [Authentik](https://github.com/goauthentik/authentik): SSO (Single Sign-On) - [Flaresolverr](https://github.com/FlareSolverr/FlareSolverr): CAPTCHA solving - [Uptime Kuma](https://github.com/louislam/uptime-kuma): service status monitoring - [Kavita](https://hub.docker.com/r/kizaing/kavita): digital library +- [Unpackerr](https://github.com/Unpackerr/unpackerr): download decompression ## Other Features diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 2e59075..fdd2e58 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -238,4 +238,12 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + unpackerr: + enabled: no + proxy_host_rule: unpackerr + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index c43c92f..6244656 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -29,3 +29,25 @@ tautulli_include_jbops: false tautulli_jbops_install_path: "{{ hms_docker_apps_path }}/tautulli/config/jbops" ### End Tautulli settings ####################################################################### + + +# Additional environment variables to add to the Unpackerr container +# See: https://unpackerr.zip/docs/install/configuration +hmsdocker_unpackerr_additional_env_vars: + { + "UN_DEBUG": "false", + "UN_QUIET": "false", + "UN_ERROR_STDERR": "false", + "UN_ACTIVITY": "false", + "UN_LOG_QUEUES": "1m", + "UN_LOG_FILE": "/downloads/unpackerr.log", + "UN_LOG_FILES": "10", + "UN_LOG_FILE_MB": "10", + "UN_INTERVAL": "2m", + "UN_START_DELAY": "1m", + "UN_RETRY_DELAY": "5m", + "UN_MAX_RETRIES": "3", + "UN_PARALLEL": "1", + "UN_FILE_MODE": "0644", + "UN_DIR_MODE": "0755", + } diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 21507e6..31ddea3 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -19,3 +19,14 @@ lstrip_blocks: yes register: maintainerr_compose_file +- name: Generate Docker Compose file for Unpackerr + when: hmsdocker_container_enabled_unpackerr + ansible.builtin.template: + src: containers/unpackerr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/unpackerr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: unpackerr_compose_file diff --git a/roles/hmsdocker/templates/containers/unpackerr.yml.j2 b/roles/hmsdocker/templates/containers/unpackerr.yml.j2 new file mode 100644 index 0000000..9a7e7ad --- /dev/null +++ b/roles/hmsdocker/templates/containers/unpackerr.yml.j2 @@ -0,0 +1,53 @@ +services: + unpackerr: + image: golift/unpackerr:latest + container_name: unpackerr + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + restart: ${RESTART_POLICY} + user: ${PUID}:${PGID} + networks: + - proxy_net + volumes: + - ${HMSD_MOUNT_PATH}:/data + environment: + - TZ=${TIMEZONE} + {% for key, value in hmsdocker_unpackerr_additional_env_vars.items() %} + - {{ key }}={{ value }} + {% endfor %} + {% if hmsdocker_container_enabled_sonarr %} + ## Sonarr Settings + - UN_SONARR_0_URL=http://sonarr:8989 + - UN_SONARR_0_API_KEY=${SONARR_KEY} + - UN_SONARR_0_PATHS_0=/data + - UN_SONARR_0_PROTOCOLS=torrent + - UN_SONARR_0_TIMEOUT=10s + - UN_SONARR_0_DELETE_DELAY=5m + - UN_SONARR_0_DELETE_ORIG=false + - UN_SONARR_0_SYNCTHING=false + {% endif %} + {% if hmsdocker_container_enabled_radarr %} + ## Radarr Settings + - UN_RADARR_0_URL=http://radarr:7878 + - UN_RADARR_0_API_KEY=${RADARR_KEY} + - UN_RADARR_0_PATHS_0=/data + - UN_RADARR_0_PROTOCOLS=torrent + - UN_RADARR_0_TIMEOUT=10s + - UN_RADARR_0_DELETE_DELAY=5m + - UN_RADARR_0_DELETE_ORIG=false + - UN_RADARR_0_SYNCTHING=false + {% endif %} + {% if hmsdocker_container_enabled_readarr %} + ## Readarr Settings + - UN_READARR_0_URL=http://readarr:8787 + - UN_READARR_0_API_KEY=${READARR_KEY} + - UN_READARR_0_PATHS_0=/data + - UN_READARR_0_PROTOCOLS=torrent + - UN_READARR_0_TIMEOUT=10s + - UN_READARR_0_DELETE_DELAY=5m + - UN_READARR_0_DELETE_ORIG=false + - UN_READARR_0_SYNCTHING=false + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 0737dd8..ecf1c7d 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1462,10 +1462,13 @@ services: {% endif %} {% endif %} -{% if hmsdocker_container_enabled_maintainerr %} include: +{% if hmsdocker_container_enabled_maintainerr %} - compose_files/maintainerr.yml {% endif %} +{% if hmsdocker_container_enabled_unpackerr %} + - compose_files/unpackerr.yml +{% endif %} networks: "download_net": diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 24cf0e5..9e0f08b 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -33,6 +33,7 @@ hmsdocker_container_enabled_calibre: "{{ hms_docker_container_map['calibre']['en hmsdocker_container_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['enabled'] | default(False) }}" hmsdocker_container_enabled_emby: "{{ hms_docker_container_map['emby']['enabled'] | default(False) }}" hmsdocker_container_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_unpackerr: "{{ hms_docker_container_map['unpackerr']['enabled'] | default(False) }}" # Traefik computed variables From fa41011c710e4886073c91d068a1230442e83e09 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:44:30 -0400 Subject: [PATCH 03/18] add lidarr --- .github/extra-vars.yml | 9 ++++ README.md | 1 + docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 10 ++++ roles/hmsdocker/tasks/app_api_key_reader.yml | 14 +++++ .../tasks/generate_compose_files.yml | 12 +++++ roles/hmsdocker/tasks/main.yml | 1 + .../templates/containers/lidarr.yml.j2 | 51 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 4 +- 9 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 roles/hmsdocker/templates/containers/lidarr.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index ff4a2d0..18e4a70 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -268,6 +268,15 @@ "authentik": false, "authentik_provider_type": "proxy", "expose_to_public": false, + }, + "lidarr": { + "enabled": true, + "proxy_host_rule": "lidarr", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, } } } diff --git a/README.md b/README.md index 097d4c1..7343f62 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Sonarr](https://github.com/Sonarr/Sonarr): tv series management - [Radarr](https://github.com/Radarr/Radarr): movie management +- [Lidarr](https://github.com/Lidarr/Lidarr): music management - [Bazarr](https://github.com/morpheus65535/bazarr): subtitle management - [Prowlarr](https://github.com/Prowlarr/Prowlarr): tracker management - [Readarr](https://github.com/Readarr/Readarr): ebook management diff --git a/docs/Container Map.md b/docs/Container Map.md index 89902ba..27710fb 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -45,5 +45,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Jellyfin | ☐ | `jellyfin` | `8096`, `8920`, `7359`, `1900` | `8096`, `8920`, `7359`, `1900` | ☑ | | Emby | ☐ | `emby` | `8096`, `8920` | `8096`, `8920` | ☑ | | Maintainerr | ☐ | `maintainerr` | `6246` | `6246` | ☑ | +| Lidarr | ☐ | `lidarr` | `8686` | `8686` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index fdd2e58..a55a750 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -246,4 +246,14 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + lidarr: + enabled: no + proxy_host_rule: lidarr + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no + homepage: yes + homepage_stats: yes diff --git a/roles/hmsdocker/tasks/app_api_key_reader.yml b/roles/hmsdocker/tasks/app_api_key_reader.yml index 5195223..0c1fe88 100644 --- a/roles/hmsdocker/tasks/app_api_key_reader.yml +++ b/roles/hmsdocker/tasks/app_api_key_reader.yml @@ -149,3 +149,17 @@ register: slurped_api_key_plex when: - plex_conf_path.stat.exists + +- name: Handle Lidarr config + when: hmsdocker_container_enabled_lidarr + block: + - name: Check for Lidarr config file + ansible.builtin.stat: + path: "{{ hms_docker_apps_path }}/lidarr/config/config.xml" + register: lidarr_conf_path + + - name: Slurp Lidarr key data + ansible.builtin.slurp: + src: "{{ lidarr_conf_path.stat.path }}" + register: slurped_api_key_lidarr + when: lidarr_conf_path.stat.exists diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 31ddea3..44c6a06 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -30,3 +30,15 @@ trim_blocks: yes lstrip_blocks: yes register: unpackerr_compose_file + +- name: Generate Docker Compose file for Lidarr + when: hmsdocker_container_enabled_lidarr + ansible.builtin.template: + src: containers/lidarr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/lidarr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: lidarr_compose_file diff --git a/roles/hmsdocker/tasks/main.yml b/roles/hmsdocker/tasks/main.yml index f299015..cb170ae 100644 --- a/roles/hmsdocker/tasks/main.yml +++ b/roles/hmsdocker/tasks/main.yml @@ -129,6 +129,7 @@ plex_key: "{{ slurped_api_key_plex['content'] | b64decode | regex_search('(?<=PlexOnlineToken=\")(.*?)(?=\")') | default('') }}" sabnzbd_key: "{{ slurped_api_key_sabnzbd['content'] | b64decode | regex_search('(?<=api_key = )\\w*') | default('') }}" readarr_key: "{{ slurped_api_key_readarr['content'] | b64decode | regex_search(arr_apikey) | default('') }}" + lidarr_key: "{{ slurped_api_key_lidarr['content'] | b64decode | regex_search(arr_apikey) | default('') }}" - name: Ensure App Compose Files ansible.builtin.import_tasks: "generate_compose_files.yml" diff --git a/roles/hmsdocker/templates/containers/lidarr.yml.j2 b/roles/hmsdocker/templates/containers/lidarr.yml.j2 new file mode 100644 index 0000000..720a5db --- /dev/null +++ b/roles/hmsdocker/templates/containers/lidarr.yml.j2 @@ -0,0 +1,51 @@ +services: + lidarr: + image: lscr.io/linuxserver/lidarr:latest + container_name: lidarr + restart: ${RESTART_POLICY} + networks: + - proxy_net + - download_net + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + {% if hmsdocker_expose_ports_enabled_lidarr %} + ports: + - 8686:8686 + {% endif %} + volumes: + - ${HMSD_APPS_PATH}/lidarr/config:/config + - ${HMSD_MOUNT_PATH}:/data + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TIMEZONE} + {% if hmsdocker_traefik_enabled_lidarr or hmsdocker_homepage_enabled_lidarr %} + labels: + {% if hmsdocker_traefik_enabled_lidarr %} + - traefik.enable=true + - traefik.http.services.lidarr-${COMPOSE_PROJECT}.loadbalancer.server.port=8686 + - traefik.http.routers.lidarr-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['lidarr']['proxy_host_rule'] | default('lidarr') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_lidarr %} + - traefik.http.routers.lidarr-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_lidarr %} + - traefik.http.routers.lidarr-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-lidarr-midware@docker + {% endif %} + {% endif %} + {% if hmsdocker_homepage_enabled_lidarr %} + - homepage.group=Managers + - homepage.name=Lidarr + - homepage.icon=lidarr.png + - homepage.href=http://{{ hms_docker_container_map['lidarr']['proxy_host_rule'] | default('lidarr') }}.${HMSD_DOMAIN} + - homepage.description=Music Manager + - homepage.widget.type=lidarr + - homepage.widget.url=http://lidarr:8686 + - homepage.widget.key=${LIDARR_KEY:-apikeyapikeyapikey} + {% if hmsdocker_homepage_stats_enabled_lidarr %} + - homepage.showStats=true + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index ecf1c7d..6a2e179 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1469,7 +1469,9 @@ include: {% if hmsdocker_container_enabled_unpackerr %} - compose_files/unpackerr.yml {% endif %} - +{% if hmsdocker_container_enabled_lidarr %} + - compose_files/lidarr.yml +{% endif %} networks: "download_net": driver: bridge From e92107570af16575a2a1e853d63e2cac2b86ae69 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:44:51 -0400 Subject: [PATCH 04/18] add lidarr --- roles/hmsdocker/vars/main.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 9e0f08b..13295c5 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -34,6 +34,7 @@ hmsdocker_container_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin'][' hmsdocker_container_enabled_emby: "{{ hms_docker_container_map['emby']['enabled'] | default(False) }}" hmsdocker_container_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['enabled'] | default(False) }}" hmsdocker_container_enabled_unpackerr: "{{ hms_docker_container_map['unpackerr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['enabled'] | default(False) }}" # Traefik computed variables @@ -62,6 +63,7 @@ hmsdocker_traefik_enabled_calibre: "{{ hms_docker_container_map['calibre']['trae hmsdocker_traefik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_emby: "{{ hms_docker_container_map['emby']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -89,6 +91,7 @@ hmsdocker_expose_public_enabled_calibre: "{{ hms_docker_container_map['calibre'] hmsdocker_expose_public_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_emby: "{{ hms_docker_container_map['emby']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -117,6 +120,7 @@ hmsdocker_expose_ports_enabled_calibre: "{{ True if (container_expose_ports or n hmsdocker_expose_ports_enabled_jellyfin: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_jellyfin) else False }}" hmsdocker_expose_ports_enabled_emby: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_emby) else False }}" hmsdocker_expose_ports_enabled_maintainerr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_maintainerr) else False }}" +hmsdocker_expose_ports_enabled_lidarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_lidarr) else False }}" # Authentik computed variables # Controls global authentik variables @@ -148,6 +152,7 @@ hmsdocker_authentik_enabled_calibre: "{{ hms_docker_container_map['calibre']['au hmsdocker_authentik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['jellyfin']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_emby: "{{ hms_docker_container_map['emby']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['emby']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['maintainerr']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['lidarr']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage @@ -169,6 +174,7 @@ hmsdocker_homepage_enabled_tdarr: "{{ hmsdocker_container_enabled_homepage and h hmsdocker_homepage_enabled_readarr: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['readarr']['homepage'] | default(False) }}" hmsdocker_homepage_enabled_jellyfin: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['jellyfin']['homepage'] | default(False) }}" hmsdocker_homepage_enabled_emby: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['emby']['homepage'] | default(False) }}" +hmsdocker_homepage_enabled_lidarr: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['lidarr']['homepage'] | default(False) }}" # Controls if the container should show stats (CPU, RAM, RX, TX) on Homepage hmsdocker_homepage_stats_enabled_traefik: "{{ hmsdocker_homepage_enabled_traefik and hms_docker_container_map['traefik']['homepage_stats'] | default(False) }}" @@ -188,6 +194,7 @@ hmsdocker_homepage_stats_enabled_tdarr: "{{ hmsdocker_homepage_enabled_tdarr and hmsdocker_homepage_stats_enabled_readarr: "{{ hmsdocker_homepage_enabled_readarr and hms_docker_container_map['readarr']['homepage_stats'] | default(False) }}" hmsdocker_homepage_stats_enabled_jellyfin: "{{ hmsdocker_homepage_enabled_jellyfin and hms_docker_container_map['jellyfin']['homepage_stats'] | default(False) }}" hmsdocker_homepage_stats_enabled_emby: "{{ hmsdocker_homepage_enabled_emby and hms_docker_container_map['emby']['homepage_stats'] | default(False) }}" +hmsdocker_homepage_stats_enabled_lidarr: "{{ hmsdocker_homepage_enabled_lidarr and hms_docker_container_map['lidarr']['homepage_stats'] | default(False) }}" ####################################################################### From 0d0f372d00168226bfd31c5164ab6333a99fd220 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:45:04 -0400 Subject: [PATCH 05/18] add lidarr --- roles/hmsdocker/templates/containers/unpackerr.yml.j2 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/roles/hmsdocker/templates/containers/unpackerr.yml.j2 b/roles/hmsdocker/templates/containers/unpackerr.yml.j2 index 9a7e7ad..b036030 100644 --- a/roles/hmsdocker/templates/containers/unpackerr.yml.j2 +++ b/roles/hmsdocker/templates/containers/unpackerr.yml.j2 @@ -51,3 +51,14 @@ services: - UN_READARR_0_DELETE_ORIG=false - UN_READARR_0_SYNCTHING=false {% endif %} + {% if hmsdocker_container_enabled_lidarr %} + ## Lidarr Settings + - UN_LIDARR_0_URL=http://lidarr:8686 + - UN_LIDARR_0_API_KEY=${LIDARR_KEY} + - UN_LIDARR_0_PATHS_0=/data + - UN_LIDARR_0_PROTOCOLS=torrent + - UN_LIDARR_0_TIMEOUT=10s + - UN_LIDARR_0_DELETE_DELAY=5m + - UN_LIDARR_0_DELETE_ORIG=false + - UN_LIDARR_0_SYNCTHING=false + {% endif %} From 61e9a950da2e367c6759eb82512a1d37ce5e22e4 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:45:25 -0400 Subject: [PATCH 06/18] add lidarr --- roles/hmsdocker/templates/env.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index 297593b..b666ddc 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -127,6 +127,9 @@ JELLYFIN_KEY={{ homepage_jellyfin_key | default('') }} {% if hmsdocker_homepage_enabled_emby and hmsdocker_container_enabled_emby %} EMBY_KEY={{ homepage_emby_key | default('') }} {% endif %} +{% if hmsdocker_homepage_enabled_lidarr and hmsdocker_container_enabled_lidarr %} +LIDARR_KEY={{ lidarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} +{% endif %} ### END Homepage {% endif %} From 5d915fa35e025ae7d1910bd88cc8f29918d8425d Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:05:44 -0400 Subject: [PATCH 07/18] add autobrr --- .github/extra-vars.yml | 13 +++++ README.md | 2 + docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 10 ++++ .../defaults/main/homepage_api_keys.yml | 3 ++ .../tasks/generate_compose_files.yml | 12 +++++ .../templates/containers/autobrr.yml.j2 | 49 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 ++ roles/hmsdocker/templates/env.j2 | 3 ++ roles/hmsdocker/vars/main.yml | 7 +++ 10 files changed, 103 insertions(+) create mode 100644 roles/hmsdocker/templates/containers/autobrr.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 18e4a70..5c61d99 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -277,6 +277,19 @@ "authentik": false, "authentik_provider_type": "proxy", "expose_to_public": false, + "homepage": true, + "homepage_stats": false + }, + "autobrr": { + "enabled": true, + "proxy_host_rule": "autobrr", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, + "homepage": true, + "homepage_stats": false } } } diff --git a/README.md b/README.md index 7343f62..2fe5c52 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Uptime Kuma](https://github.com/louislam/uptime-kuma): service status monitoring - [Kavita](https://hub.docker.com/r/kizaing/kavita): digital library - [Unpackerr](https://github.com/Unpackerr/unpackerr): download decompression +- [Autobrr](https://github.com/autobrr/autobrr): torrent automation + ## Other Features diff --git a/docs/Container Map.md b/docs/Container Map.md index 27710fb..2994d0c 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -46,5 +46,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Emby | ☐ | `emby` | `8096`, `8920` | `8096`, `8920` | ☑ | | Maintainerr | ☐ | `maintainerr` | `6246` | `6246` | ☑ | | Lidarr | ☐ | `lidarr` | `8686` | `8686` | ☑ | +| Autobrr | ☐ | `autobrr` | `7474` | `7474` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index a55a750..b2f8506 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -256,4 +256,14 @@ hms_docker_container_map: expose_to_public: no homepage: yes homepage_stats: yes + autobrr: + enabled: no + proxy_host_rule: autobrr + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no + homepage: yes + homepage_stats: yes diff --git a/roles/hmsdocker/defaults/main/homepage_api_keys.yml b/roles/hmsdocker/defaults/main/homepage_api_keys.yml index 3319b1f..c732040 100644 --- a/roles/hmsdocker/defaults/main/homepage_api_keys.yml +++ b/roles/hmsdocker/defaults/main/homepage_api_keys.yml @@ -14,3 +14,6 @@ homepage_jellyfin_key: # Emby homepage_emby_key: + +# Autobrr +homepage_autobrr_key: diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 44c6a06..255225a 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -42,3 +42,15 @@ trim_blocks: yes lstrip_blocks: yes register: lidarr_compose_file + +- name: Generate Docker Compose file for Autobrr + when: hmsdocker_container_enabled_autobrr + ansible.builtin.template: + src: containers/autobrr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/autobrr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: autobrr_compose_file diff --git a/roles/hmsdocker/templates/containers/autobrr.yml.j2 b/roles/hmsdocker/templates/containers/autobrr.yml.j2 new file mode 100644 index 0000000..8f7abd2 --- /dev/null +++ b/roles/hmsdocker/templates/containers/autobrr.yml.j2 @@ -0,0 +1,49 @@ +services: + autobrr: + container_name: autobrr + image: ghcr.io/autobrr/autobrr:latest + restart: ${RESTART_POLICY} + networks: + - proxy_net + - download_net + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + user: ${PUID}:${PGID} + environment: + - TZ=${TIMEZONE} + volumes: + - ${HMSD_APPS_PATH}/autobrr/config:/config + {% if hmsdocker_expose_ports_enabled_autobrr %} + ports: + - 7474:7474 + {% endif %} + {% if hmsdocker_traefik_enabled_autobrr or hmsdocker_homepage_enabled_autobrr %} + labels: + {% if hmsdocker_traefik_enabled_autobrr %} + - traefik.enable=true + - traefik.http.services.autobrr-${COMPOSE_PROJECT}.loadbalancer.server.port=7474 + - traefik.http.routers.autobrr-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['autobrr']['proxy_host_rule'] | default('autobrr') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_autobrr %} + - traefik.http.routers.autobrr-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_autobrr %} + - traefik.http.routers.autobrr-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-autobrr-midware@docker + {% endif %} + {% endif %} + {% if hmsdocker_homepage_enabled_autobrr %} + - homepage.group=Downloads + - homepage.name=Autobrr + - homepage.icon=autobrr.png + - homepage.href=http://{{ hms_docker_container_map['autobrr']['proxy_host_rule'] | default('autobrr') }}.${HMSD_DOMAIN} + - homepage.description=Torrent Automation + - homepage.widget.type=autobrr + - homepage.widget.url=http://autobrr:7474 + - homepage.widget.key=${AUTOBRR_KEY:-apikeyapikeyapikey} + {% if hmsdocker_homepage_stats_enabled_autobrr %} + - homepage.showStats=true + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 6a2e179..99cbe3f 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1472,6 +1472,9 @@ include: {% if hmsdocker_container_enabled_lidarr %} - compose_files/lidarr.yml {% endif %} +{% if hmsdocker_container_enabled_autobrr %} + - compose_files/autobrr.yml +{% endif %} networks: "download_net": driver: bridge diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index b666ddc..d62d552 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -130,6 +130,9 @@ EMBY_KEY={{ homepage_emby_key | default('') }} {% if hmsdocker_homepage_enabled_lidarr and hmsdocker_container_enabled_lidarr %} LIDARR_KEY={{ lidarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} {% endif %} +{% if hmsdocker_homepage_enabled_autobrr and hmsdocker_container_enabled_autobrr %} +AUTOBRR_KEY={{ homepage_autobrr_key | default('') }} +{% endif %} ### END Homepage {% endif %} diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 13295c5..7a03ac9 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -35,6 +35,7 @@ hmsdocker_container_enabled_emby: "{{ hms_docker_container_map['emby']['enabled' hmsdocker_container_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['enabled'] | default(False) }}" hmsdocker_container_enabled_unpackerr: "{{ hms_docker_container_map['unpackerr']['enabled'] | default(False) }}" hmsdocker_container_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['enabled'] | default(False) }}" # Traefik computed variables @@ -64,6 +65,7 @@ hmsdocker_traefik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin']['tr hmsdocker_traefik_enabled_emby: "{{ hms_docker_container_map['emby']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -92,6 +94,7 @@ hmsdocker_expose_public_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin hmsdocker_expose_public_enabled_emby: "{{ hms_docker_container_map['emby']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -121,6 +124,7 @@ hmsdocker_expose_ports_enabled_jellyfin: "{{ True if (container_expose_ports or hmsdocker_expose_ports_enabled_emby: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_emby) else False }}" hmsdocker_expose_ports_enabled_maintainerr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_maintainerr) else False }}" hmsdocker_expose_ports_enabled_lidarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_lidarr) else False }}" +hmsdocker_expose_ports_enabled_autobrr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_autobrr) else False }}" # Authentik computed variables # Controls global authentik variables @@ -153,6 +157,7 @@ hmsdocker_authentik_enabled_jellyfin: "{{ hms_docker_container_map['jellyfin'][' hmsdocker_authentik_enabled_emby: "{{ hms_docker_container_map['emby']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['emby']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['maintainerr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['lidarr']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['autobrr']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage @@ -175,6 +180,7 @@ hmsdocker_homepage_enabled_readarr: "{{ hmsdocker_container_enabled_homepage and hmsdocker_homepage_enabled_jellyfin: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['jellyfin']['homepage'] | default(False) }}" hmsdocker_homepage_enabled_emby: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['emby']['homepage'] | default(False) }}" hmsdocker_homepage_enabled_lidarr: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['lidarr']['homepage'] | default(False) }}" +hmsdocker_homepage_enabled_autobrr: "{{ hmsdocker_container_enabled_homepage and hms_docker_container_map['autobrr']['homepage'] | default(False) }}" # Controls if the container should show stats (CPU, RAM, RX, TX) on Homepage hmsdocker_homepage_stats_enabled_traefik: "{{ hmsdocker_homepage_enabled_traefik and hms_docker_container_map['traefik']['homepage_stats'] | default(False) }}" @@ -195,6 +201,7 @@ hmsdocker_homepage_stats_enabled_readarr: "{{ hmsdocker_homepage_enabled_readarr hmsdocker_homepage_stats_enabled_jellyfin: "{{ hmsdocker_homepage_enabled_jellyfin and hms_docker_container_map['jellyfin']['homepage_stats'] | default(False) }}" hmsdocker_homepage_stats_enabled_emby: "{{ hmsdocker_homepage_enabled_emby and hms_docker_container_map['emby']['homepage_stats'] | default(False) }}" hmsdocker_homepage_stats_enabled_lidarr: "{{ hmsdocker_homepage_enabled_lidarr and hms_docker_container_map['lidarr']['homepage_stats'] | default(False) }}" +hmsdocker_homepage_stats_enabled_autobrr: "{{ hmsdocker_homepage_enabled_autobrr and hms_docker_container_map['autobrr']['homepage_stats'] | default(False) }}" ####################################################################### From 2daab9e379bb15505f59e85900fd3d701d644202 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:55:48 -0400 Subject: [PATCH 08/18] add notifiarr --- README.md | 2 +- docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 8 ++ .../hmsdocker/defaults/main/service_misc.yml | 6 ++ .../tasks/generate_compose_files.yml | 12 +++ .../templates/containers/notifiarr.yml.j2 | 82 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 + roles/hmsdocker/templates/env.j2 | 40 +-------- roles/hmsdocker/vars/main.yml | 5 ++ 9 files changed, 122 insertions(+), 37 deletions(-) create mode 100644 roles/hmsdocker/templates/containers/notifiarr.yml.j2 diff --git a/README.md b/README.md index 2fe5c52..bdedfb4 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Kavita](https://hub.docker.com/r/kizaing/kavita): digital library - [Unpackerr](https://github.com/Unpackerr/unpackerr): download decompression - [Autobrr](https://github.com/autobrr/autobrr): torrent automation - +- [Notifiarr](https://github.com/Notifiarr/notifiarr): notification system ## Other Features diff --git a/docs/Container Map.md b/docs/Container Map.md index 2994d0c..e1207b4 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -47,5 +47,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Maintainerr | ☐ | `maintainerr` | `6246` | `6246` | ☑ | | Lidarr | ☐ | `lidarr` | `8686` | `8686` | ☑ | | Autobrr | ☐ | `autobrr` | `7474` | `7474` | ☑ | +| Notifiarr | ☐ | `notifiarr` | `5454` | `5454` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index b2f8506..e93bef9 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -266,4 +266,12 @@ hms_docker_container_map: expose_to_public: no homepage: yes homepage_stats: yes + notifiarr: + enabled: no + proxy_host_rule: notifiarr + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index 6244656..c06011d 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -20,6 +20,12 @@ tdarr_enable_node_server: no +####################################################################### +### Notifiarr settings +hmsdocker_notifiarr_api_key: +### End Notifiarr settings +####################################################################### + ####################################################################### ### Tautulli settings # Downloads and includes the JBOPS scripts from https://github.com/blacktwin/JBOPS to the Tautulli container diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 255225a..1410a09 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -54,3 +54,15 @@ trim_blocks: yes lstrip_blocks: yes register: autobrr_compose_file + +- name: Generate Docker Compose file for Notifiarr + when: hmsdocker_container_enabled_notifiarr + ansible.builtin.template: + src: containers/notifiarr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/notifiarr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: notifiarr_compose_file diff --git a/roles/hmsdocker/templates/containers/notifiarr.yml.j2 b/roles/hmsdocker/templates/containers/notifiarr.yml.j2 new file mode 100644 index 0000000..0c4e361 --- /dev/null +++ b/roles/hmsdocker/templates/containers/notifiarr.yml.j2 @@ -0,0 +1,82 @@ +services: + notifiarr: + image: golift/notifiarr:latest + container_name: notifiarr + hostname: notifiarr-hmsd + restart: ${RESTART_POLICY} + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + networks: + - proxy_net + {% if hmsdocker_expose_ports_enabled_notifiarr %} + ports: + - 5454:5454 + {% endif %} + volumes: + - ${HMSD_APPS_PATH}/notifiarr/config:/config + - /var/run/utmp:/var/run/utmp + - /etc/machine-id:/etc/machine-id + environment: + - DN_API_KEY=${NOTIFIARR_API_KEY} + {% if hmsdocker_container_enabled_lidarr %} + - DN_LIDARR_0_NAME=Lidarr + - DN_LIDARR_0_URL=http://lidarr:8686 + - DN_LIDARR_0_API_KEY=${LIDARR_KEY} + {% endif %} + {% if hmsdocker_container_enabled_prowlarr %} + - DN_PROWLARR_0_NAME=Prowlarr + - DN_PROWLARR_0_URL=http://prowlarr:9696 + - DN_PROWLARR_0_API_KEY=${PROWLARR_KEY} + {% endif %} + {% if hmsdocker_container_enabled_radarr %} + - DN_RADARR_0_NAME=Radarr + - DN_RADARR_0_URL=http://radarr:7878 + - DN_RADARR_0_API_KEY=${RADARR_KEY} + {% if separate_4k_instances_enable %} + - DN_RADARR_1_NAME=Radarr-{{ separate_4k_instances_suffix }} + - DN_RADARR_1_URL=http://radarr-{{ separate_4k_instances_suffix }}:7878 + - DN_RADARR_1_API_KEY=${RADARR_4K_KEY} + {% endif %} + {% endif %} + {% if hmsdocker_container_enabled_readarr %} + - DN_READARR_0_NAME=Readarr + - DN_READARR_0_URL=http://readarr:8787 + - DN_READARR_0_API_KEY=${READARR_KEY} + {% endif %} + {% if hmsdocker_container_enabled_sonarr %} + - DN_SONARR_0_NAME=Sonarr + - DN_SONARR_0_URL=http://sonarr:8989 + - DN_SONARR_0_API_KEY=${SONARR_KEY} + {% if separate_4k_instances_enable %} + - DN_SONARR_1_NAME=Sonarr-{{ separate_4k_instances_suffix }} + - DN_SONARR_1_URL=http://sonarr-{{ separate_4k_instances_suffix }}:8989 + - DN_SONARR_1_API_KEY=${SONARR_4K_KEY} + {% endif %} + {% endif %} + {% if hmsdocker_container_enabled_sabnzbd %} + - DN_SABNZBD_0_NAME=SABnzbd + - DN_SABNZBD_0_URL=http://sabnzbd:8080 + - DN_SABNZBD_0_API_KEY=${SABNZBD_KEY} + {% endif %} + {% if hmsdocker_container_enabled_plex %} + - DN_PLEX_NAME=Plex + - DN_PLEX_URL=http://plex:32400 + - DN_PLEX_TOKEN=${PLEX_KEY} + {% endif %} + {% if hmsdocker_traefik_enabled_notifiarr or hmsdocker_homepage_enabled_notifiarr %} + labels: + {% if hmsdocker_traefik_enabled_notifiarr %} + - traefik.enable=true + - traefik.http.services.notifiarr-${COMPOSE_PROJECT}.loadbalancer.server.port=5454 + - traefik.http.routers.notifiarr-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['notifiarr']['proxy_host_rule'] | default('notifiarr') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_notifiarr %} + - traefik.http.routers.notifiarr-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_notifiarr %} + - traefik.http.routers.notifiarr-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-notifiarr-midware@docker + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 99cbe3f..f73c9d8 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1475,6 +1475,9 @@ include: {% if hmsdocker_container_enabled_autobrr %} - compose_files/autobrr.yml {% endif %} +{% if hmsdocker_container_enabled_notifiarr %} + - compose_files/notifiarr.yml +{% endif %} networks: "download_net": driver: bridge diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index d62d552..e048443 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -80,61 +80,29 @@ TAILSCALE_AUTH_KEY={{ tailscale_auth_key }} ### END Tailscale {% endif %} -{% if hmsdocker_container_enabled_homepage %} -### BEGIN Homepage -{% if hmsdocker_homepage_enabled_sonarr and hmsdocker_container_enabled_sonarr %} +### BEGIN App API Keys +NOTIFIARR_API_KEY={{ hmsdocker_notifiarr_api_key | default('') }} SONARR_KEY={{ sonarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} SONARR_4K_KEY={{ sonarr_4k_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_radarr and hmsdocker_container_enabled_radarr %} RADARR_KEY={{ radarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} RADARR_4K_KEY={{ radarr_4k_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_prowlarr and hmsdocker_container_enabled_prowlarr %} PROWLARR_KEY={{ prowlarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_sabnzbd and hmsdocker_container_enabled_sabnzbd %} SABNZBD_KEY={{ sabnzbd_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_nzbget and hmsdocker_container_enabled_nzbget %} NZBGET_KEY={{ homepage_nzbget_key | default('') }} -{% endif %} -{% if hmsdocker_homepage_enabled_tautulli and hmsdocker_container_enabled_tautulli %} TAUTULLI_KEY={{ tautulli_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_plex and hmsdocker_container_enabled_plex %} PLEX_KEY={{ plex_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_overseerr and hmsdocker_container_enabled_overseerr %} OVERSEERR_KEY={{ overseerr_key.main.apiKey | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_bazarr and hmsdocker_container_enabled_bazarr %} BAZARR_KEY={{ bazarr_key.auth.apikey | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_authentik and hmsdocker_container_enabled_authentik %} AUTHENTIK_KEY={{ homepage_authentik_key | default('') }} -{% endif %} -{% if hmsdocker_homepage_enabled_portainer and hmsdocker_container_enabled_portainer %} PORTAINER_KEY={{ homepage_portainer_key | default('') }} -{% endif %} -{% if hmsdocker_homepage_enabled_readarr and hmsdocker_container_enabled_readarr %} READARR_KEY={{ readarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} WATCHTOWER_KEY={{ watchtower_key | default('') }} -{% if hmsdocker_homepage_enabled_jellyfin and hmsdocker_container_enabled_jellyfin %} JELLYFIN_KEY={{ homepage_jellyfin_key | default('') }} -{% endif %} -{% if hmsdocker_homepage_enabled_emby and hmsdocker_container_enabled_emby %} EMBY_KEY={{ homepage_emby_key | default('') }} -{% endif %} -{% if hmsdocker_homepage_enabled_lidarr and hmsdocker_container_enabled_lidarr %} LIDARR_KEY={{ lidarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} -{% endif %} -{% if hmsdocker_homepage_enabled_autobrr and hmsdocker_container_enabled_autobrr %} AUTOBRR_KEY={{ homepage_autobrr_key | default('') }} -{% endif %} -### END Homepage -{% endif %} +### END App API Keys + {% if monitoring_scripts_enabled %} ### BEGIN Custom Monitoring Scripts diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 7a03ac9..1ed16f7 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -36,6 +36,7 @@ hmsdocker_container_enabled_maintainerr: "{{ hms_docker_container_map['maintaine hmsdocker_container_enabled_unpackerr: "{{ hms_docker_container_map['unpackerr']['enabled'] | default(False) }}" hmsdocker_container_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['enabled'] | default(False) }}" # Traefik computed variables @@ -66,6 +67,7 @@ hmsdocker_traefik_enabled_emby: "{{ hms_docker_container_map['emby']['traefik'] hmsdocker_traefik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -95,6 +97,7 @@ hmsdocker_expose_public_enabled_emby: "{{ hms_docker_container_map['emby']['expo hmsdocker_expose_public_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -125,6 +128,7 @@ hmsdocker_expose_ports_enabled_emby: "{{ True if (container_expose_ports or not hmsdocker_expose_ports_enabled_maintainerr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_maintainerr) else False }}" hmsdocker_expose_ports_enabled_lidarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_lidarr) else False }}" hmsdocker_expose_ports_enabled_autobrr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_autobrr) else False }}" +hmsdocker_expose_ports_enabled_notifiarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_notifiarr) else False }}" # Authentik computed variables # Controls global authentik variables @@ -158,6 +162,7 @@ hmsdocker_authentik_enabled_emby: "{{ hms_docker_container_map['emby']['authenti hmsdocker_authentik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['maintainerr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['lidarr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['autobrr']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['notifiarr']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage From 9be1faca022839bcb11fff18e6e4a1b04ae9a85e Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Fri, 23 Aug 2024 22:02:51 -0400 Subject: [PATCH 09/18] add speedtest tracker --- .github/extra-vars.yml | 11 +++++ docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 8 ++++ .../hmsdocker/defaults/main/service_misc.yml | 3 ++ .../tasks/generate_compose_files.yml | 12 ++++++ .../containers/speedtest-tracker.yml.j2 | 42 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 4 ++ roles/hmsdocker/templates/env.j2 | 2 + roles/hmsdocker/vars/main.yml | 5 +++ 9 files changed, 88 insertions(+) create mode 100644 roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 5c61d99..a77de44 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -290,6 +290,17 @@ "expose_to_public": false, "homepage": true, "homepage_stats": false + }, + "speedtest-tracker": { + "enabled": true, + "proxy_host_rule": "speedtest", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, + "homepage": true, + "homepage_stats": false } } } diff --git a/docs/Container Map.md b/docs/Container Map.md index e1207b4..f42f7a6 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -48,5 +48,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Lidarr | ☐ | `lidarr` | `8686` | `8686` | ☑ | | Autobrr | ☐ | `autobrr` | `7474` | `7474` | ☑ | | Notifiarr | ☐ | `notifiarr` | `5454` | `5454` | ☑ | +| Speedtest-Tracker | ☐ | `speedtest` | `8090`, `8444` | `8080`, `8443` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index e93bef9..62839f0 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -274,4 +274,12 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + speedtest-tracker: + enabled: no + proxy_host_rule: speedtest + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index c06011d..cde07e5 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -19,6 +19,9 @@ tdarr_enable_node_server: no ####################################################################### +hmsdocker_speedtest_api_key: +hmsdocker_speedtest_schedule: 0 0 * * * + ####################################################################### ### Notifiarr settings diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 1410a09..aa706b6 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -66,3 +66,15 @@ trim_blocks: yes lstrip_blocks: yes register: notifiarr_compose_file + +- name: Generate Docker Compose file for Speedtest Tracker + when: hmsdocker_container_enabled_speedtest + ansible.builtin.template: + src: containers/speedtest-tracker.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/speedtest-tracker.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: speedtest_compose_file diff --git a/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 b/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 new file mode 100644 index 0000000..3e50a27 --- /dev/null +++ b/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 @@ -0,0 +1,42 @@ +services: + speedtest-tracker: + image: lscr.io/linuxserver/speedtest-tracker:latest + container_name: speedtest-tracker + restart: ${RESTART_POLICY} + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + networks: + - proxy_net + {% if hmsdocker_expose_ports_enabled_speedtest %} + ports: + - 8090:80 + - 8444:443 + {% endif %} + environment: + - PUID=${PUID} + - PGID=${PGID} + - APP_KEY=${SPEEDTEST_API_KEY} + - APP_URL=http://{{ hms_docker_container_map['speedtest-tracker']['proxy_host_rule'] | default('speedtest') }}.${HMSD_DOMAIN} + - DB_CONNECTION=sqlite + - SPEEDTEST_SCHEDULE=${SPEEDTEST_SCHEDULE} + - APP_TIMEZONE=${TIMEZONE} + - DISPLAY_TIMEZONE=${TIMEZONE} + volumes: + - ${HMSD_APPS_PATH}/speedtest-tracker/config:/config + {% if hmsdocker_traefik_enabled_speedtest or hmsdocker_homepage_enabled_speedtest %} + labels: + {% if hmsdocker_traefik_enabled_speedtest %} + - traefik.enable=true + - traefik.http.services.speedtest-${COMPOSE_PROJECT}.loadbalancer.server.port=80 + - traefik.http.routers.speedtest-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['speedtest-tracker']['proxy_host_rule'] | default('speedtest') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_speedtest %} + - traefik.http.routers.speedtest-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_speedtest %} + - traefik.http.routers.speedtest-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-speedtest-midware@docker + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index f73c9d8..7d3037d 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1478,6 +1478,10 @@ include: {% if hmsdocker_container_enabled_notifiarr %} - compose_files/notifiarr.yml {% endif %} +{% if hmsdocker_container_enabled_speedtest %} + - compose_files/speedtest-tracker.yml +{% endif %} + networks: "download_net": driver: bridge diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index e048443..ad4e647 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -101,6 +101,8 @@ JELLYFIN_KEY={{ homepage_jellyfin_key | default('') }} EMBY_KEY={{ homepage_emby_key | default('') }} LIDARR_KEY={{ lidarr_key | default('# Will be obtained on 2nd run of playbook' if ansible_check_mode else '') }} AUTOBRR_KEY={{ homepage_autobrr_key | default('') }} +SPEEDTEST_API_KEY={{ hmsdocker_speedtest_api_key | default('') }} +SPEEDTEST_SCHEDULE={{ hmsdocker_speedtest_schedule | default('0 0 * * *')}} ### END App API Keys diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 1ed16f7..41ca471 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -37,6 +37,7 @@ hmsdocker_container_enabled_unpackerr: "{{ hms_docker_container_map['unpackerr'] hmsdocker_container_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['enabled'] | default(False) }}" hmsdocker_container_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['enabled'] | default(False) }}" # Traefik computed variables @@ -68,6 +69,7 @@ hmsdocker_traefik_enabled_maintainerr: "{{ hms_docker_container_map['maintainerr hmsdocker_traefik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -98,6 +100,7 @@ hmsdocker_expose_public_enabled_maintainerr: "{{ hms_docker_container_map['maint hmsdocker_expose_public_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -129,6 +132,7 @@ hmsdocker_expose_ports_enabled_maintainerr: "{{ True if (container_expose_ports hmsdocker_expose_ports_enabled_lidarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_lidarr) else False }}" hmsdocker_expose_ports_enabled_autobrr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_autobrr) else False }}" hmsdocker_expose_ports_enabled_notifiarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_notifiarr) else False }}" +hmsdocker_expose_ports_enabled_speedtest: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_speedtest) else False }}" # Authentik computed variables # Controls global authentik variables @@ -163,6 +167,7 @@ hmsdocker_authentik_enabled_maintainerr: "{{ hms_docker_container_map['maintaine hmsdocker_authentik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['lidarr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['autobrr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['notifiarr']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['speedtest-tracker']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage From 39289614d2ebdb9b525b576721ee58d7400c3bfc Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Fri, 23 Aug 2024 22:57:54 -0400 Subject: [PATCH 10/18] add recyclarr --- .github/extra-vars.yml | 6 +++-- README.md | 2 ++ .../hmsdocker/defaults/main/container_map.yml | 3 +++ .../hmsdocker/defaults/main/service_misc.yml | 5 ++++ .../tasks/generate_compose_files.yml | 25 +++++++++++++++++++ .../templates/containers/recyclarr.yml.j2 | 23 +++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 +++ .../hmsdocker/templates/recyclarr_conf.yml.j2 | 25 +++++++++++++++++++ roles/hmsdocker/vars/main.yml | 1 + 9 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 roles/hmsdocker/templates/containers/recyclarr.yml.j2 create mode 100644 roles/hmsdocker/templates/recyclarr_conf.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index a77de44..96b6ae1 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -299,8 +299,10 @@ "authentik": false, "authentik_provider_type": "proxy", "expose_to_public": false, - "homepage": true, - "homepage_stats": false + }, + "recyclarr": { + "enabled": true, + "directory": true, } } } diff --git a/README.md b/README.md index bdedfb4..03da550 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Unpackerr](https://github.com/Unpackerr/unpackerr): download decompression - [Autobrr](https://github.com/autobrr/autobrr): torrent automation - [Notifiarr](https://github.com/Notifiarr/notifiarr): notification system +- [Speedtest-Tracker](https://github.com/alexjustesen/speedtest-tracker): notification system +- [Recyclarr](https://github.com/recyclarr/recyclarr): auto-sync for [TRaSH guides](https://trash-guides.info/) ## Other Features diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 62839f0..9c5b084 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -282,4 +282,7 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + recyclarr: + enabled: no + directory: yes diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index cde07e5..9268e1c 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -60,3 +60,8 @@ hmsdocker_unpackerr_additional_env_vars: "UN_FILE_MODE": "0644", "UN_DIR_MODE": "0755", } + +# If the Recyclarr config should be forcefully updated +# If the config already exists, it will not be changed. If this is set to yes and the config already exists, the config will be changed and any manual changes will be lost +# Any additional Recyclarr configuration outside of creating the base config file with the correct URL and API keys will need to be done manually by following the docs: https://recyclarr.dev/wiki/yaml/config-reference/ +hmsdocker_recyclarr_force_config_update: no diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index aa706b6..48431c2 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -78,3 +78,28 @@ trim_blocks: yes lstrip_blocks: yes register: speedtest_compose_file + +- name: Generate Docker Compose file for Recyclarr + when: hmsdocker_container_enabled_recyclarr + block: + - name: Ensure Recyclarr config + ansible.builtin.template: + src: recyclarr_conf.yml.j2 + dest: "{{ hms_docker_apps_path }}/recyclarr/config/recyclarr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + force: "{{ hmsdocker_recyclarr_force_config_update }}" + trim_blocks: yes + lstrip_blocks: yes + + - name: Ensure Recyclarr Docker Compose Template + ansible.builtin.template: + src: containers/recyclarr.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/recyclarr.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: recyclarr_compose_file diff --git a/roles/hmsdocker/templates/containers/recyclarr.yml.j2 b/roles/hmsdocker/templates/containers/recyclarr.yml.j2 new file mode 100644 index 0000000..a642ce6 --- /dev/null +++ b/roles/hmsdocker/templates/containers/recyclarr.yml.j2 @@ -0,0 +1,23 @@ +services: + recyclarr: + image: ghcr.io/recyclarr/recyclarr + container_name: recyclarr + restart: ${RESTART_POLICY} + security_opt: ['no-new-privileges:true'] + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + user: ${PUID}:${PGID} + networks: + - proxy_net + volumes: + - ${HMSD_APPS_PATH}/recyclarr/config:/config + environment: + - TZ=${TIMEZONE} + - RECYCLARR_CREATE_CONFIG=true + - SONARR_KEY=${SONARR_KEY} + - SONARR_4K_KEY=${SONARR_4K_KEY} + - RADARR_KEY=${RADARR_KEY} + - RADARR_4K_KEY=${RADARR_4K_KEY} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 7d3037d..be12446 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1481,6 +1481,9 @@ include: {% if hmsdocker_container_enabled_speedtest %} - compose_files/speedtest-tracker.yml {% endif %} +{% if hmsdocker_container_enabled_recyclarr %} + - compose_files/recyclarr.yml +{% endif %} networks: "download_net": diff --git a/roles/hmsdocker/templates/recyclarr_conf.yml.j2 b/roles/hmsdocker/templates/recyclarr_conf.yml.j2 new file mode 100644 index 0000000..ce5411d --- /dev/null +++ b/roles/hmsdocker/templates/recyclarr_conf.yml.j2 @@ -0,0 +1,25 @@ +{% if hmsdocker_container_enabled_sonarr %} +sonarr: + sonarr: + base_url: http://sonarr:8989 + api_key: !env_var SONARR_KEY + + {% if separate_4k_instances_enable %} + sonarr-{{ separate_4k_instances_suffix }}: + base_url: http://sonarr-{{ separate_4k_instances_suffix }}:8989 + api_key: !env_var SONARR_4K_KEY + {% endif %} +{% endif %} + +{% if hmsdocker_container_enabled_radarr %} +radarr: + radarr: + base_url: http://radarr:7878 + api_key: !env_var RADARR_KEY + + {% if separate_4k_instances_enable %} + radarr-{{ separate_4k_instances_suffix }}: + base_url: http://radarr-{{ separate_4k_instances_suffix }}:7878 + api_key: !env_var RADARR_4K_KEY + {% endif %} +{% endif %} diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 41ca471..666dc1f 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -38,6 +38,7 @@ hmsdocker_container_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['enab hmsdocker_container_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['enabled'] | default(False) }}" hmsdocker_container_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['enabled'] | default(False) }}" +hmsdocker_container_enabled_recyclarr: "{{ hms_docker_container_map['recyclarr']['enabled'] | default(False) }}" # Traefik computed variables From da1a1f3902e2f9f6276921b7ed9d1cab70d850a5 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Fri, 23 Aug 2024 23:20:29 -0400 Subject: [PATCH 11/18] add tinymediamanager --- .github/extra-vars.yml | 11 ++++- README.md | 1 + docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 8 ++++ .../hmsdocker/defaults/main/service_misc.yml | 3 ++ .../tasks/generate_compose_files.yml | 13 +++++- .../containers/tinymediamanager.yml.j2 | 42 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 ++ roles/hmsdocker/vars/main.yml | 5 +++ 9 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 96b6ae1..0c0cb4d 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -303,6 +303,15 @@ "recyclarr": { "enabled": true, "directory": true, - } + }, + "tinymediamanager": { + "enabled": true, + "proxy_host_rule": "tmm", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, + }, } } diff --git a/README.md b/README.md index 03da550..f1ca59f 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Calibre](https://github.com/linuxserver/docker-calibre): ebook management - [Tdarr](https://github.com/HaveAGitGat/Tdarr): media transcoding - [Maintainerr](https://github.com/jorenn92/Maintainerr): media management +- [tinyMediaManager](https://gitlab.com/tinyMediaManager/tinyMediaManager): media management ### Download Clients diff --git a/docs/Container Map.md b/docs/Container Map.md index f42f7a6..6a7cae3 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -49,5 +49,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Autobrr | ☐ | `autobrr` | `7474` | `7474` | ☑ | | Notifiarr | ☐ | `notifiarr` | `5454` | `5454` | ☑ | | Speedtest-Tracker | ☐ | `speedtest` | `8090`, `8444` | `8080`, `8443` | ☑ | +| tinyMediaManager | ☐ | `tmm` | `5900`, `4000` | `5900`, `4000` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 9c5b084..9e6d6e0 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -285,4 +285,12 @@ hms_docker_container_map: recyclarr: enabled: no directory: yes + tinymediamanager: + enabled: no + proxy_host_rule: tmm + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index 9268e1c..9e72757 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -65,3 +65,6 @@ hmsdocker_unpackerr_additional_env_vars: # If the config already exists, it will not be changed. If this is set to yes and the config already exists, the config will be changed and any manual changes will be lost # Any additional Recyclarr configuration outside of creating the base config file with the correct URL and API keys will need to be done manually by following the docs: https://recyclarr.dev/wiki/yaml/config-reference/ hmsdocker_recyclarr_force_config_update: no + +# VNC password for TinyMediaManager +hmsdocker_tinymediamanager_vnc_password: diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 48431c2..57435d0 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -93,7 +93,7 @@ trim_blocks: yes lstrip_blocks: yes - - name: Ensure Recyclarr Docker Compose Template + - name: Generate Docker Compose file for Recyclarr ansible.builtin.template: src: containers/recyclarr.yml.j2 dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/recyclarr.yml" @@ -103,3 +103,14 @@ trim_blocks: yes lstrip_blocks: yes register: recyclarr_compose_file + +- name: Generate Docker Compose file for TinyMediaManager + ansible.builtin.template: + src: containers/tinymediamanager.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/tinymediamanager.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: tinymediamanager_compose_file diff --git a/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 b/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 new file mode 100644 index 0000000..edef981 --- /dev/null +++ b/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 @@ -0,0 +1,42 @@ +services: + tinymediamanager: + image: tinymediamanager/tinymediamanager:latest + container_name: tinymediamanager + restart: ${RESTART_POLICY} + {% if hmsdocker_expose_ports_enabled_tinymediamanager %} + ports: + - 5900:5900 # VNC port + - 4000:4000 # Webinterface + {% endif %} + networks: + - proxy_net + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + environment: + - USER_ID=${PUID} + - GROUP_ID=${PGID} + - ALLOW_DIRECT_VNC=true + - LC_ALL=en_US.UTF-8 # force UTF8 + - LANG=en_US.UTF-8 # force UTF8 + - PASSWORD=${TMM_VNC_PASSWORD} + - TZ=${TIMEZONE} + volumes: + - ${HMSD_APPS_PATH}/tinymediamanager/config:/data + - ${HMSD_MOUNT_PATH}:/media + {% if hmsdocker_traefik_enabled_tinymediamanager or hmsdocker_homepage_enabled_tinymediamanager %} + labels: + {% if hmsdocker_traefik_enabled_tinymediamanager %} + - traefik.enable=true + - traefik.http.services.tinymediamanager-${COMPOSE_PROJECT}.loadbalancer.server.port=4000 + - traefik.http.routers.tinymediamanager-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['tinymediamanager']['proxy_host_rule'] | default('tmm') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_tinymediamanager %} + - traefik.http.routers.tinymediamanager-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_tinymediamanager %} + - traefik.http.routers.tinymediamanager-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-tinymediamanager-midware@docker + {% endif %} + {% endif %} + {% endif %} diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index be12446..9ead8cc 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1484,6 +1484,9 @@ include: {% if hmsdocker_container_enabled_recyclarr %} - compose_files/recyclarr.yml {% endif %} +{% if hmsdocker_container_enabled_tinymediamanager %} + - compose_files/tinymediamanager.yml +{% endif %} networks: "download_net": diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 666dc1f..dab24e5 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -39,6 +39,7 @@ hmsdocker_container_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['en hmsdocker_container_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['enabled'] | default(False) }}" hmsdocker_container_enabled_recyclarr: "{{ hms_docker_container_map['recyclarr']['enabled'] | default(False) }}" +hmsdocker_container_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['enabled'] | default(False) }}" # Traefik computed variables @@ -71,6 +72,7 @@ hmsdocker_traefik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['traefi hmsdocker_traefik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -102,6 +104,7 @@ hmsdocker_expose_public_enabled_lidarr: "{{ hms_docker_container_map['lidarr'][' hmsdocker_expose_public_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -134,6 +137,7 @@ hmsdocker_expose_ports_enabled_lidarr: "{{ True if (container_expose_ports or no hmsdocker_expose_ports_enabled_autobrr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_autobrr) else False }}" hmsdocker_expose_ports_enabled_notifiarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_notifiarr) else False }}" hmsdocker_expose_ports_enabled_speedtest: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_speedtest) else False }}" +hmsdocker_expose_ports_enabled_tinymediamanager: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_tinymediamanager) else False }}" # Authentik computed variables # Controls global authentik variables @@ -169,6 +173,7 @@ hmsdocker_authentik_enabled_lidarr: "{{ hms_docker_container_map['lidarr']['auth hmsdocker_authentik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['autobrr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['notifiarr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['speedtest-tracker']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['tinymediamanager']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage From be7e43349b30e0e9a3c0cb5069b5374e082dea55 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:11:25 -0400 Subject: [PATCH 12/18] add tinymediamanager --- roles/hmsdocker/templates/env.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index ad4e647..b2e80a5 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -103,6 +103,7 @@ LIDARR_KEY={{ lidarr_key | default('# Will be obtained on 2nd run of playbook' i AUTOBRR_KEY={{ homepage_autobrr_key | default('') }} SPEEDTEST_API_KEY={{ hmsdocker_speedtest_api_key | default('') }} SPEEDTEST_SCHEDULE={{ hmsdocker_speedtest_schedule | default('0 0 * * *')}} +TMM_VNC_PASSWORD={{ hmsdocker_tinymediamanager_vnc_password | default('Th1s1SinS3cuR3Pl3@s3cH@Ng') }} ### END App API Keys From 57ead3756d30f8f46d9b4cada4ed37076782657f Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:53:36 -0400 Subject: [PATCH 13/18] add pasta --- README.md | 2 ++ docs/Container Map.md | 1 + .../hmsdocker/defaults/main/container_map.yml | 8 +++++ .../tasks/generate_compose_files.yml | 11 +++++++ .../templates/containers/pasta.yml.j2 | 31 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 ++ roles/hmsdocker/vars/main.yml | 5 +++ 7 files changed, 61 insertions(+) create mode 100644 roles/hmsdocker/templates/containers/pasta.yml.j2 diff --git a/README.md b/README.md index f1ca59f..2f0ccb6 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Notifiarr](https://github.com/Notifiarr/notifiarr): notification system - [Speedtest-Tracker](https://github.com/alexjustesen/speedtest-tracker): notification system - [Recyclarr](https://github.com/recyclarr/recyclarr): auto-sync for [TRaSH guides](https://trash-guides.info/) +- [PASTA](https://github.com/cglatot/pasta): audio and subtitle management + ## Other Features diff --git a/docs/Container Map.md b/docs/Container Map.md index 6a7cae3..bb58ddc 100644 --- a/docs/Container Map.md +++ b/docs/Container Map.md @@ -50,5 +50,6 @@ If you choose to expose the container ports on the host (by setting `container_e | Notifiarr | ☐ | `notifiarr` | `5454` | `5454` | ☑ | | Speedtest-Tracker | ☐ | `speedtest` | `8090`, `8444` | `8080`, `8443` | ☑ | | tinyMediaManager | ☐ | `tmm` | `5900`, `4000` | `5900`, `4000` | ☑ | +| PASTA | ☐ | `pasta` | `8085` | `80` | ☑ | If both Jellyfin and Emby are enabled, then Emby will be available on ports `8097` and `8921` (if ports are being exposed for both) diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 9e6d6e0..6f31047 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -293,4 +293,12 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + pasta: + enabled: no + proxy_host_rule: pasta + directory: yes + traefik: yes + authentik: no + authentik_provider_type: proxy + expose_to_public: no diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 57435d0..6bd7c6d 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -114,3 +114,14 @@ trim_blocks: yes lstrip_blocks: yes register: tinymediamanager_compose_file + +- name: Generate Docker Compose file for PASTA + ansible.builtin.template: + src: containers/pasta.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/pasta.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: pasta_compose_file diff --git a/roles/hmsdocker/templates/containers/pasta.yml.j2 b/roles/hmsdocker/templates/containers/pasta.yml.j2 new file mode 100644 index 0000000..1390691 --- /dev/null +++ b/roles/hmsdocker/templates/containers/pasta.yml.j2 @@ -0,0 +1,31 @@ +services: + pasta: + image: cglatot/pasta:latest + container_name: pasta + restart: ${RESTART_POLICY} + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + networks: + - proxy_net + {% if hmsdocker_expose_ports_enabled_pasta %} + ports: + - 8085:80 + {% endif %} + {% if hmsdocker_traefik_enabled_pasta or hmsdocker_homepage_enabled_pasta %} + labels: + {% if hmsdocker_traefik_enabled_pasta %} + - traefik.enable=true + - traefik.http.services.pasta-${COMPOSE_PROJECT}.loadbalancer.server.port=80 + - traefik.http.routers.pasta-${COMPOSE_PROJECT}.rule=Host(`{{ hms_docker_container_map['pasta']['proxy_host_rule'] | default('pasta') }}.${HMSD_DOMAIN}`) + {% if not hmsdocker_expose_public_enabled_pasta %} + - traefik.http.routers.pasta-${COMPOSE_PROJECT}.middlewares=internal-ipallowlist@file + {% endif %} + {% if hmsdocker_authentik_enabled_pasta %} + - traefik.http.routers.pasta-${COMPOSE_PROJECT}.middlewares=authentik-proxy-${COMPOSE_PROJECT}-pasta-midware@docker + {% endif %} + {% endif %} + {% endif %} + diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 9ead8cc..949e9ee 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1487,6 +1487,9 @@ include: {% if hmsdocker_container_enabled_tinymediamanager %} - compose_files/tinymediamanager.yml {% endif %} +{% if hmsdocker_container_enabled_pasta %} + - compose_files/pasta.yml +{% endif %} networks: "download_net": diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index dab24e5..527de77 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -40,6 +40,7 @@ hmsdocker_container_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr'] hmsdocker_container_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['enabled'] | default(False) }}" hmsdocker_container_enabled_recyclarr: "{{ hms_docker_container_map['recyclarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['enabled'] | default(False) }}" +hmsdocker_container_enabled_pasta: "{{ hms_docker_container_map['pasta']['enabled'] | default(False) }}" # Traefik computed variables @@ -73,6 +74,7 @@ hmsdocker_traefik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['trae hmsdocker_traefik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" hmsdocker_traefik_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" +hmsdocker_traefik_enabled_pasta: "{{ hms_docker_container_map['pasta']['traefik'] | default(False) and hmsdocker_container_enabled_traefik }}" # Public container exposure computed variables @@ -105,6 +107,7 @@ hmsdocker_expose_public_enabled_autobrr: "{{ hms_docker_container_map['autobrr'] hmsdocker_expose_public_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['expose_to_public'] | default(False) }}" hmsdocker_expose_public_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['expose_to_public'] | default(False) }}" +hmsdocker_expose_public_enabled_pasta: "{{ hms_docker_container_map['pasta']['expose_to_public'] | default(False) }}" # Container host port mapping computed variables @@ -138,6 +141,7 @@ hmsdocker_expose_ports_enabled_autobrr: "{{ True if (container_expose_ports or n hmsdocker_expose_ports_enabled_notifiarr: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_notifiarr) else False }}" hmsdocker_expose_ports_enabled_speedtest: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_speedtest) else False }}" hmsdocker_expose_ports_enabled_tinymediamanager: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_tinymediamanager) else False }}" +hmsdocker_expose_ports_enabled_pasta: "{{ True if (container_expose_ports or not hmsdocker_container_enabled_traefik or not hmsdocker_traefik_enabled_pasta) else False }}" # Authentik computed variables # Controls global authentik variables @@ -174,6 +178,7 @@ hmsdocker_authentik_enabled_autobrr: "{{ hms_docker_container_map['autobrr']['au hmsdocker_authentik_enabled_notifiarr: "{{ hms_docker_container_map['notifiarr']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['notifiarr']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_speedtest: "{{ hms_docker_container_map['speedtest-tracker']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['speedtest-tracker']['authentik_provider_type'] == 'proxy' | default(False) }}" hmsdocker_authentik_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['tinymediamanager']['authentik_provider_type'] == 'proxy' | default(False) }}" +hmsdocker_authentik_enabled_pasta: "{{ hms_docker_container_map['pasta']['authentik'] | default(False) and hmsdocker_authentik_enabled_globally and hms_docker_container_map['pasta']['authentik_provider_type'] == 'proxy' | default(False) }}" # Homepage From f9c31551211a0154cfc8da8c56d9294cf41514f9 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:54:39 -0400 Subject: [PATCH 14/18] add pasta --- .github/extra-vars.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 0c0cb4d..02c4648 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -313,5 +313,14 @@ "authentik_provider_type": "proxy", "expose_to_public": false, }, + "pasta": { + "enabled": true, + "proxy_host_rule": "pasta", + "directory": true, + "traefik": true, + "authentik": false, + "authentik_provider_type": "proxy", + "expose_to_public": false, + }, } } From 62d6d42cb384329e88891490dc1dc0b508ff56d9 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 01:26:06 -0400 Subject: [PATCH 15/18] fix logic --- roles/hmsdocker/tasks/main.yml | 19 ++++++++++++++++--- .../templates/containers/maintainerr.yml.j2 | 2 +- .../templates/containers/pasta.yml.j2 | 2 +- .../containers/speedtest-tracker.yml.j2 | 2 +- .../containers/tinymediamanager.yml.j2 | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/roles/hmsdocker/tasks/main.yml b/roles/hmsdocker/tasks/main.yml index cb170ae..2b5b847 100644 --- a/roles/hmsdocker/tasks/main.yml +++ b/roles/hmsdocker/tasks/main.yml @@ -61,10 +61,10 @@ mode: 0755 with_items: "{{ directory_stats.results }}" when: - - item.item.value.directory - - item.item.value.enabled is defined and item.item.value.enabled + - item.item.value.directory | default(false) + - item.item.value.enabled | default(false) - item.item.key == 'sonarr' or item.item.key == 'radarr' - - separate_4k_instances_enable is defined and separate_4k_instances_enable + - separate_4k_instances_enable | default(false) - not item.stat.exists - name: Ensure Traefik @@ -134,6 +134,19 @@ - name: Ensure App Compose Files ansible.builtin.import_tasks: "generate_compose_files.yml" +### Adding here for the future when all the containers will be in their own files +# - name: Generate Docker Compose files for enabled containers +# when: item.value.enabled +# ansible.builtin.template: +# src: containers/{{ item.key }}.yml.j2 +# dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/{{ item.key }}.yml" +# owner: "{{ container_uid }}" +# group: "{{ container_gid }}" +# mode: 0644 +# trim_blocks: yes +# lstrip_blocks: yes +# with_dict: "{{ hms_docker_container_map }}" + - name: Ensure docker-compose.yml file. ansible.builtin.template: src: docker-compose.yml.j2 diff --git a/roles/hmsdocker/templates/containers/maintainerr.yml.j2 b/roles/hmsdocker/templates/containers/maintainerr.yml.j2 index 0fa8e11..2a9ecc5 100644 --- a/roles/hmsdocker/templates/containers/maintainerr.yml.j2 +++ b/roles/hmsdocker/templates/containers/maintainerr.yml.j2 @@ -19,7 +19,7 @@ services: ports: - 6246:6246 {% endif %} - {% if hmsdocker_traefik_enabled_maintainerr or hmsdocker_homepage_enabled_maintainerr %} + {% if hmsdocker_traefik_enabled_maintainerr %} labels: {% if hmsdocker_traefik_enabled_maintainerr %} - traefik.enable=true diff --git a/roles/hmsdocker/templates/containers/pasta.yml.j2 b/roles/hmsdocker/templates/containers/pasta.yml.j2 index 1390691..44b096b 100644 --- a/roles/hmsdocker/templates/containers/pasta.yml.j2 +++ b/roles/hmsdocker/templates/containers/pasta.yml.j2 @@ -14,7 +14,7 @@ services: ports: - 8085:80 {% endif %} - {% if hmsdocker_traefik_enabled_pasta or hmsdocker_homepage_enabled_pasta %} + {% if hmsdocker_traefik_enabled_pasta %} labels: {% if hmsdocker_traefik_enabled_pasta %} - traefik.enable=true diff --git a/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 b/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 index 3e50a27..38ed8ee 100644 --- a/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 +++ b/roles/hmsdocker/templates/containers/speedtest-tracker.yml.j2 @@ -26,7 +26,7 @@ services: - DISPLAY_TIMEZONE=${TIMEZONE} volumes: - ${HMSD_APPS_PATH}/speedtest-tracker/config:/config - {% if hmsdocker_traefik_enabled_speedtest or hmsdocker_homepage_enabled_speedtest %} + {% if hmsdocker_traefik_enabled_speedtest %} labels: {% if hmsdocker_traefik_enabled_speedtest %} - traefik.enable=true diff --git a/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 b/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 index edef981..699ff20 100644 --- a/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 +++ b/roles/hmsdocker/templates/containers/tinymediamanager.yml.j2 @@ -26,7 +26,7 @@ services: volumes: - ${HMSD_APPS_PATH}/tinymediamanager/config:/data - ${HMSD_MOUNT_PATH}:/media - {% if hmsdocker_traefik_enabled_tinymediamanager or hmsdocker_homepage_enabled_tinymediamanager %} + {% if hmsdocker_traefik_enabled_tinymediamanager %} labels: {% if hmsdocker_traefik_enabled_tinymediamanager %} - traefik.enable=true From b35b07c1eb39290745fd0d2c82f40089ba0b02b8 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 02:38:26 -0400 Subject: [PATCH 16/18] add netdata --- .github/extra-vars.yml | 3 ++ README.md | 1 + docs/Netdata.md | 23 +++++++++++ .../hmsdocker/defaults/main/container_map.yml | 4 ++ .../hmsdocker/defaults/main/service_misc.yml | 3 ++ roles/hmsdocker/defaults/main/traefik.yml | 8 ++++ .../tasks/generate_compose_files.yml | 13 ++++++- .../templates/containers/netdata.yml.j2 | 39 +++++++++++++++++++ .../hmsdocker/templates/docker-compose.yml.j2 | 3 ++ roles/hmsdocker/templates/env.j2 | 3 ++ roles/hmsdocker/vars/main.yml | 1 + 11 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 docs/Netdata.md create mode 100644 roles/hmsdocker/templates/containers/netdata.yml.j2 diff --git a/.github/extra-vars.yml b/.github/extra-vars.yml index 02c4648..bec983b 100644 --- a/.github/extra-vars.yml +++ b/.github/extra-vars.yml @@ -322,5 +322,8 @@ "authentik_provider_type": "proxy", "expose_to_public": false, }, + "netdata": { + "enabled": true + }, } } diff --git a/README.md b/README.md index 2f0ccb6..5bba773 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ Ansible Playbook to setup an automated Home Media Server stack running on Docker - [Speedtest-Tracker](https://github.com/alexjustesen/speedtest-tracker): notification system - [Recyclarr](https://github.com/recyclarr/recyclarr): auto-sync for [TRaSH guides](https://trash-guides.info/) - [PASTA](https://github.com/cglatot/pasta): audio and subtitle management +- [Netdata](https://github.com/netdata/netdata): observability ## Other Features diff --git a/docs/Netdata.md b/docs/Netdata.md new file mode 100644 index 0000000..d79471f --- /dev/null +++ b/docs/Netdata.md @@ -0,0 +1,23 @@ +# Netdata Container + +To claim your Netdata node when prompted in the console, run this command: + +```bash +docker exec -it netdata cat /var/lib/netdata/netdata_random_session_id +``` + +Since Netdata uses the `host` network mode, it cannot be connected to Traefik via the Docker internal network which results in it not being "auto-discovered" by Traefik. + +Instead, you will have to treat it as an "external service" to Traefik. Using the advanced configuration and in `inventory/group_vars/all/traefik.yml`, set `traefik_ext_hosts_enabled` to `yes` and uncomment the lines in `traefik_ext_hosts_list` that are related to Netdata (like below): + +```yml +... +{ + friendly_name: netdata, + subdomain_name: netdata, + backend_url: "http://netdata.{{ hms_docker_domain }}:19999", + enabled: yes, + authentik: no, + authentik_provider_type: proxy +} +``` diff --git a/roles/hmsdocker/defaults/main/container_map.yml b/roles/hmsdocker/defaults/main/container_map.yml index 6f31047..3694b77 100644 --- a/roles/hmsdocker/defaults/main/container_map.yml +++ b/roles/hmsdocker/defaults/main/container_map.yml @@ -301,4 +301,8 @@ hms_docker_container_map: authentik: no authentik_provider_type: proxy expose_to_public: no + netdata: + enabled: no + + diff --git a/roles/hmsdocker/defaults/main/service_misc.yml b/roles/hmsdocker/defaults/main/service_misc.yml index 9e72757..27b13ed 100644 --- a/roles/hmsdocker/defaults/main/service_misc.yml +++ b/roles/hmsdocker/defaults/main/service_misc.yml @@ -22,6 +22,9 @@ tdarr_enable_node_server: no hmsdocker_speedtest_api_key: hmsdocker_speedtest_schedule: 0 0 * * * +hmsdocker_netadata_claim_token: +hmsdocker_netdata_claim_url: https://app.netdata.cloud +hmsdocker_netdata_claim_rooms: ####################################################################### ### Notifiarr settings diff --git a/roles/hmsdocker/defaults/main/traefik.yml b/roles/hmsdocker/defaults/main/traefik.yml index 3dcad00..5b4ad0e 100644 --- a/roles/hmsdocker/defaults/main/traefik.yml +++ b/roles/hmsdocker/defaults/main/traefik.yml @@ -74,6 +74,14 @@ traefik_ext_hosts_list: [ # authentik: no, # authentik_provider_type: proxy #}, + #{ + # friendly_name: netdata, + # subdomain_name: netdata, + # backend_url: "http://netdata.{{ hms_docker_domain }}:19999", + # enabled: yes, + # authentik: no, + # authentik_provider_type: proxy + #}, ] diff --git a/roles/hmsdocker/tasks/generate_compose_files.yml b/roles/hmsdocker/tasks/generate_compose_files.yml index 6bd7c6d..de7c7f8 100644 --- a/roles/hmsdocker/tasks/generate_compose_files.yml +++ b/roles/hmsdocker/tasks/generate_compose_files.yml @@ -1,4 +1,4 @@ -- name: Generate Docker Compose files for include +- name: Ensure compose_files directory exists ansible.builtin.file: dest: "{{ hms_docker_data_path }}/compose_files" state: directory @@ -125,3 +125,14 @@ trim_blocks: yes lstrip_blocks: yes register: pasta_compose_file + +- name: Generate Docker Compose file for Netdata + ansible.builtin.template: + src: containers/netdata.yml.j2 + dest: "{{ compose_dir.dest | default(hms_docker_data_path + '/compose_files') }}/netdata.yml" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 + trim_blocks: yes + lstrip_blocks: yes + register: netdata_compose_file diff --git a/roles/hmsdocker/templates/containers/netdata.yml.j2 b/roles/hmsdocker/templates/containers/netdata.yml.j2 new file mode 100644 index 0000000..f23ade0 --- /dev/null +++ b/roles/hmsdocker/templates/containers/netdata.yml.j2 @@ -0,0 +1,39 @@ +services: + netdata: + image: netdata/netdata + container_name: netdata + pid: host + restart: ${RESTART_POLICY} + network_mode: host + logging: + options: + max-size: "12m" + max-file: "5" + driver: json-file + cap_add: + - SYS_PTRACE + - SYS_ADMIN + security_opt: + - apparmor:unconfined + volumes: + - netdataconfig:/etc/netdata + - netdatalib:/var/lib/netdata + - netdatacache:/var/cache/netdata + - /:/host/root:ro,rslave + - /etc/passwd:/host/etc/passwd:ro + - /etc/group:/host/etc/group:ro + - /etc/localtime:/etc/localtime:ro + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /etc/os-release:/host/etc/os-release:ro + - /var/log:/host/var/log:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + environment: + - NETDATA_CLAIM_TOKEN=${NETDATA_CLAIM_TOKEN} + - NETDATA_CLAIM_URL=${NETDATA_CLAIM_URL} + - NETDATA_CLAIM_ROOMS=${NETDATA_CLAIM_ROOMS} + +volumes: + netdataconfig: + netdatalib: + netdatacache: diff --git a/roles/hmsdocker/templates/docker-compose.yml.j2 b/roles/hmsdocker/templates/docker-compose.yml.j2 index 949e9ee..280d0fe 100644 --- a/roles/hmsdocker/templates/docker-compose.yml.j2 +++ b/roles/hmsdocker/templates/docker-compose.yml.j2 @@ -1490,6 +1490,9 @@ include: {% if hmsdocker_container_enabled_pasta %} - compose_files/pasta.yml {% endif %} +{% if hmsdocker_container_enabled_netdata %} + - compose_files/netdata.yml +{% endif %} networks: "download_net": diff --git a/roles/hmsdocker/templates/env.j2 b/roles/hmsdocker/templates/env.j2 index b2e80a5..99cd191 100644 --- a/roles/hmsdocker/templates/env.j2 +++ b/roles/hmsdocker/templates/env.j2 @@ -104,6 +104,9 @@ AUTOBRR_KEY={{ homepage_autobrr_key | default('') }} SPEEDTEST_API_KEY={{ hmsdocker_speedtest_api_key | default('') }} SPEEDTEST_SCHEDULE={{ hmsdocker_speedtest_schedule | default('0 0 * * *')}} TMM_VNC_PASSWORD={{ hmsdocker_tinymediamanager_vnc_password | default('Th1s1SinS3cuR3Pl3@s3cH@Ng') }} +NETDATA_CLAIM_TOKEN={{ hmsdocker_netdata_claim_token | default('') }} +NETDATA_CLAIM_URL={{ hmsdocker_netdata_claim_url | default('') }} +NETDATA_CLAIM_ROOMS={{ hmsdocker_netdata_claim_rooms | default('') }} ### END App API Keys diff --git a/roles/hmsdocker/vars/main.yml b/roles/hmsdocker/vars/main.yml index 527de77..ce03826 100644 --- a/roles/hmsdocker/vars/main.yml +++ b/roles/hmsdocker/vars/main.yml @@ -41,6 +41,7 @@ hmsdocker_container_enabled_speedtest: "{{ hms_docker_container_map['speedtest-t hmsdocker_container_enabled_recyclarr: "{{ hms_docker_container_map['recyclarr']['enabled'] | default(False) }}" hmsdocker_container_enabled_tinymediamanager: "{{ hms_docker_container_map['tinymediamanager']['enabled'] | default(False) }}" hmsdocker_container_enabled_pasta: "{{ hms_docker_container_map['pasta']['enabled'] | default(False) }}" +hmsdocker_container_enabled_netdata: "{{ hms_docker_container_map['netdata']['enabled'] | default(False) }}" # Traefik computed variables From 7e2a8170aa2cace3cf38b3077b8737e2cd3f7220 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:10:12 -0400 Subject: [PATCH 17/18] move versioning to role task --- hms-docker.yml | 86 -------------------------- roles/hmsdocker/tasks/main.yml | 5 +- roles/hmsdocker/tasks/versioning.yml | 91 ++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 87 deletions(-) create mode 100644 roles/hmsdocker/tasks/versioning.yml diff --git a/hms-docker.yml b/hms-docker.yml index c506522..d0c05d6 100644 --- a/hms-docker.yml +++ b/hms-docker.yml @@ -14,92 +14,6 @@ - galaxy-roles/geerlingguy.docker tasks: - - name: Check if old variables dir exists - ansible.builtin.stat: - path: vars/custom - register: prev_var_dir - - - name: Fail if previous var dir exists and is not symlink - ansible.builtin.fail: - msg: "You are using the old directory structure for variables. Please update your paths by running: 'make migrate-vars'. This will move the 'vars/custom' files to 'inventory/group_vars/all'" - when: - - prev_var_dir.stat.exists and not prev_var_dir.stat.islnk - - - name: Ensure data path exists locally. - ansible.builtin.file: - path: "{{ hms_docker_data_path }}" - state: directory - - - name: Check if version file exists - stat: - path: "{{ hmsd_version_file }}" - register: version_file_check - - - name: Set last version if file doesn't exist - set_fact: - last_version: "0.0" - when: not version_file_check.stat.exists - - - name: Read last version from file - slurp: - src: "{{ hmsd_version_file }}" - register: last_version_content - when: version_file_check.stat.exists - - - name: Decode last version - set_fact: - last_version: "{{ last_version_content.content | b64decode | trim }}" - when: version_file_check.stat.exists - - - name: Compare versions and prompt if newer - when: hmsd_current_version is version(last_version, '>') and not (is_github_runner | default(false)) - block: - - name: Display current and last versions - debug: - msg: "New version: {{ hmsd_current_version }}, Your version: {{ last_version }}" - - - name: Prompt user if they want to continue - pause: - prompt: | - - A newer version of the playbook is about to be applied. - - New version; {{ hmsd_current_version }} - Your version; {{ last_version }} - - This may introduce breaking changes, please review all changes and understand them before applying. - - Do you want to continue? (yes/no) - register: continue_playbook - - - name: Hardlink path migration version prompt - when: last_version is version(0.2, '<') - block: - - name: Prompt user if they want to continue - pause: - prompt: | - - Version 0.2 (you are on version {{ last_version }}) changed the paths that media and downloads are mounted to within containers. - You will need to update the apps config to point to the new location in the container. - - Do you want to continue? (yes/no)" - register: continue_playbook_hardlink_update - - - name: Fail if user does not want to continue - fail: - msg: "Playbook execution aborted." - when: continue_playbook_hardlink_update.user_input | lower != "yes" - - - name: Fail if user does not want to continue - fail: - msg: "Playbook execution aborted." - when: continue_playbook.user_input | lower != "yes" - - - name: Save current version to file - copy: - content: "{{ hmsd_current_version }}" - dest: "{{ hmsd_version_file }}" - - name: Ensure Nvidia GPU role if enabled ansible.builtin.import_role: name: gpu diff --git a/roles/hmsdocker/tasks/main.yml b/roles/hmsdocker/tasks/main.yml index 2b5b847..aa0b78a 100644 --- a/roles/hmsdocker/tasks/main.yml +++ b/roles/hmsdocker/tasks/main.yml @@ -1,5 +1,8 @@ --- -- name: Ensure paths exists locally. +- name: Run versioning checks + ansible.builtin.import_tasks: "versioning.yml" + +- name: Ensure data, apps, and mount paths exists locally. ansible.builtin.file: path: "{{ item }}" state: directory diff --git a/roles/hmsdocker/tasks/versioning.yml b/roles/hmsdocker/tasks/versioning.yml new file mode 100644 index 0000000..cc965d6 --- /dev/null +++ b/roles/hmsdocker/tasks/versioning.yml @@ -0,0 +1,91 @@ +- name: Check if old variables dir exists + ansible.builtin.stat: + path: vars/custom + register: prev_var_dir + +- name: Fail if previous var dir exists and is not symlink + ansible.builtin.fail: + msg: "You are using the old directory structure for variables. Please update your paths by running: 'make migrate-vars'. This will move the 'vars/custom' files to 'inventory/group_vars/all'" + when: + - prev_var_dir.stat.exists and not prev_var_dir.stat.islnk + +- name: Ensure data path exists locally. + ansible.builtin.file: + path: "{{ hms_docker_data_path }}" + state: directory + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0755 + +- name: Check if version file exists + ansible.builtin.stat: + path: "{{ hmsd_version_file }}" + register: version_file_check + +- name: Set last version if file doesn't exist + ansible.builtin.set_fact: + last_version: "0.0" + when: not version_file_check.stat.exists + +- name: Read last version from file + ansible.builtin.slurp: + src: "{{ hmsd_version_file }}" + register: last_version_content + when: version_file_check.stat.exists + +- name: Decode last version + ansible.builtin.set_fact: + last_version: "{{ last_version_content.content | b64decode | trim }}" + when: version_file_check.stat.exists + +- name: Compare versions and prompt if newer + when: hmsd_current_version is version(last_version, '>') and not (is_github_runner | default(false)) + block: + - name: Display current and last versions + ansible.builtin.debug: + msg: "New version: {{ hmsd_current_version }}, Your version: {{ last_version }}" + + - name: Prompt user if they want to continue + ansible.builtin.pause: + prompt: | + + A newer version of the playbook is about to be applied. + + New version; {{ hmsd_current_version }} + Your version; {{ last_version }} + + This may introduce breaking changes, please review all changes and understand them before applying. + + Do you want to continue? (yes/no) + register: continue_playbook + + - name: Hardlink path migration version prompt + when: last_version is version(0.2, '<') + block: + - name: Prompt user if they want to continue + ansible.builtin.pause: + prompt: | + + Version 0.2 (you are on version {{ last_version }}) changed the paths that media and downloads are mounted to within containers. + You will need to update the apps config to point to the new location in the container. + + Do you want to continue? (yes/no)" + register: continue_playbook_hardlink_update + + - name: Fail if user does not want to continue + ansible.builtin.fail: + msg: "Playbook execution aborted." + when: continue_playbook_hardlink_update.user_input | lower != "yes" + + - name: Fail if user does not want to continue + ansible.builtin.fail: + msg: "Playbook execution aborted." + when: continue_playbook.user_input | lower != "yes" + +- name: Save current version to file + ansible.builtin.copy: + content: "{{ hmsd_current_version }}" + dest: "{{ hmsd_version_file }}" + owner: "{{ container_uid }}" + group: "{{ container_gid }}" + mode: 0644 From 2d68f193f45875d7909b4fadeb4fed3822d2e698 Mon Sep 17 00:00:00 2001 From: Aidan Hembree <8049680+ahembree@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:22:09 -0400 Subject: [PATCH 18/18] bump version --- docs/Release Notes.md | 18 +++++++++++++++++- hms-docker.yml | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/Release Notes.md b/docs/Release Notes.md index dce9b06..b68c0bb 100644 --- a/docs/Release Notes.md +++ b/docs/Release Notes.md @@ -1,6 +1,22 @@ # Release Notes -Note that any update to a new version must be done manually using a `make update` since some variables may now be deprecated/renamed. +Note that any update to a new version might need to be done manually using a `make update` since some variables may now be deprecated/renamed. + +## Version 1.4 + +New containers: + +* Maintainerr +* Unpackerr +* Lidarr +* Autobrr +* Speedtest-Tracker +* Recyclarr +* tinyMediaManager +* PASTA +* Netdata + +I now realize while writing these notes that version 0.2 was merged into 1.3 without a new Tag release, whoops... ## Version 1.3 diff --git a/hms-docker.yml b/hms-docker.yml index d0c05d6..c7d16d5 100644 --- a/hms-docker.yml +++ b/hms-docker.yml @@ -3,7 +3,7 @@ become: yes gather_facts: yes vars: - hmsd_current_version: 1.3 + hmsd_current_version: 1.4 hmsd_version_file: "{{ hms_docker_data_path }}/.hmsd-version" regex: '[^A-Za-z0-9._-]' replace: '_'