services: #---------------- MEDIA ----------------# ## AudioBookShelf (audiobook downloading) audiobookshelf: container_name: audiobookshelf image: ghcr.io/advplyr/audiobookshelf:latest environment: - AUDIOBOOKSHELF_UID=99 - AUDIOBOOKSHELF_GID=100 ports: - 13378:80 volumes: - /media/audiobooks:/audiobooks - /media/audiobooks-pt:/audiobooks-pt - /media/podcasts:/podcasts - ${DOCKER_DIR}/audiobookshelf/config:/config - ${DOCKER_DIR}/audiobookshelf/metadata:/metadata dns: - ${DNS_IP} restart: unless-stopped ## AudioBookShelf metadata provider abs-tract: container_name: abs-tract image: arranhs/abs-tract:latest ports: - 5585:5555 dns: - ${DNS_IP} restart: unless-stopped # Calibre (ebook management) calibre-web-automated: image: crocodilestick/calibre-web-automated:latest container_name: calibre-web environment: - ${TZ} - PUID=1000 - PGID=100 - DOCKER_MODS=lscr.io/linuxserver/mods:universal-calibre-v7.16.0 volumes: - ${DOCKER_DIR}/calibre/config:/config - ${DOCKER_DIR}/calibre/ingest:/cwa-book-ingest - ${DOCKER_DIR}/calibre/books:/calibre-library ports: - 8083:8083 dns: - ${DNS_IP} restart: unless-stopped ## Immich (photo library management) immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:v1.130.2 volumes: - /media/immich:/usr/src/app/upload - ${DOCKER_DIR}/immich_db_dump:/db_dump env_file: - ${ENV_DIR}/immich.env environment: - PUID=1000 - PGID=1000 ports: - 2283:2283 depends_on: - redis - database devices: - /dev/dri:/dev/dri dns: - ${DNS_IP} restart: unless-stopped immich-machine-learning: container_name: immich_machine_learning image: ghcr.io/immich-app/immich-machine-learning:v1.130.2 volumes: - model-cache:/cache env_file: - ${ENV_DIR}/immich.env restart: unless-stopped redis: container_name: immich_redis image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 restart: unless-stopped database: container_name: immich_postgres image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 env_file: - ${ENV_DIR}/immich.env volumes: - ${DOCKER_DIR}/immich:/var/lib/postgresql/data restart: unless-stopped ## Invidious (youtube client) invidious: image: quay.io/invidious/invidious:latest container_name: invidious ports: - 9080:3000 env_file: - ${ENV_DIR}/invidious.env healthcheck: test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/trending || exit 1 interval: 30s timeout: 5s retries: 2 depends_on: - invidious-db - invidious-sighelper restart: unless-stopped invidious-sighelper: image: quay.io/invidious/inv-sig-helper:latest container_name: invidious-sighelper init: true command: ["--tcp", "0.0.0.0:12999"] ports: - 12999:12999 environment: - RUST_LOG=info cap_drop: - ALL read_only: true security_opt: - no-new-privileges:true restart: unless-stopped invidious-db: image: docker.io/library/postgres:14 container_name: invidious-db volumes: - ${DOCKER_DIR}/invidious/data:/var/lib/postgresql/data - ${DOCKER_DIR}/invidious/config/sql:/config/sql - ${DOCKER_DIR}/invidious/docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh env_file: - ${ENV_DIR}/invidious.env restart: unless-stopped ## Jellyfin (media server) jellyfin: image: lscr.io/linuxserver/jellyfin:latest container_name: jellyfin environment: - ${TZ} - PUID=1000 - PGID=1000 - JELLYFIN_PublishedServerUrl=https://watch.azpsen.com volumes: - ${DOCKER_DIR}/jellyfin:/config - ${DOCKER_DIR}/jellyfin/theme:/usr/share/jellyfin/web/theme - /media/jellyfin/Movies:/data/movies - /media/jellyfin/TV Shows:/data/tvshows - /media/jellyfin/Music:/data/music ports: - 8096:8096 - 7539:7539/udp - 1900:1900/udp devices: - /dev/dri:/dev/dri dns: - ${DNS_IP} restart: unless-stopped #---------------- UTILITIES ----------------# ## Actual (budget) actual_server: image: docker.io/actualbudget/actual-server:latest container_name: actual ports: - 5006:5006 volumes: - ${DOCKER_DIR}/actual:/data dns: - ${DNS_IP} restart: unless-stopped ## ConvertX (file converter) convertx: image: ghcr.io/c4illin/convertx container_name: convertx ports: - 9132:3000 volumes: - ${DOCKER_DIR}/convertx:/app/data env_file: - ${ENV_DIR}/convertx.env environment: - PUID=1000 - PGID=1000 restart: unless-stopped ## Dumbpad (simple notes) dumbpad: image: dumbwareio/dumbpad:latest container_name: dumbpad ports: - 3007:3000 volumes: - ${DOCKER_DIR}/dumbpad:/app/data env_file: - ${ENV_DIR}/dumbpad.env restart: unless-stopped ## Gitea gitea: image: docker.io/gitea/gitea:latest-rootless container_name: gitea user: "1001" volumes: - ${DOCKER_DIR}/gitea/data:/var/lib/gitea - ${DOCKER_DIR}/gitea/config:/etc/gitea - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - 3003:3000 - 2222:2222 dns: - ${DNS_IP} restart: unless-stopped ## Grocy (home inventory management) grocy: container_name: grocy image: lscr.io/linuxserver/grocy:latest environment: - ${TZ} - PUID=1000 - PGID=1000 volumes: - ${DOCKER_DIR}/grocy:/config ports: - 9283:80 restart: unless-stopped ## Hoarder (link aggregator) hoarder: image: ghcr.io/hoarder-app/hoarder:release container_name: hoarder env_file: - ${ENV_DIR}/hoarder.env volumes: - hoarder:/data ports: - 3017:3000 environment: - MEILI_ADDR=http://meilisearch:7700 - BROWSER_WEB_URL=http://chrome:9222 - DATA_DIR=/data dns: - ${DNS_IP} restart: unless-stopped chrome: image: gcr.io/zenika-hub/alpine-chrome:123 container_name: chrome command: - --no-sandbox - --disable-gpu - --disable-dev-shm-usage - --remote-debugging-address=0.0.0.0 - --remote-debugging-port=9222 - --hide-scrollbars dns: - ${DNS_IP} restart: unless-stopped meilisearch: image: getmeili/meilisearch:v1.11.1 container_name: meilisearch env_file: - ${ENV_DIR}/hoarder.env ports: - 7700:7700 environment: - MEILI_NO_ANALYTICS=true volumes: - meilisearch:/meili_data restart: unless-stopped ## Joplin (notes) joplin: image: joplin/server:latest container_name: joplin ports: - 22300:22300 env_file: - ${ENV_DIR}/joplin.env depends_on: - joplin-db dns: - ${DNS_IP} restart: unless-stopped joplin-db: image: postgres:15 container_name: joplin-db volumes: - ${DOCKER_DIR}/joplin:/var/lib/postgresql/data ports: - 5432:5432 environment: - POSTGRES_PASSWORD=d8t3nmcj3 - POSTGRES_USER=april - POSTGRES_DB=joplin restart: unless-stopped ## Kiwix (offline wiki) kiwix-serve: image: ghcr.io/kiwix/kiwix-serve container_name: kiwix-serve volumes: - /media/kiwix:/data ports: - 8765:8080 command: '*.zim' dns: - ${DNS_IP} restart: unless-stopped ## Link Stack linkstack: image: linkstackorg/linkstack container_name: linkstack env_file: - ${ENV_DIR}/linkstack.env ports: - 4000:80 dns: - ${DNS_IP} volumes: - linkstack:/htdocs restart: unless-stopped ## LubeLogger (car mileage tracker) lubelogger: image: ghcr.io/hargata/lubelogger:latest container_name: lubelogger volumes: - ${DOCKER_DIR}/lubelogger/data:/App/data - ${DOCKER_DIR}/lubelogger/keys:/root/.aspnet/DataProtection-Keys ports: - 8103:8080 env_file: - ${ENV_DIR}/lubelogger.env restart: unless-stopped ## Maloja (music listen tracking) maloja: image: krateng/maloja container_name: maloja ports: - 42010:42010 volumes: - ${DOCKER_DIR}/maloja:/mljdata environment: - PUID=1000 - PGID=1000 - MALOJA_DATA_DIRECTORY=/mljdata dns: - ${DNS_IP} restart: unless-stopped multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler env_file: - ${ENV_DIR}/multi-scrobbler.env volumes: - ${DOCKER_DIR}/multi-scrobbler:/config ports: - 9078:9078 restart: unless-stopped ## Miniflux (rss feed reader) miniflux: image: miniflux/miniflux:latest container_name: miniflux ports: - 8772:8080 depends_on: rss_db: condition: service_healthy env_file: - ${ENV_DIR}/miniflux.env healthcheck: test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"] dns: - ${DNS_IP} restart: unless-stopped rss_db: image: postgres:15 container_name: rss_db env_file: - ${ENV_DIR}/miniflux.env volumes: - miniflux-db:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "miniflux"] interval: 10s start_period: 30s restart: unless-stopped ## Paperless (document management) paperless: image: ghcr.io/paperless-ngx/paperless-ngx:latest container_name: paperless user: 1000:1000 depends_on: - paperless_broker ports: - 8143:8000 volumes: - paperless-data:/usr/src/paperless/data - paperless-media:/usr/src/paperless/media - ${DOCKER_DIR}/paperless/export:/usr/src/paperless/export - ${DOCKER_DIR}/paperless/consume:/usr/src/paperless/consume env_file: - ${ENV_DIR}/paperless.env restart: unless-stopped paperless_broker: image: docker.io/library/redis:7 container_name: paperless_broker volumes: - redis-data:/data restart: unless-stopped ## Stirling PDF (pdf utilities) stirling-pdf: container_name: stirling-pdf image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest ports: - 8710:8080 volumes: - ${DOCKER_DIR}/stirlingpdf/trainingData:/usr/share/tessdata - ${DOCKER_DIR}/stirlingpdf/extraConfigs:/configs - ${DOCKER_DIR}/stirlingpdf/customFiles:/customFiles/ - ${DOCKER_DIR}/stirlingpdf/logs:/logs/ - ${DOCKER_DIR}/stirlingpdf/pipeline:/pipeline/ environment: - ${TZ} - DOCKER_ENABLE_SECURITY=false - LANGS=en_US - DOCKER_ENABLE_SECURITY=true - SECURITY_ENABLELOGIN=true - SECURITY_CSRFDISABLED=false - SECURITY_INITIALLOGIN_USERNAME=april - SECURITY_INITIALLOGIN_PASSWORD="qYoK!FVom%bpg24Xd$@g" restart: unless-stopped ## Tandoor (recipe management) tandoor: container_name: tandoor image: vabene1111/recipes user: 1000:1000 env_file: - ${ENV_DIR}/tandoor.env volumes: - tandoor-server-config:/opt/recipes/nginx/conf.d - ${DOCKER_DIR}/tandoor/static:/opt/recipes/staticfiles - ${DOCKER_DIR}/tandoor/media:/opt/recipes/mediafiles depends_on: - tandoor-db dns: - ${DNS_IP} restart: unless-stopped tandoor-server: image: nginx:mainline-alpine container_name: tandoor-server ports: - 8554:80 env_file: - ${ENV_DIR}/tandoor.env volumes: - tandoor-server-config:/etc/nginx/conf.d:ro - ${DOCKER_DIR}/tandoor/static:/static:ro - ${DOCKER_DIR}/tandoor/media:/media:ro depends_on: - tandoor dns: - ${DNS_IP} restart: unless-stopped tandoor-db: container_name: tandoor-db image: postgres:16-alpine user: 1000:1000 env_file: - ${ENV_DIR}/tandoor.env volumes: - ${DOCKER_DIR}/tandoor/postgresql:/var/lib/postgresql/data restart: unless-stopped ## TinyHome (server dashboard) tinyhome: container_name: tinyhome image: azpsen/tinyhome:main environment: - REFRESH_INTERVAL=360 ports: - 3000:80 volumes: - ${DOCKER_DIR}/tinyhome:/config:rw dns: - ${DNS_IP} restart: unless-stopped ## Vaultwarden (password manager) vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden env_file: - ${ENV_DIR}/vaultwarden.env volumes: - ${DOCKER_DIR}/vaultwarden:/data ports: - 8912:80 dns: - ${DNS_IP} restart: unless-stopped # Wizarr (jellyfin invites) wizarr: container_name: wizarr image: ghcr.io/wizarrrr/wizarr:latest ports: - 5690:5690 volumes: - ${DOCKER_DIR}/wizarr/database:/data/database dns: - ${DNS_IP} restart: unless-stopped #---------------- MONITORING ----------------# ## Dozzle (docker logs) dozzle: container_name: dozzle image: amir20/dozzle:latest volumes: - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock:ro ports: - 9999:8080 restart: unless-stopped ## Glances (system monitor) glances: image: nicolargo/glances:latest container_name: glances pid: host volumes: - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock - /:/glances/root:ro environment: - "GLANCES_OPT=-w" ports: - 61208:61208 secrets: - source: glances_password target: /root/.config/glances/glances.pwd restart: unless-stopped ## Scrutiny (disk health monitoring) scrutiny: container_name: scrutiny image: ghcr.io/analogj/scrutiny:master-omnibus cap_add: - SYS_RAWIO ports: - 8181:8080 - 8086:8086 volumes: - /run/udev:/run/udev:ro - ${DOCKER_DIR}/scrutiny/config:/opt/scrutiny/config - ${DOCKER_DIR}/scrutiny/influxdb:/opt/scrutiny/influxdb devices: - /dev/sda:/dev/sda - /dev/sdb:/dev/sdb - /dev/sdc:/dev/sdc - /dev/sdd:/dev/sdd restart: unless-stopped ## Speedtest Tracker speedtest-tracker: image: lscr.io/linuxserver/speedtest-tracker:latest container_name: speedtest-tracker ports: - 8465:80 - 8466:443 env_file: - ${ENV_DIR}/speedtest.env volumes: - ${DOCKER_DIR}/speedtest-tracker:/config dns: - ${DNS_IP} restart: unless-stopped #---------------- NETWORKING ----------------# ## AdGuard Home (ad-blocking dns provider) adguard: image: adguard/adguardhome container_name: adguard network_mode: host volumes: - ${DOCKER_DIR}/adguard/working:/opt/adguardhome/work - ${DOCKER_DIR}/adguard/conf:/opt/adguardhome/conf restart: unless-stopped ## Cloudflared (tunnel service for outside web access) cloudflared: container_name: cloudflared image: cloudflare/cloudflared:latest network_mode: host volumes: - ${DOCKER_DIR}/cloudflared:/etc/cloudflared command: tunnel --no-autoupdate run env_file: - ${ENV_DIR}/cloudflared.env restart: unless-stopped ## Gluetun (vpn connector) gluetun: image: qmcgaw/gluetun:latest container_name: gluetun hostname: gluetun cap_add: - NET_ADMIN network_mode: bridge ports: # System/Utility Ports - 8888:8888/tcp # HTTP Proxy - 8388:8388/tcp # Shadowsocks - 8388:8388/udp # Shadowsocks - 6881:6881 # Torrent peers - 6881:6881/udp # Torrent peers - 8111:8000/tcp # HTTP Control # Service Ports - 9696:9696 # Prowlarr - 8080:8080 # qBittorrent - 8989:8989 # Radarr - 7878:7878 # Sonarr volumes: - ${DOCKER_DIR}/gluetun:/gluetun - /etc/localtime:/etc/localtime:ro devices: - /dev/net/tun:/dev/net/tun env_file: - ${ENV_DIR}/gluetun.env restart: unless-stopped #---------------- DOWNLOADING ----------------# ## Bazarr (subtitle downloading) bazarr: image: lscr.io/linuxserver/bazarr:latest container_name: bazarr environment: - puid=1000 - pgid=1000 - tz=america/chicago volumes: - ${DOCKER_DIR}/bazarr:/config - /media/jellyfin/movies:/movies - /media/jellyfin/tv shows:/tv ports: - 6767:6767 restart: unless-stopped ## Calibre Downloader (ebook downloading) calibre-dl: image: ghcr.io/calibrain/calibre-web-automated-book-downloader:latest container_name: calibre-dl environment: - FLASK_PORT=8084 - FLASK_DEBUG=false - CLOUDFLARE_PROXY_URL=http://cf-bypass:8000 - INGEST_DIR=/cwa-book-ingest - BOOK_LANGUAGE=en ports: - 8085:8084 volumes: - ${DOCKER_DIR}/calibre/ingest:/cwa-book-ingest dns: - ${DNS_IP} restart: unless-stopped ## Cloudflare challenge bypass (for accessing Anna's Archive) cf-bypass: image: ghcr.io/sarperavci/cloudflarebypassforscraping:latest container_name: cf-bypass dns: - ${DNS_IP} restart: unless-stopped ## openbooks (IRC-based ebook downloading) openbooks: image: evanbuss/openbooks:latest container_name: openbooks command: --persist --name azpsen ports: - 8087:80 volumes: # This works because calibre-web-automated fails to import .tmp files - ${DOCKER_DIR}/calibre/ingest/:/books dns: - ${DNS_IP} restart: unless-stopped ## Prowlarr (torrent indexer management) prowlarr: image: ghcr.io/linuxserver/prowlarr:nightly container_name: prowlarr network_mode: "service:gluetun" environment: - ${TZ} - PUID=1000 - PGID=1000 volumes: - ${DOCKER_DIR}/prowlarr:/config restart: unless-stopped ## QBittorrent (torrent client) qbittorrent: image: ghcr.io/linuxserver/qbittorrent:latest container_name: qbittorrent network_mode: "service:gluetun" environment: - ${TZ} - PUID=1000 - PGID=1000 - WEBUI_PORT=8080 volumes: - ${DOCKER_DIR}/qbittorrent/config:/config - ${DOCKER_DIR}/qbittorrent/downloads:/downloads - /media/downloads:/ext_dl restart: unless-stopped ## Radarr (movie downloading) radarr: image: ghcr.io/linuxserver/radarr:latest container_name: radarr network_mode: "service:gluetun" environment: - ${TZ} - PUID=1000 - PGID=1000 volumes: - ${DOCKER_DIR}/radarr:/config - /media/jellyfin/Movies:/Movies #optional - ${DOCKER_DIR}/qbittorrent/downloads:/downloads #optional restart: unless-stopped ## Sonarr (tv show downloading) sonarr: image: ghcr.io/linuxserver/sonarr:latest container_name: sonarr network_mode: "service:gluetun" environment: - ${TZ} - PUID=1000 - PGID=1000 - DOCKER_MODS=ghcr.io/gilbn/theme.park:sonarr - TP_ADDON=sonarr-darker - TP_THEME=dark volumes: - ${DOCKER_DIR}/sonarr:/config - /media/jellyfin/TV Shows:/TV Shows - ${DOCKER_DIR}/qbittorrent/downloads:/downloads restart: unless-stopped #---------------- DOCKER ----------------# secrets: glances_password: file: ${DOCKER_DIR}/secrets/glances_password volumes: hoarder: joplindb: linkstack: meilisearch: model-cache: miniflux-db: paperless-data: paperless-media: redis-data: tandoor-server-config: