diff --git a/app.py b/app.py index a26fd14..23a960f 100644 --- a/app.py +++ b/app.py @@ -49,6 +49,8 @@ from collections import defaultdict, deque from functools import wraps from flask_talisman import Talisman from flask_session import Session +from sqlalchemy.exc import OperationalError + # OCR import pytesseract @@ -229,6 +231,26 @@ class Receipt(db.Model): shopping_list = db.relationship("ShoppingList", back_populates="receipts") +@app.errorhandler(OperationalError) +def handle_db_error(e): + app.logger.error(f"[Błąd DB] {e}") + + if request.accept_mimetypes.best == "application/json": + return jsonify({ + "error": "Baza danych jest obecnie niedostępna. Spróbuj ponownie później." + }), 503 + + return ( + render_template( + "errors.html", + code=503, + title="Błąd połączenia z bazą danych", + message="Nie udało się połączyć z bazą danych. Spróbuj ponownie później.", + ), + 503, + ) + + def hash_password(password): pepper = app.config["BCRYPT_PEPPER"] peppered = (password + pepper).encode("utf-8") diff --git a/entrypoint.sh b/entrypoint.sh index 505dc84..17a7fdb 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,3 +1,12 @@ #!/bin/sh + +# Czekaj aż baza będzie gotowa +echo "Czekam na MySQL..." +until nc -z -v -w30 "$DB_HOST" "$DB_PORT" +do + echo "Baza jeszcze nie odpowiada, czekam..." + sleep 2 +done + flask db upgrade 2>/dev/null || flask db_info exec python app.py