Bjoern Welker 630595bce9 security: add SECRET_KEY validation
- Prevent server startup if SECRET_KEY is not set in production
- Raise RuntimeError with helpful message if using default value
- Allow debug mode for local development

This ensures the application never runs with an insecure session
secret in production environments.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 08:09:45 +01:00
2026-02-06 08:09:45 +01:00
2026-01-30 08:55:14 +01:00
2026-01-30 08:55:14 +01:00
2026-01-30 08:55:14 +01:00
2026-01-30 12:10:10 +01:00
2026-01-30 08:55:14 +01:00
2026-01-30 12:41:09 +01:00

Hellas Bestand & WaWi

Überblick

Dieses Repository enthält:

  • WaWiApp (Flask + SQLite) für Artikelverwaltung, Ausbuchen, Verkäufe und Bestellungen.
  • LiveShopAnsicht (index.html) lädt Daten aus der WaWiApp.
  • ImportScript für Daten aus der ursprünglichen hellas_bestand.html.

Struktur

  • wawi/app.py FlaskApp (CRUD, Ausbuchen, Verkäufe, Benutzerverwaltung)
  • wawi/templates/ HTMLTemplates der WaWiApp
  • wawi/static/ Styles + Logo
  • wawi/hellas.db SQLiteDatenbank (wird automatisch erstellt)
  • wawi/import_from_html.py Import aus hellas_bestand.html
  • index.html LiveShopAnsicht (ruft /wawi/proxy/bestand)

WaWi lokal starten

cd wawi
python3 -m venv .venv
source .venv/bin/activate
pip install flask gunicorn
python app.py

Standardzugriff: Login über Benutzerverwaltung (siehe unten).

Developer (ENV variablen)

Diese App liest Konfiguration ausschließlich aus Umgebungsvariablen. Für lokale Entwicklung kannst du sie direkt im Shell-Session setzen oder eine .env-Datei in dein Startup-Script laden.

Minimal sinnvoll für lokal:

  • SECRET_KEY Session-Secret (beliebiger String)
  • APP_USER / APP_PASSWORD initialer Admin-User
  • URL_PREFIX leer lassen, wenn lokal ohne Sub-Pfad

Für Bestellungen per Mail zusätzlich:

  • SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS
  • SMTP_FROM, ORDER_TO

Optional:

  • APP_API_KEY Schutz fuer /wawi/api/bestand und /wawi/order
  • COOKIE_SECURE 0 fuer http lokal, 1 fuer https

Benutzerverwaltung

Beim ersten Start wird ein Admin aus ENV erzeugt:

  • APP_USER (default: admin)
  • APP_PASSWORD (default: admin)

Passwörter werden gehasht gespeichert.
Über /users können weitere Benutzer angelegt und Passwörter zurückgesetzt werden.

Import aus hellas_bestand.html

cd wawi
python import_from_html.py /pfad/zu/hellas_bestand.html --truncate

LiveShopAnsicht (index.html)

index.html lädt den Bestand aus der WaWiApp:

  • APIProxy: /wawi/proxy/bestand

Wenn du diese Datei auf einem Webserver auslieferst, stelle sicher, dass die WaWiApp unter /wawi erreichbar ist. Wenn du Bestellungen direkt aus index.html abschickst, muss der X-Order-Key bzw. ?key= dem APP_API_KEY entsprechen. Der Key wird in index.html im ScriptBlock gesetzt: const ORDER_KEY = "" (neben der Formularlogik). Trage dort deinen Key ein.

Umgebungsvariablen (ENV)

Pflicht/Empfohlen für Produktion

  • SECRET_KEY SessionSecret
  • APP_USER / APP_PASSWORD initialer AdminUser
  • URL_PREFIX z. B. /wawi (wenn hinter SubPfad)

EMail (Bestellungen)

  • SMTP_HOST SMTPServer
  • SMTP_PORT z. B. 587
  • SMTP_USER / SMTP_PASS SMTP Login
  • SMTP_FROM Absender (z. B. bestand@hellas.welker.me)
  • ORDER_TO Empfänger, mehrere per Komma

Optional

  • APP_API_KEY gemeinsamer APIKey für /wawi/api/bestand und /wawi/order
  • COOKIE_SECURE 1 (default) setzt SecureCookie, 0 deaktiviert für http

Deployment (systemd + Gunicorn)

  1. App nach /var/www/hellas/wawi kopieren
  2. venv erstellen:
cd /var/www/hellas/wawi
python3 -m venv .venv
source .venv/bin/activate
pip install flask gunicorn
  1. ServiceDatei anlegen: /etc/systemd/system/hellas.service
[Unit]
Description=Hellas WaWi
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/hellas/wawi
Environment="PATH=/var/www/hellas/wawi/.venv/bin"
Environment="URL_PREFIX=/wawi"
Environment="SECRET_KEY=DEIN_SECRET"
Environment="APP_USER=admin"
Environment="APP_PASSWORD=starkesPasswort"
Environment="SMTP_HOST=smtp.example.com"
Environment="SMTP_PORT=587"
Environment="SMTP_USER=dein_user"
Environment="SMTP_PASS=dein_pass"
Environment="SMTP_FROM=bestand@example.com"
Environment="ORDER_TO=admin@example.com, zweite@example.com"
Environment="APP_API_KEY=api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ExecStart=/var/www/hellas/wawi/.venv/bin/gunicorn -w 3 -b 127.0.0.1:8000 app:app
Restart=always

[Install]
WantedBy=multi-user.target
  1. Aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable --now hellas

Nginx (ReverseProxy + ShopSeite)

Beispiel /etc/nginx/sites-available/hellas:

server {
  listen 80;
  server_name hellas.welker.me;

  location = / {
    root /var/www/hellas;
    try_files /index.html =404;
  }

  location /wawi/ {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Aktivieren:

sudo ln -s /etc/nginx/sites-available/hellas /etc/nginx/sites-enabled/hellas
sudo nginx -t
sudo systemctl reload nginx

SSL (Lets Encrypt)

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d hellas.welker.me

Dateirechte (SQLite + Uploads)

sudo chown -R www-data:www-data /var/www/hellas/wawi
sudo chmod 750 /var/www/hellas/wawi
sudo chmod 640 /var/www/hellas/wawi/hellas.db
sudo mkdir -p /var/www/hellas/wawi/static/uploads
sudo chown -R www-data:www-data /var/www/hellas/wawi/static/uploads

FixPermissions Script (inkl. Uploads)

/root/fix_wawi_permissions.sh sollte auch das UploadVerzeichnis setzen:

#!/bin/sh
set -e
chown -R www-data:www-data /var/www/hellas/wawi
chmod 750 /var/www/hellas/wawi
chmod 640 /var/www/hellas/wawi/hellas.db
mkdir -p /var/www/hellas/wawi/static/uploads
chown -R www-data:www-data /var/www/hellas/wawi/static/uploads
systemctl restart hellas
Description
No description provided
Readme 226 KiB
Languages
HTML 67.4%
Python 27.6%
CSS 5%