FEDEO Push Server
Eigenständiger Stack für den zentralen FEDEO Push-Transportdienst. Selfhosted FEDEO-Instanzen registrieren Geräte lokal und leiten nur technische Push-Aufträge an diesen Dienst weiter. Die Instanzen authentifizieren sich mit einem rotierbaren Schlüssel, der im Admin-Dashboard gepflegt wird.
Bestandteile
apps/api: Fastify API für Admin-Dashboard und Selfhost-Instanzenapps/admin: Nuxt Admin Dashboard mit Nuxt UIpackages/db: Drizzle Schema und Migrationen für PostgreSQLdocker-compose.yml: lokaler Stack aus Postgres, API und Admin
Entwicklung
cd push-server
cp .env.example .env
npm install
npm run db:migrate
npm run dev:api
npm run dev:admin
Standardports:
- API:
http://localhost:4020 - Admin:
http://localhost:3000lokal oderhttp://localhost:3020über Docker Compose - Postgres:
localhost:5442
Admin-Zugang
Das Dashboard nutzt den Wert aus ADMIN_TOKEN. Der Token wird im Browser nur lokal gespeichert und als Authorization: Bearer ... an die API gesendet.
Instanz-Authentifizierung
Instanzaufrufe verwenden HMAC-SHA256:
X-Fedeo-Instance-Id: inst_...
X-Fedeo-Timestamp: 2026-05-22T10:00:00.000Z
X-Fedeo-Signature: <hex-hmac>
Signiert wird:
METHOD
PATH
TIMESTAMP
SHA256(BODY)
INSTANCE_ID
Beispiel:
import { createHash, createHmac } from "node:crypto";
const body = JSON.stringify(payload);
const timestamp = new Date().toISOString();
const bodyHash = createHash("sha256").update(body).digest("hex");
const canonical = ["POST", "/v1/push", timestamp, bodyHash, instanceId].join("\n");
const signature = createHmac("sha256", clientSecret).update(canonical).digest("hex");
Wichtige API-Endpunkte
GET /v1/public-configPOST /v1/instances/heartbeatPOST /v1/devicesDELETE /v1/devices/:centralDeviceIdPOST /v1/pushGET /v1/push/:deliveryJobId
Admin:
GET /admin/summaryGET /admin/instancesPOST /admin/instancesPATCH /admin/instances/:idPOST /admin/instances/:id/rotate-secretGET /admin/instances/:id/devicesGET /admin/instances/:id/jobs
Apple Push Notification service
Für iOS müssen diese Werte gesetzt sein:
IOS_BUNDLE_ID=software.federspiel.fedeo
APNS_TEAM_ID=...
APNS_KEY_ID=...
APNS_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
APNS_PRODUCTION=false
Solange APNs nicht vollständig konfiguriert ist, nimmt die API Push-Aufträge an, markiert iOS-Zustellversuche aber mit apns_not_configured.
Aktueller Umfang
Implementiert:
- Instanzverwaltung im Admin-Dashboard
- rotierbare Instanzschlüssel mit verschlüsselter Speicherung
- HMAC-authentifizierte Instanzbefehle
- Geräte-Registry für
web,iosundandroid - Zustelljobs mit Idempotenzschlüssel
- APNs-Zustellung für iOS
- technische Status- und Fehlererfassung
Vorbereitet, aber noch nicht vollständig implementiert:
- Web Push Zustellung
- FCM Zustellung
- asynchrone Queue/Worker-Verarbeitung
- produktive Rate-Limits pro Instanz