Files
Projektarbeit-MYP/backend/setup_development.py

230 lines
7.2 KiB
Python

#!/usr/bin/env python3
"""
Development-Setup für MYP Druckerverwaltungssystem
Startet das System im Development-Modus ohne /opt/myp-Deployment
Verwendung:
python setup_development.py
python setup_development.py --port 5000
python setup_development.py --debug
"""
import os
import sys
import subprocess
import argparse
from pathlib import Path
def print_development_banner():
"""Zeigt den Development-Banner"""
banner = f"""
{'='*70}
🔧 MYP DEVELOPMENT SETUP
{'='*70}
🚀 Environment: Development (Local)
🔒 Security: Relaxed (für Development)
🌐 Network: HTTP (localhost)
⚡ Performance: Debug-optimiert
📊 Monitoring: Development-Logging
🎯 Modus: Development + Debug
📁 Arbeitsverzeichnis: {os.getcwd()}
{'='*70}
"""
print(banner)
def check_development_requirements():
"""Prüft Development-Voraussetzungen"""
print("🔍 Prüfe Development-Voraussetzungen...")
requirements = []
# Python-Version prüfen
if sys.version_info < (3, 8):
requirements.append("❌ Python 3.8+ erforderlich")
return False
else:
requirements.append("✅ Python-Version OK")
# Erforderliche Dateien prüfen
required_files = [
'app.py',
'models.py',
'utils/settings.py',
'requirements.txt'
]
missing_files = []
for file in required_files:
if os.path.exists(file):
requirements.append(f"{file}")
else:
requirements.append(f"{file} fehlt")
missing_files.append(file)
# Node.js und npm prüfen
try:
subprocess.run(['node', '--version'], capture_output=True, check=True)
requirements.append("✅ Node.js verfügbar")
except (subprocess.CalledProcessError, FileNotFoundError):
requirements.append("❌ Node.js nicht gefunden")
missing_files.append("Node.js")
try:
subprocess.run(['npm', '--version'], capture_output=True, check=True)
requirements.append("✅ npm verfügbar")
except (subprocess.CalledProcessError, FileNotFoundError):
requirements.append("❌ npm nicht gefunden")
missing_files.append("npm")
# CSS-Build prüfen
if os.path.exists('static/css/tailwind.min.css'):
requirements.append("✅ CSS bereits gebaut")
else:
requirements.append("⚠️ CSS muss gebaut werden")
# Python-Dependencies prüfen
try:
import flask
requirements.append("✅ Flask verfügbar")
except ImportError:
requirements.append("❌ Flask nicht installiert")
missing_files.append("Flask")
# Datenbank-Verzeichnis prüfen
if os.path.exists('instance'):
requirements.append("✅ Datenbank-Verzeichnis")
else:
requirements.append("⚠️ Instance-Verzeichnis wird erstellt")
os.makedirs('instance', exist_ok=True)
requirements.append("✅ Instance-Verzeichnis erstellt")
for req in requirements:
print(f" {req}")
if missing_files:
print(f"\n❌ FEHLENDE ABHÄNGIGKEITEN: {', '.join(missing_files)}")
return False
print("✅ Alle Voraussetzungen erfüllt\n")
return True
def install_python_dependencies():
"""Installiert Python-Dependencies"""
print("📦 Installiere Python-Dependencies...")
try:
subprocess.run([
sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'
], check=True)
print("✅ Python-Dependencies installiert\n")
return True
except subprocess.CalledProcessError as e:
print(f"❌ Fehler bei Python-Installation: {e}")
return False
def build_css():
"""Baut das CSS mit Tailwind"""
print("🎨 Baue CSS mit Tailwind...")
try:
# Prüfe ob node_modules existiert
if not os.path.exists('node_modules'):
print(" Installiere npm-Dependencies...")
subprocess.run(['npm', 'install'], check=True)
# Baue CSS
subprocess.run(['npm', 'run', 'build'], check=True)
print("✅ CSS erfolgreich gebaut\n")
return True
except subprocess.CalledProcessError as e:
print(f"❌ Fehler beim CSS-Build: {e}")
return False
def set_development_environment():
"""Setzt Development-Umgebungsvariablen"""
print("🔧 Konfiguriere Development-Environment...")
# Development-Environment setzen
os.environ['FLASK_ENV'] = 'development'
os.environ['FLASK_DEBUG'] = '1'
os.environ['USE_PRODUCTION_CONFIG'] = 'false'
os.environ['DEVELOPMENT_MODE'] = 'true'
# Logging
os.environ['LOG_LEVEL'] = 'DEBUG'
# Performance (relaxed für Development)
os.environ['USE_MINIFIED_ASSETS'] = 'false'
os.environ['DISABLE_ANIMATIONS'] = 'false'
os.environ['LIMIT_GLASSMORPHISM'] = 'false'
# Sicherheit (relaxed für Development)
os.environ['FLASK_SSL_REQUIRED'] = 'false'
os.environ['SESSION_SECURE'] = 'false'
print(" ✅ Development-Environment konfiguriert")
print(" ✅ Debug-Modus aktiviert")
print(" ✅ Sicherheit für Development angepasst")
print()
def start_development_server(port=5000, debug=True):
"""Startet den Development-Server"""
print(f"🚀 Starte Development-Server auf Port {port}...")
print(f"🌐 URL: http://localhost:{port}")
print("🛑 Stoppen mit Strg+C\n")
try:
# Setze Port
os.environ['FLASK_PORT'] = str(port)
os.environ['FLASK_HOST'] = '127.0.0.1' # Nur localhost für Development
# Importiere und starte die App
from app import main
main()
except KeyboardInterrupt:
print("\n🛑 Development-Server gestoppt")
except Exception as e:
print(f"\n❌ FEHLER: {str(e)}")
sys.exit(1)
def main():
"""Haupt-Development-Setup-Funktion"""
parser = argparse.ArgumentParser(description='MYP Development Setup')
parser.add_argument('--port', type=int, default=5000, help='Server-Port (Standard: 5000)')
parser.add_argument('--debug', action='store_true', default=True, help='Debug-Modus aktivieren')
parser.add_argument('--skip-deps', action='store_true', help='Überspringe Dependency-Installation')
parser.add_argument('--skip-css', action='store_true', help='Überspringe CSS-Build')
args = parser.parse_args()
# Banner anzeigen
print_development_banner()
# Voraussetzungen prüfen
if not check_development_requirements():
print("🛑 Setup abgebrochen - behebe die Fehler und versuche es erneut")
sys.exit(1)
# Dependencies installieren (falls nicht übersprungen)
if not args.skip_deps:
if not install_python_dependencies():
print("🛑 Setup abgebrochen - Python-Dependencies konnten nicht installiert werden")
sys.exit(1)
# CSS bauen (falls nicht übersprungen)
if not args.skip_css:
if not build_css():
print("🛑 Setup abgebrochen - CSS konnte nicht gebaut werden")
sys.exit(1)
# Development-Environment setzen
set_development_environment()
# Development-Server starten
start_development_server(port=args.port, debug=args.debug)
if __name__ == "__main__":
main()