SimolZimol f973e67311 modified: Dockerfile
new file:   pdf_export.py
	modified:   requirements.txt
	modified:   routes/journal_routes.py
	modified:   static/css/style.css
	modified:   templates/base.html
	modified:   templates/day.html
	new file:   templates/edit_future.html
	new file:   templates/edit_note.html
	modified:   templates/future.html
	modified:   templates/monat.html
	new file:   templates/report.html
	modified:   templates/week.html
2026-08-02 21:28:30 +02:00
2026-08-02 21:28:30 +02:00
2026-08-02 21:28:30 +02:00
2026-08-02 21:28:30 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 21:12:17 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 20:50:50 +02:00
2026-08-02 21:12:17 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 21:28:30 +02:00
2026-08-02 21:28:30 +02:00
2026-08-02 20:41:24 +02:00
2026-08-02 21:28:30 +02:00

📓 Bullet Journal (Flask)

Eine eigene Bullet-Journal-Webanwendung mit Benutzerkonten, Tagesseiten (MontagSonntag), 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 (MontagSonntag) 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:

    copy .env.example .env
    

    SECRET_KEY, PEPPER sowie ADMIN_USERNAME / ADMIN_PASSWORD anpassen.

  2. Starten (App + MySQL):

    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.
Description
No description provided
Readme 133 KiB
Languages
Python 49.5%
HTML 37%
CSS 11%
JavaScript 1.5%
Dockerfile 1%