feat: Config-Reload-Endpoint implementieren - .env Änderungen ohne Neustart
- Neuer Endpoint: POST /api/admin/config/reload - Nur für Admins zugänglich - Lädt .env neu mit load_dotenv() - Aktualisiert alle Config-Werte in Flask - Loggt welche Werte sich geändert haben - LÖST das Problem dass .env Änderungen sonst Neustart brauchten Verwendung: curl -X POST http://localhost:5000/api/admin/config/reload -H "Authorization: Bearer $JWT_TOKEN" Statt: docker-compose down && docker-compose up -d
This commit is contained in:
parent
288d2f3db5
commit
cb6c56992c
62
admin_api.py
62
admin_api.py
|
|
@ -605,3 +605,65 @@ def debug_management():
|
|||
|
||||
else:
|
||||
return jsonify({'error': f'Unbekannte Action: {action}'}), 400
|
||||
|
||||
|
||||
@admin_bp.route('/config/reload', methods=['POST'])
|
||||
@jwt_required()
|
||||
@admin_required()
|
||||
def reload_config():
|
||||
"""
|
||||
Lädt .env neu und aktualisiert alle Config-Werte.
|
||||
WICHTIG: Nach .env Änderungen IMMER diesen Endpoint aufrufen!
|
||||
|
||||
Statt: docker-compose down + docker-compose up -d
|
||||
Einfach: curl -X POST http://localhost:5000/api/admin/config/reload -H "Authorization: Bearer $JWT_TOKEN"
|
||||
"""
|
||||
try:
|
||||
from dotenv import load_dotenv
|
||||
import os
|
||||
|
||||
admin_id = get_jwt_identity()
|
||||
|
||||
current_app.logger.info(f"[CONFIG] Admin {admin_id} fordert Config-Reload an")
|
||||
|
||||
# .env neu laden
|
||||
load_dotenv()
|
||||
|
||||
# Aktualisiere alle wichtigen Config-Werte (ohne dass wir die Config-Klasse neu laden müssen)
|
||||
# Diese Werte werden direkt in den Endpoints verwendet
|
||||
old_smtp_user = current_app.config.get('SMTP_USER')
|
||||
old_smtp_from = current_app.config.get('SMTP_FROM')
|
||||
old_base_domain = current_app.config.get('BASE_DOMAIN')
|
||||
|
||||
# Lese neue Werte
|
||||
new_smtp_user = os.getenv('SMTP_USER')
|
||||
new_smtp_from = os.getenv('SMTP_FROM')
|
||||
new_base_domain = os.getenv('BASE_DOMAIN')
|
||||
|
||||
# Aktualisiere Flask-Config
|
||||
current_app.config['SMTP_USER'] = new_smtp_user
|
||||
current_app.config['SMTP_FROM'] = new_smtp_from
|
||||
current_app.config['BASE_DOMAIN'] = new_base_domain
|
||||
current_app.config['SMTP_HOST'] = os.getenv('SMTP_HOST')
|
||||
current_app.config['SMTP_PORT'] = os.getenv('SMTP_PORT')
|
||||
current_app.config['SMTP_PASSWORD'] = os.getenv('SMTP_PASSWORD')
|
||||
|
||||
changes = []
|
||||
if old_smtp_user != new_smtp_user:
|
||||
changes.append(f"SMTP_USER: {old_smtp_user} → {new_smtp_user}")
|
||||
if old_smtp_from != new_smtp_from:
|
||||
changes.append(f"SMTP_FROM: {old_smtp_from} → {new_smtp_from}")
|
||||
if old_base_domain != new_base_domain:
|
||||
changes.append(f"BASE_DOMAIN: {old_base_domain} → {new_base_domain}")
|
||||
|
||||
current_app.logger.info(f"[CONFIG] Reload erfolgreich. Änderungen: {', '.join(changes) if changes else 'keine'}")
|
||||
|
||||
return jsonify({
|
||||
'message': 'Config erfolgreich reloaded',
|
||||
'timestamp': datetime.utcnow().isoformat(),
|
||||
'changes': changes if changes else ['keine Änderungen erkannt']
|
||||
}), 200
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"[CONFIG] Reload fehlgeschlagen: {str(e)}")
|
||||
return jsonify({'error': f'Config-Reload fehlgeschlagen: {str(e)}'}), 500
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user