services: # Media Management (Arr Stack) bazarr: image: lscr.io/linuxserver/bazarr:latest container_name: bazarr environment: - PUID=1000 - PGID=1000 - TZ=${TZ} volumes: - /docker-local/Arrs/Bazarr/config:/config - /data/:/data/ ports: - 6767:6767 networks: arr_network: ipv4_address: 172.20.0.6 restart: unless-stopped flaresolverr: image: ghcr.io/flaresolverr/flaresolverr:latest container_name: flaresolverr environment: - TZ=${TZ} ports: - 8191:8191 networks: arr_network: ipv4_address: 172.20.0.8 restart: unless-stopped jellyfin: image: jellyfin/jellyfin container_name: jellyfin environment: - TZ=${TZ} - PUID=1000 - PGID=1000 - JELLYFIN_PublishedServerUrl=${JELLYFIN_URL} volumes: - /docker-local/Arrs/Jellyfin/config:/config - /docker-local/Arrs/Jellyfin/cache:/cache - /data:/data - /dev/dri/:/dev/dri/ ports: - 8096:8096 group_add: - "104" restart: 'unless-stopped' jellyseerr: image: fallenbagel/jellyseerr:latest container_name: jellyseerr environment: - LOG_LEVEL=debug - TZ=${TZ} volumes: - ../docker-local/Arrs/Jellyseerr/config:/app/config - /data/torrents:/downloads ports: - 5055:5055 networks: arr_network: ipv4_address: 172.20.0.14 restart: unless-stopped lidarr: image: lscr.io/linuxserver/lidarr:latest container_name: lidarr environment: - PUID=1000 - PGID=1000 - TZ=${TZ} volumes: - /docker-local/Arrs/Lidarr/config:/config - /data/:/data/ - /data/torrents/:/downloads ports: - 8686:8686 networks: arr_network: ipv4_address: 172.20.0.7 restart: unless-stopped prowlarr: image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr environment: - TZ=${TZ} - PUID=1000 - PGID=1000 volumes: - /docker-local/Arrs/Prowlarr/config:/config ports: - 9696:9696 networks: arr_network: ipv4_address: 172.20.0.4 restart: unless-stopped qbittorrent: image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent environment: - PUID=1000 - PGID=1000 - TZ=${TZ} - WEBUI_PORT=8080 volumes: - ./services/qBittorrent/config:/config - /data/torrents:/downloads ports: - 7070:8080 - 56881:6881 - 56881:6881/udp networks: arr_network: ipv4_address: 172.20.0.2 restart: unless-stopped radarr: image: lscr.io/linuxserver/radarr:latest container_name: radarr environment: - TZ=${TZ} - PUID=1000 - PGID=1000 volumes: - /docker-local/Arrs/Radarr/config:/config - /data/:/data/ - /data/torrents/:/downloads ports: - 7878:7878 networks: arr_network: ipv4_address: 172.20.0.5 restart: unless-stopped sonarr: image: lscr.io/linuxserver/sonarr:latest container_name: sonarr environment: - TZ=${TZ} - PUID=1000 - PGID=1000 volumes: - /docker-local/Arrs/Sonarr/config:/config - /data:/data - /data/torrents:/downloads ports: - 8989:8989 networks: arr_network: ipv4_address: 172.20.0.3 restart: unless-stopped # Music & Scrobbling beets: image: lscr.io/linuxserver/beets:latest container_name: beets environment: - PUID=1000 - PGID=1000 - TZ=${TZ} volumes: - /docker-local/beets/config:/config - /data/music:/music - /data/downloads:/downloads ports: - 8337:8337 restart: unless-stopped maloja: image: "krateng/maloja:latest" container_name: maloja environment: - MALOJA_FORCE_PASSWORD=${MALOJA_FORCE_PASSWORD} volumes: - "./services/maloja/config:/etc/maloja" - "./services/maloja/data:/var/lib/maloja" - "./services/maloja/logs:/var/log/maloja" ports: - "42010:42010" restart: unless-stopped multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=${TZ} - PUID=1000 - PGID=1000 - BASE_URL=${SCROBBLE_URL} # - SPOTIFY_CLIENT_ID=${SPOTIFY_CLIENT_ID} # - SPOTIFY_CLIENT_SECRET=${SPOTIFY_CLIENT_SECRET} # - SPOTIFY_REDIRECT_URI=${SPOTIFY_REDIRECT_URI} - YTM_COOKIE=${YTM_COOKIE} # - YTM_REDIRECT_URI=${YTM_REDIRECT_URI} # - YTM_CLIENT_ID=${YTM_CLIENT_ID} # - YTM_CLIENT_SECRET=${YTM_CLIENT_SECRET} - JELLYFIN_URL=${JELLYFIN_URL} - JELLYFIN_APIKEY=${JELLYFIN_APIKEY} - JELLYFIN_USER=${JELLYFIN_USER} - LZ_TOKEN=${LZ_TOKEN} - LZ_USER=${LZ_USER} - MALOJA_URL=${MALOJA_URL} - MALOJA_API_KEY=${MALOJA_API_KEY} volumes: - "./services/scrobble/config:/config" ports: - "9078:9078" restart: unless-stopped lidarr-importer-api: image: gitea.kansaigaijin.com/kansaigaijin/majola-lidarr-importer:latest container_name: maloja-lidarr-importer-api volumes: - ./logs:/app/logs ports: - "5110:5000" environment: - SOURCE_API_URL=${SOURCE_API_URL} - SOURCE_API_KEY=${SOURCE_API_KEY} restart: "unless-stopped" pinchflat: image: ghcr.io/kieraneglin/pinchflat:latest environment: - TZ=${TZ} ports: - '8945:8945' volumes: - /docker-local/pinchflat/config:/config - /data/torrents/:/downloads slskd: image: slskd/slskd container_name: slskd hostname: slskd # user: 1000:1000 environment: - TZ=${TZ} - SLSKD_REMOTE_CONFIGURATION=true - SLSKD_USERNAME=${SLSKD_USERNAME} - SLSKD_PASSWORD=${SLSKD_PASSWORD} ports: - 5030:5030 - 5031:5031 - 50300:50300 volumes: - /docker-local/slskd:/app - /data:/data - /data/torrents/slskd_downloads:/downloads - /data/torrents/incomplete:/incomplete restart: unless-stopped soularr: image: mrusse08/soularr:latest container_name: soularr hostname: soularr user: 1000:1000 environment: - TZ=${TZ} - SCRIPT_INTERVAL=300 volumes: - /data/torrents/downloads:/downloads - ./Services/soularr:/data restart: unless-stopped # Document Management broker: image: docker.io/library/redis:8 container_name: Paperless-broker volumes: - redisdata:/data restart: unless-stopped db: image: docker.io/library/mariadb:11 container_name: Paperless-db environment: MARIADB_HOST: paperless MARIADB_DATABASE: paperless MARIADB_USER: paperless MARIADB_PASSWORD: paperless MARIADB_ROOT_PASSWORD: paperless volumes: - dbdata:/var/lib/mysql healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p$$MARIADB_ROOT_PASSWORD"] interval: 10s timeout: 5s retries: 10 start_period: 30s restart: unless-stopped gotenberg: image: docker.io/gotenberg/gotenberg:8.20 container_name: Paperless-gotenberg command: - "gotenberg" - "--chromium-disable-javascript=true" - "--chromium-allow-list=file:///tmp/.*" restart: unless-stopped onlyoffice: image: onlyoffice/documentserver:latest container_name: onlyoffice volumes: - onlyoffice:/app/data ports: - "8054:80" restart: unless-stopped paperless-ai: image: clusterzx/paperless-ai container_name: Paperless-ai environment: - PUID=1000 - PGID=1000 - RAG_SERVICE_URL=http://localhost:8000 - RAG_SERVICE_ENABLED=true volumes: - aidata:/app/data ports: - "3040:3000" depends_on: - webserver cap_drop: - ALL security_opt: - no-new-privileges=true restart: unless-stopped stirling-pdf: image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest container_name: Stirling-PDF environment: DISABLE_ADDITIONAL_FEATURES: "true" SECURITY_ENABLELOGIN: "false" LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID" SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF UI_HOMEDESCRIPTION: Stirling-PDF UI_APPNAMENAVBAR: Stirling-PDF SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" SHOW_SURVEY: "true" volumes: - ./services/stirling/latest/data:/usr/share/tessdata:rw - ./services/stirling/latest/config:/configs:rw - ./services/stirling/latest/logs:/logs:rw ports: - "8090:8080" deploy: resources: limits: memory: 4G healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -qv 'Please sign in'"] interval: 5s timeout: 10s retries: 16 restart: unless-stopped tika: image: docker.io/apache/tika:latest container_name: Paperless-tika restart: unless-stopped webserver: image: ghcr.io/paperless-ngx/paperless-ngx:latest container_name: Paperless-webserver environment: PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY} PAPERLESS_OCR_LANGUAGE: eng PAPERLESS_TIME_ZONE: Pacific/Auckland PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_DBENGINE: mariadb PAPERLESS_DBHOST: db PAPERLESS_DBUSER: paperless PAPERLESS_DBPASS: paperless PAPERLESS_DBPORT: 3306 PAPERLESS_URL: ${PAPERLESS_URL} PAPERLESS_TIKA_ENABLED: 1 PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 volumes: - ./Services/paperless/data:/usr/src/paperless/data - ./Services/paperless/media:/usr/src/paperless/media - ./Services/paperless/export:/usr/src/paperless/export - ./Services/paperless/consume:/usr/src/paperless/consume ports: - "8100:8000" depends_on: db: condition: service_healthy broker: condition: service_started gotenberg: condition: service_started tika: condition: service_started restart: unless-stopped # Personal Applications adventurelogdb: image: postgis/postgis:15-3.3 container_name: adventurelog-db environment: POSTGRES_DB: database POSTGRES_USER: adventure POSTGRES_PASSWORD: ${ADVENTURELOG_DB_PASSWORD} volumes: - adventurelog_postgres_data:/var/lib/postgresql/data/ restart: unless-stopped adventurelogserver: image: ghcr.io/seanmorley15/adventurelog-backend:latest container_name: adventurelog-backend environment: - PGHOST=adventurelogdb - PGDATABASE=database - PGUSER=adventure - PGPASSWORD=${ADVENTURELOG_DB_PASSWORD} - SECRET_KEY=${ADVENTURELOG_DB_SECRETKEY} - DJANGO_ADMIN_USERNAME=${ADVENTURELOG_DJANGO_USERNAME} - DJANGO_ADMIN_PASSWORD=${ADVENTURELOG_DJANGO_PASSWORD} - DJANGO_ADMIN_EMAIL=${ADVENTURELOG_DJANGO_EMAIL} - PUBLIC_URL=${ADVENTURELOG_URL_BACKEND} - CSRF_TRUSTED_ORIGINS=${ADVENTURELOG_TRUSTED_ORIGINS} - DEBUG=False - FRONTEND_URL=${ADVENTURELOG_URL} volumes: - adventurelog_adventurelog_media:/code/media/ ports: - "8016:80" depends_on: - adventurelogdb restart: unless-stopped adventurelogweb: image: ghcr.io/seanmorley15/adventurelog-frontend:latest container_name: adventurelog-frontend environment: - PUBLIC_SERVER_URL=http://adventurelogserver:8000 - ORIGIN=${ADVENTURELOG_URL} - BODY_SIZE_LIMIT=Infinity ports: - "8015:3000" depends_on: - adventurelogserver restart: unless-stopped grampsweb: &grampsweb image: ghcr.io/gramps-project/grampsweb:latest container_name: Gramps environment: GRAMPSWEB_TREE: "Gramps Web" GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://grampsweb_redis:6379/0" GRAMPSWEB_CELERY_CONFIG__result_backend: "redis://grampsweb_redis:6379/0" GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://grampsweb_redis:6379/1 volumes: - /docker-local/gramps/gramps_users:/app/users - /docker-local/gramps/gramps_index:/app/indexdir - /docker-local/gramps/gramps_thumb_cache:/app/thumbnail_cache - /docker-local/gramps/gramps_cache:/app/cache - /docker-local/gramps/gramps_secret:/app/secret - /docker-local/gramps/gramps_db:/root/.gramps/grampsdb - /docker-local/gramps/gramps_media:/app/media - /docker-local/gramps/gramps_tmp:/tmp ports: - "5511:5000" depends_on: - grampsweb_redis restart: always grampsweb_celery: <<: *grampsweb container_name: grampsweb_celery command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=2 ports: [] depends_on: - grampsweb_redis grampsweb_redis: image: docker.io/library/redis:7.2.4-alpine container_name: grampsweb_redis restart: always kitchenowl-front: container_name: kitchenowl-frontend image: tombursch/kitchenowl-web:latest environment: - BACK_URL=kitchenowl-backend:5000 ports: - "8081:80" depends_on: - kitchenowl-back restart: unless-stopped kitchenowl-back: container_name: kitchenowl-backend image: tombursch/kitchenowl-backend:latest environment: - JWT_SECRET_KEY=${KO_JWT_SECRET_KEY} - FRONT_URL=${KITCHENOWL_FRONT_URL} volumes: - /docker-local/kitchenowl_data:/data restart: unless-stopped litellm: image: litellm:local # use your local amd64 build container_name: litellm restart: unless-stopped ports: - "4000:4000" volumes: - ./services/litellm/litellm-config.yaml:/app/config.yaml - ./services/litellm/litellm-logs:/app/logs environment: - LITELLM_CONFIG=/app/config.yaml - GROQ_API_KEY=${GROQ_API_KEY} - DATABASE_URL=postgresql://litellm:litellm_pass@litellm-postgres:5432/litellm_db - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY} - LITELLM_SALT_KEY=${LITELLM_SALT_KEY} - STORE_MODEL_IN_DB=True litellm-postgres: image: postgres:15 container_name: litellm-postgres restart: unless-stopped environment: POSTGRES_USER: litellm POSTGRES_PASSWORD: litellm_pass POSTGRES_DB: litellm_db volumes: - /docker-local/litellm/postgres-data:/var/lib/postgresql/data obsidian: image: 'ghcr.io/sytone/obsidian-remote:latest' container_name: obsidian-remote environment: - PUID=1000 - PGID=1000 - TZ=${TZ} - DOCKER_MODS=linuxserver/mods:universal-git volumes: - /docker-local/obsidian/vaults:/vaults - /docker-local/obsidian/config:/config ports: - 8181:8080 - 8443:8443 restart: unless-stopped redbot: container_name: redbot image: phasecorex/red-discordbot volumes: - /docker-local/redbot:/data environment: - TOKEN=${REDBOT_TOKEN} - PREFIX=! - TZ=${TZ} - PUID=1000 restart: unless-stopped syncthing: image: syncthing/syncthing container_name: syncthing hostname: syncthing environment: - PUID=1000 - PGID=1000 volumes: - /docker-local/syncthing:/var/syncthing - /docker-local/obsidian/vaults:/var/syncthing/obsidian ports: - 8384:8384 # Web UI - 22000:22000/tcp # TCP file transfers - 22000:22000/udp # QUIC file transfers - 21027:21027/udp # Receive local discovery broadcasts restart: unless-stopped # System Utilities dockerproxy: image: ghcr.io/tecnativa/docker-socket-proxy:latest container_name: dockerproxy environment: - CONTAINERS=1 # Allow access to viewing containers - SERVICES=1 # Allow access to viewing services (necessary when using Docker Swarm) - TASKS=1 # Allow access to viewing tasks (necessary when using Docker Swarm) - POST=0 # Disallow any POST operations (effectively read-only) volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only ports: - 127.0.0.1:2375:2375 restart: unless-stopped filebrowser: image: hurlenko/filebrowser container_name: filebrowser user: "root:root" environment: - FB_BASEURL=/filebrowser volumes: - ./services/filebrowser/data:/data - ./services/filebrowser/config:/config - /home/jamie:/data/home - /data:/data/media - /docker:/docker - /docker-local:/docker-local ports: - 6633:8080 restart: unless-stopped foundry: build: ./Services/foundry-login container_name: foundry-login environment: - SSH_HOST=${FOUNDRY_SSH_HOST} - SSH_PORT=${FOUNDRY_SSH_PORT} - SSH_USER=${FOUNDRY_SSH_USER} - SSH_PASSWORD=${FOUNDRY_SSH_PASSWORD} # - SSH_KEY_PATH=${FOUNDRY_SSH_KEY_PATH} - FOUNDRY_LOG_PATH=${FOUNDRY_LOG_PATH} - SLEEP_SECONDS=30 - FOUNDRY_URL=${FOUNDRY_URL} - FOUNDRY_API_TOKEN=${FOUNDRY_API} - LOG_FILES_TO_CHECK=1 ports: - "5234:5000" command: ["sh", "/app/entrypoint.sh"] restart: unless-stopped glances: image: nicolargo/glances:ubuntu-latest-full container_name: Glances pid: host network_mode: host environment: - "GLANCES_OPT=-w" volumes: - /var/run/docker.sock:/var/run/docker.sock - /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock - /docker:/docker:ro - /docker-local:/docker-local:ro - /data:/data:ro # For intel iGPUs devices: - /dev/dri:/dev/dri restart: unless-stopped hbbr: image: rustdesk/rustdesk-server:latest container_name: hbbr command: hbbr environment: - PUID=1000 - PGID=1000 volumes: - /docker-local/rustdesk/data:/root network_mode: "host" restart: unless-stopped hbbs: image: rustdesk/rustdesk-server:latest container_name: hbbs command: hbbs environment: - PUID=1000 - PGID=1000 volumes: - /docker-local/rustdesk/data:/root network_mode: "host" depends_on: - hbbr restart: unless-stopped homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage environment: - PUID=1000 - PGID=1000 - TZ=${TZ} - HOMEPAGE_ALLOWED_HOSTS=${HOMEPAGE_ALLOWED_HOSTS} volumes: - ./services/Homepage/config/images:/app/public/images - ./services/Homepage/config/icons:/app/public/icons - ./services/Homepage/config:/app/config ports: - 7575:3000 restart: unless-stopped iperf: image: networkstatic/iperf3 container_name: iperf3-server stdin_open: true # docker run -i tty: true # docker run -t command: -s ports: - '5201:5201' restart: unless-stopped newt: image: fosrl/newt container_name: newt environment: - PANGOLIN_ENDPOINT=https://png.kansaigaijin.com - NEWT_ID=${NEWT_ID} - NEWT_SECRET=${NEWT_SECRET} restart: unless-stopped racknerd-api-converter: build: ./Services/racknerd-converter container_name: RacknerdConverter environment: - RACKNERD_API_KEY=${RACKNERD_API_KEY} - RACKNERD_API_HASH=${RACKNERD_API_HASH} - RACKNERD_VSERVER_ID=${RACKNERD_VSERVER_ID} - RACKNERD_BASE_URL=https://nerdvm.racknerd.com/api/client/command.php - UPDATE_INTERVAL=1800 - HOST=0.0.0.0 - PORT=5000 ports: - "5000:5000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s restart: unless-stopped speedtest-db: image: mariadb:11 container_name: speedtest-db environment: - MYSQL_DATABASE=speedtest_tracker - MYSQL_USER=speedtest_tracker - MYSQL_PASSWORD=speedtest - MYSQL_RANDOM_ROOT_PASSWORD=true volumes: - /docker-local/speedtest-tracker/db:/var/lib/mysql healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 5s retries: 3 timeout: 5s restart: always speedtest-tracker: image: lscr.io/linuxserver/speedtest-tracker:latest container_name: speedtest-tracker environment: - PUID=1000 - PGID=1000 - APP_KEY=${SPEEDTEST_APP_KEY} - DB_CONNECTION=mariadb - DB_HOST=speedtest-db - DB_PORT=3306 - DB_DATABASE=speedtest_tracker - DB_USERNAME=speedtest_tracker - DB_PASSWORD=speedtest - APP_DEBUG=true - SPEEDTEST_SCHEDULE=30 * * * * - SPEEDTEST_SERVERS=7317 - PUBLIC_DASHBOARD=true volumes: - /docker-local/speedtest-tracker/data:/config ports: - 8180:80 - 8143:443 depends_on: speedtest-db: condition: service_healthy restart: unless-stopped watchtower: image: containrrr/watchtower container_name: watchtower environment: - WATCHTOWER_CLEANUP=true - WATCHTOWER_POLL_INTERVAL=86400 volumes: - /var/run/docker.sock:/var/run/docker.sock networks: arr_network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 database_network: driver: bridge ipam: config: - subnet: 172.21.0.0/16 volumes: aidata: dbdata: redisdata: adventurelog_postgres_data: external: true adventurelog_adventurelog_media: external: true onlyoffice: