diff --git a/cloudflared-config.yml b/cloudflared-config.yml
index b4bc6ae72..4ece3d2ad 100644
--- a/cloudflared-config.yml
+++ b/cloudflared-config.yml
@@ -22,49 +22,10 @@ ingress:
- hostname: git.mana.how
service: http://localhost:3041
- # ──────────────────────────────────────────────────────────
- # Backend APIs (Hono/Bun compute servers — stay separate)
- # ──────────────────────────────────────────────────────────
- - hostname: chat-api.mana.how
- service: http://localhost:3030
- - hostname: todo-api.mana.how
- service: http://localhost:3031
- - hostname: calendar-api.mana.how
- service: http://localhost:3032
- - hostname: clock-api.mana.how
- service: http://localhost:3033
- - hostname: contacts-api.mana.how
- service: http://localhost:3034
- - hostname: zitare-api.mana.how
- service: http://localhost:3007
- - hostname: skilltree-api.mana.how
- service: http://localhost:3038
- - hostname: cards-api.mana.how
- service: http://localhost:3009
- - hostname: storage-api.mana.how
- service: http://localhost:3035
- - hostname: presi-api.mana.how
- service: http://localhost:3036
- - hostname: nutriphi-api.mana.how
- service: http://localhost:3037
- - hostname: photos-api.mana.how
- service: http://localhost:3039
- - hostname: mukke-api.mana.how
- service: http://localhost:3010
- - hostname: picture-api.mana.how
- service: http://localhost:3040
- - hostname: clock-bot.mana.how
- service: http://localhost:4018
-
- # NOTE: All web app subdomains (chat.mana.how, todo.mana.how, etc.)
- # are removed — they now run as routes under the unified app at mana.how
- # (e.g., mana.how/chat, mana.how/todo, etc.)
-
- # AI Voice Services (local STT/TTS, läuft über mana-service-llm)
- - hostname: stt-api.mana.how
- service: http://localhost:3020
- - hostname: tts-api.mana.how
- service: http://localhost:3022
+ # NOTE: Individual app backends (chat, todo, calendar, contacts, storage,
+ # nutriphi, mukke, planta, picture, etc.) have been REMOVED — all migrated
+ # to local-first architecture. Web apps run as routes under mana.how.
+ # Only uload-server and memoro-server remain as app-specific backends.
# Games
- hostname: whopxl.mana.how
diff --git a/docker/prometheus/prometheus.yml b/docker/prometheus/prometheus.yml
index dcc2a2d89..26567c3d2 100644
--- a/docker/prometheus/prometheus.yml
+++ b/docker/prometheus/prometheus.yml
@@ -46,7 +46,7 @@ scrape_configs:
- targets: ['redis-exporter:9121']
# ============================================
- # Application Backends (after /metrics added)
+ # Core Services (Hono/Bun + Go)
# ============================================
# Auth Service
@@ -56,84 +56,51 @@ scrape_configs:
metrics_path: '/metrics'
scrape_interval: 30s
- # Chat Backend
- - job_name: 'chat-backend'
+ # Credits Service
+ - job_name: 'mana-credits'
static_configs:
- - targets: ['chat-backend:3030']
+ - targets: ['mana-credits:3002']
metrics_path: '/metrics'
scrape_interval: 30s
- # Todo Backend
- - job_name: 'todo-backend'
+ # User Service
+ - job_name: 'mana-user'
static_configs:
- - targets: ['todo-backend:3031']
+ - targets: ['mana-user:3062']
metrics_path: '/metrics'
scrape_interval: 30s
- # Calendar Backend
- - job_name: 'calendar-backend'
+ # Subscriptions Service
+ - job_name: 'mana-subscriptions'
static_configs:
- - targets: ['calendar-backend:3032']
+ - targets: ['mana-subscriptions:3063']
metrics_path: '/metrics'
scrape_interval: 30s
- # Clock Backend: REMOVED — migrated to local-first
-
- # Contacts Backend
- - job_name: 'contacts-backend'
+ # Analytics Service
+ - job_name: 'mana-analytics'
static_configs:
- - targets: ['contacts-backend:3033']
+ - targets: ['mana-analytics:3064']
metrics_path: '/metrics'
scrape_interval: 30s
- # Storage Backend
- - job_name: 'storage-backend'
+ # ULoad Server
+ - job_name: 'uload-server'
static_configs:
- - targets: ['storage-backend:3034']
+ - targets: ['mana-app-uload-server:3070']
metrics_path: '/metrics'
scrape_interval: 30s
- # Presi Backend: REMOVED — replaced by Hono server
-
- # Nutriphi Backend
- - job_name: 'nutriphi-backend'
+ # Memoro Server
+ - job_name: 'memoro-server'
static_configs:
- - targets: ['nutriphi-backend:3038']
+ - targets: ['mana-app-memoro-server:3015']
metrics_path: '/metrics'
scrape_interval: 30s
- # SkillTree Backend: REMOVED — migrated to local-first
-
- # Photos Backend: REMOVED — migrated to local-first + direct mana-media
-
- # CityCorners Backend: REMOVED — migrated to local-first
-
- # Zitare Backend: REMOVED — migrated to local-first
-
- # Mukke Backend
- - job_name: 'mukke-backend'
- static_configs:
- - targets: ['mukke-backend:3037']
- metrics_path: '/metrics'
- scrape_interval: 30s
-
- # Planta Backend
- - job_name: 'planta-backend'
- static_configs:
- - targets: ['planta-backend:3039']
- metrics_path: '/metrics'
- scrape_interval: 30s
-
- # Picture Backend
- - job_name: 'picture-backend'
- static_configs:
- - targets: ['picture-backend:3035']
- metrics_path: '/metrics'
- scrape_interval: 30s
-
- # ============================================
- # Core Services
- # ============================================
+ # NOTE: Individual app backends (chat, todo, calendar, contacts, storage,
+ # nutriphi, mukke, planta, picture) have been REMOVED — all migrated to
+ # local-first architecture. Only uload-server and memoro-server remain.
# Mana LLM Gateway (Ollama + Google Fallback)
- job_name: 'mana-llm'
@@ -255,32 +222,43 @@ scrape_configs:
# Blackbox Exporter — HTTP Uptime Probes
# ============================================
- # Web Apps (SvelteKit frontends)
+ # Web Apps (Unified ManaCore app at mana.how + standalone games)
- job_name: 'blackbox-web'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
+ # Unified ManaCore app (all modules as routes)
- https://mana.how
- - https://chat.mana.how
- - https://todo.mana.how
- - https://calendar.mana.how
- - https://contacts.mana.how
- - https://clock.mana.how
- - https://photos.mana.how
- - https://picture.mana.how
- - https://storage.mana.how
- - https://presi.mana.how
- - https://nutriphi.mana.how
- - https://planta.mana.how
- - https://calc.mana.how
- - https://zitare.mana.how
- - https://cards.mana.how
- - https://skilltree.mana.how
- - https://mukke.mana.how
- - https://citycorners.mana.how
- - https://playground.mana.how
+ - https://mana.how/chat
+ - https://mana.how/todo
+ - https://mana.how/calendar
+ - https://mana.how/contacts
+ - https://mana.how/times
+ - https://mana.how/photos
+ - https://mana.how/picture
+ - https://mana.how/storage
+ - https://mana.how/presi
+ - https://mana.how/nutriphi
+ - https://mana.how/planta
+ - https://mana.how/calc
+ - https://mana.how/zitare
+ - https://mana.how/cards
+ - https://mana.how/skilltree
+ - https://mana.how/mukke
+ - https://mana.how/citycorners
+ - https://mana.how/memoro
+ - https://mana.how/moodlit
+ - https://mana.how/context
+ - https://mana.how/questions
+ - https://mana.how/uload
+ - https://mana.how/notes
+ - https://mana.how/habits
+ - https://mana.how/guides
+ - https://mana.how/inventar
+ - https://mana.how/playground
+ # Standalone games (separate containers)
- https://whopxl.mana.how
- https://arcade.mana.how
relabel_configs:
@@ -291,7 +269,7 @@ scrape_configs:
- target_label: __address__
replacement: blackbox-exporter:9115
- # API Health Endpoints
+ # API Health Endpoints (only services with running containers)
- job_name: 'blackbox-api'
metrics_path: /probe
params:
@@ -300,14 +278,6 @@ scrape_configs:
- targets:
- https://auth.mana.how/health
- https://api.mana.how/health
- - https://chat-api.mana.how/health
- - https://todo-api.mana.how/health
- - https://calendar-api.mana.how/health
- - https://contacts-api.mana.how/health
- - https://storage-api.mana.how/health
- - https://nutriphi-api.mana.how/health
- - https://planta-api.mana.how/health
- - https://picture-api.mana.how/health
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
diff --git a/scripts/generate-status-page.sh b/scripts/generate-status-page.sh
index 8cfab9b7e..7e154eb42 100755
--- a/scripts/generate-status-page.sh
+++ b/scripts/generate-status-page.sh
@@ -59,11 +59,22 @@ get_instances() {
# Freundlicher Name aus URL
friendly_name() {
url="$1"
- # Entferne https:// und .mana.how
+ # Entferne https://
name="${url#https://}"
- name="${name%.mana.how}"
+ # Route-basierte URLs: mana.how/chat → Chat
+ case "$name" in
+ mana.how/*)
+ name="${name#mana.how/}"
+ ;;
+ *)
+ # Subdomain-basiert: chat.mana.how → Chat
+ name="${name%.mana.how}"
+ ;;
+ esac
# Entferne /health suffix
name="${name%/health}"
+ # mana.how (ohne Route) → ManaCore
+ [ "$name" = "mana.how" ] && name="ManaCore"
# Erster Buchstabe groß (POSIX-kompatibel)
printf '%s' "$name" | awk '{print toupper(substr($0,1,1)) substr($0,2)}'
}
@@ -170,21 +181,29 @@ fi
# Gibt Tier-Badge-HTML für eine Blackbox-URL zurück (leer wenn kein Match)
get_tier_badge() {
url="$1"
- # Subdomain extrahieren: https://todo.mana.how → todo, https://todo-api.mana.how/health → todo-api
- subdomain="${url#https://}"
- subdomain="${subdomain%.mana.how*}"
- subdomain="${subdomain%/health}"
+ raw="${url#https://}"
+ # Route-basierte URLs: mana.how/chat → chat
+ case "$raw" in
+ mana.how/*)
+ appid="${raw#mana.how/}"
+ ;;
+ *)
+ # Subdomain-basiert: todo.mana.how → todo
+ appid="${raw%.mana.how*}"
+ appid="${appid%/health}"
+ ;;
+ esac
# API-Subdomains skippen (z.B. todo-api, chat-api)
- case "$subdomain" in *-api) return ;; esac
- # Subdomain-Aliase (Sonderfälle + alte Subdomains → aktuelle App-IDs)
- case "$subdomain" in
- mana.how) subdomain="manacore" ;;
- manadeck) subdomain="cards" ;;
- inventar) subdomain="inventory" ;;
+ case "$appid" in *-api) return ;; esac
+ # Aliase (Sonderfälle → aktuelle App-IDs)
+ case "$appid" in
+ mana.how) appid="manacore" ;;
+ manadeck) appid="cards" ;;
+ inventar) appid="inventory" ;;
esac
echo "$TIER_APPS" | while IFS='|' read -r id name tier st; do
- [ "$id" = "$subdomain" ] || continue
+ [ "$id" = "$appid" ] || continue
printf '%s' "$tier" "$tier"
break
done
@@ -461,6 +480,7 @@ echo "$SUCCESS_JSON" | jq \
| rtrimstr("/health")
| rtrimstr("/")
| if . == "mana.how" then "manacore"
+ elif startswith("mana.how/") then ltrimstr("mana.how/")
else rtrimstr(".mana.how")
end
),
diff --git a/scripts/mac-mini/README.md b/scripts/mac-mini/README.md
index 79839a030..fa218ef52 100644
--- a/scripts/mac-mini/README.md
+++ b/scripts/mac-mini/README.md
@@ -230,17 +230,14 @@ Once running, services are available at:
| Service | URL |
|---------|-----|
-| Dashboard | https://mana.how |
+| Unified App | https://mana.how |
| Auth API | https://auth.mana.how |
-| Chat | https://chat.mana.how |
-| Chat API | https://chat-api.mana.how |
-| Todo | https://todo.mana.how |
-| Todo API | https://todo-api.mana.how |
-| Calendar | https://calendar.mana.how |
-| Calendar API | https://calendar-api.mana.how |
-| Clock | https://clock.mana.how |
-| Clock API | https://clock-api.mana.how |
-| STT API | http://localhost:3020 (internal only) |
+| API Gateway | https://api.mana.how |
+| Forgejo (Git) | https://git.mana.how |
+| Grafana | https://grafana.mana.how |
+| Status Page | https://status.mana.how |
+| GlitchTip | https://glitchtip.mana.how |
+| Umami | https://stats.mana.how |
| SSH | ssh mac-mini (via cloudflared) |
## Native Services (non-Docker)
diff --git a/scripts/mac-mini/deploy.sh b/scripts/mac-mini/deploy.sh
index 4185f95d9..37e4c2be9 100755
--- a/scripts/mac-mini/deploy.sh
+++ b/scripts/mac-mini/deploy.sh
@@ -109,10 +109,10 @@ echo ""
echo "=== Deployment Complete ==="
echo ""
echo "URLs via Cloudflare Tunnel:"
-echo " https://mana.how - Dashboard"
+echo " https://mana.how - Unified App (all modules)"
echo " https://auth.mana.how - Auth API"
-echo " https://chat.mana.how - Chat"
-echo " https://todo.mana.how - Todo"
-echo " https://calendar.mana.how - Calendar"
-echo " https://clock.mana.how - Clock"
+echo " https://api.mana.how - API Gateway"
+echo " https://git.mana.how - Forgejo"
+echo " https://grafana.mana.how - Grafana"
+echo " https://status.mana.how - Status Page"
echo ""
diff --git a/scripts/mac-mini/launchd/com.manacore.image-gen.plist b/scripts/mac-mini/launchd/com.manacore.image-gen.plist
index 15a06d090..f54dbaf2b 100644
--- a/scripts/mac-mini/launchd/com.manacore.image-gen.plist
+++ b/scripts/mac-mini/launchd/com.manacore.image-gen.plist
@@ -34,7 +34,7 @@
GENERATION_TIMEOUT
300
CORS_ORIGINS
- https://mana.how,https://picture.mana.how,https://chat.mana.how
+ https://mana.how
RunAtLoad
diff --git a/scripts/mac-mini/setup-image-gen.sh b/scripts/mac-mini/setup-image-gen.sh
index fa8dc6537..602136cd4 100755
--- a/scripts/mac-mini/setup-image-gen.sh
+++ b/scripts/mac-mini/setup-image-gen.sh
@@ -102,7 +102,7 @@ cat > "$PLIST_PATH" << EOF
GENERATION_TIMEOUT
120
CORS_ORIGINS
- https://mana.how,https://picture.mana.how,https://chat.mana.how,http://localhost:5173
+ https://mana.how,http://localhost:5173
RunAtLoad
diff --git a/scripts/mac-mini/setup-stt.sh b/scripts/mac-mini/setup-stt.sh
index 34277a2e6..2b5dd5258 100755
--- a/scripts/mac-mini/setup-stt.sh
+++ b/scripts/mac-mini/setup-stt.sh
@@ -68,7 +68,7 @@ cat > "$PLIST_PATH" << EOF
PRELOAD_MODELS
false
CORS_ORIGINS
- https://mana.how,https://chat.mana.how,https://todo.mana.how
+ https://mana.how
RunAtLoad
diff --git a/scripts/mac-mini/setup-tts.sh b/scripts/mac-mini/setup-tts.sh
index 2cb8732ca..d6485b7be 100755
--- a/scripts/mac-mini/setup-tts.sh
+++ b/scripts/mac-mini/setup-tts.sh
@@ -75,7 +75,7 @@ cat > "$PLIST_PATH" << EOF
MAX_TEXT_LENGTH
1000
CORS_ORIGINS
- https://mana.how,https://chat.mana.how,https://todo.mana.how,https://zitare.mana.how
+ https://mana.how
RunAtLoad