new file: .gitignore new file: Dockerfile new file: README.md new file: app.py new file: auth.py new file: config.py new file: db.py new file: db_helpers.py new file: docker-compose.yml new file: requirements.txt new file: routes/__init__.py new file: routes/admin_routes.py new file: routes/auth_routes.py new file: routes/journal_routes.py new file: static/css/style.css new file: static/js/main.js new file: templates/admin/dashboard.html new file: templates/admin/users.html new file: templates/base.html new file: templates/day.html new file: templates/future.html new file: templates/index.html new file: templates/login.html new file: templates/week.html
98 lines
4.0 KiB
Markdown
98 lines
4.0 KiB
Markdown
# 📓 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.
|