382 lines
13 KiB
Django/Jinja
382 lines
13 KiB
Django/Jinja
services:
|
|
sonarr:
|
|
container_name: sonarr
|
|
image: "lscr.io/linuxserver/sonarr:{{ arrstack_sonarr_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/sonarr:/config"
|
|
- "{{ arrstack_serve_dir }}/media/tv:/data/media/tv"
|
|
- "{{ arrstack_serve_dir }}/files/usenet:/data/usenet"
|
|
- "{{ arrstack_serve_dir }}/files/torrent:/data/torrent"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_sonarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8989{{ '}}'}}"
|
|
|
|
radarr:
|
|
container_name: radarr
|
|
image: "lscr.io/linuxserver/radarr:{{ arrstack_radarr_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/radarr:/config"
|
|
- "/mnt/ext/data/media/movies:/data/media/movies" # FIXME: Find non-hardcoded solution
|
|
- "{{ arrstack_serve_dir }}/files/usenet:/data/usenet"
|
|
- "{{ arrstack_serve_dir }}/files/torrent:/data/torrent"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_radarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 7878{{ '}}'}}"
|
|
|
|
lidarr:
|
|
container_name: lidarr
|
|
image: "lscr.io/linuxserver/lidarr:{{ arrstack_lidarr_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
- MB_USER={{ arrstack_mb_user }}
|
|
- MB_PASS={{ arrstack_mb_pass }}
|
|
environment:
|
|
- DOCKER_MODS=linuxserver/mods:universal-docker
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/lidarr:/config"
|
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
|
- "{{ arrstack_serve_dir }}/media/music:/data/media/music"
|
|
- "{{ arrstack_serve_dir }}/files/usenet:/data/usenet"
|
|
- "{{ arrstack_serve_dir }}/files/torrent:/data/torrent"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_lidarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8686{{ '}}'}}"
|
|
|
|
readarr:
|
|
container_name: readarr
|
|
image: "lscr.io/linuxserver/readarr:{{ arrstack_readarr_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/readarr:/config"
|
|
- "{{ arrstack_serve_dir }}/media/audiobooks:/data/media/audiobooks"
|
|
- "{{ arrstack_serve_dir }}/files/usenet:/data/usenet"
|
|
- "{{ arrstack_serve_dir }}/files/torrent:/data/torrent"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_readarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8787{{ '}}'}}"
|
|
|
|
prowlarr:
|
|
container_name: prowlarr
|
|
image: "lscr.io/linuxserver/prowlarr:{{ arrstack_prowlarr_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/prowlarr:/config"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_prowlarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 9696{{ '}}'}}"
|
|
|
|
beets:
|
|
image: "lscr.io/linuxserver/beets:{{ arrstack_beets_version }}"
|
|
container_name: beets
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
- MB_USER={{ arrstack_mb_user }}
|
|
- MB_PASS={{ arrstack_mb_pass }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/beets:/config"
|
|
- "{{ arrstack_serve_dir }}/media/music:/music"
|
|
- "{{ arrstack_serve_dir }}/files/music-unsorted:/downloads"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_beets_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8337{{ '}}'}}"
|
|
|
|
tdarr:
|
|
image: "ghcr.io/haveagitgat/tdarr:{{ arrstack_tdarr_version }}"
|
|
container_name: tdarr
|
|
networks:
|
|
- caddy
|
|
group_add:
|
|
- video # video
|
|
# - render # render NOTE: Would have to be added for e.g. Ubuntu 20+ afaik
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
- serverIP=0.0.0.0
|
|
- serverPort=8266
|
|
- webUIPort=8265
|
|
- internalNode=true
|
|
- inContainer=true
|
|
- ffmpegVersion=7
|
|
- auth=false
|
|
- maxLogSizeMB=10
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/tdarr:/app/configs"
|
|
- "{{ arrstack_env_dir }}/data/tdarr:/app/server"
|
|
- "{{ arrstack_serve_dir }}/media/tv:/media/tv"
|
|
- "/mnt/ext/data/media/movies:/media/movies" # FIXME: To be changed?
|
|
- "/mnt/ext/data/media/fanedits:/media/fanedits" # FIXME: Find non-hardcoded solution
|
|
- "/transcodes:/transcodes" # TODO: Implement dynamic form with variable?
|
|
restart: unless-stopped
|
|
devices:
|
|
- /dev/dri:/dev/dri
|
|
labels:
|
|
caddy: "{{ arrstack_tdarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8265{{ '}}'}}"
|
|
|
|
bazarr:
|
|
image: "lscr.io/linuxserver/bazarr:{{ arrstack_bazarr_version }}"
|
|
container_name: bazarr
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/sabnzbd:/config"
|
|
- "{{ arrstack_serve_dir }}/media/tv:/data/media/tv"
|
|
- "/mnt/ext/data/media/movies:/data/media/movies" # FIXME: To be changed?
|
|
- "/mnt/ext/data/media/fanedits:/data/media/fanedits" # FIXME: Find non-hardcoded solution
|
|
ports:
|
|
- 6767:6767
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_bazarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 6767{{ '}}'}}"
|
|
|
|
sabnzbd:
|
|
container_name: sabnzbd
|
|
image: "lscr.io/linuxserver/sabnzbd:{{ arrstack_sabnzbd_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/sabnzbd:/config"
|
|
- "{{ arrstack_serve_dir }}/files/usenet:/data/usenet:rw"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_sabnzbd_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8080{{ '}}'}}"
|
|
|
|
vpn:
|
|
container_name: vpn
|
|
image: "qmcgaw/gluetun:{{ arrstack_gluetun_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
- VPN_PORT_FORWARDING_STATUS_FILE=/gluetun/forwarded_port
|
|
- FIREWALL_OUTBOUND_SUBNETS=172.18.0.0/24
|
|
- BLOCK_SURVEILLANCE=on
|
|
- VPN_SERVICE_PROVIDER={{ arrstack_vpn_provider }}
|
|
- OPENVPN_USER={{ arrstack_vpn_user }}
|
|
- OPENVPN_PASSWORD={{ arrstack_vpn_pass }}
|
|
- UPDATER_PERIOD=48h
|
|
- SERVER_REGIONS={{ arrstack_vpn_regions }}
|
|
- DNS_ADDRESS=9.9.9.9 # TODO: implement variable
|
|
- PORT_FORWARD_ONLY=true
|
|
- VPN_PORT_FORWARDING=on
|
|
- VPN_PORT_FORWARDING_PROVIDER={{ arrstack_vpn_provider }}
|
|
- VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -O- --retry-connrefused --post-data "json={\"listen_port\":{{ '{{' }}PORTS{{ '}}' }} }" http://127.0.0.1:8888/api/v2/app/setPreferences 2>&1'
|
|
- QBITTORRENT_USER={{ arrstack_qbit_user }}
|
|
- QBITTORRENT_PASS={{ arrstack_qbit_pass }}
|
|
cap_add:
|
|
- NET_ADMIN
|
|
devices:
|
|
- /dev/net/tun:/dev/net/tun
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/gluetun:/gluetun"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_qbit_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8888{{ '}}'}}"
|
|
qbittorrent:
|
|
image: "linuxserver/qbittorrent:{{ arrstack_qbittorrent_version }}"
|
|
container_name: qbittorrent
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
- WEBUI_PORT=8888
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/piaqbit:/config"
|
|
- "{{ arrstack_env_dir }}/config/gluetun:/gluetun"
|
|
- "{{ arrstack_serve_dir }}/files/torrent:/downloads"
|
|
depends_on:
|
|
- vpn
|
|
network_mode: "service:vpn"
|
|
restart: unless-stopped
|
|
|
|
homarr:
|
|
image: "ghcr.io/ajnart/homarr:{{ arrstack_homarr_version }}"
|
|
container_name: homarr
|
|
networks:
|
|
- caddy
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/homarr/configs:/app/data/configs"
|
|
- "{{ arrstack_env_dir }}/config/homarr/icons:/app/public/icons"
|
|
- "{{ arrstack_env_dir }}/config/homarr/data:/data"
|
|
- /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_homarr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 7575{{ '}}'}}"
|
|
|
|
jellyseerr:
|
|
image: "fallenbagel/jellyseerr:{{ arrstack_jellyseerr_version }}"
|
|
container_name: jellyseerr
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/jellyseerr:/app/config"
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_jellyseerr_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 5055{{ '}}'}}"
|
|
|
|
audiobookshelf:
|
|
container_name: audiobookshelf
|
|
image: "ghcr.io/advplyr/audiobookshelf:{{ arrstack_audiobookshelf_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/audiobookshelf:/config"
|
|
- "{{ arrstack_env_dir }}/data/audiobookshelf:/metadata"
|
|
- "{{ arrstack_serve_dir }}/media/audiobooks:/audiobooks"
|
|
# - "{{ arrstack_serve_dir }}/media/podcasts:/podcasts" # TODO: If integrating podcasts
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_audiobookshelf_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}'}}"
|
|
|
|
jellyfin:
|
|
image: "lscr.io/linuxserver/jellyfin:{{ arrstack_jellyfin_version }}"
|
|
container_name: jellyfin
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
group_add:
|
|
- video # video
|
|
# - render # render
|
|
devices:
|
|
- /dev/dri:/dev/dri
|
|
#environment:
|
|
#- JELLYFIN_PublishedServerUrl=192.168.0.5 #optional
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/config/jellyfin:/config"
|
|
- "{{ arrstack_env_dir }}/data/jellyfin:/config/data"
|
|
- "/mnt/ext/data/media/movies:/media/movies" # FIXME: To be changed?
|
|
- "/mnt/ext/data/media/fanedits:/media/fanedits" # FIXME: Find non-hardcoded solution
|
|
- "{{ arrstack_serve_dir }}/media/tv:/media/tv"
|
|
- "{{ arrstack_serve_dir }}/media/music:/media/music"
|
|
ports: # FIXME: how to enable discovery behind proxies?
|
|
- 7359:7359/udp #optional - network discovery
|
|
- 1900:1900/udp #optional - dlna discovery
|
|
restart: unless-stopped
|
|
labels:
|
|
caddy: "{{ arrstack_jellyfin_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 8096{{ '}}'}}"
|
|
|
|
gonic:
|
|
image: "sentriz/gonic:{{ arrstack_gonic_version }}"
|
|
networks:
|
|
- caddy
|
|
environment:
|
|
- PUID={{ arrstack_puid }}
|
|
- PGID={{ arrstack_pgid }}
|
|
- TZ={{ arrstack_tz }}
|
|
- UMASK_SET={{ arrstack_umask_set }}
|
|
volumes:
|
|
- "{{ arrstack_env_dir }}/data/gonic:/data"
|
|
- "{{ arrstack_env_dir }}/data/gonic_playlists:/playlists"
|
|
- "{{ arrstack_serve_dir }}/media/music:/music:ro"
|
|
- "{{ arrstack_serve_dir }}/media/podcasts:/podcasts"
|
|
#- /path/to/cache:/cache # transcode / covers / etc cache dir
|
|
labels:
|
|
caddy: "{{ arrstack_gonic_subdomain }}"
|
|
caddy.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}'}}"
|
|
|
|
{% if restic_enable|d(False) == True and arrstack_restic_enable|d(False) == True %}
|
|
backup:
|
|
image: "mazzolino/restic:{{ arrstack_restic_version }}"
|
|
hostname: "{{ ansible_hostname | default() }}"
|
|
environment:
|
|
TZ: "{{ restic_tz }}"
|
|
SKIP_INIT: true
|
|
BACKUP_CRON: "{{ arrstack_restic_cron }}"
|
|
RESTIC_REPOSITORY: "{{ restic_repo }}"
|
|
RESTIC_PASSWORD: "{{ restic_pass }}"
|
|
AWS_ACCESS_KEY_ID: "{{ restic_s3_key }}"
|
|
AWS_SECRET_ACCESS_KEY: "{{ restic_s3_secret }}"
|
|
RESTIC_BACKUP_ARGS: >-
|
|
--tag arr
|
|
RESTIC_BACKUP_SOURCES: "/backup"
|
|
volumes:
|
|
{% if restic_repo is regex('^/.+') %}
|
|
- "{{ restic_repo }}:{{ restic_repo }}"
|
|
{% endif %}
|
|
- "{{ arrstack_env_dir }}:/backup/{{ arrstack_env_dir }}"
|
|
{% endif %}
|
|
|
|
networks:
|
|
caddy:
|
|
external: true
|
|
|
|
volumes:
|
|
caddy_data: {}
|