Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| it:thinkcentreserver [2026/06/17 14:53] – [7.1 Brother ADS-1800W Konfiguration] matthias | it:thinkcentreserver [2026/06/30 15:43] (aktuell) – [6.1 Nginx Proxy Manager (NPM)] matthias | ||
|---|---|---|---|
| Zeile 85: | Zeile 85: | ||
| | **Docker-Configs & Indizes (High-End)** | | | | | | **Docker-Configs & Indizes (High-End)** | | | | | ||
| | ''/ | | ''/ | ||
| + | | ''/ | ||
| | ''/ | | ''/ | ||
| | ''/ | | ''/ | ||
| Zeile 92: | Zeile 93: | ||
| | ''/ | | ''/ | ||
| | ''/ | | ''/ | ||
| - | | ''/ | + | | ''/ |
| + | | ''/ | ||
| | ''/ | | ''/ | ||
| | ''/ | | ''/ | ||
| Zeile 110: | Zeile 112: | ||
| PATH_SATA=/ | PATH_SATA=/ | ||
| PATH_HDD=/ | PATH_HDD=/ | ||
| + | PATH_HA_DB=/ | ||
| + | |||
| + | USER_ID=1000 | ||
| + | GROUP_ID=1000 | ||
| + | |||
| + | # --- KEEPASS-REFERENZEN --- | ||
| DB_ROOT_PASSWORD=EinSehrSicheresRootPasswort123! | DB_ROOT_PASSWORD=EinSehrSicheresRootPasswort123! | ||
| DB_PASSWORD=NextcloudDbPasswort456! | DB_PASSWORD=NextcloudDbPasswort456! | ||
| Zeile 119: | Zeile 127: | ||
| <code yaml> | <code yaml> | ||
| - | version: ' | ||
| - | |||
| networks: | networks: | ||
| server-network: | server-network: | ||
| Zeile 215: | Zeile 221: | ||
| - server-network | - server-network | ||
| - | | + | |
| + | # --- Nextcloud --- | ||
| nextcloud: | nextcloud: | ||
| Zeile 236: | Zeile 243: | ||
| - server-network | - server-network | ||
| - | | + | # --- Paperless-ngx --- |
| paperless-redis: | paperless-redis: | ||
| Zeile 254: | Zeile 261: | ||
| - paperless-redis | - paperless-redis | ||
| ports: | ports: | ||
| - | - " | + | - " |
| volumes: | volumes: | ||
| - ${PATH_SSD}/ | - ${PATH_SSD}/ | ||
| Zeile 262: | Zeile 269: | ||
| - PAPERLESS_REDIS=redis:// | - PAPERLESS_REDIS=redis:// | ||
| - PAPERLESS_TIME_ZONE=${TZ} | - PAPERLESS_TIME_ZONE=${TZ} | ||
| - | - PAPERLESS_OCR_LANGUAGE=deu+eng | + | - PAPERLESS_OCR_LANGUAGE=deu+eng |
| - | - USER_ID=1000 | + | - USER_ID=1000 |
| - | - GROUP_ID=1000 | + | - GROUP_ID=1000 |
| - | - PAPERLESS_CONSUMER_POLLING=10 | + | - PAPERLESS_CONSUMER_POLLING=15 |
| + | - PAPERLESS_CONSUMER_POLLING_RETRY_COUNT=10 | ||
| + | - PAPERLESS_CONSUMER_POLLING_DELAY=5 | ||
| - PAPERLESS_CONSUMER_USE_INOTIFY=false | - PAPERLESS_CONSUMER_USE_INOTIFY=false | ||
| - PAPERLESS_CONSUMER_RECURSIVE=true | - PAPERLESS_CONSUMER_RECURSIVE=true | ||
| + | - PAPERLESS_CONSUMER_ENABLE_BARCODES=true | ||
| + | - PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE=true | ||
| + | - PAPERLESS_CONSUMER_ASN_BARCODE_PREFIX=ASN | ||
| + | - PAPERLESS_CONSUMER_BARCODE_DPI=600 | ||
| + | - PAPERLESS_CONSUMER_BARCODE_UPSCALE=2 | ||
| + | - CELERY_WORKER_CONCURRENCY=4 | ||
| + | - ' | ||
| + | |||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | |||
| + | # --- Home Assistant Stack --- | ||
| + | |||
| + | homeassistant: | ||
| + | image: ghcr.io/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | volumes: | ||
| + | # Performance-Kritisch auf NVMe (alles außer die dicke DB) | ||
| + | - ${PATH_SSD}/ | ||
| + | # Schreibintensiver DB-Ordner komplett auf die SATA-SSD umgebogen | ||
| + | - / | ||
| + | environment: | ||
| + | - TZ=${TZ} | ||
| + | network_mode: | ||
| + | |||
| + | mosquitto: | ||
| + | image: eclipse-mosquitto: | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | ports: | ||
| + | - " | ||
| + | - " | ||
| + | volumes: | ||
| + | - ${PATH_SSD}/ | ||
| + | - ${PATH_SSD}/ | ||
| + | - ${PATH_SSD}/ | ||
| networks: | networks: | ||
| - server-network | - server-network | ||
| Zeile 306: | Zeile 353: | ||
| ==== 5.2 Docker-Updates ==== | ==== 5.2 Docker-Updates ==== | ||
| + | Da die Docker-Infrastruktur aus Performance- und Strukturgründen in zwei separate Stacks aufgeteilt ist (Haupt-Infrastruktur und Immich), müssen Updates in den jeweiligen Projektverzeichnissen getriggert werden. | ||
| + | |||
| + | === Manueller Update-Prozess === | ||
| + | Der optimierte Dreischritt holt die neuesten Images, startet geänderte Container neu und räumt verwaiste Image-Leichen direkt auf: | ||
| <code bash> | <code bash> | ||
| - | # Standard-Vierzeiler für Updates über docker-compose: | + | # 1. Haupt-Infrastruktur updaten |
| cd / | cd / | ||
| - | docker compose pull | + | docker compose pull && docker compose up -d --remove-orphans && docker image prune -a |
| - | docker compose up -d | + | |
| - | docker image prune -f | + | # 2. Immich Foto-Infrastruktur separat updaten |
| + | cd / | ||
| + | docker compose pull && | ||
| + | </ | ||
| + | |||
| + | === Automatisierung via Bash-Alias (Empfohlen) === | ||
| + | Um im Alltag nicht manuell in die Verzeichnisse springen zu müssen, ist in der '' | ||
| + | |||
| + | < | ||
| + | alias update-server=' | ||
| + | </ | ||
| + | |||
| + | **Wartungsbefehl im Alltag:** | ||
| + | <code bash> | ||
| + | update-server | ||
| </ | </ | ||
| Zeile 319: | Zeile 384: | ||
| du -h --max-depth=1 | du -h --max-depth=1 | ||
| </ | </ | ||
| + | |||
| + | ==== 5.4 Shell-Befehle ==== | ||
| + | ^ Kategorie ^ Befehl ^ Beschreibung / Parameter ^ | ||
| + | | **Speicher** | '' | ||
| + | | | '' | ||
| + | | **Transfer** | '' | ||
| + | | | '' | ||
| + | | **Immich-CLI** | **In Win-PowerShell (Sitzungsvariablen): | ||
| + | | | '' | ||
| + | | **Rsync** | '' | ||
| + | | **Docker** | '' | ||
| + | | | '' | ||
| + | | | '' | ||
| + | | | '' | ||
| + | | | '' | ||
| + | | | '' | ||
| + | | | '' | ||
| + | | **Logs** | '' | ||
| + | | | '' | ||
| + | | **Rechte** | '' | ||
| + | | | '' | ||
| ===== 6. Dienst-spezifische Notizen ===== | ===== 6. Dienst-spezifische Notizen ===== | ||
| ==== 6.1 Nginx Proxy Manager (NPM) ==== | ==== 6.1 Nginx Proxy Manager (NPM) ==== | ||
| + | |||
| === Installation & Protokoll === | === Installation & Protokoll === | ||
| * **Interner Port / Protokoll: | * **Interner Port / Protokoll: | ||
| * **Externer Zugriff:** Ports 80 & 443 direkt im Router auf das TC weitergeleitet. | * **Externer Zugriff:** Ports 80 & 443 direkt im Router auf das TC weitergeleitet. | ||
| * **Abhängigkeiten: | * **Abhängigkeiten: | ||
| + | |||
| === Bedienung & Wichtige Befehle === | === Bedienung & Wichtige Befehle === | ||
| - | * **Web-UI: | + | * **Web-UI:** [[http:// |
| - | * **Tuning:** In den Proxy-Hosts standardmäßig "Block Common Exploits" | + | * **Tuning:** In den Proxy-Hosts standardmäßig "Block Common Exploits" |
| + | |||
| + | === Aktive Domain-Struktur (Manitu CNAME) === | ||
| + | Alle Subdomains der Hauptdomain '' | ||
| + | |||
| + | ^ Subdomain ^ Internes Docker-Ziel (TC) ^ Beschreibung / Zweck ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | === Migrations- & Routing-Architektur (Fernzugriff) === | ||
| + | Um während der Migrationsphase Ausfallzeiten zu verhindern, fungiert der NPM auf dem ThinkCentre als **zentrale Weiche (Reverse Proxy)** im Heimnetzwerk. Da er sowohl im isolierten '' | ||
| + | |||
| + | == 1. Fallback für bestehende Alt-Systeme (Raspberry Pi) == | ||
| + | Damit alte Lesezeichen und Smartphone-Syncs über die Selfhost-Domain nicht brechen, leitet ein " | ||
| + | |||
| + | == 2. Nahtlose Wiki-Migration via Custom Locations (Zwei-Wege-System) == | ||
| + | Die drei DokuWikis wurden erfolgreich auf das ThinkCentre migriert und laufen nativ und ohne Unterordner auf ihren jeweiligen '' | ||
| + | |||
| + | Dazu sind im NPM unter dem Proxy-Host '' | ||
| + | |||
| + | **Band-Wiki: | ||
| + | * **Define Location:** ''/ | ||
| + | * **Scheme & Ziel:** '' | ||
| + | * **Erweiterte Nginx-Konfiguration (Zahnrad): | ||
| + | <code nginx> | ||
| + | rewrite ^/ | ||
| + | </ | ||
| + | |||
| + | **WG-Wiki: | ||
| + | * **Define Location:** ''/ | ||
| + | * **Scheme & Ziel:** '' | ||
| + | * **Erweiterte Nginx-Konfiguration (Zahnrad): | ||
| + | <code nginx> | ||
| + | rewrite ^/ | ||
| + | </ | ||
| + | |||
| + | **AK-Wiki: | ||
| + | * **Define Location:** ''/ | ||
| + | * **Scheme & Ziel:** '' | ||
| + | * **Erweiterte Nginx-Konfiguration (Zahnrad): | ||
| + | <code nginx> | ||
| + | rewrite ^/ | ||
| + | </ | ||
| + | == 3. Zukünftiger Nextcloud-Umzug == | ||
| + | Sobald die Nextcloud auf das TC migriert wird, wird analog zu den Wikis eine Custom Location für ''/ | ||
| ==== 6.2 Pi-hole ==== | ==== 6.2 Pi-hole ==== | ||
| === Installation & Protokoll === | === Installation & Protokoll === | ||
| Zeile 386: | Zeile 522: | ||
| ==== 6.9 Paperless-ngx ==== | ==== 6.9 Paperless-ngx ==== | ||
| + | === Shell Befehle === | ||
| + | * Verzeichnis: | ||
| + | * Scan Attribute Dokumente '' | ||
| + | |||
| === Installation & Protokoll === | === Installation & Protokoll === | ||
| * **Interner Port / Protokoll: | * **Interner Port / Protokoll: | ||
| Zeile 393: | Zeile 533: | ||
| === Besonderheiten & Pfadtrennung === | === Besonderheiten & Pfadtrennung === | ||
| Das System nutzt ein dreistufiges Mapping zur optimalen Performanceverteilung: | Das System nutzt ein dreistufiges Mapping zur optimalen Performanceverteilung: | ||
| - | | + | |
| - | | + | |
| - | | + | |
| === Linux-Dateisystem & FTP-Brücke (fstab Bind-Mounts) === | === Linux-Dateisystem & FTP-Brücke (fstab Bind-Mounts) === | ||
| Zeile 439: | Zeile 579: | ||
| //Hinweis für die Weboberfläche: | //Hinweis für die Weboberfläche: | ||
| ==== 6.10 Immich (Foto-Infrastruktur) ==== | ==== 6.10 Immich (Foto-Infrastruktur) ==== | ||
| + | |||
| + | Selbstgehostete Foto- und Videoplattform als performanter Ersatz für Google Photos. | ||
| + | |||
| === Installation & Protokoll === | === Installation & Protokoll === | ||
| - | * **Interner Port / Protokoll: | + | * **Interner Port/ |
| - | * **Externer Zugriff:** NPM Proxy Host mit aktiven Websockets. | + | * **Lokale Web-UI:** http://192.168.178.128: |
| - | * **Abhängigkeiten:** Benötigt '' | + | * **Externer Zugriff:** Über NPM Proxy Host mit aktiven Websockets |
| - | === Besonderheiten (Das perfekte Scroll-Tuning) === | + | * **Abhängigkeiten:** Nutzt eine isolierte PostgreSQL-Datenbank mit Vektorerweiterung |
| - | Um das flüssige Durchscrollen der Handy-Timeline ohne NVMe-Verschleiß zu realisieren, | + | |
| - | | + | |
| - | 2. **SATA-SSD: | + | |
| - | 3. **4TB HDD1:** Speicherort für ''/ | + | |
| + | === Das 3-Zonen-Speicher-Mapping === | ||
| + | |||
| + | Um maximales Scroll-Tuning in der App ohne NVMe-Verschleiß zu realisieren, | ||
| + | * **1. High-End Layer (NVMe SSD):** Die kritische PostgreSQL-Datenbank liegt zwecks maximaler IOPS unter ''/ | ||
| + | * **2. Stoßdämpfer Layer (SATA-SSD): | ||
| + | * **3. Vorläufiger Massenspeicher (SATA-SSD): | ||
| + | |||
| + | === Lokale Docker-Infrastruktur === | ||
| + | |||
| + | Im Gegensatz zur globalen '' | ||
| + | |||
| + | == 1. Umgebungsvariablen (/ | ||
| + | <code env> | ||
| + | IMMICH_VERSION=release | ||
| + | TZ=Europe/ | ||
| + | PUID=1000 | ||
| + | PGID=1000 | ||
| + | |||
| + | # Vorläufiger Pfad auf SATA-SSD (Datengrab) | ||
| + | UPLOAD_LOCATION=/ | ||
| + | DB_PASSWORD=ImmichPostgresPasswort789! | ||
| + | </ | ||
| + | |||
| + | == 2. Docker-Compose (/ | ||
| + | Die Konfiguration nutzt explizit das '' | ||
| + | |||
| + | <code yaml> | ||
| + | name: immich | ||
| + | |||
| + | services: | ||
| + | immich-server: | ||
| + | container_name: | ||
| + | image: ghcr.io/ | ||
| + | cpuset: " | ||
| + | volumes: | ||
| + | - ${UPLOAD_LOCATION}:/ | ||
| + | - / | ||
| + | - / | ||
| + | - / | ||
| + | env_file: | ||
| + | - .env | ||
| + | ports: | ||
| + | - 2283:2283 | ||
| + | depends_on: | ||
| + | - redis | ||
| + | - database | ||
| + | restart: unless-stopped | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | immich-machine-learning: | ||
| + | container_name: | ||
| + | image: ghcr.io/ | ||
| + | cpuset: " | ||
| + | volumes: | ||
| + | - / | ||
| + | env_file: | ||
| + | - .env | ||
| + | restart: unless-stopped | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | redis: | ||
| + | container_name: | ||
| + | image: docker.io/ | ||
| + | restart: unless-stopped | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | database: | ||
| + | container_name: | ||
| + | image: docker.io/ | ||
| + | environment: | ||
| + | POSTGRES_DB: | ||
| + | POSTGRES_USER: | ||
| + | POSTGRES_PASSWORD: | ||
| + | volumes: | ||
| + | - / | ||
| + | restart: unless-stopped | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | networks: | ||
| + | server-network: | ||
| + | external: true | ||
| + | </ | ||
| + | |||
| + | === Wartung & Zukünftiger HDD-Umbau === | ||
| + | |||
| + | == Initialer Bulk-Upload über Windows-PowerShell == | ||
| + | Um große Medienmengen (z.B. >20 GB) stabil ohne Browser-Timeouts zu importieren, | ||
| + | < | ||
| + | # CLI installieren und einloggen | ||
| + | npm install -g @immich/cli | ||
| + | immich login http:// | ||
| + | |||
| + | # Ordner rekursiv hochladen | ||
| + | immich upload --recursive --yes " | ||
| + | </ | ||
| + | |||
| + | == Spätere Migration auf das 4TB HDD-Datengrab == | ||
| + | Sobald der Testbetrieb beendet ist, wird der Massenspeicher verlustfrei auf die '' | ||
| + | |||
| + | 1. Immich-Stack stoppen: | ||
| + | < | ||
| + | cd / | ||
| + | </ | ||
| + | |||
| + | 2. Daten per '' | ||
| + | < | ||
| + | sudo rsync -avzP / | ||
| + | </ | ||
| + | |||
| + | 3. Pfad in der ''/ | ||
| + | < | ||
| + | # Neue Zuweisung in der .env: | ||
| + | UPLOAD_LOCATION=/ | ||
| + | |||
| + | # Start: | ||
| + | docker compose up -d | ||
| + | </ | ||
| ==== 6.11 Ghost (CMS für die Porgys) ==== | ==== 6.11 Ghost (CMS für die Porgys) ==== | ||
| === Installation & Protokoll === | === Installation & Protokoll === | ||
| Zeile 464: | Zeile 724: | ||
| Der gesamte Content-Ordner (Themes, Bilder) wird materialschonend auf der SATA-SSD abgelegt. | Der gesamte Content-Ordner (Themes, Bilder) wird materialschonend auf der SATA-SSD abgelegt. | ||
| + | ==== 6.12 Audioserve (Audio-Streaming) ==== | ||
| + | |||
| + | Audioserve ist eine in Rust geschriebene, | ||
| + | |||
| + | === Docker Compose Konfiguration === | ||
| + | Anzulegen unter '' | ||
| + | |||
| + | <code yaml> | ||
| + | version: " | ||
| + | |||
| + | services: | ||
| + | audioserve: | ||
| + | image: miko65/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | ports: | ||
| + | - " | ||
| + | environment: | ||
| + | - TZ=${TZ} | ||
| + | - AUDIOSERVE_GENERATE_NAMES=true | ||
| + | volumes: | ||
| + | # Musik/ | ||
| + | - ${PATH_SATA}/ | ||
| + | # Metadaten und Wellenform-Cache auf der schnellen SSD | ||
| + | - ${PATH_SSD}/ | ||
| + | command: | ||
| + | - /audio | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | networks: | ||
| + | server-network: | ||
| + | external: true | ||
| + | </ | ||
| + | |||
| + | === Praxis-Hinweise === | ||
| + | * **Wellenformen: | ||
| + | * **Sicherheit: | ||
| + | |||
| + | |||
| + | ==== 6.13 Vikunja (To-Do & Taskmanagement) ==== | ||
| + | |||
| + | Vikunja ist eine selbstgehostete, | ||
| + | |||
| + | === Docker Compose Konfiguration === | ||
| + | Anzulegen unter '' | ||
| + | |||
| + | <code yaml> | ||
| + | version: " | ||
| + | |||
| + | services: | ||
| + | vikunja-db: | ||
| + | image: postgres: | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | environment: | ||
| + | POSTGRES_USER: | ||
| + | POSTGRES_PASSWORD: | ||
| + | POSTGRES_DB: | ||
| + | volumes: | ||
| + | - ${PATH_SSD}/ | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | vikunja: | ||
| + | image: vikunja/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | ports: | ||
| + | - " | ||
| + | environment: | ||
| + | VIKUNJA_DATABASE_HOST: | ||
| + | VIKUNJA_DATABASE_PASSWORD: | ||
| + | VIKUNJA_DATABASE_TYPE: | ||
| + | VIKUNJA_DATABASE_USER: | ||
| + | VIKUNJA_DATABASE_DATABASE: | ||
| + | VIKUNJA_SERVICE_JWTSECRET: | ||
| + | VIKUNJA_SERVICE_PUBLICURL: | ||
| + | volumes: | ||
| + | - ${PATH_SSD}/ | ||
| + | depends_on: | ||
| + | - vikunja-db | ||
| + | networks: | ||
| + | - server-network | ||
| + | |||
| + | networks: | ||
| + | server-network: | ||
| + | external: true | ||
| + | </ | ||
| + | |||
| + | === Praxis-Hinweise === | ||
| + | * **Umgebungsvariablen: | ||
| + | * **Datenbanksicherung: | ||
| ===== 7 Scanner-Administration & Dokumenten-Einzug ===== | ===== 7 Scanner-Administration & Dokumenten-Einzug ===== | ||
| Zeile 476: | Zeile 829: | ||
| * **Profil Jana:** Zielordner: '' | * **Profil Jana:** Zielordner: '' | ||
| * **Profil Gemeinsam: | * **Profil Gemeinsam: | ||
| - | |||
| - | --- | ||
| - | |||
| ==== 7.2 Multi-User-Workflows & Speicherpfade ==== | ==== 7.2 Multi-User-Workflows & Speicherpfade ==== | ||
| Zeile 498: | Zeile 848: | ||
| > **Hinweis zu gemeinsamen Dokumenten: | > **Hinweis zu gemeinsamen Dokumenten: | ||
| - | |||
| - | --- | ||
| ==== 7.3 Administration & Fehlerbehebung (Troubleshooting) ==== | ==== 7.3 Administration & Fehlerbehebung (Troubleshooting) ==== | ||