managarten/apps/mana/apps/web/src/routes/status/+page.server.ts
Till JS 0b44acdde1
Some checks are pending
CD Mac Mini / Detect Changes (push) Waiting to run
CD Mac Mini / Deploy (push) Blocked by required conditions
CI / Detect Changes (push) Waiting to run
CI / Validate (push) Waiting to run
CI / Build mana-search (push) Blocked by required conditions
CI / Build mana-sync (push) Blocked by required conditions
CI / Build mana-api-gateway (push) Blocked by required conditions
CI / Build mana-crawler (push) Blocked by required conditions
Docker Validate / Validate Dockerfiles (push) Waiting to run
Docker Validate / Build calendar-web (push) Blocked by required conditions
Docker Validate / Build quotes-web (push) Blocked by required conditions
Docker Validate / Build todo-backend (push) Blocked by required conditions
Docker Validate / Build todo-web (push) Blocked by required conditions
Docker Validate / Build mana-auth (push) Blocked by required conditions
Docker Validate / Build mana-sync (push) Blocked by required conditions
Docker Validate / Build mana-media (push) Blocked by required conditions
Mirror to Forgejo / Push to Forgejo (push) Waiting to run
chore(mana): uload aus unified-App entfernen
uLoad ist nach Code/uload/ als eigenständiger Hono+Bun-Server
migriert (siehe mana/docs/playbooks/ULOAD_GREENFIELD.md, υ-0..υ-7
durch). Live auf:
- uload.mana.how → :3108 (SvelteKit-Web, Standalone)
- uload-api.mana.how → :3107 (Hono-API, eigene Postgres-DB im
  `uload`-Schema)
- ulo.ad → :3107 (Short-Redirect-Domain)

Gelöscht / abgebaut:
- Module: apps/mana/.../modules/uload + Routen + Locales
- Top-Level: apps/uload/ (alter SvelteKit-Web + Hono-Server-Code)
- docker-compose.macmini.yml uload-server Service-Block (alter
  Container :3070 wurde durch Standalone-Stack auf :3107 ersetzt)
- mana-web env: PUBLIC_ULOAD_SERVER_URL / _CLIENT in compose +
  hooks.server.ts (env-Injection, window.__-Export, CSP-connectSrc),
  status/+page.server.ts Service-List
- prometheus uload-server scrape job + mana.how/uload probe
- shared-branding APP_BRANDING.uload + APP_ICONS.uload + MANA_APPS
  uload-Entry + UloadLogo
- spiral-db MANA_APP_INDEX.uload (=21)
- shared-types/spaces 5× 'uload' Modul-Einträge in den Space-Listen
- Registries: app-registry/apps.ts (Uload registerApp + DownloadSimple
  icon + Header), categories, help-content, module-registry,
  splitscreen, hooks.server APP_SUBDOMAINS, data/tools/init
- package.json dev:uload:* + deploy:landing:uload Scripts
- i18n: uload in apps/{de,en,es,fr,it}.json

Was BLEIBT:
- cloudflared `uload.mana.how` → :3108, `uload-api.mana.how` → :3107,
  `ulo.ad` → :3107 — Standalone-Routes
- docker-compose mana-auth CORS_ORIGINS uload.mana.how + ulo.ad —
  SSO für Standalone

Dexie v67:
- droppt links + uloadTags + uloadFolders + linkTags

mana-web svelte-check 0/0 (7256 files), snapshot test 10/10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:14:40 +02:00

74 lines
2.5 KiB
TypeScript

import type { PageServerLoad } from './$types';
interface ServiceStatus {
name: string;
url: string;
status: 'up' | 'down' | 'degraded';
responseTimeMs: number;
details?: string;
}
// The per-app HTTP backends (todo, calendar, contacts, chat, storage,
// cards, music, food, picture, presi, quotes, clock, context) were
// removed in the pre-launch ghost-API cleanup — every product module now
// reads/writes the unified Dexie database via mana-sync.
const SERVICES = [
{ name: 'Auth', url: process.env.PUBLIC_MANA_AUTH_URL || 'http://localhost:3001' },
{ name: 'Sync', url: process.env.PUBLIC_SYNC_SERVER_URL || 'http://localhost:3010' },
{ name: 'Media', url: process.env.PUBLIC_MANA_MEDIA_URL || 'http://localhost:3011' },
{ name: 'LLM', url: process.env.PUBLIC_MANA_LLM_URL || 'http://localhost:3025' },
{ name: 'Geocoding', url: process.env.PUBLIC_MANA_GEOCODING_URL || 'http://localhost:3018' },
{ name: 'Events', url: process.env.PUBLIC_MANA_EVENTS_URL || 'http://localhost:3115' },
];
async function checkService(service: { name: string; url: string }): Promise<ServiceStatus> {
const start = performance.now();
try {
const res = await fetch(`${service.url}/health`, {
signal: AbortSignal.timeout(5000),
});
const responseTimeMs = Math.round(performance.now() - start);
if (res.ok) {
return {
name: service.name,
url: service.url,
status: responseTimeMs > 2000 ? 'degraded' : 'up',
responseTimeMs,
};
}
return {
name: service.name,
url: service.url,
status: 'down',
responseTimeMs,
details: `HTTP ${res.status}`,
};
} catch (e) {
return {
name: service.name,
url: service.url,
status: 'down',
responseTimeMs: Math.round(performance.now() - start),
details: e instanceof Error ? e.message : 'Connection failed',
};
}
}
export const load: PageServerLoad = async () => {
const results = await Promise.all(SERVICES.map(checkService));
const upCount = results.filter((s) => s.status === 'up').length;
const degradedCount = results.filter((s) => s.status === 'degraded').length;
const downCount = results.filter((s) => s.status === 'down').length;
let overallStatus: 'operational' | 'degraded' | 'outage' = 'operational';
if (downCount > 0) overallStatus = downCount > results.length / 2 ? 'outage' : 'degraded';
else if (degradedCount > 0) overallStatus = 'degraded';
return {
services: results,
summary: { up: upCount, degraded: degradedCount, down: downCount, total: results.length },
overallStatus,
checkedAt: new Date().toISOString(),
};
};