new file: app.py new file: config.example.json new file: config.json new file: docker_diagnose.py new file: requirements.txt new file: start.bat new file: templates/available_projects.html new file: templates/base.html new file: templates/config.html new file: templates/docker_status.html new file: templates/index.html new file: templates/project_details.html new file: templates/project_details_fixed.html new file: templates/project_details_new.html new file: templates/project_details_old.html .gitignore
238 lines
7.5 KiB
Python
238 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Docker Diagnose Tool für App Installer
|
|
Hilft bei der Diagnose von Docker-Problemen
|
|
"""
|
|
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
import json
|
|
from datetime import datetime
|
|
|
|
def run_command(cmd, timeout=10):
|
|
"""Führe Kommando aus und gib Ergebnis zurück"""
|
|
try:
|
|
result = subprocess.run(
|
|
cmd,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=timeout,
|
|
shell=True
|
|
)
|
|
return {
|
|
'success': result.returncode == 0,
|
|
'stdout': result.stdout.strip(),
|
|
'stderr': result.stderr.strip(),
|
|
'returncode': result.returncode
|
|
}
|
|
except subprocess.TimeoutExpired:
|
|
return {
|
|
'success': False,
|
|
'stdout': '',
|
|
'stderr': f'Timeout nach {timeout} Sekunden',
|
|
'returncode': -1
|
|
}
|
|
except Exception as e:
|
|
return {
|
|
'success': False,
|
|
'stdout': '',
|
|
'stderr': str(e),
|
|
'returncode': -1
|
|
}
|
|
|
|
def check_docker_installation():
|
|
"""Prüfe Docker Installation"""
|
|
print("🔍 Prüfe Docker Installation...")
|
|
|
|
result = run_command("docker --version")
|
|
if result['success']:
|
|
print(f"✅ Docker installiert: {result['stdout']}")
|
|
return True
|
|
else:
|
|
print(f"❌ Docker nicht gefunden: {result['stderr']}")
|
|
print(" 💡 Installiere Docker Desktop von https://docker.com")
|
|
return False
|
|
|
|
def check_docker_daemon():
|
|
"""Prüfe Docker Daemon Status"""
|
|
print("\n🔍 Prüfe Docker Daemon...")
|
|
|
|
result = run_command("docker info")
|
|
if result['success']:
|
|
print("✅ Docker Daemon läuft")
|
|
return True
|
|
else:
|
|
print(f"❌ Docker Daemon nicht erreichbar: {result['stderr']}")
|
|
print(" 💡 Starte Docker Desktop")
|
|
return False
|
|
|
|
def check_docker_permissions():
|
|
"""Prüfe Docker Berechtigungen"""
|
|
print("\n🔍 Prüfe Docker Berechtigungen...")
|
|
|
|
result = run_command("docker ps")
|
|
if result['success']:
|
|
print("✅ Docker Berechtigungen OK")
|
|
return True
|
|
else:
|
|
print(f"❌ Docker Berechtigungsfehler: {result['stderr']}")
|
|
if "permission denied" in result['stderr'].lower():
|
|
print(" 💡 Starte als Administrator oder füge User zur docker Gruppe hinzu")
|
|
return False
|
|
|
|
def check_docker_images():
|
|
"""Prüfe vorhandene Docker Images"""
|
|
print("\n🔍 Prüfe Docker Images...")
|
|
|
|
result = run_command("docker images --format json")
|
|
if result['success']:
|
|
lines = result['stdout'].split('\n') if result['stdout'] else []
|
|
images = []
|
|
for line in lines:
|
|
if line.strip():
|
|
try:
|
|
img = json.loads(line)
|
|
images.append(img)
|
|
except:
|
|
pass
|
|
|
|
print(f"✅ {len(images)} Docker Images gefunden")
|
|
for img in images[:5]: # Zeige ersten 5
|
|
print(f" - {img.get('Repository', 'unknown')}:{img.get('Tag', 'unknown')}")
|
|
if len(images) > 5:
|
|
print(f" ... und {len(images) - 5} weitere")
|
|
return True
|
|
else:
|
|
print(f"❌ Kann Images nicht abrufen: {result['stderr']}")
|
|
return False
|
|
|
|
def check_docker_containers():
|
|
"""Prüfe laufende Container"""
|
|
print("\n🔍 Prüfe Docker Container...")
|
|
|
|
result = run_command("docker ps -a --format json")
|
|
if result['success']:
|
|
lines = result['stdout'].split('\n') if result['stdout'] else []
|
|
containers = []
|
|
for line in lines:
|
|
if line.strip():
|
|
try:
|
|
container = json.loads(line)
|
|
containers.append(container)
|
|
except:
|
|
pass
|
|
|
|
running = [c for c in containers if c.get('State') == 'running']
|
|
|
|
print(f"✅ {len(containers)} Container total, {len(running)} laufend")
|
|
for container in containers[:3]: # Zeige ersten 3
|
|
name = container.get('Names', 'unknown')
|
|
state = container.get('State', 'unknown')
|
|
print(f" - {name}: {state}")
|
|
return True
|
|
else:
|
|
print(f"❌ Kann Container nicht abrufen: {result['stderr']}")
|
|
return False
|
|
|
|
def check_docker_compose():
|
|
"""Prüfe Docker Compose"""
|
|
print("\n🔍 Prüfe Docker Compose...")
|
|
|
|
result = run_command("docker-compose --version")
|
|
if result['success']:
|
|
print(f"✅ Docker Compose verfügbar: {result['stdout']}")
|
|
return True
|
|
else:
|
|
# Versuche neue docker compose Syntax
|
|
result = run_command("docker compose version")
|
|
if result['success']:
|
|
print(f"✅ Docker Compose (v2) verfügbar: {result['stdout']}")
|
|
return True
|
|
else:
|
|
print("❌ Docker Compose nicht verfügbar")
|
|
print(" 💡 Docker Compose ist in Docker Desktop enthalten")
|
|
return False
|
|
|
|
def check_network_connectivity():
|
|
"""Prüfe Netzwerk-Konnektivität"""
|
|
print("\n🔍 Prüfe Netzwerk-Konnektivität...")
|
|
|
|
# Prüfe Docker Hub Verbindung
|
|
result = run_command("docker run --rm hello-world", timeout=30)
|
|
if result['success']:
|
|
print("✅ Docker Hub Verbindung OK")
|
|
return True
|
|
else:
|
|
print(f"❌ Docker Hub nicht erreichbar: {result['stderr']}")
|
|
print(" 💡 Prüfe Internetverbindung und Firewall")
|
|
return False
|
|
|
|
def check_system_resources():
|
|
"""Prüfe System-Ressourcen"""
|
|
print("\n🔍 Prüfe System-Ressourcen...")
|
|
|
|
result = run_command("docker system df")
|
|
if result['success']:
|
|
print("✅ Docker System-Info:")
|
|
for line in result['stdout'].split('\n'):
|
|
if line.strip():
|
|
print(f" {line}")
|
|
return True
|
|
else:
|
|
print(f"❌ Kann System-Info nicht abrufen: {result['stderr']}")
|
|
return False
|
|
|
|
def suggest_solutions():
|
|
"""Schlage Lösungen vor"""
|
|
print("\n🛠️ Lösungsvorschläge:")
|
|
print("1. Starte Docker Desktop neu")
|
|
print("2. Prüfe Windows-Dienste: Docker Desktop Service")
|
|
print("3. Prüfe Hyper-V/WSL2 Einstellungen")
|
|
print("4. Neustart des Computers")
|
|
print("5. Docker Desktop Neuinstallation")
|
|
print("\n📚 Weitere Hilfe:")
|
|
print("- Docker Docs: https://docs.docker.com/")
|
|
print("- Docker Desktop Troubleshooting: https://docs.docker.com/desktop/troubleshoot/")
|
|
|
|
def main():
|
|
"""Hauptfunktion"""
|
|
print("🐳 Docker Diagnose Tool")
|
|
print("=" * 50)
|
|
print(f"Zeitpunkt: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
print(f"System: {os.name}")
|
|
|
|
checks = [
|
|
check_docker_installation,
|
|
check_docker_daemon,
|
|
check_docker_permissions,
|
|
check_docker_images,
|
|
check_docker_containers,
|
|
check_docker_compose,
|
|
check_network_connectivity,
|
|
check_system_resources
|
|
]
|
|
|
|
results = []
|
|
for check in checks:
|
|
try:
|
|
result = check()
|
|
results.append(result)
|
|
except Exception as e:
|
|
print(f"❌ Fehler bei {check.__name__}: {e}")
|
|
results.append(False)
|
|
|
|
print("\n" + "=" * 50)
|
|
success_count = sum(1 for r in results if r)
|
|
print(f"📊 Ergebnis: {success_count}/{len(results)} Checks erfolgreich")
|
|
|
|
if success_count < len(results):
|
|
suggest_solutions()
|
|
else:
|
|
print("🎉 Alle Docker-Checks erfolgreich! Docker ist bereit.")
|
|
|
|
print("\n" + "=" * 50)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|