Zum Hauptinhalt springen

Zurรผck zum Devlog

Donnerstag, 12. Februar 2026

Feature

22 Commits

10 min Lesezeit

GDPR Self-Service, Matrix Mobile UX & Mac Mini Stability

Neue GDPR Self-Service Endpoints fรผr Nutzer-Daten, Matrix Web Mobile-Navigation mit FAB und Room Restoration, Mac Mini Stability-Improvements mit Health Checks und Container Recovery

T

Till Schneider

Autor

22 Commits mit Fokus auf DSGVO-Compliance, Mobile UX und Server-Stabilitรคt:

  • GDPR Self-Service - Neue Endpoints fรผr User Data Export
  • Matrix Mobile UX - FAB fรผr Sidebar, Room Restoration
  • Mac Mini Stability - Health Checks, Container Recovery, LaunchD Fixes
  • Monitoring - Alerting Stack mit Maintenance Scripts
  • Admin API Fixes - Controller Route Prefix Korrekturen

GDPR Self-Service Endpoints

Neue Self-Service Endpoints fรผr Nutzer, um ihre Daten einzusehen und zu exportieren.

Architektur

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    GDPR Data Aggregation                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                            โ”‚
โ”‚  โ”‚   User Request  โ”‚                                            โ”‚
โ”‚  โ”‚   /me/data      โ”‚                                            โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                            โ”‚
โ”‚           โ”‚                                                      โ”‚
โ”‚           โ–ผ                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚  โ”‚  mana-core-auth โ”‚โ”€โ”€โ”€โ”€>โ”‚  Backend Services (parallel fetch)  โ”‚โ”‚
โ”‚  โ”‚                 โ”‚     โ”‚                                     โ”‚โ”‚
โ”‚  โ”‚  /me/data       โ”‚     โ”‚  Calendar โ”‚ Todo โ”‚ Contacts โ”‚ ...   โ”‚โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ”‚                                   โ”‚                              โ”‚
โ”‚                                   โ–ผ                              โ”‚
โ”‚                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”‚
โ”‚                          โ”‚  Aggregated     โ”‚                    โ”‚
โ”‚                          โ”‚  User Data      โ”‚                    โ”‚
โ”‚                          โ”‚  (JSON/ZIP)     โ”‚                    โ”‚
โ”‚                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Neue Endpoints

// mana-core-auth: Self-Service Data
GET /me/data           // Aggregierte Daten aller Services
GET /me/data/export    // ZIP-Download fรผr DSGVO-Auskunft
DELETE /me/data        // Account und alle Daten lรถschen (Art. 17)

// Backend Services: GDPR Endpoints
GET /admin/gdpr/users/:userId/data
DELETE /admin/gdpr/users/:userId/data

Implementierung

// auth: me.controller.ts
@Get('data')
@UseGuards(JwtAuthGuard)
async getUserData(@CurrentUser() user: CurrentUserData) {
  const services = ['calendar', 'todo', 'contacts', 'photos', 'clock', 'storage'];

  const dataPromises = services.map(async (service) => {
    const url = this.configService.get(`${service.toUpperCase()}_BACKEND_URL`);
    return this.fetchServiceData(url, user.userId);
  });

  const results = await Promise.allSettled(dataPromises);
  return this.aggregateResults(results, services);
}

Backend Integration

Neue GDPR Endpoints zu Photos, Clock und Storage Backends hinzugefรผgt:

BackendEndpointDaten
Photos/admin/gdpr/users/:id/dataFotos, Alben, EXIF
Clock/admin/gdpr/users/:id/dataTimer, Sessions
Storage/admin/gdpr/users/:id/dataDateien, Ordner

Matrix Web Mobile UX

Verbesserte Mobile-Navigation fรผr die Matrix PWA.

FAB fรผr Sidebar

<!-- FloatingActionButton fรผr Mobile Sidebar -->
<script lang="ts">
	let { onOpenSidebar } = $props();
</script>

<button class="fab fixed bottom-20 right-4 z-50 md:hidden" onclick={onOpenSidebar}>
	<MenuIcon />
</button>

Room Restoration

Automatische Wiederherstellung des zuletzt ausgewรคhlten Chats:

// Beim App-Start: Letzten Room wiederherstellen
onMount(() => {
	const lastRoomId = localStorage.getItem('matrix:lastRoom');
	if (lastRoomId && rooms.find((r) => r.roomId === lastRoomId)) {
		selectRoom(lastRoomId);
	}
});

// Bei Room-Wechsel: Speichern
function selectRoom(roomId: string) {
	currentRoomId = roomId;
	localStorage.setItem('matrix:lastRoom', roomId);
}

Message Interface Fix

Fehlende Props zur Message.svelte Interface hinzugefรผgt:

interface MessageProps {
	message: MatrixMessage;
	isOwn: boolean;
	showAvatar: boolean;
	// Neu hinzugefรผgt:
	onReply?: (msg: MatrixMessage) => void;
	onReact?: (msg: MatrixMessage, emoji: string) => void;
}

Mac Mini Stability Improvements

Umfangreiche Verbesserungen fรผr die Server-Stabilitรคt.

Health Check Updates

# docker-compose.macmini.yml
services:
  mana-core-auth:
    healthcheck:
      test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3001/health']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  zitare-backend:
    healthcheck:
      test: ['CMD', 'wget', '-q', '--spider', 'http://localhost:3007/health']
      # Korrigierter Pfad (vorher /api/health)

Container Recovery Script

#!/bin/bash
# scripts/mac-mini/container-recovery.sh

UNHEALTHY=$(docker ps --filter "health=unhealthy" --format "{{.Names}}")

for container in $UNHEALTHY; do
  echo "Restarting unhealthy container: $container"
  docker restart "$container"

  # Warte auf Health Check
  sleep 30

  # Prรผfe Status
  STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$container")
  if [ "$STATUS" != "healthy" ]; then
    echo "WARNING: $container still unhealthy after restart"
  fi
done

LaunchD Plist Fix

<!-- com.mana.container-recovery.plist -->
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.mana.container-recovery</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/till/projects/manacore-monorepo/scripts/mac-mini/container-recovery.sh</string>
  </array>
  <key>StartInterval</key>
  <integer>300</integer> <!-- Alle 5 Minuten -->
  <key>StandardOutPath</key>
  <string>/var/log/mana/container-recovery.log</string>
</dict>
</plist>

Disabled Services

Temporรคr deaktivierte Services (fehlende Deployments):

# Auskommentiert bis Deployment fertig
# inventory-backend:
# nutriphi-backend:
# wisekeep-backend:

Monitoring: Alerting Stack

Neues Alerting-System mit Prometheus und Discord Notifications.

Alert Rules

# prometheus/alerts.yml
groups:
  - name: service_alerts
    rules:
      - alert: ServiceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: '{{ $labels.job }} is down'

      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: 'Memory usage above 90%'

      - alert: DiskSpaceLow
        expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.1
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: 'Disk space below 10%'

Maintenance Scripts

# scripts/mac-mini/maintenance.sh

# 1. Docker Cleanup
docker system prune -f --volumes

# 2. Log Rotation
find /var/log/mana -name "*.log" -mtime +7 -delete

# 3. Health Report
./scripts/mac-mini/health-report.sh | tee /var/log/mana/daily-health.log

Admin API Fixes

Korrekturen fรผr Controller Route Prefixes.

Problem

Doppelte API-Prefixes fรผhrten zu 404-Fehlern:

GET /api/v1/api/v1/admin/users  โ†’ 404

Lรถsung

// VORHER (falsch)
@Controller('api/v1/admin') // + Global Prefix = /api/v1/api/v1/admin
export class AdminController {}

// NACHHER (korrekt)
@Controller('admin') // + Global Prefix = /api/v1/admin
export class AdminController {}

Betroffene Controller

ServiceControllerRoute
AuthMeController/me/*
StorageAdminController/admin/*

Docker Fixes

Mehrere Docker-Build Korrekturen.

# VORHER: Symlinks funktionieren nicht im Docker Context
COPY packages/shared-types ./packages/shared-types

# NACHHER: pnpm deploy fรผr korrekte Dependencies
RUN pnpm --filter @mana-search/service deploy --prod ./deploy

FROM node:20-slim
COPY --from=build /app/deploy ./

Local Builds auf Mac Mini

Weitere Services auf lokale Builds umgestellt:

presi-backend:
  build:
    context: .
    dockerfile: apps/presi/apps/backend/Dockerfile
  # Statt: image: ghcr.io/till-js/presi-backend

skilltree-web:
  build:
    context: .
    dockerfile: apps/skilltree/apps/web/Dockerfile

mana-search:
  build:
    context: .
    dockerfile: services/mana-search/Dockerfile

Shared Packages in ManaCore Web

# Fehlende Packages hinzugefรผgt
COPY packages/shared-stores ./packages/shared-stores
COPY packages/shared-api-client ./packages/shared-api-client
COPY packages/shared-vite-config ./packages/shared-vite-config

Calendar Database Fix

User ID Felder zu Text geรคndert:

// VORHER (UUID)
userId: uuid('user_id').references(() => users.id);

// NACHHER (Text fรผr externe Auth)
userId: text('user_id').notNull();

Grund: mana-core-auth verwendet String-basierte User IDs, nicht UUIDs.


Zusammenfassung

BereichCommitsHighlights
GDPR Self-Service4User Data Endpoints, Export
Matrix Mobile4FAB, Room Restore, Props
Mac Mini Stability5Health Checks, Recovery
Monitoring1Alerting Stack
Admin API3Route Prefix Fixes
Docker5Symlinks, Local Builds

Nรคchste Schritte

  1. GDPR Export UI - Download-Button im mana.how Dashboard
  2. Matrix E2EE - Ende-zu-Ende Verschlรผsselung aktivieren
  3. Alertmanager - Discord Webhook Integration
  4. Service Deployments - Inventory, NutriPhi, WiseKeep

Tags

#gdpr #dsgvo #matrix #mobile #mac-mini #stability #monitoring #docker #admin #health-checks