Make roles more reusable
This commit is contained in:
19
group_vars/laptop/dotfiles.yml
Normal file
19
group_vars/laptop/dotfiles.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
# Home dotfile packages to deploy
|
||||||
|
dotfiles_home_packages:
|
||||||
|
- aichat
|
||||||
|
- btrbk
|
||||||
|
- env
|
||||||
|
- git
|
||||||
|
- nautilus
|
||||||
|
- ssh
|
||||||
|
- tmux
|
||||||
|
- vim
|
||||||
|
- x2go
|
||||||
|
- zsh
|
||||||
|
|
||||||
|
# Root dotfile packages to deploy
|
||||||
|
dotfiles_root_packages:
|
||||||
|
- dnf
|
||||||
|
- sysconfig
|
||||||
|
- keyd
|
||||||
19
group_vars/workstation/dotfiles.yml
Normal file
19
group_vars/workstation/dotfiles.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
# Home dotfile packages to deploy
|
||||||
|
dotfiles_home_packages:
|
||||||
|
- aichat
|
||||||
|
- btrbk-ws
|
||||||
|
- env
|
||||||
|
- git
|
||||||
|
- nautilus
|
||||||
|
- ssh
|
||||||
|
- tmux
|
||||||
|
- vim
|
||||||
|
- x2go
|
||||||
|
- zsh
|
||||||
|
|
||||||
|
# Root dotfile packages to deploy
|
||||||
|
dotfiles_root_packages:
|
||||||
|
- dnf
|
||||||
|
- sysconfig
|
||||||
|
- pwrstatd
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
debug: false # set to true to print debug info
|
debug: false # set to true to print debug info
|
||||||
log_level: "info"
|
log_level: "info"
|
||||||
rebuild: true # rebuild images
|
|
||||||
quadlets_deploy_configs: true # deploy quadlet service configs
|
quadlets_deploy_configs: true # deploy quadlet service configs
|
||||||
|
|
||||||
maintainer: "Bryan C. Roessler"
|
maintainer: "Bryan C. Roessler"
|
||||||
@@ -12,8 +11,6 @@ alpine_mirror: "https://mirror.pilotfiber.com/alpinelinux"
|
|||||||
|
|
||||||
# Directories
|
# Directories
|
||||||
config_root: "{{ lookup('env', 'HOME') }}/.config"
|
config_root: "{{ lookup('env', 'HOME') }}/.config"
|
||||||
quadlet_root: "{{ lookup('env', 'HOME') }}/.config/containers/systemd"
|
|
||||||
backup_root: "{{ lookup('env', 'HOME') }}/.config/containers/systemd/backup"
|
|
||||||
download_root: "{{ lookup('env', 'HOME') }}/downloads"
|
download_root: "{{ lookup('env', 'HOME') }}/downloads"
|
||||||
monitor_root: "{{ lookup('env', 'HOME') }}/downloads"
|
monitor_root: "{{ lookup('env', 'HOME') }}/downloads"
|
||||||
media_root: "{{ lookup('env', 'HOME') }}/media"
|
media_root: "{{ lookup('env', 'HOME') }}/media"
|
||||||
@@ -33,350 +30,19 @@ podman_prune_images: true
|
|||||||
podman_pull_image: false
|
podman_pull_image: false
|
||||||
podman_continue_if_pull_fails: false
|
podman_continue_if_pull_fails: false
|
||||||
|
|
||||||
podman_quadlet_specs:
|
# Pod definitions
|
||||||
|
pods:
|
||||||
# Pods
|
|
||||||
- name: htpc
|
- name: htpc
|
||||||
type: pod
|
|
||||||
network: pasta
|
network: pasta
|
||||||
publish:
|
publish:
|
||||||
- "8080:80"
|
- "8080:80"
|
||||||
- "8443:443"
|
- "8443:443"
|
||||||
|
containers:
|
||||||
# Build images
|
- sabnzbd
|
||||||
- name: htpc_sabnzbd
|
- qbittorrent
|
||||||
type: build
|
- sonarr
|
||||||
image: localhost/htpc_sabnzbd:latest
|
- radarr
|
||||||
pull: missing
|
- lidarr
|
||||||
format: oci
|
- prowlarr
|
||||||
force_rm: true
|
- unpackerr
|
||||||
container_file: |
|
- traefik
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN \
|
|
||||||
rm -rf /etc/apk/repositories \
|
|
||||||
&& apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
python3 py3-pip git unzip ca-certificates par2cmdline 7zip \
|
|
||||||
&& apk add --no-cache --virtual=.build-deps \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
autoconf automake build-base openssl-dev libffi-dev python3-dev \
|
|
||||||
&& apk add --no-cache -X '{{ alpine_mirror }}/v3.14/main' unrar \
|
|
||||||
&& git clone --depth 1 --branch master https://github.com/sabnzbd/sabnzbd /app \
|
|
||||||
&& python3 -m venv /venv \
|
|
||||||
&& . /venv/bin/activate \
|
|
||||||
&& pip install --no-cache-dir -r /app/requirements.txt \
|
|
||||||
&& apk del --purge .build-deps
|
|
||||||
|
|
||||||
- name: htpc_qbittorrent
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_qbittorrent:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
qbittorrent-nox \
|
|
||||||
&& mkdir -p /app \
|
|
||||||
&& ln -s /usr/bin/qbittorrent-nox /app/qbittorrent-nox
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
- name: htpc_sonarr
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_sonarr:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
libintl sqlite-libs icu-libs curl jq \
|
|
||||||
&& url=$(curl -sL "https://api.github.com/repos/Sonarr/Sonarr/releases/latest" \
|
|
||||||
| jq -r '.assets[] | select(.name | test("linux-musl-x64.tar.gz$")) | .browser_download_url') \
|
|
||||||
&& curl -L -o /tmp/Sonarr.tar.gz "$url" \
|
|
||||||
&& mkdir -p /app && tar -xzf /tmp/Sonarr.tar.gz -C /app --strip-components=1
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
- name: htpc_radarr
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_radarr:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
|
|
||||||
&& url=$(curl -sL "https://api.github.com/repos/Radarr/Radarr/releases/latest" \
|
|
||||||
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
|
||||||
&& curl -L -o /tmp/radarr.tar.gz "$url" \
|
|
||||||
&& mkdir -p /app \
|
|
||||||
&& tar -xzf /tmp/radarr.tar.gz --strip-components=1 -C /app \
|
|
||||||
&& chmod +x /app/Radarr \
|
|
||||||
&& rm -rf /app/Radarr.Update
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
- name: htpc_lidarr
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_lidarr:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
|
|
||||||
&& url=$(curl -sL "https://api.github.com/repos/Lidarr/Lidarr/releases/latest" \
|
|
||||||
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
|
||||||
&& [ -n "$url" ] \
|
|
||||||
&& curl -L -o /tmp/Lidarr.tar.gz "$url" \
|
|
||||||
&& mkdir -p /app && tar -xzf /tmp/Lidarr.tar.gz --strip-components=1 -C /app \
|
|
||||||
&& chmod +x /app/Lidarr \
|
|
||||||
&& rm /tmp/Lidarr.tar.gz
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
- name: htpc_prowlarr
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_prowlarr:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
libintl icu-libs sqlite-libs curl jq \
|
|
||||||
&& url=$(curl -sL "https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest" \
|
|
||||||
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
|
||||||
&& [ -n "$url" ] \
|
|
||||||
&& curl -L -o /tmp/Prowlarr.tar.gz "$url" \
|
|
||||||
&& mkdir -p /app \
|
|
||||||
&& tar -xzf /tmp/Prowlarr.tar.gz -C /app --strip-components=1 \
|
|
||||||
&& rm /tmp/Prowlarr.tar.gz
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
- name: htpc_unpackerr
|
|
||||||
type: build
|
|
||||||
image: localhost/htpc_unpackerr:latest
|
|
||||||
pull: missing
|
|
||||||
format: oci
|
|
||||||
force_rm: true
|
|
||||||
container_file: |
|
|
||||||
FROM {{ alpine_base_image }}
|
|
||||||
LABEL maintainer="{{ maintainer }}"
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
|
||||||
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
|
||||||
curl tar jq \
|
|
||||||
&& url=$(curl -sL "https://api.github.com/repos/davidnewhall/Unpackerr/releases/latest" \
|
|
||||||
| jq -r '.assets[] | select(.name == "unpackerr.amd64.linux.gz") | .browser_download_url') \
|
|
||||||
&& [ -n "$url" ] \
|
|
||||||
&& curl -L -o /tmp/unpackerr.gz "$url" \
|
|
||||||
&& mkdir -p /app \
|
|
||||||
&& gunzip -c /tmp/unpackerr.gz > /app/unpackerr \
|
|
||||||
&& chmod +x /app/unpackerr \
|
|
||||||
&& rm /tmp/unpackerr.gz
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Containers
|
|
||||||
- name: htpc_traefik
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: docker.io/traefik:latest
|
|
||||||
pull: newer
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/traefik:/etc/traefik:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
command:
|
|
||||||
- "--api.dashboard=true"
|
|
||||||
- "--api.insecure=true"
|
|
||||||
- "--providers.file.directory=/etc/traefik/dynamic"
|
|
||||||
- "--providers.file.watch=true"
|
|
||||||
- "--entrypoints.web.address=:80"
|
|
||||||
- "--entrypoints.websecure.address=:443"
|
|
||||||
- "--entrypoints.websecure.http.tls.certFile=/etc/traefik/server.crt"
|
|
||||||
- "--entrypoints.websecure.http.tls.keyFile=/etc/traefik/server.key"
|
|
||||||
- "--log.level=INFO"
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_sabnzbd
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_sabnzbd:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/sabnzbd:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ monitor_root }}/nzbs:/nzbs:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
command:
|
|
||||||
- "/venv/bin/python"
|
|
||||||
- "-OO"
|
|
||||||
- "/app/SABnzbd.py"
|
|
||||||
- "--config-file=/config/sabnzbd.ini"
|
|
||||||
- "--browser=0"
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_qbittorrent
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_qbittorrent:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/qbittorrent:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ monitor_root }}/torrents:/torrents:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
command:
|
|
||||||
- "qbittorrent-nox"
|
|
||||||
- "--profile=/config"
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_sonarr
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_sonarr:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/sonarr:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ media_root }}/tv:/tv:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
SONARR__APP__LAUNCHBROWSER: false
|
|
||||||
SONARR__APP__INSTANCENAME: "{{ SONARR__APP__INSTANCENAME | default('Sonarr') }}"
|
|
||||||
SONARR__AUTH__METHOD: "{{ SONARR__AUTH__METHOD | default('Forms') }}"
|
|
||||||
SONARR__AUTH__APIKEY: "{{ SONARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
|
||||||
SONARR__SERVER__ENABLESSL: "{{ SONARR__SERVER__ENABLESSL | default(false) }}"
|
|
||||||
SONARR__SERVER__SSLPORT: "{{ SONARR__SERVER__SSLPORT | default('9898') }}"
|
|
||||||
SONARR__SERVER__PORT: "{{ SONARR__SERVER__PORT | default('8989') }}"
|
|
||||||
SONARR__SERVER__BINDADDRESS: "{{ SONARR__SERVER__BINDADDRESS | default('*') }}"
|
|
||||||
SONARR__SERVER__SSLCERTPATH: "{{ SONARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
|
|
||||||
SONARR__SERVER__SSLCERTPASSWORD: "{{ SONARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
|
|
||||||
SONARR__LOG__ANALYTICSENABLED: "{{ SONARR__LOG__ANALYTICSENABLED | default(false) }}"
|
|
||||||
SONARR__UPDATE__AUTOMATICALLY: "{{ SONARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
|
||||||
SONARR__LOG__LEVEL: "{{ SONARR__LOG__LEVEL | default('info') }}"
|
|
||||||
command: ["/app/Sonarr", "-data=/config"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_radarr
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_radarr:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/radarr:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ media_root }}/movies:/movies:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
RADARR__APP__LAUNCHBROWSER: false
|
|
||||||
RADARR__APP__INSTANCENAME: "{{ RADARR__APP__INSTANCENAME | default('Radarr') }}"
|
|
||||||
RADARR__AUTH__METHOD: "{{ RADARR__AUTH__METHOD | default('Forms') }}"
|
|
||||||
RADARR__AUTH__APIKEY: "{{ RADARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
|
||||||
RADARR__AUTH__ENABLED: "{{ RADARR__AUTH__ENABLED | default(true) }}"
|
|
||||||
RADARR__AUTH__REQUIRED: "{{ RADARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
|
||||||
RADARR__SERVER__ENABLESSL: "{{ RADARR__SERVER__ENABLESSL | default(false) }}"
|
|
||||||
RADARR__SERVER__PORT: "{{ RADARR__SERVER__PORT | default('7878') }}"
|
|
||||||
RADARR__SERVER__BINDADDRESS: "{{ RADARR__SERVER__BINDADDRESS | default('*') }}"
|
|
||||||
RADARR__LOG__ANALYTICSENABLED: "{{ RADARR__LOG__ANALYTICSENABLED | default(false) }}"
|
|
||||||
RADARR__LOG__LEVEL: "{{ RADARR__LOG__LEVEL | default('info') }}"
|
|
||||||
RADARR__UPDATE__AUTOMATICALLY: "{{ RADARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
|
||||||
command: ["/app/Radarr", "--nobrowser", "--data=/config"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_lidarr
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_lidarr:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/lidarr:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ media_root }}/music:/music:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
LIDARR__APP__LAUNCHBROWSER: false
|
|
||||||
LIDARR__APP__INSTANCENAME: "{{ LIDARR__APP__INSTANCENAME | default('Lidarr') }}"
|
|
||||||
LIDARR__AUTH__METHOD: "{{ LIDARR__AUTH__METHOD | default('Forms') }}"
|
|
||||||
LIDARR__AUTH__APIKEY: "{{ LIDARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
|
||||||
LIDARR__AUTH__ENABLED: "{{ LIDARR__AUTH__ENABLED | default(true) }}"
|
|
||||||
LIDARR__AUTH__REQUIRED: "{{ LIDARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
|
||||||
LIDARR__SERVER__ENABLESSL: "{{ LIDARR__SERVER__ENABLESSL | default(false) }}"
|
|
||||||
LIDARR__SERVER__PORT: "{{ LIDARR__SERVER__PORT | default('8686') }}"
|
|
||||||
LIDARR__SERVER__SSLPORT: "{{ LIDARR__SERVER__SSLPORT | default('6868') }}"
|
|
||||||
LIDARR__SERVER__BINDADDRESS: "{{ LIDARR__SERVER__BINDADDRESS | default('*') }}"
|
|
||||||
LIDARR__SERVER__SSLCERTPATH: "{{ LIDARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
|
|
||||||
LIDARR__SERVER__SSLCERTPASSWORD: "{{ LIDARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
|
|
||||||
LIDARR__LOG__ANALYTICSENABLED: "{{ LIDARR__LOG__ANALYTICSENABLED | default(false) }}"
|
|
||||||
LIDARR__LOG__LEVEL: "{{ LIDARR__LOG__LEVEL | default('info') }}"
|
|
||||||
LIDARR__UPDATE__AUTOMATICALLY: "{{ LIDARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
|
||||||
command: ["/app/Lidarr", "-nobrowser", "--data=/config"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_lazylibrarian
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_lazylibrarian:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/lazylibrarian:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
- "{{ media_root }}/ebooks:/ebooks:Z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
command: ["/venv/bin/python", "/app/LazyLibrarian.py", "--nolaunch", "--port", "{{ lazylibrarian_port | default('5299') }}", "--datadir=/config"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_prowlarr
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_prowlarr:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/prowlarr:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
PROWLARR__APP__LAUNCHBROWSER: false
|
|
||||||
PROWLARR__APP__INSTANCENAME: "{{ PROWLARR__APP__INSTANCENAME | default('Prowlarr') }}"
|
|
||||||
PROWLARR__AUTH__METHOD: "{{ PROWLARR__AUTH__METHOD | default('Forms') }}"
|
|
||||||
PROWLARR__AUTH__REQUIRED: "{{ PROWLARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
|
||||||
PROWLARR__AUTH__APIKEY: "{{ PROWLARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
|
||||||
PROWLARR__SERVER__ENABLESSL: "{{ PROWLARR__SERVER__ENABLESSL | default(false) }}"
|
|
||||||
PROWLARR__SERVER__SSLPORT: "{{ PROWLARR__SERVER__PORT | default('6969') }}"
|
|
||||||
PROWLARR__SERVER__PORT: "{{ PROWLARR__SERVER__PORT | default('9696') }}"
|
|
||||||
PROWLARR__SERVER__BINDADDRESS: "{{ PROWLARR__SERVER__BINDADDRESS | default('*') }}"
|
|
||||||
PROWLARR__LOG__ANALYTICSENABLED: "{{ PROWLARR__LOG__ANALYTICSENABLED | default(false) }}"
|
|
||||||
PROWLARR__LOG__LEVEL: "{{ PROWLARR__LOG__LEVEL | default('info') }}"
|
|
||||||
PROWLARR__UPDATE__AUTOMATICALLY: "{{ PROWLARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
|
||||||
command: ["/app/Prowlarr", "--nobrowser", "--data=/config"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|
||||||
- name: htpc_unpackerr
|
|
||||||
type: container
|
|
||||||
pod: htpc
|
|
||||||
image: localhost/htpc_unpackerr:latest
|
|
||||||
volumes:
|
|
||||||
- "{{ config_root }}/unpackerr:/config:Z"
|
|
||||||
- "{{ download_root }}/htpc:/downloads:z"
|
|
||||||
env:
|
|
||||||
TZ: "{{ tz }}"
|
|
||||||
UNPACKERR__LOG__ANALYTICSENABLED: "{{ UNPACKERR__LOG__ANALYTICSENABLED | default(false) }}"
|
|
||||||
UNPACKERR__UPDATE__AUTOMATICALLY: "{{ UNPACKERR__UPDATE__AUTOMATICALLY | default(false) }}"
|
|
||||||
UNPACKERR__LOG__LEVEL: "{{ UNPACKERR__LOG__LEVEL | default('info') }}"
|
|
||||||
command: ["/app/unpackerr"]
|
|
||||||
restart_policy: on-failure
|
|
||||||
|
|||||||
@@ -9,11 +9,9 @@
|
|||||||
- name: "Build file lists for {{ var_prefix }}"
|
- name: "Build file lists for {{ var_prefix }}"
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
"{{ var_prefix }}_files": "{{ lookup('community.general.filetree',
|
"{{ var_prefix }}_files": "{{ lookup('community.general.filetree',
|
||||||
role_path ~ '/common/' ~ (subdir | default('')),
|
role_path ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | rejectattr('path', 'match', '.*\\.j2$') | list }}"
|
||||||
role_path ~ '/' ~ group_names[0] ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | rejectattr('path', 'match', '.*\\.j2$') | list }}"
|
|
||||||
"{{ var_prefix }}_templates": "{{ lookup('community.general.filetree',
|
"{{ var_prefix }}_templates": "{{ lookup('community.general.filetree',
|
||||||
role_path ~ '/common/' ~ (subdir | default('')),
|
role_path ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | selectattr('path', 'match', '.*\\.j2$') | list }}"
|
||||||
role_path ~ '/' ~ group_names[0] ~ '/' ~ (subdir | default(''))) | selectattr('state', 'equalto', 'file') | selectattr('path', 'match', '.*\\.j2$') | list }}"
|
|
||||||
|
|
||||||
- name: "Ensure directories exist for {{ var_prefix }}"
|
- name: "Ensure directories exist for {{ var_prefix }}"
|
||||||
ansible.builtin.file:
|
ansible.builtin.file:
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
---
|
---
|
||||||
- name: Deploy home dotfiles
|
- name: Deploy selected home dotfile packages
|
||||||
ansible.builtin.include_tasks: ../../deploy_files.yml
|
ansible.builtin.include_tasks: ../../deploy_files.yml
|
||||||
vars:
|
vars:
|
||||||
var_prefix: dotfiles_home
|
var_prefix: dotfiles_home
|
||||||
subdir: home
|
subdir: "home/{{ item }}"
|
||||||
target_root: "{{ ansible_facts.env.HOME }}"
|
target_root: "{{ ansible_facts.env.HOME }}"
|
||||||
use_symlinks: true
|
use_symlinks: true
|
||||||
become_root: false
|
become_root: false
|
||||||
|
loop: "{{ dotfiles_home_packages | default([]) }}"
|
||||||
|
|
||||||
- name: Deploy root dotfiles
|
- name: Deploy selected root dotfile packages
|
||||||
ansible.builtin.include_tasks: ../../deploy_files.yml
|
ansible.builtin.include_tasks: ../../deploy_files.yml
|
||||||
vars:
|
vars:
|
||||||
var_prefix: dotfiles_root
|
var_prefix: dotfiles_root
|
||||||
subdir: root
|
subdir: "root/{{ item }}"
|
||||||
target_root: "/"
|
target_root: "/"
|
||||||
use_symlinks: true
|
use_symlinks: true
|
||||||
become_root: true
|
become_root: true
|
||||||
|
loop: "{{ dotfiles_root_packages | default([]) }}"
|
||||||
|
|||||||
0
roles/quadlets/README.md
Normal file
0
roles/quadlets/README.md
Normal file
129
roles/quadlets/lazylibrarian/config.ini.j2
Normal file
129
roles/quadlets/lazylibrarian/config.ini.j2
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
[GENERAL]
|
||||||
|
homepage = eBooks
|
||||||
|
auth_type = FORM
|
||||||
|
displaylength = -1
|
||||||
|
series_tab = False
|
||||||
|
config_tab_num = 2
|
||||||
|
toggles = False
|
||||||
|
launch_browser = False
|
||||||
|
imp_preflang = en, en-GB, en-US, eng, English, Unknown
|
||||||
|
date_lang = en_GB.UTF-8
|
||||||
|
destination_copy = True
|
||||||
|
ebook_dir = {{ lazylibrarian_ebook_dir | default('/ebooks') }}
|
||||||
|
download_dir = {{ lazylibrarian_download_dir | default('/downloads/complete/lazylibrarian') }}
|
||||||
|
ebook_type = epub, mobi, pdf, azw3
|
||||||
|
audiobook_type = mp3, m4b, opus, ogg
|
||||||
|
|
||||||
|
[API]
|
||||||
|
api_enabled = True
|
||||||
|
api_key = {{ lazylibrarian_api_key }}
|
||||||
|
api_ro_key = {{ lazylibrarian_api_ro_key }}
|
||||||
|
book_api = GoodReads
|
||||||
|
ol_api = True
|
||||||
|
gb_api = {{ lazylibrarian_gb_api | default('') }}
|
||||||
|
gb_country = US
|
||||||
|
|
||||||
|
[WEBSERVER]
|
||||||
|
http_user = {{ lazylibrarian_http_user | default('lazylibrarianuser') }}
|
||||||
|
http_pass = {{ lazylibrarian_http_pass }}
|
||||||
|
|
||||||
|
[LOGGING]
|
||||||
|
logdir = {{ lazylibrarian_logdir | default('/config/Logs') }}
|
||||||
|
detaileduilog = True
|
||||||
|
|
||||||
|
[IMPORTER]
|
||||||
|
multi_source = True
|
||||||
|
|
||||||
|
[TELEMETRY]
|
||||||
|
server_id = {{ lazylibrarian_server_id | default('') }}
|
||||||
|
|
||||||
|
[SABNZBD]
|
||||||
|
sab_host = {{ lazylibrarian_sab_host | default('localhost') }}
|
||||||
|
sab_port = {{ lazylibrarian_sab_port | default(8082) }}
|
||||||
|
sab_user = {{ sabnzbd_username | default('sabnzbduser') }}
|
||||||
|
sab_pass = {{ sabnzbd_password }}
|
||||||
|
sab_api = {{ sabnzbd_api_key }}
|
||||||
|
sab_cat = {{ lazylibrarian_sab_cat | default('lazylibrarian') }}
|
||||||
|
|
||||||
|
[USENET]
|
||||||
|
nzb_downloader_sabnzbd = True
|
||||||
|
|
||||||
|
[TORRENT]
|
||||||
|
tor_downloader_qbittorrent = True
|
||||||
|
seed_wait = False
|
||||||
|
|
||||||
|
[QBITTORRENT]
|
||||||
|
qbittorrent_host = {{ lazylibrarian_qbit_host | default('localhost') }}
|
||||||
|
qbittorrent_port = {{ lazylibrarian_qbit_port | default(8082) }}
|
||||||
|
qbittorrent_user = {{ qbittorrent_username | default('qbittorrentuser') }}
|
||||||
|
qbittorrent_pass = {{ qbittorrent_password }}
|
||||||
|
qbittorrent_label = {{ lazylibrarian_qbit_label | default('lazylibrarian') }}
|
||||||
|
|
||||||
|
[ANNA]
|
||||||
|
anna_key = {{ lazylibrarian_anna_key }}
|
||||||
|
anna = True
|
||||||
|
|
||||||
|
[POSTPROCESS]
|
||||||
|
ebook_dest_folder = $Author/$Title $$
|
||||||
|
audiobook_dest_folder = $Author/$Title
|
||||||
|
del_downloadfailed = True
|
||||||
|
|
||||||
|
[MAGAZINES]
|
||||||
|
mag_tab = False
|
||||||
|
|
||||||
|
[PROWL]
|
||||||
|
prowl_priority = -2
|
||||||
|
|
||||||
|
[PREPROCESS]
|
||||||
|
ebook_wanted_formats = azw3, mobi, epub
|
||||||
|
|
||||||
|
{% for indexer in lazylibrarian_newznab_indexers | default([]) %}
|
||||||
|
[Newznab_{{ loop.index0 }}]
|
||||||
|
dispname = {{ indexer.name }}
|
||||||
|
enabled = {{ indexer.enabled | default(True) | string }}
|
||||||
|
host = {{ indexer.host }}
|
||||||
|
api = {{ indexer.api }}
|
||||||
|
generalsearch = search
|
||||||
|
bookcat = {{ indexer.bookcat | default('7020') }}
|
||||||
|
{% if indexer.magcat is defined %}
|
||||||
|
magcat = {{ indexer.magcat }}
|
||||||
|
{% endif %}
|
||||||
|
{% if indexer.comiccat is defined %}
|
||||||
|
comiccat = {{ indexer.comiccat }}
|
||||||
|
{% endif %}
|
||||||
|
updated = {{ indexer.updated | default('2026-01-27') }}
|
||||||
|
dlpriority = {{ indexer.dlpriority | default(26) }}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% for indexer in lazylibrarian_torznab_indexers | default([]) %}
|
||||||
|
[Torznab_{{ loop.index0 }}]
|
||||||
|
dispname = {{ indexer.name }}
|
||||||
|
enabled = {{ indexer.enabled | default(True) | string }}
|
||||||
|
host = {{ indexer.host }}
|
||||||
|
api = {{ indexer.api }}
|
||||||
|
generalsearch = search
|
||||||
|
{% if indexer.bookcat is defined %}
|
||||||
|
bookcat = {{ indexer.bookcat }}
|
||||||
|
{% endif %}
|
||||||
|
{% if indexer.magcat is defined %}
|
||||||
|
magcat = {{ indexer.magcat }}
|
||||||
|
{% endif %}
|
||||||
|
{% if indexer.comiccat is defined %}
|
||||||
|
comiccat = {{ indexer.comiccat }}
|
||||||
|
{% endif %}
|
||||||
|
updated = {{ indexer.updated | default('2026-01-27') }}
|
||||||
|
dlpriority = {{ indexer.dlpriority | default(26) }}
|
||||||
|
seeders = {{ indexer.seeders | default(1) }}
|
||||||
|
{% if indexer.seed_ratio is defined %}
|
||||||
|
seed_ratio = {{ indexer.seed_ratio }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% for indexer in lazylibrarian_generic_indexers | default([]) %}
|
||||||
|
[GEN_{{ loop.index0 }}]
|
||||||
|
dispname = {{ indexer.name }}
|
||||||
|
enabled = {{ indexer.enabled | default(True) | string }}
|
||||||
|
host = {{ indexer.host }}
|
||||||
|
search = {{ indexer.search }}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
11
roles/quadlets/lazylibrarian/quadlets.yml
Normal file
11
roles/quadlets/lazylibrarian/quadlets.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
- name: lazylibrarian
|
||||||
|
type: container
|
||||||
|
image: localhost/lazylibrarian:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/lazylibrarian:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ media_root }}/ebooks:/ebooks:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
command: ["/venv/bin/python", "/app/LazyLibrarian.py", "--nolaunch", "--port", "{{ lazylibrarian_port | default('5299') }}", "--datadir=/config"]
|
||||||
|
restart_policy: on-failure
|
||||||
48
roles/quadlets/lidarr/quadlets.yml
Normal file
48
roles/quadlets/lidarr/quadlets.yml
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
- name: lidarr
|
||||||
|
type: build
|
||||||
|
image: localhost/lidarr:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
|
||||||
|
&& url=$(curl -sL "https://api.github.com/repos/Lidarr/Lidarr/releases/latest" \
|
||||||
|
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
||||||
|
&& [ -n "$url" ] \
|
||||||
|
&& curl -L -o /tmp/Lidarr.tar.gz "$url" \
|
||||||
|
&& mkdir -p /app && tar -xzf /tmp/Lidarr.tar.gz --strip-components=1 -C /app \
|
||||||
|
&& chmod +x /app/Lidarr \
|
||||||
|
&& rm /tmp/Lidarr.tar.gz
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: lidarr
|
||||||
|
type: container
|
||||||
|
image: localhost/lidarr:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/lidarr:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ media_root }}/music:/music:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
LIDARR__APP__LAUNCHBROWSER: false
|
||||||
|
LIDARR__APP__INSTANCENAME: "{{ LIDARR__APP__INSTANCENAME | default('Lidarr') }}"
|
||||||
|
LIDARR__AUTH__METHOD: "{{ LIDARR__AUTH__METHOD | default('Forms') }}"
|
||||||
|
LIDARR__AUTH__APIKEY: "{{ LIDARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
||||||
|
LIDARR__AUTH__ENABLED: "{{ LIDARR__AUTH__ENABLED | default(true) }}"
|
||||||
|
LIDARR__AUTH__REQUIRED: "{{ LIDARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
||||||
|
LIDARR__SERVER__ENABLESSL: "{{ LIDARR__SERVER__ENABLESSL | default(false) }}"
|
||||||
|
LIDARR__SERVER__PORT: "{{ LIDARR__SERVER__PORT | default('8686') }}"
|
||||||
|
LIDARR__SERVER__SSLPORT: "{{ LIDARR__SERVER__SSLPORT | default('6868') }}"
|
||||||
|
LIDARR__SERVER__BINDADDRESS: "{{ LIDARR__SERVER__BINDADDRESS | default('*') }}"
|
||||||
|
LIDARR__SERVER__SSLCERTPATH: "{{ LIDARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
|
||||||
|
LIDARR__SERVER__SSLCERTPASSWORD: "{{ LIDARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
|
||||||
|
LIDARR__LOG__ANALYTICSENABLED: "{{ LIDARR__LOG__ANALYTICSENABLED | default(false) }}"
|
||||||
|
LIDARR__LOG__LEVEL: "{{ LIDARR__LOG__LEVEL | default('info') }}"
|
||||||
|
LIDARR__UPDATE__AUTOMATICALLY: "{{ LIDARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
||||||
|
command: ["/app/Lidarr", "-nobrowser", "--data=/config"]
|
||||||
|
restart_policy: on-failure
|
||||||
44
roles/quadlets/prowlarr/quadlets.yml
Normal file
44
roles/quadlets/prowlarr/quadlets.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
- name: prowlarr
|
||||||
|
type: build
|
||||||
|
image: localhost/prowlarr:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
libintl icu-libs sqlite-libs curl jq \
|
||||||
|
&& url=$(curl -sL "https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest" \
|
||||||
|
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
||||||
|
&& [ -n "$url" ] \
|
||||||
|
&& curl -L -o /tmp/Prowlarr.tar.gz "$url" \
|
||||||
|
&& mkdir -p /app \
|
||||||
|
&& tar -xzf /tmp/Prowlarr.tar.gz -C /app --strip-components=1 \
|
||||||
|
&& rm /tmp/Prowlarr.tar.gz
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: prowlarr
|
||||||
|
type: container
|
||||||
|
image: localhost/prowlarr:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/prowlarr:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
PROWLARR__APP__LAUNCHBROWSER: false
|
||||||
|
PROWLARR__APP__INSTANCENAME: "{{ PROWLARR__APP__INSTANCENAME | default('Prowlarr') }}"
|
||||||
|
PROWLARR__AUTH__METHOD: "{{ PROWLARR__AUTH__METHOD | default('Forms') }}"
|
||||||
|
PROWLARR__AUTH__REQUIRED: "{{ PROWLARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
||||||
|
PROWLARR__AUTH__APIKEY: "{{ PROWLARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
||||||
|
PROWLARR__SERVER__ENABLESSL: "{{ PROWLARR__SERVER__ENABLESSL | default(false) }}"
|
||||||
|
PROWLARR__SERVER__SSLPORT: "{{ PROWLARR__SERVER__PORT | default('6969') }}"
|
||||||
|
PROWLARR__SERVER__PORT: "{{ PROWLARR__SERVER__PORT | default('9696') }}"
|
||||||
|
PROWLARR__SERVER__BINDADDRESS: "{{ PROWLARR__SERVER__BINDADDRESS | default('*') }}"
|
||||||
|
PROWLARR__LOG__ANALYTICSENABLED: "{{ PROWLARR__LOG__ANALYTICSENABLED | default(false) }}"
|
||||||
|
PROWLARR__LOG__LEVEL: "{{ PROWLARR__LOG__LEVEL | default('info') }}"
|
||||||
|
PROWLARR__UPDATE__AUTOMATICALLY: "{{ PROWLARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
||||||
|
command: ["/app/Prowlarr", "--nobrowser", "--data=/config"]
|
||||||
|
restart_policy: on-failure
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
[Application]
|
||||||
|
FileLogger\Age=1
|
||||||
|
FileLogger\AgeType=1
|
||||||
|
FileLogger\Backup=true
|
||||||
|
FileLogger\DeleteOld=true
|
||||||
|
FileLogger\Enabled=false
|
||||||
|
FileLogger\MaxSizeBytes=66560
|
||||||
|
FileLogger\Path=/config/qBittorrent/data/logs
|
||||||
|
MemoryWorkingSetLimit=2048
|
||||||
|
|
||||||
|
[AutoRun]
|
||||||
|
OnTorrentAdded\Enabled=false
|
||||||
|
OnTorrentAdded\Program=
|
||||||
|
enabled=false
|
||||||
|
program=
|
||||||
|
|
||||||
|
[BitTorrent]
|
||||||
|
MergeTrackersEnabled={{ qbittorrent_merge_trackers | default(false) | lower }}
|
||||||
|
Session\AddExtensionToIncompleteFiles=true
|
||||||
|
Session\AddTorrentStopped=false
|
||||||
|
Session\AddTrackersEnabled={{ qbittorrent_add_trackers | default(false) | lower }}
|
||||||
|
Session\AdditionalTrackers={{ qbittorrent_additional_trackers | default('') }}
|
||||||
|
Session\AlternativeGlobalDLSpeedLimit={{ qbittorrent_alt_dl_limit | default(0) }}
|
||||||
|
Session\AlternativeGlobalUPSpeedLimit={{ qbittorrent_alt_up_limit | default(0) }}
|
||||||
|
Session\AnonymousModeEnabled={{ qbittorrent_anonymous_mode | default(true) | lower }}
|
||||||
|
Session\DefaultSavePath={{ qbittorrent_complete_dir | default('/downloads/complete') }}
|
||||||
|
Session\DisableAutoTMMByDefault=false
|
||||||
|
Session\DisableAutoTMMTriggers\CategorySavePathChanged=false
|
||||||
|
Session\DisableAutoTMMTriggers\DefaultSavePathChanged=false
|
||||||
|
Session\ExcludedFileNames=
|
||||||
|
Session\GlobalDLSpeedLimit={{ qbittorrent_dl_limit | default(0) }}
|
||||||
|
Session\GlobalMaxRatio={{ qbittorrent_max_ratio | default(1) }}
|
||||||
|
Session\GlobalMaxSeedingMinutes={{ qbittorrent_max_seed_minutes | default(0) }}
|
||||||
|
Session\GlobalUPSpeedLimit={{ qbittorrent_ul_limit | default(300) }}
|
||||||
|
Session\IgnoreLimitsOnLAN=true
|
||||||
|
Session\IgnoreSlowTorrentsForQueueing=true
|
||||||
|
Session\MaxActiveDownloads={{ qbittorrent_max_active_downloads | default(0) }}
|
||||||
|
Session\MaxActiveTorrents={{ qbittorrent_max_active_torrents | default(0) }}
|
||||||
|
Session\Port={{ qbittorrent_session_port | default(48442) }}
|
||||||
|
Session\QueueingSystemEnabled={{ qbittorrent_queueing_enabled | default(false) | lower }}
|
||||||
|
Session\SSL\Port={{ qbittorrent_ssl_port | default('11192') }}
|
||||||
|
Session\ShareLimitAction={{ qbittorrent_share_limit_action | default('Stop') }}
|
||||||
|
Session\TempPath={{ qbittorrent_temp_dir | default('/downloads/incomplete/qbittorrent') }}
|
||||||
|
Session\TempPathEnabled=true
|
||||||
|
Session\UseAlternativeGlobalSpeedLimit=true
|
||||||
|
|
||||||
|
[Core]
|
||||||
|
AutoDeleteAddedTorrentFile=IfAdded
|
||||||
|
|
||||||
|
[LegalNotice]
|
||||||
|
Accepted=true
|
||||||
|
|
||||||
|
[Meta]
|
||||||
|
MigrationVersion=8
|
||||||
|
|
||||||
|
[Network]
|
||||||
|
Cookies=@Invalid()
|
||||||
|
Proxy\HostnameLookupEnabled=false
|
||||||
|
Proxy\Profiles\BitTorrent=true
|
||||||
|
Proxy\Profiles\Misc=true
|
||||||
|
Proxy\Profiles\RSS=true
|
||||||
|
|
||||||
|
[Preferences]
|
||||||
|
Advanced\AnonymousMode={{ qbittorrent_anonymous_mode | default(true) | lower }}
|
||||||
|
Advanced\RecheckOnCompletion={{ qbittorrent_recheck_on_completion | default(false) | lower }}
|
||||||
|
Advanced\trackerPort={{ qbittorrent_tracker_port | default(9000) }}
|
||||||
|
Advanced\trackerPortForwarding=false
|
||||||
|
Bittorrent\MaxRatio={{ qbittorrent_max_ratio | default(1) }}
|
||||||
|
Connection\GlobalDLLimitAlt={{ qbittorrent_global_dl_limit_alt | default(0) }}
|
||||||
|
Connection\GlobalUPLimitAlt={{ qbittorrent_global_up_limit_alt | default(0) }}
|
||||||
|
Connection\PortRangeMin={{ qbittorrent_port_range_min | default(48442) }}
|
||||||
|
Connection\ResolvePeerCountries=true
|
||||||
|
Downloads\SavePath={{ qbittorrent_complete_dir | default('/downloads/complete') }}
|
||||||
|
Downloads\ScanDirsLastPath={{ qbittorrent_scan_dir | default('/torrents') }}
|
||||||
|
Downloads\ScanDirsV2=@Variant(\0\0\0\x1c\0\0\0\0)
|
||||||
|
Downloads\TempPath={{ qbittorrent_temp_dir | default('/downloads/incomplete/qbittorrent') }}
|
||||||
|
Downloads\TempPathEnabled=true
|
||||||
|
Downloads\UseIncompleteExtension=true
|
||||||
|
DynDNS\DomainName=changeme.dyndns.org
|
||||||
|
DynDNS\Enabled=false
|
||||||
|
DynDNS\Password=
|
||||||
|
DynDNS\Service=DynDNS
|
||||||
|
DynDNS\Username=
|
||||||
|
General\Locale={{ qbittorrent_locale | default('en') }}
|
||||||
|
MailNotification\email=
|
||||||
|
MailNotification\enabled=false
|
||||||
|
MailNotification\password=
|
||||||
|
MailNotification\req_auth=true
|
||||||
|
MailNotification\req_ssl=false
|
||||||
|
MailNotification\sender=qBittorrent_notification@example.com
|
||||||
|
MailNotification\smtp_server=smtp.changeme.com
|
||||||
|
MailNotification\username=
|
||||||
|
Queueing\IgnoreSlowTorrents=true
|
||||||
|
Queueing\MaxActiveDownloads={{ qbittorrent_max_active_downloads | default(20) }}
|
||||||
|
Queueing\MaxActiveTorrents={{ qbittorrent_max_active_torrents | default(20) }}
|
||||||
|
Queueing\QueueingEnabled=true
|
||||||
|
WebUI\Address={{ qbittorrent_host | default('') }}
|
||||||
|
WebUI\AlternativeUIEnabled=false
|
||||||
|
WebUI\AuthSubnetWhitelist={{ qbittorrent_subnet_whitelist | default('') }}
|
||||||
|
WebUI\AuthSubnetWhitelistEnabled=true
|
||||||
|
WebUI\BanDuration=3600
|
||||||
|
WebUI\CSRFProtection=true
|
||||||
|
WebUI\ClickjackingProtection=true
|
||||||
|
WebUI\CustomHTTPHeaders=
|
||||||
|
WebUI\CustomHTTPHeadersEnabled=false
|
||||||
|
WebUI\Enabled=true
|
||||||
|
WebUI\HTTPS\CertificatePath={{ qbittorrent_https_cert | default('/config/qBittorrent/config/ssl/server.crt') }}
|
||||||
|
WebUI\HTTPS\Enabled={{ qbittorrent_enable_https | default(false) | lower }}
|
||||||
|
WebUI\HTTPS\KeyPath={{ qbittorrent_https_key | default('/config/qBittorrent/config/ssl/server.key') }}
|
||||||
|
WebUI\HostHeaderValidation=false
|
||||||
|
WebUI\LocalHostAuth=false
|
||||||
|
WebUI\MaxAuthenticationFailCount=5
|
||||||
|
WebUI\Password_PBKDF2="{{ qbittorrent_password_pbkdf2 | default('') }}"
|
||||||
|
WebUI\Password_ha1={{ qbittorrent_password_ha1 | default('') }}
|
||||||
|
WebUI\Port={{ qbittorrent_ui_port | default(8082) }}
|
||||||
|
WebUI\ReverseProxySupportEnabled=false
|
||||||
|
WebUI\RootFolder=
|
||||||
|
WebUI\SecureCookie=true
|
||||||
|
WebUI\ServerDomains={{ qbittorrent_server_domains | default('*') }}
|
||||||
|
WebUI\SessionTimeout=3600
|
||||||
|
WebUI\TrustedReverseProxiesList=
|
||||||
|
WebUI\UseUPnP=true
|
||||||
|
WebUI\Username={{ qbittorrent_username | default('qbittorrentuser') }}
|
||||||
|
|
||||||
|
[RSS]
|
||||||
|
AutoDownloader\DownloadRepacks={{ qbittorrent_download_repacks | default(true) | lower }}
|
||||||
|
AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"
|
||||||
30
roles/quadlets/qbittorrent/quadlets.yml
Normal file
30
roles/quadlets/qbittorrent/quadlets.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
- name: qbittorrent
|
||||||
|
type: build
|
||||||
|
image: localhost/qbittorrent:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
qbittorrent-nox \
|
||||||
|
&& mkdir -p /app \
|
||||||
|
&& ln -s /usr/bin/qbittorrent-nox /app/qbittorrent-nox
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: qbittorrent
|
||||||
|
type: container
|
||||||
|
image: localhost/qbittorrent:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/qbittorrent:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ monitor_root }}/torrents:/torrents:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
command:
|
||||||
|
- "qbittorrent-nox"
|
||||||
|
- "--profile=/config"
|
||||||
|
restart_policy: on-failure
|
||||||
46
roles/quadlets/radarr/quadlets.yml
Normal file
46
roles/quadlets/radarr/quadlets.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
- name: radarr
|
||||||
|
type: build
|
||||||
|
image: localhost/radarr:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
icu-libs libintl sqlite-libs curl libmediainfo xmlstarlet jq \
|
||||||
|
&& url=$(curl -sL "https://api.github.com/repos/Radarr/Radarr/releases/latest" \
|
||||||
|
| jq -r '.assets[] | select(.name | test("linux-musl-core-x64.tar.gz$")) | .browser_download_url') \
|
||||||
|
&& curl -L -o /tmp/radarr.tar.gz "$url" \
|
||||||
|
&& mkdir -p /app \
|
||||||
|
&& tar -xzf /tmp/radarr.tar.gz --strip-components=1 -C /app \
|
||||||
|
&& chmod +x /app/Radarr \
|
||||||
|
&& rm -rf /app/Radarr.Update
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: radarr
|
||||||
|
type: container
|
||||||
|
image: localhost/radarr:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/radarr:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ media_root }}/movies:/movies:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
RADARR__APP__LAUNCHBROWSER: false
|
||||||
|
RADARR__APP__INSTANCENAME: "{{ RADARR__APP__INSTANCENAME | default('Radarr') }}"
|
||||||
|
RADARR__AUTH__METHOD: "{{ RADARR__AUTH__METHOD | default('Forms') }}"
|
||||||
|
RADARR__AUTH__APIKEY: "{{ RADARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
||||||
|
RADARR__AUTH__ENABLED: "{{ RADARR__AUTH__ENABLED | default(true) }}"
|
||||||
|
RADARR__AUTH__REQUIRED: "{{ RADARR__AUTH__REQUIRED | default('DisabledForLocalAddresses') }}"
|
||||||
|
RADARR__SERVER__ENABLESSL: "{{ RADARR__SERVER__ENABLESSL | default(false) }}"
|
||||||
|
RADARR__SERVER__PORT: "{{ RADARR__SERVER__PORT | default('7878') }}"
|
||||||
|
RADARR__SERVER__BINDADDRESS: "{{ RADARR__SERVER__BINDADDRESS | default('*') }}"
|
||||||
|
RADARR__LOG__ANALYTICSENABLED: "{{ RADARR__LOG__ANALYTICSENABLED | default(false) }}"
|
||||||
|
RADARR__LOG__LEVEL: "{{ RADARR__LOG__LEVEL | default('info') }}"
|
||||||
|
RADARR__UPDATE__AUTOMATICALLY: "{{ RADARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
||||||
|
command: ["/app/Radarr", "--nobrowser", "--data=/config"]
|
||||||
|
restart_policy: on-failure
|
||||||
42
roles/quadlets/sabnzbd/quadlets.yml
Normal file
42
roles/quadlets/sabnzbd/quadlets.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
- name: sabnzbd
|
||||||
|
type: build
|
||||||
|
image: localhost/sabnzbd:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN \
|
||||||
|
rm -rf /etc/apk/repositories \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
python3 py3-pip git unzip ca-certificates par2cmdline 7zip \
|
||||||
|
&& apk add --no-cache --virtual=.build-deps \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
autoconf automake build-base openssl-dev libffi-dev python3-dev \
|
||||||
|
&& apk add --no-cache -X '{{ alpine_mirror }}/v3.14/main' unrar \
|
||||||
|
&& git clone --depth 1 --branch master https://github.com/sabnzbd/sabnzbd /app \
|
||||||
|
&& python3 -m venv /venv \
|
||||||
|
&& . /venv/bin/activate \
|
||||||
|
&& pip install --no-cache-dir -r /app/requirements.txt \
|
||||||
|
&& apk del --purge .build-deps
|
||||||
|
|
||||||
|
- name: sabnzbd
|
||||||
|
type: container
|
||||||
|
image: localhost/sabnzbd:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/sabnzbd:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ monitor_root }}/nzbs:/nzbs:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
command:
|
||||||
|
- "/venv/bin/python"
|
||||||
|
- "-OO"
|
||||||
|
- "/app/SABnzbd.py"
|
||||||
|
- "--config-file=/config/sabnzbd.ini"
|
||||||
|
- "--browser=0"
|
||||||
|
restart_policy: on-failure
|
||||||
477
roles/quadlets/sabnzbd/sabnzbd.ini.j2
Normal file
477
roles/quadlets/sabnzbd/sabnzbd.ini.j2
Normal file
@@ -0,0 +1,477 @@
|
|||||||
|
__version__ = 19
|
||||||
|
__encoding__ = utf-8
|
||||||
|
|
||||||
|
[misc]
|
||||||
|
username = {{ sabnzbd_username | default("admin") }}
|
||||||
|
password = {{ sabnzbd_password | default("admin") }}
|
||||||
|
host = {{ sabnzbd_host | default("::") }}
|
||||||
|
port = {{ sabnzbd_http_port | default("8081") }}
|
||||||
|
api_key = {{ sabnzbd_api_key }}
|
||||||
|
nzb_key = {{ sabnzbd_nzb_key }}
|
||||||
|
download_dir = {{ sabnzbd_download_dir | default("/downloads/incomplete/sabnzbd") }}
|
||||||
|
complete_dir = {{ sabnzbd_complete_dir | default("/downloads/complete") }}
|
||||||
|
dirscan_dir = {{ sabnzbd_dirscan_dir | default("/nzbs") }}
|
||||||
|
web_dir = Glitter
|
||||||
|
web_color = Night
|
||||||
|
inet_exposure = 4
|
||||||
|
cleanup_list = sfv, m3u, nfo
|
||||||
|
unwanted_extensions = exe, com
|
||||||
|
ignore_samples = 1
|
||||||
|
enable_all_par = 1
|
||||||
|
new_nzb_on_failure = 1
|
||||||
|
replace_dots = 1
|
||||||
|
prospective_par_download = 1
|
||||||
|
deobfuscate_final_filenames = 1
|
||||||
|
direct_unpack = 1
|
||||||
|
pause_on_pwrar = 2
|
||||||
|
propagation_delay = 0
|
||||||
|
top_only = 1
|
||||||
|
pre_script = None
|
||||||
|
queue_complete = ""
|
||||||
|
queue_complete_pers = 0
|
||||||
|
bandwidth_perc = 100
|
||||||
|
refresh_rate = 1
|
||||||
|
interface_settings = '{"dateFormat":"fromNow","extraQueueColumns":["category","age"],"extraHistoryColumns":["size"],"displayCompact":false,"displayFullWidth":false,"confirmDeleteQueue":true,"confirmDeleteHistory":true,"keyboardShortcuts":true}'
|
||||||
|
queue_limit = 30
|
||||||
|
config_lock = 0
|
||||||
|
sched_converted = 0
|
||||||
|
notified_new_skin = 2
|
||||||
|
direct_unpack_tested = 1
|
||||||
|
check_new_rel = 1
|
||||||
|
auto_browser = 0
|
||||||
|
language = en
|
||||||
|
enable_https_verification = 1
|
||||||
|
https_port = {{ sabnzbd_https_port | default("9090") }}
|
||||||
|
bandwidth_max = 60M
|
||||||
|
cache_limit = 1G
|
||||||
|
https_cert = {{ sabnzbd_https_cert | default("/config/admin/server.cert") }}
|
||||||
|
https_key = {{ sabnzbd_https_key | default("/config/admin/server.key") }}
|
||||||
|
https_chain = ""
|
||||||
|
enable_https = {{ sabnzbd_enable_https | default(false) | int }}
|
||||||
|
permissions = ""
|
||||||
|
download_free = ""
|
||||||
|
complete_free = ""
|
||||||
|
fulldisk_autoresume = 0
|
||||||
|
script_dir = ""
|
||||||
|
nzb_backup_dir = ""
|
||||||
|
admin_dir = admin
|
||||||
|
dirscan_speed = 5
|
||||||
|
password_file = ""
|
||||||
|
log_dir = logs
|
||||||
|
max_art_tries = 3
|
||||||
|
load_balancing = 2
|
||||||
|
sfv_check = 1
|
||||||
|
quick_check_ext_ignore = nfo, sfv, srr
|
||||||
|
script_can_fail = 0
|
||||||
|
enable_recursive = 1
|
||||||
|
flat_unpack = 0
|
||||||
|
par_option = ""
|
||||||
|
pre_check = 0
|
||||||
|
nice = ""
|
||||||
|
win_process_prio = 3
|
||||||
|
ionice = ""
|
||||||
|
fail_hopeless_jobs = 1
|
||||||
|
fast_fail = 1
|
||||||
|
auto_disconnect = 1
|
||||||
|
no_dupes = 0
|
||||||
|
no_series_dupes = 0
|
||||||
|
series_propercheck = 1
|
||||||
|
auto_sort = ""
|
||||||
|
direct_unpack_threads = 3
|
||||||
|
folder_rename = 1
|
||||||
|
replace_spaces = 0
|
||||||
|
safe_postproc = 1
|
||||||
|
pause_on_post_processing = 0
|
||||||
|
sanitize_safe = 0
|
||||||
|
action_on_unwanted_extensions = 0
|
||||||
|
unwanted_extensions_mode = 0
|
||||||
|
history_retention = ""
|
||||||
|
enable_meta = 1
|
||||||
|
quota_size = ""
|
||||||
|
quota_day = ""
|
||||||
|
quota_resume = 0
|
||||||
|
quota_period = m
|
||||||
|
rating_enable = 0
|
||||||
|
rating_host = ""
|
||||||
|
rating_api_key = ""
|
||||||
|
rating_filter_enable = 0
|
||||||
|
rating_filter_abort_audio = 0
|
||||||
|
rating_filter_abort_video = 0
|
||||||
|
rating_filter_abort_encrypted = 0
|
||||||
|
rating_filter_abort_encrypted_confirm = 0
|
||||||
|
rating_filter_abort_spam = 0
|
||||||
|
rating_filter_abort_spam_confirm = 0
|
||||||
|
rating_filter_abort_downvoted = 0
|
||||||
|
rating_filter_abort_keywords = ""
|
||||||
|
rating_filter_pause_audio = 0
|
||||||
|
rating_filter_pause_video = 0
|
||||||
|
rating_filter_pause_encrypted = 0
|
||||||
|
rating_filter_pause_encrypted_confirm = 0
|
||||||
|
rating_filter_pause_spam = 0
|
||||||
|
rating_filter_pause_spam_confirm = 0
|
||||||
|
rating_filter_pause_downvoted = 0
|
||||||
|
rating_filter_pause_keywords = ""
|
||||||
|
enable_tv_sorting = 0
|
||||||
|
tv_sort_string = ""
|
||||||
|
tv_categories = tv,
|
||||||
|
enable_movie_sorting = 0
|
||||||
|
movie_sort_string = ""
|
||||||
|
movie_sort_extra = -cd%1
|
||||||
|
movie_extra_folder = 0
|
||||||
|
movie_categories = movies,
|
||||||
|
enable_date_sorting = 0
|
||||||
|
date_sort_string = ""
|
||||||
|
date_categories = tv,
|
||||||
|
schedlines = ,
|
||||||
|
rss_rate = 60
|
||||||
|
ampm = 0
|
||||||
|
replace_illegal = 1
|
||||||
|
start_paused = 0
|
||||||
|
preserve_paused_state = 0
|
||||||
|
enable_par_cleanup = 1
|
||||||
|
process_unpacked_par2 = 1
|
||||||
|
enable_unrar = 1
|
||||||
|
enable_unzip = 1
|
||||||
|
enable_7zip = 1
|
||||||
|
enable_filejoin = 1
|
||||||
|
enable_tsjoin = 1
|
||||||
|
overwrite_files = 0
|
||||||
|
ignore_unrar_dates = 0
|
||||||
|
backup_for_duplicates = 1
|
||||||
|
empty_postproc = 0
|
||||||
|
wait_for_dfolder = 0
|
||||||
|
rss_filenames = 0
|
||||||
|
api_logging = 1
|
||||||
|
html_login = 1
|
||||||
|
osx_menu = 1
|
||||||
|
osx_speed = 1
|
||||||
|
warn_dupl_jobs = 1
|
||||||
|
helpful_warnings = 1
|
||||||
|
keep_awake = 1
|
||||||
|
win_menu = 1
|
||||||
|
allow_incomplete_nzb = 0
|
||||||
|
enable_broadcast = 1
|
||||||
|
ipv6_hosting = 0
|
||||||
|
fixed_ports = 1
|
||||||
|
api_warnings = 1
|
||||||
|
disable_api_key = 0
|
||||||
|
no_penalties = 0
|
||||||
|
x_frame_options = 1
|
||||||
|
allow_old_ssl_tls = 0
|
||||||
|
num_decoders = 3
|
||||||
|
rss_odd_titles = nzbindex.nl/, nzbindex.com/, nzbclub.com/
|
||||||
|
req_completion_rate = 100.2
|
||||||
|
selftest_host = self-test.sabnzbd.org
|
||||||
|
movie_rename_limit = 100M
|
||||||
|
episode_rename_limit = 20M
|
||||||
|
size_limit = 0
|
||||||
|
show_sysload = 2
|
||||||
|
history_limit = 20
|
||||||
|
wait_ext_drive = 5
|
||||||
|
max_foldername_length = 246
|
||||||
|
nomedia_marker = ""
|
||||||
|
ipv6_servers = 1
|
||||||
|
url_base = /sabnzbd
|
||||||
|
host_whitelist = htpc,
|
||||||
|
local_ranges = ,
|
||||||
|
max_url_retries = 10
|
||||||
|
downloader_sleep_time = 10
|
||||||
|
ssdp_broadcast_interval = 15
|
||||||
|
socks5_proxy_url = ""
|
||||||
|
email_server = ""
|
||||||
|
email_to = ,
|
||||||
|
email_from = ""
|
||||||
|
email_account = ""
|
||||||
|
email_pwd = ""
|
||||||
|
email_endjob = 0
|
||||||
|
email_full = 0
|
||||||
|
email_dir = ""
|
||||||
|
email_rss = 0
|
||||||
|
email_cats = *,
|
||||||
|
num_simd_decoders = 2
|
||||||
|
ext_rename_ignore = ,
|
||||||
|
sorters_converted = 1
|
||||||
|
backup_dir = ""
|
||||||
|
replace_underscores = 0
|
||||||
|
tray_icon = 1
|
||||||
|
enable_season_sorting = 1
|
||||||
|
receive_threads = 2
|
||||||
|
switchinterval = 0.005
|
||||||
|
end_queue_script = None
|
||||||
|
no_smart_dupes = 0
|
||||||
|
dupes_propercheck = 1
|
||||||
|
history_retention_option = all
|
||||||
|
history_retention_number = 1
|
||||||
|
enable_multipar = 1
|
||||||
|
disable_archive = 0
|
||||||
|
ipv6_staging = 0
|
||||||
|
verify_xff_header = 0
|
||||||
|
config_conversion_version = 4
|
||||||
|
disable_par2cmdline = 0
|
||||||
|
unrar_parameters = ""
|
||||||
|
outgoing_nntp_ip = ""
|
||||||
|
|
||||||
|
[categories]
|
||||||
|
[[*]]
|
||||||
|
name = *
|
||||||
|
order = 0
|
||||||
|
pp = 3
|
||||||
|
script = None
|
||||||
|
dir = ""
|
||||||
|
newzbin = ""
|
||||||
|
priority = 0
|
||||||
|
[[music]]
|
||||||
|
name = music
|
||||||
|
order = 0
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = music
|
||||||
|
newzbin = music
|
||||||
|
priority = -100
|
||||||
|
[[tv]]
|
||||||
|
name = tv
|
||||||
|
order = 0
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = tv
|
||||||
|
newzbin = tv
|
||||||
|
priority = -100
|
||||||
|
[[movies]]
|
||||||
|
name = movies
|
||||||
|
order = 0
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = movies
|
||||||
|
newzbin = "movies, movie"
|
||||||
|
priority = -100
|
||||||
|
[[radarr]]
|
||||||
|
name = radarr
|
||||||
|
order = 0
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = radarr
|
||||||
|
newzbin = "movies, movie"
|
||||||
|
priority = -100
|
||||||
|
[[sonarr]]
|
||||||
|
name = sonarr
|
||||||
|
order = 0
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = sonarr
|
||||||
|
newzbin = tv
|
||||||
|
priority = -100
|
||||||
|
[[other]]
|
||||||
|
name = other
|
||||||
|
order = 1
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = other
|
||||||
|
newzbin = "games, game, other"
|
||||||
|
priority = -100
|
||||||
|
[[lidarr]]
|
||||||
|
name = lidarr
|
||||||
|
order = 2
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = lidarr
|
||||||
|
newzbin = music
|
||||||
|
priority = -100
|
||||||
|
[[readarr]]
|
||||||
|
name = readarr
|
||||||
|
order = 3
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = readarr
|
||||||
|
newzbin = ebooks
|
||||||
|
priority = -100
|
||||||
|
[[lazylibrarian]]
|
||||||
|
name = lazylibrarian
|
||||||
|
order = 4
|
||||||
|
pp = ""
|
||||||
|
script = Default
|
||||||
|
dir = lazylibrarian
|
||||||
|
newzbin = "ebooks, audiobooks"
|
||||||
|
priority = -100
|
||||||
|
|
||||||
|
[servers]
|
||||||
|
{% for s in sabnzbd_servers | default([]) %}
|
||||||
|
[[{{ s.name }}]]
|
||||||
|
name = {{ s.name }}
|
||||||
|
displayname = {{ s.displayname | default(s.name) }}
|
||||||
|
host = {{ s.host | default(s.name) }}
|
||||||
|
port = {{ s.port | default(563) }}
|
||||||
|
timeout = {{ s.timeout | default(60) }}
|
||||||
|
username = {{ s.username| default('') }}
|
||||||
|
password = {{ s.password| default('') }}
|
||||||
|
connections = {{ s.connections | default(50) }}
|
||||||
|
ssl = {{ s.ssl | default(1) }}
|
||||||
|
ssl_verify = {{ s.ssl_verify | default(1) }}
|
||||||
|
ssl_ciphers = {{ s.ssl_ciphers | default('""') }}
|
||||||
|
enable = {{ s.enable| default(1) }}
|
||||||
|
required = {{ s.required| default(0) }}
|
||||||
|
optional = {{ s.optional| default(0) }}
|
||||||
|
retention = {{ s.retention | default(0) }}
|
||||||
|
expire_date = {{ s.expire_date | default('""') }}
|
||||||
|
quota = {{ s.quota | default('""') }}
|
||||||
|
usage_at_start = {{ s.usage_at_start | default(0) }}
|
||||||
|
priority = {{ s.priority| default(0) }}
|
||||||
|
notes = {{ s.notes | default('""') }}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
[logging]
|
||||||
|
log_level = 1
|
||||||
|
max_log_size = 5242880
|
||||||
|
log_backups = 5
|
||||||
|
[ncenter]
|
||||||
|
ncenter_enable = 0
|
||||||
|
ncenter_cats = *,
|
||||||
|
ncenter_prio_startup = 1
|
||||||
|
ncenter_prio_download = 0
|
||||||
|
ncenter_prio_pause_resume = 0
|
||||||
|
ncenter_prio_pp = 0
|
||||||
|
ncenter_prio_complete = 1
|
||||||
|
ncenter_prio_failed = 1
|
||||||
|
ncenter_prio_disk_full = 1
|
||||||
|
ncenter_prio_new_login = 0
|
||||||
|
ncenter_prio_warning = 0
|
||||||
|
ncenter_prio_error = 0
|
||||||
|
ncenter_prio_queue_done = 1
|
||||||
|
ncenter_prio_other = 1
|
||||||
|
ncenter_prio_quota = 1
|
||||||
|
[acenter]
|
||||||
|
acenter_enable = 0
|
||||||
|
acenter_cats = *,
|
||||||
|
acenter_prio_startup = 0
|
||||||
|
acenter_prio_download = 0
|
||||||
|
acenter_prio_pause_resume = 0
|
||||||
|
acenter_prio_pp = 0
|
||||||
|
acenter_prio_complete = 1
|
||||||
|
acenter_prio_failed = 1
|
||||||
|
acenter_prio_disk_full = 1
|
||||||
|
acenter_prio_new_login = 0
|
||||||
|
acenter_prio_warning = 0
|
||||||
|
acenter_prio_error = 0
|
||||||
|
acenter_prio_queue_done = 1
|
||||||
|
acenter_prio_other = 1
|
||||||
|
acenter_prio_quota = 1
|
||||||
|
[ntfosd]
|
||||||
|
ntfosd_enable = 1
|
||||||
|
ntfosd_cats = *,
|
||||||
|
ntfosd_prio_startup = 1
|
||||||
|
ntfosd_prio_download = 0
|
||||||
|
ntfosd_prio_pause_resume = 0
|
||||||
|
ntfosd_prio_pp = 0
|
||||||
|
ntfosd_prio_complete = 1
|
||||||
|
ntfosd_prio_failed = 1
|
||||||
|
ntfosd_prio_disk_full = 1
|
||||||
|
ntfosd_prio_new_login = 0
|
||||||
|
ntfosd_prio_warning = 0
|
||||||
|
ntfosd_prio_error = 0
|
||||||
|
ntfosd_prio_queue_done = 1
|
||||||
|
ntfosd_prio_other = 1
|
||||||
|
ntfosd_prio_quota = 1
|
||||||
|
[prowl]
|
||||||
|
prowl_enable = 0
|
||||||
|
prowl_cats = *,
|
||||||
|
prowl_apikey = ""
|
||||||
|
prowl_prio_startup = -3
|
||||||
|
prowl_prio_download = -3
|
||||||
|
prowl_prio_pause_resume = -3
|
||||||
|
prowl_prio_pp = -3
|
||||||
|
prowl_prio_complete = 0
|
||||||
|
prowl_prio_failed = 1
|
||||||
|
prowl_prio_disk_full = 1
|
||||||
|
prowl_prio_new_login = -3
|
||||||
|
prowl_prio_warning = -3
|
||||||
|
prowl_prio_error = -3
|
||||||
|
prowl_prio_queue_done = 0
|
||||||
|
prowl_prio_other = 0
|
||||||
|
prowl_prio_quota = 0
|
||||||
|
[pushover]
|
||||||
|
pushover_token = ""
|
||||||
|
pushover_userkey = ""
|
||||||
|
pushover_device = ""
|
||||||
|
pushover_emergency_expire = 3600
|
||||||
|
pushover_emergency_retry = 60
|
||||||
|
pushover_enable = 0
|
||||||
|
pushover_cats = *,
|
||||||
|
pushover_prio_startup = -3
|
||||||
|
pushover_prio_download = -2
|
||||||
|
pushover_prio_pause_resume = -2
|
||||||
|
pushover_prio_pp = -3
|
||||||
|
pushover_prio_complete = -1
|
||||||
|
pushover_prio_failed = -1
|
||||||
|
pushover_prio_disk_full = 1
|
||||||
|
pushover_prio_new_login = -3
|
||||||
|
pushover_prio_warning = 1
|
||||||
|
pushover_prio_error = 1
|
||||||
|
pushover_prio_queue_done = -1
|
||||||
|
pushover_prio_other = -1
|
||||||
|
pushover_prio_quota = -1
|
||||||
|
[pushbullet]
|
||||||
|
pushbullet_enable = 0
|
||||||
|
pushbullet_cats = *,
|
||||||
|
pushbullet_apikey = ""
|
||||||
|
pushbullet_device = ""
|
||||||
|
pushbullet_prio_startup = 0
|
||||||
|
pushbullet_prio_download = 0
|
||||||
|
pushbullet_prio_pause_resume = 0
|
||||||
|
pushbullet_prio_pp = 0
|
||||||
|
pushbullet_prio_complete = 1
|
||||||
|
pushbullet_prio_failed = 1
|
||||||
|
pushbullet_prio_disk_full = 1
|
||||||
|
pushbullet_prio_new_login = 0
|
||||||
|
pushbullet_prio_warning = 0
|
||||||
|
pushbullet_prio_error = 0
|
||||||
|
pushbullet_prio_queue_done = 0
|
||||||
|
pushbullet_prio_other = 1
|
||||||
|
pushbullet_prio_quota = 1
|
||||||
|
[nscript]
|
||||||
|
nscript_enable = 0
|
||||||
|
nscript_cats = *,
|
||||||
|
nscript_script = ""
|
||||||
|
nscript_parameters = ""
|
||||||
|
nscript_prio_startup = 1
|
||||||
|
nscript_prio_download = 0
|
||||||
|
nscript_prio_pause_resume = 0
|
||||||
|
nscript_prio_pp = 0
|
||||||
|
nscript_prio_complete = 1
|
||||||
|
nscript_prio_failed = 1
|
||||||
|
nscript_prio_disk_full = 1
|
||||||
|
nscript_prio_new_login = 0
|
||||||
|
nscript_prio_warning = 0
|
||||||
|
nscript_prio_error = 0
|
||||||
|
nscript_prio_queue_done = 1
|
||||||
|
nscript_prio_other = 1
|
||||||
|
nscript_prio_quota = 1
|
||||||
|
[apprise]
|
||||||
|
apprise_enable = 0
|
||||||
|
apprise_cats = *,
|
||||||
|
apprise_urls = ""
|
||||||
|
apprise_target_startup = ""
|
||||||
|
apprise_target_startup_enable = 0
|
||||||
|
apprise_target_download = ""
|
||||||
|
apprise_target_download_enable = 0
|
||||||
|
apprise_target_pause_resume = ""
|
||||||
|
apprise_target_pause_resume_enable = 0
|
||||||
|
apprise_target_pp = ""
|
||||||
|
apprise_target_pp_enable = 0
|
||||||
|
apprise_target_complete = ""
|
||||||
|
apprise_target_complete_enable = 1
|
||||||
|
apprise_target_failed = ""
|
||||||
|
apprise_target_failed_enable = 1
|
||||||
|
apprise_target_disk_full = ""
|
||||||
|
apprise_target_disk_full_enable = 0
|
||||||
|
apprise_target_new_login = ""
|
||||||
|
apprise_target_new_login_enable = 1
|
||||||
|
apprise_target_warning = ""
|
||||||
|
apprise_target_warning_enable = 0
|
||||||
|
apprise_target_error = ""
|
||||||
|
apprise_target_error_enable = 0
|
||||||
|
apprise_target_queue_done = ""
|
||||||
|
apprise_target_queue_done_enable = 0
|
||||||
|
apprise_target_other = ""
|
||||||
|
apprise_target_other_enable = 1
|
||||||
|
apprise_target_quota = ""
|
||||||
|
apprise_target_quota_enable = 1
|
||||||
|
|
||||||
43
roles/quadlets/sonarr/quadlets.yml
Normal file
43
roles/quadlets/sonarr/quadlets.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
- name: sonarr
|
||||||
|
type: build
|
||||||
|
image: localhost/sonarr:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
libintl sqlite-libs icu-libs curl jq \
|
||||||
|
&& url=$(curl -sL "https://api.github.com/repos/Sonarr/Sonarr/releases/latest" \
|
||||||
|
| jq -r '.assets[] | select(.name | test("linux-musl-x64.tar.gz$")) | .browser_download_url') \
|
||||||
|
&& curl -L -o /tmp/Sonarr.tar.gz "$url" \
|
||||||
|
&& mkdir -p /app && tar -xzf /tmp/Sonarr.tar.gz -C /app --strip-components=1
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: sonarr
|
||||||
|
type: container
|
||||||
|
image: localhost/sonarr:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/sonarr:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
- "{{ media_root }}/tv:/tv:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
SONARR__APP__LAUNCHBROWSER: false
|
||||||
|
SONARR__APP__INSTANCENAME: "{{ SONARR__APP__INSTANCENAME | default('Sonarr') }}"
|
||||||
|
SONARR__AUTH__METHOD: "{{ SONARR__AUTH__METHOD | default('Forms') }}"
|
||||||
|
SONARR__AUTH__APIKEY: "{{ SONARR__AUTH__APIKEY | default(lookup('password', '/dev/null length=32 chars=ascii_letters,digits')) }}"
|
||||||
|
SONARR__SERVER__ENABLESSL: "{{ SONARR__SERVER__ENABLESSL | default(false) }}"
|
||||||
|
SONARR__SERVER__SSLPORT: "{{ SONARR__SERVER__SSLPORT | default('9898') }}"
|
||||||
|
SONARR__SERVER__PORT: "{{ SONARR__SERVER__PORT | default('8989') }}"
|
||||||
|
SONARR__SERVER__BINDADDRESS: "{{ SONARR__SERVER__BINDADDRESS | default('*') }}"
|
||||||
|
SONARR__SERVER__SSLCERTPATH: "{{ SONARR__SERVER__SSLCERTPATH | default('/config/ssl/server.crt') }}"
|
||||||
|
SONARR__SERVER__SSLCERTPASSWORD: "{{ SONARR__SERVER__SSLCERTPASSWORD | default('/config/ssl/server.key') }}"
|
||||||
|
SONARR__LOG__ANALYTICSENABLED: "{{ SONARR__LOG__ANALYTICSENABLED | default(false) }}"
|
||||||
|
SONARR__UPDATE__AUTOMATICALLY: "{{ SONARR__UPDATE__AUTOMATICALLY | default(false) }}"
|
||||||
|
SONARR__LOG__LEVEL: "{{ SONARR__LOG__LEVEL | default('info') }}"
|
||||||
|
command: ["/app/Sonarr", "-data=/config"]
|
||||||
|
restart_policy: on-failure
|
||||||
46
roles/quadlets/tasks/main.yml
Normal file
46
roles/quadlets/tasks/main.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
- name: Deploy quadlet app configs
|
||||||
|
ansible.builtin.include_tasks: ../../deploy_files.yml
|
||||||
|
vars:
|
||||||
|
var_prefix: quadlets
|
||||||
|
subdir: ''
|
||||||
|
target_root: "{{ ansible_facts.env.HOME }}/.config"
|
||||||
|
use_symlinks: false
|
||||||
|
become_root: false
|
||||||
|
when: quadlets_deploy_configs | default(false)
|
||||||
|
|
||||||
|
- name: Initialize quadlet specs
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
quadlets_all_specs: []
|
||||||
|
|
||||||
|
- name: Load all quadlet definitions
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
quadlets_all_specs: "{{ quadlets_all_specs + (lookup('file', item.path) | from_yaml) }}"
|
||||||
|
loop: "{{ lookup('ansible.builtin.find', role_path, patterns='quadlets.yml', recurse=yes).files }}"
|
||||||
|
|
||||||
|
- name: Build final quadlet specs with pod injection
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
quadlets_specs: "{{ (pods | default([])) | map('combine', {'type': 'pod'}) | list }}"
|
||||||
|
|
||||||
|
- name: Add containers to quadlet specs with pod injection
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
quadlets_specs: "{{ quadlets_specs + [container_spec[0] | combine({'pod': item.0.name})] }}"
|
||||||
|
loop: "{{ pods | default([]) | subelements('containers') }}"
|
||||||
|
vars:
|
||||||
|
container_spec: "{{ quadlets_all_specs | selectattr('name', 'equalto', item.1) | selectattr('type', 'equalto', 'container') | list }}"
|
||||||
|
when: container_spec | length > 0
|
||||||
|
|
||||||
|
- name: Add build specs for enabled containers
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
quadlets_specs: "{{ quadlets_specs + [item] }}"
|
||||||
|
loop: "{{ quadlets_all_specs }}"
|
||||||
|
when:
|
||||||
|
- item.type == 'build'
|
||||||
|
- item.name in (pods | default([]) | map(attribute='containers') | flatten)
|
||||||
|
|
||||||
|
- name: Deploy quadlets using fedora.linux_system_roles.podman
|
||||||
|
ansible.builtin.include_role:
|
||||||
|
name: fedora.linux_system_roles.podman
|
||||||
|
vars:
|
||||||
|
podman_quadlet_specs: "{{ quadlets_specs }}"
|
||||||
|
when: quadlets_specs is defined and quadlets_specs | length > 0
|
||||||
116
roles/quadlets/traefik/dynamic/htpc.yml.j2
Normal file
116
roles/quadlets/traefik/dynamic/htpc.yml.j2
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
---
|
||||||
|
# Traefik dynamic configuration for HTPC services
|
||||||
|
# Auto-generated by Ansible - deployed as dotfile
|
||||||
|
|
||||||
|
http:
|
||||||
|
middlewares:
|
||||||
|
redirect-https:
|
||||||
|
redirectScheme:
|
||||||
|
scheme: https
|
||||||
|
permanent: true
|
||||||
|
|
||||||
|
routers:
|
||||||
|
redirect-to-https:
|
||||||
|
rule: "HostRegexp(`{any:.*}`)"
|
||||||
|
entryPoints:
|
||||||
|
- web
|
||||||
|
middlewares:
|
||||||
|
- redirect-https
|
||||||
|
service: noop
|
||||||
|
|
||||||
|
sabnzbd:
|
||||||
|
rule: "PathPrefix(`/sabnzbd`)"
|
||||||
|
service: sabnzbd
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
qbittorrent:
|
||||||
|
rule: "PathPrefix(`/qbittorrent`)"
|
||||||
|
service: qbittorrent
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
sonarr:
|
||||||
|
rule: "PathPrefix(`/sonarr`)"
|
||||||
|
service: sonarr
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
radarr:
|
||||||
|
rule: "PathPrefix(`/radarr`)"
|
||||||
|
service: radarr
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
lidarr:
|
||||||
|
rule: "PathPrefix(`/lidarr`)"
|
||||||
|
service: lidarr
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
lazylibrarian:
|
||||||
|
rule: "PathPrefix(`/lazylibrarian`)"
|
||||||
|
service: lazylibrarian
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
prowlarr:
|
||||||
|
rule: "PathPrefix(`/prowlarr`)"
|
||||||
|
service: prowlarr
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
dashboard:
|
||||||
|
rule: "PathPrefix(`/dashboard`)"
|
||||||
|
service: api@internal
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
tls: {}
|
||||||
|
|
||||||
|
services:
|
||||||
|
noop:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost"
|
||||||
|
|
||||||
|
sabnzbd:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:8081"
|
||||||
|
|
||||||
|
qbittorrent:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:8082"
|
||||||
|
|
||||||
|
sonarr:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:{{ SONARR__SERVER__PORT | default('8989') }}"
|
||||||
|
|
||||||
|
radarr:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:{{ RADARR__SERVER__PORT | default('7878') }}"
|
||||||
|
|
||||||
|
lidarr:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:{{ LIDARR__SERVER__PORT | default('8686') }}"
|
||||||
|
|
||||||
|
lazylibrarian:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:{{ lazylibrarian_port | default('5299') }}"
|
||||||
|
|
||||||
|
prowlarr:
|
||||||
|
loadBalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://localhost:{{ PROWLARR__SERVER__PORT | default('9696') }}"
|
||||||
19
roles/quadlets/traefik/quadlets.yml
Normal file
19
roles/quadlets/traefik/quadlets.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
- name: traefik
|
||||||
|
type: container
|
||||||
|
image: docker.io/traefik:latest
|
||||||
|
pull: newer
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/traefik:/etc/traefik:Z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
command:
|
||||||
|
- "--api.dashboard=true"
|
||||||
|
- "--api.insecure=true"
|
||||||
|
- "--providers.file.directory=/etc/traefik/dynamic"
|
||||||
|
- "--providers.file.watch=true"
|
||||||
|
- "--entrypoints.web.address=:80"
|
||||||
|
- "--entrypoints.websecure.address=:443"
|
||||||
|
- "--entrypoints.websecure.http.tls.certFile=/etc/traefik/server.crt"
|
||||||
|
- "--entrypoints.websecure.http.tls.keyFile=/etc/traefik/server.key"
|
||||||
|
- "--log.level=INFO"
|
||||||
|
restart_policy: on-failure
|
||||||
1
roles/quadlets/traefik/server.crt.j2
Normal file
1
roles/quadlets/traefik/server.crt.j2
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{{ traefik_server_cert }}
|
||||||
1
roles/quadlets/traefik/server.key.j2
Normal file
1
roles/quadlets/traefik/server.key.j2
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{{ traefik_server_key }}
|
||||||
36
roles/quadlets/unpackerr/quadlets.yml
Normal file
36
roles/quadlets/unpackerr/quadlets.yml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
- name: unpackerr
|
||||||
|
type: build
|
||||||
|
image: localhost/unpackerr:latest
|
||||||
|
pull: missing
|
||||||
|
format: oci
|
||||||
|
force_rm: true
|
||||||
|
container_file: |
|
||||||
|
FROM {{ alpine_base_image }}
|
||||||
|
LABEL maintainer="{{ maintainer }}"
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/main" \
|
||||||
|
-X "{{ alpine_mirror }}/v{{ alpine_base_image.split(':')[-1] }}/community" \
|
||||||
|
curl tar jq \
|
||||||
|
&& url=$(curl -sL "https://api.github.com/repos/davidnewhall/Unpackerr/releases/latest" \
|
||||||
|
| jq -r '.assets[] | select(.name == "unpackerr.amd64.linux.gz") | .browser_download_url') \
|
||||||
|
&& [ -n "$url" ] \
|
||||||
|
&& curl -L -o /tmp/unpackerr.gz "$url" \
|
||||||
|
&& mkdir -p /app \
|
||||||
|
&& gunzip -c /tmp/unpackerr.gz > /app/unpackerr \
|
||||||
|
&& chmod +x /app/unpackerr \
|
||||||
|
&& rm /tmp/unpackerr.gz
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
- name: unpackerr
|
||||||
|
type: container
|
||||||
|
image: localhost/unpackerr:latest
|
||||||
|
volumes:
|
||||||
|
- "{{ config_root }}/unpackerr:/config:Z"
|
||||||
|
- "{{ download_root }}/htpc:/downloads:z"
|
||||||
|
env:
|
||||||
|
TZ: "{{ tz }}"
|
||||||
|
UNPACKERR__LOG__ANALYTICSENABLED: "{{ UNPACKERR__LOG__ANALYTICSENABLED | default(false) }}"
|
||||||
|
UNPACKERR__UPDATE__AUTOMATICALLY: "{{ UNPACKERR__UPDATE__AUTOMATICALLY | default(false) }}"
|
||||||
|
UNPACKERR__LOG__LEVEL: "{{ UNPACKERR__LOG__LEVEL | default('info') }}"
|
||||||
|
command: ["/app/unpackerr"]
|
||||||
|
restart_policy: on-failure
|
||||||
Reference in New Issue
Block a user