This commit is contained in:
2026-02-05 21:56:40 +01:00
commit 1f62da7828
17 changed files with 655 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
name: admin-system
services:
# --- Stack Manager (Port 9000) ---
dockman:
image: ra341/dockman:latest
container_name: dockman
restart: always
ports:
- "9000:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# WICHTIG: Dockman muss das Git-Repo sehen
- /opt/dockman/stacks/home-node-01:/app/stacks
- ./data/dockman:/app/data
environment:
- DOCKMAN_STACKS_DIR=/app/stacks
# --- Dashboard (Port 9001) ---
glance:
image: glanceapp/glance
container_name: glance
restart: unless-stopped
ports:
- "9001:8080"
volumes:
- ./config/glance.yml:/app/glance.yml
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
# --- Monitoring (Port 9002) ---
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: always
ports:
- "9002:3001"
volumes:
- ./data/uptime-kuma:/app/data
# --- Update Checker (Port 9003) ---
wud:
image: fmartinou/whats-up-docker
container_name: wud
restart: always
ports:
- "9003:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- WUD_WATCHER_LOCAL_SOCKET=/var/run/docker.sock
# --- Omnitools (Port 9004) ---
omnitools:
image: omnitools/omnitools:latest # Bitte exaktes Image prüfen
container_name: omnitools
restart: unless-stopped
ports:
- "9004:80"

View File

@@ -0,0 +1,9 @@
services:
newt:
image: fosrl/newt
container_name: newt
restart: unless-stopped
environment:
- PANGOLIN_ENDPOINT=https://pangolin.kornzuhause.space
- NEWT_ID=y2tf3oyp0aofunu
- NEWT_SECRET=**************

View File

@@ -0,0 +1,39 @@
name: core-infra
secrets:
db_password:
file: ./secrets/db_password.txt
services:
# Zentrale Postgres Datenbank für Paperless, Gitea, etc.
database:
image: postgres:16-alpine
container_name: postgres-core
restart: always
environment:
POSTGRES_USER: admin
POSTGRES_DB: main_db
# Docker Secret Magic: Liest das Passwort aus der Datei
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- core_net
# Zentrale Redis Instanz (Cache für Paperless, Immich etc.)
redis:
image: redis:alpine
container_name: redis-core
restart: always
networks:
- core_net
volumes:
db_data:
networks:
core_net:
name: core_net
driver: bridge

View File

@@ -0,0 +1 @@
DeinSicheresDatenbankPasswort123!

7
Home/Node1/media/.env Normal file
View File

@@ -0,0 +1,7 @@
PUID=1000
PGID=1000
TZ=Europe/Berlin
# WICHTIG: Passe diesen Pfad an deine echte Festplatte an!
# Zum Beispiel: /mnt/hdd/media
MEDIA_ROOT=/mnt/storage/media

View File

@@ -0,0 +1,205 @@
name: media
services:
# --- Jellyfin (Port 8096) ---
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- "7003:8096"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./config/jellyfin:/config
- ${MEDIA_ROOT}:/data/media # Pfad aus der .env
# Hardware Transcoding (Intel/AMD):
#devices:
# - /dev/dri:/dev/dri
# --- Audiobookshelf (Port 13378) ---
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
restart: unless-stopped
ports:
- "7001:80"
volumes:
- ./config/audiobookshelf/config:/config
- ./config/audiobookshelf/metadata:/metadata
- ${MEDIA_ROOT}/audiobooks:/audiobooks
- ${MEDIA_ROOT}/podcasts:/podcasts
# --- RomM (Port 7000) ---
romm:
image: rommapp/romm:latest
container_name: romm
restart: unless-stopped
ports:
- "7000:8080"
environment:
- DB_HOST=romm-db
- DB_NAME=romm
- DB_USER=romm-user
- DB_PASSWD=romm-password
volumes:
- ./config/romm/resources:/romm/resources
- ${MEDIA_ROOT}/games:/romm/library
depends_on:
- romm-db
# Datenbank für RomM (nur intern sichtbar)
romm-db:
image: mariaDB:10.6
labels:
- "wud.watch=false"
environment:
- MYSQL_ROOT_PASSWORD=root-pass
- MYSQL_DATABASE=romm
- MYSQL_USER=romm-user
- MYSQL_PASSWORD=romm-password
volumes:
- romm_db_data:/var/lib/mysql
# --- Immich (Port 7002) ---
# ACHTUNG: Immich ist komplex. Das ist die vereinfachte All-in-One Struktur.
immich-server:
image: ghcr.io/immich-app/immich-server:release
container_name: immich_server
command: ["start.sh", "immich"]
restart: always
ports:
- "7999:2283"
environment:
- DB_HOSTNAME=immich-postgres
- DB_USERNAME=postgres
- DB_PASSWORD=postgres
- DB_DATABASE_NAME=immich
- REDIS_HOSTNAME=immich-redis
volumes:
- ${MEDIA_ROOT}/photos:/usr/src/app/upload
depends_on:
- immich-redis
- immich-postgres
immich-microservices:
image: ghcr.io/immich-app/immich-server:release
container_name: immich_microservices
command: ["start.sh", "microservices"]
restart: always
environment:
- DB_HOSTNAME=immich-postgres
- DB_USERNAME=postgres
- DB_PASSWORD=postgres
- DB_DATABASE_NAME=immich
- REDIS_HOSTNAME=immich-redis
volumes:
- ${MEDIA_ROOT}/photos:/usr/src/app/upload
depends_on:
- immich-redis
- immich-postgres
# Immich braucht seine eigene DB (Vectordaten etc.)
immich-postgres:
image: tensorchord/pgvecto-rs:pg14-v0.2.0
container_name: immich_postgres
labels:
- "wud.watch=false"
restart: always
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
- POSTGRES_DB=immich
volumes:
- immich_pg_data:/var/lib/postgresql/data
immich-redis:
image: redis:6.2-alpine
container_name: immich_redis
restart: always
labels:
- "wud.watch=false"
immich-drop:
image: ghcr.io/nasogaa/immich-drop:latest
pull_policy: always
container_name: immich-drop
restart: unless-stopped
# Configure all settings here (no .env required)
environment:
# Immich connection (must include /api)
IMMICH_BASE_URL: https://immich.example.com/api
IMMICH_API_KEY: ${IMMICH_API_KEY}
# Optional behavior
IMMICH_ALBUM_NAME: dead-drop
PUBLIC_UPLOAD_PAGE_ENABLED: "false" # keep disabled by default
PUBLIC_BASE_URL: https://drop.example.com
# Large files: chunked uploads (bypass 100MB proxy limits)
CHUNKED_UPLOADS_ENABLED: "false" # enable chunked uploads
CHUNK_SIZE_MB: "95" # per-chunk size (MB)
# App internals
SESSION_SECRET: ${SESSION_SECRET}
# Expose the app on the host
ports:
- 7998:8080
# Persist local dedupe cache (state.db) across restarts
volumes:
- immich_drop_data:/data
# Simple healthcheck
healthcheck:
test: ["CMD-SHELL", "python - <<'PY'\nimport os,urllib.request,sys; url=f\"http://127.0.0.1:{os.getenv('PORT','8080')}/\";\ntry: urllib.request.urlopen(url, timeout=3); sys.exit(0)\nexcept Exception: sys.exit(1)\nPY"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
immich-public-proxy:
image: alangrainger/immich-public-proxy:latest
container_name: immich-public-proxy
restart: always
ports:
- "7997:3000"
environment:
PUBLIC_BASE_URL: https://your-proxy-url.com
IMMICH_URL: http://your-internal-immich-server:2283
healthcheck:
test: curl -s http://localhost:3000/share/healthcheck -o /dev/null || exit 1
start_period: 10s
timeout: 5s
immich-kiosk:
image: ghcr.io/damongolding/immich-kiosk:latest
container_name: immich-kiosk
tty: true
environment:
LANG: "de_DE"
TZ: "Europe/Berlin"
ports:
- 7996:3000
volumes:
- ./config:/config
# - ./custom.css:/custom.css
# - ./offline-assets:/offline-assets
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
power-tools:
image: ghcr.io/varun-raj/immich-power-tools:latest
ports:
- "7995:3000"
env_file:
- .env
volumes:
romm_db_data:
immich_pg_data:
immich_drop_data:

View File

@@ -0,0 +1,3 @@
TZ=Europe/Berlin
PUID=1000
PGID=1000

View File

@@ -0,0 +1,183 @@
name: productivity
secrets:
db_password:
file: ./secrets/db_password.txt
networks:
# Verbindung zum Core-Stack (Postgres/Redis)
core_net:
external: true
services:
# --- Dokumente (Port 8000) ---
paperless:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: paperless
restart: unless-stopped
ports:
- "8000:8000"
environment:
PAPERLESS_URL: https://paperless.deinedomain.de
PAPERLESS_TIME_ZONE: ${TZ}
PAPERLESS_DBHOST: postgres-core
PAPERLESS_DBNAME: main_db
PAPERLESS_DBUSER: admin
PAPERLESS_DBPASS_FILE: /run/secrets/db_password
PAPERLESS_REDIS: redis://redis-core:6379
secrets:
- db_password
volumes:
- ./data/paperless/data:/usr/src/paperless/data
- ./data/paperless/media:/usr/src/paperless/media
- ./data/paperless/consume:/usr/src/paperless/consume
networks:
- core_net
- default
# --- Focalboard (Port 8001) ---
focalboard:
image: mattermost/focalboard
container_name: focalboard
restart: unless-stopped
ports:
- "8001:8000"
networks:
- default
- core_net
# --- PDF Tools (Port 8002) ---
stirling-pdf:
image: frooodle/s-pdf:latest
container_name: stirling-pdf
restart: unless-stopped
ports:
- "8002:8080"
environment:
- DOCKER_ENABLE_SECURITY=false
networks:
- default
# --- Gramps Web (Port 8003) ---
# Web-Version der Ahnenforschung
gramps:
image: ghcr.io/gramps-project/gramps-web:latest
container_name: gramps
restart: unless-stopped
ports:
- "8003:5000"
environment:
GRAMPSWEB_TREE: "Stammbaum"
GRAMPSWEB_CELERY_CONFIG__broker_url: "redis://redis-core:6379/0" # Nutzt Core Redis
volumes:
- ./data/gramps/users:/app/users
- ./data/gramps/index:/app/index
networks:
- default
- core_net
# --- Silverbullet (Port 8004) ---
# Markdown Notizen
silverbullet:
image: zefhemel/silverbullet
container_name: silverbullet
restart: unless-stopped
ports:
- "8004:3000"
volumes:
- ./data/silverbullet:/space
networks:
- default
# --- Rx Resume (Port 8005) ---
# Lebenslauf Builder (Standalone/Simple Mode)
rx-resume:
image: amruthpillai/reactive-resume:latest
container_name: rx_resume
restart: unless-stopped
ports:
- "8005:3000"
environment:
# Benötigt zwingend eine Datenbank (Core Postgres)
- POSTGRES_DB=main_db
- POSTGRES_USER=admin
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_HOST=postgres-core
- POSTGRES_PORT=5432
- PUBLIC_URL=http://deine-ip:8005
secrets:
- db_password
networks:
- core_net
- default
# --- Fossflow / Projektmanagement (Port 8006) ---
# Annahme: Leantime oder OpenProject? (Image prüfen!)
fossflow:
image: leantime/leantime:latest # Placeholder: Leantime ist ein guter Kandidat
container_name: fossflow
restart: unless-stopped
ports:
- "8006:80"
environment:
- LEAN_DB_HOST=postgres-core
- LEAN_DB_USER=admin
- LEAN_DB_PASSWORD_FILE=/run/secrets/db_password
- LEAN_DB_DATABASE=main_db
secrets:
- db_password
volumes:
- ./data/fossflow:/var/www/html/public/userfiles
networks:
- core_net
- default
# --- Trip / Reisen (Port 8007) ---
# Annahme: TravelMap
trip:
image: jilguy/travelmap:latest
container_name: trip
restart: unless-stopped
ports:
- "8007:80"
volumes:
- ./data/trip:/var/www/html/data
networks:
- default
# --- Norish / Rezepte (Port 8008) ---
# Annahme: Mealie (Sehr populär für Rezepte)
norish:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: norish
restart: unless-stopped
ports:
- "8008:9000" # Mealie nutzt intern 9000
volumes:
- ./data/norish:/app/data
networks:
- default
# --- Koffan / Einkaufszettel (Port 8009) ---
# Annahme: KitchenOwl oder Grocy
koffan:
image: tombursch/kitchenowl:latest
container_name: koffan
restart: unless-stopped
ports:
- "8009:80"
networks:
- default
# --- Yubal / YT Downloader (Port 8010) ---
# Annahme: MeTube (bester simpler Web-Downloader)
yubal:
image: alexta69/metube:latest
container_name: yubal
restart: unless-stopped
ports:
- "8010:8081" # MeTube nutzt intern 8081
volumes:
- /mnt/storage/downloads:/downloads # Pfad anpassen!
networks:
- default

View File

@@ -0,0 +1,3 @@
PUID=1000
PGID=1000
TZ=Europe/Berlin

View File

@@ -0,0 +1,41 @@
name: smarthome
networks:
# Verbindung zum MQTT Broker in Stack 20
core_net:
external: true
services:
# --- Home Assistant (Port 8123) ---
homeassistant:
image: lscr.io/linuxserver/homeassistant:latest
container_name: homeassistant
restart: always
ports:
- "8123:8123"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- ./config/ha:/config
networks:
- core_net
- default
# Optional: Falls du USB-Sticks (Zigbee/Z-Wave) durchreichen musst:
# devices:
# - /dev/ttyUSB0:/dev/ttyUSB0
# privileged: true
# --- MagicMirror (Port 8180) ---
magicmirror:
image: bastilimbach/docker-magicmirror
container_name: magicmirror
restart: unless-stopped
ports:
- "8180:8080"
volumes:
- ./config/magicmirror/config:/opt/magic_mirror/config
- ./config/magicmirror/modules:/opt/magic_mirror/modules
networks:
- default

View File

View File

10
LICENSE Normal file
View File

@@ -0,0 +1,10 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

3
README.md Normal file
View File

@@ -0,0 +1,3 @@
# Docker-Setup
Aufbau und Versionsverwaltung von Containern

View File

@@ -0,0 +1,14 @@
name: admin
services:
gotify:
image: gotify/server
ports:
- 8080:80
environment:
GOTIFY_DEFAULTUSER_PASS: 'admin'
volumes:
- './gotify_data:/app/data'
# to run gotify as a dedicated user:
# sudo chown -R 1234:1234 ./gotify_data
# user: "1234:1234"

2
VPS/ingress/.env Normal file
View File

@@ -0,0 +1,2 @@
TUNNEL_TOKEN=super_langes_geheimes_token_hier_einfuegen

View File

@@ -0,0 +1,75 @@
name: ingress
services:
pangolin:
image: docker.io/fosrl/pangolin:latest # https://github.com/fosrl/pangolin/releases
container_name: pangolin
restart: unless-stopped
volumes:
- ./config:/app/config
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"]
interval: "10s"
timeout: "10s"
retries: 15
gerbil:
image: docker.io/fosrl/gerbil:latest # https://github.com/fosrl/gerbil/releases
container_name: gerbil
restart: unless-stopped
depends_on:
pangolin:
condition: service_healthy
command:
- --reachableAt=http://gerbil:3004
- --generateAndSaveKeyTo=/var/config/key
- --remoteConfig=http://pangolin:3001/api/v1/
volumes:
- ./config/:/var/config
cap_add:
- NET_ADMIN
- SYS_MODULE
ports:
- 51820:51820/udp
- 21820:21820/udp
- 443:443
- 80:80
traefik:
image: docker.io/traefik:v3.6
container_name: traefik
restart: unless-stopped
network_mode: service:gerbil # Ports appear on the gerbil service
depends_on:
pangolin:
condition: service_healthy
command:
- --configFile=/etc/traefik/traefik_config.yml
volumes:
- ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration
- ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates
- ./config/traefik/logs:/var/log/traefik # Volume to store Traefik logs
networks:
default:
driver: bridge
name: pangolin
#enable_ipv6: true # activate if your system supports IPv6
middleware-manager:
image: hhftechnology/middleware-manager:latest
volumes:
- ./data:/data
- ./config/middleware-manager:/app/config
- ./config/traefik:/etc/traefik # Must match Traefik's static config dir
environment:
- ACTIVE_DATA_SOURCE=pangolin
- PANGOLIN_API_URL=http://pangolin:3001/api/v1
- TRAEFIK_STATIC_CONFIG_PATH=/etc/traefik/traefik_config.yml # Path inside container
- TRAEFIK_CONF_DIR=/conf
- DB_PATH=/data/middleware.db
- PORT=3456
ports:
- "3456:3456"