diff --git a/.env b/.env new file mode 100644 index 0000000..b1d746a --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +# Base directory for docker-compose +DOCKER_DIR=/docker + +# Directory for env files +ENV_DIR=/docker/env + +# The IP of this server in the tailscale network +DNS_IP=100.111.0.126 + +# Time zone +TZ=America/Chicago diff --git a/.gitignore b/.gitignore index 8f19346..1b80558 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ * !docker-compose.yml +!.env !readme.md diff --git a/docker-compose.yml b/docker-compose.yml index 090b9fc..6bdc5a0 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,8 @@ services: - /media/audiobooks:/audiobooks - /media/audiobooks-pt:/audiobooks-pt - /media/podcasts:/podcasts - - /docker/audiobookshelf/config:/config - - /docker/audiobookshelf/metadata:/metadata + - ${DOCKER_DIR}/audiobookshelf/config:/config + - ${DOCKER_DIR}/audiobookshelf/metadata:/metadata dns: - ${DNS_IP} restart: unless-stopped @@ -36,14 +36,14 @@ services: image: crocodilestick/calibre-web-automated:latest container_name: calibre-web environment: + - ${TZ} - PUID=1000 - PGID=100 - - TZ=America/Chicago - DOCKER_MODS=lscr.io/linuxserver/mods:universal-calibre-v7.16.0 volumes: - - /docker/calibre/config:/config - - /docker/calibre/ingest:/cwa-book-ingest - - /docker/calibre/books:/calibre-library + - ${DOCKER_DIR}/calibre/config:/config + - ${DOCKER_DIR}/calibre/ingest:/cwa-book-ingest + - ${DOCKER_DIR}/calibre/books:/calibre-library ports: - 8083:8083 dns: @@ -56,9 +56,9 @@ services: image: ghcr.io/immich-app/immich-server:v1.129.0 volumes: - /media/immich:/usr/src/app/upload - - /docker/immich_db_dump:/db_dump + - ${DOCKER_DIR}/immich_db_dump:/db_dump env_file: - - /docker/env/immich.env + - ${ENV_DIR}/immich.env environment: - PUID=1000 - PGID=1000 @@ -78,7 +78,7 @@ services: volumes: - model-cache:/cache env_file: - - /docker/env/immich.env + - ${ENV_DIR}/immich.env restart: unless-stopped redis: container_name: immich_redis @@ -88,23 +88,62 @@ services: container_name: immich_postgres image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 env_file: - - /docker/env/immich.env + - ${ENV_DIR}/immich.env volumes: - - /docker/immich:/var/lib/postgresql/data + - ${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 +# depends_on: +# - invidious-db +# - sighelper +# restart: unless-stopped +# 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: +# - ${TZ} +# - 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 - - TZ=America/Chicago - JELLYFIN_PublishedServerUrl=https://watch.azpsen.com volumes: - - /docker/jellyfin:/config - - /docker/jellyfin/theme:/usr/share/jellyfin/web/theme + - ${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 @@ -128,7 +167,7 @@ services: ports: - 5006:5006 volumes: - - /docker/actual:/data + - ${DOCKER_DIR}/actual:/data dns: - ${DNS_IP} restart: unless-stopped @@ -139,8 +178,8 @@ services: container_name: gitea user: "1001" volumes: - - /docker/gitea/data:/var/lib/gitea - - /docker/gitea/config:/etc/gitea + - ${DOCKER_DIR}/gitea/data:/var/lib/gitea + - ${DOCKER_DIR}/gitea/config:/etc/gitea - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: @@ -155,11 +194,11 @@ services: container_name: grocy image: lscr.io/linuxserver/grocy:latest environment: + - ${TZ} - PUID=1000 - PGID=1000 - - TZ=America/Chicago volumes: - - /docker/grocy:/config + - ${DOCKER_DIR}/grocy:/config ports: - 9283:80 restart: unless-stopped @@ -173,30 +212,13 @@ services: ports: - 3000:80 volumes: - - /docker/tinyhome:/config:rw + - ${DOCKER_DIR}/tinyhome:/config:rw dns: - ${DNS_IP} restart: unless-stopped - ## Homepage (server dashboard) - homepage: - image: ghcr.io/gethomepage/homepage:latest - container_name: homepage - environment: - - PUID=1000 - - PGID=1000 - ports: - - 3001:3000 - volumes: - - /docker/homepage:/app/config - - /docker/homepage/images:/app/public/images - - /docker/homepage/fonts:/app/public/fonts - - /media:/media:ro - dns: - - ${DNS_IP} - restart: unless-stopped docker-proxy: - image: ghcr.io/tecnativa/docker-socket-proxy:latest + image: ghcr.io/tecnativa${DOCKER_DIR}-socket-proxy:latest container_name: docker-proxy environment: - CONTAINERS=1 # Allow access to viewing containers @@ -204,58 +226,19 @@ services: ports: - 2375:2375 volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock:ro restart: unless-stopped - ## Joplin (notes) - joplin: - image: joplin/server:latest - container_name: joplin + ## Dumbpad (simple notes) + dumbpad: + image: dumbwareio/dumbpad:latest + container_name: dumbpad ports: - - 22300:22300 + - 3007:3000 + volumes: + - ${DOCKER_DIR}/dumbpad:/app/data env_file: - - /docker/env/joplin.env - depends_on: - - joplin-db - dns: - - ${DNS_IP} - restart: unless-stopped - joplin-db: - image: postgres:15 - container_name: joplin-db - volumes: - - /docker/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' - restart: unless-stopped - - ## Link Stack - linkstack: - image: linkstackorg/linkstack - container_name: linkstack - env_file: - - /docker/env/linkstack.env - ports: - - 4000:80 - dns: - - ${DNS_IP} - volumes: - - linkstack:/htdocs + - ${ENV_DIR}/dumbpad.env restart: unless-stopped ## Hoarder (link aggregator) @@ -263,7 +246,7 @@ services: image: ghcr.io/hoarder-app/hoarder:release container_name: hoarder env_file: - - /docker/env/hoarder.env + - ${ENV_DIR}/hoarder.env volumes: - hoarder:/data ports: @@ -292,7 +275,7 @@ services: image: getmeili/meilisearch:v1.11.1 container_name: meilisearch env_file: - - /docker/env/hoarder.env + - ${ENV_DIR}/hoarder.env ports: - 7700:7700 environment: @@ -300,17 +283,98 @@ services: volumes: - meilisearch:/meili_data restart: unless-stopped - ## LLM for link tagging - ollama: - image: ollama/ollama - container_name: ollama + + ## Joplin (notes) + joplin: + image: joplin/server:latest + container_name: joplin ports: - - 11434:11434 - volumes: - - /docker/ollama:/root/.ollama + - 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: @@ -322,7 +386,7 @@ services: rss_db: condition: service_healthy env_file: - - /docker/env/miniflux.env + - ${ENV_DIR}/miniflux.env healthcheck: test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"] dns: @@ -332,7 +396,7 @@ services: image: postgres:15 container_name: rss_db env_file: - - /docker/env/miniflux.env + - ${ENV_DIR}/miniflux.env volumes: - miniflux-db:/var/lib/postgresql/data healthcheck: @@ -353,10 +417,10 @@ services: volumes: - paperless-data:/usr/src/paperless/data - paperless-media:/usr/src/paperless/media - - /docker/paperless/export:/usr/src/paperless/export - - /docker/paperless/consume:/usr/src/paperless/consume + - ${DOCKER_DIR}/paperless/export:/usr/src/paperless/export + - ${DOCKER_DIR}/paperless/consume:/usr/src/paperless/consume env_file: - - /docker/env/paperless.env + - ${ENV_DIR}/paperless.env restart: unless-stopped paperless_broker: image: docker.io/library/redis:7 @@ -365,17 +429,40 @@ services: - 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: - - /docker/env/tandoor.env + - ${ENV_DIR}/tandoor.env volumes: - tandoor-server-config:/opt/recipes/nginx/conf.d - - /docker/tandoor/static:/opt/recipes/staticfiles - - /docker/tandoor/media:/opt/recipes/mediafiles + - ${DOCKER_DIR}/tandoor/static:/opt/recipes/staticfiles + - ${DOCKER_DIR}/tandoor/media:/opt/recipes/mediafiles depends_on: - tandoor-db dns: @@ -387,11 +474,11 @@ services: ports: - 8554:80 env_file: - - /docker/env/tandoor.env + - ${ENV_DIR}/tandoor.env volumes: - tandoor-server-config:/etc/nginx/conf.d:ro - - /docker/tandoor/static:/static:ro - - /docker/tandoor/media:/media:ro + - ${DOCKER_DIR}/tandoor/static:/static:ro + - ${DOCKER_DIR}/tandoor/media:/media:ro depends_on: - tandoor dns: @@ -402,9 +489,9 @@ services: image: postgres:16-alpine user: 1000:1000 env_file: - - /docker/env/tandoor.env + - ${ENV_DIR}/tandoor.env volumes: - - /docker/tandoor/postgresql:/var/lib/postgresql/data + - ${DOCKER_DIR}/tandoor/postgresql:/var/lib/postgresql/data restart: unless-stopped ## Vaultwarden (password manager) @@ -412,9 +499,9 @@ services: image: vaultwarden/server:latest container_name: vaultwarden env_file: - - /docker/env/vaultwarden.env + - ${ENV_DIR}/vaultwarden.env volumes: - - /docker/vaultwarden:/data + - ${DOCKER_DIR}/vaultwarden:/data ports: - 8912:80 dns: @@ -428,7 +515,7 @@ services: ports: - 5690:5690 volumes: - - /docker/wizarr/database:/data/database + - ${DOCKER_DIR}/wizarr/database:/data/database dns: - ${DNS_IP} restart: unless-stopped @@ -441,7 +528,7 @@ services: container_name: dozzle image: amir20/dozzle:latest volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock:ro ports: - 9999:8080 restart: unless-stopped @@ -452,7 +539,7 @@ services: container_name: glances pid: host volumes: - - /var/run/docker.sock:/var/run/docker.sock + - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock - /:/glances/root:ro environment: - "GLANCES_OPT=-w" @@ -470,7 +557,7 @@ services: ports: - 9090:9090 volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro + - /var/run${DOCKER_DIR}.sock:/var/run${DOCKER_DIR}.sock:ro - /:/hostroot:ro environment: - SI=false @@ -487,8 +574,8 @@ services: - 8086:8086 volumes: - /run/udev:/run/udev:ro - - /docker/scrutiny/config:/opt/scrutiny/config - - /docker/scrutiny/influxdb:/opt/scrutiny/influxdb + - ${DOCKER_DIR}/scrutiny/config:/opt/scrutiny/config + - ${DOCKER_DIR}/scrutiny/influxdb:/opt/scrutiny/influxdb devices: - /dev/sda:/dev/sda - /dev/sdb:/dev/sdb @@ -504,9 +591,9 @@ services: - 8465:80 - 8466:443 env_file: - - /docker/env/speedtest.env + - ${ENV_DIR}/speedtest.env volumes: - - /docker/speedtest-tracker:/config + - ${DOCKER_DIR}/speedtest-tracker:/config dns: - ${DNS_IP} restart: unless-stopped @@ -520,8 +607,8 @@ services: container_name: adguard network_mode: host volumes: - - /docker/adguard/working:/opt/adguardhome/work - - /docker/adguard/conf:/opt/adguardhome/conf + - ${DOCKER_DIR}/adguard/working:/opt/adguardhome/work + - ${DOCKER_DIR}/adguard/conf:/opt/adguardhome/conf restart: unless-stopped ## Cloudflared (tunnel service for outside web access) @@ -530,10 +617,10 @@ services: image: cloudflare/cloudflared:latest network_mode: host volumes: - - /docker/cloudflared:/etc/cloudflared + - ${DOCKER_DIR}/cloudflared:/etc/cloudflared command: tunnel --no-autoupdate run env_file: - - /docker/env/cloudflared.env + - ${ENV_DIR}/cloudflared.env restart: unless-stopped ## Gluetun (vpn connector) @@ -558,12 +645,12 @@ services: - 8989:8989 # Radarr - 7878:7878 # Sonarr volumes: - - /docker/gluetun:/gluetun + - ${DOCKER_DIR}/gluetun:/gluetun - /etc/localtime:/etc/localtime:ro devices: - /dev/net/tun:/dev/net/tun env_file: - - /docker/env/gluetun.env + - ${ENV_DIR}/gluetun.env restart: unless-stopped @@ -578,7 +665,7 @@ services: - pgid=1000 - tz=america/chicago volumes: - - /docker/bazarr:/config + - ${DOCKER_DIR}/bazarr:/config - /media/jellyfin/movies:/movies - /media/jellyfin/tv shows:/tv ports: @@ -598,7 +685,7 @@ services: ports: - 8085:8084 volumes: - - /docker/calibre/ingest:/cwa-book-ingest + - ${DOCKER_DIR}/calibre/ingest:/cwa-book-ingest dns: - ${DNS_IP} restart: unless-stopped @@ -619,7 +706,7 @@ services: - 8087:80 volumes: # This works because calibre-web-automated fails to import .tmp files - - /docker/calibre/ingest/:/books + - ${DOCKER_DIR}/calibre/ingest/:/books dns: - ${DNS_IP} restart: unless-stopped @@ -630,11 +717,11 @@ services: container_name: prowlarr network_mode: "service:gluetun" environment: + - ${TZ} - PUID=1000 - PGID=1000 - - TZ=America/Chicago volumes: - - /docker/prowlarr:/config + - ${DOCKER_DIR}/prowlarr:/config restart: unless-stopped ## QBittorrent (torrent client) @@ -643,13 +730,13 @@ services: container_name: qbittorrent network_mode: "service:gluetun" environment: + - ${TZ} - PUID=1000 - PGID=1000 - - TZ=America/Chicago - WEBUI_PORT=8080 volumes: - - /docker/qbittorrent/config:/config - - /docker/qbittorrent/downloads:/downloads + - ${DOCKER_DIR}/qbittorrent/config:/config + - ${DOCKER_DIR}/qbittorrent/downloads:/downloads - /media/downloads:/ext_dl restart: unless-stopped @@ -659,13 +746,13 @@ services: container_name: radarr network_mode: "service:gluetun" environment: + - ${TZ} - PUID=1000 - PGID=1000 - - TZ=America/Chicago volumes: - - /docker/radarr:/config + - ${DOCKER_DIR}/radarr:/config - /media/jellyfin/Movies:/Movies #optional - - /docker/qbittorrent/downloads:/downloads #optional + - ${DOCKER_DIR}/qbittorrent/downloads:/downloads #optional restart: unless-stopped ## Sonarr (tv show downloading) @@ -674,16 +761,16 @@ services: container_name: sonarr network_mode: "service:gluetun" environment: + - ${TZ} - PUID=1000 - PGID=1000 - - TZ=America/Chicago - DOCKER_MODS=ghcr.io/gilbn/theme.park:sonarr - TP_ADDON=sonarr-darker - TP_THEME=dark volumes: - - /docker/sonarr:/config + - ${DOCKER_DIR}/sonarr:/config - /media/jellyfin/TV Shows:/TV Shows - - /docker/qbittorrent/downloads:/downloads + - ${DOCKER_DIR}/qbittorrent/downloads:/downloads restart: unless-stopped @@ -691,7 +778,7 @@ services: secrets: glances_password: - file: /docker/secrets/glances_password + file: ${DOCKER_DIR}/secrets/glances_password volumes: hoarder: diff --git a/readme.md b/readme.md index cff031d..5dd95ef 100644 --- a/readme.md +++ b/readme.md @@ -31,21 +31,24 @@ These are all the services hosted, what they are for, and any clients I use with - [Actual Budget](https://actualbudget.org/) - Excellent budgeting app. It can be automatically synced with your bank ([SimpleFIN Bridge](https://beta-bridge.simplefin.org/) for US banks, $15/year), but I have found that to be unstable - There used to be an official app but it has been discontinued - I added the website to my phone's home screen and it works quite well +- [DumbPad](https://github.com/DumbWareio/DumbPad) - Stupid simple notes app (for grocery lists, quick notes, etc.) - [Gitea](https://about.gitea.com/) - Git server - in the process of replacing my GitHub account - [Grocy](https://github.com/grocy/grocy) - Household management (Am I out of milk? Do I have AAA batteries? What can I make for dinner?) - [iOS Client](https://apps.apple.com/us/app/grocy-mobile/id1567803209) - [Hoarder](https://hoarder.app/) - Bookmark tool for links, pictures, notes, etc. with AI tagging - The official app seems to work well -- [Tinyhome](https://github.com/bderenzo/tinyhome) - Static new tab page set up with links to all my server stuff - [Joplin](https://joplinapp.org/) - Notes (Obsidian alternative) - [Kiwix](https://kiwix.org/en/) - Offline wiki hosting - I have Wikipedia, the Arch Linux wiki, and several others downloaded - [LinkStack](https://linkstack.org/) - Self-hosted LinkTree alternative ([azpsen.com](https://azpsen.com)) - more for content creators, definitely overkill for what I need. I'll probably replace it with a simple static site at some point +- [Maloja](https://github.com/krateng/maloja) - Self-hosted music listen tracker (last.fm replacement) - with [multi-scrobbler](https://github.com/FoxxMD/multi-scrobbler) for Jellyfin support - [Miniflux](https://miniflux.app/) - Minimalist RSS feed reader - [NetNewsWire](https://netnewswire.com/) - Wonderful all-purpose iOS RSS client - [Paperless-ngx](https://docs.paperless-ngx.com/) - Document management system for legal documents, IDs, bank statements, etc. - [Swift Paperless](https://github.com/paulgessinger/swift-paperless) - iOS client +- [Stirling PDF](https://www.stirlingpdf.com/) - PDF tools for viewing, editing, converting, and everything else - [Tandoor](https://tandoor.dev/) - Recipe management, so I always know which zucchine muffin recipe is the good one - [Untare](https://github.com/phantomate/Untare) - Mobile client (discontinued but it still works for now) +- [Tinyhome](https://github.com/bderenzo/tinyhome) - Static new tab page set up with links to all my server stuff - [vaultwarden](https://github.com/dani-garcia/vaultwarden) - Password manager - [Bitwarden clients](https://bitwarden.com/download/) - [Wizarr](https://github.com/Wizarrrr/wizarr?tab=readme-ov-file) - Jellyfin user invite manager