Vault initial
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,133 @@
|
||||
# Melo 1.0 – Code-Audit & Design-Review
|
||||
**Datum:** 26.07.2026
|
||||
**Repo:** `/home/dustin/git/melo_app/` (27 Dart-Dateien, v2.7 laut Logger)
|
||||
|
||||
---
|
||||
|
||||
## 🔴 TOTE BUTTONS (führen zu nichts oder zum falschen Ziel)
|
||||
|
||||
### 1. BottomNavigationBar – 3 von 5 Tabs defekt!
|
||||
**Datei:** `lib/screens/home_screen.dart` Zeile 367–371
|
||||
|
||||
| Tab | Label | Was passiert | Sollte passieren |
|
||||
|-----|-------|-------------|------------------|
|
||||
| 🎵 Musik | Index 0 | ✅ Home-Screen | ✅ richtig |
|
||||
| ⬇ Downloads | Index 1 | ✅ DownloadScreen | ✅ richtig |
|
||||
| 🏷️ Tags | Index 2 | ❌ öffnet **PlaylistSheet**! | Sollte nach Tags filtern o. Tag-Manager zeigen |
|
||||
| ❤️ Favoriten | Index 3 | ❌ öffnet **PlaylistSheet**! | Sollte favorisierte Songs filtern |
|
||||
| ⚙️ Einstellungen | Index 4 | ❌ **KEIN Handler** – tut gar nichts! | Sollte Einstellungen-Seite zeigen |
|
||||
|
||||
```dart
|
||||
// Aktueller Code (defekt):
|
||||
onTap: (i) {
|
||||
setState(() => _aktiverTab = i);
|
||||
if (i == 2) _zeigePlaylistSheet(); // FALSCH: Tags → Playlists
|
||||
if (i == 3) _zeigePlaylistSheet(); // FALSCH: Favoriten → Playlists
|
||||
// i == 4 → KEIN Code! Einstellungen-Tab tot.
|
||||
},
|
||||
```
|
||||
|
||||
### 2. Auskommentierte Widgets (Features existieren, sind aber deaktiviert)
|
||||
**Datei:** `lib/screens/home_screen.dart` Zeile 272–291
|
||||
|
||||
- **RecentWidget** (Zeile 273): `// RecentWidget(songs: _vm.letzteSongs, onPlay: _vm.spieleSong),`
|
||||
- Zeigt "Zuletzt gehört" – Code existiert in `lib/widgets/recent_widget.dart`, korrekt implementiert
|
||||
|
||||
- **TagStatsWidget** (Zeile 290): `// TagStatsWidget(tagCounts: _vm.tagCounts),`
|
||||
- Zeigt Tag-Häufigkeiten farbcodiert – Code existiert in `lib/widgets/tag_stats_widget.dart`, korrekt implementiert
|
||||
|
||||
### 3. Alle anderen Buttons ✅ intakt
|
||||
- MeloHeader (Cloud/Suche/Download): alle 3 funktional
|
||||
- SongTile (Edit/Favorit/Playlist/Play): alle funktional
|
||||
- MiniPlayer (Play/Pause/Skip): alle funktional
|
||||
- DownloadScreen (Ordner/Download/Abbrechen): alle funktional
|
||||
- PlaylistSheet (Neu/Öffnen/Löschen): alle funktional
|
||||
- NavidromeBrowser (Verbinden/Alben/Stream/Download): alle funktional
|
||||
|
||||
---
|
||||
|
||||
## 🎨 DESIGN-ANALYSE & VERSCHÖNERUNGSVORSCHLÄGE
|
||||
|
||||
### Aktuelles Design (Bestandsaufnahme)
|
||||
- **Farbschema:** Dark Theme – Schwarz `#0D0D0D`, Dunkelgrau `#1A1A1A`/`#2A2A2A`, Rot `#CC0000` als Akzent
|
||||
- **Typografie:** System-Standardschrift, keine Custom-Font. Nur Größen-Variation (9-28px).
|
||||
- **Layout:** Standard-Material mit BottomNavigationBar, ListView, Cards
|
||||
- **Rundungen:** Konsistent 8-14px Border-Radius
|
||||
- **Icons:** Material Icons, teils mit Emoji (♪, 💿, 🎵, 💌)
|
||||
- **Animationen:** Nur implizit (FAB, BottomSheet); keine expliziten
|
||||
|
||||
### 🔥 Top 10 Verschönerungs-Maßnahmen (priorisiert)
|
||||
|
||||
#### 1. **Custom-Schriftart** – Höchste Wirkung, geringer Aufwand
|
||||
- Schriftart wie **Inter** oder **Poppins** via `google_fonts` einbinden
|
||||
- Sofort moderneres, hochwertigeres Look & Feel
|
||||
- `pubspec.yaml` → `google_fonts: ^6.1.0`
|
||||
|
||||
#### 2. **Glassmorphism-Effekte**
|
||||
- MiniPlayer + StatistikCard mit `BackdropFilter` + `blur`
|
||||
- Transparenter, schwebender Look statt flache Container
|
||||
- `ClipRRect` mit `BackdropFilter(brightness: 0.2, saturation: 0.3)`
|
||||
|
||||
#### 3. **Subtiler Hintergrund-Gradient**
|
||||
- Statt `MeloTheme.schwarz` ein radialer Gradient von `#1A0505` nach `#0D0D0D`
|
||||
- Gibt Tiefe, wirkt weniger "flach"
|
||||
|
||||
#### 4. **Song-Tiles mit Swipe-Gesten**
|
||||
- Swipe links → Favorit toggeln
|
||||
- Swipe rechts → Zur Playlist hinzufügen
|
||||
- `flutter_slidable` Package
|
||||
|
||||
#### 5. **Skeleton-Loader / Shimmer**
|
||||
- Statt `CircularProgressIndicator` beim Laden
|
||||
- Placeholder-Karten mit `shimmer`-Animation
|
||||
- Wirkt professioneller, weniger "Lade-Unterbrechung"
|
||||
|
||||
#### 6. **Hero-Animationen**
|
||||
- MiniPlayer → Vollbild-Player mit fließendem Übergang
|
||||
- Album-Cover als Hero-Widget
|
||||
|
||||
#### 7. **Leere-Zustände mit Icons/Illustration**
|
||||
- "Noch keine Playlists" → mit großer Illustration + CTA-Button
|
||||
- "Keine Treffer" → Such-Illustration
|
||||
- Statt reinem Text
|
||||
|
||||
#### 8. **Animierte Tab-Indikatoren**
|
||||
- BottomNavBar mit animiertem Indikator-Balken oder Dot
|
||||
- Sanfte Farbverläufe beim Wechseln
|
||||
|
||||
#### 9. **Pull-to-Refresh** auf Song-Liste
|
||||
- `RefreshIndicator` um die ListView
|
||||
- Neu-Scannen per Wischgeste
|
||||
|
||||
#### 10. **Farbcodierte Fortschrittsbalken**
|
||||
- Fortschritt farblich codieren (grau→gelb→grün bei Download-Fortschritt)
|
||||
- Statt einfachem roten Balken
|
||||
|
||||
### Farbpaletten-Erweiterung (Vorschlag)
|
||||
```dart
|
||||
// Zusätzlich zu bestehenden Farben:
|
||||
static const Color rotGlow = Color(0x40CC0000); // für Glow-Effekte
|
||||
static const Color surfaceHell = Color(0xFF252525); // für Hover/Active
|
||||
static const Color erfolg = Color(0xFF4CAF50); // Grün-Akzent
|
||||
static const Color warnung = Color(0xFFFFC107); // Gelb-Akzent
|
||||
```
|
||||
|
||||
### Auch interessant (niedrigere Priorität)
|
||||
- **Waveform-Animation** im MiniPlayer (statt statischem Balken)
|
||||
- **Konfetti-Effekt** nach erfolgreichem Download
|
||||
- **Haptisches Feedback** bei Button-Taps (`HapticFeedback.lightImpact()`)
|
||||
- **Dark-Mode-Only** mit OLED-optimiertem `#000000` für echte Schwarztöne
|
||||
- **BottomSheet mit Drag-Handle** schon vorhanden → schön!
|
||||
|
||||
---
|
||||
|
||||
## 📊 Zusammenfassung
|
||||
|
||||
| Kategorie | Befund |
|
||||
|-----------|--------|
|
||||
| Tote Buttons | **3 von 5 Tabs defekt** – Tags/Favoriten öffnen Playlists, Einstellungen tut nichts |
|
||||
| Deaktivierte Widgets | RecentWidget + TagStatsWidget auskommentiert, Code intakt |
|
||||
| Sonstige Buttons | Alle intakt ✅ |
|
||||
| Design-Level | Solide Basis, Material 3 Dark Theme, konsistent |
|
||||
| Größtes Manko | Keine Custom-Schriftart, flache Container, keine Animationen |
|
||||
| Schnellster Gewinn | Custom Font + Glassmorphism + Gradient-Hintergrund |
|
||||
@@ -0,0 +1,22 @@
|
||||
# Brain Log — 2026-08-05 (Abend)
|
||||
|
||||
## Session: Melo Sprint D+E + Review
|
||||
|
||||
### Was passiert ist
|
||||
- **Sprint D komplett** (v2.52): Favoriten-Sync-Fix (bidirektional), YT-Fallback, SyncService (Auto-Intervall, Notification), funktionierende Einstellungen
|
||||
- **Sprint E komplett** (v2.53): Recaps 7T/Monat/Jahr, Tombstone-Sync, Konflikt-Report
|
||||
- **Code Review D+E**: 3 MED-Findings (Tombstone-Race, DB-Insert neuer Songs, fehlende Tests) → gefixt → **FREIGABE**
|
||||
- **APK v2.53.1** gebaut + geliefert (21,0 MB)
|
||||
- **Merge-Dateien v7** regeneriert (briefing + code, 15.511 Zeilen)
|
||||
|
||||
### Highlights
|
||||
- MED-2 war der Killer: Neue Server-Songs wurden NIE in die lokale DB geschrieben → bei jedem Sync GB-Re-Downloads + falsche "+neu"-Meldungen. Jetzt: DB-Insert mit cloud_id.
|
||||
- Tombstones jetzt mit Server-Zeitstempel (datetime('now')) statt Client-Zeit → keine Uhr-Drift-Zombies mehr
|
||||
|
||||
### Nebenschauplatz
|
||||
- YT-Link-Finder: UTF-8-Bug gefixt (0/25 → 4/25 pro Lauf) — 107/325 Songs mit Links, Cron holt Rest
|
||||
|
||||
### Offen
|
||||
- Sprint F (Android Auto, Home-Widget)
|
||||
- melo_cloud.py in eigenes Repo aufnehmen
|
||||
- Tinker-Easter-Egg
|
||||
@@ -0,0 +1,24 @@
|
||||
# Brain Log — 2026-08-05 (Nacht)
|
||||
|
||||
## Session: Vibe-Tools-Recherche + Installationen
|
||||
|
||||
### Installiert
|
||||
1. **youtube-full** (Skill) — Transkripte/Videos, kein API-Key
|
||||
2. **gitingest-MCP** (3 Tools) — Repo→Text; funktioniert für öffentliche Repos; unser Gitea ist nicht öffentlich → Merge-Dateien bleiben für Claude (oder gitingest-CLI lokal)
|
||||
3. **Vibe-Coder-MCP** v0.3.5 (CLI `vibe`) — Dev-Tools für Agents
|
||||
4. **SkillClaw** (venv ~/skillclaw-venv) — **DeepSeek-kompatibel getestet ✅** (Proxy :30001 reichte DeepSeek durch), aber NICHT in Hermes verdrahtet (Proxy-Eingriff riskant, nur auf Freigabe)
|
||||
5. **hermes-workspace** — **GUI läuft auf Port 3000** (Chat/Terminal/Memory/Skills/Inspector); volle Integration braucht Gateway-API-Server :8642 (Neustart nötig, Telegram kurz weg)
|
||||
|
||||
### Kanban-Erkenntnis
|
||||
- **Swarm-Setup NICHT nötig** für Kanban an sich
|
||||
- ABER: Telegram-Sessions laufen als Child-Kontext (`HERMES_DELEGATED_CHILD_CONTEXT=1`) → Kanban-Mutationen gesperrt
|
||||
- → Kanban nur via CLI/GUI nutzbar, nicht aus Telegram. Für unseren Workflow kein Mehrwert → dokumentiert, nicht aktiv.
|
||||
|
||||
### Community-Recherche (Vibe Coding mit Hermes)
|
||||
- Muster: Profil-Fleet, Rollen-Isolation, Subagent-Delegation, Skills als Command Center, Memory-Ebenen, Kanban
|
||||
- Unser Setup folgt den Best-Practices bereits (Profile, Delegation, Skills, Review-Gate)
|
||||
|
||||
### Offen
|
||||
- gitingest-CLI lokal testen (Merge-Datei-Ersatz für Claude)
|
||||
- hermes-workspace volle Integration (Gateway :8642) — nur mit Freigabe
|
||||
- SkillClaw-Proxys in Hermes — nur mit Freigabe
|
||||
@@ -0,0 +1,24 @@
|
||||
# Brain Log — 2026-08-05
|
||||
|
||||
## Session: Melo Sprint C + Vault-Workflow
|
||||
|
||||
### Was passiert ist
|
||||
- **Sprint C abgeschlossen** (v2.51.4): 5-Tab-Navigation, Cloud-Dashboard, Schnellaktionen, Musikserver-Chip
|
||||
- **Code Review**: 4 MED-Findings → gefixt → FREIGABE (passed=true)
|
||||
- **APK v2.51.4** gebaut + geliefert (20,8 MB, arm64)
|
||||
- **Merge-Dateien** v6 regeneriert (briefing + code, 14.139 Zeilen)
|
||||
|
||||
### Vault-Workflow eingerichtet
|
||||
- [[Server Aingrad - Komplette Übersicht]] aktualisiert
|
||||
- [[Melo App - Status]] neu erstellt
|
||||
- Künftig: Notizen parallel im Vault (Notizen/ + Brain-Log)
|
||||
|
||||
### Nebenschauplatz
|
||||
- SearXNG installiert (search.baka-net.de, Meta-Suche ohne API-Key)
|
||||
- RSSHub entfernt (neue Version braucht API-Keys)
|
||||
- Gehalts-Prognose Juli ~1.731 € / August ~1.383 € (15,10 €/Std, SK1, SH)
|
||||
|
||||
### Offen
|
||||
- Sprint D (Android Auto, Home-Widget)
|
||||
- INFO: Server-Songs werden nie in lokale DB geschrieben
|
||||
- Tinker-Easter-Egg
|
||||
@@ -1,2 +1,3 @@
|
||||
{"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-07-09T14:02:54.872Z","payload":{"added":3,"updated":0,"deleted":0,"alias_resolved":0,"relation_violations":0,"tier_drift":0}}
|
||||
{"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-07-23T11:12:04.985Z","payload":{"added":42,"updated":1,"deleted":1,"alias_resolved":0,"relation_violations":0,"tier_drift":0}}
|
||||
{"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-08-01T11:55:34.940Z","payload":{"added":8,"updated":1,"deleted":0,"alias_resolved":0,"relation_violations":0,"tier_drift":0}}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": 1,
|
||||
"events": 6,
|
||||
"updatedAt": "2026-07-23T12:47:03.764Z",
|
||||
"events": 7,
|
||||
"updatedAt": "2026-08-01T11:55:35.134Z",
|
||||
"paths": {
|
||||
"Brain/INDEX.md": {
|
||||
"strength": 0.3,
|
||||
@@ -14,9 +14,9 @@
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/active.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784805125265,
|
||||
"accessCount": 1
|
||||
"strength": 0.2,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 2
|
||||
},
|
||||
"Brain/inbox/sig-2026-07-09-brain-index.md": {
|
||||
"strength": 0.1,
|
||||
@@ -33,6 +33,11 @@
|
||||
"lastAccessAt": 1784805125422,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/inbox/sig-2026-07-12-default-model-deepseek.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/inbox/sig-2026-07-16-auto-brain-load.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784805125422,
|
||||
@@ -44,9 +49,9 @@
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784805125265,
|
||||
"accessCount": 1
|
||||
"strength": 0.2,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 2
|
||||
},
|
||||
"Brain/inbox/sig-2026-07-19-server-port-map-2.md": {
|
||||
"strength": 0.1,
|
||||
@@ -63,6 +68,21 @@
|
||||
"lastAccessAt": 1784810821353,
|
||||
"accessCount": 2
|
||||
},
|
||||
"Brain/log/2026-07-12-session.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/log/2026-07-12.a0360993.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/log/2026-07-13.a0360993.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/log/2026-07-16.a0360993.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784810821353,
|
||||
@@ -89,9 +109,9 @@
|
||||
"accessCount": 2
|
||||
},
|
||||
"Brain/log/2026-07-23.a0360993.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784805125265,
|
||||
"accessCount": 1
|
||||
"strength": 0.2,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 2
|
||||
},
|
||||
"Brain/pinned.md": {
|
||||
"strength": 0.2,
|
||||
@@ -108,6 +128,11 @@
|
||||
"lastAccessAt": 1784805125422,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/preferences/pref-default-model-deepseek.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1785585335134,
|
||||
"accessCount": 1
|
||||
},
|
||||
"Brain/preferences/pref-server-port-map.md": {
|
||||
"strength": 0.1,
|
||||
"lastAccessAt": 1784805125265,
|
||||
@@ -120,6 +145,21 @@
|
||||
}
|
||||
},
|
||||
"coAccess": [
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"a": "Brain/INDEX.md",
|
||||
"b": "Brain/log/2026-07-09.a0360993.md",
|
||||
@@ -172,7 +212,7 @@
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
@@ -185,6 +225,21 @@
|
||||
"b": "Brain/inbox/sig-2026-07-19-server-port-map.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-12-session.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-12.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-13.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-19.a0360993.md",
|
||||
@@ -197,7 +252,7 @@
|
||||
},
|
||||
{
|
||||
"a": "Brain/active.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
@@ -295,6 +350,36 @@
|
||||
"b": "Brain/preferences/pref-brain-index.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/log/2026-07-12-session.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/log/2026-07-12.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/log/2026-07-13.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-16-auto-brain-load.md",
|
||||
"b": "Brain/inbox/sig-2026-07-16-check-system-time.md",
|
||||
@@ -340,6 +425,21 @@
|
||||
"b": "Brain/inbox/sig-2026-07-19-server-port-map.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-12-session.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-12.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-13.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-19.a0360993.md",
|
||||
@@ -352,7 +452,7 @@
|
||||
},
|
||||
{
|
||||
"a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
@@ -440,6 +540,51 @@
|
||||
"b": "Soul.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12-session.md",
|
||||
"b": "Brain/log/2026-07-12.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12-session.md",
|
||||
"b": "Brain/log/2026-07-13.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12-session.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12-session.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12.a0360993.md",
|
||||
"b": "Brain/log/2026-07-13.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12.a0360993.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-12.a0360993.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-13.a0360993.md",
|
||||
"b": "Brain/log/2026-07-23.a0360993.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-13.a0360993.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-16.a0360993.md",
|
||||
"b": "Brain/pinned.md",
|
||||
@@ -490,6 +635,11 @@
|
||||
"b": "Brain/preferences/pref-server-port-map.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-23.a0360993.md",
|
||||
"b": "Brain/preferences/pref-default-model-deepseek.md",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"a": "Brain/log/2026-07-23.a0360993.md",
|
||||
"b": "Brain/preferences/pref-server-port-map.md",
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"ts": 1785585335134,
|
||||
"queryHash": "38b54fdb",
|
||||
"paths": [
|
||||
"Brain/preferences/pref-default-model-deepseek.md",
|
||||
"Brain/log/2026-07-23.a0360993.md",
|
||||
"Brain/inbox/sig-2026-07-12-default-model-deepseek.md",
|
||||
"Brain/log/2026-07-12.a0360993.md",
|
||||
"Brain/log/2026-07-13.a0360993.md",
|
||||
"Brain/log/2026-07-12-session.md",
|
||||
"Brain/active.md",
|
||||
"Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
# Audit 14.08.2026 – Sicherheit & Code-Review
|
||||
|
||||
> Stand: 14.08.2026
|
||||
> Umfang: Server Aingrad (Sicherheit + Aufräumen) und Melo App (Code-Review)
|
||||
> Alle Änderungen live verifiziert · Backups: `/home/dustin/backup-audit-2026-08-14/`
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Zuerst: Zwei Korrekturen an bestehenden Notizen
|
||||
|
||||
**1. Die Neustart-Befehle in [[Server Aingrad - Komplette Übersicht]] sind gefährlich.**
|
||||
Dort steht noch:
|
||||
|
||||
```bash
|
||||
sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 &
|
||||
```
|
||||
|
||||
Die drei Dienste laufen inzwischen als **systemd-Units mit `Restart=always`**. Der Befehl killt den verwalteten Prozess, systemd startet ihn sofort neu und belegt den Port — der manuell gestartete Prozess scheitert dann an `Address already in use`, oder er gewinnt das Rennen und läuft unverwaltet weiter, bis die Shell endet. Richtig ist:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart baka-auth # Port 8994
|
||||
sudo systemctl restart melo-cloud # Port 8993
|
||||
sudo systemctl restart yt-proxy # Port 8992
|
||||
sudo systemctl status baka-auth # Zustand prüfen
|
||||
```
|
||||
|
||||
**2. Die Dienst-Tabelle ist beim Zugriff überholt.** `search.baka-net.de` steht dort als „Offen" — seit heute Basic Auth. Ebenfalls nicht erfasst: `matrix`, `element`, `admin-matrix`, `livekit`, `workspace`, `crash`, `ladder`.
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Behobene Sicherheitslücken
|
||||
|
||||
| Befund | Fix | Verifiziert |
|
||||
|--------|-----|-------------|
|
||||
| `/whoami` Auth-Bypass: Basic-Header wurde ohne Passwortprüfung geglaubt → jeder bekam `is_admin: true` | Caddy prüft das Passwort vor dem Proxy | 401 statt 200 |
|
||||
| `/api/cloud/yt-finder` vor der Auth-Prüfung → jeder Request startet 120-s-Subprozess | Doppelte Route entfernt | 401 sofort |
|
||||
| `ladder` offener Paywall-Proxy (Abuse auf eigene IP) | Basic Auth | 401 |
|
||||
| `search` offene SearXNG | Basic Auth | 401 |
|
||||
| `admin-matrix` Synapse-Panel offen | Basic Auth | 401 |
|
||||
| Navidrome-Admin-Passwort im Klartext in `baka_auth.py` | → `/etc/baka-auth/navidrome_pw` (640 root:dustin) | Sync getestet |
|
||||
| `handle_profile` listete bei Fehler alle Benutzernamen | Meldung neutralisiert | — |
|
||||
| Share-Codes aus `random` (vorhersagbar) | `secrets.choice`, 6 → 8 Zeichen | alte Codes gültig |
|
||||
| `baka_auth` single-threaded → Logins serialisiert hinter Navidrome-Timeouts | ThreadingWSGIServer + `threading.Lock` fürs Rate-Limit | Login getestet |
|
||||
|
||||
Caddy nutzt jetzt ein Snippet `(baka_users)` — Benutzerliste steht **an einer Stelle** statt viermal dupliziert.
|
||||
|
||||
---
|
||||
|
||||
## 🛑 Wichtigster Fund: Prod-Build von workspace umgeht die Auth
|
||||
|
||||
`hermes-workspace` läuft absichtlich mit `pnpm dev`. Der naheliegende „Fix" (Produktions-Build) wurde getestet — **auf separatem Port 3021, ohne den laufenden Dienst anzufassen**:
|
||||
|
||||
| Route | Dev (3020) | Prod (3021) |
|
||||
|-------|-----------|-------------|
|
||||
| `/api/sessions` | `{"ok":false,"error":"Unauthorized"}` | **200 + echte Chat-Titel, Previews, Token-Zahlen** |
|
||||
| `/api/files` | 401 | **200** |
|
||||
|
||||
Der Produktions-Build setzt die Authentifizierung nicht durch. Eine Umstellung hätte sämtliche Agent-Konversationen öffentlich gemacht. **Nicht auf `node server-entry.js` umstellen, bevor die Auth-Middleware im SSR-Pfad repariert ist.** Prüfkommando danach:
|
||||
|
||||
```bash
|
||||
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:PORT/api/sessions # muss 401 sein
|
||||
```
|
||||
|
||||
Verbleibender Nachteil des Dev-Servers: er liefert serverseitigen Quellcode aus (`/src/server/auth-middleware.ts`, `/vite.config.ts` → 200). **Keine Secrets betroffen** — `.env` und `/@fs/`-Zugriffe sind mit Vite 7.3.5 korrekt geblockt (403), im ausgelieferten Code stehen nur Variablennamen.
|
||||
|
||||
---
|
||||
|
||||
## 🎵 Melo App & Cloud
|
||||
|
||||
**Upload-Datenverlust behoben.** `upload()` verknüpfte bei >85 % Titel-Ähnlichkeit auf einen bestehenden Song und **verwarf die hochgeladene Datei** — Live-Versionen und Remixes wurden durch das Studio-Original ersetzt. Entfernt. Begründung durch Messung: 323 von 325 Songs haben einen gültigen Fingerprint (99,4 %), `fpcalc` läuft. Greift der Fingerprint nicht, ist das Audio nachweislich anders; ein Dateiname darf das nicht überstimmen.
|
||||
|
||||
End-to-End getestet (zwei verschiedene Audios, 94 % ähnliche Namen): neu → `new`, identisch → `linked` (SHA256-Dedup intakt), anderes Audio → `new` mit eigener ID. Gespeicherte Dateien byte-identisch mit den Originalen. Testdaten restlos entfernt (wieder 325 Songs, 0 verwaiste Einträge).
|
||||
|
||||
**`cgi`-Modul ersetzt.** Multipart-Parsing läuft jetzt über die stdlib (`email`); `cgi` ist seit Python 3.13 entfernt (PEP 594) — der Upload wäre beim Distro-Upgrade wortlos ausgefallen. Gegen `cgi.FieldStorage` byte-identisch getestet (Nullbytes, CRLF, Boundary-Sequenzen, Umlaute).
|
||||
|
||||
**`deletePlaylist` repariert.** Schickte POST auf `/api/v1/cloud/playlists`; der Server unterscheidet dort nach Methode (POST = anlegen, DELETE = löschen). Das Löschen landete im Anlegen-Handler, scheiterte an der Namensprüfung und lieferte HTTP 200 mit `status: error` — die UI meldete trotzdem Erfolg, die Playlist blieb. Jetzt DELETE, Rückgabewert wird ausgewertet, 3 Regressionstests.
|
||||
|
||||
- **202 Tests grün** (vorher 199), `flutter analyze` ohne Befund
|
||||
- Commit `2223813` auf Branch `fix/cloud-playlist-delete`, noch nicht auf `main`
|
||||
- `main` hat zusätzlich `v2.56.2` ungepusht
|
||||
|
||||
---
|
||||
|
||||
## 🧹 Aufgeräumt (~5 GB, 179 G → 184 G frei)
|
||||
|
||||
APT-Cache (1,1 G) · Build-Output des veralteten Duplikats `git/melo_app` (3,0 G) · npm-Cache · `gateway-restart.log` (29 M → 428 K) · drei leere Alt-Datenbanken in `/var/lib/melo-cloud/`.
|
||||
|
||||
**Nicht angefasst:** `.gradle/caches` (5,2 G) und `.hermes/profiles/server-security/home` (9,3 G — zweites Home mit eigenem Flutter, Chrome, Claude-Versionen). Beides regenerierbar, aber teuer bzw. potenziell in Benutzung.
|
||||
|
||||
---
|
||||
|
||||
## 📌 Offene Themen
|
||||
|
||||
- **`/home/dustin/scripts` ist kein Git-Repo.** ~3400 Zeilen Python tragen Auth und Musik-Cloud, völlig unversioniert. Einziger Schutz sind die Backups von heute. Eigenes Repo dringend empfohlen (`.gitignore` für `__pycache__` und Secrets).
|
||||
- **Auth-Middleware im SSR-Pfad von workspace** — Blocker für jeden Prod-Build.
|
||||
- **Versionsstrings der App widersprechen sich:** `main.dart:32` → 2.56.1, `settings_screen.dart:364` → 2.56.1, `settings_screen.dart:500` → 2.56.0, `home_screen.dart:1236` → 2.56.0. Nirgends 2.56.2. Besser eine Konstante, auf die alle vier zeigen.
|
||||
- **Passwortloses sudo bleibt bewusst.** `backup_and_cleanup.sh` läuft per Cron täglich 04:00 und braucht es — global entfernen bricht das Backup still. Falls Härtung: NOPASSWD auf die konkret nötigen Befehle einschränken und den Cron-Lauf testen.
|
||||
- **`_download`/`_stream` in `melo_cloud.py`** lesen ganze Dateien in den RAM (`fh.read()`), ebenso `download()` in der App (`r.bodyBytes`). Bei 50-MB-Songs und 7,7 GB RAM perspektivisch ein Thema.
|
||||
- Basic-Auth-Passwörter (`baka`, `dustin`, `tinker`) schützen jetzt deutlich mehr als vorher — falls eins schwach ist, wäre das der nächste Schritt.
|
||||
|
||||
---
|
||||
|
||||
## Verwandte Notizen
|
||||
- [[Server Aingrad - Komplette Übersicht]] — Dienst-Tabelle und Neustart-Befehle oben korrigieren
|
||||
- [[Melo App - Status]] — Stand dort ist v2.53.1, aktuell ist v2.56.2 + Fix-Branch
|
||||
@@ -0,0 +1,43 @@
|
||||
# Melo App - Status
|
||||
|
||||
> Stand: 05.08.2026 · v2.53.1 · arm64 · 21,0 MB
|
||||
|
||||
## Aktuelle Version
|
||||
- **v2.53.1** — Sprint D+E abgeschlossen, Review-FREIGABE
|
||||
- 143/143 Tests, 0 Lint-Issues
|
||||
- Push: `file:///home/dustin/gitea/data/git/repositories/baka/melo-app.git`
|
||||
|
||||
## Sync-System (v2.52-53)
|
||||
- Favoriten bidirektional (lokal ∪ Server, sofort-Push)
|
||||
- YT-Links nur Server-Fallback (kein Re-Download)
|
||||
- Tombstones mit Server-Zeitstempel
|
||||
- Auto-Sync Aus/1h/3h/6h/12h + Notification
|
||||
- Konflikt-Report bei >24h Offline
|
||||
|
||||
## Navigation (5 Tabs, Rechtshänder)
|
||||
```
|
||||
🏠 Start — Weiterhören, Recap (7T/Monat/Jahr)
|
||||
📚 Bibliothek — Songs, Alben, Künstler, Tags, Playlists, Downloads
|
||||
▶️ Jetzt läuft — Now-Playing-Fullscreen
|
||||
☁️ Cloud — Dashboard, Sync, Konflikt-Report
|
||||
⚙️ Mehr — Einstellungen, Erweitert
|
||||
```
|
||||
|
||||
## Versions-Historie
|
||||
| Version | Inhalt |
|
||||
|---------|--------|
|
||||
| v2.48 | Sprint A: Shuffle, Repeat, Queue, Sleep-Timer |
|
||||
| v2.49 | Sprint B: Now-Playing, Lyrics |
|
||||
| v2.50 | Glow-Pulsation, Crossfade, 98 Tests |
|
||||
| v2.51 | Sprint C: 5-Tabs, Cloud-Dashboard |
|
||||
| v2.52 | Sprint D: Favoriten-Sync, YT-Fallback, Einstellungen |
|
||||
| v2.53 | Sprint E: Recaps, Tombstones, Konflikt-Report |
|
||||
|
||||
## Offene Themen
|
||||
- Sprint F: Android Auto, Home-Widget, Equalizer
|
||||
- melo_cloud.py nicht versioniert (eigenes Repo empfohlen)
|
||||
- Tinker-Easter-Egg: "Illuminati Song"
|
||||
|
||||
## Verwandte Notizen
|
||||
- [[Server Aingrad - Komplette Übersicht]]
|
||||
- Merge-Dateien für Claude: lokal `~/notizen/melo-claude-briefing.md` + `melo-app-code.md`
|
||||
@@ -1,9 +1,8 @@
|
||||
# Server Aingrad – Komplette Übersicht
|
||||
|
||||
> Stand: 24.07.2026
|
||||
> Stand: 05.08.2026
|
||||
> IP: 159.195.51.99
|
||||
> ZeroTier: 10.19.81.21
|
||||
> System: Ubuntu 24.04 LTS, 4 Kerne, 8 GB RAM, 251 GB SSD
|
||||
> System: Ubuntu 24.04 LTS, 8 Kerne, 7.7 GB RAM, 2 GB Swap
|
||||
> Domain: baka-net.de
|
||||
|
||||
---
|
||||
@@ -15,13 +14,18 @@
|
||||
ssh dustin@159.195.51.99
|
||||
|
||||
# Docker-Container anzeigen
|
||||
docker ps
|
||||
sudo docker ps
|
||||
|
||||
# Logs eines Containers
|
||||
docker logs <container>
|
||||
sudo docker logs <container>
|
||||
|
||||
# Server neustarten
|
||||
sudo reboot
|
||||
# Caddy neu laden
|
||||
sudo systemctl reload caddy
|
||||
|
||||
# Auth/Cloud/YT-Prozesse neu starten
|
||||
sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 &
|
||||
sudo pkill -f melo_cloud.py && python3 /home/dustin/scripts/melo_cloud.py 8993 &
|
||||
sudo pkill -f yt_proxy.py && python3 /home/dustin/scripts/yt_proxy.py 8992 &
|
||||
|
||||
# Festplattenplatz prüfen
|
||||
df -h
|
||||
@@ -29,182 +33,37 @@ df -h
|
||||
# RAM/Nutzung prüfen
|
||||
free -m
|
||||
|
||||
# Hermes Gateway neustarten
|
||||
systemctl --user restart hermes-gateway
|
||||
# YT-Finder manuell
|
||||
python3 /home/dustin/scripts/yt_link_finder.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 1. Firewall (UFW) – Port-Freigaben
|
||||
## 🌍 Domains & Dienste
|
||||
|
||||
**Status:** `sudo ufw status`
|
||||
| URL | Dienst | Port | Zugriff |
|
||||
|-----|--------|------|---------|
|
||||
| https://baka-net.de | Dashboard (SPA) | 443 | Basic Auth |
|
||||
| https://baka-net.de/melo/ | Melo Downloads | 443 | Öffentlich |
|
||||
| https://cloud.baka-net.de | Melo Cloud API (v1) | 8993 | JWT |
|
||||
| https://musik.baka-net.de | Navidrome | 4533 | Proxy-Auth |
|
||||
| https://git.baka-net.de | Gitea | 3000 | Login |
|
||||
| https://yt.baka-net.de | YT-Proxy | 8992 | Bearer-JWT |
|
||||
| https://search.baka-net.de | SearXNG Meta-Suche | 8888 | Offen |
|
||||
| https://mc.baka-net.de | MC-Infoseite | — | Öffentlich |
|
||||
| Minecraft | Bedrock 1.26.36.1 | 19132/UDP | Offen, offline-mode |
|
||||
|
||||
| Erlaubt für | Port | Erklärung |
|
||||
|-------------|------|-----------|
|
||||
| SSH | 22/tcp | Server-Zugriff |
|
||||
| Web (Caddy) | 80, 443/tcp | Websites + SSL |
|
||||
| Syncthing | 22000/tcp+udp | Datei-Sync |
|
||||
| ZeroTier | 9993/udp | VPN-Netzwerk |
|
||||
| ZeroTier-Intern | Alle Ports auf `zt+` | Zugriff über sicheres VPN |
|
||||
## Docker-Container
|
||||
`anisette` · `synapse` · `navidrome` · `ladder` · `gitea` · `searxng`
|
||||
|
||||
---
|
||||
## Wichtigste Datenbanken
|
||||
- Baka-Auth: `/var/lib/melo-cloud/baka_auth.db`
|
||||
- Registry (325 Songs): `/var/lib/melo-cloud/registry.db`
|
||||
- Navidrome: 323 Songs, MusicFolder `/var/lib/melo-cloud/registry`
|
||||
|
||||
## 📦 2. Docker-Container
|
||||
## ⚠️ Legacy
|
||||
- API-Key `melo-cloud-2026-*` entfernt (v2.45, JWT ersetzt) — Build OHNE --dart-define
|
||||
|
||||
```bash
|
||||
docker ps # Laufende Container anzeigen
|
||||
docker ps -a # Alle Container (auch gestoppte)
|
||||
docker logs -f <name> # Live-Logs anzeigen
|
||||
docker restart <name> # Container neustarten
|
||||
docker stop <name> # Container stoppen
|
||||
docker system prune -af # Ungenutzte Docker-Daten löschen
|
||||
```
|
||||
|
||||
### Aktive Container
|
||||
|
||||
| Container | Port | Zweck |
|
||||
|-----------|------|-------|
|
||||
| **gitea** | `127.0.0.1:3000` | Eigenes Git-System (git.baka-net.de) |
|
||||
| **synapse** | `127.0.0.1:8008` | Matrix-Chat-Server (matrix.baka-net.de) |
|
||||
| **anisette** | `127.0.0.1:6969` | Anisette-V3 für iOS-Sideloading (anisette.baka-net.de) |
|
||||
|
||||
---
|
||||
|
||||
## 🌐 3. Caddy-Webserver (Domain-Routing)
|
||||
|
||||
**Konfiguration:** `/etc/caddy/Caddyfile`
|
||||
|
||||
```bash
|
||||
caddy reload # Konfiguration neu laden
|
||||
systemctl restart caddy # Caddy neustarten
|
||||
journalctl -u caddy -n 50 # Letzte 50 Log-Einträge
|
||||
```
|
||||
|
||||
| Domain | Weiterleitung auf |
|
||||
|--------|-------------------|
|
||||
| baka-net.de | Statische Webseite |
|
||||
| matrix.baka-net.de | localhost:8008 (Synapse) |
|
||||
| git.baka-net.de | localhost:3000 (Gitea) |
|
||||
| anisette.baka-net.de | localhost:6969 (Anisette-V3) |
|
||||
|
||||
---
|
||||
|
||||
## 🧰 4. Installierte Entwickler-Tools
|
||||
|
||||
```bash
|
||||
# Flutter & Dart (Android/iOS App-Entwicklung)
|
||||
export PATH="$HOME/development/flutter/bin:$PATH"
|
||||
flutter doctor # Status prüfen
|
||||
flutter build apk --release --split-per-abi # APK bauen
|
||||
|
||||
# Android SDK
|
||||
export ANDROID_HOME="$HOME/development/android-sdk"
|
||||
sdkmanager --list_installed # Installierte SDK-Versionen
|
||||
|
||||
# Java
|
||||
java -version # OpenJDK 17
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ 5. Security-Tools
|
||||
|
||||
### Gitleaks – Findet Secrets in Git-Repos
|
||||
```bash
|
||||
# Aktuelles Repo scannen
|
||||
gitleaks detect --source /pfad/zum/repo --verbose
|
||||
|
||||
# Nur geänderte Dateien vor Commit prüfen
|
||||
gitleaks detect --source . --log-level debug
|
||||
|
||||
# Komplette Git-Historie durchsuchen
|
||||
gitleaks detect --source /pfad/zum/repo --no-git
|
||||
```
|
||||
|
||||
### Trivy – Schwachstellen-Scanner
|
||||
```bash
|
||||
# Repository scannen
|
||||
trivy repo https://github.com/user/repo
|
||||
|
||||
# Dateisystem scannen
|
||||
trivy fs /pfad/zum/repo
|
||||
|
||||
# Docker-Image scannen
|
||||
trivy image alpine:latest
|
||||
```
|
||||
|
||||
### Semgrep – Statische Code-Analyse (SAST)
|
||||
```bash
|
||||
# Projekt analysieren
|
||||
semgrep --config=auto /pfad/zum/projekt
|
||||
|
||||
# Nach Sicherheitslücken suchen
|
||||
semgrep --config=p/default /pfad/zum/projekt
|
||||
|
||||
# Nur bestimmte Regeln
|
||||
semgrep --config=p/docker-security /pfad
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 6. Website-Klon-Tools
|
||||
|
||||
### HTTrack – Komplette Webseiten kopieren
|
||||
```bash
|
||||
# Komplette Seite runterladen
|
||||
httrack "https://example.com" -O /home/dustin/archiv/seite --depth=3
|
||||
|
||||
# Nur eine Seite + Ressourcen
|
||||
httrack "https://example.com/seite.html" -O /home/dustin/archiv/seite --depth=1
|
||||
|
||||
# Mit Benutzername/Passwort
|
||||
httrack "https://user:pass@example.com" -O /home/dustin/archiv/seite
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 7. Automatische Backups (Cron - 04:00 Uhr)
|
||||
|
||||
```bash
|
||||
# Backup-Skript manuell ausführen
|
||||
sudo /home/dustin/scripts/backup_and_cleanup.sh
|
||||
|
||||
# Backup-Ordner prüfen
|
||||
ls -lh /home/dustin/Sync/backups/
|
||||
|
||||
# Crontab anzeigen
|
||||
sudo crontab -l
|
||||
```
|
||||
|
||||
**Sichert automatisch:** Gitea-Daten + Synapse-Datenbank
|
||||
**Bereinigt:** Docker-Müll (`system prune`)
|
||||
**Backup-Ziel:** `/home/dustin/Sync/backups/` (7 Tage Aufbewahrung)
|
||||
|
||||
---
|
||||
|
||||
## 🧪 8. Weitere Tools
|
||||
|
||||
| Tool | Befehl | Zweck |
|
||||
|------|--------|-------|
|
||||
| ZeroTier | `zerotier-cli listnetworks` | VPN-Status prüfen |
|
||||
| Syncthing | `systemctl status syncthing@dustin` | Sync-Dienst prüfen |
|
||||
| ADB | `adb devices` | Android-Geräte-Liste |
|
||||
| Flutter | `flutter build apk --release --split-per-abi` | APK bauen |
|
||||
|
||||
---
|
||||
|
||||
## 📁 Wichtige Pfade
|
||||
|
||||
| Pfad | Inhalt |
|
||||
|------|--------|
|
||||
| `/home/dustin/` | Benutzer-Home |
|
||||
| `/home/dustin/git/` | Git-Repos |
|
||||
| `/home/dustin/git/melo_app/` | Melo App Quellcode |
|
||||
| `/home/dustin/development/` | Flutter + Android SDK |
|
||||
| `/home/dustin/hermes-vault/` | Notizen (Obsidian) |
|
||||
| `/home/dustin/.hermes/` | Hermes-Konfiguration |
|
||||
| `/home/dustin/scripts/` | Eigene Skripte |
|
||||
| `/home/dustin/Sync/` | Syncthing-Synchronisation |
|
||||
| `/home/dustin/Sync/backups/` | Backup-Archive |
|
||||
| `/home/dustin/musik/` | Musik-Ordner |
|
||||
| `/etc/caddy/Caddyfile` | Caddy-Konfiguration |
|
||||
## Verwandte Notizen
|
||||
- [[Melo App - Status]]
|
||||
- Detaillierte Zugangsdaten: lokal `~/notizen/baka-net-gesamt.md`
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
# Melo Cloud Sync – Phasen-Plan
|
||||
|
||||
> Stand: 26.07.2026
|
||||
> Server: Aingrad (Netcup RS 1000)
|
||||
> Technik: Python/Flask + SQLite + Symlinks
|
||||
|
||||
---
|
||||
|
||||
## 🔴 **Phase 1: Registry-Server**
|
||||
|
||||
```
|
||||
/var/lib/melo-cloud/
|
||||
├── registry/ ← Alle Songs (nur 1x physisch)
|
||||
│ └── abc123.mp3
|
||||
├── users/
|
||||
│ ├── baka/ ← Symlinks auf registry/
|
||||
│ └── melo/ ← Symlinks auf registry/
|
||||
└── covers/ ← Original-Cover von YouTube
|
||||
```
|
||||
|
||||
- [ ] Flask API (Port 8993)
|
||||
- [ ] SQLite DB mit `registry` + `user_songs` Tabellen
|
||||
- [ ] Auth per Navidrome-Credentials
|
||||
- [ ] Upload-API: SHA256-Check → fpcalc-Fingerprint → speichern in Registry → Hardlink
|
||||
- [ ] Deduplizierung: SHA256 + Fingerprint + Titel-Similarität (>90%)
|
||||
- [ ] Custom-Titel/Cover pro User
|
||||
- [ ] Systemd-Service `melo-cloud.service`
|
||||
|
||||
## 🟡 **Phase 2: Sync-API**
|
||||
|
||||
- [ ] `POST /api/cloud/upload` – MP3 hochladen + Registry-Check
|
||||
- [ ] `GET /api/cloud/download` – Song vom Server runterladen
|
||||
- [ ] `GET /api/cloud/list` – Alle eigenen Songs + Status
|
||||
- [ ] `DELETE /api/cloud/delete` – Link in User-Cloud löschen
|
||||
- [ ] `GET /api/cloud/status` – Übersicht (Count, letzter Sync)
|
||||
|
||||
## 🟢 **Phase 3: CloudScreen (Flutter)**
|
||||
|
||||
- [ ] Neuer Tab "Cloud" mit Bottom-Nav
|
||||
- [ ] Upload: Lokale MP3s → Server mit Fortschritt
|
||||
- [ ] Download: Server-Songs → Lokal (Batch)
|
||||
- [ ] Sync-Logik: `checkLocalVsServer()` → Diff anzeigen
|
||||
- [ ] Sync-Intervall: Manuell / 3h / 6h / 12h
|
||||
|
||||
## 🔵 **Phase 4: Playlist-Teilen**
|
||||
|
||||
- [ ] Share-Button → 6-stelliger Code generieren
|
||||
- [ ] Code eingeben → Playlist importieren
|
||||
- [ ] "Nur passende Songs" / "Alle inkl. fehlende" Auswahl
|
||||
- [ ] Matching: Per `registry.orig_title` → Levenshtein-Abgleich
|
||||
|
||||
## 🟣 **Phase 5: Geräteübergreifender Sync**
|
||||
|
||||
- [ ] Push-Benachrichtigung bei neuen Songs
|
||||
- [ ] Auto-Sync nach Intervall
|
||||
- [ ] Lösch-Sync über Geräte
|
||||
- [ ] Konflikte: Server = Source of Truth
|
||||
- [ ] Sync-Protokoll (letzte 50 Aktionen)
|
||||
Reference in New Issue
Block a user