Admin Dashboard, Hilfe-Seite, Dockerfile Fixes (gunicorn, UID 1000, HOME)
This commit is contained in:
@@ -7,8 +7,9 @@ RUN pip install --no-cache-dir -r requirements.txt gunicorn
|
|||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN addgroup --system app && adduser --system --ingroup app --home /app app && \
|
RUN addgroup --system --gid 1000 app && adduser --system --uid 1000 --ingroup app app && \
|
||||||
chown -R app:app /app
|
chown -R app:app /app && chmod -R u+w /app
|
||||||
|
ENV HOME=/app
|
||||||
USER app
|
USER app
|
||||||
|
|
||||||
EXPOSE 5005
|
EXPOSE 5005
|
||||||
|
|||||||
33
app.py
33
app.py
@@ -54,11 +54,14 @@ login_manager.login_view = "login" # Nicht eingeloggte User werden zum Login um
|
|||||||
# Config-Helfer
|
# Config-Helfer
|
||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
def load_config():
|
def load_config():
|
||||||
"""Liest die config.json und gibt das Dict zurück. Legt ein leeres an, falls nicht vorhanden."""
|
"""Liest die config.json und gibt das Dict zurück. Legt ein leeres an, falls nicht vorhanden oder fehlerhaft."""
|
||||||
if not os.path.exists(CONFIG_FILE):
|
if not os.path.exists(CONFIG_FILE):
|
||||||
return {"admin": {}, "sites": {}}
|
return {"admin": {}, "sites": {}}
|
||||||
with open(CONFIG_FILE) as f:
|
try:
|
||||||
return json.load(f)
|
with open(CONFIG_FILE) as f:
|
||||||
|
return json.load(f)
|
||||||
|
except (json.JSONDecodeError, OSError):
|
||||||
|
return {"admin": {}, "sites": {}}
|
||||||
|
|
||||||
|
|
||||||
def save_config(cfg):
|
def save_config(cfg):
|
||||||
@@ -295,11 +298,14 @@ class User(UserMixin):
|
|||||||
|
|
||||||
|
|
||||||
def load_users():
|
def load_users():
|
||||||
"""Liest die users.json. Gibt leeres Dict zurück, wenn nicht vorhanden."""
|
"""Liest die users.json. Gibt leeres Dict zurück, wenn nicht vorhanden oder fehlerhaft."""
|
||||||
if not os.path.exists(USERS_FILE):
|
if not os.path.exists(USERS_FILE):
|
||||||
return {}
|
return {}
|
||||||
with open(USERS_FILE) as f:
|
try:
|
||||||
return json.load(f)
|
with open(USERS_FILE) as f:
|
||||||
|
return json.load(f)
|
||||||
|
except (json.JSONDecodeError, OSError):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
def save_users(users):
|
def save_users(users):
|
||||||
@@ -318,9 +324,15 @@ def get_user(email):
|
|||||||
|
|
||||||
|
|
||||||
def init_user_db():
|
def init_user_db():
|
||||||
"""Legt users.json mit einem Admin-Konto aus config.json.admin an, falls sie nicht existiert."""
|
"""Legt users.json mit einem Admin-Konto aus config.json.admin an, falls sie nicht existiert oder leer ist."""
|
||||||
if os.path.exists(USERS_FILE):
|
if os.path.exists(USERS_FILE):
|
||||||
return
|
try:
|
||||||
|
with open(USERS_FILE) as f:
|
||||||
|
content = f.read().strip()
|
||||||
|
if content:
|
||||||
|
return
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
cfg = load_config()
|
cfg = load_config()
|
||||||
admin = cfg.get("admin", {})
|
admin = cfg.get("admin", {})
|
||||||
username = admin.get("username", "admin@signage.local")
|
username = admin.get("username", "admin@signage.local")
|
||||||
@@ -1584,7 +1596,10 @@ def admin_users_reset_password(email):
|
|||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
# Main
|
# Main
|
||||||
# -------------------------------------------------
|
# -------------------------------------------------
|
||||||
init_user_db()
|
try:
|
||||||
|
init_user_db()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ init_user_db fehlgeschlagen: {e}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run(debug=True, host="0.0.0.0", port=5005)
|
app.run(debug=True, host="0.0.0.0", port=5005)
|
||||||
|
|||||||
Reference in New Issue
Block a user