Projektarbeit-MYP/archiv/myp_installer_legacy.sh

1756 lines
50 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# MYP Installer Control Center - Vollständige Linux/Unix-Installation
# Zentrale Installationskonsole für die MYP-Plattform
# Version 4.0 - Granularer Installer mit Frontend/Backend-Trennung
# Farbdefinitionen
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# Globale Variablen
PROJECT_DIR="$(pwd)"
BACKEND_DIR="$PROJECT_DIR/backend"
FRONTEND_DIR="$PROJECT_DIR/frontend"
APP_DIR="$BACKEND_DIR/app"
VENV_DIR="$BACKEND_DIR/venv"
# Überprüfen, ob das Skript als Root ausgeführt wird
is_root=0
if [ "$EUID" -eq 0 ]; then
is_root=1
fi
# Funktionen
show_header() {
local title="$1"
clear
echo -e "${CYAN}=============================================================${NC}"
echo -e "${CYAN} MYP INSTALLER CONTROL CENTER ${NC}"
echo -e "${CYAN} Version 4.0 ${NC}"
echo -e "${CYAN} Granularer Installer mit Trennung ${NC}"
echo -e "${CYAN}=============================================================${NC}"
echo -e "${CYAN} $title${NC}"
echo -e "${CYAN}=============================================================${NC}"
if [ $is_root -eq 0 ]; then
echo -e "${YELLOW}HINWEIS: Dieses Skript läuft ohne Root-Rechte.${NC}"
echo -e "${YELLOW}Einige Funktionen sind möglicherweise eingeschränkt.${NC}"
echo -e "${CYAN}=============================================================${NC}"
fi
echo ""
}
check_command() {
command -v "$1" >/dev/null 2>&1
}
exec_command() {
local cmd="$1"
local description="$2"
local allow_fail="$3"
echo -e "${BLUE}> $description...${NC}"
eval $cmd
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ Erfolgreich abgeschlossen!${NC}"
return 0
else
if [ "$allow_fail" = "true" ]; then
echo -e "${YELLOW}⚠ Warnung: $description fehlgeschlagen, wird übersprungen.${NC}"
return 0
else
echo -e "${RED}✗ Fehler beim Ausführen des Befehls. Exit-Code: $?${NC}"
return 1
fi
fi
}
get_local_ip() {
local ip=$(hostname -I | awk '{print $1}')
if [ -z "$ip" ]; then
ip="127.0.0.1"
fi
echo "$ip"
}
# System-Abhängigkeiten installieren
install_system_dependencies() {
show_header "System-Abhängigkeiten installieren"
if [ $is_root -eq 0 ]; then
echo -e "${RED}Diese Funktion erfordert Root-Rechte.${NC}"
echo -e "${YELLOW}Bitte starten Sie das Skript mit sudo oder führen Sie folgende Befehle manuell aus:${NC}"
echo ""
echo -e "${WHITE}# Debian/Ubuntu/Raspberry Pi OS:${NC}"
echo -e "${WHITE}sudo apt update${NC}"
echo -e "${WHITE}sudo apt install -y python3 python3-pip python3-venv nodejs npm git curl wget sqlite3 openssl${NC}"
echo ""
echo -e "${WHITE}# RHEL/CentOS/Fedora:${NC}"
echo -e "${WHITE}sudo dnf install -y python3 python3-pip nodejs npm git curl wget sqlite openssl${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
echo -e "${BLUE}Erkenne Betriebssystem...${NC}"
if [ -f /etc/debian_version ]; then
echo -e "${GREEN}Debian/Ubuntu/Raspberry Pi OS erkannt${NC}"
echo -e "${BLUE}Aktualisiere Paketlisten...${NC}"
apt update
echo -e "${BLUE}Installiere System-Pakete...${NC}"
apt install -y \
python3 \
python3-pip \
python3-venv \
python3-dev \
build-essential \
libssl-dev \
libffi-dev \
libsqlite3-dev \
nodejs \
npm \
git \
curl \
wget \
sqlite3 \
openssl \
ca-certificates \
nginx \
supervisor \
ufw \
net-tools \
htop \
vim \
nano \
chromium-browser
elif [ -f /etc/redhat-release ]; then
echo -e "${GREEN}RHEL/CentOS/Fedora erkannt${NC}"
echo -e "${BLUE}Installiere System-Pakete...${NC}"
if check_command dnf; then
dnf install -y \
python3 \
python3-pip \
python3-devel \
gcc \
openssl-devel \
libffi-devel \
sqlite-devel \
nodejs \
npm \
git \
curl \
wget \
sqlite \
openssl \
ca-certificates \
nginx \
supervisor \
chromium
else
yum install -y \
python3 \
python3-pip \
python3-devel \
gcc \
openssl-devel \
libffi-devel \
sqlite-devel \
nodejs \
npm \
git \
curl \
wget \
sqlite \
openssl \
ca-certificates \
nginx \
supervisor \
chromium
fi
else
echo -e "${YELLOW}Unbekanntes Betriebssystem. Bitte installieren Sie manuell:${NC}"
echo -e "${WHITE}- Python 3.8+${NC}"
echo -e "${WHITE}- Node.js 16+${NC}"
echo -e "${WHITE}- Git, curl, wget, sqlite3, openssl${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
echo -e "${GREEN}✓ System-Abhängigkeiten erfolgreich installiert!${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Python & Node.js Umgebung einrichten
setup_python_node_environment() {
show_header "Python & Node.js Umgebung einrichten"
echo -e "${BLUE}1. Python-Umgebung prüfen...${NC}"
# Python prüfen
python_cmd=""
if check_command python3; then
python_cmd="python3"
python_version=$(python3 --version 2>&1)
echo -e "${GREEN}$python_version${NC}"
elif check_command python; then
python_cmd="python"
python_version=$(python --version 2>&1)
echo -e "${GREEN}$python_version${NC}"
else
echo -e "${RED}✗ Python nicht gefunden${NC}"
return 1
fi
# Pip prüfen
if check_command pip3; then
echo -e "${GREEN}✓ pip3 gefunden${NC}"
elif check_command pip; then
echo -e "${GREEN}✓ pip gefunden${NC}"
else
echo -e "${RED}✗ pip nicht gefunden${NC}"
return 1
fi
echo -e "${BLUE}2. Node.js-Umgebung prüfen...${NC}"
# Node.js prüfen
if check_command node; then
node_version=$(node --version)
echo -e "${GREEN}✓ Node.js $node_version${NC}"
else
echo -e "${RED}✗ Node.js nicht gefunden${NC}"
return 1
fi
# npm prüfen
if check_command npm; then
npm_version=$(npm --version)
echo -e "${GREEN}✓ npm $npm_version${NC}"
else
echo -e "${RED}✗ npm nicht gefunden${NC}"
return 1
fi
echo -e "${BLUE}3. Globale npm-Pakete aktualisieren...${NC}"
exec_command "npm update -g" "npm global update" true
echo -e "${GREEN}✓ Python & Node.js Umgebung bereit!${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Backend installieren
install_backend() {
show_header "Backend Installation"
echo -e "${BLUE}MYP Backend (Flask API) installieren${NC}"
echo ""
# Python prüfen
python_cmd=""
if check_command python3; then
python_cmd="python3"
echo -e "${GREEN}✓ Python 3 gefunden${NC}"
elif check_command python; then
python_cmd="python"
echo -e "${GREEN}✓ Python gefunden${NC}"
else
echo -e "${RED}✗ Python nicht gefunden. Bitte installieren Sie Python 3.8+${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
# Pip prüfen
pip_cmd=""
if check_command pip3; then
pip_cmd="pip3"
elif check_command pip; then
pip_cmd="pip"
else
echo -e "${RED}✗ pip nicht gefunden. Bitte installieren Sie pip${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
# Virtual Environment erstellen
echo -e "${BLUE}1. Virtual Environment erstellen...${NC}"
if [ ! -d "$VENV_DIR" ]; then
exec_command "$python_cmd -m venv $VENV_DIR" "Erstelle Virtual Environment"
else
echo -e "${YELLOW}Virtual Environment existiert bereits${NC}"
fi
# Virtual Environment aktivieren
echo -e "${BLUE}2. Virtual Environment aktivieren...${NC}"
source "$VENV_DIR/bin/activate"
# Pip upgraden
echo -e "${BLUE}3. Pip upgraden...${NC}"
exec_command "pip install --upgrade pip setuptools wheel" "Pip upgraden"
# Requirements installieren
echo -e "${BLUE}4. Backend-Abhängigkeiten installieren...${NC}"
if [ -f "$BACKEND_DIR/requirements.txt" ]; then
exec_command "pip install -r $BACKEND_DIR/requirements.txt" "Backend-Abhängigkeiten installieren"
else
echo -e "${RED}✗ requirements.txt nicht gefunden in $BACKEND_DIR${NC}"
return 1
fi
# Verzeichnisse erstellen
echo -e "${BLUE}5. Backend-Verzeichnisse erstellen...${NC}"
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 "$APP_DIR/certs"
echo -e "${GREEN}✓ Backend-Verzeichnisse erstellt${NC}"
# Datenbank initialisieren
echo -e "${BLUE}6. Datenbank initialisieren...${NC}"
cd "$APP_DIR"
if [ ! -f "database/myp.db" ]; then
exec_command "$python_cmd -c 'from models import init_database, create_initial_admin; init_database(); create_initial_admin()'" "Datenbank initialisieren"
else
echo -e "${YELLOW}Datenbank existiert bereits${NC}"
fi
# SSL-Zertifikate erstellen
echo -e "${BLUE}7. SSL-Zertifikate erstellen...${NC}"
read -p "Möchten Sie SSL-Zertifikate erstellen? (j/n, Standard: j): " create_ssl
if [ "$create_ssl" != "n" ]; then
create_ssl_certificates
fi
echo ""
echo -e "${GREEN}✓ Backend-Installation abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Backend starten:${NC}"
echo -e "${WHITE}cd $APP_DIR && $python_cmd app.py${NC}"
echo ""
echo -e "${BLUE}Backend-URLs:${NC}"
echo -e "${WHITE}- HTTPS: https://localhost:443${NC}"
echo -e "${WHITE}- HTTP: http://localhost:5000${NC}"
deactivate
cd "$PROJECT_DIR"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Frontend installieren
install_frontend() {
show_header "Frontend Installation"
echo -e "${BLUE}MYP Frontend (Next.js React App) installieren${NC}"
echo ""
# Node.js prüfen
if ! check_command node; then
echo -e "${RED}✗ Node.js nicht gefunden. Bitte installieren Sie Node.js 16+${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
node_version=$(node --version)
echo -e "${GREEN}✓ Node.js gefunden: $node_version${NC}"
# npm prüfen
if ! check_command npm; then
echo -e "${RED}✗ npm nicht gefunden. Bitte installieren Sie npm${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
npm_version=$(npm --version)
echo -e "${GREEN}✓ npm gefunden: $npm_version${NC}"
# Frontend-Verzeichnis prüfen
if [ ! -d "$FRONTEND_DIR" ]; then
echo -e "${RED}✗ Frontend-Verzeichnis nicht gefunden: $FRONTEND_DIR${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
cd "$FRONTEND_DIR"
# Dependencies installieren
echo -e "${BLUE}1. Frontend-Abhängigkeiten installieren...${NC}"
exec_command "npm install" "Frontend-Abhängigkeiten installieren"
# SSL-Verzeichnis erstellen
echo -e "${BLUE}2. SSL-Verzeichnis erstellen...${NC}"
mkdir -p "$FRONTEND_DIR/ssl"
# .env.local konfigurieren
echo -e "${BLUE}3. Frontend-Konfiguration erstellen...${NC}"
setup_frontend_config
# Build erstellen (optional)
read -p "Möchten Sie das Frontend für Produktion builden? (j/n, Standard: n): " build_frontend
if [ "$build_frontend" = "j" ]; then
echo -e "${BLUE}4. Frontend für Produktion builden...${NC}"
exec_command "npm run build" "Frontend builden"
fi
echo ""
echo -e "${GREEN}✓ Frontend-Installation abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Frontend starten:${NC}"
echo -e "${WHITE}cd $FRONTEND_DIR && npm run dev${NC}"
echo ""
echo -e "${BLUE}Frontend-URLs:${NC}"
echo -e "${WHITE}- Development: http://localhost:3000${NC}"
echo -e "${WHITE}- Production: http://localhost:3000${NC}"
cd "$PROJECT_DIR"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Frontend Produktions-Deployment
deploy_frontend_production() {
show_header "Frontend Produktions-Deployment"
echo -e "${BLUE}MYP Frontend für Produktion deployen (Port 80/443 mit SSL)${NC}"
echo ""
# Docker prüfen
if ! check_command docker; then
echo -e "${RED}✗ Docker nicht gefunden. Bitte installieren Sie Docker${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
if ! check_command docker-compose; then
echo -e "${RED}✗ Docker Compose nicht gefunden. Bitte installieren Sie Docker Compose${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
echo -e "${GREEN}✓ Docker gefunden${NC}"
echo -e "${GREEN}✓ Docker Compose gefunden${NC}"
# Frontend-Verzeichnis prüfen
if [ ! -d "$FRONTEND_DIR" ]; then
echo -e "${RED}✗ Frontend-Verzeichnis nicht gefunden: $FRONTEND_DIR${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
cd "$FRONTEND_DIR"
# Produktions-Konfiguration prüfen
if [ ! -f "docker-compose.production.yml" ]; then
echo -e "${RED}✗ Produktions-Konfiguration nicht gefunden: docker-compose.production.yml${NC}"
echo -e "${YELLOW}Bitte stellen Sie sicher, dass die Produktions-Konfiguration vorhanden ist.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
echo -e "${GREEN}✓ Produktions-Konfiguration gefunden${NC}"
# SSL-Zertifikate-Verzeichnis erstellen
echo -e "${BLUE}1. SSL-Zertifikate-Verzeichnis erstellen...${NC}"
mkdir -p "./certs"
echo -e "${GREEN}✓ Zertifikate-Verzeichnis erstellt${NC}"
# Alte Container stoppen
echo -e "${BLUE}2. Alte Container stoppen...${NC}"
exec_command "docker-compose -f docker-compose.production.yml down" "Alte Container stoppen" "true"
# Backend-URL konfigurieren
echo -e "${BLUE}3. Backend-URL konfigurieren...${NC}"
echo -e "${WHITE}Aktuelle Backend-URLs:${NC}"
echo -e "${WHITE}1. Raspberry Pi (raspberrypi:443) [Standard]${NC}"
echo -e "${WHITE}2. Lokales Backend (localhost:443)${NC}"
echo -e "${WHITE}3. Benutzerdefinierte URL${NC}"
read -p "Wählen Sie eine Option (1-3, Standard: 1): " backend_choice
backend_url="https://raspberrypi:443"
case $backend_choice in
2)
backend_url="https://localhost:443"
;;
3)
read -p "Geben Sie die Backend-URL ein (z.B. https://192.168.1.100:443): " custom_url
if [ -n "$custom_url" ]; then
backend_url="$custom_url"
fi
;;
*)
backend_url="https://raspberrypi:443"
;;
esac
echo -e "${GREEN}✓ Backend-URL konfiguriert: $backend_url${NC}"
# Container bauen und starten
echo -e "${BLUE}4. Frontend-Container bauen und starten...${NC}"
echo -e "${YELLOW}Dies kann einige Minuten dauern...${NC}"
# Environment-Variablen für Backend-URL setzen
export NEXT_PUBLIC_API_URL="$backend_url"
export NEXT_PUBLIC_BACKEND_HOST="${backend_url#https://}"
exec_command "docker-compose -f docker-compose.production.yml up --build -d" "Frontend-Container starten"
if [ $? -eq 0 ]; then
# Kurz warten und Status prüfen
echo -e "${BLUE}5. Container-Status prüfen...${NC}"
sleep 5
container_status=$(docker-compose -f docker-compose.production.yml ps --services --filter "status=running")
if [ -n "$container_status" ]; then
echo -e "${GREEN}✓ Container erfolgreich gestartet!${NC}"
# Container-Details anzeigen
echo ""
echo -e "${BLUE}Container Status:${NC}"
docker-compose -f docker-compose.production.yml ps
echo ""
echo -e "${GREEN}✅ Frontend Produktions-Deployment erfolgreich abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}🌐 Frontend ist verfügbar unter:${NC}"
echo -e "${WHITE} - HTTP: http://localhost:80${NC}"
echo -e "${WHITE} - HTTPS: https://localhost:443${NC}"
echo ""
echo -e "${BLUE}🔧 Backend-Verbindung:${NC}"
echo -e "${WHITE} - Backend: $backend_url${NC}"
echo ""
echo -e "${BLUE}📋 Nützliche Befehle:${NC}"
echo -e "${WHITE} - Logs anzeigen: docker-compose -f docker-compose.production.yml logs -f${NC}"
echo -e "${WHITE} - Container stoppen: docker-compose -f docker-compose.production.yml down${NC}"
echo -e "${WHITE} - Container neustarten: docker-compose -f docker-compose.production.yml restart${NC}"
echo ""
echo -e "${BLUE}🔒 SSL-Hinweise:${NC}"
echo -e "${WHITE} - Caddy generiert automatisch selbstsignierte Zertifikate${NC}"
echo -e "${WHITE} - Zertifikate werden in ./certs/ gespeichert${NC}"
echo -e "${WHITE} - Für Produktion: Browser-Warnung bei selbstsignierten Zertifikaten acceptieren${NC}"
else
echo -e "${RED}✗ Container konnten nicht gestartet werden${NC}"
echo -e "${YELLOW}Logs anzeigen:${NC}"
docker-compose -f docker-compose.production.yml logs
return 1
fi
else
echo -e "${RED}✗ Fehler beim Starten der Container${NC}"
return 1
fi
cd "$PROJECT_DIR"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Kiosk-Modus installieren
install_kiosk_mode() {
show_header "Kiosk-Modus Installation"
echo -e "${BLUE}MYP Kiosk-Modus (Backend Web Interface) installieren${NC}"
echo ""
echo -e "${YELLOW}Der Kiosk-Modus nutzt das Backend Flask Web Interface${NC}"
echo -e "${YELLOW}als Ersatz für das separate Frontend.${NC}"
echo ""
# Backend muss installiert sein
if [ ! -d "$VENV_DIR" ]; then
echo -e "${RED}✗ Backend ist nicht installiert. Bitte installieren Sie zuerst das Backend.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
# Kiosk-spezifische Konfiguration
echo -e "${BLUE}1. Kiosk-Konfiguration erstellen...${NC}"
# Virtual Environment aktivieren
source "$VENV_DIR/bin/activate"
cd "$APP_DIR"
# Kiosk-Konfiguration in settings.py setzen
if [ -f "config/settings.py" ]; then
# Backup erstellen
cp "config/settings.py" "config/settings.py.backup"
# Kiosk-Modus aktivieren
cat >> "config/settings.py" << 'EOF'
# Kiosk-Modus Konfiguration
KIOSK_MODE = True
KIOSK_AUTO_LOGIN = True
KIOSK_FULLSCREEN = True
KIOSK_HIDE_NAVIGATION = False
KIOSK_DEFAULT_USER = "kiosk@mercedes-benz.com"
EOF
echo -e "${GREEN}✓ Kiosk-Konfiguration hinzugefügt${NC}"
fi
# Systemd Service für Kiosk erstellen (falls Root)
if [ $is_root -eq 1 ]; then
echo -e "${BLUE}2. Kiosk-Service erstellen...${NC}"
cat > "/etc/systemd/system/myp-kiosk.service" << EOF
[Unit]
Description=MYP Kiosk Mode - 3D Printer Management Kiosk
After=network.target graphical-session.target
[Service]
Type=simple
User=$USER
Group=$USER
WorkingDirectory=$APP_DIR
Environment=PATH=$VENV_DIR/bin
Environment=DISPLAY=:0
ExecStart=$VENV_DIR/bin/python app.py --kiosk
Restart=always
RestartSec=10
[Install]
WantedBy=graphical-session.target
EOF
systemctl daemon-reload
systemctl enable myp-kiosk.service
echo -e "${GREEN}✓ Kiosk-Service erstellt und aktiviert${NC}"
fi
# Browser-Autostart für Kiosk (Raspberry Pi)
echo -e "${BLUE}3. Browser-Autostart konfigurieren...${NC}"
autostart_dir="$HOME/.config/autostart"
mkdir -p "$autostart_dir"
cat > "$autostart_dir/myp-kiosk.desktop" << EOF
[Desktop Entry]
Type=Application
Name=MYP Kiosk
Comment=MYP 3D Printer Management Kiosk
Exec=chromium-browser --kiosk --disable-infobars --disable-session-crashed-bubble --disable-translate --no-first-run https://localhost:443
X-GNOME-Autostart-enabled=true
Hidden=false
NoDisplay=false
EOF
echo -e "${GREEN}✓ Browser-Autostart konfiguriert${NC}"
deactivate
cd "$PROJECT_DIR"
echo ""
echo -e "${GREEN}✓ Kiosk-Modus Installation abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Kiosk-Modus starten:${NC}"
echo -e "${WHITE}sudo systemctl start myp-kiosk${NC}"
echo ""
echo -e "${BLUE}Kiosk-URLs:${NC}"
echo -e "${WHITE}- Vollbild: https://localhost:443${NC}"
echo -e "${WHITE}- Normal: https://localhost:443${NC}"
echo ""
echo -e "${YELLOW}Hinweise:${NC}"
echo -e "${WHITE}- Der Kiosk-Modus startet automatisch beim Boot${NC}"
echo -e "${WHITE}- Browser öffnet im Vollbildmodus${NC}"
echo -e "${WHITE}- Nutzt das Backend Web Interface${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Frontend-Konfiguration erstellen
setup_frontend_config() {
echo -e "${BLUE}Backend-URL für Frontend konfigurieren:${NC}"
echo -e "${WHITE}1. Lokale Entwicklung (https://localhost:443)${NC}"
echo -e "${WHITE}2. Raspberry Pi (https://raspberrypi:443)${NC}"
echo -e "${WHITE}3. Benutzerdefinierte URL${NC}"
read -p "Wählen Sie eine Option (1-3, Standard: 1): " choice
backend_url="https://localhost:443"
case $choice in
2)
backend_url="https://raspberrypi:443"
;;
3)
read -p "Backend-URL eingeben: " backend_url
;;
*)
backend_url="https://localhost:443"
;;
esac
# .env.local erstellen
cat > "$FRONTEND_DIR/.env.local" << EOF
# Backend API Konfiguration
NEXT_PUBLIC_API_URL=$backend_url
# Frontend-URL
NEXT_PUBLIC_FRONTEND_URL=http://localhost:3000
# OAuth Konfiguration
NEXT_PUBLIC_OAUTH_CALLBACK_URL=http://localhost:3000/auth/login/callback
# GitHub OAuth
GITHUB_CLIENT_ID=7c5d8bef1a5519ec1fdc
GITHUB_CLIENT_SECRET=5f1e586204358fbd53cf5fb7d418b3f06ccab8fd
# Entwicklungsumgebung
NODE_ENV=development
DEBUG=true
NEXT_DEBUG=true
# Backend Host
NEXT_PUBLIC_BACKEND_HOST=$(echo "$backend_url" | sed -E 's|https?://([^:/]+).*|\1|')
NEXT_PUBLIC_BACKEND_PROTOCOL=$(echo "$backend_url" | sed -E 's|^(https?)://.*|\1|')
EOF
echo -e "${GREEN}✓ Frontend-Konfiguration erstellt: $backend_url${NC}"
}
# Vollinstallationen
install_everything() {
show_header "Vollständige Installation (Backend + Frontend)"
echo -e "${BLUE}Installiere komplette MYP-Platform...${NC}"
echo ""
# System-Abhängigkeiten (falls Root)
if [ $is_root -eq 1 ]; then
install_system_dependencies
else
echo -e "${YELLOW}System-Abhängigkeiten übersprungen (keine Root-Rechte)${NC}"
fi
# Backend installieren
install_backend
# Frontend installieren
install_frontend
echo ""
echo -e "${GREEN}✓ Vollständige Installation abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Nächste Schritte:${NC}"
echo -e "${WHITE}1. Backend starten: cd $APP_DIR && python app.py${NC}"
echo -e "${WHITE}2. Frontend starten: cd $FRONTEND_DIR && npm run dev${NC}"
echo -e "${WHITE}3. Anwendung öffnen: https://localhost:443 (Backend) + http://localhost:3000 (Frontend)${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
install_production_setup() {
show_header "Produktions-Setup (Backend + Kiosk)"
echo -e "${BLUE}Installiere Produktions-Setup für Raspberry Pi...${NC}"
echo ""
# System-Abhängigkeiten (falls Root)
if [ $is_root -eq 1 ]; then
install_system_dependencies
else
echo -e "${YELLOW}System-Abhängigkeiten übersprungen (keine Root-Rechte)${NC}"
fi
# Backend installieren
install_backend
# Kiosk-Modus installieren
install_kiosk_mode
echo ""
echo -e "${GREEN}✓ Produktions-Setup abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}System für Produktion konfiguriert:${NC}"
echo -e "${WHITE}- Backend läuft als Service${NC}"
echo -e "${WHITE}- Kiosk-Modus aktiviert${NC}"
echo -e "${WHITE}- Browser startet automatisch${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
install_development_setup() {
show_header "Entwicklungs-Setup (Backend + Frontend + Tools)"
echo -e "${BLUE}Installiere Entwicklungs-Setup...${NC}"
echo ""
# System-Abhängigkeiten (falls Root)
if [ $is_root -eq 1 ]; then
install_system_dependencies
else
echo -e "${YELLOW}System-Abhängigkeiten übersprungen (keine Root-Rechte)${NC}"
fi
# Backend installieren
install_backend
# Frontend installieren
install_frontend
# Entwicklungstools konfigurieren
echo -e "${BLUE}Entwicklungstools konfigurieren...${NC}"
# Git Hooks (optional)
if [ -d ".git" ]; then
echo -e "${BLUE}Git-Repository erkannt${NC}"
# Hier könnten Git-Hooks konfiguriert werden
fi
echo ""
echo -e "${GREEN}✓ Entwicklungs-Setup abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Entwicklungsumgebung bereit:${NC}"
echo -e "${WHITE}- Backend mit Debug-Modus${NC}"
echo -e "${WHITE}- Frontend mit Hot-Reload${NC}"
echo -e "${WHITE}- SSL-Zertifikate für HTTPS${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
test_dependencies() {
show_header "Systemvoraussetzungen prüfen"
echo -e "${BLUE}Prüfe Abhängigkeiten...${NC}"
local all_installed=1
# Python
if check_command python3; then
echo -e "${GREEN}✓ Python 3 gefunden${NC}"
python_version=$(python3 --version 2>&1)
echo -e "${WHITE} Version: $python_version${NC}"
elif check_command python; then
echo -e "${GREEN}✓ Python gefunden${NC}"
python_version=$(python --version 2>&1)
echo -e "${WHITE} Version: $python_version${NC}"
else
echo -e "${RED}✗ Python nicht gefunden${NC}"
all_installed=0
fi
# Pip
if check_command pip3; then
echo -e "${GREEN}✓ Python Package Manager (pip3) gefunden${NC}"
elif check_command pip; then
echo -e "${GREEN}✓ Python Package Manager (pip) gefunden${NC}"
else
echo -e "${RED}✗ Python Package Manager (pip) nicht gefunden${NC}"
all_installed=0
fi
# Node.js
if check_command node; then
echo -e "${GREEN}✓ Node.js gefunden${NC}"
node_version=$(node --version 2>&1)
echo -e "${WHITE} Version: $node_version${NC}"
else
echo -e "${RED}✗ Node.js nicht gefunden${NC}"
all_installed=0
fi
# npm
if check_command npm; then
echo -e "${GREEN}✓ Node Package Manager (npm) gefunden${NC}"
else
echo -e "${RED}✗ Node Package Manager (npm) nicht gefunden${NC}"
all_installed=0
fi
# Git
if check_command git; then
echo -e "${GREEN}✓ Git gefunden${NC}"
else
echo -e "${RED}✗ Git nicht gefunden${NC}"
all_installed=0
fi
# OpenSSL
if check_command openssl; then
echo -e "${GREEN}✓ OpenSSL gefunden${NC}"
else
echo -e "${RED}✗ OpenSSL nicht gefunden${NC}"
all_installed=0
fi
# SQLite
if check_command sqlite3; then
echo -e "${GREEN}✓ SQLite3 gefunden${NC}"
else
echo -e "${RED}✗ SQLite3 nicht gefunden${NC}"
all_installed=0
fi
echo ""
if [ $all_installed -eq 1 ]; then
echo -e "${GREEN}✓ Alle Abhängigkeiten sind installiert!${NC}"
else
echo -e "${YELLOW}⚠ Einige Abhängigkeiten fehlen. Nutzen Sie 'System-Abhängigkeiten installieren'.${NC}"
fi
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
setup_hosts() {
show_header "Host-Konfiguration"
if [ $is_root -eq 0 ]; then
echo -e "${RED}Diese Funktion erfordert Root-Rechte.${NC}"
echo -e "${YELLOW}Bitte starten Sie das Skript mit sudo oder als Root neu.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
local_ip=$(get_local_ip)
echo -e "${GREEN}Lokale IP-Adresse: $local_ip${NC}"
hosts_file="/etc/hosts"
echo -e "${BLUE}Hosts-Datei: $hosts_file${NC}"
# Prüfen, ob die Einträge bereits existieren
frontend_entry=$(grep "m040tbaraspi001.de040.corpintra.net" $hosts_file)
backend_entry=$(grep "raspberrypi" $hosts_file)
# Einträge in die Hosts-Datei schreiben
echo -e "${BLUE}Aktualisiere Hosts-Datei...${NC}"
if [ -z "$frontend_entry" ]; then
echo "" >> $hosts_file
echo "# MYP Frontend Host" >> $hosts_file
echo "$local_ip m040tbaraspi001.de040.corpintra.net m040tbaraspi001" >> $hosts_file
echo -e "${GREEN}Frontend-Hostname hinzugefügt${NC}"
else
echo -e "${YELLOW}Frontend-Hostname ist bereits konfiguriert${NC}"
fi
if [ -z "$backend_entry" ]; then
echo "" >> $hosts_file
echo "# MYP Backend Host" >> $hosts_file
echo "$local_ip raspberrypi" >> $hosts_file
echo -e "${GREEN}Backend-Hostname hinzugefügt${NC}"
else
echo -e "${YELLOW}Backend-Hostname ist bereits konfiguriert${NC}"
fi
echo -e "${GREEN}Konfiguration abgeschlossen!${NC}"
echo ""
echo -e "${BLUE}Folgende Hostnamen sind jetzt konfiguriert:${NC}"
echo -e "${WHITE} - Frontend: m040tbaraspi001.de040.corpintra.net${NC}"
echo -e "${WHITE} - Backend: raspberrypi${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
test_backend_connection() {
show_header "Backend-Verbindung prüfen"
echo -e "${BLUE}Welches Backend möchten Sie testen?${NC}"
echo -e "${WHITE}1. Lokales Backend (localhost:443)${NC}"
echo -e "${WHITE}2. Raspberry Pi Backend (raspberrypi:443)${NC}"
echo -e "${WHITE}3. Benutzerdefinierte URL${NC}"
read -p "Wählen Sie eine Option (1-3, Standard: 1): " choice
backend_url="https://localhost:443"
backend_host="localhost"
case $choice in
2)
backend_url="https://raspberrypi:443"
backend_host="raspberrypi"
;;
3)
read -p "Backend-URL eingeben (z.B. https://raspberrypi:443): " backend_url
backend_host=$(echo "$backend_url" | sed -E 's|https?://([^:/]+).*|\1|')
;;
*)
backend_url="https://localhost:443"
backend_host="localhost"
;;
esac
echo ""
echo -e "${BLUE}Teste Backend: $backend_url${NC}"
echo ""
# 1. Netzwerk-Konnektivität prüfen
echo -e "${BLUE}1. Prüfe Netzwerk-Konnektivität zu $backend_host...${NC}"
if ping -c 1 -W 3 "$backend_host" >/dev/null 2>&1; then
echo -e "${GREEN}✓ Ping zu $backend_host erfolgreich${NC}"
else
echo -e "${RED}✗ Ping zu $backend_host fehlgeschlagen${NC}"
fi
# 2. Backend-Service prüfen
echo -e "${BLUE}2. Prüfe Backend-Service...${NC}"
health_url="$backend_url/health"
if curl -f --connect-timeout 5 "$health_url" >/dev/null 2>&1; then
echo -e "${GREEN}✓ Backend-Health-Check erfolgreich${NC}"
elif curl -f --connect-timeout 5 "$backend_url" >/dev/null 2>&1; then
echo -e "${YELLOW}⚠ Backend erreichbar, aber kein Health-Endpoint${NC}"
else
echo -e "${RED}✗ Backend-Service nicht erreichbar${NC}"
fi
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
setup_backend_url() {
local backend_url="$1"
show_header "Backend-URL konfigurieren"
if [ -z "$backend_url" ]; then
echo -e "${BLUE}Verfügbare Backend-Konfigurationen:${NC}"
echo -e "${WHITE}1. Lokale Entwicklung (https://localhost:443)${NC}"
echo -e "${WHITE}2. Raspberry Pi (https://raspberrypi:443)${NC}"
echo -e "${WHITE}3. Benutzerdefinierte URL${NC}"
read -p "Wählen Sie eine Option (1-3, Standard: 1): " choice
case $choice in
2)
backend_url="https://raspberrypi:443"
;;
3)
read -p "Backend-URL eingeben (z.B. https://raspberrypi:443): " backend_url
;;
*)
backend_url="https://localhost:443"
;;
esac
fi
echo -e "${BLUE}Konfiguriere Frontend für Backend: $backend_url${NC}"
# .env.local erstellen/aktualisieren
env_local_path="frontend/.env.local"
backend_host=$(echo "$backend_url" | sed -E 's|https?://([^:/]+).*|\1|')
backend_protocol=$(echo "$backend_url" | sed -E 's|^(https?)://.*|\1|')
cat > "$env_local_path" << EOF
# Backend API Konfiguration
NEXT_PUBLIC_API_URL=$backend_url
# Frontend-URL für OAuth Callback
NEXT_PUBLIC_FRONTEND_URL=http://localhost:3000
# OAuth Konfiguration
NEXT_PUBLIC_OAUTH_CALLBACK_URL=http://localhost:3000/auth/login/callback
# GitHub OAuth (hardcodiert)
GITHUB_CLIENT_ID=7c5d8bef1a5519ec1fdc
GITHUB_CLIENT_SECRET=5f1e586204358fbd53cf5fb7d418b3f06ccab8fd
# Entwicklungsumgebung
NODE_ENV=development
DEBUG=true
NEXT_DEBUG=true
# Backend Host
NEXT_PUBLIC_BACKEND_HOST=$backend_host
NEXT_PUBLIC_BACKEND_PROTOCOL=$backend_protocol
EOF
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ .env.local erfolgreich erstellt/aktualisiert${NC}"
else
echo -e "${RED}✗ Fehler beim Erstellen der .env.local${NC}"
fi
echo ""
echo -e "${GREEN}Frontend-Konfiguration abgeschlossen!${NC}"
echo -e "${WHITE}Backend: $backend_url${NC}"
echo -e "${WHITE}Frontend: http://localhost:3000${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
start_application() {
show_header "Anwendung starten"
echo -e "${BLUE}Welche Komponente möchten Sie starten?${NC}"
echo -e "${WHITE}1. Backend-Server starten (Flask API)${NC}"
echo -e "${WHITE}2. Frontend-Server starten (Next.js)${NC}"
echo -e "${WHITE}3. Kiosk-Modus starten (Backend Web Interface)${NC}"
echo -e "${WHITE}4. Beide Server starten (Backend + Frontend)${NC}"
echo -e "${WHITE}5. Frontend Produktions-Deployment (Port 80/443 mit SSL)${NC}"
echo -e "${WHITE}6. Debug-Server starten${NC}"
echo -e "${WHITE}7. Zurück zum Hauptmenü${NC}"
read -p "Wählen Sie eine Option (1-7): " choice
case $choice in
1)
echo -e "${BLUE}Starte Backend-Server...${NC}"
if [ -d "$VENV_DIR" ]; then
cd "$APP_DIR"
source "$VENV_DIR/bin/activate"
python app.py &
echo -e "${GREEN}Backend-Server gestartet: https://localhost:443${NC}"
deactivate
cd "$PROJECT_DIR"
else
echo -e "${RED}Backend nicht installiert. Bitte installieren Sie zuerst das Backend.${NC}"
fi
;;
2)
echo -e "${BLUE}Starte Frontend-Server...${NC}"
if [ -d "$FRONTEND_DIR/node_modules" ]; then
cd "$FRONTEND_DIR"
npm run dev &
echo -e "${GREEN}Frontend-Server gestartet: http://localhost:3000${NC}"
cd "$PROJECT_DIR"
else
echo -e "${RED}Frontend nicht installiert. Bitte installieren Sie zuerst das Frontend.${NC}"
fi
;;
3)
echo -e "${BLUE}Starte Kiosk-Modus...${NC}"
if [ $is_root -eq 1 ]; then
systemctl start myp-kiosk
echo -e "${GREEN}Kiosk-Modus gestartet${NC}"
else
echo -e "${RED}Root-Rechte erforderlich für Kiosk-Service${NC}"
fi
;;
4)
echo -e "${BLUE}Starte Backend und Frontend...${NC}"
# Backend starten
if [ -d "$VENV_DIR" ]; then
cd "$APP_DIR"
source "$VENV_DIR/bin/activate"
python app.py &
echo -e "${GREEN}Backend gestartet: https://localhost:443${NC}"
deactivate
cd "$PROJECT_DIR"
fi
# Frontend starten
if [ -d "$FRONTEND_DIR/node_modules" ]; then
cd "$FRONTEND_DIR"
npm run dev &
echo -e "${GREEN}Frontend gestartet: http://localhost:3000${NC}"
cd "$PROJECT_DIR"
fi
;;
5)
deploy_frontend_production
;;
6)
start_debug_server
;;
7)
return
;;
*)
echo -e "${RED}Ungültige Option.${NC}"
;;
esac
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
start_debug_server() {
show_header "Debug-Server starten"
echo -e "${BLUE}Welchen Debug-Server möchten Sie starten?${NC}"
echo -e "${WHITE}1. Frontend Debug-Server (Next.js Development)${NC}"
echo -e "${WHITE}2. Backend Debug-Server (Flask Debug Mode)${NC}"
echo -e "${WHITE}3. Einfacher HTTP-Server (Debug-Server Verzeichnis)${NC}"
read -p "Wählen Sie eine Option (1-3): " choice
case $choice in
1)
if [ -d "$FRONTEND_DIR" ]; then
cd "$FRONTEND_DIR"
npm run dev
cd "$PROJECT_DIR"
else
echo -e "${RED}Frontend-Verzeichnis nicht gefunden${NC}"
fi
;;
2)
if [ -d "$VENV_DIR" ]; then
cd "$APP_DIR"
source "$VENV_DIR/bin/activate"
python app.py --debug
deactivate
cd "$PROJECT_DIR"
else
echo -e "${RED}Backend nicht installiert${NC}"
fi
;;
3)
debug_dir="$FRONTEND_DIR/debug-server"
if [ -d "$debug_dir" ]; then
cd "$debug_dir"
if check_command node; then
node src/app.js
else
echo -e "${RED}Node.js nicht gefunden${NC}"
fi
cd "$PROJECT_DIR"
else
echo -e "${RED}Debug-Server-Verzeichnis nicht gefunden${NC}"
fi
;;
*)
echo -e "${RED}Ungültige Option${NC}"
;;
esac
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
show_ssl_status() {
show_header "SSL-Zertifikat-Status"
cert_paths=(
"backend/app/certs/myp.crt"
"backend/app/certs/myp.key"
"frontend/ssl/myp.crt"
"frontend/ssl/myp.key"
)
echo -e "${BLUE}Prüfe SSL-Zertifikate...${NC}"
echo ""
for cert_path in "${cert_paths[@]}"; do
if [ -f "$cert_path" ]; then
echo -e "${GREEN}✓ Gefunden: $cert_path${NC}"
# Zertifikatsinformationen anzeigen (falls OpenSSL verfügbar)
if check_command openssl && [[ "$cert_path" == *.crt ]]; then
cert_info=$(openssl x509 -in "$cert_path" -noout -subject -dates 2>/dev/null)
if [ -n "$cert_info" ]; then
echo -e "${WHITE} $cert_info${NC}"
fi
fi
else
echo -e "${RED}✗ Fehlt: $cert_path${NC}"
fi
done
echo ""
echo -e "${BLUE}SSL-Konfiguration in settings.py:${NC}"
settings_path="backend/app/config/settings.py"
if [ -f "$settings_path" ]; then
if grep -q "SSL_ENABLED.*=.*True" "$settings_path"; then
echo -e "${GREEN}✓ SSL ist aktiviert${NC}"
else
echo -e "${YELLOW}⚠ SSL ist deaktiviert${NC}"
fi
else
echo -e "${RED}✗ settings.py nicht gefunden${NC}"
fi
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
create_ssl_certificates() {
show_header "SSL-Zertifikat-Generator"
# Parameter definieren
cert_dir="./backend/app/certs"
backend_cert_file="$cert_dir/myp.crt"
backend_key_file="$cert_dir/myp.key"
frontend_cert_file="$cert_dir/frontend.crt"
frontend_key_file="$cert_dir/frontend.key"
echo -e "${BLUE}Zertifikate werden für folgende Hostnamen erstellt:${NC}"
# Hostname-Auswahl
echo -e "${WHITE}1. Für lokale Entwicklung (localhost)${NC}"
echo -e "${WHITE}2. Für Raspberry Pi Deployment (raspberrypi)${NC}"
echo -e "${WHITE}3. Für Unternehmens-Setup (m040tbaraspi001.de040.corpintra.net)${NC}"
read -p "Wählen Sie eine Option (1-3, Standard: 1): " choice
backend_hostname="localhost"
frontend_hostname="localhost"
case $choice in
2)
backend_hostname="raspberrypi"
frontend_hostname="raspberrypi"
;;
3)
backend_hostname="raspberrypi"
frontend_hostname="m040tbaraspi001.de040.corpintra.net"
;;
*)
backend_hostname="localhost"
frontend_hostname="localhost"
;;
esac
echo -e "${BLUE}Backend-Hostname: $backend_hostname${NC}"
echo -e "${BLUE}Frontend-Hostname: $frontend_hostname${NC}"
echo ""
# Verzeichnis erstellen, falls es nicht existiert
if [ ! -d "$cert_dir" ]; then
echo -e "${BLUE}Erstelle Verzeichnis $cert_dir...${NC}"
mkdir -p "$cert_dir"
fi
# SSL-Zertifikate mit Python und cryptography erstellen
echo -e "${BLUE}Erstelle SSL-Zertifikate mit Python...${NC}"
# Überprüfen, ob Python verfügbar ist
python_cmd=""
if check_command python3; then
python_cmd="python3"
elif check_command python; then
python_cmd="python"
else
echo -e "${RED}Python nicht gefunden. SSL-Zertifikate können nicht erstellt werden.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
# Python-Skript zur Zertifikatserstellung erstellen
cat > temp_cert_script.py << EOL
#!/usr/bin/env python3
import os
import datetime
import sys
try:
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption
import ipaddress
except ImportError as e:
print(f"Fehler: Paket nicht gefunden: {e}")
print("Bitte installieren Sie es mit: pip install cryptography")
sys.exit(1)
def create_self_signed_cert(cert_path, key_path, hostname="localhost"):
# Verzeichnis erstellen, falls es nicht existiert
cert_dir = os.path.dirname(cert_path)
if cert_dir and not os.path.exists(cert_dir):
os.makedirs(cert_dir, exist_ok=True)
# Privaten Schlüssel generieren
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=4096,
)
# Schlüsseldatei schreiben
with open(key_path, "wb") as key_file:
key_file.write(private_key.private_bytes(
encoding=Encoding.PEM,
format=PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=NoEncryption()
))
# Aktuelles Datum und Ablaufdatum berechnen
now = datetime.datetime.now()
valid_until = now + datetime.timedelta(days=3650) # 10 Jahre gültig
# Name für das Zertifikat erstellen
subject = issuer = x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, hostname),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Mercedes-Benz AG"),
x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, "Werk 040 Berlin"),
x509.NameAttribute(NameOID.COUNTRY_NAME, "DE"),
x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Berlin"),
x509.NameAttribute(NameOID.LOCALITY_NAME, "Berlin")
])
# Zertifikat erstellen
cert = x509.CertificateBuilder().subject_name(
subject
).issuer_name(
issuer
).public_key(
private_key.public_key()
).serial_number(
x509.random_serial_number()
).not_valid_before(
now
).not_valid_after(
valid_until
).add_extension(
x509.SubjectAlternativeName([
x509.DNSName(hostname),
x509.DNSName("localhost"),
x509.IPAddress(ipaddress.IPv4Address("127.0.0.1"))
]),
critical=False,
).add_extension(
x509.BasicConstraints(ca=True, path_length=None), critical=True
).add_extension(
x509.KeyUsage(
digital_signature=True,
content_commitment=False,
key_encipherment=True,
data_encipherment=False,
key_agreement=False,
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
decipher_only=False
), critical=True
).add_extension(
x509.ExtendedKeyUsage([
x509.oid.ExtendedKeyUsageOID.SERVER_AUTH,
x509.oid.ExtendedKeyUsageOID.CLIENT_AUTH
]), critical=False
).sign(private_key, hashes.SHA256())
# Zertifikatsdatei schreiben
with open(cert_path, "wb") as cert_file:
cert_file.write(cert.public_bytes(Encoding.PEM))
print(f"SSL-Zertifikat für '{hostname}' erstellt:")
print(f"Zertifikat: {cert_path}")
print(f"Schlüssel: {key_path}")
# Backend-Zertifikat erstellen
create_self_signed_cert('$backend_cert_file', '$backend_key_file', '$backend_hostname')
# Frontend SSL-Verzeichnis
frontend_ssl_dir = './frontend/ssl'
os.makedirs(frontend_ssl_dir, exist_ok=True)
# Frontend-Zertifikat erstellen (Kopie des Backend-Zertifikats)
import shutil
shutil.copy('$backend_cert_file', './frontend/ssl/myp.crt')
shutil.copy('$backend_key_file', './frontend/ssl/myp.key')
print("SSL-Zertifikate erfolgreich erstellt!")
EOL
# Python-Skript ausführen
if $python_cmd temp_cert_script.py; then
echo -e "${GREEN}SSL-Zertifikate erfolgreich erstellt!${NC}"
else
echo -e "${RED}Fehler beim Erstellen der SSL-Zertifikate.${NC}"
fi
# Temporäres Skript löschen
rm -f temp_cert_script.py
echo ""
echo -e "${BLUE}SSL-Zertifikate wurden erstellt:${NC}"
echo -e "${WHITE}- Backend: $backend_cert_file${NC}"
echo -e "${WHITE}- Frontend: frontend/ssl/myp.crt${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
show_project_info() {
show_header "Projekt-Informationen"
echo -e "${CYAN}MYP (Mercedes-Benz Yard Printing) Platform${NC}"
echo -e "${BLUE}Version 4.0${NC}"
echo ""
echo -e "${BLUE}Beschreibung:${NC}"
echo -e "${WHITE}Eine vollständige 3D-Drucker-Management-Plattform für Mercedes-Benz Werk 040 Berlin.${NC}"
echo ""
echo -e "${BLUE}Komponenten:${NC}"
echo -e "${WHITE}- Backend: Flask-basierte REST API${NC}"
echo -e "${WHITE}- Frontend: Next.js React-Anwendung${NC}"
echo -e "${WHITE}- Kiosk-Modus: Backend Web Interface${NC}"
echo -e "${WHITE}- Datenbank: SQLite${NC}"
echo -e "${WHITE}- Authentifizierung: GitHub OAuth + lokale Benutzer${NC}"
echo -e "${WHITE}- SSL/TLS: Selbstsignierte Zertifikate${NC}"
echo ""
echo -e "${BLUE}Standard-Zugangsdaten:${NC}"
echo -e "${WHITE}- Admin E-Mail: admin@mercedes-benz.com${NC}"
echo -e "${WHITE}- Admin Passwort: 744563017196A${NC}"
echo ""
echo -e "${BLUE}URLs:${NC}"
echo -e "${WHITE}- Backend API: https://localhost:443${NC}"
echo -e "${WHITE}- Frontend: http://localhost:3000${NC}"
echo -e "${WHITE}- Kiosk-Modus: https://localhost:443 (Vollbild)${NC}"
echo ""
echo -e "${BLUE}Deployment-Modi:${NC}"
echo -e "${WHITE}- Entwicklung: Backend + Frontend getrennt${NC}"
echo -e "${WHITE}- Produktion: Backend + Kiosk-Modus${NC}"
echo -e "${WHITE}- Vollständig: Alle Komponenten${NC}"
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
clean_old_files() {
show_header "Alte Dateien bereinigen"
read -p "Möchten Sie alte Skriptdateien und temporäre Dateien löschen? (j/n): " clean_files
if [ "$clean_files" = "j" ]; then
files_to_delete=(
"setup_hosts.sh"
"setup_ssl.sh"
"generate_ssl_certs.sh"
"temp_cert_script.py"
"frontend/cleanup.sh"
"frontend/install.sh"
"frontend/https-setup.sh"
"frontend/start-debug-server.sh"
"frontend/start-frontend-server.sh"
"frontend/check-backend-connection.sh"
"frontend/setup-backend-url.sh"
"frontend/start-debug-server.bat"
"backend/setup_myp.sh"
"backend/install/create_ssl_cert.sh"
"backend/install/ssl_check.sh"
)
for file in "${files_to_delete[@]}"; do
if [ -f "$file" ]; then
rm -f "$file"
echo -e "${GREEN}✓ Gelöscht: $file${NC}"
fi
done
echo -e "${GREEN}Bereinigung abgeschlossen!${NC}"
else
echo -e "${BLUE}Bereinigung übersprungen.${NC}"
fi
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
# Installationsmenü anzeigen
show_installation_menu() {
show_header "Installations-Menü"
echo -e "${WHITE}📦 SYSTEM-KOMPONENTEN:${NC}"
echo -e "${WHITE}1. System-Abhängigkeiten installieren${NC}"
echo -e "${WHITE}2. Python & Node.js Umgebung einrichten${NC}"
echo ""
echo -e "${WHITE}🔧 HAUPT-KOMPONENTEN:${NC}"
echo -e "${WHITE}3. Backend installieren (Flask API)${NC}"
echo -e "${WHITE}4. Frontend installieren (Next.js React)${NC}"
echo -e "${WHITE}5. Kiosk-Modus installieren (Backend Web Interface)${NC}"
echo -e "${WHITE}6. Frontend Produktions-Deployment (Port 80/443 mit SSL)${NC}"
echo ""
echo -e "${WHITE}🎯 VOLLINSTALLATIONEN:${NC}"
echo -e "${WHITE}7. Alles installieren (Backend + Frontend)${NC}"
echo -e "${WHITE}8. Produktions-Setup (Backend + Kiosk)${NC}"
echo -e "${WHITE}9. Entwicklungs-Setup (Backend + Frontend + Tools)${NC}"
echo ""
echo -e "${WHITE}⚙️ KONFIGURATION:${NC}"
echo -e "${WHITE}10. SSL-Zertifikate erstellen${NC}"
echo -e "${WHITE}11. Host-Konfiguration einrichten${NC}"
echo -e "${WHITE}12. Backend-URL konfigurieren${NC}"
echo ""
echo -e "${WHITE}🔍 SYSTEM & TESTS:${NC}"
echo -e "${WHITE}13. Systemvoraussetzungen prüfen${NC}"
echo -e "${WHITE}14. Backend-Verbindung testen${NC}"
echo -e "${WHITE}15. SSL-Status anzeigen${NC}"
echo ""
echo -e "${WHITE}🚀 ANWENDUNG STARTEN:${NC}"
echo -e "${WHITE}16. Server starten (Backend/Frontend/Kiosk)${NC}"
echo ""
echo -e "${WHITE} SONSTIGES:${NC}"
echo -e "${WHITE}17. Projekt-Informationen${NC}"
echo -e "${WHITE}18. Alte Dateien bereinigen${NC}"
echo -e "${WHITE}19. Zurück zum Hauptmenü${NC}"
echo -e "${WHITE}0. Beenden${NC}"
echo ""
read -p "Wählen Sie eine Option (0-19): " choice
case $choice in
1)
install_system_dependencies
show_installation_menu
;;
2)
setup_python_node_environment
show_installation_menu
;;
3)
install_backend
show_installation_menu
;;
4)
install_frontend
show_installation_menu
;;
5)
install_kiosk_mode
show_installation_menu
;;
6)
deploy_frontend_production
show_installation_menu
;;
7)
install_everything
show_installation_menu
;;
8)
install_production_setup
show_installation_menu
;;
9)
install_development_setup
show_installation_menu
;;
10)
install_development_setup
show_installation_menu
;;
11)
setup_hosts
show_installation_menu
;;
12)
setup_backend_url
show_installation_menu
;;
13)
test_dependencies
show_installation_menu
;;
14)
test_backend_connection
show_installation_menu
;;
15)
show_ssl_status
show_installation_menu
;;
16)
start_application
;;
17)
show_project_info
show_installation_menu
;;
18)
clean_old_files
show_installation_menu
;;
19)
show_main_menu
;;
0)
echo -e "${GREEN}Auf Wiedersehen!${NC}"
exit 0
;;
*)
echo -e "${RED}Ungültige Option. Bitte versuchen Sie es erneut.${NC}"
sleep 2
show_installation_menu
;;
esac
}
# Hauptmenü anzeigen
show_main_menu() {
show_header "Hauptmenü"
echo -e "${WHITE}🚀 SCHNELLSTART:${NC}"
echo -e "${WHITE}1. Vollständige Installation (Alle Komponenten)${NC}"
echo -e "${WHITE}2. Backend-Only Installation (Kiosk-ready)${NC}"
echo -e "${WHITE}3. Entwicklungs-Setup (Backend + Frontend)${NC}"
echo ""
echo -e "${WHITE}⚙️ GRANULARE INSTALLATION:${NC}"
echo -e "${WHITE}4. Granulare Installation & Konfiguration${NC}"
echo ""
echo -e "${WHITE}🔧 SYSTEM & WARTUNG:${NC}"
echo -e "${WHITE}5. Systemvoraussetzungen prüfen${NC}"
echo -e "${WHITE}6. Anwendung starten${NC}"
echo -e "${WHITE}7. Projekt-Informationen${NC}"
echo ""
echo -e "${WHITE}0. Beenden${NC}"
echo ""
read -p "Wählen Sie eine Option (0-7): " choice
case $choice in
1)
install_everything
show_main_menu
;;
2)
install_production_setup
show_main_menu
;;
3)
install_development_setup
show_main_menu
;;
4)
show_installation_menu
;;
5)
test_dependencies
show_main_menu
;;
6)
start_application
show_main_menu
;;
7)
show_project_info
show_main_menu
;;
0)
echo -e "${GREEN}Auf Wiedersehen!${NC}"
exit 0
;;
*)
echo -e "${RED}Ungültige Option. Bitte versuchen Sie es erneut.${NC}"
sleep 2
show_main_menu
;;
esac
}
# Skript starten
show_main_menu