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
"""