Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| kurse:youtube:digitalcraft_corestack:digitalcraft_corestack [2026/03/15 14:16] – [4) Start] strangelove | kurse:youtube:digitalcraft_corestack:digitalcraft_corestack [2026/03/16 11:01] (aktuell) – [5) Docker-Stacks (RAM-optimiert & funktionssicher)] strangelove | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ===== Raspberry Pi 4 (2GB RAM) – Heimserver | + | ===== Raspberry Pi 4 (2GB RAM) – Heimserver |
| - | **Ziel:** Stabiler Betrieb mit **DokuWiki**, | + | **Ziel:** Stabiler Betrieb mit\\ |
| - | **Wichtig: | + | \\ |
| + | **DokuWiki**, | ||
| + | **File Browser**,\\ | ||
| + | **Cockpit**\\ | ||
| + | und **Gogs** (Git) auf einem Raspberry Pi 4 mit **2GB RAM**.\\ | ||
| + | \\ | ||
| + | **Wichtig: | ||
| ---- | ---- | ||
| Zeile 20: | Zeile 26: | ||
| free -h | free -h | ||
| </ | </ | ||
| - | **Zeigt freien RAM an** (sollte ~1.5GB | + | **Zeigt freien RAM an** (ideal: möglichst viel frei vor dem Start). |
| <code bash> | <code bash> | ||
| Zeile 48: | Zeile 54: | ||
| <code bash> | <code bash> | ||
| - | sudo apt install -y mc git curl wget | + | sudo apt install -y mc git curl wget ca-certificates gnupg |
| </ | </ | ||
| - | * **'' | + | * **'' |
| - | * **'' | + | * **'' |
| * **'' | * **'' | ||
| + | * **'' | ||
| ---- | ---- | ||
| - | ==== 2) Digitalcraft Ordnerstruktur (einheitlich!) ==== | + | ==== 2) Digitalcraft Ordnerstruktur (einheitlich) ==== |
| - | **Root:** ''/ | + | **Root:** ''/ |
| **Pro Dienst ein Ordner:** | **Pro Dienst ein Ordner:** | ||
| * ''/ | * ''/ | ||
| Zeile 74: | Zeile 81: | ||
| **Erklärung: | **Erklärung: | ||
| * '' | * '' | ||
| - | * '' | + | * '' |
| ---- | ---- | ||
| Zeile 93: | Zeile 100: | ||
| sudo systemctl enable --now cockpit.socket | sudo systemctl enable --now cockpit.socket | ||
| </ | </ | ||
| + | |||
| **Zugriff: | **Zugriff: | ||
| < | < | ||
| https://< | https://< | ||
| </ | </ | ||
| + | |||
| **Nutze Cockpit für:** | **Nutze Cockpit für:** | ||
| * System-Logs | * System-Logs | ||
| Zeile 105: | Zeile 114: | ||
| ---- | ---- | ||
| - | ==== 4) Docker + Compose installieren ==== | + | ==== 4) Docker + Compose installieren |
| - | ==== 4.1 Grundtools installieren ==== | + | ==== 4.1 Docker GPG-Key speichern |
| - | + | ||
| - | <code bash> | + | |
| - | sudo apt-get install -y ca-certificates curl gnupg | + | |
| - | </ | + | |
| - | + | ||
| - | ==== 4.2 Keyring-Ordner anlegen | + | |
| <code bash> | <code bash> | ||
| sudo install -m 0755 -d / | sudo install -m 0755 -d / | ||
| - | </ | ||
| - | |||
| - | ==== 4.3 Docker GPG-Key speichern ==== | ||
| - | |||
| - | <code bash> | ||
| curl -fsSL https:// | curl -fsSL https:// | ||
| - | </ | ||
| - | |||
| - | ==== 4.4 Leserechte setzen ==== | ||
| - | |||
| - | <code bash> | ||
| sudo chmod a+r / | sudo chmod a+r / | ||
| </ | </ | ||
| - | ==== 4.5 Docker Repo eintragen ==== | + | ==== 4.2 Docker Repo eintragen ==== |
| <code bash> | <code bash> | ||
| - | echo \ | + | echo "deb [arch=$(dpkg --print-architecture) signed-by=/ |
| - | | + | sudo apt update |
| - | | + | |
| - | | + | |
| - | sudo apt-get update | + | |
| </ | </ | ||
| - | ==== 4.6 Docker installieren ==== | + | ==== 4.3 Docker installieren ==== |
| <code bash> | <code bash> | ||
| - | sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin | + | sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
| </ | </ | ||
| - | ==== 4.7 Docker ohne sudo nutzen ==== | + | ==== 4.4 Docker ohne sudo nutzen ==== |
| <code bash> | <code bash> | ||
| sudo usermod -aG docker $USER | sudo usermod -aG docker $USER | ||
| newgrp docker | newgrp docker | ||
| + | |||
| docker version | docker version | ||
| docker compose version | docker compose version | ||
| </ | </ | ||
| - | **Teste Docker:** | + | |
| + | **Test:** | ||
| <code bash> | <code bash> | ||
| docker run --rm hello-world | docker run --rm hello-world | ||
| </ | </ | ||
| - | → Sollte | + | → Sollte |
| ---- | ---- | ||
| - | ==== 4.8 Gemeinsames Docker-Netzwerk erstellen ==== | + | ==== 4.5 Gemeinsames Docker-Netzwerk erstellen ==== |
| <code bash> | <code bash> | ||
| Zeile 169: | Zeile 161: | ||
| docker network ls | grep dc-net | docker network ls | grep dc-net | ||
| </ | </ | ||
| + | |||
| **Zweck:** Alle Container kommunizieren über '' | **Zweck:** Alle Container kommunizieren über '' | ||
| ---- | ---- | ||
| - | ==== 5) Docker-Stacks | + | ==== 5) Docker-Stacks |
| - | Jeder Dienst hat seinen eigenen Ordner mit '' | + | |
| - | ---- | ||
| ==== Stack 01 – DokuWiki (WikiCore) ==== | ==== Stack 01 – DokuWiki (WikiCore) ==== | ||
| Zeile 183: | Zeile 174: | ||
| ==== 1) .env ==== | ==== 1) .env ==== | ||
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| < | < | ||
| TZ=Europe/ | TZ=Europe/ | ||
| Zeile 189: | Zeile 181: | ||
| WIKICORE_PORT=8080 | WIKICORE_PORT=8080 | ||
| </ | </ | ||
| - | **Hinweis: | + | |
| + | **Hinweis: | ||
| + | <code bash> | ||
| + | id -u | ||
| + | id -g | ||
| + | </ | ||
| ==== 2) docker-compose.yml ==== | ==== 2) docker-compose.yml ==== | ||
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| <file yaml> | <file yaml> | ||
| services: | services: | ||
| Zeile 209: | Zeile 207: | ||
| - dc-net | - dc-net | ||
| restart: unless-stopped | restart: unless-stopped | ||
| - | deploy: | ||
| - | resources: | ||
| - | limits: | ||
| - | memory: 256M # RAM-Limit | ||
| networks: | networks: | ||
| Zeile 225: | Zeile 219: | ||
| docker compose ps | docker compose ps | ||
| </ | </ | ||
| + | |||
| **Zugriff: | **Zugriff: | ||
| < | < | ||
| Zeile 232: | Zeile 227: | ||
| ---- | ---- | ||
| - | ==== Stack 02 – File Browser ==== | + | ==== Stack 02 – File Browser |
| **Pfad:** ''/ | **Pfad:** ''/ | ||
| - | ==== 1) Vorbereitung ==== | + | **Warum dieser Fix wichtig ist: |
| + | File Browser nutzt eine SQLite-DB. Wenn die DB-Datei/ | ||
| + | **Lösung: | ||
| - | Viele Docker‑Images laufen nicht als root, sondern als normaler Benutzer im Container.\\ | + | ==== 1) Vorbereitung (Ordner |
| - | Damit der Container Daten speichern kann, müssen die gemounteten | + | |
| - | + | ||
| - | Wir verwenden dafür die Benutzer‑ID 1000, die auf den meisten Linux‑Systemen dem ersten Benutzer entspricht. | + | |
| - | + | ||
| - | Ordner erstellen | + | |
| <code bash> | <code bash> | ||
| - | sudo mkdir -p / | ||
| cd / | cd / | ||
| - | </ | ||
| - | Rechte setzen | + | # Ordnerstruktur anlegen (config + database sind Pflicht) |
| + | mkdir -p config database | ||
| - | <code bash> | + | # DB-Datei manuell anlegen (WICHTIG!) |
| - | sudo chown -R 1000:1000 config | + | touch database/filebrowser.db |
| - | </code> | + | |
| - | + | ||
| - | Damit darf der Container später in diesen Ordner schreiben.\\ | + | |
| - | Warum ist das wichtig? | + | # Rechte |
| - | Wenn die Rechte | + | sudo chown -R 1000:1000 config |
| - | <code bash> | + | |
| - | cp: can't create '/config/ | + | |
| </ | </ | ||
| - | |||
| - | Nach dem Setzen der Rechte kann der Container problemlos starten. | ||
| ==== 2) .env ==== | ==== 2) .env ==== | ||
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| < | < | ||
| TZ=Europe/ | TZ=Europe/ | ||
| Zeile 273: | Zeile 258: | ||
| </ | </ | ||
| - | ==== 3) docker-compose.yml ==== | + | ==== 3) docker-compose.yml |
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| <file yaml> | <file yaml> | ||
| services: | services: | ||
| Zeile 280: | Zeile 266: | ||
| image: filebrowser/ | image: filebrowser/ | ||
| container_name: | container_name: | ||
| - | | + | |
| - | - TZ=${TZ} | + | |
| - | - PUID=${PUID} | + | |
| - | - PGID=${PGID} | + | |
| - | volumes: | + | |
| - | - / | + | |
| - | - ./ | + | |
| ports: | ports: | ||
| - " | - " | ||
| + | volumes: | ||
| + | - / | ||
| + | - ./ | ||
| + | - ./ | ||
| + | command: > | ||
| + | --database / | ||
| + | --root /srv | ||
| + | --port 80 | ||
| networks: | networks: | ||
| - dc-net | - dc-net | ||
| restart: unless-stopped | restart: unless-stopped | ||
| - | deploy: | ||
| - | resources: | ||
| - | limits: | ||
| - | memory: 128M # RAM-Limit | ||
| networks: | networks: | ||
| Zeile 308: | Zeile 292: | ||
| docker compose ps | docker compose ps | ||
| </ | </ | ||
| - | |||
| **Zugriff: | **Zugriff: | ||
| Zeile 314: | Zeile 297: | ||
| http://< | http://< | ||
| </ | </ | ||
| - | \\ | + | |
| - | Einloggen mit: | + | **Standard-Login (bei neuer DB):** |
| < | < | ||
| Username: admin | Username: admin | ||
| - | Password: admin | ||
| </ | </ | ||
| + | \\ | ||
| + | Für das Passwort führen wir einmal | ||
| + | <code bash> | ||
| + | docker logs --tail 200 dc-filebrowser | ||
| + | </ | ||
| + | \\ | ||
| + | aus und kopieren uns das Passwort einmal herraus. | ||
| + | |||
| + | **Tipp:** Direkt nach dem ersten Login Passwort ändern. | ||
| + | |||
| ---- | ---- | ||
| Zeile 327: | Zeile 319: | ||
| ==== 1) .env ==== | ==== 1) .env ==== | ||
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| < | < | ||
| TZ=Europe/ | TZ=Europe/ | ||
| Zeile 335: | Zeile 328: | ||
| ==== 2) docker-compose.yml ==== | ==== 2) docker-compose.yml ==== | ||
| Datei: ''/ | Datei: ''/ | ||
| + | |||
| <file yaml> | <file yaml> | ||
| services: | services: | ||
| Zeile 345: | Zeile 339: | ||
| - ./ | - ./ | ||
| ports: | ports: | ||
| - | - " | + | - " |
| - | - " | + | - " |
| networks: | networks: | ||
| - dc-net | - dc-net | ||
| restart: unless-stopped | restart: unless-stopped | ||
| - | | + | |
| - | resources: | + | |
| - | limits: | + | |
| - | memory: 256M # RAM-Limit | + | |
| networks: | networks: | ||
| dc-net: | dc-net: | ||
| Zeile 368: | Zeile 358: | ||
| ==== 4) Gogs konfigurieren ==== | ==== 4) Gogs konfigurieren ==== | ||
| - | 1. Öffne '' | + | 1. Öffne '' |
| - | 2. **Datenbank: | + | 2. **Datenbank: |
| - | 3. **Domain:** ''< | + | 3. **Domain:** ''< |
| - | 4. **SSH-Port: | + | 4. **SSH-Port: |
| - | 5. **Admin-Benutzer erstellen** und speichern | + | 5. Admin-Benutzer erstellen und speichern |
| - | **Zugriff: | ||
| - | < | ||
| - | http://< | ||
| - | </ | ||
| **Git SSH:** | **Git SSH:** | ||
| < | < | ||
| Zeile 387: | Zeile 373: | ||
| ==== 6) Start-Reihenfolge (empfohlen) ==== | ==== 6) Start-Reihenfolge (empfohlen) ==== | ||
| <code bash> | <code bash> | ||
| - | # 1) DokuWiki | + | # 1) DokuWiki |
| cd / | cd / | ||
| - | # 2) File Browser | + | # 2) File Browser |
| cd / | cd / | ||
| - | # 3) Gogs (Git) | + | # 3) Gogs |
| cd / | cd / | ||
| </ | </ | ||
| Zeile 406: | Zeile 392: | ||
| docker image prune -f | docker image prune -f | ||
| </ | </ | ||
| - | **Erklärung: | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| ---- | ---- | ||
| Zeile 416: | Zeile 398: | ||
| **Wichtige Pfade sichern:** | **Wichtige Pfade sichern:** | ||
| * ''/ | * ''/ | ||
| - | * ''/ | + | * ''/ |
| - | * ''/ | + | * ''/ |
| + | * ''/ | ||
| * ''/ | * ''/ | ||
| Zeile 423: | Zeile 406: | ||
| <code bash> | <code bash> | ||
| cd / | cd / | ||
| - | tar -czvf backup_$(date +%Y-%m-%d).tar.gz wikicore/ | + | tar -czvf backup_$(date +%Y-%m-%d).tar.gz wikicore/ |
| </ | </ | ||
| Zeile 431: | Zeile 414: | ||
| Ersetze ''< | Ersetze ''< | ||
| - | ^ Dienst | + | ^ Dienst |
| - | | Gogs | < | + | | Gogs | < |
| - | | DokuWiki | + | | DokuWiki |
| - | | File Browser | + | | File Browser |
| - | | Cockpit | + | | Cockpit |
| ---- | ---- | ||
| - | ==== 10) RAM-Überwachung ==== | + | ==== 10) RAM-Überwachung |
| <code bash> | <code bash> | ||
| - | sudo apt install htop | + | sudo apt install |
| htop | htop | ||
| </ | </ | ||
| - | **Ziel:** **< 1.8GB RAM-Verbrauch** (sonst Swapping → Performance-Einbruch). | ||
| - | **Optimierungstipps: | ||
| - | * **Gogs:** In '' | ||
| - | * **DokuWiki: | ||
| - | ---- | + | **Docker live prüfen: |
| + | <code bash> | ||
| + | docker stats | ||
| + | </ | ||
| - | ==== 11) Optional: RAM-Upgrade ==== | + | **Ziel:** Unter Last möglichst |
| - | Falls du später | + | |
| - | * **Raspberry Pi 4 mit 4GB oder 8GB RAM** nachrüsten | + | |
| - | * **Dann** die **ursprüngliche CoreStack-Doku** verwenden | + | |
| ---- | ---- | ||
| - | **Fertig!** 🎉 Dein **Raspberry Pi 4 (2GB RAM)** läuft jetzt stabil mit: | + | ==== 11) Fehlerdiagnose |
| - | * ✅ **DokuWiki** | + | <code bash> |
| - | * ✅ **File Browser** (Dateimanagement) | + | # Status |
| - | * ✅ **Gogs** (Git-Repository) | + | docker ps -a |
| - | * ✅ **Cockpit** (Systemverwaltung) | + | |
| - | **Viel Erfolg mit deinem neuen Home-Server!** 🚀 | + | # Logs (Beispiel) |
| + | docker logs --tail 120 dc-filebrowser | ||
| + | docker logs --tail 120 dc-wikicore | ||
| + | docker logs --tail 120 dc-gogs | ||
| + | |||
| + | # Ports belegt? | ||
| + | sudo ss -tulpn | grep -E ': | ||
| + | |||
| + | # Rechte prüfen (File Browser) | ||
| + | ls -la / | ||
| + | ls -la / | ||
| + | </ | ||
| + | |||
| + | **File Browser DB-Fix (wenn es hakt):** | ||
| + | * Existiert '' | ||
| + | * Ist '' | ||
| + | * Läuft der Container mit '' | ||
| ---- | ---- | ||
| + | |||
| + | **Fertig!** 🎉 Dein **Raspberry Pi 4 (2GB RAM)** läuft jetzt stabil mit: | ||
| + | * ✅ **DokuWiki** (Dokumentation) | ||
| + | * ✅ **File Browser** (Dateimanagement) | ||
| + | * ✅ **Gogs** (Git-Repository) | ||
| + | * ✅ **Cockpit** (Systemverwaltung) | ||