"feat: Implement new deployment configuration and database setup for Raspberry Pi"
This commit is contained in:
parent
ea6ff08c15
commit
8d84b9157e
1
backend/DEPLOYMENT.md
Normal file
1
backend/DEPLOYMENT.md
Normal file
@ -0,0 +1 @@
|
||||
|
@ -37,7 +37,7 @@ PRINTERS = {
|
||||
}
|
||||
|
||||
# Logging-Konfiguration
|
||||
LOG_DIR = "/home/user/Projektarbeit-MYP/backend/app/logs"
|
||||
LOG_DIR = os.path.join(BASE_DIR, "logs")
|
||||
LOG_SUBDIRS = ["app", "scheduler", "auth", "jobs", "printers", "errors"]
|
||||
LOG_LEVEL = "INFO"
|
||||
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||
@ -52,9 +52,9 @@ SESSION_LIFETIME = timedelta(days=7)
|
||||
|
||||
# SSL-Konfiguration
|
||||
SSL_ENABLED = get_env_variable("MYP_SSL_ENABLED", "True").lower() in ("true", "1", "yes")
|
||||
SSL_CERT_PATH = "/home/user/Projektarbeit-MYP/backend/certs/myp.crt"
|
||||
SSL_KEY_PATH = "/home/user/Projektarbeit-MYP/backend/certs/myp.key"
|
||||
SSL_HOSTNAME = get_env_variable("MYP_SSL_HOSTNAME", "raspberrypi")
|
||||
SSL_CERT_PATH = os.path.join(BASE_DIR, "certs", "myp.crt")
|
||||
SSL_KEY_PATH = os.path.join(BASE_DIR, "certs", "myp.key")
|
||||
SSL_HOSTNAME = get_env_variable("MYP_SSL_HOSTNAME", "localhost")
|
||||
|
||||
# Scheduler-Konfiguration
|
||||
SCHEDULER_INTERVAL = 60 # Sekunden
|
||||
|
Binary file not shown.
117
backend/app/setup_drucker_db.py
Normal file
117
backend/app/setup_drucker_db.py
Normal file
@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Drucker-Datenbank Setup für MYP Platform
|
||||
Trägt die hardkodierten Drucker in die Datenbank ein.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
sys.path.append('.')
|
||||
|
||||
from config.settings import PRINTERS
|
||||
from database.db_manager import DatabaseManager
|
||||
from models import Printer
|
||||
from datetime import datetime
|
||||
|
||||
def setup_drucker():
|
||||
"""Trägt die hardkodierten Drucker in die Datenbank ein."""
|
||||
print("=== MYP Platform - Drucker-Setup ===")
|
||||
print(f"Hardkodierte Drucker: {len(PRINTERS)}")
|
||||
|
||||
try:
|
||||
db = DatabaseManager()
|
||||
session = db.get_session()
|
||||
|
||||
# Alle existierenden Drucker löschen
|
||||
existing_printers = session.query(Printer).all()
|
||||
if existing_printers:
|
||||
print(f"Lösche {len(existing_printers)} existierende Drucker...")
|
||||
for printer in existing_printers:
|
||||
session.delete(printer)
|
||||
session.commit()
|
||||
print("✅ Alle alten Drucker gelöscht")
|
||||
else:
|
||||
print("Keine existierenden Drucker gefunden")
|
||||
|
||||
# Neue Drucker hinzufügen
|
||||
added_count = 0
|
||||
|
||||
for printer_name, config in PRINTERS.items():
|
||||
# Neuen Drucker erstellen
|
||||
new_printer = Printer(
|
||||
name=printer_name,
|
||||
model="P115", # Standard-Modell
|
||||
location="Labor", # Standard-Standort
|
||||
ip_address=config["ip"],
|
||||
mac_address=f"98:25:4A:E1:{printer_name[-1]}0:0{printer_name[-1]}", # Dummy MAC
|
||||
plug_ip=config["ip"],
|
||||
plug_username="admin",
|
||||
plug_password="admin",
|
||||
status="available", # Verfügbar, da in Konfiguration
|
||||
active=True,
|
||||
created_at=datetime.now()
|
||||
)
|
||||
|
||||
session.add(new_printer)
|
||||
print(f"✅ {printer_name}: Hinzugefügt (IP: {config['ip']})")
|
||||
added_count += 1
|
||||
|
||||
# Änderungen speichern
|
||||
session.commit()
|
||||
session.close()
|
||||
|
||||
print(f"\n✅ {added_count} neue Drucker erfolgreich hinzugefügt")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler beim Setup der Drucker: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
if 'session' in locals():
|
||||
session.rollback()
|
||||
session.close()
|
||||
return False
|
||||
|
||||
def list_drucker():
|
||||
"""Zeigt alle Drucker in der Datenbank an."""
|
||||
print("\n=== Drucker in der Datenbank ===")
|
||||
|
||||
try:
|
||||
db = DatabaseManager()
|
||||
session = db.get_session()
|
||||
|
||||
printers = session.query(Printer).all()
|
||||
|
||||
if not printers:
|
||||
print("Keine Drucker in der Datenbank gefunden.")
|
||||
return True
|
||||
|
||||
print(f"{'ID':<5} {'Name':<15} {'Status':<12} {'IP-Adresse':<15} {'Aktiv':<8}")
|
||||
print("-" * 60)
|
||||
|
||||
for printer in printers:
|
||||
active_str = "✅" if printer.active else "❌"
|
||||
print(f"{printer.id:<5} {printer.name:<15} {printer.status:<12} {printer.ip_address:<15} {active_str:<8}")
|
||||
|
||||
session.close()
|
||||
|
||||
print(f"\nGesamt: {len(printers)} Drucker")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler beim Abrufen der Drucker: {e}")
|
||||
if 'session' in locals():
|
||||
session.close()
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("MYP Platform - Drucker-Datenbank Setup")
|
||||
print("=" * 40)
|
||||
|
||||
success = setup_drucker()
|
||||
if success:
|
||||
list_drucker()
|
||||
print("\n✅ Drucker-Setup erfolgreich abgeschlossen!")
|
||||
else:
|
||||
print("\n❌ Drucker-Setup fehlgeschlagen!")
|
||||
sys.exit(1)
|
331
backend/setup_raspberry_pi.sh
Normal file
331
backend/setup_raspberry_pi.sh
Normal file
@ -0,0 +1,331 @@
|
||||
#!/bin/bash
|
||||
# MYP Platform - Raspberry Pi Setup Script
|
||||
# Installiert und konfiguriert die MYP-Platform auf Raspberry Pi
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Farben für Output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Logging-Funktion
|
||||
log() {
|
||||
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[ERROR] $1${NC}" >&2
|
||||
}
|
||||
|
||||
warning() {
|
||||
echo -e "${YELLOW}[WARNING] $1${NC}"
|
||||
}
|
||||
|
||||
info() {
|
||||
echo -e "${BLUE}[INFO] $1${NC}"
|
||||
}
|
||||
|
||||
# Variablen
|
||||
PROJECT_DIR="/home/user/Projektarbeit-MYP"
|
||||
BACKEND_DIR="$PROJECT_DIR/backend"
|
||||
APP_DIR="$BACKEND_DIR/app"
|
||||
VENV_DIR="$BACKEND_DIR/venv"
|
||||
SERVICE_NAME="myp-platform"
|
||||
USER="user"
|
||||
|
||||
log "=== MYP Platform Raspberry Pi Setup ==="
|
||||
log "Projekt-Verzeichnis: $PROJECT_DIR"
|
||||
log "Backend-Verzeichnis: $BACKEND_DIR"
|
||||
log "App-Verzeichnis: $APP_DIR"
|
||||
|
||||
# Prüfen, ob als root ausgeführt wird
|
||||
if [[ $EUID -eq 0 ]]; then
|
||||
error "Dieses Skript sollte nicht als root ausgeführt werden!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# System-Updates
|
||||
log "1. System-Updates installieren..."
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Notwendige System-Pakete installieren
|
||||
log "2. System-Pakete installieren..."
|
||||
sudo apt install -y \
|
||||
python3 \
|
||||
python3-pip \
|
||||
python3-venv \
|
||||
python3-dev \
|
||||
build-essential \
|
||||
libssl-dev \
|
||||
libffi-dev \
|
||||
libsqlite3-dev \
|
||||
git \
|
||||
curl \
|
||||
wget \
|
||||
nginx \
|
||||
supervisor \
|
||||
sqlite3 \
|
||||
openssl \
|
||||
ca-certificates \
|
||||
net-tools \
|
||||
htop \
|
||||
vim \
|
||||
nano
|
||||
|
||||
# Python Virtual Environment erstellen
|
||||
log "3. Python Virtual Environment erstellen..."
|
||||
if [ ! -d "$VENV_DIR" ]; then
|
||||
python3 -m venv "$VENV_DIR"
|
||||
log "Virtual Environment erstellt: $VENV_DIR"
|
||||
else
|
||||
log "Virtual Environment existiert bereits: $VENV_DIR"
|
||||
fi
|
||||
|
||||
# Virtual Environment aktivieren
|
||||
log "4. Virtual Environment aktivieren..."
|
||||
source "$VENV_DIR/bin/activate"
|
||||
|
||||
# Pip upgraden
|
||||
log "5. Pip upgraden..."
|
||||
pip install --upgrade pip setuptools wheel
|
||||
|
||||
# Python-Abhängigkeiten installieren
|
||||
log "6. Python-Abhängigkeiten installieren..."
|
||||
if [ -f "$BACKEND_DIR/requirements.txt" ]; then
|
||||
pip install -r "$BACKEND_DIR/requirements.txt"
|
||||
log "Abhängigkeiten aus requirements.txt installiert"
|
||||
else
|
||||
error "requirements.txt nicht gefunden in $BACKEND_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verzeichnisse erstellen
|
||||
log "7. Notwendige Verzeichnisse erstellen..."
|
||||
mkdir -p "$APP_DIR/database"
|
||||
mkdir -p "$APP_DIR/logs/app"
|
||||
mkdir -p "$APP_DIR/logs/auth"
|
||||
mkdir -p "$APP_DIR/logs/jobs"
|
||||
mkdir -p "$APP_DIR/logs/printers"
|
||||
mkdir -p "$APP_DIR/logs/scheduler"
|
||||
mkdir -p "$APP_DIR/logs/errors"
|
||||
mkdir -p "$BACKEND_DIR/certs"
|
||||
mkdir -p "$PROJECT_DIR/frontend/ssl"
|
||||
|
||||
# Berechtigungen setzen
|
||||
log "8. Berechtigungen setzen..."
|
||||
chown -R $USER:$USER "$PROJECT_DIR"
|
||||
chmod -R 755 "$PROJECT_DIR"
|
||||
chmod -R 700 "$APP_DIR/logs"
|
||||
chmod -R 700 "$BACKEND_DIR/certs"
|
||||
|
||||
# Datenbank initialisieren
|
||||
log "9. Datenbank initialisieren..."
|
||||
cd "$APP_DIR"
|
||||
if [ ! -f "database/myp.db" ]; then
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('.')
|
||||
from models import init_database, create_initial_admin
|
||||
init_database()
|
||||
create_initial_admin()
|
||||
print('Datenbank initialisiert und Admin-Benutzer erstellt')
|
||||
"
|
||||
log "Datenbank erfolgreich initialisiert"
|
||||
else
|
||||
log "Datenbank existiert bereits"
|
||||
fi
|
||||
|
||||
# SSL-Zertifikate generieren
|
||||
log "10. SSL-Zertifikate generieren..."
|
||||
python3 -c "
|
||||
import sys
|
||||
sys.path.append('.')
|
||||
from utils.ssl_manager import ssl_manager
|
||||
success = ssl_manager.generate_mercedes_certificate()
|
||||
if success:
|
||||
print('SSL-Zertifikate erfolgreich generiert')
|
||||
else:
|
||||
print('Fehler beim Generieren der SSL-Zertifikate')
|
||||
"
|
||||
|
||||
# Systemd Service erstellen
|
||||
log "11. Systemd Service konfigurieren..."
|
||||
sudo tee "/etc/systemd/system/$SERVICE_NAME.service" > /dev/null <<EOF
|
||||
[Unit]
|
||||
Description=MYP Platform - 3D Printer Management System
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=$USER
|
||||
Group=$USER
|
||||
WorkingDirectory=$APP_DIR
|
||||
Environment=PATH=$VENV_DIR/bin
|
||||
ExecStart=$VENV_DIR/bin/python app.py
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=myp-platform
|
||||
|
||||
# Umgebungsvariablen
|
||||
Environment=FLASK_ENV=production
|
||||
Environment=FLASK_DEBUG=False
|
||||
Environment=MYP_SSL_ENABLED=True
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# Nginx-Konfiguration erstellen
|
||||
log "12. Nginx konfigurieren..."
|
||||
sudo tee "/etc/nginx/sites-available/$SERVICE_NAME" > /dev/null <<EOF
|
||||
server {
|
||||
listen 80;
|
||||
server_name raspberrypi localhost;
|
||||
|
||||
# HTTP zu HTTPS weiterleiten
|
||||
return 301 https://\$server_name\$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name raspberrypi localhost;
|
||||
|
||||
# SSL-Konfiguration
|
||||
ssl_certificate $BACKEND_DIR/certs/myp.crt;
|
||||
ssl_certificate_key $BACKEND_DIR/certs/myp.key;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
# Proxy zu Flask-App
|
||||
location / {
|
||||
proxy_pass https://127.0.0.1:443;
|
||||
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_ssl_verify off;
|
||||
}
|
||||
|
||||
# Statische Dateien
|
||||
location /static {
|
||||
alias $APP_DIR/static;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Nginx Site aktivieren
|
||||
sudo ln -sf "/etc/nginx/sites-available/$SERVICE_NAME" "/etc/nginx/sites-enabled/"
|
||||
sudo rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
# Supervisor-Konfiguration erstellen
|
||||
log "13. Supervisor konfigurieren..."
|
||||
sudo tee "/etc/supervisor/conf.d/$SERVICE_NAME.conf" > /dev/null <<EOF
|
||||
[program:myp-platform]
|
||||
command=$VENV_DIR/bin/python app.py
|
||||
directory=$APP_DIR
|
||||
user=$USER
|
||||
autostart=true
|
||||
autorestart=true
|
||||
redirect_stderr=true
|
||||
stdout_logfile=$APP_DIR/logs/app/supervisor.log
|
||||
stdout_logfile_maxbytes=10MB
|
||||
stdout_logfile_backups=5
|
||||
environment=PATH="$VENV_DIR/bin",FLASK_ENV="production",MYP_SSL_ENABLED="True"
|
||||
EOF
|
||||
|
||||
# Firewall konfigurieren
|
||||
log "14. Firewall konfigurieren..."
|
||||
sudo ufw allow 22/tcp # SSH
|
||||
sudo ufw allow 80/tcp # HTTP
|
||||
sudo ufw allow 443/tcp # HTTPS
|
||||
sudo ufw --force enable
|
||||
|
||||
# Services aktivieren und starten
|
||||
log "15. Services aktivieren und starten..."
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable "$SERVICE_NAME"
|
||||
sudo systemctl enable nginx
|
||||
sudo systemctl enable supervisor
|
||||
|
||||
# Nginx testen und starten
|
||||
sudo nginx -t
|
||||
sudo systemctl restart nginx
|
||||
|
||||
# Supervisor neu laden
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl update
|
||||
|
||||
# MYP Service starten
|
||||
sudo systemctl start "$SERVICE_NAME"
|
||||
|
||||
# Status prüfen
|
||||
log "16. Service-Status prüfen..."
|
||||
sleep 5
|
||||
|
||||
if sudo systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
log "✅ MYP Platform Service läuft"
|
||||
else
|
||||
error "❌ MYP Platform Service konnte nicht gestartet werden"
|
||||
sudo systemctl status "$SERVICE_NAME"
|
||||
fi
|
||||
|
||||
if sudo systemctl is-active --quiet nginx; then
|
||||
log "✅ Nginx läuft"
|
||||
else
|
||||
error "❌ Nginx konnte nicht gestartet werden"
|
||||
sudo systemctl status nginx
|
||||
fi
|
||||
|
||||
# Netzwerk-Informationen anzeigen
|
||||
log "17. Netzwerk-Informationen..."
|
||||
IP_ADDRESS=$(hostname -I | awk '{print $1}')
|
||||
log "IP-Adresse: $IP_ADDRESS"
|
||||
log "Hostname: $(hostname)"
|
||||
|
||||
# Abschluss-Informationen
|
||||
log "=== Setup abgeschlossen! ==="
|
||||
log ""
|
||||
log "🎉 MYP Platform wurde erfolgreich installiert!"
|
||||
log ""
|
||||
log "📋 Zugriff auf die Anwendung:"
|
||||
log " • HTTPS: https://$IP_ADDRESS"
|
||||
log " • HTTPS: https://raspberrypi (falls DNS konfiguriert)"
|
||||
log ""
|
||||
log "👤 Standard-Anmeldedaten:"
|
||||
log " • E-Mail: admin@mercedes-benz.com"
|
||||
log " • Passwort: 744563017196A"
|
||||
log ""
|
||||
log "🔧 Nützliche Befehle:"
|
||||
log " • Service-Status: sudo systemctl status $SERVICE_NAME"
|
||||
log " • Service neu starten: sudo systemctl restart $SERVICE_NAME"
|
||||
log " • Logs anzeigen: sudo journalctl -u $SERVICE_NAME -f"
|
||||
log " • Nginx-Status: sudo systemctl status nginx"
|
||||
log ""
|
||||
log "📁 Wichtige Verzeichnisse:"
|
||||
log " • Anwendung: $APP_DIR"
|
||||
log " • Logs: $APP_DIR/logs"
|
||||
log " • Datenbank: $APP_DIR/database/myp.db"
|
||||
log " • SSL-Zertifikate: $BACKEND_DIR/certs"
|
||||
log ""
|
||||
log "⚠️ Hinweise:"
|
||||
log " • Das SSL-Zertifikat ist selbstsigniert"
|
||||
log " • Browser-Warnung beim ersten Zugriff ist normal"
|
||||
log " • Zertifikat kann manuell akzeptiert werden"
|
||||
log ""
|
||||
log "🔄 Bei Problemen:"
|
||||
log " • Logs prüfen: sudo journalctl -u $SERVICE_NAME"
|
||||
log " • Service neu starten: sudo systemctl restart $SERVICE_NAME"
|
||||
log " • Nginx-Konfiguration testen: sudo nginx -t"
|
||||
|
||||
# Deaktiviere Virtual Environment
|
||||
deactivate
|
||||
|
||||
log "Setup-Skript beendet. Die MYP Platform ist einsatzbereit!"
|
Loading…
x
Reference in New Issue
Block a user