commit 1f62da7828c3df606954ee91e52f2a58c2244691 Author: michi Date: Thu Feb 5 21:56:40 2026 +0100 init diff --git a/Home/Node1/admin/docker-compose.yml b/Home/Node1/admin/docker-compose.yml new file mode 100644 index 0000000..8bd6196 --- /dev/null +++ b/Home/Node1/admin/docker-compose.yml @@ -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" \ No newline at end of file diff --git a/Home/Node1/connectivity/docker-compose.yml b/Home/Node1/connectivity/docker-compose.yml new file mode 100644 index 0000000..17e796b --- /dev/null +++ b/Home/Node1/connectivity/docker-compose.yml @@ -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=************** \ No newline at end of file diff --git a/Home/Node1/core-infra/docker-compose.yml b/Home/Node1/core-infra/docker-compose.yml new file mode 100644 index 0000000..608868c --- /dev/null +++ b/Home/Node1/core-infra/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/Home/Node1/core-infra/secrets/db_password.txt b/Home/Node1/core-infra/secrets/db_password.txt new file mode 100644 index 0000000..b81317d --- /dev/null +++ b/Home/Node1/core-infra/secrets/db_password.txt @@ -0,0 +1 @@ +DeinSicheresDatenbankPasswort123! \ No newline at end of file diff --git a/Home/Node1/media/.env b/Home/Node1/media/.env new file mode 100644 index 0000000..a0ee1d5 --- /dev/null +++ b/Home/Node1/media/.env @@ -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 \ No newline at end of file diff --git a/Home/Node1/media/docker-compose.yml b/Home/Node1/media/docker-compose.yml new file mode 100644 index 0000000..d3d2e20 --- /dev/null +++ b/Home/Node1/media/docker-compose.yml @@ -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: \ No newline at end of file diff --git a/Home/Node1/productivity/.env b/Home/Node1/productivity/.env new file mode 100644 index 0000000..b802a0f --- /dev/null +++ b/Home/Node1/productivity/.env @@ -0,0 +1,3 @@ +TZ=Europe/Berlin +PUID=1000 +PGID=1000 \ No newline at end of file diff --git a/Home/Node1/productivity/docker-compose.yml b/Home/Node1/productivity/docker-compose.yml new file mode 100644 index 0000000..ab20658 --- /dev/null +++ b/Home/Node1/productivity/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/Home/Node1/smarthome/.env b/Home/Node1/smarthome/.env new file mode 100644 index 0000000..4ea6c52 --- /dev/null +++ b/Home/Node1/smarthome/.env @@ -0,0 +1,3 @@ +PUID=1000 +PGID=1000 +TZ=Europe/Berlin \ No newline at end of file diff --git a/Home/Node1/smarthome/docker-compose.yml b/Home/Node1/smarthome/docker-compose.yml new file mode 100644 index 0000000..50f9309 --- /dev/null +++ b/Home/Node1/smarthome/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/Home/Node2/admin/docker-compose.yml b/Home/Node2/admin/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/Home/Node2/test/docker-compose.yml b/Home/Node2/test/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cde4ac6 --- /dev/null +++ b/LICENSE @@ -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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..00a672b --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Docker-Setup + +Aufbau und Versionsverwaltung von Containern \ No newline at end of file diff --git a/VPS/admin/docker-compose.yml b/VPS/admin/docker-compose.yml new file mode 100644 index 0000000..9e5ac52 --- /dev/null +++ b/VPS/admin/docker-compose.yml @@ -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" \ No newline at end of file diff --git a/VPS/ingress/.env b/VPS/ingress/.env new file mode 100644 index 0000000..af25a23 --- /dev/null +++ b/VPS/ingress/.env @@ -0,0 +1,2 @@ +TUNNEL_TOKEN=super_langes_geheimes_token_hier_einfuegen + diff --git a/VPS/ingress/docker-compose.yml b/VPS/ingress/docker-compose.yml new file mode 100644 index 0000000..2b431b7 --- /dev/null +++ b/VPS/ingress/docker-compose.yml @@ -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" \ No newline at end of file