# 📓 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 1. **Umgebungsvariablen** kopieren: ```bash copy .env.example .env ``` `SECRET_KEY`, `PEPPER` sowie `ADMIN_USERNAME` / `ADMIN_PASSWORD` anpassen. 2. **Starten** (App + MySQL): ```bash docker compose up --build ``` 3. Ö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 1. Repository in Coolify als **Public Repository** verknĂŒpfen. 2. **MySQL** als Dienst hinzufĂŒgen (Coolify verbindet die Folgenden automatisch als Env-Variablen). 3. Env-Variablen als **Secrets** setzen: | Variable | Beschreibung | |-------------------|-------------------------------------------------| | `DB_HOST` | Host der MySQL (von Coolify gesetzt) | | `DB_PORT` | Port der MySQL (von Coolify gesetzt) | | `DB_USER` | DB-Benutzer (von Coolify gesetzt) | | `DB_PASSWORD` | DB-Passwort (von Coolify gesetzt) | | `DB_DATABASE` | DB-Name (von Coolify gesetzt) | | `SECRET_KEY` | Geheimer Wert fĂŒr Flask-Sessions (**Secret**) | | `PEPPER` | Globaler „Pfeffer“ fĂŒr Passwort-Hashing (**Secret** – wird NIE in der DB gespeichert) | | `ADMIN_USERNAME` | Name des ersten Admins | | `ADMIN_PASSWORD` | Passwort des ersten Admins (**Secret**) | 4. Port `8000` freigeben. TLS/Reverse-Proxy ĂŒbernimmt Coolify automatisch. > **Wichtig:** Ändere `ADMIN_PASSWORD`, `SECRET_KEY` und `PEPPER` unbedingt – verwende keine > Standardwerte. `PEPPER` darf 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_required` geschĂŒtzt. - Es gibt **keine** offene Registrierung – nur Admins legen Accounts an.