"feat: Refactor backend configuration files, remove test scripts"

This commit is contained in:
2025-05-26 12:15:09 +02:00
parent 80172951d7
commit 117f7a857f
10 changed files with 264 additions and 1711 deletions

View File

@@ -221,19 +221,3 @@ def create_simple_ssl_cert():
except Exception as e:
print(f"Fehler beim Erstellen der SSL-Zertifikate: {e}")
return None
# Debug-Informationen für Pfad-Überprüfung
if __name__ == "__main__":
print("=== Pfad-Konfiguration ===")
print(f"BASE_DIR: {BASE_DIR}")
print(f"PROJECT_ROOT: {PROJECT_ROOT}")
print(f"DATABASE_PATH: {DATABASE_PATH}")
print(f"LOG_DIR: {LOG_DIR}")
print(f"SSL_CERT_PATH: {SSL_CERT_PATH}")
print(f"SSL_KEY_PATH: {SSL_KEY_PATH}")
print()
print("=== Pfad-Existenz ===")
print(f"Datenbank existiert: {os.path.exists(DATABASE_PATH)}")
print(f"Log-Verzeichnis existiert: {os.path.exists(LOG_DIR)}")
print(f"SSL-Zertifikat existiert: {os.path.exists(SSL_CERT_PATH)}")
print(f"SSL-Schlüssel existiert: {os.path.exists(SSL_KEY_PATH)}")

View File

@@ -1,40 +0,0 @@
#!/usr/bin/env python3
"""Test-Skript für Pfad-Überprüfung"""
import os
import sys
# Aktuelles Verzeichnis hinzufügen
sys.path.append('.')
try:
from config.settings import (
BASE_DIR, PROJECT_ROOT, DATABASE_PATH,
LOG_DIR, SSL_CERT_PATH, SSL_KEY_PATH
)
print("=== Pfad-Konfiguration ===")
print(f"BASE_DIR: {BASE_DIR}")
print(f"PROJECT_ROOT: {PROJECT_ROOT}")
print(f"DATABASE_PATH: {DATABASE_PATH}")
print(f"LOG_DIR: {LOG_DIR}")
print(f"SSL_CERT_PATH: {SSL_CERT_PATH}")
print(f"SSL_KEY_PATH: {SSL_KEY_PATH}")
print()
print("=== Pfad-Existenz ===")
print(f"Datenbank existiert: {os.path.exists(DATABASE_PATH)}")
print(f"Log-Verzeichnis existiert: {os.path.exists(LOG_DIR)}")
print(f"SSL-Zertifikat existiert: {os.path.exists(SSL_CERT_PATH)}")
print(f"SSL-Schlüssel existiert: {os.path.exists(SSL_KEY_PATH)}")
print()
print("=== Absolute Pfade ===")
print(f"DATABASE_PATH absolut: {os.path.abspath(DATABASE_PATH)}")
print(f"LOG_DIR absolut: {os.path.abspath(LOG_DIR)}")
print(f"SSL_CERT_PATH absolut: {os.path.abspath(SSL_CERT_PATH)}")
except ImportError as e:
print(f"Import-Fehler: {e}")
except Exception as e:
print(f"Fehler: {e}")

View File

@@ -1,245 +0,0 @@
#!/bin/bash
# Raspberry Pi Bereinigungsskript für MYP-Projekt Frontend
# Dieses Skript bereinigt alte Docker-Installationen und installiert alle erforderlichen Abhängigkeiten
# Farbcodes für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Funktion zur Ausgabe mit Zeitstempel
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error_log() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2
}
# Prüfen, ob das Skript mit Root-Rechten ausgeführt wird
if [ "$EUID" -ne 0 ]; then
error_log "Dieses Skript muss mit Root-Rechten ausgeführt werden (sudo)."
exit 1
fi
log "${YELLOW}=== MYP Frontend Raspberry Pi Bereinigung und Setup ===${NC}"
log "Dieses Skript wird alle alten Docker-Installationen entfernen und die erforderlichen Abhängigkeiten neu installieren."
# Sicherstellen, dass apt funktioniert
log "Aktualisiere apt-Paketindex..."
apt-get update || {
error_log "Konnte apt-Paketindex nicht aktualisieren."
exit 1
}
# Installiere grundlegende Abhängigkeiten
log "Installiere grundlegende Abhängigkeiten..."
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
wget \
git \
jq \
|| {
error_log "Konnte grundlegende Abhängigkeiten nicht installieren."
exit 1
}
# Stoppe alle laufenden Docker-Container
log "${YELLOW}Stoppe alle laufenden Docker-Container...${NC}"
if command -v docker &> /dev/null; then
docker stop $(docker ps -aq) 2>/dev/null || true
log "Alle Docker-Container gestoppt."
else
log "Docker ist nicht installiert, keine Container zu stoppen."
fi
# Entferne alte Docker-Installation
log "${YELLOW}Entferne alte Docker-Installation...${NC}"
apt-get remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose || true
apt-get autoremove -y || true
rm -rf /var/lib/docker /var/lib/containerd /var/run/docker.sock /etc/docker /usr/local/bin/docker-compose 2>/dev/null || true
log "${GREEN}Alte Docker-Installation entfernt.${NC}"
# Entferne alte Projektcontainer und -Dateien
log "${YELLOW}Entferne alte MYP-Projektcontainer und -Dateien...${NC}"
if command -v docker &> /dev/null; then
# Entferne Container
docker rm -f myp-frontend myp-backend 2>/dev/null || true
# Entferne Images
docker rmi -f myp-frontend myp-backend 2>/dev/null || true
# Entferne unbenutzte Volumes und Netzwerke
docker system prune -af --volumes 2>/dev/null || true
fi
# Erkennen der Raspberry Pi-Architektur
log "Erkenne Systemarchitektur..."
ARCH=$(dpkg --print-architecture)
log "Erkannte Architektur: ${ARCH}"
# Installiere Docker mit dem offiziellen Convenience-Skript
log "${YELLOW}Installiere Docker mit dem offiziellen Convenience-Skript...${NC}"
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --channel stable
# Überprüfen, ob Docker erfolgreich installiert wurde
if ! command -v docker &> /dev/null; then
error_log "Docker-Installation fehlgeschlagen!"
exit 1
fi
log "${GREEN}Docker erfolgreich installiert!${NC}"
# Füge den aktuellen Benutzer zur Docker-Gruppe hinzu
if [ "$SUDO_USER" ]; then
log "Füge Benutzer $SUDO_USER zur Docker-Gruppe hinzu..."
usermod -aG docker $SUDO_USER
log "${YELLOW}Hinweis: Eine Neuanmeldung ist erforderlich, damit die Gruppenänderung wirksam wird.${NC}"
fi
# Konfiguriere Docker mit DNS-Servern für bessere Netzwerkkompatibilität
log "Konfiguriere Docker mit Google DNS..."
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOL
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOL
# Starte Docker-Dienst neu
log "Starte Docker-Dienst neu..."
systemctl restart docker
systemctl enable docker
log "${GREEN}Docker-Dienst neu gestartet und für den Autostart aktiviert.${NC}"
# Installiere Docker Compose v2
log "${YELLOW}Installiere Docker Compose...${NC}"
# Bestimme die passende Docker Compose-Version für die Architektur
if [ "$ARCH" = "armhf" ]; then
log "Installiere Docker Compose für armhf (32-bit)..."
curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-armv7" -o /usr/local/bin/docker-compose
elif [ "$ARCH" = "arm64" ]; then
log "Installiere Docker Compose für arm64 (64-bit)..."
curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose
else
log "Unbekannte Architektur, verwende automatische Erkennung..."
curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
fi
chmod +x /usr/local/bin/docker-compose
# Überprüfe, ob Docker Compose installiert wurde
if ! command -v docker-compose &> /dev/null; then
error_log "Docker Compose-Installation fehlgeschlagen!"
exit 1
fi
# Installiere Docker Compose Plugin (neuere Methode)
log "Installiere Docker Compose Plugin..."
apt-get update
apt-get install -y docker-compose-plugin
log "${GREEN}Docker Compose erfolgreich installiert!${NC}"
docker compose version || docker-compose --version
# Installiere zusätzliche Abhängigkeiten für das Frontend
log "${YELLOW}Installiere zusätzliche Frontend-Abhängigkeiten...${NC}"
apt-get install -y \
nodejs \
npm \
|| {
error_log "Konnte zusätzliche Frontend-Abhängigkeiten nicht installieren."
exit 1
}
# Installiere Node.js LTS-Version über NodeSource
log "${YELLOW}Installiere aktuelle Node.js LTS-Version...${NC}"
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt-get install -y nodejs
# Überprüfe Node.js-Installation
NODE_VERSION=$(node -v)
log "${GREEN}Node.js $NODE_VERSION erfolgreich installiert!${NC}"
# Installiere pnpm
log "${YELLOW}Installiere pnpm Paketmanager...${NC}"
npm install -g pnpm
log "${GREEN}pnpm $(pnpm --version) erfolgreich installiert!${NC}"
# Optimieren des Raspberry Pi für Docker-Workloads
log "${YELLOW}Optimiere Raspberry Pi für Docker-Workloads...${NC}"
# Swap erhöhen für bessere Performance bei begrenztem RAM
log "Konfiguriere Swap-Größe..."
CURRENT_SWAP=$(grep "CONF_SWAPSIZE" /etc/dphys-swapfile | cut -d= -f2)
log "Aktuelle Swap-Größe: ${CURRENT_SWAP}"
# Erhöhe Swap auf 2GB, wenn weniger
if [ "$CURRENT_SWAP" -lt 2048 ]; then
sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
log "Swap-Größe auf 2048MB erhöht, Neustart des Swap-Dienstes erforderlich."
# Neustart des Swap-Dienstes
/etc/init.d/dphys-swapfile restart
else
log "Swap-Größe ist bereits ausreichend."
fi
# Konfiguriere cgroup für Docker
if ! grep -q "cgroup_enable=memory" /boot/cmdline.txt; then
log "Konfiguriere cgroup für Docker..."
CMDLINE=$(cat /boot/cmdline.txt)
echo "$CMDLINE cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1" > /boot/cmdline.txt
log "${YELLOW}WICHTIG: Ein Systemneustart ist erforderlich, damit die cgroup-Änderungen wirksam werden.${NC}"
fi
# Erstelle Datenbankverzeichnis für Frontend
log "Erstelle Datenbankverzeichnis für Frontend..."
mkdir -p /srv/MYP-DB
chmod 777 /srv/MYP-DB
# Erstelle Umgebungsvariablen-Verzeichnis
log "Erstelle Umgebungsvariablen-Verzeichnis..."
mkdir -p /srv/myp-env
cat > /srv/myp-env/github.env << EOL
# OAuth-Konfiguration für Frontend
OAUTH_CLIENT_ID=client_id
OAUTH_CLIENT_SECRET=client_secret
NEXT_PUBLIC_API_URL=http://192.168.0.105:5000
EOL
chmod 600 /srv/myp-env/github.env
# Prüfe, ob Frontend-Installationsdateien vorhanden sind
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
FRONTEND_DIR="$SCRIPT_DIR"
if [ -f "$FRONTEND_DIR/package.json" ]; then
log "${GREEN}Frontend-Projektdateien gefunden in $FRONTEND_DIR${NC}"
else
log "${YELLOW}Warnung: Frontend-Projektdateien nicht gefunden in $FRONTEND_DIR${NC}"
fi
# Abschlussmeldung
log "${GREEN}=== Bereinigung und Setup abgeschlossen ===${NC}"
log "${YELLOW}WICHTIGE HINWEISE:${NC}"
log "1. Ein ${RED}SYSTEMNEUSTART${NC} ist ${RED}DRINGEND ERFORDERLICH${NC}, damit alle Änderungen wirksam werden."
log "2. Nach dem Neustart können Sie das Frontend-Installationsskript ausführen:"
log " cd $FRONTEND_DIR && ./install.sh"
log "3. Bei Problemen mit Docker-Berechtigungen stellen Sie sicher, dass Sie sich neu angemeldet haben."
log "4. Sie müssen noch die OAuth-Konfiguration in /srv/myp-env/github.env anpassen."
echo ""
read -p "Möchten Sie das System jetzt neu starten? (j/n): " REBOOT_CHOICE
if [[ "$REBOOT_CHOICE" == "j" ]]; then
log "System wird neu gestartet..."
reboot
else
log "Bitte starten Sie das System manuell neu, bevor Sie die Installationsskripte ausführen."
fi

View File

@@ -1,31 +0,0 @@
#!/bin/bash
# Define image name
MYP_RP_IMAGE_NAME="myp-rp"
# Function to build Docker image
build_image() {
local image_name=$1
local dockerfile=$2
local platform=$3
echo "Building $image_name Docker image for $platform..."
docker buildx build --platform $platform -t ${image_name}:latest -f $dockerfile --load .
if [ $? -eq 0 ]; then
echo "$image_name Docker image built successfully"
else
echo "Error occurred while building $image_name Docker image"
exit 1
fi
}
# Create and use a builder instance (if not already created)
BUILDER_NAME="myp-rp-arm64-builder"
docker buildx create --name $BUILDER_NAME --use || docker buildx use $BUILDER_NAME
# Build myp-rp image
build_image "$MYP_RP_IMAGE_NAME" "$PWD/Dockerfile" "linux/arm64"
# Remove the builder instance
docker buildx rm $BUILDER_NAME

View File

@@ -1,68 +0,0 @@
#!/bin/bash
# Get image name as argument
IMAGE_NAME=$1
PLATFORM="linux/arm64"
# Define paths
IMAGE_DIR="docker/images"
IMAGE_FILE="${IMAGE_DIR}/${IMAGE_NAME//[:\/]/_}.tar"
COMPRESSED_FILE="${IMAGE_FILE}.xz"
# Function to pull the image
pull_image() {
local image=$1
if [[ $image == arm64v8/* ]]; then
echo "Pulling image $image without platform specification..."
docker pull $image
else
echo "Pulling image $image for platform $PLATFORM..."
docker pull --platform $PLATFORM $image
fi
return $?
}
# Pull the image if it is not available locally
if ! docker image inspect ${IMAGE_NAME} &>/dev/null; then
if pull_image ${IMAGE_NAME}; then
echo "Image $IMAGE_NAME pulled successfully."
else
echo "Error occurred while pulling $IMAGE_NAME for platform $PLATFORM"
echo "Trying to pull $IMAGE_NAME without platform specification..."
# Attempt to pull again without platform
if pull_image ${IMAGE_NAME}; then
echo "Image $IMAGE_NAME pulled successfully without platform."
else
echo "Error occurred while pulling $IMAGE_NAME without platform."
echo "Trying to pull arm64v8/${IMAGE_NAME} instead..."
# Construct new image name
NEW_IMAGE_NAME="arm64v8/${IMAGE_NAME}"
if pull_image ${NEW_IMAGE_NAME}; then
echo "Image $NEW_IMAGE_NAME pulled successfully."
IMAGE_NAME=${NEW_IMAGE_NAME} # Update IMAGE_NAME to use the new one
else
echo "Error occurred while pulling $NEW_IMAGE_NAME"
exit 1
fi
fi
fi
else
echo "Image $IMAGE_NAME found locally. Skipping pull."
fi
# Save the Docker image
echo "Saving $IMAGE_NAME Docker image..."
docker save ${IMAGE_NAME} > $IMAGE_FILE
# Compress the Docker image (overwriting if file exists)
echo "Compressing $IMAGE_FILE..."
xz -z --force $IMAGE_FILE
if [ $? -eq 0 ]; then
echo "$IMAGE_NAME Docker image saved and compressed successfully as $COMPRESSED_FILE"
else
echo "Error occurred while compressing $IMAGE_NAME Docker image"
exit 1
fi

View File

@@ -1,376 +0,0 @@
#!/bin/bash
# HTTPS-Setup-Skript für das MYP-Projekt
# Konfiguriert einen Raspberry Pi mit einer dual-network-Konfiguration
# - LAN (eth0): Firmennetzwerk mit Zugang zu Internet und unter https://m040tbaraspi001.de040.corpintra.net/ erreichbar
# - WLAN (wlan0): Verbindung zum Offline-Netzwerk, wo der Backend-Host erreichbar ist
# Farbcodes für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Funktion zur Ausgabe mit Zeitstempel
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error_log() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2
}
success_log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ERFOLG:${NC} $1"
}
header() {
echo ""
echo -e "${CYAN}===== $1 =====${NC}"
echo ""
}
# Prüfen, ob das Skript als Root ausgeführt wird
if [ "$EUID" -ne 0 ]; then
error_log "Dieses Skript muss als Root ausgeführt werden."
error_log "Bitte führen Sie es mit 'sudo' aus."
exit 1
fi
# Konfigurationswerte
FIRMENNETZWERK_HOSTNAME="m040tbaraspi001.de040.corpintra.net"
BACKEND_HOST="192.168.0.105" # Backend-IP im Offline-Netzwerk
BACKEND_PORT="5000" # Backend-Port
OFFLINE_NETWORK_SSID="MYP-Net"
OFFLINE_NETWORK_PASSWORD="myp-password"
CADDY_VERSION="2.7.6"
header "MYP-Netzwerk und HTTPS-Setup"
log "Dieses Skript konfiguriert Ihren Raspberry Pi für:"
log "1. Firmennetzwerk über LAN (eth0) mit Internet-Zugang"
log "2. Offline-Netzwerk über WLAN (wlan0) für Backend-Kommunikation"
log "3. HTTPS mit selbstsigniertem Zertifikat für ${FIRMENNETZWERK_HOSTNAME}"
# Netzwerkkonfiguration
setup_network() {
header "Netzwerkkonfiguration"
# Sichern der aktuellen Netzwerkkonfiguration
log "Sichere aktuelle Netzwerkkonfiguration..."
if [ -f /etc/dhcpcd.conf ]; then
cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak
success_log "Aktuelle Netzwerkkonfiguration gesichert in /etc/dhcpcd.conf.bak"
fi
# Konfigurieren von dhcpcd.conf für statische Routing
log "Konfiguriere Routing für duale Netzwerke..."
cat > /etc/dhcpcd.conf << EOL
# MYP Dual-Network Configuration
# eth0: Firmennetzwerk mit Internet
# wlan0: Offline-Netzwerk für Backend
# Allow dhcpcd to manage all interfaces
allowinterfaces eth0 wlan0
# eth0 configuration (Firmennetzwerk)
interface eth0
# DHCP for eth0, all default routes go through eth0
metric 100
# wlan0 configuration (Offline Network)
interface wlan0
# Static IP for wlan0
metric 200
# Add specific route to backend via wlan0
EOL
# Konfigurieren von wpa_supplicant für WLAN-Verbindung
log "Konfiguriere WLAN-Verbindung für Offline-Netzwerk..."
cat > /etc/wpa_supplicant/wpa_supplicant.conf << EOL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="${OFFLINE_NETWORK_SSID}"
psk="${OFFLINE_NETWORK_PASSWORD}"
priority=1
}
EOL
chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
# Routing-Tabelle konfigurieren
log "Konfiguriere spezifisches Routing zum Backend..."
if ! grep -q "${BACKEND_HOST}" /etc/iproute2/rt_tables; then
echo "200 backend" >> /etc/iproute2/rt_tables
fi
# Routing-Regeln in /etc/network/if-up.d/ hinzufügen
cat > /etc/network/if-up.d/route-backend << EOL
#!/bin/bash
# Routing-Regeln für Backend-Host über WLAN
# Wenn wlan0 hochgefahren wird
if [ "\$IFACE" = "wlan0" ]; then
# Spezifische Route zum Backend über wlan0
/sbin/ip route add ${BACKEND_HOST}/32 dev wlan0
fi
EOL
chmod +x /etc/network/if-up.d/route-backend
success_log "Netzwerkkonfiguration abgeschlossen"
}
# Installation von Caddy als Reverse-Proxy
install_caddy() {
header "Installation von Caddy als Reverse-Proxy"
log "Überprüfe, ob Caddy bereits installiert ist..."
if command -v caddy &> /dev/null; then
success_log "Caddy ist bereits installiert"
else
log "Installiere Caddy ${CADDY_VERSION}..."
# Download und Installation von Caddy
wget -O /tmp/caddy.tar.gz "https://github.com/caddyserver/caddy/releases/download/v${CADDY_VERSION}/caddy_${CADDY_VERSION}_linux_armv7.tar.gz"
if [ $? -ne 0 ]; then
error_log "Fehler beim Herunterladen von Caddy"
return 1
fi
tar -xzf /tmp/caddy.tar.gz -C /tmp
mv /tmp/caddy /usr/local/bin/
chmod +x /usr/local/bin/caddy
# Benutzer und Gruppe für Caddy erstellen
if ! id -u caddy &>/dev/null; then
useradd --system --home /var/lib/caddy --shell /usr/sbin/nologin caddy
fi
# Verzeichnisse für Caddy erstellen
mkdir -p /etc/caddy /var/lib/caddy /var/log/caddy
chown -R caddy:caddy /var/lib/caddy /var/log/caddy
# Systemd-Service für Caddy einrichten
cat > /etc/systemd/system/caddy.service << EOL
[Unit]
Description=Caddy Web Server
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
User=caddy
Group=caddy
ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
EOL
success_log "Caddy wurde installiert"
fi
# Caddyfile für HTTPS mit selbstsigniertem Zertifikat konfigurieren
log "Konfiguriere Caddy für HTTPS mit selbstsigniertem Zertifikat..."
cat > /etc/caddy/Caddyfile << EOL
{
# Globale Optionen
admin off
auto_https disable_redirects
# Selbstsigniertes Zertifikat verwenden
local_certs
default_sni ${FIRMENNETZWERK_HOSTNAME}
}
# HTTPS-Konfiguration für den Firmennetzwerk-Hostnamen
${FIRMENNETZWERK_HOSTNAME} {
# TLS mit selbstsigniertem Zertifikat
tls internal {
on_demand
}
# Reverse-Proxy zum Next.js-Frontend
reverse_proxy localhost:3000 {
# Zeitüberschreitungen für langsame Raspberry Pi-Verbindungen erhöhen
timeouts 5m
}
# Logging
log {
output file /var/log/caddy/access.log
format console
}
}
# HTTP-Konfiguration für lokalen Zugriff
:80 {
# Weiterleitung zu HTTPS
redir https://${FIRMENNETZWERK_HOSTNAME}{uri} permanent
}
# Zusätzlicher Server für Backend-Proxy (API-Anfragen weiterleiten)
localhost:8000 {
reverse_proxy ${BACKEND_HOST}:${BACKEND_PORT} {
# Headers für CORS anpassen
header_up Host ${BACKEND_HOST}:${BACKEND_PORT}
header_up X-Forwarded-Host ${FIRMENNETZWERK_HOSTNAME}
header_up X-Forwarded-Proto https
# Zeitüberschreitungen für API-Anfragen erhöhen
timeouts 1m
}
# Logging
log {
output file /var/log/caddy/backend-access.log
format console
}
}
EOL
# Caddy-Service neu laden und starten
log "Starte Caddy-Service..."
systemctl daemon-reload
systemctl enable caddy
systemctl restart caddy
# Überprüfen, ob Caddy läuft
if systemctl is-active --quiet caddy; then
success_log "Caddy-Service wurde gestartet und ist aktiv"
else
error_log "Fehler beim Starten des Caddy-Services"
return 1
fi
return 0
}
# Next.js Frontend-Konfiguration für HTTPS und Backend-Proxy
configure_frontend() {
header "Frontend-Konfiguration für HTTPS"
# Verzeichnis für das Frontend
FRONTEND_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Prüfen, ob das Frontend-Verzeichnis existiert
if [ ! -d "$FRONTEND_DIR" ]; then
error_log "Frontend-Verzeichnis nicht gefunden: $FRONTEND_DIR"
return 1
fi
log "Konfiguriere Frontend für HTTPS und Backend-Proxy..."
# .env.local-Datei für das Frontend erstellen
cat > "$FRONTEND_DIR/.env.local" << EOL
# Backend API Konfiguration (über lokalen Proxy zu Backend)
NEXT_PUBLIC_API_URL=http://localhost:8000
# Frontend-URL für OAuth Callback (HTTPS)
NEXT_PUBLIC_FRONTEND_URL=https://${FIRMENNETZWERK_HOSTNAME}
# Explizite OAuth Callback URL für GitHub
NEXT_PUBLIC_OAUTH_CALLBACK_URL=https://${FIRMENNETZWERK_HOSTNAME}/auth/login/callback
EOL
# Berechtigungen setzen
chown -R $(stat -c '%U:%G' "$FRONTEND_DIR") "$FRONTEND_DIR/.env.local"
chmod 600 "$FRONTEND_DIR/.env.local"
success_log "Frontend wurde für HTTPS und Backend-Proxy konfiguriert"
# Hinweis zur Installation und zum Start des Frontends
log "${YELLOW}Hinweis: Führen Sie nun das Frontend-Installationsskript aus:${NC}"
log "cd $FRONTEND_DIR && ./install.sh"
return 0
}
# Hostname setzen
set_hostname() {
header "Hostname konfigurieren"
log "Aktueller Hostname: $(hostname)"
log "Setze Hostname auf ${FIRMENNETZWERK_HOSTNAME}..."
# Hostname in /etc/hostname setzen
echo "${FIRMENNETZWERK_HOSTNAME}" > /etc/hostname
# Hostname in /etc/hosts aktualisieren
if grep -q "$(hostname)" /etc/hosts; then
sed -i "s/$(hostname)/${FIRMENNETZWERK_HOSTNAME}/g" /etc/hosts
else
echo "127.0.1.1 ${FIRMENNETZWERK_HOSTNAME}" >> /etc/hosts
fi
# Aktualisieren des Hostnamens ohne Neustart
hostname "${FIRMENNETZWERK_HOSTNAME}"
success_log "Hostname wurde auf ${FIRMENNETZWERK_HOSTNAME} gesetzt"
log "${YELLOW}Hinweis: Ein Neustart wird empfohlen, um sicherzustellen, dass der neue Hostname vollständig übernommen wurde.${NC}"
return 0
}
# Hauptfunktion
main() {
# Begrüßung und Bestätigung
header "MYP HTTPS und Dual-Network Setup"
log "Dieses Skript richtet Ihren Raspberry Pi für das MYP-Projekt ein:"
log "- Setzt den Hostname auf: ${FIRMENNETZWERK_HOSTNAME}"
log "- Konfiguriert das duale Netzwerk (LAN für Internet, WLAN für Backend)"
log "- Installiert Caddy als Reverse-Proxy mit selbstsigniertem HTTPS"
log "- Konfiguriert das Frontend für die Kommunikation mit dem Backend"
echo ""
log "${YELLOW}WICHTIG: Diese Konfiguration kann bestehende Netzwerk- und HTTPS-Einstellungen überschreiben.${NC}"
read -p "Möchten Sie fortfahren? (j/n): " confirm
if [[ "$confirm" != "j" ]]; then
log "Setup abgebrochen."
exit 0
fi
# Schritte ausführen
set_hostname || { error_log "Fehler beim Setzen des Hostnamens"; exit 1; }
setup_network || { error_log "Fehler bei der Netzwerkkonfiguration"; exit 1; }
install_caddy || { error_log "Fehler bei der Caddy-Installation"; exit 1; }
configure_frontend || { error_log "Fehler bei der Frontend-Konfiguration"; exit 1; }
# Abschlussmeldung
header "Setup abgeschlossen"
success_log "MYP HTTPS und Dual-Network Setup erfolgreich!"
log "Ihr Raspberry Pi ist nun wie folgt konfiguriert:"
log "- Hostname: ${FIRMENNETZWERK_HOSTNAME}"
log "- HTTPS mit selbstsigniertem Zertifikat über Caddy"
log "- Duale Netzwerkkonfiguration:"
log " * eth0: Firmennetzwerk mit Internet-Zugang"
log " * wlan0: Verbindung zum Offline-Netzwerk (${OFFLINE_NETWORK_SSID})"
log "- Frontend-URL: https://${FIRMENNETZWERK_HOSTNAME}"
log "- Backend-Kommunikation über lokalen Proxy: http://localhost:8000 -> ${BACKEND_HOST}:${BACKEND_PORT}"
echo ""
log "${YELLOW}Wichtige nächste Schritte:${NC}"
log "1. Starten Sie das Frontend mit dem Installationsskript:"
log " cd $FRONTEND_DIR && ./install.sh"
log "2. Neustart des Raspberry Pi empfohlen:"
log " sudo reboot"
echo ""
log "${YELLOW}Hinweis zum selbstsignierten Zertifikat:${NC}"
log "Bei Zugriff auf https://${FIRMENNETZWERK_HOSTNAME} erhalten Sie eine Zertifikatswarnung im Browser."
log "Dies ist normal für selbstsignierte Zertifikate. Sie können die Warnung in Ihrem Browser bestätigen."
}
# Skript starten
main

View File

@@ -1,570 +0,0 @@
#!/bin/bash
# MYP Frontend Installations-Skript
# Dieses Skript installiert das Frontend mit Docker und Host-Netzwerkanbindung
# Farbcodes für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Funktion zur Ausgabe mit Zeitstempel
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error_log() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2
}
success_log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ERFOLG:${NC} $1"
}
header() {
echo ""
echo -e "${CYAN}===== $1 =====${NC}"
echo ""
}
# Variablen definieren
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
FRONTEND_DIR="$SCRIPT_DIR"
DOCKER_DIR="$FRONTEND_DIR/docker"
DEFAULT_BACKEND_URL="http://192.168.0.105:5000"
IMAGE_NAME="myp-rp:latest"
CONTAINER_NAME="myp-rp"
DB_VOLUME_DIR="/srv/MYP-DB"
ENV_FILE_PATH="/srv/myp-env/github.env"
# Prüfen, ob wir im Frontend-Verzeichnis sind
if [ ! -f "$FRONTEND_DIR/package.json" ]; then
error_log "Dieses Skript muss im Frontend-Verzeichnis ausgeführt werden."
error_log "Bitte wechseln Sie in das Frontend-Verzeichnis."
exit 1
fi
# Prüfen, ob Docker installiert ist
if ! command -v docker &> /dev/null; then
error_log "Docker ist nicht installiert. Bitte installieren Sie Docker zuerst."
exit 1
fi
# Prüfen, ob Docker läuft
if ! docker info &> /dev/null; then
error_log "Docker-Daemon läuft nicht. Bitte starten Sie Docker mit 'sudo systemctl start docker'."
exit 1
fi
# Prüfen, ob der Benutzer in der Docker-Gruppe ist
if ! groups | grep -q '\bdocker\b'; then
error_log "Aktueller Benutzer hat keine Docker-Berechtigungen."
error_log "Bitte führen Sie das Skript mit 'sudo' aus oder fügen Sie den Benutzer zur Docker-Gruppe hinzu:"
error_log "sudo usermod -aG docker $USER && newgrp docker"
exit 1
fi
# Erstelle Datenbank-Verzeichnis, falls nicht vorhanden
if [ ! -d "$DB_VOLUME_DIR" ]; then
log "Erstelle Datenbankverzeichnis: $DB_VOLUME_DIR"
if ! mkdir -p "$DB_VOLUME_DIR"; then
if ! sudo mkdir -p "$DB_VOLUME_DIR"; then
error_log "Konnte Datenbankverzeichnis nicht erstellen. Bitte erstellen Sie es manuell:"
error_log "sudo mkdir -p $DB_VOLUME_DIR && sudo chown $USER:$USER $DB_VOLUME_DIR"
exit 1
fi
sudo chown $USER:$USER "$DB_VOLUME_DIR"
fi
else
log "Datenbankverzeichnis existiert bereits: $DB_VOLUME_DIR"
fi
# Funktion zum Laden der Umgebungsvariablen aus /srv/myp-env/github.env
load_env_from_srv() {
if [ -f "$ENV_FILE_PATH" ]; then
log "Lade Umgebungsvariablen aus $ENV_FILE_PATH"
# Versuche, die Variablen aus der Datei zu laden
OAUTH_CLIENT_ID=$(grep -oP 'OAUTH_CLIENT_ID=\K.*' "$ENV_FILE_PATH" 2>/dev/null || echo "client_id")
OAUTH_CLIENT_SECRET=$(grep -oP 'OAUTH_CLIENT_SECRET=\K.*' "$ENV_FILE_PATH" 2>/dev/null || echo "client_secret")
# Prüfe, ob die Backend-URL in der Datei definiert ist
BACKEND_URL_FROM_FILE=$(grep -oP 'NEXT_PUBLIC_API_URL=\K.*' "$ENV_FILE_PATH" 2>/dev/null)
if [ -n "$BACKEND_URL_FROM_FILE" ]; then
log "Backend-URL aus $ENV_FILE_PATH geladen: $BACKEND_URL_FROM_FILE"
DEFAULT_BACKEND_URL="$BACKEND_URL_FROM_FILE"
fi
success_log "OAuth-Konfiguration aus $ENV_FILE_PATH geladen."
else
log "${YELLOW}Warnung: $ENV_FILE_PATH nicht gefunden. Verwende Standard-Konfiguration.${NC}"
OAUTH_CLIENT_ID="client_id"
OAUTH_CLIENT_SECRET="client_secret"
fi
}
# Funktion zum Konfigurieren der Backend-URL
configure_backend_url() {
local backend_url="${1:-$DEFAULT_BACKEND_URL}"
header "Backend-URL konfigurieren"
log "Konfiguriere Backend-URL für Frontend: $backend_url"
# Lade OAuth-Konfiguration aus /srv
load_env_from_srv
# Prüfen, ob setup-backend-url.sh existiert
if [ -f "$FRONTEND_DIR/setup-backend-url.sh" ]; then
chmod +x "$FRONTEND_DIR/setup-backend-url.sh"
if ! "$FRONTEND_DIR/setup-backend-url.sh" "$backend_url"; then
error_log "Fehler beim Konfigurieren der Backend-URL."
return 1
fi
else
# Bestimme den Hostnamen für OAuth
HOSTNAME=$(hostname)
if [[ "$HOSTNAME" == *"m040tbaraspi001"* ]] || [[ "$HOSTNAME" == *"corpintra"* ]]; then
FRONTEND_HOSTNAME="m040tbaraspi001.de040.corpintra.net"
OAUTH_URL="http://m040tbaraspi001.de040.corpintra.net/auth/login/callback"
log "Erkannt: Unternehmens-Hostname: $FRONTEND_HOSTNAME"
else
FRONTEND_HOSTNAME="$HOSTNAME"
OAUTH_URL="http://$HOSTNAME:3000/auth/login/callback"
log "Lokaler Hostname: $FRONTEND_HOSTNAME"
fi
# Erstelle .env.local-Datei manuell
log "Erstelle .env.local-Datei manuell..."
cat > "$FRONTEND_DIR/.env.local" << EOL
# Backend API Konfiguration
NEXT_PUBLIC_API_URL=${backend_url}
# Frontend-URL für OAuth Callback
NEXT_PUBLIC_FRONTEND_URL=http://${FRONTEND_HOSTNAME}
# Explizite OAuth Callback URL für GitHub
NEXT_PUBLIC_OAUTH_CALLBACK_URL=${OAUTH_URL}
# OAuth Konfiguration aus /srv/myp-env/github.env
OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
EOL
if [ ! -f "$FRONTEND_DIR/.env.local" ]; then
error_log "Konnte .env.local-Datei nicht erstellen."
return 1
fi
chmod 600 "$FRONTEND_DIR/.env.local"
fi
success_log "Backend-URL erfolgreich konfiguriert: $backend_url"
return 0
}
# Funktion zum Bauen des Images
build_image() {
header "Docker-Image bauen"
log "Baue Docker-Image: $IMAGE_NAME"
if [ ! -f "$FRONTEND_DIR/Dockerfile" ]; then
error_log "Dockerfile nicht gefunden in $FRONTEND_DIR"
return 1
fi
cd "$FRONTEND_DIR" || return 1
# Vorhandenes Image entfernen, falls gewünscht
if docker image inspect "$IMAGE_NAME" &>/dev/null; then
log "Image $IMAGE_NAME existiert bereits."
read -p "Möchten Sie das existierende Image überschreiben? (j/n): " rebuild_choice
if [[ "$rebuild_choice" == "j" ]]; then
log "Entferne existierendes Image..."
docker rmi "$IMAGE_NAME" &>/dev/null || true
else
log "Behalte existierendes Image."
return 0
fi
fi
# Baue das Image
log "${YELLOW}Baue Docker-Image... (Dies kann auf einem Raspberry Pi mehrere Minuten dauern)${NC}"
if ! docker build -t "$IMAGE_NAME" .; then
error_log "Fehler beim Bauen des Docker-Images."
return 1
fi
success_log "Docker-Image erfolgreich gebaut: $IMAGE_NAME"
return 0
}
# Funktion zum Speichern des Images
save_image() {
header "Docker-Image speichern"
local save_dir="${1:-$DOCKER_DIR/images}"
local save_file="$save_dir/myp-frontend.tar"
# Prüfen, ob das Image existiert
if ! docker image inspect "$IMAGE_NAME" &>/dev/null; then
error_log "Image $IMAGE_NAME existiert nicht. Bitte bauen Sie es zuerst."
return 1
fi
# Verzeichnis erstellen, falls es nicht existiert
mkdir -p "$save_dir"
log "Speichere Docker-Image in: $save_file"
log "${YELLOW}Dies kann einige Minuten dauern...${NC}"
if ! docker save -o "$save_file" "$IMAGE_NAME"; then
error_log "Fehler beim Speichern des Docker-Images."
return 1
fi
# Prüfe, ob die Datei erstellt wurde
if [ ! -f "$save_file" ]; then
error_log "Konnte Docker-Image nicht speichern."
return 1
fi
# Prüfe Dateigröße
local filesize=$(stat -c%s "$save_file")
if [ "$filesize" -lt 1000000 ]; then # Kleiner als 1MB ist verdächtig
error_log "Gespeichertes Image ist ungewöhnlich klein ($filesize Bytes). Möglicherweise ist etwas schief gelaufen."
return 1
fi
success_log "Docker-Image erfolgreich gespeichert: $save_file (Größe: $(du -h "$save_file" | cut -f1))"
return 0
}
# Funktion zum Laden des Images
load_image() {
header "Docker-Image laden"
local load_dir="${1:-$DOCKER_DIR/images}"
local load_file="$load_dir/myp-frontend.tar"
# Prüfen, ob die Datei existiert
if [ ! -f "$load_file" ]; then
error_log "Image-Datei nicht gefunden: $load_file"
return 1
fi
# Prüfe Dateigröße
local filesize=$(stat -c%s "$load_file")
if [ "$filesize" -lt 1000000 ]; then # Kleiner als 1MB ist verdächtig
error_log "Image-Datei ist ungewöhnlich klein ($filesize Bytes). Möglicherweise ist sie beschädigt."
return 1
fi
log "Lade Docker-Image aus: $load_file"
log "${YELLOW}Dies kann einige Minuten dauern...${NC}"
if ! docker load -i "$load_file"; then
error_log "Fehler beim Laden des Docker-Images. Die Datei könnte beschädigt sein."
return 1
fi
success_log "Docker-Image erfolgreich geladen."
return 0
}
# Funktion zum Starten des Containers mit Docker Compose
start_container_compose() {
header "Container mit Docker Compose starten"
# Erstellen der vereinfachten docker-compose.yml-Datei
local compose_file="$DOCKER_DIR/compose.simple.yml"
# Lade OAuth-Konfiguration aus /srv, falls noch nicht geschehen
if [ -z "$OAUTH_CLIENT_ID" ]; then
load_env_from_srv
fi
# Docker-Verzeichnis erstellen, falls nicht vorhanden
mkdir -p "$DOCKER_DIR"
log "Erstelle vereinfachte Docker-Compose-Datei: $compose_file"
cat > "$compose_file" << EOL
services:
myp-rp:
image: ${IMAGE_NAME}
container_name: ${CONTAINER_NAME}
environment:
- NEXT_PUBLIC_API_URL=${BACKEND_URL}
- NEXT_PUBLIC_FRONTEND_URL=http://${FRONTEND_HOSTNAME}
- NEXT_PUBLIC_OAUTH_CALLBACK_URL=${OAUTH_URL}
- OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
- OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
env_file: "${ENV_FILE_PATH}"
ports:
- "3000:3000"
volumes:
- ${DB_VOLUME_DIR}:/app/db
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
EOL
# Prüfen, ob die Datei erstellt wurde
if [ ! -f "$compose_file" ]; then
error_log "Konnte Docker-Compose-Datei nicht erstellen."
return 1
fi
# Stoppen des vorhandenen Containers
if docker ps -a | grep -q "$CONTAINER_NAME"; then
log "Stoppe und entferne existierenden Container..."
docker stop "$CONTAINER_NAME" &>/dev/null || true
docker rm "$CONTAINER_NAME" &>/dev/null || true
fi
# Container starten
log "Starte Container..."
cd "$DOCKER_DIR" || return 1
if ! docker compose -f "$(basename "$compose_file")" up -d; then
# Versuche mit docker-compose, falls docker compose nicht funktioniert
if ! docker-compose -f "$(basename "$compose_file")" up -d; then
error_log "Fehler beim Starten des Containers."
return 1
fi
fi
success_log "Container erfolgreich gestartet: $CONTAINER_NAME"
return 0
}
# Funktion zum Starten des Containers mit Docker Run
start_container_run() {
header "Container direkt starten"
# Stoppen des vorhandenen Containers
if docker ps -a | grep -q "$CONTAINER_NAME"; then
log "Stoppe und entferne existierenden Container..."
docker stop "$CONTAINER_NAME" &>/dev/null || true
docker rm "$CONTAINER_NAME" &>/dev/null || true
fi
# Lade OAuth-Konfiguration aus /srv, falls noch nicht geschehen
if [ -z "$OAUTH_CLIENT_ID" ]; then
load_env_from_srv
fi
# Container starten
log "Starte Container mit 'docker run'..."
if ! docker run -d --name "$CONTAINER_NAME" \
-p 3000:3000 \
-e "NEXT_PUBLIC_API_URL=$BACKEND_URL" \
-e "NEXT_PUBLIC_FRONTEND_URL=http://${FRONTEND_HOSTNAME}" \
-e "NEXT_PUBLIC_OAUTH_CALLBACK_URL=${OAUTH_URL}" \
-e "OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}" \
-e "OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}" \
--env-file "$ENV_FILE_PATH" \
-v "$DB_VOLUME_DIR:/app/db" \
--restart unless-stopped \
"$IMAGE_NAME"; then
error_log "Fehler beim Starten des Containers."
return 1
fi
success_log "Container erfolgreich gestartet: $CONTAINER_NAME"
return 0
}
# Funktion zum Starten der Anwendung ohne Docker
start_without_docker() {
header "Anwendung ohne Docker starten"
cd "$FRONTEND_DIR" || return 1
# Prüfen, ob Node.js und pnpm installiert sind
if ! command -v node &> /dev/null; then
error_log "Node.js ist nicht installiert. Bitte installieren Sie Node.js zuerst."
return 1
fi
if ! command -v pnpm &> /dev/null; then
log "pnpm ist nicht installiert. Installiere pnpm..."
npm install -g pnpm
if [ $? -ne 0 ]; then
error_log "Fehler beim Installieren von pnpm."
return 1
fi
fi
# Installiere Abhängigkeiten
log "Installiere Abhängigkeiten..."
if ! pnpm install; then
error_log "Fehler beim Installieren der Abhängigkeiten."
return 1
fi
# Lade OAuth-Konfiguration aus /srv und konfiguriere die Backend-URL
load_env_from_srv
if ! configure_backend_url "$BACKEND_URL"; then
error_log "Fehler beim Konfigurieren der Backend-URL."
return 1
fi
# Baue und starte die Anwendung
log "Baue und starte die Anwendung..."
if ! pnpm build; then
log "${YELLOW}Warnung: Build fehlgeschlagen. Versuche, im Dev-Modus zu starten...${NC}"
fi
# Starte im Screen-Session, damit die Anwendung im Hintergrund läuft
if command -v screen &> /dev/null; then
log "Starte Anwendung in Screen-Session..."
screen -dmS myp-frontend bash -c "cd $FRONTEND_DIR && \
NEXT_PUBLIC_API_URL=$BACKEND_URL \
NEXT_PUBLIC_FRONTEND_URL=http://${FRONTEND_HOSTNAME} \
NEXT_PUBLIC_OAUTH_CALLBACK_URL=${OAUTH_URL} \
OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID} \
OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} \
pnpm start || \
NEXT_PUBLIC_API_URL=$BACKEND_URL \
NEXT_PUBLIC_FRONTEND_URL=http://${FRONTEND_HOSTNAME} \
NEXT_PUBLIC_OAUTH_CALLBACK_URL=${OAUTH_URL} \
OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID} \
OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} \
pnpm dev"
success_log "Anwendung im Hintergrund gestartet. Verbinden mit: screen -r myp-frontend"
else
log "${YELLOW}Screen ist nicht installiert. Starte Anwendung im Vordergrund...${NC}"
log "${YELLOW}Beenden mit Strg+C. Die Anwendung wird dann beendet.${NC}"
sleep 3
export NEXT_PUBLIC_API_URL="$BACKEND_URL"
export NEXT_PUBLIC_FRONTEND_URL="http://${FRONTEND_HOSTNAME}"
export NEXT_PUBLIC_OAUTH_CALLBACK_URL="${OAUTH_URL}"
export OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID}"
export OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET}"
pnpm start || pnpm dev
fi
return 0
}
# Funktion für das Hauptmenü
main_menu() {
local choice
header "MYP Frontend Deployment"
echo "Bitte wählen Sie eine Option:"
echo ""
echo "1) Alles automatisch (Build, Deploy, Starten)"
echo "2) Docker-Image bauen"
echo "3) Docker-Image speichern"
echo "4) Docker-Image laden"
echo "5) Container mit Docker Compose starten"
echo "6) Container direkt mit Docker Run starten"
echo "7) Anwendung ohne Docker starten"
echo "8) Nur Backend-URL konfigurieren"
echo "9) Beenden"
echo ""
read -p "Ihre Wahl (1-9): " choice
case $choice in
1) auto_deploy ;;
2) build_image ;;
3) save_image ;;
4) load_image ;;
5) configure_backend_url && start_container_compose ;;
6) configure_backend_url && start_container_run ;;
7) start_without_docker ;;
8) configure_backend_url ;;
9) log "Beende das Programm." && exit 0 ;;
*) error_log "Ungültige Auswahl. Bitte versuchen Sie es erneut." && main_menu ;;
esac
# Zurück zum Hauptmenü, es sei denn, der Benutzer hat das Programm beendet
if [ $choice -ne 9 ]; then
read -p "Drücken Sie Enter, um zum Hauptmenü zurückzukehren..."
main_menu
fi
}
# Automatischer Deployment-Workflow
auto_deploy() {
header "Automatisches Deployment"
log "Starte automatischen Deployment-Workflow..."
# Konfiguriere Backend-URL
if ! configure_backend_url; then
error_log "Fehler beim Konfigurieren der Backend-URL."
return 1
fi
# Versuche zunächst, das Image zu laden
local load_dir="$DOCKER_DIR/images"
local load_file="$load_dir/myp-frontend.tar"
if [ -f "$load_file" ]; then
log "Image-Datei gefunden. Versuche zu laden..."
if load_image; then
log "Image erfolgreich geladen. Überspringe Bauen."
else
log "Konnte Image nicht laden. Versuche zu bauen..."
if ! build_image; then
error_log "Automatisches Deployment fehlgeschlagen beim Bauen des Images."
return 1
fi
fi
else
log "Keine Image-Datei gefunden. Baue neues Image..."
if ! build_image; then
error_log "Automatisches Deployment fehlgeschlagen beim Bauen des Images."
return 1
fi
fi
# Speichere das Image für zukünftige Verwendung
log "Speichere Image für zukünftige Verwendung..."
save_image
# Starte den Container
log "Starte Container..."
if ! start_container_compose; then
error_log "Konnte Container nicht mit Docker Compose starten. Versuche direkten Start..."
if ! start_container_run; then
error_log "Automatisches Deployment fehlgeschlagen beim Starten des Containers."
return 1
fi
fi
success_log "Automatisches Deployment erfolgreich abgeschlossen!"
log "Frontend ist unter http://localhost:3000 erreichbar"
log "API-Kommunikation mit Backend: $BACKEND_URL"
return 0
}
# Hauptanwendung
# Zuerst nach Backend-URL fragen
header "Backend-URL Konfiguration"
log "Standard-Backend-URL: $DEFAULT_BACKEND_URL"
read -p "Möchten Sie eine andere Backend-URL verwenden? (j/n): " change_url_choice
if [[ "$change_url_choice" == "j" ]]; then
read -p "Geben Sie die neue Backend-URL ein (z.B. http://192.168.0.105:5000): " custom_url
if [ -n "$custom_url" ]; then
BACKEND_URL="$custom_url"
log "Verwende benutzerdefinierte Backend-URL: $BACKEND_URL"
else
BACKEND_URL="$DEFAULT_BACKEND_URL"
log "Leere Eingabe. Verwende Standard-Backend-URL: $BACKEND_URL"
fi
else
BACKEND_URL="$DEFAULT_BACKEND_URL"
log "Verwende Standard-Backend-URL: $BACKEND_URL"
fi
# Anzeigen des Hauptmenüs
main_menu

View File

@@ -1,55 +0,0 @@
#!/bin/bash
# Farbcodes für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Funktion zur Ausgabe mit Zeitstempel
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error_log() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2
}
# Pfad zum Debug-Server
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
DEBUG_SERVER_DIR="$SCRIPT_DIR/debug-server"
# Prüfe, ob das Debug-Server-Verzeichnis existiert
if [ ! -d "$DEBUG_SERVER_DIR" ]; then
error_log "Debug-Server-Verzeichnis nicht gefunden: $DEBUG_SERVER_DIR"
exit 1
fi
# Prüfe, ob Node.js installiert ist
if ! command -v node &> /dev/null; then
error_log "Node.js nicht gefunden. Bitte installieren Sie Node.js."
exit 1
fi
# Prüfe, ob npm installiert ist
if ! command -v npm &> /dev/null; then
error_log "npm nicht gefunden. Bitte installieren Sie npm."
exit 1
fi
# Wechsle ins Debug-Server-Verzeichnis
cd "$DEBUG_SERVER_DIR" || exit 1
# Installiere Abhängigkeiten, falls nötig
if [ -f "package.json" ]; then
log "Installiere Abhängigkeiten..."
npm install
fi
# Erstelle benötigte Verzeichnisse, falls sie nicht existieren
mkdir -p public/views
# Starte den Debug-Server
log "Starte Frontend-Debug-Server..."
node src/app.js

View File

@@ -1,162 +0,0 @@
#!/bin/bash
# 🎨 MYP Frontend - Standalone Server Start
# Startet den Frontend-Server vollständig unabhängig vom Backend
set -e
echo "🎨 MYP Frontend - Standalone Server wird gestartet..."
# Farben für Terminal-Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Funktionen
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Arbeitsverzeichnis setzen
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
log_info "Arbeitsverzeichnis: $SCRIPT_DIR"
# Umgebungsvariablen laden
if [ -f ".env.frontend" ]; then
log_info "Lade Frontend-Umgebungsvariablen..."
export $(cat .env.frontend | grep -v '^#' | xargs)
fi
# Prüfe Docker-Installation
if ! command -v docker &> /dev/null; then
log_error "Docker ist nicht installiert!"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
log_error "Docker Compose ist nicht installiert!"
exit 1
fi
log_success "Docker-Installation verifiziert"
# Backend-Verfügbarkeit prüfen
BACKEND_URL=${BACKEND_API_URL:-http://localhost:5000}
log_info "Prüfe Backend-Verfügbarkeit: $BACKEND_URL"
if ! curl -f "$BACKEND_URL/health" >/dev/null 2>&1; then
log_warning "Backend-Server ist nicht verfügbar!"
log_warning "Stellen Sie sicher, dass der Backend-Server läuft:"
log_warning "cd ../backend && ./start-backend-server.sh"
read -p "Möchten Sie trotzdem fortfahren? [y/N]: " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Abgebrochen."
exit 1
fi
fi
# Alte Container stoppen und entfernen
log_info "Stoppe eventuell laufende Frontend-Container..."
docker-compose -f docker-compose.frontend.yml down --remove-orphans 2>/dev/null || true
# Images aufräumen (optional)
if [ "$1" = "--clean" ]; then
log_info "Räume alte Frontend-Images auf..."
docker-compose -f docker-compose.frontend.yml down --rmi all --volumes 2>/dev/null || true
docker system prune -f
fi
# Notwendige Verzeichnisse erstellen
log_info "Erstelle notwendige Verzeichnisse..."
mkdir -p .next public/uploads
# Node.js Dependencies prüfen
if [ ! -d "node_modules" ] || [ ! -f "package-lock.json" ]; then
log_info "Installiere Node.js Dependencies..."
if command -v pnpm &> /dev/null; then
pnpm install
elif command -v npm &> /dev/null; then
npm install
else
log_warning "Weder pnpm noch npm gefunden. Dependencies werden im Container installiert."
fi
fi
# Frontend-Container builden und starten
log_info "Frontend-Container werden gebaut und gestartet..."
docker-compose -f docker-compose.frontend.yml up --build -d
# Warten auf Frontend-Start
log_info "Warte auf Frontend-Service..."
timeout=120
counter=0
while [ $counter -lt $timeout ]; do
if curl -f http://localhost:3000/health >/dev/null 2>&1; then
log_success "Frontend-Server ist bereit!"
break
fi
# Fallback: Prüfe, ob der Container läuft
if [ $counter -gt 30 ] && curl -f http://localhost:3000 >/dev/null 2>&1; then
log_success "Frontend-Server ist bereit!"
break
fi
if [ $((counter % 10)) -eq 0 ]; then
log_info "Warte auf Frontend-Service... ($counter/$timeout Sekunden)"
fi
sleep 1
counter=$((counter + 1))
done
if [ $counter -eq $timeout ]; then
log_error "Frontend-Service konnte nicht gestartet werden!"
log_info "Zeige Frontend-Logs:"
docker-compose -f docker-compose.frontend.yml logs frontend
exit 1
fi
# Service-Status anzeigen
log_info "Frontend-Service Status:"
docker-compose -f docker-compose.frontend.yml ps
# URLs anzeigen
echo ""
log_success "🎉 Frontend-Server erfolgreich gestartet!"
echo ""
echo "🌐 Frontend-App: http://localhost:3000"
echo "🔧 Frontend-Health: http://localhost:3000/health"
echo "📦 CDN-Assets: http://localhost:8080"
echo "⚡ Frontend-Cache: localhost:6380"
echo ""
echo "🔗 Verbindet sich mit Backend: ${BACKEND_API_URL:-http://localhost:5000}"
echo ""
# Logs anzeigen (optional)
if [ "$1" = "--logs" ] || [ "$2" = "--logs" ]; then
log_info "Zeige Frontend-Logs (Strg+C zum Beenden):"
docker-compose -f docker-compose.frontend.yml logs -f
fi
log_info "Verwende 'docker-compose -f docker-compose.frontend.yml logs -f' um Logs zu verfolgen"
log_info "Verwende 'docker-compose -f docker-compose.frontend.yml down' um den Server zu stoppen"

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# MYP Installer Control Center für Linux/Unix-Systeme
# Konsolidiertes Installationsskript für die MYP-Plattform
# Version 2.0
# MYP Installer Control Center - Vollständige Linux/Unix-Installation
# Zentrale Installationskonsole für die MYP-Plattform
# Version 3.0 - Konsolidiert alle Setup-Funktionen
# Farbdefinitionen
RED='\033[0;31m'
@@ -24,6 +24,7 @@ show_header() {
clear
echo -e "${CYAN}=============================================================${NC}"
echo -e "${CYAN} MYP INSTALLER CONTROL CENTER ${NC}"
echo -e "${CYAN} Version 3.0 ${NC}"
echo -e "${CYAN}=============================================================${NC}"
echo -e "${CYAN} $title${NC}"
echo -e "${CYAN}=============================================================${NC}"
@@ -67,6 +68,8 @@ get_local_ip() {
}
test_dependencies() {
show_header "Systemvoraussetzungen prüfen"
echo -e "${BLUE}Prüfe Abhängigkeiten...${NC}"
local all_installed=1
@@ -74,8 +77,12 @@ test_dependencies() {
# 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
@@ -94,6 +101,8 @@ test_dependencies() {
# Docker
if check_command docker; then
echo -e "${GREEN}✓ Docker gefunden${NC}"
docker_version=$(docker --version 2>&1)
echo -e "${WHITE} Version: $docker_version${NC}"
else
echo -e "${RED}✗ Docker nicht gefunden${NC}"
all_installed=0
@@ -110,6 +119,8 @@ test_dependencies() {
# 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
@@ -131,7 +142,23 @@ test_dependencies() {
all_installed=0
fi
return $all_installed
# Git
if check_command git; then
echo -e "${GREEN}✓ Git gefunden${NC}"
else
echo -e "${RED}✗ Git 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. Bitte installieren Sie diese vor der Verwendung.${NC}"
fi
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
}
setup_hosts() {
@@ -217,6 +244,10 @@ create_ssl_certificates() {
backend_hostname="raspberrypi"
frontend_hostname="m040tbaraspi001.de040.corpintra.net"
;;
*)
backend_hostname="localhost"
frontend_hostname="localhost"
;;
esac
echo -e "${BLUE}Backend-Hostname: $backend_hostname${NC}"
@@ -232,35 +263,52 @@ create_ssl_certificates() {
# SSL-Zertifikate mit Python und cryptography erstellen
echo -e "${BLUE}Erstelle SSL-Zertifikate mit Python...${NC}"
if check_command python3 || check_command python; then
# Überprüfen, ob cryptography installiert ist
# Überprüfen, ob Python verfügbar ist
python_cmd=""
if check_command python3; then
python_cmd="python3"
if ! check_command python3; then
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
# Überprüfen, ob cryptography installiert ist
cryptography_installed=$($python_cmd -c "try: import cryptography; print('True'); except ImportError: print('False')" 2>/dev/null)
if [ "$cryptography_installed" != "True" ]; then
echo -e "${YELLOW}Installiere Python-Abhängigkeit 'cryptography'...${NC}"
if check_command pip3; then
exec_command "pip3 install cryptography" "Installiere cryptography-Paket"
else
elif check_command pip; then
exec_command "pip install cryptography" "Installiere cryptography-Paket"
else
echo -e "${RED}pip nicht gefunden. Kann cryptography nicht installieren.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
fi
# Python-Skript zur Zertifikatserstellung
cat > temp_cert_script.py << EOF
# 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
@@ -312,7 +360,8 @@ def create_self_signed_cert(cert_path, key_path, hostname="localhost"):
).add_extension(
x509.SubjectAlternativeName([
x509.DNSName(hostname),
x509.DNSName("localhost")
x509.DNSName("localhost"),
x509.IPAddress(ipaddress.IPv4Address("127.0.0.1"))
]),
critical=False,
).add_extension(
@@ -350,7 +399,7 @@ create_self_signed_cert('$backend_cert_file', '$backend_key_file', '$backend_hos
# Frontend-Zertifikat erstellen
create_self_signed_cert('$frontend_cert_file', '$frontend_key_file', '$frontend_hostname')
EOF
EOL
# Python-Skript ausführbar machen und ausführen
chmod +x temp_cert_script.py
@@ -362,10 +411,7 @@ EOF
fi
# Temporäres Skript löschen
rm temp_cert_script.py
else
echo -e "${RED}Python nicht gefunden. SSL-Zertifikate können nicht erstellt werden.${NC}"
fi
rm -f temp_cert_script.py
# Zertifikate im System installieren (optional)
if [ $is_root -eq 1 ]; then
@@ -375,19 +421,28 @@ EOF
if [ -f "$backend_cert_file" ]; then
echo -e "${BLUE}Installiere Backend-Zertifikat im System...${NC}"
# Für verschiedene Linux-Distributionen
if [ -d "/usr/local/share/ca-certificates" ]; then
# Debian/Ubuntu/Raspberry Pi OS
cp "$backend_cert_file" /usr/local/share/ca-certificates/myp.crt
if [ -d "/usr/local/share/ca-certificates" ]; then
cp "$backend_cert_file" /usr/local/share/ca-certificates/myp-backend.crt
update-ca-certificates
echo -e "${GREEN}Zertifikat installiert (Debian/Ubuntu)${NC}"
elif [ -d "/etc/pki/ca-trust/source/anchors" ]; then
# RHEL/CentOS/Fedora
cp "$backend_cert_file" /etc/pki/ca-trust/source/anchors/myp.crt
elif [ -d "/etc/pki/ca-trust/source/anchors" ]; then
cp "$backend_cert_file" /etc/pki/ca-trust/source/anchors/myp-backend.crt
update-ca-trust extract
fi
fi
if [ -f "$frontend_cert_file" ]; then
echo -e "${BLUE}Installiere Frontend-Zertifikat im System...${NC}"
# Debian/Ubuntu/Raspberry Pi OS
if [ -d "/usr/local/share/ca-certificates" ]; then
cp "$frontend_cert_file" /usr/local/share/ca-certificates/myp-frontend.crt
update-ca-certificates
# RHEL/CentOS/Fedora
elif [ -d "/etc/pki/ca-trust/source/anchors" ]; then
cp "$frontend_cert_file" /etc/pki/ca-trust/source/anchors/myp-frontend.crt
update-ca-trust extract
echo -e "${GREEN}Zertifikat installiert (RHEL/CentOS/Fedora)${NC}"
else
echo -e "${YELLOW}Unbekanntes System. Zertifikatinstallation übersprungen.${NC}"
fi
fi
fi
@@ -404,50 +459,53 @@ EOF
# Kopiere Zertifikate ins Frontend-Verzeichnis
frontend_ssl_dir="./frontend/ssl"
if [ ! -d "$frontend_ssl_dir" ]; then
mkdir -p "$frontend_ssl_dir"
if [ -f "$backend_cert_file" ]; then
cp "$backend_cert_file" "$frontend_ssl_dir/myp.crt"
fi
cp "$backend_cert_file" "$frontend_ssl_dir/myp.crt"
if [ -f "$backend_key_file" ]; then
cp "$backend_key_file" "$frontend_ssl_dir/myp.key"
fi
echo -e "${GREEN}Zertifikate ins Frontend-Verzeichnis kopiert.${NC}"
# Prüfen, ob .env.local existiert und aktualisieren
# .env.local aktualisieren
env_local_path="./frontend/.env.local"
if [ -f "$env_local_path" ]; then
# Datei existiert, mache Backup
cp "$env_local_path" "${env_local_path}.bak"
env_content=$(cat "$env_local_path")
else
# Datei erstellen
echo "# MYP Frontend Umgebungsvariablen" > "$env_local_path"
env_content="# MYP Frontend Umgebungsvariablen"
fi
# SSL-Konfigurationen hinzufügen/aktualisieren
declare -a ssl_configs=(
# SSL-Konfigurationen
ssl_configs=(
"NODE_TLS_REJECT_UNAUTHORIZED=0"
"HTTPS=true"
"SSL_CRT_FILE=./ssl/myp.crt"
"SSL_KEY_FILE=./ssl/myp.key"
"NEXT_PUBLIC_API_URL=https://${backend_hostname}"
"NEXT_PUBLIC_BACKEND_HOST=${backend_hostname}"
"NEXT_PUBLIC_API_URL=https://$backend_hostname"
"NEXT_PUBLIC_BACKEND_HOST=$backend_hostname"
"NEXT_PUBLIC_BACKEND_PROTOCOL=https"
)
# Existierende Konfigurationen aktualisieren
for config in "${ssl_configs[@]}"; do
key=$(echo "$config" | cut -d'=' -f1)
# Prüfen, ob die Konfiguration bereits existiert
if grep -q "^${key}=" "$env_local_path"; then
# Existierende Konfiguration aktualisieren
sed -i "s|^${key}=.*|${config}|" "$env_local_path"
if echo "$env_content" | grep -q "^$key="; then
# Update existierende Konfiguration
env_content=$(echo "$env_content" | sed "s/^$key=.*/$config/")
else
# Neue Konfiguration hinzufügen
echo "$config" >> "$env_local_path"
env_content="$env_content\n$config"
fi
done
# Speichern der aktualisierten Umgebungsvariablen
echo -e "$env_content" > "$env_local_path"
echo -e "${GREEN}.env.local Datei mit SSL-Konfigurationen aktualisiert.${NC}"
fi
@@ -464,28 +522,28 @@ setup_environment() {
show_header "Umgebungs-Setup"
# Prüfen, ob Python und pip installiert sind
python_cmd="python3"
pip_cmd="pip3"
python_cmd=""
pip_cmd=""
if ! check_command python3; then
if check_command python; then
if check_command python3; then
python_cmd="python3"
elif check_command python; then
python_cmd="python"
else
echo -e "${RED}Python ist nicht installiert.${NC}"
echo -e "${RED}Python ist nicht installiert. Bitte installieren Sie Python 3.6+ und versuchen Sie es erneut.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
fi
if ! check_command pip3; then
if check_command pip; then
if check_command pip3; then
pip_cmd="pip3"
elif check_command pip; then
pip_cmd="pip"
else
echo -e "${RED}pip ist nicht installiert.${NC}"
echo -e "${RED}pip ist nicht installiert. Bitte installieren Sie pip und versuchen Sie es erneut.${NC}"
read -p "Drücken Sie ENTER, um fortzufahren..."
return 1
fi
fi
# Python-Abhängigkeiten installieren
echo -e "${BLUE}Installiere Backend-Abhängigkeiten...${NC}"
@@ -516,6 +574,12 @@ setup_environment() {
fi
fi
# Datenbank initialisieren
echo -e "${BLUE}Initialisiere Datenbank...${NC}"
if [ -f "backend/app/models.py" ]; then
exec_command "cd backend && $python_cmd -c 'from app.models import init_db, create_initial_admin; init_db(); create_initial_admin()'" "Initialisiere Datenbank und Admin-Benutzer"
fi
echo ""
echo -e "${GREEN}Umgebungs-Setup abgeschlossen!${NC}"
@@ -529,54 +593,60 @@ start_application() {
echo -e "${BLUE}Wie möchten Sie die Anwendung starten?${NC}"
echo -e "${WHITE}1. Backend-Server starten (Python)${NC}"
echo -e "${WHITE}2. Frontend-Server starten (Node.js)${NC}"
echo -e "${WHITE}3. Beide Server starten${NC}"
echo -e "${WHITE}3. Beide Server starten (in separaten Terminals)${NC}"
echo -e "${WHITE}4. Mit Docker Compose starten${NC}"
echo -e "${WHITE}5. Zurück zum Hauptmenü${NC}"
echo -e "${WHITE}5. Vollständige Installation und Start${NC}"
echo -e "${WHITE}6. Zurück zum Hauptmenü${NC}"
read -p "Wählen Sie eine Option (1-5): " choice
read -p "Wählen Sie eine Option (1-6): " choice
case $choice in
1)
echo -e "${BLUE}Starte Backend-Server...${NC}"
python_cmd=""
if check_command python3; then
python_cmd="python3"
if ! check_command python3; then
elif check_command python; then
python_cmd="python"
fi
if [ -n "$python_cmd" ]; then
$python_cmd backend/app/app.py &
echo -e "${GREEN}Backend-Server läuft jetzt im Hintergrund.${NC}"
echo -e "${YELLOW}PID: $!${NC}"
else
echo -e "${RED}Python nicht gefunden.${NC}"
fi
;;
2)
echo -e "${BLUE}Starte Frontend-Server...${NC}"
if check_command npm; then
(cd frontend && npm run dev) &
echo -e "${GREEN}Frontend-Server läuft jetzt im Hintergrund.${NC}"
echo -e "${YELLOW}PID: $!${NC}"
else
echo -e "${RED}npm ist nicht installiert.${NC}"
echo -e "${RED}npm nicht gefunden.${NC}"
fi
;;
3)
echo -e "${BLUE}Starte Backend-Server...${NC}"
python_cmd=""
if check_command python3; then
python_cmd="python3"
if ! check_command python3; then
elif check_command python; then
python_cmd="python"
fi
if [ -n "$python_cmd" ]; then
$python_cmd backend/app/app.py &
backend_pid=$!
echo -e "${GREEN}Backend-Server gestartet.${NC}"
fi
echo -e "${BLUE}Starte Frontend-Server...${NC}"
if check_command npm; then
(cd frontend && npm run dev) &
frontend_pid=$!
echo -e "${GREEN}Frontend-Server gestartet.${NC}"
fi
echo -e "${GREEN}Beide Server laufen jetzt im Hintergrund.${NC}"
echo -e "${YELLOW}Backend PID: $backend_pid${NC}"
echo -e "${YELLOW}Frontend PID: $frontend_pid${NC}"
else
echo -e "${RED}npm ist nicht installiert. Nur Backend wurde gestartet.${NC}"
echo -e "${YELLOW}Backend PID: $backend_pid${NC}"
fi
;;
4)
if check_command docker && check_command docker-compose; then
@@ -588,6 +658,29 @@ start_application() {
fi
;;
5)
echo -e "${BLUE}Führe vollständige Installation durch...${NC}"
setup_environment
create_ssl_certificates
echo -e "${BLUE}Starte Anwendung...${NC}"
python_cmd=""
if check_command python3; then
python_cmd="python3"
elif check_command python; then
python_cmd="python"
fi
if [ -n "$python_cmd" ]; then
$python_cmd backend/app/app.py &
fi
if check_command npm; then
(cd frontend && npm run dev) &
fi
echo -e "${GREEN}Vollständige Installation und Start abgeschlossen!${NC}"
;;
6)
return
;;
*)
@@ -599,45 +692,64 @@ start_application() {
read -p "Drücken Sie ENTER, um fortzufahren..."
}
clean_old_scripts() {
show_header "Alte Skripte bereinigen"
show_project_info() {
show_header "Projekt-Informationen"
old_scripts=(
"setup_ssl.sh"
echo -e "${CYAN}MYP (Mercedes-Benz Yard Printing) Platform${NC}"
echo -e "${BLUE}Version 3.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}- 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: https://localhost:443 oder https://raspberrypi:443${NC}"
echo -e "${WHITE}- Frontend: https://localhost:3000${NC}"
echo ""
echo -e "${YELLOW}Weitere Informationen finden Sie in der CREDENTIALS.md Datei.${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"
"setup_ssl.ps1"
"setup_hosts.ps1"
"setup_hosts_copy.ps1"
"generate_ssl_certs.ps1"
"generate_ssl_certs_copy.ps1"
"temp_cert_script.py"
"frontend/cleanup.sh"
"frontend/install.sh"
"frontend/https-setup.sh"
"frontend/start-debug-server.sh"
"frontend/start-frontend-server.sh"
)
echo -e "${BLUE}Folgende Skripte werden gelöscht:${NC}"
for script in "${old_scripts[@]}"; do
if [ -f "$script" ]; then
echo -e "${WHITE} - $script${NC}"
for file in "${files_to_delete[@]}"; do
if [ -f "$file" ]; then
rm -f "$file"
echo -e "${GREEN}✓ Gelöscht: $file${NC}"
fi
done
echo ""
read -p "Möchten Sie fortfahren? (j/n, Standard: j): " confirm
if [ "$confirm" != "n" ]; then
for script in "${old_scripts[@]}"; do
if [ -f "$script" ]; then
if rm "$script"; then
echo -e "${GREEN}$script wurde gelöscht.${NC}"
echo -e "${GREEN}Bereinigung abgeschlossen!${NC}"
else
echo -e "${RED}✗ Fehler beim Löschen von $script.${NC}"
fi
fi
done
echo ""
echo -e "${GREEN}Bereinigung abgeschlossen.${NC}"
else
echo -e "${YELLOW}Bereinigung abgebrochen.${NC}"
echo -e "${BLUE}Bereinigung übersprungen.${NC}"
fi
echo ""
@@ -653,17 +765,16 @@ show_main_menu() {
echo -e "${WHITE}3. SSL-Zertifikate erstellen${NC}"
echo -e "${WHITE}4. Umgebung einrichten (Abhängigkeiten installieren)${NC}"
echo -e "${WHITE}5. Anwendung starten${NC}"
echo -e "${WHITE}6. Alte Skripte bereinigen${NC}"
echo -e "${WHITE}Q. Beenden${NC}"
echo -e "${WHITE}6. Projekt-Informationen anzeigen${NC}"
echo -e "${WHITE}7. Alte Dateien bereinigen${NC}"
echo -e "${WHITE}8. Beenden${NC}"
echo ""
read -p "Wählen Sie eine Option (1-6, Q): " choice
read -p "Wählen Sie eine Option (1-8): " choice
case $choice in
1)
test_dependencies
echo ""
read -p "Drücken Sie ENTER, um fortzufahren..."
show_main_menu
;;
2)
@@ -683,10 +794,15 @@ show_main_menu() {
show_main_menu
;;
6)
clean_old_scripts
show_project_info
show_main_menu
;;
[Qq])
7)
clean_old_files
show_main_menu
;;
8)
echo -e "${GREEN}Auf Wiedersehen!${NC}"
exit 0
;;
*)