fix: Guarantee admin user creation with fallback credentials admin / adminpassword during production docker startup

This commit is contained in:
Richard
2026-07-31 11:26:26 +02:00
parent ac71b38823
commit 6129462534
2 changed files with 52 additions and 22 deletions
@@ -5,38 +5,68 @@ from django.contrib.auth import get_user_model
User = get_user_model() User = get_user_model()
class Command(BaseCommand): class Command(BaseCommand):
help = "Erstellt einen initialen Admin-Benutzer (Superuser) für das Portal." help = "Erstellt einen initialen Admin-Benutzer (Superuser) sowie Basis-Qualifikationen für das Portal."
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('--username', type=str, default=os.getenv('ADMIN_USERNAME', 'admin'), help='Benutzername für den Admin') parser.add_argument('--username', type=str, default=os.getenv('ADMIN_USERNAME', 'admin'), help='Benutzername für den Admin')
parser.add_argument('--email', type=str, default=os.getenv('ADMIN_EMAIL', 'admin@beispiel.de'), help='E-Mail-Adresse für den Admin') parser.add_argument('--email', type=str, default=os.getenv('ADMIN_EMAIL', 'admin@local.host'), help='E-Mail-Adresse für den Admin')
parser.add_argument('--password', type=str, default=os.getenv('ADMIN_PASSWORD', ''), help='Passwort für den Admin') parser.add_argument('--password', type=str, default=os.getenv('ADMIN_PASSWORD', 'adminpassword'), help='Passwort für den Admin')
def handle(self, *args, **options): def handle(self, *args, **options):
username = options['username'] username = options['username'] or os.getenv('ADMIN_USERNAME', 'admin')
email = options['email'] email = options['email'] or os.getenv('ADMIN_EMAIL', 'admin@local.host')
password = options['password'] password = options['password'] or os.getenv('ADMIN_PASSWORD', 'adminpassword')
if not password:
self.stderr.write(self.style.ERROR("Fehler: Bitte gib ein Passwort mit --password an oder setze ADMIN_PASSWORD als Umgebungsvariable."))
return
# 1. Admin User
user, created = User.objects.get_or_create( user, created = User.objects.get_or_create(
username=username, username=username,
defaults={'email': email} defaults={'email': email}
) )
user.email = email
user.set_password(password)
user.is_superuser = True
user.is_staff = True
user.is_admin_user = True
user.is_approved = True
user.is_email_verified = True
user.is_active = True
user.save()
if created: if created:
self.stdout.write(self.style.SUCCESS(f"✅ Initialer Admin '{username}' ({email}) wurde erfolgreich erstellt!")) user.set_password(password)
user.is_superuser = True
user.is_staff = True
user.is_admin_user = True
user.is_approved = True
user.is_email_verified = True
user.is_active = True
user.save()
self.stdout.write(self.style.SUCCESS(f"✅ Initialer Admin '{username}' ({email}) wurde erstellt! Passwort: {password}"))
else: else:
self.stdout.write(self.style.SUCCESS(f"✅ Passwort & Admin-Rechte für bestehenden Benutzer '{username}' ({email}) wurden aktualisiert!")) changed = False
if not user.is_superuser or not user.is_admin_user or not user.is_approved or not user.is_active:
user.is_superuser = True
user.is_staff = True
user.is_admin_user = True
user.is_approved = True
user.is_active = True
changed = True
if os.getenv('ADMIN_PASSWORD'):
user.set_password(password)
changed = True
if changed:
user.save()
self.stdout.write(self.style.SUCCESS(f"✅ Admin-Rechte für bestehenden Benutzer '{username}' wurden aktualisiert."))
else:
self.stdout.write(self.style.SUCCESS(f"️ Admin-Benutzer '{username}' existiert bereits."))
# 2. Initial Base Skills
try:
from apps.events.models import Skill
Skill.objects.get_or_create(
name="Ersthelfer",
defaults={'description': 'Gültiger Erste-Hilfe-Schein', 'color': '#ef4444'}
)
Skill.objects.get_or_create(
name="Bar-Erfahrung",
defaults={'description': 'Erfahrung an der Zapfanlage', 'color': '#3b82f6'}
)
Skill.objects.get_or_create(
name="Führerschein B",
defaults={'description': 'PKW / Transporter fahren', 'color': '#10b981'}
)
except Exception as e:
self.stderr.write(self.style.WARNING(f"Hinweis zu Skills: {e}"))