# Frontend — Installation, Build & Deploy React + Vite + TailwindCSS Web-Frontend, deployed als statische Dateien über Nginx. ## Eckdaten | | | |---|---| | **Tech** | React 18, Vite, TailwindCSS, Recharts, Zustand, lucide-react | | **Theme** | Dark mit Orange-Akzent, komplett deutsch | | **Auth** | JWT Login (8h Token) | | **Standard-Login** | `admin` / `Start!123` (beim ersten Backend-Start angelegt) | | **Frontend-Server** | separater LXC / Debian-Server mit Nginx | | **Backend-Verbindung** | direkter HTTPS-API-Call zu `https://BACKEND_IP:8443` | --- ## 1. Voraussetzungen (Frontend-Server: Debian/Ubuntu) Build und Serving laufen auf demselben Linux-Server. ```bash # Node.js 20+ über NodeSource-Repository installieren curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt install -y nodejs # Version prüfen node -v # → v20.x.x npm -v # → 10.x.x # Repo klonen git clone https://git.cynfo.net/christian/rmm2.git /opt/rmm cd /opt/rmm/frontend # Abhängigkeiten installieren (einmalig) npm install ``` --- ## 2. Backend-URL konfigurieren **VOR dem Build** muss `frontend/src/config.js` angelegt werden. Die Datei ist in `.gitignore` und wird nicht eingecheckt (enthält echte IP + API-Key). ```bash cp frontend/src/config.example.js frontend/src/config.js ``` Dann `config.js` anpassen: ```js // frontend/src/config.js export const BACKEND_HOST = '' // IP des Backend-Servers (für direkte Links, z.B. Tunnel-Ports) export const BACKEND_URL = `https://${BACKEND_HOST}:8443` export const API_KEY = 'DEIN_API_KEY' // aus backend/config.yaml → api_keys[0] ``` > **Hinweis:** API-Calls laufen im Produktivbetrieb über den Nginx-Proxy (`/api/` → Backend). > `BACKEND_HOST` wird nur noch für direkte Links verwendet (z.B. WebGUI-Tunnel-Ports). > `BACKEND_URL` wird im Dev-Server-Modus (Vite) für direkte API-Calls verwendet. Für die **lokale Entwicklung** (`npm run dev`) muss zusätzlich `vite.config.js` angepasst werden: ```js // vite.config.js → server.proxy proxy: { '/api': { target: 'https://:8443', // Backend-IP anpassen changeOrigin: true, secure: false, ws: true, // WebSocket-Proxy aktivieren (Web Terminal, Agent-WS) } } ``` --- ## 3. Build ```bash cd frontend npm run build ``` Erzeugt `frontend/dist/` mit: - `index.html` - `assets/index-[hash].js` (~330 KB) - `assets/index-[hash].css` (~32 KB) - `vite.svg` --- ## 4. Nginx auf dem Frontend-Server installieren ```bash # Debian 12/13 apt update apt install -y nginx systemctl enable nginx systemctl start nginx ``` --- ## 5. Nginx konfigurieren React Router benötigt ein Nginx-Config das alle Routen auf `index.html` umleitet. Zusätzlich proxyt Nginx alle `/api/`-Requests zum Backend — das löst zwei Probleme: - **CORS** entfällt komplett (gleicher Origin) - **WebSocket-Verbindungen** (Web Terminal, Agent-WS) funktionieren ohne Browser-Zertifikatswarning > **Wichtig:** `proxy_ssl_verify off` ist nötig da das Backend ein selbstsigniertes Zertifikat verwendet. > **Wichtig:** `proxy_read_timeout 86400` ist nötig für lang laufende WebSocket-Verbindungen (Terminal, Tunnel). ```bash # Bestehende Default-Config ersetzen cat > /etc/nginx/sites-available/rmm-frontend << 'EOF' server { listen 80; server_name _; root /var/www/html; index index.html; # API Reverse-Proxy zum Backend (REST + WebSocket) location /api/ { client_max_body_size 50m; proxy_pass https://:8443; proxy_ssl_verify off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket-Support (Web Terminal, Agent-WS, Tunnel) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } # React SPA — alle Routen auf index.html location / { try_files $uri $uri/ /index.html; } # Statische Assets mit Cache location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; } # Kein Zugriff auf versteckte Dateien location ~ /\. { deny all; } } EOF ln -sf /etc/nginx/sites-available/rmm-frontend /etc/nginx/sites-enabled/rmm-frontend rm -f /etc/nginx/sites-enabled/default nginx -t && systemctl reload nginx ``` > **Backend-IP anpassen:** `:8443` durch die tatsächliche Backend-Adresse ersetzen. --- ## 6. Deploy (auf dem Frontend-Server selbst) ```bash cd /opt/rmm/frontend # Alten Build löschen (Pflicht — Vite nutzt Hash-basierte Dateinamen) rm -rf dist/ /var/www/html/assets/* # Build erstellen npm run build # In Nginx-Webroot kopieren cp -r dist/* /var/www/html/ # Nginx neu laden nginx -s reload ``` **Wichtig:** `assets/*` MUSS vor jedem Deploy gelöscht werden — Vite generiert Hash-basierte Dateinamen (`index-Dv2B5kJs.js`). Alte Dateien bleiben sonst liegen und der Browser bekommt beim nächsten Laden 404-Fehler. ### Als Einzeiler (nach Änderungen am Code) ```bash cd /opt/rmm && git pull && cd frontend && npm install && \ rm -rf dist/ /var/www/html/assets/* && npm run build && \ cp -r dist/* /var/www/html/ && nginx -s reload && echo "Deploy fertig" ``` --- ## 7. Erster Login ``` URL: http://FRONTEND_SERVER_IP Benutzer: admin Passwort: Start!123 ``` Passwort sofort ändern unter **Einstellungen → Benutzer**. --- ## 8. Lokale Entwicklung (optional) ```bash cd /opt/rmm/frontend npm run dev ``` Startet Vite Dev-Server auf `http://FRONTEND_IP:5173` mit Hot-Reload. API-Calls werden per Proxy an das Backend weitergeleitet — `vite.config.js` anpassen: ```js // vite.config.js proxy: { '/api': { target: 'https://:8443', // Backend-IP anpassen changeOrigin: true, secure: false, ws: true, // WebSocket-Proxy (Web Terminal, Agent-WS) } } ``` --- ## Seiten | Seite | Route | Beschreibung | |-------|-------|-------------| | Login | `/login` | JWT Login | | Dashboard | `/` | Status-Kacheln, Agent-Liste, AgentPanel per Klick | | Firewalls | `/agents` | Suchbare Tabelle, AgentPanel mit Tabs, Hinzufügen/Löschen | | Tunnel | `/tunnels` | Globale Tunnel-Übersicht über alle Firewalls | | Firmware | `/firmware` | Multi-Plattform Upload, Agent-Update-Trigger | | Kunden | `/customers` | CRUD Kundenverwaltung | | Einstellungen | `/settings` | Benutzerverwaltung, Passwörter ändern | ## AgentPanel Tabs | Tab | Inhalt | |-----|--------| | Übersicht | Hardware, OS, Uptime, CPU/RAM, Lizenz (Business Edition) | | Interfaces | Netzwerk-Interfaces mit IP, MAC, Status, RX/TX | | Dienste | Laufende Services mit Status-Badge | | Tunnel | Quick-Buttons (WebGUI, SSH, Custom), aktive Tunnel | | VPN | WireGuard-Instanzen mit Transfer-Statistiken | | WireGuard | Peer-Management (CRUD), Client-Config mit Copy-Button | | Routen | Routing-Tabelle | | DHCP | Aktive Leases mit Suche (IP, MAC, Hostname) | | Zertifikate | Karten-Layout mit Ablaufdatum und Fortschrittsbalken | | Backups | Config-Backup erstellen, Liste, Download als XML | | Agent | Version, Agent-ID, Update-Button, Remote-Befehle | --- ## Dateistruktur ``` frontend/ ├── src/ │ ├── config.js # NICHT im Git — vor Build anlegen (s.o.) │ ├── config.example.js # Vorlage mit Platzhaltern │ ├── App.jsx # Router + ProtectedRoute │ ├── main.jsx # Entry Point │ ├── index.css # TailwindCSS + Custom Styles │ ├── api/client.js # API Client (alle Endpoints) │ ├── stores/auth.js # Zustand Auth Store (JWT Token) │ ├── layouts/AppLayout.jsx # Sidebar Navigation + Outlet │ ├── components/ │ │ ├── AgentPanel.jsx # Side Panel mit 11 Tabs │ │ └── StatusBadge.jsx # Online/Offline/Stale Badge │ └── pages/ │ ├── Dashboard.jsx # Status-Kacheln + Agent-Liste │ ├── Agents.jsx # Firewall-Tabelle + Pre-Registration │ ├── Tunnels.jsx # Globale Tunnel-Übersicht │ ├── Firmware.jsx # Multi-Plattform Firmware + Updates │ ├── Customers.jsx # Kunden CRUD │ ├── SettingsPage.jsx # User-Management + Passwort │ └── Login.jsx # JWT Login ├── vite.config.js # Vite Config (Proxy für Dev-Server) └── package.json ```