mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-18 00:29:40 +02:00
style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write - TypeScript/JavaScript files - Svelte components - Astro pages - JSON configs - Markdown docs 13 files still need manual review (Astro JSX comments)
This commit is contained in:
parent
0241f5554c
commit
d36b321d9d
3952 changed files with 661498 additions and 739751 deletions
|
|
@ -1,396 +1,411 @@
|
|||
Redis Cache für uLoad - Was bringt es
|
||||
wirklich?
|
||||
Redis Cache für uLoad - Was bringt es
|
||||
wirklich?
|
||||
|
||||
Das Hauptproblem aktuell
|
||||
Das Hauptproblem aktuell
|
||||
|
||||
Jedes Mal wenn jemand einen deiner
|
||||
Short-Links klickt, muss deine App:
|
||||
1. PocketBase fragen "welche URL gehört zu
|
||||
diesem Short-Code?"
|
||||
2. Warten bis PocketBase in der SQLite
|
||||
Datei sucht
|
||||
3. Antwort zurückgeben und weiterleiten
|
||||
Jedes Mal wenn jemand einen deiner
|
||||
Short-Links klickt, muss deine App:
|
||||
|
||||
Das dauert 50-100ms pro Klick. Bei vielen
|
||||
Klicks wird PocketBase zum Flaschenhals.
|
||||
1. PocketBase fragen "welche URL gehört zu
|
||||
diesem Short-Code?"
|
||||
2. Warten bis PocketBase in der SQLite
|
||||
Datei sucht
|
||||
3. Antwort zurückgeben und weiterleiten
|
||||
|
||||
Was Redis ändern würde
|
||||
Das dauert 50-100ms pro Klick. Bei vielen
|
||||
Klicks wird PocketBase zum Flaschenhals.
|
||||
|
||||
Redis ist wie ein ultra-schneller
|
||||
Zwischenspeicher. Statt jedes Mal
|
||||
PocketBase zu fragen, schaust du erst in
|
||||
Redis nach. Das ist 20-50x schneller!
|
||||
Was Redis ändern würde
|
||||
|
||||
Die 3 größten Verbesserungen
|
||||
Redis ist wie ein ultra-schneller
|
||||
Zwischenspeicher. Statt jedes Mal
|
||||
PocketBase zu fragen, schaust du erst in
|
||||
Redis nach. Das ist 20-50x schneller!
|
||||
|
||||
1. Link-Redirects (90% deines Traffics)
|
||||
Die 3 größten Verbesserungen
|
||||
|
||||
Problem: Jeder Klick = PocketBase Query =
|
||||
langsam
|
||||
Lösung: Beliebte Links werden in Redis
|
||||
gespeichert
|
||||
1. Link-Redirects (90% deines Traffics)
|
||||
|
||||
Beispiel:
|
||||
- Dein Link "ulo.ad/meeting" wird 100x am
|
||||
Problem: Jeder Klick = PocketBase Query =
|
||||
langsam
|
||||
Lösung: Beliebte Links werden in Redis
|
||||
gespeichert
|
||||
|
||||
Beispiel:
|
||||
|
||||
- Dein Link "ulo.ad/meeting" wird 100x am
|
||||
Tag geklickt
|
||||
- Ohne Redis: 100x PocketBase Query (100x
|
||||
- Ohne Redis: 100x PocketBase Query (100x
|
||||
80ms = 8 Sekunden Serverzeit)
|
||||
- Mit Redis: 1x PocketBase + 99x Redis (1x
|
||||
- Mit Redis: 1x PocketBase + 99x Redis (1x
|
||||
80ms + 99x 2ms = 0.28 Sekunden)
|
||||
|
||||
Ergebnis: 30x schneller, 95% weniger
|
||||
PocketBase Last
|
||||
Ergebnis: 30x schneller, 95% weniger
|
||||
PocketBase Last
|
||||
|
||||
2. Dashboard Performance
|
||||
2. Dashboard Performance
|
||||
|
||||
Problem: Dein Dashboard lädt alle deine
|
||||
Links aus PocketBase
|
||||
Lösung: Links werden für 5 Minuten gecacht
|
||||
Problem: Dein Dashboard lädt alle deine
|
||||
Links aus PocketBase
|
||||
Lösung: Links werden für 5 Minuten gecacht
|
||||
|
||||
Beispiel:
|
||||
- Du hast 50 Links, checkst Dashboard 20x
|
||||
Beispiel:
|
||||
|
||||
- Du hast 50 Links, checkst Dashboard 20x
|
||||
am Tag
|
||||
- Ohne Redis: 20x komplette Liste laden =
|
||||
- Ohne Redis: 20x komplette Liste laden =
|
||||
langsam
|
||||
- Mit Redis: 1x laden, 19x aus Cache =
|
||||
- Mit Redis: 1x laden, 19x aus Cache =
|
||||
blitzschnell
|
||||
|
||||
3. Analytics & Statistiken
|
||||
3. Analytics & Statistiken
|
||||
|
||||
Problem: Click-Zahlen berechnen ist langsam
|
||||
(viele Datenbankabfragen)
|
||||
Lösung: Statistiken werden live berechnet
|
||||
und gecacht
|
||||
Problem: Click-Zahlen berechnen ist langsam
|
||||
(viele Datenbankabfragen)
|
||||
Lösung: Statistiken werden live berechnet
|
||||
und gecacht
|
||||
|
||||
Beispiel:
|
||||
- "Zeige Clicks der letzten 7 Tage" braucht
|
||||
normalerweise komplizierte Queries
|
||||
- Mit Redis: Zahlen werden kontinuierlich
|
||||
Beispiel:
|
||||
|
||||
- "Zeige Clicks der letzten 7 Tage" braucht
|
||||
normalerweise komplizierte Queries
|
||||
- Mit Redis: Zahlen werden kontinuierlich
|
||||
aktualisiert, sofort verfügbar
|
||||
|
||||
Rate Limiting Verbesserung
|
||||
Rate Limiting Verbesserung
|
||||
|
||||
Aktuell: Dein Rate Limiter vergisst alles
|
||||
bei Server-Restart
|
||||
Mit Redis: Rate Limits bleiben bestehen,
|
||||
auch über Restarts hinweg
|
||||
Aktuell: Dein Rate Limiter vergisst alles
|
||||
bei Server-Restart
|
||||
Mit Redis: Rate Limits bleiben bestehen,
|
||||
auch über Restarts hinweg
|
||||
|
||||
Das bedeutet: Angreifer können nicht mehr
|
||||
durch Server-Restart deine Limits umgehen.
|
||||
Das bedeutet: Angreifer können nicht mehr
|
||||
durch Server-Restart deine Limits umgehen.
|
||||
|
||||
Konkrete Zahlen für dich
|
||||
Konkrete Zahlen für dich
|
||||
|
||||
Traffic-Verteilung schätzen:
|
||||
Traffic-Verteilung schätzen:
|
||||
|
||||
- 90% Redirects (Leute klicken deine Links)
|
||||
- 8% Dashboard/API (Du managst deine Links)
|
||||
- 90% Redirects (Leute klicken deine Links)
|
||||
- 8% Dashboard/API (Du managst deine Links)
|
||||
|
||||
- 2% Sonstiges (Login, Settings, etc.)
|
||||
- 2% Sonstiges (Login, Settings, etc.)
|
||||
|
||||
Performance ohne Redis:
|
||||
Performance ohne Redis:
|
||||
|
||||
- Redirect: 80ms durchschnittlich
|
||||
- Dashboard laden: 300ms
|
||||
- Bei 1000 Klicks/Tag: PocketBase ist
|
||||
- Redirect: 80ms durchschnittlich
|
||||
- Dashboard laden: 300ms
|
||||
- Bei 1000 Klicks/Tag: PocketBase ist
|
||||
gestresst
|
||||
|
||||
Performance mit Redis:
|
||||
Performance mit Redis:
|
||||
|
||||
- Redirect: 5ms (95% aus Cache)
|
||||
- Dashboard laden: 20ms (meist aus Cache)
|
||||
- Bei 10.000 Klicks/Tag: PocketBase
|
||||
- Redirect: 5ms (95% aus Cache)
|
||||
- Dashboard laden: 20ms (meist aus Cache)
|
||||
- Bei 10.000 Klicks/Tag: PocketBase
|
||||
entspannt
|
||||
|
||||
Wann merkst du den Unterschied?
|
||||
Wann merkst du den Unterschied?
|
||||
|
||||
Sofort spürbar:
|
||||
Sofort spürbar:
|
||||
|
||||
- Dashboard lädt viel schneller (besonders
|
||||
- Dashboard lädt viel schneller (besonders
|
||||
mit vielen Links)
|
||||
- Redirects sind blitzschnell
|
||||
- Analytics laden sofort statt zu "denken"
|
||||
- Redirects sind blitzschnell
|
||||
- Analytics laden sofort statt zu "denken"
|
||||
|
||||
Bei mehr Traffic:
|
||||
Bei mehr Traffic:
|
||||
|
||||
- Server bleibt entspannt auch bei
|
||||
- Server bleibt entspannt auch bei
|
||||
Viral-Links
|
||||
- Keine Timeouts mehr bei hoher Last
|
||||
- PocketBase überlastet nicht
|
||||
- Keine Timeouts mehr bei hoher Last
|
||||
- PocketBase überlastet nicht
|
||||
|
||||
Skalierung:
|
||||
Skalierung:
|
||||
|
||||
- Ohne Redis: ~500 Redirects/Minute machbar
|
||||
- Mit Redis: ~5000+ Redirects/Minute
|
||||
- Ohne Redis: ~500 Redirects/Minute machbar
|
||||
- Mit Redis: ~5000+ Redirects/Minute
|
||||
machbar
|
||||
|
||||
Kosten vs. Nutzen
|
||||
Kosten vs. Nutzen
|
||||
|
||||
Option 1: Kostenlos starten
|
||||
Option 1: Kostenlos starten
|
||||
|
||||
- Upstash Redis (10k Commands/Tag gratis)
|
||||
- Perfekt zum Testen
|
||||
- Upgrade wenn nötig
|
||||
- Upstash Redis (10k Commands/Tag gratis)
|
||||
- Perfekt zum Testen
|
||||
- Upgrade wenn nötig
|
||||
|
||||
Option 2: Minimale Kosten
|
||||
Option 2: Minimale Kosten
|
||||
|
||||
- €5-15/Monat für ordentlichen Redis
|
||||
- Dafür 10x bessere Performance
|
||||
- €5-15/Monat für ordentlichen Redis
|
||||
- Dafür 10x bessere Performance
|
||||
|
||||
Was du sparst:
|
||||
Was du sparst:
|
||||
|
||||
- Weniger Server-Stress = längere
|
||||
- Weniger Server-Stress = längere
|
||||
Hardware-Lebensdauer
|
||||
- Bessere User Experience = mehr zufriedene
|
||||
Nutzer
|
||||
- Skalierung möglich ohne neuen Server
|
||||
- Bessere User Experience = mehr zufriedene
|
||||
Nutzer
|
||||
- Skalierung möglich ohne neuen Server
|
||||
|
||||
Die Realität für uLoad
|
||||
Die Realität für uLoad
|
||||
|
||||
Jetzt: Bei 100 Klicks gleichzeitig würde
|
||||
dein Server wahrscheinlich strugglen
|
||||
Mit Redis: Bei 1000 Klicks gleichzeitig
|
||||
läuft alles smooth
|
||||
Jetzt: Bei 100 Klicks gleichzeitig würde
|
||||
dein Server wahrscheinlich strugglen
|
||||
Mit Redis: Bei 1000 Klicks gleichzeitig
|
||||
läuft alles smooth
|
||||
|
||||
Jetzt: Dashboard mit 100 Links braucht eine
|
||||
Sekunde zum Laden
|
||||
Mit Redis: Dashboard lädt in 0.1 Sekunden
|
||||
Jetzt: Dashboard mit 100 Links braucht eine
|
||||
Sekunde zum Laden
|
||||
Mit Redis: Dashboard lädt in 0.1 Sekunden
|
||||
|
||||
Jetzt: Click-Statistiken berechnen dauert
|
||||
ewig
|
||||
Mit Redis: Statistiken sind immer aktuell
|
||||
und sofort da
|
||||
Jetzt: Click-Statistiken berechnen dauert
|
||||
ewig
|
||||
Mit Redis: Statistiken sind immer aktuell
|
||||
und sofort da
|
||||
|
||||
Meine ehrliche Einschätzung
|
||||
Meine ehrliche Einschätzung
|
||||
|
||||
Für uLoad ist Redis ein No-Brainer:
|
||||
- Minimaler Aufwand (2-3 Tage Setup)
|
||||
- Maximaler Nutzen (10x Performance)
|
||||
- Kosten fast null (kann gratis starten)
|
||||
Für uLoad ist Redis ein No-Brainer:
|
||||
|
||||
Der größte Gewinn ist bei Redirects - das
|
||||
ist dein Kernfeature und wird damit
|
||||
ultra-schnell. Plus du bist ready für
|
||||
Viral-Links die plötzlich 1000x geklickt
|
||||
werden.
|
||||
- Minimaler Aufwand (2-3 Tage Setup)
|
||||
- Maximaler Nutzen (10x Performance)
|
||||
- Kosten fast null (kann gratis starten)
|
||||
|
||||
Bottom Line: Redis macht aus deinem "hobby
|
||||
project" eine professionelle, skalierbare
|
||||
Anwendung für praktisch null Zusatzkosten.
|
||||
Das ist vermutlich das beste ROI was du
|
||||
kriegen kannst! 🎯
|
||||
Der größte Gewinn ist bei Redirects - das
|
||||
ist dein Kernfeature und wird damit
|
||||
ultra-schnell. Plus du bist ready für
|
||||
Viral-Links die plötzlich 1000x geklickt
|
||||
werden.
|
||||
|
||||
> super danke. wir können ja reddis auch
|
||||
einfach auf unserem hetzter vps mit coolify
|
||||
hochfahren oder? was brucht es an
|
||||
reccourcen? was mus man beachten? sollte es
|
||||
lieber auf einem adnere server liegen?
|
||||
sollte es im gleichen project in coolify
|
||||
liegen?
|
||||
Bottom Line: Redis macht aus deinem "hobby
|
||||
project" eine professionelle, skalierbare
|
||||
Anwendung für praktisch null Zusatzkosten.
|
||||
Das ist vermutlich das beste ROI was du
|
||||
kriegen kannst! 🎯
|
||||
|
||||
⏺ Redis auf Hetzner VPS mit Coolify -
|
||||
Perfekte Idee!
|
||||
> super danke. wir können ja reddis auch
|
||||
> einfach auf unserem hetzter vps mit coolify
|
||||
> hochfahren oder? was brucht es an
|
||||
> reccourcen? was mus man beachten? sollte es
|
||||
> lieber auf einem adnere server liegen?
|
||||
> sollte es im gleichen project in coolify
|
||||
> liegen?
|
||||
|
||||
Ja, absolut machbar und sinnvoll!
|
||||
⏺ Redis auf Hetzner VPS mit Coolify -
|
||||
Perfekte Idee!
|
||||
|
||||
Dein aktueller Hetzner VPS kann Redis
|
||||
problemlos mit hosten. Coolify macht das
|
||||
super einfach.
|
||||
Ja, absolut machbar und sinnvoll!
|
||||
|
||||
Resource-Bedarf von Redis
|
||||
Dein aktueller Hetzner VPS kann Redis
|
||||
problemlos mit hosten. Coolify macht das
|
||||
super einfach.
|
||||
|
||||
RAM (das Wichtigste):
|
||||
Resource-Bedarf von Redis
|
||||
|
||||
- Redis lädt alles in den RAM - das macht
|
||||
RAM (das Wichtigste):
|
||||
|
||||
- Redis lädt alles in den RAM - das macht
|
||||
es so schnell
|
||||
- Für uLoad geschätzt: 50-200MB RAM
|
||||
- Link Cache: ~1MB pro 10.000 Links
|
||||
- Session Cache: ~10MB für 1000 aktive
|
||||
User
|
||||
- Analytics: ~20-50MB je nach History
|
||||
- Rate Limiting: ~5-10MB
|
||||
- Für uLoad geschätzt: 50-200MB RAM
|
||||
- Link Cache: ~1MB pro 10.000 Links
|
||||
- Session Cache: ~10MB für 1000 aktive
|
||||
User
|
||||
- Analytics: ~20-50MB je nach History
|
||||
- Rate Limiting: ~5-10MB
|
||||
|
||||
CPU:
|
||||
CPU:
|
||||
|
||||
- Minimal! Redis ist extrem CPU-effizient
|
||||
- Für uLoad: <1% CPU Auslastung
|
||||
- Nur bei komplexen Operationen mehr
|
||||
- Minimal! Redis ist extrem CPU-effizient
|
||||
- Für uLoad: <1% CPU Auslastung
|
||||
- Nur bei komplexen Operationen mehr
|
||||
|
||||
Disk:
|
||||
Disk:
|
||||
|
||||
- Persistence: 100-500MB für Dumps
|
||||
- Logs: 10-50MB
|
||||
- Total: <1GB
|
||||
- Persistence: 100-500MB für Dumps
|
||||
- Logs: 10-50MB
|
||||
- Total: <1GB
|
||||
|
||||
Dein CX21 VPS Kapazität:
|
||||
Dein CX21 VPS Kapazität:
|
||||
|
||||
- RAM: 8GB total, aktuell ~2GB verwendet →
|
||||
- RAM: 8GB total, aktuell ~2GB verwendet →
|
||||
6GB frei!
|
||||
- CPU: 2 vCPUs, aktuell <20% → Mehr als
|
||||
- CPU: 2 vCPUs, aktuell <20% → Mehr als
|
||||
genug
|
||||
- Disk: 40GB, Redis braucht <1GB → Kein
|
||||
- Disk: 40GB, Redis braucht <1GB → Kein
|
||||
Problem
|
||||
|
||||
Fazit: Dein Server kann Redis locker
|
||||
verkraften! 🎯
|
||||
Fazit: Dein Server kann Redis locker
|
||||
verkraften! 🎯
|
||||
|
||||
Coolify Setup - zwei Optionen
|
||||
Coolify Setup - zwei Optionen
|
||||
|
||||
Option 1: Gleiches Projekt (Empfohlen für
|
||||
Start)
|
||||
Option 1: Gleiches Projekt (Empfohlen für
|
||||
Start)
|
||||
|
||||
# Einfach Redis Service zu deinem
|
||||
bestehenden docker-compose hinzufügen
|
||||
services:
|
||||
app:
|
||||
# Deine bestehende App
|
||||
# Einfach Redis Service zu deinem
|
||||
|
||||
bestehenden docker-compose hinzufügen
|
||||
services:
|
||||
app: # Deine bestehende App
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
command: redis-server --appendonly yes
|
||||
--maxmemory 512mb --maxmemory-policy
|
||||
allkeys-lru
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
redis-data:
|
||||
--maxmemory 512mb --maxmemory-policy
|
||||
allkeys-lru
|
||||
volumes: - redis-data:/data
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
Option 2: Separates Projekt in Coolify
|
||||
volumes:
|
||||
redis-data:
|
||||
|
||||
- Vorteil: Unabhängiges Deployment von
|
||||
Option 2: Separates Projekt in Coolify
|
||||
|
||||
- Vorteil: Unabhängiges Deployment von
|
||||
deiner App
|
||||
- Nachteil: Etwas komplizierter zu
|
||||
- Nachteil: Etwas komplizierter zu
|
||||
verwalten
|
||||
|
||||
Ich empfehle Option 1 - Redis ist so
|
||||
stabil, das macht keinen Unterschied.
|
||||
Ich empfehle Option 1 - Redis ist so
|
||||
stabil, das macht keinen Unterschied.
|
||||
|
||||
Coolify Konfiguration
|
||||
Coolify Konfiguration
|
||||
|
||||
Redis Environment Variables:
|
||||
Redis Environment Variables:
|
||||
|
||||
# In Coolify für Redis Service setzen:
|
||||
REDIS_PASSWORD=dein-sicheres-passwort-hier
|
||||
REDIS_MAXMEMORY=512mb
|
||||
REDIS_SAVE_INTERVAL=900 # Auto-save alle
|
||||
15 Min
|
||||
# In Coolify für Redis Service setzen:
|
||||
|
||||
Deine App erweitern:
|
||||
REDIS_PASSWORD=dein-sicheres-passwort-hier
|
||||
REDIS_MAXMEMORY=512mb
|
||||
REDIS_SAVE_INTERVAL=900 # Auto-save alle
|
||||
15 Min
|
||||
|
||||
# Environment Variable für deine App
|
||||
hinzufügen:
|
||||
REDIS_URL=redis://:dein-passwort@redis:6379
|
||||
Deine App erweitern:
|
||||
|
||||
Networking in Coolify:
|
||||
# Environment Variable für deine App
|
||||
|
||||
- Redis und App sind automatisch im
|
||||
hinzufügen:
|
||||
REDIS_URL=redis://:dein-passwort@redis:6379
|
||||
|
||||
Networking in Coolify:
|
||||
|
||||
- Redis und App sind automatisch im
|
||||
gleichen Docker Network
|
||||
- Deine App kann Redis über redis:6379
|
||||
- Deine App kann Redis über redis:6379
|
||||
erreichen
|
||||
- Kein Port nach außen öffnen nötig
|
||||
- Kein Port nach außen öffnen nötig
|
||||
(Sicherheit!)
|
||||
|
||||
Wichtige Redis Konfiguration
|
||||
Wichtige Redis Konfiguration
|
||||
|
||||
Memory Management:
|
||||
Memory Management:
|
||||
|
||||
# Redis Config (über Command Parameter):
|
||||
--maxmemory 512mb # Begrenze RAM Nutzung
|
||||
--maxmemory-policy allkeys-lru # Alte Keys
|
||||
löschen wenn voll
|
||||
# Redis Config (über Command Parameter):
|
||||
|
||||
Persistence:
|
||||
--maxmemory 512mb # Begrenze RAM Nutzung
|
||||
--maxmemory-policy allkeys-lru # Alte Keys
|
||||
löschen wenn voll
|
||||
|
||||
# Zwei Optionen kombinieren:
|
||||
--appendonly yes # AOF für Durability
|
||||
--save 900 1 # RDB Snapshot alle 15
|
||||
Min
|
||||
Persistence:
|
||||
|
||||
Security:
|
||||
# Zwei Optionen kombinieren:
|
||||
|
||||
# Passwort setzen:
|
||||
--requirepass dein-starkes-passwort
|
||||
--appendonly yes # AOF für Durability
|
||||
--save 900 1 # RDB Snapshot alle 15
|
||||
Min
|
||||
|
||||
# Gefährliche Commands deaktivieren:
|
||||
--rename-command FLUSHDB ""
|
||||
--rename-command FLUSHALL ""
|
||||
Security:
|
||||
|
||||
Monitoring in Coolify
|
||||
# Passwort setzen:
|
||||
|
||||
Redis Logs überwachen:
|
||||
--requirepass dein-starkes-passwort
|
||||
|
||||
- Coolify zeigt Redis Logs in Echtzeit
|
||||
- Achte auf Memory Warnings
|
||||
- Connection Errors beobachten
|
||||
# Gefährliche Commands deaktivieren:
|
||||
|
||||
Wichtige Redis Metriken:
|
||||
--rename-command FLUSHDB ""
|
||||
--rename-command FLUSHALL ""
|
||||
|
||||
# Commands zum Monitoring (über redis-cli):
|
||||
INFO memory # RAM Nutzung
|
||||
INFO stats # Operations/sec
|
||||
INFO clients # Verbindungen
|
||||
MONITOR # Live Commands (nur
|
||||
zum Debugging!)
|
||||
Monitoring in Coolify
|
||||
|
||||
Backup Strategy
|
||||
Redis Logs überwachen:
|
||||
|
||||
Automatische Redis Backups:
|
||||
- Coolify zeigt Redis Logs in Echtzeit
|
||||
- Achte auf Memory Warnings
|
||||
- Connection Errors beobachten
|
||||
|
||||
# Script in deinem Container:
|
||||
#!/bin/bash
|
||||
# redis-backup.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
Wichtige Redis Metriken:
|
||||
|
||||
# Commands zum Monitoring (über redis-cli):
|
||||
|
||||
INFO memory # RAM Nutzung
|
||||
INFO stats # Operations/sec
|
||||
INFO clients # Verbindungen
|
||||
MONITOR # Live Commands (nur
|
||||
zum Debugging!)
|
||||
|
||||
Backup Strategy
|
||||
|
||||
Automatische Redis Backups:
|
||||
|
||||
# Script in deinem Container:
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
# redis-backup.sh
|
||||
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
redis-cli --rdb
|
||||
/backups/redis_backup_$DATE.rdb
|
||||
|
||||
# In Coolify als Cron Job alle 6 Stunden
|
||||
# In Coolify als Cron Job alle 6 Stunden
|
||||
|
||||
Oder einfacher:
|
||||
Oder einfacher:
|
||||
|
||||
# Volume Mount für Persistence reicht:
|
||||
volumes:
|
||||
- redis-data:/data # Redis saved
|
||||
automatisch hier
|
||||
# Volume Mount für Persistence reicht:
|
||||
|
||||
Separater Server - wann sinnvoll?
|
||||
volumes: - redis-data:/data # Redis saved
|
||||
automatisch hier
|
||||
|
||||
Bleib bei einem Server wenn:
|
||||
Separater Server - wann sinnvoll?
|
||||
|
||||
- <10.000 Requests/Tag (definitiv dein
|
||||
Bleib bei einem Server wenn:
|
||||
|
||||
- <10.000 Requests/Tag (definitiv dein
|
||||
Fall)
|
||||
- <1000 gleichzeitige User
|
||||
- Development/Early Stage (definitiv dein
|
||||
- <1000 gleichzeitige User
|
||||
- Development/Early Stage (definitiv dein
|
||||
Fall)
|
||||
|
||||
Separater Redis Server nur bei:
|
||||
Separater Redis Server nur bei:
|
||||
|
||||
- >100.000 Requests/Tag
|
||||
- Multi-Region Setup
|
||||
- Dedicated Redis Cluster mit Failover
|
||||
- > 100.000 Requests/Tag
|
||||
- Multi-Region Setup
|
||||
- Dedicated Redis Cluster mit Failover
|
||||
|
||||
Für uLoad: Ein Server reicht völlig!
|
||||
Für uLoad: Ein Server reicht völlig!
|
||||
|
||||
Coolify Deployment Steps
|
||||
Coolify Deployment Steps
|
||||
|
||||
1. Docker Compose erweitern:
|
||||
1. Docker Compose erweitern:
|
||||
|
||||
# Zu deiner bestehenden docker-compose.yml
|
||||
hinzufügen:
|
||||
services:
|
||||
# ... deine bestehenden Services
|
||||
# Zu deiner bestehenden docker-compose.yml
|
||||
|
||||
hinzufügen:
|
||||
services: # ... deine bestehenden Services
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
command: >
|
||||
redis-server
|
||||
--appendonly yes
|
||||
--maxmemory 512mb
|
||||
redis-server
|
||||
--appendonly yes
|
||||
--maxmemory 512mb
|
||||
--maxmemory-policy allkeys-lru
|
||||
--requirepass ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
|
|
@ -400,92 +415,99 @@ Redis Cache für uLoad - Was bringt es
|
|||
- app-network
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "-a",
|
||||
"${REDIS_PASSWORD}", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
redis-data:
|
||||
"${REDIS_PASSWORD}", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
volumes:
|
||||
redis-data:
|
||||
|
||||
2. Environment Variables in Coolify:
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
|
||||
# Für Redis:
|
||||
REDIS_PASSWORD=SuperSecurePassword123!
|
||||
2. Environment Variables in Coolify:
|
||||
|
||||
# Für deine App:
|
||||
REDIS_URL=redis://:SuperSecurePassword123!@
|
||||
redis:6379
|
||||
# Für Redis:
|
||||
|
||||
3. Deploy & Test:
|
||||
REDIS_PASSWORD=SuperSecurePassword123!
|
||||
|
||||
- Coolify deployed automatisch
|
||||
- Teste Connection aus deiner App
|
||||
- Check Redis Logs für Errors
|
||||
# Für deine App:
|
||||
|
||||
Was beachten?
|
||||
REDIS_URL=redis://:SuperSecurePassword123!@
|
||||
redis:6379
|
||||
|
||||
Security:
|
||||
3. Deploy & Test:
|
||||
|
||||
- Passwort setzen (Redis hat standardmäßig
|
||||
- Coolify deployed automatisch
|
||||
- Teste Connection aus deiner App
|
||||
- Check Redis Logs für Errors
|
||||
|
||||
Was beachten?
|
||||
|
||||
Security:
|
||||
|
||||
- Passwort setzen (Redis hat standardmäßig
|
||||
keins!)
|
||||
- Port nicht öffentlich machen (nur intern)
|
||||
- Command Renaming für gefährliche Commands
|
||||
- Port nicht öffentlich machen (nur intern)
|
||||
- Command Renaming für gefährliche Commands
|
||||
|
||||
Performance:
|
||||
Performance:
|
||||
|
||||
- Memory Limit setzen (512MB reicht für
|
||||
- Memory Limit setzen (512MB reicht für
|
||||
Start)
|
||||
- LRU Policy aktivieren (alte Keys werden
|
||||
- LRU Policy aktivieren (alte Keys werden
|
||||
gelöscht)
|
||||
- Connection Pooling in deiner App
|
||||
- Connection Pooling in deiner App
|
||||
|
||||
Monitoring:
|
||||
Monitoring:
|
||||
|
||||
- Redis Logs in Coolify beobachten
|
||||
- Memory Usage im Auge behalten
|
||||
- Hit Rate messen (wie oft Cache getroffen
|
||||
- Redis Logs in Coolify beobachten
|
||||
- Memory Usage im Auge behalten
|
||||
- Hit Rate messen (wie oft Cache getroffen
|
||||
wird)
|
||||
|
||||
Troubleshooting
|
||||
Troubleshooting
|
||||
|
||||
Häufige Probleme:
|
||||
Häufige Probleme:
|
||||
|
||||
1. Connection refused: Redis Service nicht
|
||||
gestartet
|
||||
2. Auth failed: Passwort falsch oder nicht
|
||||
gesetzt
|
||||
3. Memory full: Maxmemory erreicht, LRU
|
||||
Policy prüfen
|
||||
1. Connection refused: Redis Service nicht
|
||||
gestartet
|
||||
2. Auth failed: Passwort falsch oder nicht
|
||||
gesetzt
|
||||
3. Memory full: Maxmemory erreicht, LRU
|
||||
Policy prüfen
|
||||
|
||||
Debug Commands:
|
||||
Debug Commands:
|
||||
|
||||
# In Coolify Terminal (Redis Container):
|
||||
redis-cli -a dein-passwort info
|
||||
redis-cli -a dein-passwort ping
|
||||
redis-cli -a dein-passwort client list
|
||||
# In Coolify Terminal (Redis Container):
|
||||
|
||||
Meine Empfehlung
|
||||
redis-cli -a dein-passwort info
|
||||
redis-cli -a dein-passwort ping
|
||||
redis-cli -a dein-passwort client list
|
||||
|
||||
Setup für uLoad:
|
||||
1. Gleicher Server (Hetzner VPS) ✅
|
||||
2. Gleiches Coolify Projekt ✅
|
||||
3. 512MB Memory Limit ✅
|
||||
4. Passwort-geschützt ✅
|
||||
5. Persistence aktiviert ✅
|
||||
Meine Empfehlung
|
||||
|
||||
Vorteile:
|
||||
- Einfachste Lösung
|
||||
- Keine Extra-Kosten
|
||||
- Latenz minimal (gleicher Server)
|
||||
- Easy zu verwalten
|
||||
Setup für uLoad:
|
||||
|
||||
Nachteile:
|
||||
- Keine (für deine Use Case)
|
||||
1. Gleicher Server (Hetzner VPS) ✅
|
||||
2. Gleiches Coolify Projekt ✅
|
||||
3. 512MB Memory Limit ✅
|
||||
4. Passwort-geschützt ✅
|
||||
5. Persistence aktiviert ✅
|
||||
|
||||
Redis auf deinem bestehenden Setup ist der
|
||||
perfekte nächste Schritt! 🚀
|
||||
Vorteile:
|
||||
|
||||
- Einfachste Lösung
|
||||
- Keine Extra-Kosten
|
||||
- Latenz minimal (gleicher Server)
|
||||
- Easy zu verwalten
|
||||
|
||||
Nachteile:
|
||||
|
||||
- Keine (für deine Use Case)
|
||||
|
||||
Redis auf deinem bestehenden Setup ist der
|
||||
perfekte nächste Schritt! 🚀
|
||||
|
|
|
|||
|
|
@ -1,180 +1,185 @@
|
|||
Redis Cache für uLoad - Was bringt es
|
||||
wirklich?
|
||||
Redis Cache für uLoad - Was bringt es
|
||||
wirklich?
|
||||
|
||||
Das Hauptproblem aktuell
|
||||
Das Hauptproblem aktuell
|
||||
|
||||
Jedes Mal wenn jemand einen deiner
|
||||
Short-Links klickt, muss deine App:
|
||||
1. PocketBase fragen "welche URL gehört zu
|
||||
diesem Short-Code?"
|
||||
2. Warten bis PocketBase in der SQLite
|
||||
Datei sucht
|
||||
3. Antwort zurückgeben und weiterleiten
|
||||
Jedes Mal wenn jemand einen deiner
|
||||
Short-Links klickt, muss deine App:
|
||||
|
||||
Das dauert 50-100ms pro Klick. Bei vielen
|
||||
Klicks wird PocketBase zum Flaschenhals.
|
||||
1. PocketBase fragen "welche URL gehört zu
|
||||
diesem Short-Code?"
|
||||
2. Warten bis PocketBase in der SQLite
|
||||
Datei sucht
|
||||
3. Antwort zurückgeben und weiterleiten
|
||||
|
||||
Was Redis ändern würde
|
||||
Das dauert 50-100ms pro Klick. Bei vielen
|
||||
Klicks wird PocketBase zum Flaschenhals.
|
||||
|
||||
Redis ist wie ein ultra-schneller
|
||||
Zwischenspeicher. Statt jedes Mal
|
||||
PocketBase zu fragen, schaust du erst in
|
||||
Redis nach. Das ist 20-50x schneller!
|
||||
Was Redis ändern würde
|
||||
|
||||
Die 3 größten Verbesserungen
|
||||
Redis ist wie ein ultra-schneller
|
||||
Zwischenspeicher. Statt jedes Mal
|
||||
PocketBase zu fragen, schaust du erst in
|
||||
Redis nach. Das ist 20-50x schneller!
|
||||
|
||||
1. Link-Redirects (90% deines Traffics)
|
||||
Die 3 größten Verbesserungen
|
||||
|
||||
Problem: Jeder Klick = PocketBase Query =
|
||||
langsam
|
||||
Lösung: Beliebte Links werden in Redis
|
||||
gespeichert
|
||||
1. Link-Redirects (90% deines Traffics)
|
||||
|
||||
Beispiel:
|
||||
- Dein Link "ulo.ad/meeting" wird 100x am
|
||||
Problem: Jeder Klick = PocketBase Query =
|
||||
langsam
|
||||
Lösung: Beliebte Links werden in Redis
|
||||
gespeichert
|
||||
|
||||
Beispiel:
|
||||
|
||||
- Dein Link "ulo.ad/meeting" wird 100x am
|
||||
Tag geklickt
|
||||
- Ohne Redis: 100x PocketBase Query (100x
|
||||
- Ohne Redis: 100x PocketBase Query (100x
|
||||
80ms = 8 Sekunden Serverzeit)
|
||||
- Mit Redis: 1x PocketBase + 99x Redis (1x
|
||||
- Mit Redis: 1x PocketBase + 99x Redis (1x
|
||||
80ms + 99x 2ms = 0.28 Sekunden)
|
||||
|
||||
Ergebnis: 30x schneller, 95% weniger
|
||||
PocketBase Last
|
||||
Ergebnis: 30x schneller, 95% weniger
|
||||
PocketBase Last
|
||||
|
||||
2. Dashboard Performance
|
||||
2. Dashboard Performance
|
||||
|
||||
Problem: Dein Dashboard lädt alle deine
|
||||
Links aus PocketBase
|
||||
Lösung: Links werden für 5 Minuten gecacht
|
||||
Problem: Dein Dashboard lädt alle deine
|
||||
Links aus PocketBase
|
||||
Lösung: Links werden für 5 Minuten gecacht
|
||||
|
||||
Beispiel:
|
||||
- Du hast 50 Links, checkst Dashboard 20x
|
||||
Beispiel:
|
||||
|
||||
- Du hast 50 Links, checkst Dashboard 20x
|
||||
am Tag
|
||||
- Ohne Redis: 20x komplette Liste laden =
|
||||
- Ohne Redis: 20x komplette Liste laden =
|
||||
langsam
|
||||
- Mit Redis: 1x laden, 19x aus Cache =
|
||||
- Mit Redis: 1x laden, 19x aus Cache =
|
||||
blitzschnell
|
||||
|
||||
3. Analytics & Statistiken
|
||||
3. Analytics & Statistiken
|
||||
|
||||
Problem: Click-Zahlen berechnen ist langsam
|
||||
(viele Datenbankabfragen)
|
||||
Lösung: Statistiken werden live berechnet
|
||||
und gecacht
|
||||
Problem: Click-Zahlen berechnen ist langsam
|
||||
(viele Datenbankabfragen)
|
||||
Lösung: Statistiken werden live berechnet
|
||||
und gecacht
|
||||
|
||||
Beispiel:
|
||||
- "Zeige Clicks der letzten 7 Tage" braucht
|
||||
normalerweise komplizierte Queries
|
||||
- Mit Redis: Zahlen werden kontinuierlich
|
||||
Beispiel:
|
||||
|
||||
- "Zeige Clicks der letzten 7 Tage" braucht
|
||||
normalerweise komplizierte Queries
|
||||
- Mit Redis: Zahlen werden kontinuierlich
|
||||
aktualisiert, sofort verfügbar
|
||||
|
||||
Rate Limiting Verbesserung
|
||||
Rate Limiting Verbesserung
|
||||
|
||||
Aktuell: Dein Rate Limiter vergisst alles
|
||||
bei Server-Restart
|
||||
Mit Redis: Rate Limits bleiben bestehen,
|
||||
auch über Restarts hinweg
|
||||
Aktuell: Dein Rate Limiter vergisst alles
|
||||
bei Server-Restart
|
||||
Mit Redis: Rate Limits bleiben bestehen,
|
||||
auch über Restarts hinweg
|
||||
|
||||
Das bedeutet: Angreifer können nicht mehr
|
||||
durch Server-Restart deine Limits umgehen.
|
||||
Das bedeutet: Angreifer können nicht mehr
|
||||
durch Server-Restart deine Limits umgehen.
|
||||
|
||||
Konkrete Zahlen für dich
|
||||
Konkrete Zahlen für dich
|
||||
|
||||
Traffic-Verteilung schätzen:
|
||||
Traffic-Verteilung schätzen:
|
||||
|
||||
- 90% Redirects (Leute klicken deine Links)
|
||||
- 8% Dashboard/API (Du managst deine Links)
|
||||
- 90% Redirects (Leute klicken deine Links)
|
||||
- 8% Dashboard/API (Du managst deine Links)
|
||||
|
||||
- 2% Sonstiges (Login, Settings, etc.)
|
||||
- 2% Sonstiges (Login, Settings, etc.)
|
||||
|
||||
Performance ohne Redis:
|
||||
Performance ohne Redis:
|
||||
|
||||
- Redirect: 80ms durchschnittlich
|
||||
- Dashboard laden: 300ms
|
||||
- Bei 1000 Klicks/Tag: PocketBase ist
|
||||
- Redirect: 80ms durchschnittlich
|
||||
- Dashboard laden: 300ms
|
||||
- Bei 1000 Klicks/Tag: PocketBase ist
|
||||
gestresst
|
||||
|
||||
Performance mit Redis:
|
||||
Performance mit Redis:
|
||||
|
||||
- Redirect: 5ms (95% aus Cache)
|
||||
- Dashboard laden: 20ms (meist aus Cache)
|
||||
- Bei 10.000 Klicks/Tag: PocketBase
|
||||
- Redirect: 5ms (95% aus Cache)
|
||||
- Dashboard laden: 20ms (meist aus Cache)
|
||||
- Bei 10.000 Klicks/Tag: PocketBase
|
||||
entspannt
|
||||
|
||||
Wann merkst du den Unterschied?
|
||||
Wann merkst du den Unterschied?
|
||||
|
||||
Sofort spürbar:
|
||||
Sofort spürbar:
|
||||
|
||||
- Dashboard lädt viel schneller (besonders
|
||||
- Dashboard lädt viel schneller (besonders
|
||||
mit vielen Links)
|
||||
- Redirects sind blitzschnell
|
||||
- Analytics laden sofort statt zu "denken"
|
||||
- Redirects sind blitzschnell
|
||||
- Analytics laden sofort statt zu "denken"
|
||||
|
||||
Bei mehr Traffic:
|
||||
Bei mehr Traffic:
|
||||
|
||||
- Server bleibt entspannt auch bei
|
||||
- Server bleibt entspannt auch bei
|
||||
Viral-Links
|
||||
- Keine Timeouts mehr bei hoher Last
|
||||
- PocketBase überlastet nicht
|
||||
- Keine Timeouts mehr bei hoher Last
|
||||
- PocketBase überlastet nicht
|
||||
|
||||
Skalierung:
|
||||
Skalierung:
|
||||
|
||||
- Ohne Redis: ~500 Redirects/Minute machbar
|
||||
- Mit Redis: ~5000+ Redirects/Minute
|
||||
- Ohne Redis: ~500 Redirects/Minute machbar
|
||||
- Mit Redis: ~5000+ Redirects/Minute
|
||||
machbar
|
||||
|
||||
Kosten vs. Nutzen
|
||||
Kosten vs. Nutzen
|
||||
|
||||
Option 1: Kostenlos starten
|
||||
Option 1: Kostenlos starten
|
||||
|
||||
- Upstash Redis (10k Commands/Tag gratis)
|
||||
- Perfekt zum Testen
|
||||
- Upgrade wenn nötig
|
||||
- Upstash Redis (10k Commands/Tag gratis)
|
||||
- Perfekt zum Testen
|
||||
- Upgrade wenn nötig
|
||||
|
||||
Option 2: Minimale Kosten
|
||||
Option 2: Minimale Kosten
|
||||
|
||||
- €5-15/Monat für ordentlichen Redis
|
||||
- Dafür 10x bessere Performance
|
||||
- €5-15/Monat für ordentlichen Redis
|
||||
- Dafür 10x bessere Performance
|
||||
|
||||
Was du sparst:
|
||||
Was du sparst:
|
||||
|
||||
- Weniger Server-Stress = längere
|
||||
- Weniger Server-Stress = längere
|
||||
Hardware-Lebensdauer
|
||||
- Bessere User Experience = mehr zufriedene
|
||||
Nutzer
|
||||
- Skalierung möglich ohne neuen Server
|
||||
- Bessere User Experience = mehr zufriedene
|
||||
Nutzer
|
||||
- Skalierung möglich ohne neuen Server
|
||||
|
||||
Die Realität für uLoad
|
||||
Die Realität für uLoad
|
||||
|
||||
Jetzt: Bei 100 Klicks gleichzeitig würde
|
||||
dein Server wahrscheinlich strugglen
|
||||
Mit Redis: Bei 1000 Klicks gleichzeitig
|
||||
läuft alles smooth
|
||||
Jetzt: Bei 100 Klicks gleichzeitig würde
|
||||
dein Server wahrscheinlich strugglen
|
||||
Mit Redis: Bei 1000 Klicks gleichzeitig
|
||||
läuft alles smooth
|
||||
|
||||
Jetzt: Dashboard mit 100 Links braucht eine
|
||||
Sekunde zum Laden
|
||||
Mit Redis: Dashboard lädt in 0.1 Sekunden
|
||||
Jetzt: Dashboard mit 100 Links braucht eine
|
||||
Sekunde zum Laden
|
||||
Mit Redis: Dashboard lädt in 0.1 Sekunden
|
||||
|
||||
Jetzt: Click-Statistiken berechnen dauert
|
||||
ewig
|
||||
Mit Redis: Statistiken sind immer aktuell
|
||||
und sofort da
|
||||
Jetzt: Click-Statistiken berechnen dauert
|
||||
ewig
|
||||
Mit Redis: Statistiken sind immer aktuell
|
||||
und sofort da
|
||||
|
||||
Meine ehrliche Einschätzung
|
||||
Meine ehrliche Einschätzung
|
||||
|
||||
Für uLoad ist Redis ein No-Brainer:
|
||||
- Minimaler Aufwand (2-3 Tage Setup)
|
||||
- Maximaler Nutzen (10x Performance)
|
||||
- Kosten fast null (kann gratis starten)
|
||||
Für uLoad ist Redis ein No-Brainer:
|
||||
|
||||
Der größte Gewinn ist bei Redirects - das
|
||||
ist dein Kernfeature und wird damit
|
||||
ultra-schnell. Plus du bist ready für
|
||||
Viral-Links die plötzlich 1000x geklickt
|
||||
werden.
|
||||
- Minimaler Aufwand (2-3 Tage Setup)
|
||||
- Maximaler Nutzen (10x Performance)
|
||||
- Kosten fast null (kann gratis starten)
|
||||
|
||||
Bottom Line: Redis macht aus deinem "hobby
|
||||
project" eine professionelle, skalierbare
|
||||
Anwendung für praktisch null Zusatzkosten.
|
||||
Das ist vermutlich das beste ROI was du
|
||||
kriegen kannst! 🎯
|
||||
Der größte Gewinn ist bei Redirects - das
|
||||
ist dein Kernfeature und wird damit
|
||||
ultra-schnell. Plus du bist ready für
|
||||
Viral-Links die plötzlich 1000x geklickt
|
||||
werden.
|
||||
|
||||
Bottom Line: Redis macht aus deinem "hobby
|
||||
project" eine professionelle, skalierbare
|
||||
Anwendung für praktisch null Zusatzkosten.
|
||||
Das ist vermutlich das beste ROI was du
|
||||
kriegen kannst! 🎯
|
||||
|
|
|
|||
|
|
@ -9,11 +9,13 @@ Nach einigen Herausforderungen haben wir Redis erfolgreich auf Coolify zum Laufe
|
|||
### Redis Service in Coolify
|
||||
|
||||
#### 1. Redis als Database Service hinzufügen
|
||||
|
||||
- **Type:** Redis Database
|
||||
- **Image:** redis:7.2
|
||||
- **Name:** redis-database-[generated-id]
|
||||
|
||||
#### 2. General Settings
|
||||
|
||||
```
|
||||
Username: default
|
||||
Password: [Sicheres Passwort generieren]
|
||||
|
|
@ -23,6 +25,7 @@ Custom Docker Options: --protected-mode no --bind 0.0.0.0
|
|||
**Wichtig:** Die Custom Docker Options sind KRITISCH! Ohne diese wird Redis Verbindungen ablehnen.
|
||||
|
||||
#### 3. Network Configuration
|
||||
|
||||
```
|
||||
Ports Mappings: 6379:6379
|
||||
Redis URL (internal): [wird automatisch generiert]
|
||||
|
|
@ -33,6 +36,7 @@ Redis URL (internal): [wird automatisch generiert]
|
|||
### Hauptanwendung Environment Variables
|
||||
|
||||
#### Funktionierende Konfiguration:
|
||||
|
||||
```bash
|
||||
REDIS_HOST=ycsoowwsc84s0s8gc8oooosk # Der Container-Name (NICHT der Service-Name!)
|
||||
REDIS_PORT=6379
|
||||
|
|
@ -47,6 +51,7 @@ REDIS_PASSWORD=[Das gleiche Passwort wie im Redis Service]
|
|||
**Problem:** Der Coolify Service Name funktioniert nicht für die interne Kommunikation.
|
||||
|
||||
**Lösung:** Verwende den tatsächlichen Container-Namen:
|
||||
|
||||
- ❌ FALSCH: `redis-database-ycsoowwsc84s0s8gc8oooosk`
|
||||
- ❌ FALSCH: `redis-database-ycsoowwsc84s0s8gc8oooosk.coolify`
|
||||
- ✅ RICHTIG: `ycsoowwsc84s0s8gc8oooosk`
|
||||
|
|
@ -58,6 +63,7 @@ Der Container-Name findest du in den Redis Logs oder beim Container Start.
|
|||
**Problem:** "Connection is closed" Fehler trotz korrekter Credentials.
|
||||
|
||||
**Lösung:** Redis Protected Mode deaktivieren:
|
||||
|
||||
```bash
|
||||
--protected-mode no --bind 0.0.0.0
|
||||
```
|
||||
|
|
@ -68,7 +74,8 @@ Diese Optionen MÜSSEN in "Custom Docker Options" gesetzt werden!
|
|||
|
||||
**Problem:** REDIS_HOST wurde mit kompletter URL statt nur Hostname gesetzt.
|
||||
|
||||
**Lösung:**
|
||||
**Lösung:**
|
||||
|
||||
- ❌ FALSCH: `REDIS_HOST=redis://default:password@host:6379`
|
||||
- ✅ RICHTIG: `REDIS_HOST=ycsoowwsc84s0s8gc8oooosk`
|
||||
|
||||
|
|
@ -79,6 +86,7 @@ REDIS_HOST darf NUR der Hostname sein, keine URL!
|
|||
**Problem:** Falscher Port (5432 statt 6379) wurde gemappt.
|
||||
|
||||
**Lösung:**
|
||||
|
||||
- Port 6379 ist Redis
|
||||
- Port 5432 ist PostgreSQL
|
||||
- Immer 6379:6379 für Redis verwenden
|
||||
|
|
@ -104,6 +112,7 @@ REDIS_HOST darf NUR der Hostname sein, keine URL!
|
|||
### Schritt 3: Hauptapp konfigurieren
|
||||
|
||||
Environment Variables in deiner Hauptapp:
|
||||
|
||||
```bash
|
||||
REDIS_HOST=[Container-Name aus Schritt 2]
|
||||
REDIS_PORT=6379
|
||||
|
|
@ -114,36 +123,40 @@ REDIS_PASSWORD=[Passwort aus Redis Service]
|
|||
### Schritt 4: Testen
|
||||
|
||||
Erstelle einen Test-Endpoint in deiner App:
|
||||
|
||||
```typescript
|
||||
// src/routes/test-redis/+server.ts
|
||||
import { json } from '@sveltejs/kit';
|
||||
import Redis from 'ioredis';
|
||||
|
||||
export async function GET() {
|
||||
const redis = new Redis({
|
||||
host: process.env.REDIS_HOST,
|
||||
port: parseInt(process.env.REDIS_PORT || '6379'),
|
||||
username: process.env.REDIS_USERNAME,
|
||||
password: process.env.REDIS_PASSWORD
|
||||
});
|
||||
const redis = new Redis({
|
||||
host: process.env.REDIS_HOST,
|
||||
port: parseInt(process.env.REDIS_PORT || '6379'),
|
||||
username: process.env.REDIS_USERNAME,
|
||||
password: process.env.REDIS_PASSWORD,
|
||||
});
|
||||
|
||||
try {
|
||||
await redis.ping();
|
||||
await redis.set('test', 'Hello Redis!');
|
||||
const value = await redis.get('test');
|
||||
redis.disconnect();
|
||||
|
||||
return json({
|
||||
success: true,
|
||||
value,
|
||||
host: process.env.REDIS_HOST
|
||||
});
|
||||
} catch (error) {
|
||||
return json({
|
||||
success: false,
|
||||
error: error.message
|
||||
}, { status: 500 });
|
||||
}
|
||||
try {
|
||||
await redis.ping();
|
||||
await redis.set('test', 'Hello Redis!');
|
||||
const value = await redis.get('test');
|
||||
redis.disconnect();
|
||||
|
||||
return json({
|
||||
success: true,
|
||||
value,
|
||||
host: process.env.REDIS_HOST,
|
||||
});
|
||||
} catch (error) {
|
||||
return json(
|
||||
{
|
||||
success: false,
|
||||
error: error.message,
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -152,16 +165,19 @@ export async function GET() {
|
|||
Nach erfolgreicher Redis-Integration:
|
||||
|
||||
### Link Redirects
|
||||
|
||||
- **Vorher:** 50-100ms (PocketBase Query)
|
||||
- **Nachher:** 2-5ms (Redis Cache)
|
||||
- **Verbesserung:** 20-50x schneller!
|
||||
|
||||
### Dashboard Loading
|
||||
|
||||
- **Vorher:** 200-400ms
|
||||
- **Nachher:** 10-20ms
|
||||
- **Verbesserung:** 10-20x schneller!
|
||||
|
||||
### Analytics
|
||||
|
||||
- **Vorher:** 500-1500ms
|
||||
- **Nachher:** 20-50ms
|
||||
- **Verbesserung:** 10-30x schneller!
|
||||
|
|
@ -169,16 +185,19 @@ Nach erfolgreicher Redis-Integration:
|
|||
## 🐛 Troubleshooting
|
||||
|
||||
### "Connection is closed" Error
|
||||
|
||||
1. Check Custom Docker Options: `--protected-mode no --bind 0.0.0.0`
|
||||
2. Verify Container Name (nicht Service Name!)
|
||||
3. Check Password ist korrekt
|
||||
|
||||
### "ECONNREFUSED" Error
|
||||
|
||||
1. Redis Service läuft nicht
|
||||
2. Falscher Host/Port
|
||||
3. Network Isolation Problem
|
||||
|
||||
### "NOAUTH Authentication required"
|
||||
|
||||
1. Password nicht gesetzt in Environment Variables
|
||||
2. Falsches Password
|
||||
3. Username fehlt (sollte "default" sein)
|
||||
|
|
@ -186,6 +205,7 @@ Nach erfolgreicher Redis-Integration:
|
|||
### Debug Commands
|
||||
|
||||
Im Redis Container (via Coolify Terminal):
|
||||
|
||||
```bash
|
||||
# Test Redis läuft
|
||||
redis-cli ping
|
||||
|
|
@ -201,23 +221,27 @@ redis-cli -a [password] CONFIG GET protected-mode
|
|||
## 💡 Best Practices
|
||||
|
||||
### 1. Resource Limits
|
||||
|
||||
```bash
|
||||
--maxmemory 512mb
|
||||
--maxmemory-policy allkeys-lru
|
||||
```
|
||||
|
||||
### 2. Persistence
|
||||
|
||||
```bash
|
||||
--appendonly yes
|
||||
--save 900 1 # Save every 15 min if at least 1 key changed
|
||||
```
|
||||
|
||||
### 3. Security
|
||||
|
||||
- Niemals Redis Port öffentlich exponieren
|
||||
- Starkes Passwort verwenden
|
||||
- Protected Mode nur intern deaktivieren
|
||||
|
||||
### 4. Monitoring
|
||||
|
||||
- Memory Usage im Auge behalten
|
||||
- Hit Rate tracken
|
||||
- Slow Queries monitoren
|
||||
|
|
@ -225,6 +249,7 @@ redis-cli -a [password] CONFIG GET protected-mode
|
|||
## 📊 Resource-Bedarf
|
||||
|
||||
Für uLoad auf Hetzner CX21:
|
||||
|
||||
- **RAM:** 50-200MB (von 8GB verfügbar)
|
||||
- **CPU:** <1% (von 2 vCPUs)
|
||||
- **Disk:** <1GB (von 40GB)
|
||||
|
|
@ -251,4 +276,4 @@ Mit dieser Konfiguration läuft Redis stabil und performant auf dem gleichen Het
|
|||
|
||||
---
|
||||
|
||||
*Dokumentiert nach erfolgreicher Redis-Integration für uLoad auf Coolify, August 2025*
|
||||
_Dokumentiert nach erfolgreicher Redis-Integration für uLoad auf Coolify, August 2025_
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ Redis is used in uload to dramatically improve link redirect performance by cach
|
|||
## Prerequisites
|
||||
|
||||
- macOS with Homebrew installed
|
||||
- Node.js 18+
|
||||
- Node.js 18+
|
||||
- Running uload development environment
|
||||
|
||||
## Installation
|
||||
|
|
@ -51,6 +51,7 @@ REDIS_HOST=localhost REDIS_PORT=6379 npm run dev
|
|||
```
|
||||
|
||||
Check the console output for:
|
||||
|
||||
```
|
||||
✅ Redis: Connected successfully
|
||||
```
|
||||
|
|
@ -64,14 +65,15 @@ curl http://localhost:5173/api/redis-status | jq
|
|||
```
|
||||
|
||||
Expected response:
|
||||
|
||||
```json
|
||||
{
|
||||
"connected": true,
|
||||
"host": "localhost",
|
||||
"enabled": true,
|
||||
"available": true,
|
||||
"cachedLinks": 0,
|
||||
"error": null
|
||||
"connected": true,
|
||||
"host": "localhost",
|
||||
"enabled": true,
|
||||
"available": true,
|
||||
"cachedLinks": 0,
|
||||
"error": null
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -80,16 +82,20 @@ Expected response:
|
|||
### Cache Flow
|
||||
|
||||
1. **First Visit (Cache MISS)**
|
||||
|
||||
```
|
||||
User → Short Link → Check Redis (miss) → Query Database → Redirect → Cache Result
|
||||
```
|
||||
|
||||
- Takes ~100-200ms
|
||||
- Stores result in Redis for future requests
|
||||
|
||||
2. **Subsequent Visits (Cache HIT)**
|
||||
|
||||
```
|
||||
User → Short Link → Check Redis (hit) → Redirect
|
||||
```
|
||||
|
||||
- Takes ~10-20ms
|
||||
- Skips database query entirely
|
||||
|
||||
|
|
@ -139,6 +145,7 @@ redis-cli del "redirect:abc123"
|
|||
### 4. Debug Cache Hits/Misses
|
||||
|
||||
Enable verbose logging in your browser console:
|
||||
|
||||
1. Visit a short link
|
||||
2. Check browser console for:
|
||||
- "Cache MISS - fetching from PocketBase"
|
||||
|
|
@ -170,13 +177,14 @@ node test-redis-cache.mjs
|
|||
Edit `src/lib/server/linkCache.ts`:
|
||||
|
||||
```typescript
|
||||
const CACHE_TTL = 86400; // 24 hours for popular links
|
||||
const SHORT_TTL = 300; // 5 minutes for normal links
|
||||
const CACHE_TTL = 86400; // 24 hours for popular links
|
||||
const SHORT_TTL = 300; // 5 minutes for normal links
|
||||
```
|
||||
|
||||
### Fallback Behavior
|
||||
|
||||
The app automatically handles Redis unavailability:
|
||||
|
||||
- If Redis is down, the app continues working without cache
|
||||
- No errors shown to users
|
||||
- Graceful degradation to database-only mode
|
||||
|
|
@ -202,11 +210,13 @@ tail -f /opt/homebrew/var/log/redis.log
|
|||
### Connection Refused
|
||||
|
||||
1. Verify Redis is running:
|
||||
|
||||
```bash
|
||||
redis-cli ping
|
||||
```
|
||||
|
||||
2. Check port availability:
|
||||
|
||||
```bash
|
||||
lsof -i :6379
|
||||
```
|
||||
|
|
@ -220,11 +230,13 @@ tail -f /opt/homebrew/var/log/redis.log
|
|||
### Cache Not Working
|
||||
|
||||
1. Check Redis connection in app:
|
||||
|
||||
```bash
|
||||
curl http://localhost:5173/api/redis-status
|
||||
```
|
||||
|
||||
2. Verify Redis has memory available:
|
||||
|
||||
```bash
|
||||
redis-cli info memory
|
||||
```
|
||||
|
|
@ -234,11 +246,13 @@ tail -f /opt/homebrew/var/log/redis.log
|
|||
### Performance Issues
|
||||
|
||||
1. Monitor Redis latency:
|
||||
|
||||
```bash
|
||||
redis-cli --latency
|
||||
```
|
||||
|
||||
2. Check Redis memory usage:
|
||||
|
||||
```bash
|
||||
redis-cli info memory | grep used_memory_human
|
||||
```
|
||||
|
|
@ -300,4 +314,4 @@ redis-cli slowlog get # Show slow queries
|
|||
|
||||
- [Production Redis Setup](./redis-production-setup.md)
|
||||
- [Cache Strategy Guide](./cache-strategy.md)
|
||||
- [Performance Optimization](./performance.md)
|
||||
- [Performance Optimization](./performance.md)
|
||||
|
|
|
|||
|
|
@ -59,10 +59,11 @@ redis-cli ping
|
|||
Visit: http://localhost:5173/api/redis-status
|
||||
|
||||
Should see:
|
||||
|
||||
```json
|
||||
{
|
||||
"connected": true,
|
||||
"available": true
|
||||
"connected": true,
|
||||
"available": true
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -105,17 +106,20 @@ brew services stop redis
|
|||
## 🆘 Help
|
||||
|
||||
**Redis won't start?**
|
||||
|
||||
```bash
|
||||
brew services restart redis
|
||||
```
|
||||
|
||||
**Connection refused?**
|
||||
|
||||
```bash
|
||||
# Check if running
|
||||
ps aux | grep redis
|
||||
```
|
||||
|
||||
**Cache not working?**
|
||||
|
||||
- Check console for Redis connection message
|
||||
- Verify environment variables are loaded
|
||||
- Try explicit env vars: `REDIS_HOST=localhost npm run dev`
|
||||
- Try explicit env vars: `REDIS_HOST=localhost npm run dev`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue