Compare commits

..

37 Commits

Author SHA1 Message Date
274f947279 fix: remove intel config 2026-02-08 15:02:11 +00:00
4e9fa05dd4 fix: remove traefik 2026-02-08 14:58:14 +00:00
f33aabd9ae feat: fix for intel igpu 2026-02-08 14:36:57 +00:00
0a4c4b4d03 fix: drivers 2026-02-08 13:43:44 +00:00
4600b89d3e feat: increase shared memory 2026-02-08 13:34:12 +00:00
94f09bd3ce feat: add frigate 2026-02-08 12:47:17 +00:00
144f5678f7 fix: config path 2026-02-01 01:46:16 +00:00
6b3719db95 feat: add jellysweep 2026-02-01 01:35:09 +00:00
b6288e6fc9 fix: use correct protocol 2026-01-28 03:48:09 +00:00
fc01e3b5c7 fix: http rather than tcp 2026-01-28 03:45:41 +00:00
021cef6e25 feat: use address for routing 2026-01-28 03:41:15 +00:00
27b5d20b49 feat: put adguard on traefik_public 2026-01-28 03:32:46 +00:00
3fea6e5432 feat: Add Spoolman service for 3D printing management 2026-01-26 20:10:14 +00:00
b169c0beb7 feat(media): add jellystat service 2026-01-20 20:49:16 +00:00
9faa1b4f6d feat: add middleware to adguard 2026-01-18 16:45:13 +00:00
9ce0bfaf70 feat: remove nzbget from gluetun 2026-01-18 16:15:59 +00:00
f3dddbd21f feat: conf 2026-01-18 16:13:26 +00:00
14aad65e0f feat: conf gluetun 2026-01-18 16:11:34 +00:00
6516f8472d feat: use local dns 2026-01-18 15:57:36 +00:00
1a31ff6708 feat: whitelist traefik subnet 2026-01-18 15:49:34 +00:00
2a90e09607 feat: back to wireguard 2026-01-15 00:25:41 +00:00
6ad6c47883 fix: try google dns 2026-01-15 00:12:53 +00:00
02e12d6a63 feat: use protons dns 2026-01-15 00:10:34 +00:00
44c8bf74a2 fix: wrong env var 2026-01-15 00:03:47 +00:00
e13167f098 feat: switch to openvpn 2026-01-15 00:00:36 +00:00
531fb2cdc1 feat: add audiobookshelf 2026-01-10 20:51:16 +00:00
de1df5375b fix: docker compose 2026-01-10 20:04:42 +00:00
0ce7315e11 fix: gluetun 2026-01-09 20:05:20 +00:00
1fa30ad70c fix: derp 2026-01-06 20:05:05 +00:00
888aa91da8 fix: add default traefik network label 2026-01-06 19:58:50 +00:00
9be0f377ad feat: add habitica 2026-01-06 19:48:53 +00:00
991bd9be31 feat: remove plex 2026-01-06 18:51:47 +00:00
a874027a00 feat: remove nginx proxy manager 2026-01-06 18:50:56 +00:00
5d2214b612 feat: remove duckdns 2026-01-06 18:50:33 +00:00
4f80f77313 feat: remove hypermind 2026-01-06 18:50:17 +00:00
f492d7f41a feat: remove homepage 2026-01-06 18:49:23 +00:00
e16e838a12 feat: remove portainer 2026-01-06 18:48:47 +00:00
17 changed files with 270 additions and 187 deletions

View File

@@ -0,0 +1,30 @@
services:
spoolman:
container_name: spoolman
image: ghcr.io/donkie/spoolman:latest
restart: unless-stopped
volumes:
- ${CONFIG_ROOT}/spoolman:/home/app/.local/share/spoolman
labels:
homepage.group: "3D Printing"
homepage.name: "Spoolman"
homepage.icon: "spoolman.png"
homepage.href: "https://spoolman.${DOMAIN}"
homepage.description: "Filament Inventory Manager"
traefik.enable: "true"
traefik.http.routers.spoolman.rule: "Host(`spoolman.${DOMAIN}`)"
traefik.http.routers.spoolman.entrypoints: "https"
traefik.http.routers.spoolman.tls.certresolver: "cloudflare"
traefik.http.routers.spoolman.service: "spoolman"
traefik.http.routers.spoolman.middlewares: "voidauth@docker"
traefik.http.services.spoolman.loadbalancer.server.port: "8000"
environment:
- TZ=Europe/London
- PUID=1000
- PGID=1000
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -58,11 +58,14 @@ Because all work and no play makes the server a dull boy.
* **Media - Jellyfin**: `media/jellyfin` - Jellyfin Media Server. * **Media - Jellyfin**: `media/jellyfin` - Jellyfin Media Server.
* **Media - Plex**: `media/plex` - Plex Media Server. * **Media - Plex**: `media/plex` - Plex Media Server.
* **Media - ArrStack**: `media/arrstack` - The *Arr stack. * **Media - ArrStack**: `media/arrstack` - The *Arr stack.
* **3D Printing**: `3d_printing/spoolman` - Filament inventory manager (Spoolman).
### Directory Structure ### Directory Structure
``` ```
. .
├── 3d_printing/
│ └── spoolman/
├── books/ ├── books/
│ └── booklore/ │ └── booklore/
├── container_management/ ├── container_management/

View File

@@ -1,34 +0,0 @@
services:
portainer:
container_name: portainer
image: portainer/portainer-ce:lts
restart: always
labels:
homepage.group: "Management"
homepage.name: "Portainer"
homepage.icon: "portainer.png"
homepage.href: "https://portainer.${DOMAIN}"
homepage.description: "Container Management"
traefik.enable: "true"
traefik.http.routers.portainer.rule: "Host(`portainer.${DOMAIN}`)"
traefik.http.routers.portainer.entrypoints: "https"
traefik.http.routers.portainer.tls.certresolver: "cloudflare"
traefik.http.routers.portainer.service: "portainer"
traefik.http.services.portainer.loadbalancer.server.port: "9443"
traefik.http.services.portainer.loadbalancer.server.scheme: "https"
traefik.http.services.portainer.loadbalancer.serverstransport: "insecure@file"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
ports:
- 9443:9443
networks:
- traefik_public
volumes:
portainer_data:
name: portainer_data
networks:
traefik_public:
external: true

View File

@@ -1,30 +0,0 @@
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
expose:
- 3000
volumes:
- ${CONFIG_ROOT}/homepage/config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
HOMEPAGE_ALLOWED_HOSTS: "*"
restart: unless-stopped
labels:
homepage.group: "Dashboards"
homepage.name: "Homepage"
homepage.icon: "homepage.png"
homepage.href: "https://${DOMAIN}"
homepage.description: "The dashboard itself"
traefik.enable: "true"
traefik.http.routers.homepage.rule: "Host(`${DOMAIN}`)"
traefik.http.routers.homepage.entrypoints: "https"
traefik.http.routers.homepage.tls.certresolver: "cloudflare"
traefik.http.routers.homepage.service: "homepage"
traefik.http.services.homepage.loadbalancer.server.port: "3000"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -13,7 +13,8 @@ services:
traefik.http.routers.adguard.rule: "Host(`adguard.${DOMAIN}`)" traefik.http.routers.adguard.rule: "Host(`adguard.${DOMAIN}`)"
traefik.http.routers.adguard.entrypoints: "https" traefik.http.routers.adguard.entrypoints: "https"
traefik.http.routers.adguard.tls.certresolver: "cloudflare" traefik.http.routers.adguard.tls.certresolver: "cloudflare"
traefik.http.services.adguard.loadbalancer.server.port: "6969" traefik.http.routers.adguard.middlewares: "voidauth@docker"
traefik.http.services.adguard.loadbalancer.server.address: "http://${HOST_IP}:6969"
network_mode: host network_mode: host
volumes: volumes:
- ${CONFIG_ROOT}/adguard/work:/opt/adguardhome/work - ${CONFIG_ROOT}/adguard/work:/opt/adguardhome/work

View File

@@ -1,23 +0,0 @@
services:
duckdns:
container_name: duckdns
image: lscr.io/linuxserver/duckdns:latest
restart: unless-stopped
environment:
- SUBDOMAINS=${DUCKDNS_SUBDOMAINS}
- TOKEN=${DUCKDNS_TOKEN}
- TZ=${TZ}
volumes:
- ${CONFIG_ROOT}/duckdns/config:/config
labels:
homepage.group: "DNS"
homepage.name: "DuckDNS"
homepage.icon: "duckdns.png"
homepage.href: "https://www.duckdns.org"
homepage.description: "Dynamic DNS Updater"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -0,0 +1,52 @@
version: "3"
services:
server:
image: docker.io/awinterstein/habitica-server:latest
restart: unless-stopped
depends_on:
- mongo
environment:
- NODE_DB_URI=mongodb://mongo/habitica
- BASE_URL
- INVITE_ONLY # change to `true` after registration of initial users, to restrict further registrations
- EMAIL_SERVER_URL
- EMAIL_SERVER_PORT
- EMAIL_SERVER_AUTH_USER
- EMAIL_SERVER_AUTH_PASSWORD
- ADMIN_EMAIL
networks:
- traefik_public
- habitica
labels:
traefik.enable: "true"
traefik.docker.network: "traefik_public"
traefik.http.routers.habitica.rule: "Host(`habitica.${DOMAIN}`)"
traefik.http.routers.habitica.entrypoints: "https"
traefik.http.routers.habitica.tls.certresolver: "cloudflare"
traefik.http.routers.habitica.service: "habitica"
traefik.http.services.habitica.loadbalancer.server.port: "3000"
mongo:
image: docker.io/mongo:latest # better to replace 'latest' with the concrete mongo version (e.g., the most recent one)
restart: unless-stopped
hostname: mongo
command: ["--replSet", "rs", "--bind_ip_all", "--port", "27017"]
healthcheck:
test: echo "try { rs.status() } catch (err) { rs.initiate() }" | mongosh --port 27017 --quiet
interval: 10s
timeout: 30s
start_period: 0s
start_interval: 1s
retries: 30
volumes:
- ${CONFIG_ROOT}/habitica/db:/data/db:rw
- ${CONFIG_ROOT}/habitica/dbconf:/data/configdb
networks:
habitica:
aliases:
- mongo
networks:
habitica:
driver: bridge
traefik_public:
external: true

View File

@@ -9,10 +9,13 @@ services:
devices: devices:
- /dev/net/tun:/dev/net/tun - /dev/net/tun:/dev/net/tun
environment: environment:
- FIREWALL_OUTBOUND_SUBNETS=172.29.0.0/16,192.168.0.0/16
- VPN_SERVICE_PROVIDER=protonvpn - VPN_SERVICE_PROVIDER=protonvpn
- VPN_TYPE=wireguard - VPN_TYPE=wireguard
- WIREGUARD_PRIVATE_KEY=${PROTONVPN_WIREGUARD_PRIVATE_KEY} - WIREGUARD_PRIVATE_KEY=${PROTONVPN_WIREGUARD_PRIVATE_KEY}
- SERVER_COUNTRIES=Austria,Germany,Netherlands - SERVER_COUNTRIES=Denmark
# - OPENVPN_USER=${PROTON_OPENVPN_USER}
# - OPENVPN_PASS=${PROTON_OPENVPN_PASS}
volumes: volumes:
- ${CONFIG_ROOT}/gluetun:/gluetun - ${CONFIG_ROOT}/gluetun:/gluetun
ports: ports:
@@ -110,7 +113,6 @@ services:
nzbget: nzbget:
image: lscr.io/linuxserver/nzbget:latest image: lscr.io/linuxserver/nzbget:latest
container_name: nzbget container_name: nzbget
network_mode: service:gluetun
environment: environment:
- PUID=1000 - PUID=1000
- PGID=1000 - PGID=1000
@@ -134,6 +136,9 @@ services:
homepage.icon: "nzbget.svg" homepage.icon: "nzbget.svg"
homepage.href: "https://nzbget.${DOMAIN}" homepage.href: "https://nzbget.${DOMAIN}"
homepage.description: "Usenet Downloader" homepage.description: "Usenet Downloader"
networks:
- traefik_public
networks: networks:
traefik_public: traefik_public:
external: true external: true

View File

@@ -0,0 +1,32 @@
version: "3.8"
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- ${DOCKER_PATH}/audiobookshelf/config:/config
- ${DOCKER_PATH}/audiobookshelf/metadata:/metadata
- ${MEDIA_PATH}/audiobooks:/audiobooks
- ${MEDIA_PATH}/podcasts:/podcasts
expose:
- 80
restart: unless-stopped
labels:
# Traefik
traefik.enable: "true"
traefik.http.routers.audiobookshelf.rule: "Host(`audiobookshelf.${DOMAIN}`)"
traefik.http.routers.audiobookshelf.entrypoints: "https"
traefik.http.routers.audiobookshelf.service: "audiobookshelf"
traefik.http.routers.audiobookshelf.tls.certresolver: "cloudflare"
traefik.http.services.audiobookshelf.loadbalancer.server.port: "80"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -0,0 +1,3 @@
JELLYSTAT_DB_USER=postgres
JELLYSTAT_DB_PASSWORD=change_me
JELLYSTAT_JWT_SECRET=change_me_to_a_random_string

View File

@@ -0,0 +1,52 @@
version: "3.8"
services:
jellystat-db:
image: postgres:15
container_name: jellystat-db
environment:
POSTGRES_DB: jfstat
POSTGRES_USER: ${JELLYSTAT_DB_USER:-postgres}
POSTGRES_PASSWORD: ${JELLYSTAT_DB_PASSWORD}
volumes:
- ${DOCKER_PATH}/jellystat/postgres:/var/lib/postgresql/data
restart: unless-stopped
networks:
- traefik_public
jellystat:
image: cyfershepard/jellystat:latest
container_name: jellystat
environment:
POSTGRES_USER: ${JELLYSTAT_DB_USER:-postgres}
POSTGRES_PASSWORD: ${JELLYSTAT_DB_PASSWORD}
POSTGRES_IP: jellystat-db
POSTGRES_PORT: 5432
JWT_SECRET: ${JELLYSTAT_JWT_SECRET}
volumes:
- ${DOCKER_PATH}/jellystat/backup:/app/backend/backup-data
depends_on:
- jellystat-db
expose:
- 3000
restart: unless-stopped
labels:
# Traefik
traefik.enable: "true"
traefik.http.routers.jellystat.rule: "Host(`jellystat.${DOMAIN}`)"
traefik.http.routers.jellystat.entrypoints: "https"
traefik.http.routers.jellystat.service: "jellystat"
traefik.http.routers.jellystat.tls.certresolver: "cloudflare"
traefik.http.services.jellystat.loadbalancer.server.port: "3000"
# Homepage
homepage.group: "Media"
homepage.name: "Jellystat"
homepage.icon: "jellystat.png"
homepage.href: "https://jellystat.${DOMAIN}"
homepage.description: "Jellyfin Statistics"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -0,0 +1,36 @@
version: "3.8"
services:
jellysweep:
image: ghcr.io/jon4hz/jellysweep:latest
container_name: jellysweep
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- ${DOCKER_PATH}/jellysweep/config.yml:/app/config.yml:ro
- ${MEDIA_PATH}:/media
expose:
- 3002
restart: unless-stopped
labels:
# Traefik
traefik.enable: "true"
traefik.http.routers.jellysweep.rule: "Host(`jellysweep.${DOMAIN}`)"
traefik.http.routers.jellysweep.entrypoints: "https"
traefik.http.routers.jellysweep.service: "jellysweep"
traefik.http.routers.jellysweep.tls.certresolver: "cloudflare"
traefik.http.services.jellysweep.loadbalancer.server.port: "3002"
# Homepage
homepage.group: "Media"
homepage.name: "Jellysweep"
homepage.icon: "jellyfin.svg" # Using Jellyfin icon as placeholder
homepage.href: "https://jellysweep.${DOMAIN}"
homepage.description: "Jellyfin Cleanup Tool"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -0,0 +1,14 @@
jellyfin:
url: "http://jellyfin:8096" # Internal docker DNS if on same network, or full URL
token: "YOUR_JELLYFIN_API_KEY"
# dry_run: true # Set to false to actually delete files
# Library configuration
libraries:
- name: Movies
keep: 1
age: 30d # Delete movies older than 30 days
- name: TV Shows
keep: 1
age: 30d

View File

@@ -1,43 +0,0 @@
version: "3.8"
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
- /dev/dri/card1:/dev/dri/card1
group_add:
- "992" # Replace this with your host's 'render' group ID
environment:
- PUID=1000
- PGID=1000
- PLEX_CLAIM=${PLEX_CLAIM}
- TZ=Etc/UTC
- VERSION=docker
volumes:
- ${DOCKER_PATH}/plex/config:/config
- ${MEDIA_PATH}:/media
expose:
- 32400
restart: unless-stopped
labels:
# Traefik
traefik.enable: "true"
traefik.http.routers.plex.rule: "Host(`plex.${DOMAIN}`)"
traefik.http.routers.plex.entrypoints: "https"
traefik.http.routers.plex.service: "plex"
traefik.http.routers.plex.tls.certresolver: "cloudflare"
traefik.http.services.plex.loadbalancer.server.port: "32400"
# Homepage
homepage.group: "Media"
homepage.name: "Plex"
homepage.icon: "plex.svg"
homepage.href: "https://plex.${DOMAIN}"
homepage.description: "Media Server"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -1,20 +0,0 @@
services:
hypermind:
image: ghcr.io/lklynet/hypermind:latest
container_name: hypermind
restart: unless-stopped
environment:
- PORT=3000
labels:
- "traefik.enable=true"
- "traefik.http.routers.hypermind.rule=Host(`hypermind.${DOMAIN}`)"
- "traefik.http.routers.hypermind.entrypoints=https"
- "traefik.http.routers.hypermind.service=hypermind-hypermind"
- "traefik.http.routers.hypermind.tls.certresolver=cloudflare"
- "traefik.docker.network=traefik_public"
networks:
- traefik_public
networks:
traefik_public:
external: true

View File

@@ -1,34 +0,0 @@
name: "Nginx Proxy Manager"
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
labels:
homepage.group: "Proxies"
homepage.name: "Nginx Proxy Manager"
homepage.icon: "nginx-proxy-manager.png"
homepage.href: "http://npm:81"
homepage.description: "Reverse Proxy"
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
TZ: "Europe/London"
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ${CONFIG_ROOT}/npm/data:/data
- ${CONFIG_ROOT}/npm/letsencrypt:/etc/letsencrypt

View File

@@ -0,0 +1,39 @@
version: "3.9"
services:
frigate:
container_name: frigate
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "512mb" # Update based on camera resolution and count
privileged: true # Add this
devices:
- /dev/dri:/dev/dri # For Intel hardware acceleration
# - /dev/bus/usb:/dev/bus/usb # Google Coral USB
volumes:
- /etc/localtime:/etc/localtime:ro
- ${CONFIG_ROOT}/frigate:/config
- ${CONFIG_ROOT}/frigate/storage:/media/frigate
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "5000:5000"
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC
- "8555:8555/udp" # WebRTC
restart: unless-stopped
labels:
# Traefik
traefik.enable: "true"
traefik.http.routers.frigate.rule: "Host(`frigate.${DOMAIN}`)"
traefik.http.routers.frigate.entrypoints: "https"
traefik.http.routers.frigate.service: "frigate"
traefik.http.routers.frigate.tls.certresolver: "cloudflare"
traefik.http.services.frigate.loadbalancer.server.port: "5000"
# Homepage
homepage.group: "Security"
homepage.name: "Frigate"
homepage.icon: "frigate.svg"
homepage.href: "https://frigate.${DOMAIN}"
homepage.description: "NVR with AI object detection"