Compare commits
31 Commits
991bd9be31
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 274f947279 | |||
| 4e9fa05dd4 | |||
| f33aabd9ae | |||
| 0a4c4b4d03 | |||
| 4600b89d3e | |||
| 94f09bd3ce | |||
| 144f5678f7 | |||
| 6b3719db95 | |||
| b6288e6fc9 | |||
| fc01e3b5c7 | |||
| 021cef6e25 | |||
| 27b5d20b49 | |||
| 3fea6e5432 | |||
| b169c0beb7 | |||
| 9faa1b4f6d | |||
| 9ce0bfaf70 | |||
| f3dddbd21f | |||
| 14aad65e0f | |||
| 6516f8472d | |||
| 1a31ff6708 | |||
| 2a90e09607 | |||
| 6ad6c47883 | |||
| 02e12d6a63 | |||
| 44c8bf74a2 | |||
| e13167f098 | |||
| 531fb2cdc1 | |||
| de1df5375b | |||
| 0ce7315e11 | |||
| 1fa30ad70c | |||
| 888aa91da8 | |||
| 9be0f377ad |
30
3d_printing/spoolman/docker-compose.yml
Normal file
30
3d_printing/spoolman/docker-compose.yml
Normal 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
|
||||||
@@ -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/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
52
habit_tracking/habitica/docker-compose.yml
Normal file
52
habit_tracking/habitica/docker-compose.yml
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
32
media/audiobookshelf/docker-compose.yml
Normal file
32
media/audiobookshelf/docker-compose.yml
Normal 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
|
||||||
3
media/jellystat/.env.example
Normal file
3
media/jellystat/.env.example
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
JELLYSTAT_DB_USER=postgres
|
||||||
|
JELLYSTAT_DB_PASSWORD=change_me
|
||||||
|
JELLYSTAT_JWT_SECRET=change_me_to_a_random_string
|
||||||
52
media/jellystat/docker-compose.yml
Normal file
52
media/jellystat/docker-compose.yml
Normal 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
|
||||||
36
media/jellysweep/docker-compose.yml
Normal file
36
media/jellysweep/docker-compose.yml
Normal 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
|
||||||
14
media/jellysweep/example.config.yaml
Normal file
14
media/jellysweep/example.config.yaml
Normal 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
|
||||||
39
security/frigate/docker-compose.yml
Normal file
39
security/frigate/docker-compose.yml
Normal 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"
|
||||||
Reference in New Issue
Block a user