mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-23 21:16:41 +02:00
feat: integrate uload and picture, unify package naming
- Add uload project with apps/web structure
- Reorganize from flat to monorepo structure
- Remove PocketBase binary and local data
- Update to pnpm and @uload/web namespace
- Add picture project to monorepo
- Remove embedded git repository
- Unify all package names to @{project}/{app} schema:
- @maerchenzauber/* (was @storyteller/*)
- @manacore/* (was manacore-*, manacore)
- @manadeck/* (was web, backend, manadeck)
- @memoro/* (was memoro-web, landing, memoro)
- @picture/* (already unified)
- @uload/web
- Add convenient dev scripts for all apps:
- pnpm dev:{project}:web
- pnpm dev:{project}:landing
- pnpm dev:{project}:mobile
- pnpm dev:{project}:backend
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
c6c4c5a552
commit
c712a2504a
1031 changed files with 189301 additions and 290 deletions
238
uload/docs/reports/ip-geolocation-implementation-options.md
Normal file
238
uload/docs/reports/ip-geolocation-implementation-options.md
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
# IP-Geolocation Implementation Options Report
|
||||
|
||||
**Erstellt:** 16. August 2025
|
||||
**Version:** 1.0
|
||||
**Kontext:** Analytics-Enhancement für uload Short-Link-Service
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Dieser Report evaluiert verschiedene Optionen zur Implementation einer zuverlässigen IP-Geolocation für das Click-Tracking System. Aktuell verwenden wir Mock-Daten für lokale IPs - für ein produktives Analytics-System sind echte Standortdaten jedoch kritisch für Business Intelligence und Nutzerverhalten-Analyse.
|
||||
|
||||
## Aktuelle Situation
|
||||
|
||||
**Status Quo:**
|
||||
|
||||
- ✅ Browser, OS, Device-Type werden korrekt aus User-Agent extrahiert
|
||||
- ✅ IP-Adresse wird erfasst
|
||||
- ⚠️ Country/City werden nur für lokale IPs gemockt (`Germany/Munich`)
|
||||
- ❌ Keine echte Geolocation für produktive IPs
|
||||
|
||||
## Option 1: Kostenlose IP-Geolocation Services
|
||||
|
||||
### 1.1 ipapi.co (Empfohlen für Start)
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- 30.000 kostenlose Requests/Monat
|
||||
- Einfache REST API Integration
|
||||
- Gute Genauigkeit für Country/City
|
||||
- Keine Registrierung für Basic Plan
|
||||
|
||||
**Implementation:**
|
||||
|
||||
```javascript
|
||||
async function getLocationFromIP(ipAddress) {
|
||||
try {
|
||||
const response = await fetch(`https://ipapi.co/${ipAddress}/json/`);
|
||||
const data = await response.json();
|
||||
return {
|
||||
country: data.country_name || 'Unknown',
|
||||
city: data.city || 'Unknown'
|
||||
};
|
||||
} catch (error) {
|
||||
return { country: 'Unknown', city: 'Unknown' };
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Kosten:** Kostenlos bis 30k Requests, dann $10/Monat für 100k
|
||||
|
||||
### 1.2 ip-api.com
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- 1000 kostenlose Requests/Monat
|
||||
- Sehr detaillierte Daten (ISP, Organisation, etc.)
|
||||
- Gute Performance
|
||||
|
||||
**Nachteile:**
|
||||
|
||||
- Deutlich niedrigeres kostenloses Limit
|
||||
- Kommerzielle Nutzung erfordert bezahlten Plan
|
||||
|
||||
### 1.3 FreegeoIP / ipstack
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- Etablierte Services mit guter Reputation
|
||||
- ipstack bietet sehr detaillierte Daten
|
||||
|
||||
**Nachteile:**
|
||||
|
||||
- Niedrigere kostenlose Limits
|
||||
- ipstack: nur 100 kostenlose Requests/Monat
|
||||
|
||||
## Option 2: Premium IP-Geolocation Services
|
||||
|
||||
### 2.1 MaxMind GeoLite2 Database (Empfohlen für Scale)
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- Lokale Datenbank - keine externen API Calls
|
||||
- Sehr schnell (< 1ms lookup)
|
||||
- Kostenlose Version verfügbar
|
||||
- Höchste Privatsphäre (keine Daten verlassen Server)
|
||||
- Skaliert unbegrenzt
|
||||
|
||||
**Nachteile:**
|
||||
|
||||
- Komplexere Implementation
|
||||
- Regelmäßige Database Updates nötig
|
||||
- Größere Binary Size
|
||||
|
||||
**Implementation:**
|
||||
|
||||
```javascript
|
||||
import { Reader } from '@maxmind/geoip2-node';
|
||||
|
||||
const reader = await Reader.open('./GeoLite2-City.mmdb');
|
||||
const response = reader.city(ipAddress);
|
||||
```
|
||||
|
||||
**Kosten:** Kostenlos (GeoLite2) oder $50+/Monat (GeoIP2 Premium)
|
||||
|
||||
### 2.2 Google Cloud Platform IP Geolocation
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- Sehr hohe Genauigkeit
|
||||
- Teil der Google Cloud Suite
|
||||
- Gute Integration mit anderen GCP Services
|
||||
|
||||
**Nachteile:**
|
||||
|
||||
- Teurer als Alternativen
|
||||
- Komplexere Setup/Authentication
|
||||
|
||||
## Option 3: Hybrid-Ansätze
|
||||
|
||||
### 3.1 Caching + Fallback Strategy
|
||||
|
||||
**Konzept:**
|
||||
|
||||
```javascript
|
||||
async function getLocationWithCache(ipAddress) {
|
||||
// 1. Check local cache/database
|
||||
const cached = await getCachedLocation(ipAddress);
|
||||
if (cached && !isExpired(cached)) return cached;
|
||||
|
||||
// 2. Try primary service (ipapi.co)
|
||||
try {
|
||||
const location = await ipapi.getLocation(ipAddress);
|
||||
await cacheLocation(ipAddress, location);
|
||||
return location;
|
||||
} catch (error) {
|
||||
// 3. Fallback to secondary service
|
||||
return await fallbackService.getLocation(ipAddress);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- Reduziert API Calls drastisch
|
||||
- Höhere Verfügbarkeit durch Fallbacks
|
||||
- Bessere Performance
|
||||
|
||||
### 3.2 Batch Processing
|
||||
|
||||
**Konzept:**
|
||||
|
||||
- Clicks initial ohne Geolocation speichern
|
||||
- Background Job verarbeitet IPs in Batches
|
||||
- Update der Click-Records nachträglich
|
||||
|
||||
**Vorteile:**
|
||||
|
||||
- Keine Verzögerung der Short-Link-Weiterleitung
|
||||
- Effizientere API-Nutzung
|
||||
- Fehlerbehandlung kann robuster sein
|
||||
|
||||
## Empfehlungen
|
||||
|
||||
### Phase 1: Sofortige Implementation (1-2 Tage)
|
||||
|
||||
**Service:** ipapi.co
|
||||
**Begründung:** 30k kostenlose Requests, einfache Integration
|
||||
|
||||
```javascript
|
||||
// Direkte Integration in aktuellen Code
|
||||
const location = await getLocationFromIP(ipAddress);
|
||||
country = location.country;
|
||||
city = location.city;
|
||||
```
|
||||
|
||||
### Phase 2: Production-Ready (1 Woche)
|
||||
|
||||
**Service:** ipapi.co + Caching
|
||||
**Features:**
|
||||
|
||||
- Redis/Database Caching für häufige IPs
|
||||
- Fallback auf ip-api.com
|
||||
- Error Handling & Monitoring
|
||||
|
||||
### Phase 3: Enterprise Scale (2-4 Wochen)
|
||||
|
||||
**Service:** MaxMind GeoLite2 Database
|
||||
**Features:**
|
||||
|
||||
- Lokale Database Integration
|
||||
- Automatische Updates
|
||||
- Batch Processing für historische Daten
|
||||
|
||||
## Implementation Roadmap
|
||||
|
||||
### Woche 1: Quick Win
|
||||
|
||||
- [ ] ipapi.co Integration
|
||||
- [ ] Basic Error Handling
|
||||
- [ ] Monitoring der API Usage
|
||||
|
||||
### Woche 2-3: Robustheit
|
||||
|
||||
- [ ] Caching Layer implementieren
|
||||
- [ ] Fallback Service hinzufügen
|
||||
- [ ] Performance Monitoring
|
||||
|
||||
### Woche 4+: Skalierung
|
||||
|
||||
- [ ] MaxMind Database evaluieren
|
||||
- [ ] Batch Processing System
|
||||
- [ ] Advanced Analytics Features
|
||||
|
||||
## Kostenanalyse
|
||||
|
||||
**Annahmen:** 10.000 unique IPs/Monat
|
||||
|
||||
| Service | Monatliche Kosten | Genauigkeit | Komplexität |
|
||||
| ---------------- | ----------------- | ----------- | ----------- |
|
||||
| ipapi.co | $0 (bis 30k) | Hoch | Niedrig |
|
||||
| MaxMind GeoLite2 | $0 | Hoch | Mittel |
|
||||
| Google Cloud | $20-50 | Sehr Hoch | Hoch |
|
||||
|
||||
## Fazit
|
||||
|
||||
**Empfehlung:** Start mit ipapi.co für sofortige Funktionalität, Migration zu MaxMind GeoLite2 für langfristige Skalierung.
|
||||
|
||||
**Nächste Schritte:**
|
||||
|
||||
1. ipapi.co Integration implementieren (heute)
|
||||
2. Monitoring Dashboard für API Usage erstellen
|
||||
3. Caching Strategy planen
|
||||
4. MaxMind Evaluation in 4-6 Wochen
|
||||
|
||||
**Risk Mitigation:**
|
||||
|
||||
- Fallback auf 'Unknown' bei API Fehlern
|
||||
- Graceful Degradation - Analytics darf Short-Link-Funktion nicht beeinträchtigen
|
||||
- Rate Limiting und Error Budgets implementieren
|
||||
Loading…
Add table
Add a link
Reference in a new issue