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:start [2026/02/19 13:54] – strangelove | kurse:youtube:digitalcraft_corestack:start [2026/02/20 12:59] (aktuell) – [6) Nächste Schritte] strangelove | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== | + | ====== Digitalcraft CoreStack (Pi 4 / 2GB / SSD) ====== |
| + | <WRAP center round box 80%> | ||
| + | **Ziel:** Du baust dir eine moderne Self-Hosting-Plattform – sauber, wartbar und update-fähig.\\ | ||
| + | **Enthalten: | ||
| + | </ | ||
| - | **Serie:** Digitalcraft WikiCore – CoreStack | + | <WRAP center round info 90%> |
| - | **Ziel:** Modernes Self-Hosting auf dem Raspberry Pi 4 mit Docker/ | + | **Für wen ist das?** |
| - | **Hinweis:** Die SSD ist bereits vorbereitet (Raspberry Pi OS läuft direkt | + | Für Einsteiger, die eine stabile Basis wollen |
| + | **Empfehlung:** 64-Bit | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 1) Titelvorschläge | + | ===== 1) Schnellstart |
| - | | + | * Docker |
| - | | + | * Eine Standard-Ordnerstruktur nutzen: ''/ |
| - | | + | * Ein gemeinsames Docker-Netz verwenden: '' |
| - | | + | * Mehrere Stacks getrennt betreiben und trotzdem miteinander verbinden |
| - | | + | * Updates und Backups pro Dienst sauber durchführen |
| ---- | ---- | ||
| - | ===== 2) Thumbnail-Hook (kurz, hart, klickbar) ===== | + | ===== 2) Video-Reihe (Übersicht) ===== |
| - | - **CORESTACK in 30 MIN** | + | <WRAP center round box 90%> |
| - | | + | ^ # ^ Video ^ Inhalt ^ Ergebnis ^ |
| - | | + | | 01 | **Host vorbereiten |
| - | | + | | 02 | **CoreStack deployen: Ordner |
| + | </ | ||
| - | ---- | + | <WRAP center round tip 90%> |
| - | + | **Hinweis:** Die Reboots und langen Downloads werden im Video geschnitten. Du bekommst trotzdem alle Befehle | |
| - | ===== 3) Kapitelmarken (YouTube Chapters) ===== | + | </WRAP> |
| - | - **0:00** Intro: Digitalcraft WikiCore & CoreStack-Ziel | + | |
| - | - **0:45** Voraussetzung: | + | |
| - | - **1:15** Digitalcraft-Standard: | + | |
| - | - **2:30** System-Update + Architektur-Check (64-bit?) | + | |
| - | - **4:00** Docker + Compose installieren | + | |
| - | - **7:00** CoreStack Deploy: Postgres + n8n + DokuWiki + Gitea + VS Code + Filebrowser | + | |
| - | - **11:30** Proof: Alle Dienste laufen (URLs/Ports) | + | |
| - | - **13:30** Ausblick: **Video 02 = Migration Pi3 → Pi4 (Cutover)** + Checkliste | + | |
| ---- | ---- | ||
| - | ===== 4) Sprechertext | + | ===== 3) Kursmaterial |
| + | <WRAP center round box 90%> | ||
| + | ^ Dokument ^ Zweck ^ | ||
| + | | **Kurs-Handout** | Für Teilnehmer: Schritt-für-Schritt, | ||
| + | </ | ||
| - | ==== Intro (0:00 – 0:45) ==== | + | |
| - | „Willkommen im **Digitalcraft WikiCore-Universum**. Heute bauen wir den **CoreStack** auf einem Raspberry Pi 4 mit 2GB RAM – modern, wartbar und reproduzierbar: | + | |
| - | **On-Screen:** Overlay „Digitalcraft WikiCore – CoreStack v1“. | + | ---- |
| - | + | ||
| - | ==== Voraussetzung (0:45 – 1:15) ==== | + | |
| - | „Wichtig: Das Betriebssystem läuft bei mir **direkt auf der 1TB-SSD**. Das SSD-Setup habe ich bereits in einem eigenen Video gezeigt – heute starten wir genau dort: System ist da, jetzt kommt die Plattform.“ | + | |
| - | + | ||
| - | **On-Screen:** `df -h` + kurzer Blick in `lsblk`. | + | |
| - | + | ||
| - | ==== Digitalcraft-Standard (1:15 – 2:30) ==== | + | |
| - | „Bevor wir irgendwas installieren, | + | |
| - | + | ||
| - | ==== Docker Installation (2:30 – 7:00) ==== | + | |
| - | „Jetzt kommt das Fundament: Docker Engine und das Compose-Plugin. Profi-Hinweis: | + | |
| - | + | ||
| - | ==== CoreStack Deploy (7:00 – 11:30) ==== | + | |
| - | „Jetzt wird’s spannend: Wir starten unseren ersten Digitalcraft CoreStack. Ziel ist nicht Overkill, sondern: **alle Dienste laufen stabil**, Daten sind persistent, und wir haben eine Plattform, die wir später migrieren und erweitern können.“ | + | |
| - | ==== Proof & Ausblick (11:30 – Ende) ==== | + | ===== 4) Zielbild: Dienste & Ports ===== |
| - | „Wenn ihr das hier seht, habt ihr eine moderne Self-Hosting-Plattform auf dem Pi – komplett auf SSD, sauber als Stack. Im nächsten Video kommt der kritische Part: **Migration Pi 3 → Pi 4**, inklusive Cutover und Checks. Link zur Checkliste und zum Compose-Pack findet ihr in der Beschreibung.“ | + | <WRAP center round box 90%> |
| + | ^ Dienst ^ Container ^ Port (Beispiel) ^ URL ^ | ||
| + | | WikiCore (DokuWiki) | '' | ||
| + | | n8n | '' | ||
| + | | PostgreSQL | '' | ||
| + | | Gitea | '' | ||
| + | | code-server | '' | ||
| + | | Filebrowser | '' | ||
| + | | Cockpit (optional) | Host | 9090 | < | ||
| + | </ | ||
| ---- | ---- | ||
| - | ---- | + | ===== 5) Quicklinks |
| - | + | <WRAP center round box 90%> | |
| - | ===== 1) Terminal-Cheatsheet | + | ==== Architektur |
| - | + | ||
| - | + | ||
| - | ==== 1.1 Architektur-Check (64-bit? | + | |
| <code bash> | <code bash> | ||
| getconf LONG_BIT | getconf LONG_BIT | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | Zeigt dir kurz gesagt, ob dein laufendes Linux-System 32-Bit (Ausgabe: 32) oder 64-Bit (Ausgabe: 64) ist. | ||
| - | In meinem fall hier ist es ein 64 bit Linux System also die ausgabe ist 64. | ||
| - | |||
| - | ---- | ||
| - | |||
| - | <code bash> | ||
| dpkg --print-architecture | dpkg --print-architecture | ||
| - | # erwarted arm64 | ||
| - | </ | ||
| - | \\ | ||
| - | '' | ||
| - | \\ | ||
| - | Typische Ausgaben: | ||
| - | * amd64 = 64-Bit PC/Server (Intel/AMD) | ||
| - | * arm64 = 64-Bit ARM (z. B. Raspberry Pi OS 64-Bit) | ||
| - | * armhf = 32-Bit ARM (z. B. Raspberry Pi OS 32-Bit) | ||
| - | * i386 = 32-Bit PC (selten heute) | ||
| - | |||
| - | ---- | ||
| - | |||
| - | <code bash> | ||
| df -h | df -h | ||
| - | </ | ||
| - | \\ | ||
| - | '' | ||
| - | \\ | ||
| - | Auf meinem System ist sie volgendermaßen: | ||
| - | |||
| - | |||
| - | ^Filesystem | ||
| - | |udev |658M| | ||
| - | |tmpfs | ||
| - | |/ | ||
| - | |tmpfs | ||
| - | |tmpfs | ||
| - | |tmpfs | ||
| - | |tmpfs | ||
| - | |/ | ||
| - | |tmpfs | ||
| - | |tmpfs | ||
| - | |tmpfs | ||
| - | |||
| - | ---- | ||
| - | |||
| - | <code bash> | ||
| lsblk | lsblk | ||
| </ | </ | ||
| - | \\ | ||
| - | ^ NAME ^ MAJ: | ||
| - | | loop0 | ||
| - | | sda | ||
| - | | ├─sda1 | ||
| - | | └─sda2 | ||
| - | | zram0 | ||
| - | |||
| - | '' | ||
| - | |||
| - | Du siehst typischerweise: | ||
| - | * Gerätenamen wie sda, nvme0n1, mmcblk0 | ||
| - | * Partitionen wie sda1, sda2 | ||
| - | * Größe, Typ (Disk/ | ||
| - | * Mountpoints (z. B. /, /mnt/data) | ||
| - | |||
| - | Praktisch, um schnell zu prüfen: Welche Platte ist welche und wo hängt sie im System. | ||
| - | |||
| - | ---- | ||
| - | |||
| - | '' | ||
| - | |||
| - | **Hinweis: | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | |||
| - | ---- | ||
| - | ==== 1.2 System-Update ==== | + | ==== System-Update ==== |
| <code bash> | <code bash> | ||
| sudo apt update && sudo apt full-upgrade -y | sudo apt update && sudo apt full-upgrade -y | ||
| - | sudo raspi-config | ||
| sudo reboot | sudo reboot | ||
| </ | </ | ||
| - | '' | + | ==== Docker ohne sudo + Test ==== |
| - | Aktualisiert zuerst die Paketlisten (apt update) und führt danach ein vollständiges System-Upgrade durch (apt full-upgrade). Dabei dürfen – falls nötig – auch Pakete neu installiert oder entfernt werden, um Abhängigkeiten sauber aufzulösen. -y bestätigt alles automatisch. Das && sorgt dafür, dass das Upgrade nur startet, wenn das Update erfolgreich war. | + | |
| - | + | ||
| - | + | ||
| - | '' | + | |
| - | Im Raspi-Config einmal den " | + | |
| - | auf die Gesamte SSD schreiben. | + | |
| - | + | ||
| - | '' | + | |
| - | Startet den Rechner neu (oft sinnvoll nach Kernel-/ | + | |
| - | ---- | + | |
| - | ==== 1.3 Digitalcraft-Ordnerstruktur ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | sudo apt install mc | + | |
| - | </ | + | |
| - | \\ | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | \\ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | <code bash> | + | |
| - | sudo mkdir -p / | + | |
| - | </ | + | |
| - | \\ | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | ''/ | + | |
| - | '' | + | |
| - | \\ | + | |
| - | Ergebnis sind diese Ordner: | + | |
| - | + | ||
| - | * / | + | |
| - | * / | + | |
| - | * / | + | |
| - | * / | + | |
| - | * / | + | |
| - | * / | + | |
| - | * / | + | |
| - | + | ||
| - | Kurz: Ein Befehl, der dir sauber die Verzeichnisse für alle Container-Daten vorbereitet. | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | <code bash> | + | |
| - | sudo chown -R $USER:$USER / | + | |
| - | </ | + | |
| - | \\ | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | ''/ | + | |
| - | \\ | + | |
| - | Zweck: Du kannst danach die Docker-Stack-Dateien und Configs in diesem Ordner | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | <code bash> | + | |
| - | cd / | + | |
| - | </ | + | |
| - | \\ | + | |
| - | '' | + | |
| - | '' | + | |
| - | \\ | + | |
| - | Danach arbeitest du direkt in diesem Ordner (z. B. um dort docker-compose.yml zu bearbeiten oder Befehle auszuführen).\\ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ==== 1.4 Cockpitb Installation ==== | + | |
| - | \\ | + | |
| - | <code bash> | + | |
| - | sudo apt install -y cockpit | + | |
| - | </ | + | |
| - | \\ | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | + | ||
| - | Nach der Installation erreichst du Cockpit meist im Browser unter:\\ | + | |
| - | < | + | |
| - | \\ | + | |
| - | \\ | + | |
| - | < | + | |
| - | sudo systemctl enable --now cockpit.socket | + | |
| - | </ | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | '' | + | |
| - | \\ | + | |
| - | Danach ist Cockpit in der Regel erreichbar unter: https://< | + | |
| - | \\ | + | |
| - | Zugriff im Browser (Self-signed Zertifikat ist normal): | + | |
| - | < | + | |
| - | \\ | + | |
| - | Status prüfen: | + | |
| - | <code bash> | + | |
| - | systemctl status cockpit.socket --no-pager | + | |
| - | ss -tulpn | grep 9090 || true | + | |
| - | </ | + | |
| - | \\ | + | |
| - | \\ | + | |
| - | ==== 5.4 Docker | + | |
| - | <code bash> | + | |
| - | sudo apt-get install -y ca-certificates curl gnupg | + | |
| - | sudo install -m 0755 -d / | + | |
| - | curl -fsSL https:// | + | |
| - | sudo chmod a+r / | + | |
| - | + | ||
| - | echo \ | + | |
| - | "deb [arch=$(dpkg --print-architecture) signed-by=/ | + | |
| - | $(. / | + | |
| - | sudo tee / | + | |
| - | + | ||
| - | sudo apt-get update | + | |
| - | sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin | + | |
| - | </ | + | |
| - | + | ||
| - | Docker-Gruppe (danach neu anmelden oder `newgrp`): | + | |
| <code bash> | <code bash> | ||
| sudo usermod -aG docker $USER | sudo usermod -aG docker $USER | ||
| Zeile 292: | Zeile 82: | ||
| docker compose version | docker compose version | ||
| </ | </ | ||
| + | </ | ||
| ---- | ---- | ||
| - | ===== 6) CoreStack Dateien (.env + docker-compose.yml) | + | ===== 6) Nächste Schritte |
| + | <WRAP center round important 90%> | ||
| + | **Bitte starte mit Video 01.** \\ | ||
| + | Danach Video 02 – erst dann werden Stacks deployed. | ||
| + | </ | ||
| - | ==== 6.1 .env (Pfad: / | + | * → **Video 01:** Host vorbereiten + Docker installieren |
| - | < | + | * → **Video 02:** CoreStack Ordner + Netzwerk + Stacks starten |
| - | TZ=Europe/ | + | |
| - | + | ||
| - | # n8n: unbedingt setzen, damit Credentials stabil bleiben (auch bei Migration) | + | |
| - | N8N_ENCRYPTION_KEY=CHANGE_ME_TO_A_LONG_RANDOM_KEY | + | |
| - | + | ||
| - | # Postgres | + | |
| - | POSTGRES_DB=n8n | + | |
| - | POSTGRES_USER=n8n | + | |
| - | POSTGRES_PASSWORD=CHANGE_ME_STRONG | + | |
| - | + | ||
| - | # Ports (Starter: bewusst einfach – Reverse Proxy kommt später als Pro-Modul) | + | |
| - | PORT_DOKUWIKI=8080 | + | |
| - | PORT_N8N=5678 | + | |
| - | PORT_GITEA=3000 | + | |
| - | PORT_GITEA_SSH=2222 | + | |
| - | PORT_CODESERVER=8443 | + | |
| - | PORT_FILEBROWSER=8081 | + | |
| - | </ | + | |
| - | + | ||
| - | **n8n Hinweis:** Environment Variables / Deployment: | + | |
| - | [[https:// | + | |
| - | + | ||
| - | ==== 6.2 docker-compose.yml (Pfad: / | + | |
| - | <code yaml> | + | |
| - | services: | + | |
| - | | + | |
| - | image: postgres: | + | |
| - | container_name: | + | |
| - | environment: | + | |
| - | - TZ=${TZ} | + | |
| - | - POSTGRES_DB=${POSTGRES_DB} | + | |
| - | - POSTGRES_USER=${POSTGRES_USER} | + | |
| - | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | restart: unless-stopped | + | |
| - | + | ||
| - | n8n: | + | |
| - | image: n8nio/ | + | |
| - | container_name: | + | |
| - | environment: | + | |
| - | - TZ=${TZ} | + | |
| - | - DB_TYPE=postgresdb | + | |
| - | - DB_POSTGRESDB_HOST=postgres | + | |
| - | - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} | + | |
| - | - DB_POSTGRESDB_USER=${POSTGRES_USER} | + | |
| - | - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD} | + | |
| - | - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} | + | |
| - | ports: | + | |
| - | - " | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | depends_on: | + | |
| - | - postgres | + | |
| - | restart: unless-stopped | + | |
| - | + | ||
| - | dokuwiki: | + | |
| - | image: lscr.io/ | + | |
| - | container_name: | + | |
| - | environment: | + | |
| - | - TZ=${TZ} | + | |
| - | - PUID=1000 | + | |
| - | - PGID=1000 | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | ports: | + | |
| - | - " | + | |
| - | restart: unless-stopped | + | |
| - | + | ||
| - | gitea: | + | |
| - | image: gitea/ | + | |
| - | container_name: | + | |
| - | environment: | + | |
| - | - TZ=${TZ} | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | ports: | + | |
| - | - " | + | |
| - | - " | + | |
| - | restart: unless-stopped | + | |
| - | + | ||
| - | codeserver: | + | |
| - | image: lscr.io/ | + | |
| - | container_name: | + | |
| - | environment: | + | |
| - | - TZ=${TZ} | + | |
| - | - PUID=1000 | + | |
| - | - PGID=1000 | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | - ./ | + | |
| - | ports: | + | |
| - | - " | + | |
| - | restart: unless-stopped | + | |
| - | + | ||
| - | filebrowser: | + | |
| - | image: filebrowser/ | + | |
| - | container_name: | + | |
| - | volumes: | + | |
| - | - ./ | + | |
| - | - ./ | + | |
| - | - ./ | + | |
| - | ports: | + | |
| - | - " | + | |
| - | restart: unless-stopped | + | |
| - | </ | + | |
| - | + | ||
| - | **Image-Dokus (optional, fürs Quellen-Kapitel):** | + | |
| - | * DokuWiki (LinuxServer): | + | |
| - | * code-server (LinuxServer): | + | |
| - | * Gitea (Docker): [[https:// | + | |
| ---- | ---- | ||
| - | ===== 7) Stack starten + prüfen ===== | + | <WRAP center round info 90%> |
| - | <code bash> | + | **Digitalcraft Standard:** |
| - | cd / | + | * pro Dienst ein eigener Ordner |
| - | docker compose up -d | + | * ein gemeinsames Netz (dc-net) |
| - | docker compose ps | + | * Updates pro Stack |
| - | </ | + | * Backups der Datenordner – nicht der Container |
| - | + | </WRAP> | |
| - | Logs (bei Bedarf): | + | |
| - | <code bash> | + | |
| - | docker logs -f dc-wikicore | + | |
| - | docker logs -f dc-n8n | + | |
| - | docker logs -f dc-gitea | + | |
| - | </ | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ===== 8) Dienste testen (Browser) ===== | + | |
| - | Ersetze < | + | |
| - | + | ||
| - | | + | |
| - | * **n8n:** < | + | |
| - | * **Gitea:** < | + | |
| - | * **VS Code (code-server):** < | + | |
| - | * **Filebrowser: | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ===== 9) YouTube-Beschreibung (fertig zum Einfügen) ===== | + | |
| - | **Digitalcraft CoreStack (Pi 4 / 2GB / 1TB SSD): | + | |
| - | Heute bauen wir eine moderne Self-Hosting-Plattform mit Docker & Compose – inklusive | + | |
| - | + | ||
| - | Ergebnis: Alles läuft als Stack, Daten sind persistent, Struktur ist sauber. | + | |
| - | Nächstes Video: | + | |
| - | + | ||
| - | **Downloads (kostenlos): | + | |
| - | + | ||
| - | **Chapters: | + | |
| - | 0:00 Intro … (Kapitel einfügen) | + | |
| - | + | ||
| - | ---- | + | |
| - | + | ||
| - | ===== 10) Nächster Schritt (Video 02 Teaser) ===== | + | |
| - | **Nächstes Video:** Migration Pi 3 → Pi 4 | + | |
| - | - Freeze (Dienste stoppen) | + | |
| - | - Backup (Volumes/Configs) | + | |
| - | - Transfer (rsync) | + | |
| - | - Restore (Pi 4) | + | |
| - | - Funktionstest + Cutover | + | |
| - | + | ||
| - | **Ziel:** Umstieg ohne Chaos – nachvollziehbar, | + | |
| - | + | ||
| - | ---- | + | |