From d312a33d9ea2784f483dadf0521d4d841dd7cc67 Mon Sep 17 00:00:00 2001 From: cynfo3000 Date: Sun, 8 Mar 2026 19:46:53 +0100 Subject: [PATCH] docs: Docker-Installationsanleitung in docs/DOCKER.md - Schritt-fuer-Schritt vom ersten git clone bis zum ersten Login - Haeufige Aufgaben: Logs, Neustart, Update, Konfiguration aendern - Datensicherung: pg_dump Befehle - Troubleshooting: die haeufigsten Probleme - Port-Uebersicht - README: Docker-Quickstart auf 4 Zeilen reduziert, Verweis auf DOCKER.md - Actions-Workflow entfernt (keine fertigene Images noetig) - docker-compose.build.yml entfernt (vereinfacht) --- .gitea/workflows/docker-publish.yml | 65 -------- README.md | 32 +--- docker-compose.build.yml | 11 -- docker-compose.yml | 4 +- docs/DOCKER.md | 221 ++++++++++++++++++++++++++++ 5 files changed, 229 insertions(+), 104 deletions(-) delete mode 100644 .gitea/workflows/docker-publish.yml delete mode 100644 docker-compose.build.yml create mode 100644 docs/DOCKER.md diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/docker-publish.yml deleted file mode 100644 index 6a71d4d..0000000 --- a/.gitea/workflows/docker-publish.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Docker Images bauen und pushen - -on: - push: - branches: - - release - tags: - - "v*" - -env: - REGISTRY: git.cynfo.net - IMAGE_BACKEND: git.cynfo.net/christian/rmm2/backend - IMAGE_FRONTEND: git.cynfo.net/christian/rmm2/frontend - -jobs: - build-and-push: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Login in Gitea Container Registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ secrets.REGISTRY_USER }} - password: ${{ secrets.REGISTRY_PASSWORD }} - - - name: Docker Buildx einrichten - uses: docker/setup-buildx-action@v3 - - - name: Image-Tag bestimmen - id: meta - run: | - if [[ "${{ github.ref }}" == refs/tags/* ]]; then - TAG="${{ github.ref_name }}" - else - TAG="latest" - fi - echo "tag=${TAG}" >> $GITHUB_OUTPUT - - - name: Backend bauen und pushen - uses: docker/build-push-action@v5 - with: - context: ./backend - push: true - tags: | - ${{ env.IMAGE_BACKEND }}:${{ steps.meta.outputs.tag }} - ${{ env.IMAGE_BACKEND }}:latest - cache-from: type=registry,ref=${{ env.IMAGE_BACKEND }}:buildcache - cache-to: type=registry,ref=${{ env.IMAGE_BACKEND }}:buildcache,mode=max - - - name: Frontend bauen und pushen - uses: docker/build-push-action@v5 - with: - context: ./frontend - push: true - tags: | - ${{ env.IMAGE_FRONTEND }}:${{ steps.meta.outputs.tag }} - ${{ env.IMAGE_FRONTEND }}:latest - # BACKEND_HOST ist zur Laufzeit nicht bekannt — wird im Compose via Env gesetzt - # Wer eigene Images braucht: docker compose build - cache-from: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache - cache-to: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache,mode=max diff --git a/README.md b/README.md index 43b11f1..90693fe 100644 --- a/README.md +++ b/README.md @@ -160,38 +160,18 @@ Client ──► Backend:ProxyPort ──► WebSocket (Binary) ──► Agent ### Docker (empfohlen) -Der einfachste Weg. Voraussetzung: [Docker](https://docs.docker.com/get-docker/) + [Docker Compose](https://docs.docker.com/compose/install/) installiert. +Voraussetzung: Docker installiert (`curl -fsSL https://get.docker.com | sh`). ```bash -# 1. Repository klonen -git clone https://git.example.com/rmm.git && cd rmm - -# 2. Konfiguration anlegen -cp .env.example .env -``` - -`.env` anpassen: -```env -BACKEND_HOST=192.168.1.100 # IP/Hostname dieses Servers -DB_PASSWORD=sicheres_passwort -JWT_SECRET=$(openssl rand -hex 32) -API_KEY=$(openssl rand -hex 16) -``` - -```bash -# 3. Starten (baut alle Images automatisch) +git clone && cd rmm +git checkout release +cp .env.example .env # .env anpassen (IP-Adresse, Passwörter, API-Key) docker compose up -d - -# 4. Status prüfen -docker compose ps -docker compose logs backend ``` -Fertig. Frontend unter `http://`, Backend-API unter `https://:8443`. +Fertig. Frontend unter `http://`. -> **Hinweis:** Die Frontend-Konfiguration (Backend-Host, API-Key) wird zur **Laufzeit** via ENV -> in den Container injiziert — kein Rebuild bei IP-Änderungen nötig. -> Selbst bauen statt fertige Images: `docker compose -f docker-compose.yml -f docker-compose.build.yml up -d` +Vollständige Anleitung mit allen Details, Troubleshooting und Backup: **[docs/DOCKER.md](docs/DOCKER.md)** --- diff --git a/docker-compose.build.yml b/docker-compose.build.yml deleted file mode 100644 index c79c46c..0000000 --- a/docker-compose.build.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Lokaler Build statt fertige Images verwenden: -# docker compose -f docker-compose.yml -f docker-compose.build.yml up -d - -services: - backend: - build: ./backend - image: ~ - - frontend: - build: ./frontend - image: ~ diff --git a/docker-compose.yml b/docker-compose.yml index d6e28d6..a48202a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,7 @@ services: retries: 10 backend: - image: git.cynfo.net/christian/rmm2/backend:latest + build: ./backend restart: unless-stopped ports: - "8443:8443" @@ -32,7 +32,7 @@ services: condition: service_healthy frontend: - image: git.cynfo.net/christian/rmm2/frontend:latest + build: ./frontend restart: unless-stopped ports: - "80:80" diff --git a/docs/DOCKER.md b/docs/DOCKER.md new file mode 100644 index 0000000..3b8b581 --- /dev/null +++ b/docs/DOCKER.md @@ -0,0 +1,221 @@ +# Docker Installation + +Diese Anleitung erklärt, wie du das RMM-System mit Docker auf einem Linux-Server installierst. + +## Voraussetzungen + +- Linux-Server (Debian 12 / Ubuntu 22.04 oder neuer empfohlen) +- Mindestens 2 GB RAM, 10 GB freier Speicherplatz +- Docker und Docker Compose installiert + +**Docker installieren** (falls noch nicht vorhanden): +```bash +curl -fsSL https://get.docker.com | sh +``` + +Das war es. Docker Compose ist seit Docker 2.x automatisch dabei (`docker compose`). + +--- + +## Installation + +### Schritt 1 — Repository klonen + +```bash +git clone https://git.cynfo.net/christian/rmm2.git +cd rmm2 +git checkout release +``` + +--- + +### Schritt 2 — Konfigurationsdatei anlegen + +```bash +cp .env.example .env +``` + +Öffne `.env` mit einem Texteditor und trage deine Werte ein: + +```bash +nano .env +``` + +Die Datei sieht so aus: + +```env +# IP-Adresse oder Hostname dieses Servers +# (die Adresse über die du später im Browser das Frontend erreichst) +BACKEND_HOST=192.168.1.100 + +# Port des Backends — 8443 ist der Standard, nur ändern wenn nötig +BACKEND_PORT=8443 + +# Datenbank-Passwort — frei wählbar, wird nur intern verwendet +DB_PASSWORD=einSicheresPasswort123 + +# JWT-Secret — langer zufälliger String, mindestens 32 Zeichen +# Tipp: openssl rand -hex 32 +JWT_SECRET=hierEinenLangenZufaelligenStringEintragen + +# API-Key — frei wählbar, wird vom Frontend und den Agents verwendet +# Tipp: openssl rand -hex 16 +API_KEY=hierEinenApiKeyEintragen +``` + +> **Wichtig:** `BACKEND_HOST` ist die IP-Adresse oder der Hostname des Servers auf dem +> Docker läuft — nicht `localhost`. Der Browser muss diese Adresse erreichen können, +> um mit dem Backend zu kommunizieren. + +--- + +### Schritt 3 — Starten + +```bash +docker compose up -d +``` + +Beim ersten Start lädt Docker die benötigten Basis-Images (postgres, nginx etc.) und +baut dann das Backend und das Frontend. Das dauert beim ersten Mal 3-5 Minuten. + +Danach läuft das System und startet automatisch nach einem Server-Reboot neu. + +--- + +### Schritt 4 — Prüfen ob alles läuft + +```bash +docker compose ps +``` + +Die Ausgabe sollte so aussehen: + +``` +NAME STATUS PORTS +rmm-db-1 Up (healthy) 5432/tcp +rmm-backend-1 Up 0.0.0.0:8443->8443/tcp +rmm-frontend-1 Up 0.0.0.0:80->80/tcp +``` + +Alle drei Services müssen `Up` zeigen. Wenn `db` noch `starting` zeigt, warte +20-30 Sekunden — die Datenbank braucht beim allerersten Start etwas länger. + +--- + +### Schritt 5 — Erster Login + +Rufe das Frontend im Browser auf: + +``` +http:// +``` + +Beim ersten Start legt das Backend automatisch einen Admin-Account an. +Die Zugangsdaten stehen im Backend-Log: + +```bash +docker compose logs backend | grep -i "admin\|password\|passwort" +``` + +--- + +## Häufige Aufgaben + +### Logs anschauen + +```bash +# Alle Services +docker compose logs -f + +# Nur Backend +docker compose logs -f backend + +# Nur die letzten 50 Zeilen +docker compose logs --tail=50 backend +``` + +### System stoppen und neu starten + +```bash +# Stoppen (Daten bleiben erhalten) +docker compose down + +# Starten +docker compose up -d + +# Neu starten (z.B. nach Konfigurationsänderung) +docker compose restart backend +``` + +### System aktualisieren + +Nach einem `git pull` musst du die Images neu bauen: + +```bash +git pull +docker compose build +docker compose up -d +``` + +### Konfiguration ändern (`.env` wurde bearbeitet) + +```bash +# Nach Änderung von BACKEND_HOST, API_KEY etc.: +docker compose up -d +``` + +Docker Compose erkennt automatisch, dass sich die ENV-Werte geändert haben +und startet die betroffenen Container neu. + +--- + +## Datensicherung + +Die Datenbank liegt in einem Docker Volume (`pgdata`). Um ein Backup zu erstellen: + +```bash +# Backup erstellen +docker compose exec db pg_dump -U rmm rmm > rmm-backup-$(date +%Y%m%d).sql + +# Backup wiederherstellen +docker compose exec -T db psql -U rmm rmm < rmm-backup-20260101.sql +``` + +--- + +## Troubleshooting + +### Backend startet nicht + +```bash +docker compose logs backend +``` + +Häufige Ursachen: +- **Datenbank noch nicht bereit**: Warte 30 Sekunden, dann `docker compose restart backend` +- **Port 8443 belegt**: Prüfe mit `ss -tlnp | grep 8443` was den Port belegt + +### Frontend zeigt „Verbindung fehlgeschlagen" + +- Prüfe ob `BACKEND_HOST` in `.env` die richtige IP-Adresse ist +- Prüfe ob Port 8443 in der Firewall freigegeben ist +- Teste direkt: `curl -sk https://:8443/api/v1/health` + +### Datenbank-Volume zurücksetzen (Achtung: löscht alle Daten) + +```bash +docker compose down -v # -v löscht auch Volumes +docker compose up -d +``` + +--- + +## Ports + +| Port | Service | Beschreibung | +|------|---------|-------------| +| 80 | Frontend | Web-Oberfläche (Browser) | +| 8443 | Backend | REST-API + WebSocket (Agents + Frontend) | + +Port 80 und 8443 müssen von deinem Netzwerk erreichbar sein. +Port 5432 (Datenbank) ist nur intern verfügbar.