Compare commits

..

15 Commits

Author SHA1 Message Date
admin 0ea960259c v1.6.0: Admin-Passwort-Reset, Login per Nachname, Default-PW-Sperre 2026-05-11 12:20:44 +02:00
admin 4d84b8f718 Image wird auch als 'latest' getagged 2026-05-10 15:52:58 +02:00
admin 419ad39ead bump version to 1.5.1; make logout button red 2026-05-10 15:40:04 +02:00
admin 1a85f0ae36 wetter: fetch real data from weather station API 2026-05-10 15:32:13 +02:00
admin 1451f45711 add Statistik component and API route 2026-05-10 14:55:27 +02:00
admin 58a4aeb984 bump version to 1.5.0 2026-05-10 14:53:29 +02:00
admin c04935a117 v1.4.0: Monatsfilter, Pagination, Rollenverwaltung, DB-Bereinigung
- Liste: Monatsfilter mit ←/→ Navigation, Standard = aktueller Monat
- Liste: Pagination (10 Einträge/Seite)
- BEO-Auswahl filtert nur role='guide'
- logbuch_objekte: ObjektName entfernt, JOIN auf objekte
- utf8mb4 Migration und DB-Charset-Umstellung
- SSH-Tunnel-Support: MySQL auf 127.0.0.1:3336
- phpMyAdmin unter /myadmin

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 10:39:11 +02:00
admin 4f1ebb8aa6 Vorherige Änderungen an Formular und Typen nachcommittet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 09:37:11 +02:00
admin 3fc5c9ff7a v1.5.0: utf8mb4-Migration, Rollen, phpMyAdmin, DB-Bereinigung
- Datenbank auf utf8mb4_unicode_ci migriert (migrate_to_utf8mb4.sh)
- beos: Spalte 'role' (kommagetrennte Rollen: guide, admin, key, deleted)
- BEO-Auswahl im Formular filtert nur noch role='guide'
- logbuch_objekte: ObjektName-Spalte entfernt, stattdessen JOIN auf objekte
- lib/db.ts: charset utf8mb4 in Connection-Pool
- Session und Auth um role-Feld erweitert
- compose.yml: phpMyAdmin mit Traefik unter /myadmin
- compose.yml: MySQL auf 127.0.0.1:3336 für SSH-Tunnel (lokale Entwicklung)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 09:34:38 +02:00
admin 8bff795247 v1.4.0: Sonderführung, Zeiterfassung, Enter-Navigation, Objektsuche
- Sonderführung: neues Feld 'Name/Gruppe' (DB-Spalte SonderName), in Liste sichtbar
- Wetter: Race-Condition behoben (API überschreibt DB-Werte beim Bearbeiten nicht mehr)
- Zeiterfassung: TimePicker5 ersetzt durch freie Texteingabe (TimeInput) mit Validierung
- Enter-Taste: navigiert zum nächsten Feld statt die Form abzuschicken; Luftdruck → zurück zu Art; Bemerkungen bleibt normal
- Objektsuche: Freitext-Suche im ObjektSelector, filtert nach Präfix (case-insensitive)
- UI-Anpassungen: kompakteres Layout (space-y-2, kleinere Abstände)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 08:50:51 +02:00
admin 743bebca2d v1.3.0: Wetterdaten in Liste, Zeit als eine Spalte
- Vollständige Liste: Start- und Endzeit in einer Spalte untereinander
- Vollständige Liste: neue Wetter-Spalte (Temp/Feuchte/Druck) ganz rechts
- Kompakte Vorschau bleibt unverändert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 09:07:57 +02:00
admin 1291f0d027 v1.2.1: Wetter als editierbare Eingabefelder
- 3 editierbare Felder (Temp, Feuchte, Luftdruck) statt read-only Anzeige
- Vorausgefüllt mit aktuellen API-Werten
- Feuchte und Luftdruck als Ganzzahl (kein Dezimal)
- Felder gleichmäßig verteilt (links/Mitte/rechts, je 1/3 Breite)
- Wetter-Überschrift entfernt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 08:54:41 +02:00
admin 07d2a13014 v1.2.0: Formular-Redesign und Listen-Verbesserungen
- Eingabe: alle 5 Felder (Führung, Datum, Start, Ende, Besucher) in einer Zeile
- Eingabe: Datum einmalig, Start- und Endzeit getrennt
- Führungsarten: Kürzel werden nur in DB gespeichert, Anzeige als Klartext
- Liste: Datum und Zeit getrennt in eigenen Spalten
- Hintergrundfarbe #EEF4FF auf Login- und Passwort-Seite übertragen
- Alle Inputfelder gleich hoch (text-sm durchgehend)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-01 11:00:19 +02:00
admin 0e3c5ca835 v1.1.0: Druck-Optimierung, UI-Verbesserungen
- Drucklayout: kein innerer Rahmen, volle DIN-A4-Breite, @page-Regel
- Besucher-Spalte: zeigt keine 0 an wenn kein Wert eingetragen
- Beginn-Zeit synchronisiert automatisch die Ende-Zeit
- Hintergrundfarbe auf helles Blau (#EEF4FF)
- Listen-Tab und kompakte Vorschau mit weißem Rahmen
- Besucher-Spalte schmaler, Header als "Bes." abgekürzt
- Drucken-Button im Listen-Tab, Navigation bei Druck ausgeblendet

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-01 10:25:11 +02:00
admin 30c734220a Fix iOS text color, viewport meta tag, and security improvements
- Add viewport meta tag to prevent iOS zoom/scaling issues
- Fix text color on iOS Safari (explicit text-gray-900 on buttons, inputs, TimePicker5)
- Add session checks to /api/beos, /api/objekte, /api/wetter
- Revert iframe embedding (X-Frame-Options: DENY, SameSite: lax)
- docker-compose.prod.yml: fix DB_PORT=3306 for production
- Add docker-compose.prod.yml, .env.prod.example, dump/import scripts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 17:38:08 +02:00
-103
View File
@@ -1,103 +0,0 @@
#!/bin/bash
# Erstellt einen neuen MySQL-Container "logbuch_mysql" und migriert
# die 5 App-relevanten Tabellen aus dem bestehenden "db"-Container.
set -e
# ── Konfiguration ────────────────────────────────────────────────────────────
SRC_CONTAINER="db"
SRC_DB="sternwarte"
SRC_ROOT_PASS="SFluorit"
NEW_CONTAINER="logbuch_mysql"
NEW_DB="sternwarte"
NEW_ROOT_PASS="SFluorit" # ggf. hier ändern
NEW_PORT="3307" # Host-Port (3306 ist schon belegt)
MYSQL_IMAGE="arm64v8/mysql:lts"
NETWORK="sternwarte_default"
TABLES="beos objekte logbuch logbuch_beos logbuch_objekte"
# ── Hilfsfunktion ────────────────────────────────────────────────────────────
wait_for_mysql() {
local container="$1"
local pass="$2"
echo -n "Warte auf MySQL in '$container' "
for i in $(seq 1 60); do
if docker exec "$container" mysqladmin ping -u root -p"$pass" --silent 2>/dev/null; then
echo " bereit."
return 0
fi
echo -n "."
sleep 2
done
echo ""
echo "FEHLER: MySQL in '$container' nicht erreichbar nach 120s." >&2
exit 1
}
# ── Prüfen ob Quell-Container läuft ─────────────────────────────────────────
if ! docker inspect "$SRC_CONTAINER" &>/dev/null; then
echo "FEHLER: Quell-Container '$SRC_CONTAINER' nicht gefunden." >&2
exit 1
fi
echo "Quell-Container '$SRC_CONTAINER' gefunden."
# ── Alten Ziel-Container entfernen falls vorhanden ──────────────────────────
if docker inspect "$NEW_CONTAINER" &>/dev/null; then
echo "Container '$NEW_CONTAINER' existiert bereits — wird gestoppt und entfernt..."
docker rm -f "$NEW_CONTAINER"
fi
# ── Neuen Container starten ──────────────────────────────────────────────────
echo "Starte neuen Container '$NEW_CONTAINER'..."
docker run -d \
--name "$NEW_CONTAINER" \
--network "$NETWORK" \
-p "${NEW_PORT}:3306" \
-e MYSQL_ROOT_PASSWORD="$NEW_ROOT_PASS" \
-e MYSQL_DATABASE="$NEW_DB" \
"$MYSQL_IMAGE"
wait_for_mysql "$NEW_CONTAINER" "$NEW_ROOT_PASS"
# ── Daten migrieren ──────────────────────────────────────────────────────────
echo "Migriere Tabellen: $TABLES"
echo "(Dump von '$SRC_CONTAINER' → Import in '$NEW_CONTAINER')"
docker exec "$SRC_CONTAINER" mysqldump \
-u root -p"$SRC_ROOT_PASS" \
--single-transaction \
--no-tablespaces \
"$SRC_DB" $TABLES \
| docker exec -i "$NEW_CONTAINER" mysql \
-u root -p"$NEW_ROOT_PASS" \
"$NEW_DB"
echo "Migration abgeschlossen."
# ── Zeilenzähler zur Verifikation ────────────────────────────────────────────
echo ""
echo "Zeilenzähler (Quelle → Ziel):"
for TABLE in $TABLES; do
SRC_COUNT=$(docker exec "$SRC_CONTAINER" mysql -u root -p"$SRC_ROOT_PASS" -sN \
-e "SELECT COUNT(*) FROM $TABLE;" "$SRC_DB" 2>/dev/null)
DST_COUNT=$(docker exec "$NEW_CONTAINER" mysql -u root -p"$NEW_ROOT_PASS" -sN \
-e "SELECT COUNT(*) FROM $TABLE;" "$NEW_DB" 2>/dev/null)
STATUS="✓"
[ "$SRC_COUNT" != "$DST_COUNT" ] && STATUS="✗ ABWEICHUNG"
printf " %-25s %5s → %5s %s\n" "$TABLE" "$SRC_COUNT" "$DST_COUNT" "$STATUS"
done
# ── Abschluss ─────────────────────────────────────────────────────────────────
echo ""
echo "══════════════════════════════════════════════════════"
echo "Neuer Container: $NEW_CONTAINER"
echo " Netzwerk: $NETWORK"
echo " Host-Port: $NEW_PORT"
echo " Datenbank: $NEW_DB"
echo ""
echo "Nächster Schritt — .env anpassen:"
echo " DB_HOST=$NEW_CONTAINER"
echo " DB_PASS=$NEW_ROOT_PASS"
echo "══════════════════════════════════════════════════════"