# TimeClock v3 - Deployment Guide für Ubuntu 22.04 Dieser Guide beschreibt das komplette Deployment der TimeClock-App auf einem Ubuntu 22.04 Server unter der URL **stechuhr3.tsschulz.de**. ## Voraussetzungen ### Software-Anforderungen - Ubuntu 22.04 LTS - Node.js v18+ (empfohlen: v20) - MySQL 8.0 oder MariaDB 10.6+ - Nginx - Certbot (für SSL/Let's Encrypt) - PM2 oder systemd für Process Management ### Domain & DNS - Domain: `stechuhr3.tsschulz.de` - DNS A-Record muss auf die Server-IP zeigen ## Schritt 1: System-Vorbereitung ```bash # System aktualisieren sudo apt update && sudo apt upgrade -y # Node.js 20.x installieren curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs # Nginx installieren sudo apt install -y nginx # Certbot für SSL installieren sudo apt install -y certbot python3-certbot-nginx # PM2 global installieren (empfohlen) sudo npm install -g pm2 # MySQL/MariaDB sollte bereits installiert sein # Falls nicht: # sudo apt install -y mysql-server ``` ## Schritt 2: Datenbank vorbereiten ```bash # In MySQL/MariaDB einloggen sudo mysql -u root -p # Datenbank und User erstellen (falls noch nicht vorhanden) CREATE DATABASE IF NOT EXISTS stechuhr2; CREATE USER IF NOT EXISTS 'timeclock'@'localhost' IDENTIFIED BY 'SICHERES_PASSWORT'; GRANT ALL PRIVILEGES ON stechuhr2.* TO 'timeclock'@'localhost'; FLUSH PRIVILEGES; EXIT; # Schema importieren (falls noch nicht vorhanden) # mysql -u timeclock -p stechuhr2 < backend/database-schema.sql ``` ## Schritt 3: Projekt auf Server klonen/übertragen ```bash # Projekt-Verzeichnis erstellen sudo mkdir -p /var/www cd /var/www # Mit Git klonen (oder per SCP übertragen) # sudo git clone https://github.com/IHR-USERNAME/TimeClock.git timeclock # ODER das lokale Projekt übertragen: # rsync -avz --exclude 'node_modules' ~/Programs/TimeClock/ user@server:/var/www/timeclock/ # Eigentümer setzen sudo chown -R $USER:$USER /var/www/timeclock ``` ## Schritt 4: Backend konfigurieren ```bash cd /var/www/timeclock/backend # Dependencies installieren npm install --production # .env Datei erstellen cp .env.production.example .env # .env bearbeiten und folgende Werte anpassen: nano .env ``` **Wichtige .env Variablen:** ```env NODE_ENV=production PORT=3010 # Datenbank DB_HOST=localhost DB_NAME=stechuhr2 DB_USER=timeclock DB_PASSWORD=IHR_DB_PASSWORT # JWT JWT_SECRET=IHR_SICHERER_JWT_SECRET_KEY JWT_EXPIRES_IN=7d # Session SESSION_SECRET=IHR_SICHERER_SESSION_SECRET # Frontend URL FRONTEND_URL=https://stechuhr3.tsschulz.de # Email (optional, für Passwort-Reset) EMAIL_HOST=smtp.example.com EMAIL_PORT=587 EMAIL_USER=your-email@example.com EMAIL_PASSWORD=your-email-password EMAIL_FROM=noreply@tsschulz.de # OAuth (optional, falls Google OAuth verwendet wird) GOOGLE_CLIENT_ID=your-client-id GOOGLE_CLIENT_SECRET=your-client-secret GOOGLE_CALLBACK_URL=https://stechuhr3.tsschulz.de/api/auth/oauth/google/callback ``` ## Schritt 5: Frontend bauen ```bash cd /var/www/timeclock/frontend # Dependencies installieren npm install # Produktions-Build erstellen npm run build # Build-Dateien werden in /var/www/timeclock/frontend/dist erstellt ``` ## Schritt 6: Nginx konfigurieren ```bash # Nginx-Konfiguration erstellen sudo nano /etc/nginx/sites-available/stechuhr3.tsschulz.de ``` Folgende Konfiguration einfügen (siehe `nginx.conf` im Projekt): ```nginx server { listen 80; listen [::]:80; server_name stechuhr3.tsschulz.de; # Zunächst nur HTTP für Certbot location /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://$server_name$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name stechuhr3.tsschulz.de; # SSL-Zertifikate (werden von Certbot automatisch eingefügt) ssl_certificate /etc/letsencrypt/live/stechuhr3.tsschulz.de/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/stechuhr3.tsschulz.de/privkey.pem; # SSL-Konfiguration ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers HIGH:!aNULL:!MD5; # Frontend (Vue.js SPA) root /var/www/timeclock/frontend/dist; index index.html; # Logging access_log /var/log/nginx/stechuhr3.access.log; error_log /var/log/nginx/stechuhr3.error.log; # Gzip Compression gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; # API Proxy zum Backend location /api { proxy_pass http://localhost:3010; 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; # Timeouts proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # SPA Fallback - alle anderen Requests zu index.html location / { try_files $uri $uri/ /index.html; } # Cache für statische Assets location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } # Security Headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; } ``` ```bash # Konfiguration aktivieren sudo ln -s /etc/nginx/sites-available/stechuhr3.tsschulz.de /etc/nginx/sites-enabled/ # Default-Seite deaktivieren (optional) sudo rm -f /etc/nginx/sites-enabled/default # Nginx-Konfiguration testen sudo nginx -t # Nginx neuladen sudo systemctl reload nginx ``` ## Schritt 7: SSL-Zertifikat mit Let's Encrypt ```bash # Certbot ausführen sudo certbot --nginx -d stechuhr3.tsschulz.de # Folgen Sie den Anweisungen: # - E-Mail-Adresse eingeben # - Nutzungsbedingungen akzeptieren # - Optional: Newsletter ablehnen # - HTTPS-Redirect: Ja (empfohlen) # Automatische Erneuerung testen sudo certbot renew --dry-run ``` ## Schritt 8: Backend als Service einrichten ### Option A: PM2 (empfohlen) ```bash cd /var/www/timeclock/backend # Backend mit PM2 starten pm2 start src/index.js --name timeclock-backend --env production # PM2 Auto-Start konfigurieren pm2 startup systemd # Führen Sie den angezeigten Befehl aus # Aktuelle PM2-Prozesse speichern pm2 save # Status überprüfen pm2 status pm2 logs timeclock-backend ``` ### Option B: Systemd Service ```bash # Service-Datei erstellen sudo nano /etc/systemd/system/timeclock.service ``` Folgende Konfiguration einfügen: ```ini [Unit] Description=TimeClock v3 Backend API After=network.target mysql.service [Service] Type=simple User=www-data WorkingDirectory=/var/www/timeclock/backend Environment=NODE_ENV=production ExecStart=/usr/bin/node src/index.js Restart=always RestartSec=10 StandardOutput=append:/var/log/timeclock/backend.log StandardError=append:/var/log/timeclock/backend.error.log # Sicherheit NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/var/www/timeclock/backend [Install] WantedBy=multi-user.target ``` ```bash # Log-Verzeichnis erstellen sudo mkdir -p /var/log/timeclock sudo chown www-data:www-data /var/log/timeclock # Service aktivieren und starten sudo systemctl daemon-reload sudo systemctl enable timeclock sudo systemctl start timeclock # Status prüfen sudo systemctl status timeclock # Logs ansehen sudo journalctl -u timeclock -f ``` ## Schritt 9: Firewall konfigurieren ```bash # UFW Firewall aktivieren (falls noch nicht aktiv) sudo ufw allow ssh sudo ufw allow 'Nginx Full' sudo ufw enable # Status prüfen sudo ufw status ``` ## Schritt 10: Deployment testen ```bash # Backend-Health-Check curl http://localhost:3010/api/health # Frontend über Domain aufrufen # https://stechuhr3.tsschulz.de # SSL-Test curl -I https://stechuhr3.tsschulz.de ``` ## Wartung und Updates ### Backend aktualisieren ```bash cd /var/www/timeclock/backend git pull # oder neue Dateien übertragen npm install --production # Mit PM2: pm2 restart timeclock-backend # Mit systemd: sudo systemctl restart timeclock ``` ### Frontend aktualisieren ```bash cd /var/www/timeclock/frontend git pull # oder neue Dateien übertragen npm install npm run build # Nginx cached automatisch neu ``` ### Logs überwachen ```bash # PM2 Logs pm2 logs timeclock-backend # Systemd Logs sudo journalctl -u timeclock -f # Nginx Logs sudo tail -f /var/log/nginx/stechuhr3.access.log sudo tail -f /var/log/nginx/stechuhr3.error.log ``` ### Datenbank-Backup ```bash # Tägliches Backup einrichten sudo nano /usr/local/bin/backup-timeclock.sh ``` ```bash #!/bin/bash BACKUP_DIR="/var/backups/timeclock" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # Datenbank-Backup mysqldump -u timeclock -p'IHR_PASSWORT' stechuhr2 | gzip > $BACKUP_DIR/timeclock_$DATE.sql.gz # Alte Backups löschen (älter als 30 Tage) find $BACKUP_DIR -name "timeclock_*.sql.gz" -mtime +30 -delete echo "Backup erstellt: timeclock_$DATE.sql.gz" ``` ```bash # Ausführbar machen sudo chmod +x /usr/local/bin/backup-timeclock.sh # Cronjob einrichten (täglich um 2 Uhr) sudo crontab -e # Folgende Zeile hinzufügen: # 0 2 * * * /usr/local/bin/backup-timeclock.sh ``` ## Troubleshooting ### Backend startet nicht ```bash # Logs prüfen pm2 logs timeclock-backend --err # oder sudo journalctl -u timeclock -n 50 # Port-Belegung prüfen sudo netstat -tulpn | grep 3010 # .env Datei prüfen cat /var/www/timeclock/backend/.env ``` ### Frontend zeigt nicht an ```bash # Nginx-Konfiguration testen sudo nginx -t # Nginx neuladen sudo systemctl reload nginx # Dist-Verzeichnis prüfen ls -la /var/www/timeclock/frontend/dist/ ``` ### SSL-Probleme ```bash # Zertifikat erneuern sudo certbot renew --force-renewal -d stechuhr3.tsschulz.de # Nginx neustarten sudo systemctl restart nginx ``` ### API-Requests schlagen fehl ```bash # CORS-Probleme: FRONTEND_URL in .env prüfen # Nginx Proxy-Konfiguration prüfen sudo nginx -t # Backend-Logs prüfen pm2 logs timeclock-backend ``` ## Performance-Optimierung ### PM2 Cluster-Modus (optional) ```bash cd /var/www/timeclock/backend # PM2 im Cluster-Modus starten (nutzt alle CPU-Kerne) pm2 delete timeclock-backend pm2 start src/index.js --name timeclock-backend --instances max --env production pm2 save ``` ### Nginx Caching (optional) Füge in der Nginx-Konfiguration hinzu: ```nginx # Im http-Block von /etc/nginx/nginx.conf proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m max_size=100m inactive=60m use_temp_path=off; # Im server-Block der stechuhr3.tsschulz.de Konfiguration location /api { proxy_cache api_cache; proxy_cache_valid 200 5m; proxy_cache_bypass $http_cache_control; add_header X-Cache-Status $upstream_cache_status; # ... rest der proxy_pass Konfiguration } ``` ## Sicherheits-Checkliste - [x] SSL/TLS aktiviert (Let's Encrypt) - [x] Firewall konfiguriert (UFW) - [x] Starke Passwörter für DB und JWT_SECRET - [x] NODE_ENV=production gesetzt - [x] Nginx Security Headers aktiviert - [x] Backend läuft nicht als Root - [x] Regelmäßige Backups eingerichtet - [ ] fail2ban installieren (optional) - [ ] Rate Limiting in Nginx konfigurieren (optional) - [ ] ModSecurity WAF installieren (optional) ## Monitoring (optional) ### PM2 Plus Monitoring ```bash # PM2 Plus Account erstellen: https://id.keymetrics.io pm2 plus # Link folgen und Account verbinden ``` ### Einfaches Uptime-Monitoring ```bash # Einfaches Health-Check Script sudo nano /usr/local/bin/check-timeclock.sh ``` ```bash #!/bin/bash if ! curl -sf http://localhost:3010/api/health > /dev/null; then echo "Backend ist down! $(date)" >> /var/log/timeclock/health-check.log pm2 restart timeclock-backend # oder: sudo systemctl restart timeclock fi ``` ```bash # Ausführbar machen sudo chmod +x /usr/local/bin/check-timeclock.sh # Cronjob alle 5 Minuten sudo crontab -e # */5 * * * * /usr/local/bin/check-timeclock.sh ``` ## Zusammenfassung der Endpunkte - **Frontend:** https://stechuhr3.tsschulz.de - **API:** https://stechuhr3.tsschulz.de/api - **Health-Check:** https://stechuhr3.tsschulz.de/api/health ## Support Bei Problemen: 1. Logs prüfen (`pm2 logs` oder `journalctl -u timeclock`) 2. Nginx-Logs prüfen (`/var/log/nginx/`) 3. Datenbank-Verbindung testen 4. .env Konfiguration überprüfen --- **Deployment erfolgreich! 🎉** Ihre TimeClock-App läuft jetzt auf https://stechuhr3.tsschulz.de