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

This commit is contained in:
Till Tomczak 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
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
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
;;
*)