diff --git a/app/__init__.py b/app/__init__.py index 516027b..4106c68 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -60,6 +60,20 @@ def create_app(setup_database=True): register_cli(app) + # Ensure models are registered even when DB setup runs in init_db.py. + with app.app_context(): + from app.models import ( # noqa: F401 + AdBanner, + Folder, + FolderInvite, + FolderMember, + PasswordResetToken, + Photo, + SiteSettings, + User, + UserGroup, + ) + @app.context_processor def inject_banners(): from app.banner_service import get_banners_by_position @@ -71,18 +85,6 @@ def create_app(setup_database=True): if setup_database: with app.app_context(): - from app.models import ( # noqa: F401 - AdBanner, - Folder, - FolderInvite, - FolderMember, - PasswordResetToken, - Photo, - SiteSettings, - User, - UserGroup, - ) - db.create_all() if os.getenv("SKIP_DB_INIT") != "1": diff --git a/app/routes.py b/app/routes.py index 0df843c..66cb71c 100644 --- a/app/routes.py +++ b/app/routes.py @@ -2,6 +2,7 @@ import os from flask import ( Blueprint, + Response, abort, current_app, flash, @@ -21,6 +22,7 @@ from app.models import Folder, Photo from app.settings_service import get_settings from app.storage_service import delete_photo_file, get_photo_stream from app.upload_service import process_uploads +from sqlalchemy import text bp = Blueprint("main", __name__) @@ -28,10 +30,12 @@ bp = Blueprint("main", __name__) @bp.route("/health") def health(): try: - db.session.execute(db.text("SELECT 1")) - return {"status": "ok"}, 200 + db.session.execute(text("SELECT 1")) + db.session.remove() + return Response("ok\n", mimetype="text/plain") except Exception as exc: - return {"status": "error", "detail": str(exc)}, 503 + db.session.remove() + return Response(f"error: {exc}\n", status=503, mimetype="text/plain") @bp.route("/") diff --git a/gunicorn.conf.py b/gunicorn.conf.py index 331eada..60e9fc2 100644 --- a/gunicorn.conf.py +++ b/gunicorn.conf.py @@ -3,10 +3,4 @@ workers = 2 timeout = 120 accesslog = "-" errorlog = "-" -capture_output = True - - -def post_fork(server, worker): - from app import db - - db.engine.dispose() +loglevel = "info" diff --git a/init_db.py b/init_db.py index db888b7..3612c11 100644 --- a/init_db.py +++ b/init_db.py @@ -1,3 +1,10 @@ -from app import create_app +import sys -create_app(setup_database=True) +try: + from app import create_app + + create_app(setup_database=True) + print("Database init OK", flush=True) +except Exception as exc: + print(f"Database init FAILED: {exc}", file=sys.stderr, flush=True) + raise