From 6eec88d8f5257d27724a7455682e3ef8bef634d3 Mon Sep 17 00:00:00 2001 From: Bjoern Runden Date: Thu, 18 Jun 2026 00:03:47 +0200 Subject: [PATCH] docker + datenhaltung refreshed --- .env.example | 8 ++++++- .gitignore | 1 + app/config.py | 9 ++++++- docker-compose.yml | 10 ++++---- docs/Makefile | 14 +++++++++++ docs/conf.py | 14 +++++++++-- docs/index.rst | 15 +----------- docs/source/app.rst | 53 +++++++++++++++++++++++++++++++++++++++++ docs/source/modules.rst | 7 ++++++ wsgi.py | 2 +- 10 files changed, 108 insertions(+), 25 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/source/app.rst create mode 100644 docs/source/modules.rst diff --git a/.env.example b/.env.example index c1d2197..e03cab9 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,10 @@ SECRET_KEY=replace-with-a-secure-random-key-in-prod ZITADEL_CLIENT_ID=your-zitadel-client-id ZITADEL_CLIENT_SECRET=your-zitadel-client-secret ZITADEL_DISCOVERY_URL=https://id.vmlx.de/.well-known/openid-configuration -DATABASE_URL=sqlite:///app.db + +# Verzeichnis für die SQLite-Datei (app.db wird darin angelegt). +# Gilt für flask run UND Docker gleichermassen. +# Docker-Compose mountet diesen Pfad als Bind Mount in den Container. +# Lokal: DB_DATA_PATH=./data → Projektordner/data/app.db +# Prod: DB_DATA_PATH=/dbdata → /dbdata/app.db auf dem Host +DB_DATA_PATH=./data diff --git a/.gitignore b/.gitignore index d582fc4..7314b57 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +data/ venv/ __pycache__/ *.pyc diff --git a/app/config.py b/app/config.py index 858d1b9..a426192 100644 --- a/app/config.py +++ b/app/config.py @@ -11,14 +11,21 @@ OIDC Discovery URL. """ import os +from pathlib import Path from dotenv import load_dotenv load_dotenv() +def _db_uri() -> str: + data_path = Path(os.environ.get("DB_DATA_PATH", "./data")).resolve() + data_path.mkdir(parents=True, exist_ok=True) + return f"sqlite:///{data_path}/app.db" + + class Config: SECRET_KEY = os.environ.get("SECRET_KEY", "dev-secret-change-me") - SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", "sqlite:///app.db") + SQLALCHEMY_DATABASE_URI = _db_uri() SQLALCHEMY_TRACK_MODIFICATIONS = False ZITADEL_CLIENT_ID = os.environ.get("ZITADEL_CLIENT_ID") diff --git a/docker-compose.yml b/docker-compose.yml index 2a73dbd..a819837 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,15 +2,13 @@ services: web: build: context: . - # pull: true sorgt dafür, dass ein aktualisiertes Basis-Image einen Rebuild auslöst - pull_policy: always env_file: - .env ports: - "8000:8000" volumes: - - db_data:/app/instance + # Bind Mount auf Host-Pfad – kein Named Volume. + # DB liegt als echte Datei auf dem Host, überlebt jeden Rebuild und docker down. + # Pfad wird über DB_DATA_PATH in der .env gesetzt. + - ${DB_DATA_PATH:-./data}:/app/instance restart: unless-stopped - -volumes: - db_data: diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..975be13 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,14 @@ +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +.PHONY: help html clean + +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" + +html: + @$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)" + +clean: + rm -rf $(BUILDDIR) diff --git a/docs/conf.py b/docs/conf.py index 4622834..a3ffca1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,8 @@ -# Sphinx-Konfiguration – wird nach jedem Meilenstein mit flask seed-db und -# sphinx-apidoc -o docs/source/ app/ aktualisiert. +import os +import sys + +# Projektroot ins sys.path, damit 'import app' funktioniert +sys.path.insert(0, os.path.abspath("..")) project = "OIDC Flask Showcase" author = "Bjoern Runden" @@ -12,3 +15,10 @@ extensions = [ exclude_patterns = ["_build"] html_theme = "alabaster" + +# Autodoc-Optionen: Docstrings auch aus __init__ holen +autodoc_default_options = { + "members": True, + "undoc-members": True, + "show-inheritance": True, +} diff --git a/docs/index.rst b/docs/index.rst index 33c3554..18c05a4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,17 +5,4 @@ OIDC Flask Showcase – Dokumentation :maxdepth: 2 :caption: Module: -.. automodule:: app - :members: - -.. automodule:: app.config - :members: - -.. automodule:: app.models - :members: - -.. automodule:: app.auth - :members: - -.. automodule:: app.routes - :members: + source/modules diff --git a/docs/source/app.rst b/docs/source/app.rst new file mode 100644 index 0000000..9419a76 --- /dev/null +++ b/docs/source/app.rst @@ -0,0 +1,53 @@ +app package +=========== + +Submodules +---------- + +app.auth module +--------------- + +.. automodule:: app.auth + :members: + :show-inheritance: + :undoc-members: + +app.config module +----------------- + +.. automodule:: app.config + :members: + :show-inheritance: + :undoc-members: + +app.database module +------------------- + +.. automodule:: app.database + :members: + :show-inheritance: + :undoc-members: + +app.models module +----------------- + +.. automodule:: app.models + :members: + :show-inheritance: + :undoc-members: + +app.routes module +----------------- + +.. automodule:: app.routes + :members: + :show-inheritance: + :undoc-members: + +Module contents +--------------- + +.. automodule:: app + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 0000000..a591e72 --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,7 @@ +app +=== + +.. toctree:: + :maxdepth: 4 + + app diff --git a/wsgi.py b/wsgi.py index 86e5c04..f5babf1 100644 --- a/wsgi.py +++ b/wsgi.py @@ -1,7 +1,7 @@ """ WSGI-Einstiegspunkt für gunicorn (Produktion). -:author: +:author: Björn Runden :date: 2026-06-17 :version: 0.1 """