# Deployment-Anleitung: Mobile Tag auf Ubuntu-Server Diese Anleitung beschreibt, wie du das Mobile Tag Projekt auf deinen bestehenden Ubuntu-Webserver mit PHP bringst. Das Backend benötigt Node.js (siehe `UBUNTU_SETUP.md`), das Frontend ist eine statische PWA. --- ## Übersicht | Komponente | Technologie | Pfad auf Server | Auslieferung | |---|---|---|---| | Backend | Node.js + Socket.io | `/var/www/mobile-tag/server/dist` | PM2 auf Port 3001 | | Frontend (PWA) | Vite-Build | `/var/www/mobile-tag/client/dist` | Apache oder Nginx | | WebSocket | Socket.io | `:3001` | Nginx Reverse Proxy (empfohlen) | --- ## Voraussetzungen - Ubuntu-Server mit SSH-Zugriff - Node.js ≥ 18 installiert (`node -v` und `npm -v` prüfen) - Apache oder Nginx als Webserver - Domain oder Server-IP - Ports 80, 443 und optional 3001 freigegeben --- ## Schritt 1: Projekt auf den Server kopieren ### Vom Windows-Rechner (mit Git Bash, WSL oder PowerShell) ```bash # Mit scp (Pfad anpassen!) scp -r "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag" root@dein-server:/var/www/mobile-tag ``` ### Alternativ als ZIP 1. Auf dem Windows-Rechner den `Mobil_Tag`-Ordner als ZIP packen 2. ZIP per FTP/SFTP in `/var/www/` hochladen 3. Auf dem Server entpacken: ```bash cd /var/www sudo apt install unzip -y sudo unzip mobile-tag.zip sudo mv Mobil_Tag mobile-tag ``` **Wichtig:** Falls du schon einmal `npm install` lokal gemacht hast, lösche vor dem Kopieren die Ordner `node_modules`: ```bash # Auf Windows, bevor du kopierst: Remove-Item -Recurse -Force "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag/node_modules" Remove-Item -Recurse -Force "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag/client/node_modules" Remove-Item -Recurse -Force "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag/server/node_modules" ``` --- ## Schritt 2: Server vorbereiten ```bash # Ins Projektverzeichnis wechseln cd /var/www/mobile-tag # Rechte setzen (falls nötig) sudo chown -R www-data:www-data /var/www/mobile-tag sudo chmod -R 755 /var/www/mobile-tag # Node-Version prüfen node -v # Sollte v20.x oder höher anzeigen npm -v ``` --- ## Schritt 3: Abhängigkeiten installieren ```bash cd /var/www/mobile-tag npm run install:all ``` Das installiert automatisch: - Root-Abhängigkeiten (`concurrently`) - Client-Abhängigkeiten (React, Vite, TensorFlow.js, Tailwind, ...) - Server-Abhängigkeiten (Express, Socket.io, ...) --- ## Schritt 4: Server-URL konfigurieren Der Client muss wissen, wo das Backend läuft. ```bash cd /var/www/mobile-tag/client cp .env.example .env ``` Dann `.env` bearbeiten: ```bash # Variante A: Backend läuft auf eigener Subdomain (empfohlen mit Nginx) VITE_SERVER_URL=https://api.dein-domain.de # Variante B: Backend läuft direkt auf Port 3001 VITE_SERVER_URL=http://dein-server-ip:3001 # Variante C: Beides auf derselben Domain mit Nginx Reverse Proxy VITE_SERVER_URL=https://dein-domain.de ``` **Wichtig:** Wenn du HTTPS nutzt, muss auch `VITE_SERVER_URL` mit `https://` beginnen. --- ## Schritt 5: Projekt bauen ```bash cd /var/www/mobile-tag npm run build ``` Ergebnis: - `server/dist/` – kompilierter Node.js-Server - `client/dist/` – fertige PWA-Dateien --- ## Schritt 6: Backend starten ### Variante A: Mit PM2 (empfohlen für Produktion) ```bash # PM2 global installieren sudo npm install -g pm2 # Server als Dienst starten cd /var/www/mobile-tag/server pm2 start dist/index.js --name mobile-tag-server # PM2 so einrichten, dass es nach Neustart automatisch startet pm2 save pm2 startup # → Den angezeigten Befehl kopieren und ausführen (meist mit sudo) ``` **Nützliche PM2-Befehle:** ```bash pm2 status # Status anzeigen pm2 logs mobile-tag-server # Logs anzeigen pm2 restart mobile-tag-server pm2 stop mobile-tag-server pm2 delete mobile-tag-server ``` ### Variante B: Einfacher Test ohne PM2 ```bash cd /var/www/mobile-tag/server npm start ``` Läuft dann solange das Terminal offen ist. --- ## Schritt 7: Frontend ausliefern ### Mit Apache 1. `client/dist/` in dein Webverzeichnis kopieren: ```bash sudo mkdir -p /var/www/html/mobile-tag sudo cp -r /var/www/mobile-tag/client/dist/* /var/www/html/mobile-tag/ ``` 2. Falls nötig, Apache konfigurieren (Single-Page-App-Routing): ```bash sudo nano /etc/apache2/sites-available/mobile-tag.conf ``` ```apache ServerName dein-domain.de DocumentRoot /var/www/html/mobile-tag Options -Indexes +FollowSymLinks AllowOverride All Require all granted RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ /index.html [L] ``` Aktivieren: ```bash sudo a2enmod rewrite sudo a2ensite mobile-tag.conf sudo systemctl reload apache2 ``` ### Mit Nginx (empfohlen) ```bash sudo nano /etc/nginx/sites-available/mobile-tag ``` ```nginx server { listen 80; server_name dein-domain.de; root /var/www/html/mobile-tag; index index.html; location / { try_files $uri $uri/ /index.html; } # WebSocket-Verkehr an Node.js weiterleiten location /socket.io/ { proxy_pass http://localhost:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; proxy_cache_bypass $http_upgrade; } } ``` Aktivieren: ```bash sudo ln -s /etc/nginx/sites-available/mobile-tag /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx ``` **Hinweis:** Wenn du Apache statt Nginx verwendest und den Node-Server direkt auf Port 3001 erreichbar machen willst, musst du Port 3001 in der Firewall freigeben (siehe Schritt 9). --- ## Schritt 8: HTTPS mit Let's Encrypt einrichten Dieser Schritt ist **zwingend erforderlich**, da Kamera, GPS und Orientierung in Browsern nur mit HTTPS funktionieren. ### Mit Nginx ```bash sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d dein-domain.de ``` ### Mit Apache ```bash sudo apt install certbot python3-certbot-apache -y sudo certbot --apache -d dein-domain.de ``` Danach ist die App unter `https://dein-domain.de` erreichbar. --- ## Schritt 9: Firewall konfigurieren ### Wenn Nginx als Reverse Proxy verwendet wird Port 3001 muss **nicht** öffentlich erreichbar sein, da Nginx intern weiterleitet: ```bash sudo ufw allow 'Nginx Full' sudo ufw allow OpenSSH sudo ufw enable ``` ### Wenn der Node-Server direkt auf Port 3001 erreichbar sein soll ```bash sudo ufw allow 3001/tcp sudo ufw allow 'Apache Full' # oder 'Nginx Full' sudo ufw allow OpenSSH sudo ufw enable ``` --- ## Schritt 10: App testen 1. Öffne im Handy-Browser: `https://dein-domain.de` 2. Erlaube Kamera, Standort und Orientierung. 3. Erstelle einen Raum und teile den Code. 4. Ein zweiter Spieler tritt dem Raum bei. 5. Host startet das Spiel. --- ## Updates einspielen Wenn du Änderungen am Code machst: ```bash cd /var/www/mobile-tag # Neue Dateien vom lokalen Rechner auf den Server kopieren (Schritt 1 wiederholen) # Dann auf dem Server: npm run install:all npm run build pm2 restart mobile-tag-server # Bei Apache: sudo cp -r /var/www/mobile-tag/client/dist/* /var/www/html/mobile-tag/ # Bei Nginx (falls DocumentRoot direkt auf /var/www/mobile-tag/client/dist zeigt, nicht nötig): sudo cp -r /var/www/mobile-tag/client/dist/* /var/www/html/mobile-tag/ ``` --- ## Fehlerbehebung ### „npm: Befehl nicht gefunden" Node.js ist nicht installiert oder nicht im PATH. Siehe `UBUNTU_SETUP.md`. ### „Port 3001 bereits belegt" ```bash sudo lsof -i :3001 # Prozess-ID merken und beenden: sudo kill -9 pm2 restart mobile-tag-server ``` ### „WebSocket-Verbindung fehlgeschlagen" - Prüfe, ob der Server läuft: `pm2 status` - Prüfe die Firewall: `sudo ufw status` - Prüfe, ob `VITE_SERVER_URL` korrekt ist - Prüfe die Nginx-Konfiguration auf das `/socket.io/`-Location-Block ### „Kamera/GPS funktioniert nicht" - HTTPS erforderlich! - Browser-Berechtigungen prüfen - Auf iOS: nur Safari unterstützt DeviceOrientation vollständig ### „Permission denied" beim Kopieren ```bash sudo chown -R $USER:$USER /var/www/mobile-tag ``` --- ## Zusammenfassung der wichtigsten Befehle ```bash # Nach dem Kopieren auf den Server: cd /var/www/mobile-tag npm run install:all npm run build cd client cp .env.example .env # .env bearbeiten: VITE_SERVER_URL anpassen cd /var/www/mobile-tag npm run build cd server pm2 start dist/index.js --name mobile-tag-server pm2 save pm2 startup # Nginx-Konfiguration anlegen und HTTPS einrichten ``` --- *Stand: 26.07.2026*