homelab/docker-compose.yml
2025-04-27 20:20:04 -05:00

757 lines
18 KiB
YAML
Executable File

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:
- ${ABS_BOOKS}:/audiobooks
- ${ABS_PODS}:/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
## Immich (photo library management)
immich_server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:v1.132.1
volumes:
- ${IMMICH_LIBRARY}:/usr/src/app/upload
env_file:
- ${ENV_DIR}/immich.env
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
ports:
- 2283:2283
depends_on:
- immich_redis
- immich_db
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.132.1
volumes:
- model-cache:/cache
env_file:
- ${ENV_DIR}/immich.env
restart: unless-stopped
immich_redis:
container_name: immich_redis
image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
restart: unless-stopped
immich_db:
container_name: immich_db
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:
container_name: invidious
image: quay.io/invidious/invidious:latest
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:
container_name: invidious-sighelper
image: quay.io/invidious/inv-sig-helper:latest
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:
container_name: invidious-db
image: docker.io/library/postgres:14
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:
container_name: jellyfin
image: lscr.io/linuxserver/jellyfin:latest
environment:
- TZ=${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
- ${JF_MOVIES}:/data/movies
- ${JF_SHOWS}:/data/tvshows
- ${JF_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:
container_name: actual
image: docker.io/actualbudget/actual-server:latest
ports:
- 5006:5006
volumes:
- ${DOCKER_DIR}/actual:/data
dns:
- ${DNS_IP}
restart: unless-stopped
## Baikal (calendar/contacts)
baikal:
container_name: baikal
image: ckulka/baikal:nginx
ports:
- 8391:80
volumes:
- ${DOCKER_DIR}/baikal/config:/var/www/baikal/config
- ${DOCKER_DIR}/baikal/data:/var/www/baikal/Specific
restart: unless-stopped
## Backrest (backup GUI)
backrest:
container_name: backrest
image: garethgeorge/backrest:latest
hostname: backrest
volumes:
- ${DOCKER_DIR}/backrest/data:/data
- ${DOCKER_DIR}/backrest/config:/config
- ${DOCKER_DIR}/backrest/cache:/cache
- ${DOCKER_DIR}/backrest/tmp:/tmp
- ${DOCKER_DIR}:/userdata/docker
- ${IMMICH_LIBRARY}:/userdata/immich
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=${TZ}
ports:
- 9898:9898
restart: unless-stopped
## ConvertX (file converter)
convertx:
container_name: convertx
image: ghcr.io/c4illin/convertx
ports:
- 9132:3000
volumes:
- ${DOCKER_DIR}/convertx:/app/data
env_file:
- ${ENV_DIR}/convertx.env
environment:
- PUID=1000
- PGID=1000
restart: unless-stopped
## Gitea
gitea:
container_name: gitea
image: docker.io/gitea/gitea:latest-rootless
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
## IT Tools (misc utilities)
it-tools:
container_name: it-tools
image: corentinth/it-tools:latest
ports:
- 5734:80
restart: unless-stopped
## Kiwix (offline wiki)
kiwix-serve:
container_name: kiwix-serve
image: ghcr.io/kiwix/kiwix-serve
volumes:
- ${KIWIX_DIR}:/data
ports:
- 8765:8080
command: '*.zim'
dns:
- ${DNS_IP}
restart: unless-stopped
## LubeLogger (car mileage tracker)
lubelogger:
container_name: lubelogger
image: ghcr.io/hargata/lubelogger:latest
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:
container_name: maloja
image: krateng/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:
container_name: multi-scrobbler
image: foxxmd/multi-scrobbler
env_file:
- ${ENV_DIR}/scrobbler.env
volumes:
- ${DOCKER_DIR}/scrobbler:/config
ports:
- 9078:9078
restart: unless-stopped
## Memos (simple note app)
memos:
container_name: memos
image: neosmemo/memos:stable
volumes:
- ${DOCKER_DIR}/memos:/var/opt/memos
ports:
- 5230:5230
restart: unless-stopped
## Miniflux (rss feed reader)
miniflux:
container_name: miniflux
image: miniflux/miniflux:latest
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:
container_name: rss_db
image: postgres:15
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:
container_name: paperless
image: ghcr.io/paperless-ngx/paperless-ngx:latest
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:
container_name: paperless_broker
image: docker.io/library/redis:7
volumes:
- redis-data:/data
restart: unless-stopped
## PicoShare (file sharing tool)
picoshare:
container_name: picoshare
image: mtlynch/picoshare
env_file:
- ${ENV_DIR}/picoshare.env
ports:
- 4001:4001
command: -db /data/store.db
volumes:
- ${DOCKER_DIR}/picoshare:/data
dns:
- ${DNS_IP}
restart: unless-stopped
## SeaFile (cloud drive)
seafile:
container_name: seafile
image: seafileltd/seafile-mc:11.0-latest
ports:
- 8623:80
volumes:
- ${DOCKER_DIR}/seafile/data:/shared
env_file:
- ${ENV_DIR}/seafile.env
environment:
- TIME_ZONE=${TZ}
depends_on:
- seafile_db
- seafile_cache
restart: unless-stopped
seafile_db:
container_name: seafile-mysql
image: mariadb:10.11
env_file:
- ${ENV_DIR}/seafile.env
volumes:
- ${DOCKER_DIR}/seafile/db:/var/lib/mysql
restart: unless-stopped
seafile_cache:
container_name: seafile_cache
image: memcached:1.6.18
entrypoint: memcached -m 256
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=${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:
container_name: tandoor-server
image: nginx:mainline-alpine
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:
container_name: vaultwarden
image: vaultwarden/server:latest
env_file:
- ${ENV_DIR}/vaultwarden.env
volumes:
- ${DOCKER_DIR}/vaultwarden:/data
ports:
- 8912:80
dns:
- ${DNS_IP}
restart: unless-stopped
## Wallabag (bookmark manager)
wallabag:
container_name: wallabag
image: wallabag/wallabag
env_file:
- ${ENV_DIR}/wallabag.env
ports:
- 5438:80
volumes:
- ${DOCKER_DIR}/wallabag/images:/var/www/wallabag/web/assets/images
- ${DOCKER_DIR}/wallabag/data:/var/www/wallabag/data
dns:
- ${DNS_IP}
restart: unless-stopped
## Personal Website
webserver:
container_name: azpsen
image: lipanski/docker-static-website:latest
ports:
- 4000:3000
volumes:
- ${DOCKER_DIR}/azpsen/static:/home/static
- ${DOCKER_DIR}/azpsen/httpd.conf:/home/static/httpd.conf:ro
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
## Workout Tracker
workout-tracker:
container_name: workout-tracker
image: ghcr.io/jovandeginste/workout-tracker:master
ports:
# Host Port:Container Port
- 5021:8080
volumes:
- ${DOCKER_DIR}/workout-tracker:/data
env_file:
- ${ENV_DIR}/workout-tracker.env
restart: unless-stopped
#---------------- MONITORING ----------------#
## Beszel (system monitoring)
beszel:
container_name: beszel
image: henrygd/beszel
env_file:
- ${ENV_DIR}/beszel.env
ports:
- 2493:8090
volumes:
- ${DOCKER_DIR}/beszel/data:/beszel_data
- ${DOCKER_DIR}/beszel/socket:/beszel_socket
restart: unless-stopped
beszel-agent:
container_name: beszel-agent
image: henrygd/beszel-agent:latest
env_file:
- ${ENV_DIR}/beszel.env
volumes:
- ${DOCKER_DIR}/beszel/socket:/beszel_socket
- /var/run/docker.sock:/var/run/docker.sock:ro
- /media:/extra-filesystems/media:ro
network_mode: host
restart: unless-stopped
## Dozzle (docker logs)
dozzle:
container_name: dozzle
image: amir20/dozzle:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 9999:8080
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
## MySpeed (internet speed tracker)
myspeed:
container_name: myspeed
image: germannewsmaker/myspeed
volumes:
- ${DOCKER_DIR}/myspeed:/myspeed/data
ports:
- 5216:5216
dns:
- ${DNS_IP}
restart: unless-stopped
#---------------- NETWORKING ----------------#
## AdGuard Home (ad-blocking dns provider)
adguard:
container_name: adguard
image: adguard/adguardhome
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:
container_name: gluetun
image: qmcgaw/gluetun:latest
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:
container_name: bazarr
image: lscr.io/linuxserver/bazarr:latest
environment:
- puid=1000
- pgid=1000
- tz=america/chicago
volumes:
- ${DOCKER_DIR}/bazarr:/config
- ${JF_MOVIES}:/movies
- ${JF_SHOWS}:/tv
ports:
- 6767:6767
restart: unless-stopped
## Prowlarr (torrent indexer management)
prowlarr:
container_name: prowlarr
image: ghcr.io/linuxserver/prowlarr:nightly
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
volumes:
- ${DOCKER_DIR}/prowlarr:/config
restart: unless-stopped
## QBittorrent (torrent client)
qbittorrent:
container_name: qbittorrent
image: ghcr.io/linuxserver/qbittorrent:latest
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
- WEBUI_PORT=8080
volumes:
- ${DOCKER_DIR}/qbittorrent/config:/config
- ${DOCKER_DIR}/qbittorrent/downloads:/downloads
- ${QB_EXT_DL}:/ext_dl
restart: unless-stopped
## Radarr (movie downloading)
radarr:
container_name: radarr
image: ghcr.io/linuxserver/radarr:latest
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=1000
- PGID=1000
volumes:
- ${DOCKER_DIR}/radarr:/config
- ${JF_MOVIES}:/Movies #optional
- ${DOCKER_DIR}/qbittorrent/downloads:/downloads #optional
restart: unless-stopped
## Sonarr (tv show downloading)
sonarr:
container_name: sonarr
image: ghcr.io/linuxserver/sonarr:latest
network_mode: "service:gluetun"
environment:
- TZ=${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
- ${JF_SHOWS}:/TV Shows
- ${DOCKER_DIR}/qbittorrent/downloads:/downloads
restart: unless-stopped
#---------------- DOCKER ----------------#
volumes:
hoarder:
joplindb:
meilisearch:
model-cache:
miniflux-db:
paperless-data:
paperless-media:
redis-data:
tandoor-server-config: