From 8087eb6814872455bb85d8ef150a8615ede0156e Mon Sep 17 00:00:00 2001 From: Menno van Leeuwen Date: Tue, 25 Mar 2025 13:43:02 +0100 Subject: [PATCH] feat: add ArrStack and Downloaders services with deployment configurations --- config/ansible/tasks/servers/server.yml | 4 + .../servers/services/arr-stack/arr-stack.yml | 34 ++++++ .../services/arr-stack/docker-compose.yml.j2 | 111 ++++++++++++++++++ .../tasks/servers/services/caddy/Caddyfile.j2 | 20 +++- .../downloaders/docker-compose.yml.j2 | 62 ++++++++++ .../services/downloaders/downloaders.yml | 27 +++++ .../services/jellyfin/docker-compose.yml.j2 | 14 ++- config/home-manager/flake.lock | 18 +-- 8 files changed, 275 insertions(+), 15 deletions(-) create mode 100644 config/ansible/tasks/servers/services/arr-stack/arr-stack.yml create mode 100644 config/ansible/tasks/servers/services/arr-stack/docker-compose.yml.j2 create mode 100644 config/ansible/tasks/servers/services/downloaders/docker-compose.yml.j2 create mode 100644 config/ansible/tasks/servers/services/downloaders/downloaders.yml diff --git a/config/ansible/tasks/servers/server.yml b/config/ansible/tasks/servers/server.yml index a56fbc0..07dafff 100644 --- a/config/ansible/tasks/servers/server.yml +++ b/config/ansible/tasks/servers/server.yml @@ -39,3 +39,7 @@ enabled: true - name: beszel enabled: true + - name: arr-stack + enabled: true + - name: downloaders + enabled: true diff --git a/config/ansible/tasks/servers/services/arr-stack/arr-stack.yml b/config/ansible/tasks/servers/services/arr-stack/arr-stack.yml new file mode 100644 index 0000000..5f3dd26 --- /dev/null +++ b/config/ansible/tasks/servers/services/arr-stack/arr-stack.yml @@ -0,0 +1,34 @@ +--- +- name: Deploy ArrStack service + block: + - name: Set ArrStack directories + ansible.builtin.set_fact: + arr_stack_data_dir: "{{ ansible_env.HOME }}/services/arr-stack" + arr_stack_data_dir: "/mnt/object_storage/services/arr-stack" + + - name: Create ArrStack directory + ansible.builtin.file: + path: "{{ arr_stack_data_dir }}" + state: directory + mode: "0755" + + - name: Create ArrStack data directory + ansible.builtin.file: + path: "{{ arr_stack_data_dir }}" + state: directory + mode: "0755" + + - name: Deploy ArrStack docker-compose.yml + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ arr_stack_data_dir }}/docker-compose.yml" + mode: "0644" + register: arr-stack_compose + + - name: Stop ArrStack service + ansible.builtin.command: docker compose -f "{{ arr_stack_data_dir }}/docker-compose.yml" down --remove-orphans + when: arr-stack_compose.changed + + - name: Start ArrStack service + ansible.builtin.command: docker compose -f "{{ arr_stack_data_dir }}/docker-compose.yml" up -d + when: arr-stack_compose.changed diff --git a/config/ansible/tasks/servers/services/arr-stack/docker-compose.yml.j2 b/config/ansible/tasks/servers/services/arr-stack/docker-compose.yml.j2 new file mode 100644 index 0000000..ca1a752 --- /dev/null +++ b/config/ansible/tasks/servers/services/arr-stack/docker-compose.yml.j2 @@ -0,0 +1,111 @@ +name: arr-stack +services: + radarr: + container_name: radarr + image: lscr.io/linuxserver/radarr:latest + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + ports: + - 7878:7878 + extra_hosts: + - host.docker.internal:host-gateway + volumes: + - {{ arr_stack_data_dir }}/radarr-config:/config + - /mnt/object_storage:/storage + restart: "unless-stopped" + networks: + - arr-stack-net + + sonarr: + image: linuxserver/sonarr:latest + container_name: sonarr + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + volumes: + - {{ arr_stack_data_dir }}/sonarr-config:/config + - /mnt/object_storage:/storage + ports: + - 8989:8989 + extra_hosts: + - host.docker.internal:host-gateway + restart: unless-stopped + networks: + - arr-stack-net + + lidarr: + image: linuxserver/lidarr:latest + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + ports: + - 8686:8686 + extra_hosts: + - host.docker.internal:host-gateway + volumes: + - {{ arr_stack_data_dir }}/lidarr-config:/config + - /mnt/object_storage:/storage + restart: unless-stopped + networks: + - arr-stack-net + + prowlarr: + container_name: prowlarr + image: linuxserver/prowlarr:latest + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + volumes: + - {{ arr_stack_data_dir }}/prowlarr-config:/config + extra_hosts: + - host.docker.internal:host-gateway + ports: + - 9696:9696 + restart: unless-stopped + networks: + - arr-stack-net + + flaresolverr: + image: ghcr.io/flaresolverr/flaresolverr:latest + container_name: flaresolverr + environment: + - LOG_LEVEL=${LOG_LEVEL:-info} + - LOG_HTML=${LOG_HTML:-false} + - CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none} + - TZ=Europe/Amsterdam + ports: + - "8191:8191" + extra_hosts: + - host.docker.internal:host-gateway + restart: unless-stopped + networks: + - arr-stack-net + + overseerr: + image: lscr.io/linuxserver/overseerr:latest + container_name: overseerr + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + volumes: + - {{ arr_stack_data_dir }}/overseerr-config:/config + ports: + - 5055:5055 + extra_hosts: + - host.docker.internal:host-gateway + restart: unless-stopped + networks: + - arr-stack-net + - caddy_network + +networks: + arr-stack-net: + caddy_network: + external: true + name: caddy_default diff --git a/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 b/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 index 97d8495..59f6e1e 100644 --- a/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 +++ b/config/ansible/tasks/servers/services/caddy/Caddyfile.j2 @@ -13,11 +13,6 @@ git.vleeuwen.me git.mvl.sh { tls {{ caddy_email }} } -jf.vleeuwen.me jf.mvl.sh { - reverse_proxy jellyfin:8096 - tls {{ caddy_email }} -} - status.vleeuwen.me status.mvl.sh { reverse_proxy uptime-kuma:3001 tls {{ caddy_email }} @@ -52,3 +47,18 @@ df.mvl.sh { redir / https://git.mvl.sh/vleeuwenmenno/dotfiles/raw/branch/master/setup.sh tls {{ caddy_email }} } + +overseerr.mvl.sh { + reverse_proxy overseerr:5055 + tls {{ caddy_email }} +} + +jellyfin.mvl.sh jellyfin.vleeuwen.me jf.vleeuwen.me jf.mvl.sh { + reverse_proxy jellyfin:8096 + tls {{ caddy_email }} +} + +fladder.mvl.sh { + reverse_proxy fladder:80 + tls {{ caddy_email }} +} diff --git a/config/ansible/tasks/servers/services/downloaders/docker-compose.yml.j2 b/config/ansible/tasks/servers/services/downloaders/docker-compose.yml.j2 new file mode 100644 index 0000000..9c1ca5d --- /dev/null +++ b/config/ansible/tasks/servers/services/downloaders/docker-compose.yml.j2 @@ -0,0 +1,62 @@ +name: downloaders +services: + gluetun: + image: qmcgaw/gluetun:latest + privileged: true + cap_add: + - NET_ADMIN + networks: + - shared_network + ports: + - 6881:6881 + - 6881:6881/udp + - 8085:8085 + - 7788:8080 + devices: + - /dev/net/tun:/dev/net/tun + volumes: + - {{ downloaders_data_dir }}/gluetun-config:/gluetun + environment: + - PUID=1000 + - PGID=100 + - VPN_SERVICE_PROVIDER={{ lookup('community.general.onepassword', 'qm7lxjrv2ctgzsjuwtolxpd5i4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='VPN_SERVICE_PROVIDER') }} + - OPENVPN_USER={{ lookup('community.general.onepassword', 'qm7lxjrv2ctgzsjuwtolxpd5i4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='OPENVPN_USER') }} + - OPENVPN_PASSWORD={{ lookup('community.general.onepassword', 'qm7lxjrv2ctgzsjuwtolxpd5i4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='OPENVPN_PASSWORD') }} + - SERVER_COUNTRIES={{ lookup('community.general.onepassword', 'qm7lxjrv2ctgzsjuwtolxpd5i4', vault='j7nmhqlsjmp2r6umly5t75hzb4', field='SERVER_COUNTRIES') }} + restart: always + + sabnzbd: + image: lscr.io/linuxserver/sabnzbd:latest + container_name: sabnzbd + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + volumes: + - {{ downloaders_data_dir }}/sabnzbd-config:/config + - /mnt/object_storage:/storage + restart: unless-stopped + network_mode: "service:gluetun" + depends_on: + gluetun: + condition: service_healthy + + qbittorrent: + image: lscr.io/linuxserver/qbittorrent + environment: + - PUID=1000 + - PGID=100 + - WEBUI_PORT=8085 + - TZ=Europe/Amsterdam + volumes: + - {{ downloaders_data_dir }}/qbit-config:/config + - /mnt/object_storage:/storage + restart: always + network_mode: "service:gluetun" + depends_on: + gluetun: + condition: service_healthy + +networks: + shared_network: + external: true diff --git a/config/ansible/tasks/servers/services/downloaders/downloaders.yml b/config/ansible/tasks/servers/services/downloaders/downloaders.yml new file mode 100644 index 0000000..9f1bf45 --- /dev/null +++ b/config/ansible/tasks/servers/services/downloaders/downloaders.yml @@ -0,0 +1,27 @@ +--- +- name: Deploy Downloaders service + block: + - name: Set Downloaders directories + ansible.builtin.set_fact: + downloaders_data_dir: "{{ ansible_env.HOME }}/services/downloaders" + + - name: Create Downloaders directory + ansible.builtin.file: + path: "{{ downloaders_data_dir }}" + state: directory + mode: "0755" + + - name: Deploy Downloaders docker-compose.yml + ansible.builtin.template: + src: docker-compose.yml.j2 + dest: "{{ downloaders_data_dir }}/docker-compose.yml" + mode: "0644" + register: downloaders_compose + + - name: Stop Downloaders service + ansible.builtin.command: docker compose -f "{{ downloaders_data_dir }}/docker-compose.yml" down --remove-orphans + when: downloaders_compose.changed + + - name: Start Downloaders service + ansible.builtin.command: docker compose -f "{{ downloaders_data_dir }}/docker-compose.yml" up -d + when: downloaders_compose.changed diff --git a/config/ansible/tasks/servers/services/jellyfin/docker-compose.yml.j2 b/config/ansible/tasks/servers/services/jellyfin/docker-compose.yml.j2 index 7aaf19e..28dccd7 100644 --- a/config/ansible/tasks/servers/services/jellyfin/docker-compose.yml.j2 +++ b/config/ansible/tasks/servers/services/jellyfin/docker-compose.yml.j2 @@ -6,7 +6,7 @@ services: - PUID=1000 - PGID=100 - TZ=Europe/Amsterdam - - JELLYFIN_PublishedServerUrl=https://jellyfin.vleeuwen.me + - JELLYFIN_PublishedServerUrl=https://jellyfin.mvl.sh volumes: - {{jellyfin_data_dir}}/jellyfin-config:/config - /mnt/object_storage/movies:/movies @@ -24,6 +24,18 @@ services: networks: - caddy_network + fladder: + image: ghcr.io/donutware/fladder:latest + ports: + - 5423:80 + environment: + - PUID=1000 + - PGID=100 + - TZ=Europe/Amsterdam + - BASE_URL=https://fladder.mvl.sh + networks: + - caddy_network + networks: caddy_network: external: true diff --git a/config/home-manager/flake.lock b/config/home-manager/flake.lock index 98c671e..7e1db38 100644 --- a/config/home-manager/flake.lock +++ b/config/home-manager/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1742234739, - "narHash": "sha256-zFL6zsf/5OztR1NSNQF33dvS1fL/BzVUjabZq4qrtY4=", + "lastModified": 1742655702, + "narHash": "sha256-jbqlw4sPArFtNtA1s3kLg7/A4fzP4GLk9bGbtUJg0JQ=", "owner": "nix-community", "repo": "home-manager", - "rev": "f6af7280a3390e65c2ad8fd059cdc303426cbd59", + "rev": "0948aeedc296f964140d9429223c7e4a0702a1ff", "type": "github" }, "original": { @@ -23,11 +23,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1742268799, - "narHash": "sha256-IhnK4LhkBlf14/F8THvUy3xi/TxSQkp9hikfDZRD4Ic=", + "lastModified": 1742751704, + "narHash": "sha256-rBfc+H1dDBUQ2mgVITMGBPI1PGuCznf9rcWX/XIULyE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "da044451c6a70518db5b730fe277b70f494188f1", + "rev": "f0946fa5f1fb876a9dc2e1850d9d3a4e3f914092", "type": "github" }, "original": { @@ -39,11 +39,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1742288794, - "narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=", + "lastModified": 1742669843, + "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42", + "rev": "1e5b653dff12029333a6546c11e108ede13052eb", "type": "github" }, "original": {