modified: routes/journal_routes.py modified: static/css/style.css modified: templates/base.html new file: templates/datenschutz.html modified: templates/future.html new file: templates/impressum.html
📓 Bullet Journal (Flask)
Eine eigene Bullet-Journal-Webanwendung mit Benutzerkonten, Tagesseiten (Montag–Sonntag), Wochenübersicht und Future Log. Läuft in Docker und ist für Coolify optimiert. Die Daten liegen in MySQL.
Features
- 🔐 Login-System mit jedem eigenen Journal pro Benutzer (Daten-Isolation)
- 📅 7 Tagesseiten (Montag–Sonntag) mit 3 Spalten: Bullet | Notiz | Priorität
- 🗓 Wochenübersicht (offene / erledigte Aufgaben je Tag)
- 📌 Future Log – langfristiger Kalender
- ✅ Aufgaben erledigt markieren, in einen anderen Tag oder ins Future Log verschieben
- 🛡 Admin-Panel zum Erstellen und Verwalten von Accounts
- 🔒 Passwörter mit Salz + Pfeffer gehasht (PBKDF2-SHA256)
Bullet-Typen
| Symbol | Bedeutung |
|---|---|
. |
Aufgabe |
x |
Termin |
- |
Notiz |
? |
Frage |
Prioritäten: 0 Niedrig, 1 Mittel, 2 Hoch.
Projektstruktur
Journal/
├── Dockerfile # Production-Image (Gunicorn)
├── docker-compose.yml # Lokale Entwicklung (App + MySQL)
├── requirements.txt
├── .env.example
├── app.py # Flask-App + Blueprints
├── config.py # Konfiguration aus Env-Variablen
├── db.py # PyMySQL + Schema-Init
├── db_helpers.py # Benutzer-/Admin-Helfer
├── auth.py # Passwort-Hash (Salz+Pfeffer), Guards
├── routes/
│ ├── auth_routes.py # Login / Logout
│ ├── journal_routes.py # Index, Wochenübersicht, Tage, Future Log
│ └── admin_routes.py # Admin-Panel
├── templates/ # Jinja2-Seiten
└── static/ # eigenes CSS + JS
Lokale Entwicklung
-
Umgebungsvariablen kopieren:
copy .env.example .envSECRET_KEY,PEPPERsowieADMIN_USERNAME/ADMIN_PASSWORDanpassen. -
Starten (App + MySQL):
docker compose up --build -
Öffnen: http://localhost:8000
Der erste Admin wird beim Start automatisch aus ADMIN_USERNAME / ADMIN_PASSWORD angelegt.
Melde dich damit an und lege im Admin-Panel weitere Benutzer an.
Deployment auf Coolify
-
Repository in Coolify als Public Repository verknüpfen.
-
MySQL als Dienst hinzufügen (Coolify verbindet die Folgenden automatisch als Env-Variablen).
-
Env-Variablen als Secrets setzen:
Variable Beschreibung DB_HOSTHost der MySQL (von Coolify gesetzt) DB_PORTPort der MySQL (von Coolify gesetzt) DB_USERDB-Benutzer (von Coolify gesetzt) DB_PASSWORDDB-Passwort (von Coolify gesetzt) DB_DATABASEDB-Name (von Coolify gesetzt) SECRET_KEYGeheimer Wert für Flask-Sessions (Secret) PEPPERGlobaler „Pfeffer“ für Passwort-Hashing (Secret – wird NIE in der DB gespeichert) ADMIN_USERNAMEName des ersten Admins ADMIN_PASSWORDPasswort des ersten Admins (Secret) -
Port
8000freigeben. TLS/Reverse-Proxy übernimmt Coolify automatisch.
Wichtig: Ändere
ADMIN_PASSWORD,SECRET_KEYundPEPPERunbedingt – verwende keine Standardwerte.PEPPERdarf nach dem ersten Hash-Vorgang nicht mehr geändert werden, sonst lassen sich bestehende Passwörter nicht mehr prüfen.
Sicherheit
- Passwörter werden mit zufälligem Salz (pro Benutzer, in DB) und einem globalen Pfeffer (aus der Umgebung, nie in der DB) über PBKDF2-SHA256 gehasht.
- Jede Abfrage ist über die Session an den angemeldeten Benutzer (
user_id) gebunden. - Seitenzugriffe sind durch
@login_required/@admin_requiredgeschützt. - Es gibt keine offene Registrierung – nur Admins legen Accounts an.