From 002f91464c71dcabf0de6b809d9d9e0eb7de5a10 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Sun, 24 May 2026 01:51:08 +0200
Subject: [PATCH] kp
---
TOPICS.md | 6 ++
b-reference/platform/infrastructure.md | 112 +++++++++++++++++++++++++
b-reference/product.md | 18 ++--
c-work/_CHANGELOG.md | 4 +
4 files changed, 131 insertions(+), 9 deletions(-)
create mode 100644 b-reference/platform/infrastructure.md
diff --git a/TOPICS.md b/TOPICS.md
index 01909de..40074b8 100644
--- a/TOPICS.md
+++ b/TOPICS.md
@@ -66,6 +66,12 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en).
| Teamsbot Director Prompts (done) | c-work/4-done/2026-04-teamsbot-director-prompts.md | Private Operator-Prompts (One-Shot/Persistent), Hybrid SPEECH_TEAMS+Agent (`needsAgent`), `_activeServices`-Registry, Reconnect-Persistenz, 26 Backend-Tests |
| **Typed Action Architecture** (canonical) | b-reference/gateway/architecture.md (Abschnitt 4-Schichten), b-reference/gateway/workflow.md (Abschnitt Typed Action Architecture), b-reference/gateway/ai-agent.md (Tool-Generierung aus Catalog), b-reference/gateway/features/trustee.md, b-reference/frontend-nyla/architecture.md (FlowEditor), c-work/3-validate/2026-04-typed-action-architecture.md, c-work/1-plan/2026-04-typed-action-followups.md | Catalog → Methods → Adapter → Runtime; FeatureInstanceRef-Envelope; Pick-not-Push; `*`-Wildcard; Save-with-errors (AC-9); DB-CLI `script_migrate_feature_instance_refs.py`; Vitest+RTL FE-Tests |
+## Infrastruktur & Deployment
+
+| Thema | Datei | Wann laden |
+|-------|-------|------------|
+| Deployment-Infrastruktur | b-reference/platform/infrastructure.md | Infomaniak-Projekte, Naming Convention, VM-Instanzen, Deploy-Patterns |
+
## Prozess & Betrieb
| Thema | Datei | Wann laden |
diff --git a/b-reference/platform/infrastructure.md b/b-reference/platform/infrastructure.md
new file mode 100644
index 0000000..208bdd3
--- /dev/null
+++ b/b-reference/platform/infrastructure.md
@@ -0,0 +1,112 @@
+
+
+
+# Deployment-Infrastruktur
+
+## Hosting-Provider
+
+Infomaniak Public Cloud (OpenStack) unter dem Dach-Account **PowerOnUniverse** (ID 17397).
+
+Horizon Dashboard: `https://api.pub1.infomaniak.cloud/horizon`
+
+## Projektstruktur
+
+Jeder Service-Bereich ist ein eigenes OpenStack-Projekt mit eigenem Netzwerk, eigenen Security Groups, eigenen Floating IPs. Die Kommunikation zwischen Projekten laeuft ueber oeffentliche Floating IPs.
+
+| Projekt | OpenStack-ID | Zweck |
+|---|---|---|
+| **Porta** | PCP-OUJTOXY | Plattform-Kern (Frontend, Backend, DB) |
+| **Service-LLM** | PCP-MPXPVCR | Private LLM (Ollama + Flask, GPU) |
+| **Service-Teamsbot** | PCP-KO2UYXT | Teams-Browser-Bot |
+
+## Naming Convention
+
+### Schema
+
+```
+{bereich}-{env}-{komponente}
+```
+
+- **bereich:** `porta` (Plattform-Kern) oder `service` (eigenstaendiger Service)
+- **env:** `main` (Produktion) oder `int` (Integration)
+- **komponente:** Forgejo-Repo-Name oder `db`
+
+### Regeln
+
+1. Alles fuer PORTA laeuft im Projekt **Porta** mit:
+ - `porta-main-` fuer alle Produktions-Komponenten
+ - `porta-int-` fuer alle Integrations-Komponenten
+
+2. Alle eigenstaendigen Services laufen je als **separates Projekt** mit:
+ - `service-main-` fuer Produktion
+ - `service-int-` fuer Integration (falls vorhanden)
+
+### Instanzen
+
+#### Projekt: Porta (PCP-OUJTOXY)
+
+| Instanzname | Env | Komponente | Flavor | Intern IP | Floating IP | DNS |
+|---|---|---|---|---|---|---|
+| `porta-main-ui-nyla` | main | Frontend (React/Vite) | a2-ram4-disk20-perf1 | 10.20.0.92 | 37.156.43.5 | `porta.poweron.swiss` |
+| `porta-main-platform-core` | main | Backend (FastAPI) | a2-ram4-disk50-perf1 | 10.20.0.197 | 83.228.234.207 | `api.poweron.swiss` |
+| `porta-main-db` | main | PostgreSQL + pgvector | a2-ram4-disk80-perf1 | 10.20.0.21 | 37.156.40.141 | -- |
+| `porta-int-ui-nyla` | int | Frontend (React/Vite) | a2-ram4-disk20-perf1 | 10.20.0.182 | 37.156.41.74 | `porta-int.poweron.swiss` |
+| `porta-int-platform-core` | int | Backend (FastAPI) | a2-ram4-disk50-perf1 | 10.20.0.74 | 37.156.43.14 | `api-int.poweron.swiss` |
+| `porta-int-db` | int | PostgreSQL + pgvector | a2-ram4-disk80-perf1 | 10.20.0.175 | 37.156.42.67 | -- |
+
+Key Pair: `ida-laptop` (alle Instanzen)
+
+#### Projekt: Service-LLM (PCP-MPXPVCR)
+
+| Instanzname | Env | Komponente | Flavor | DNS / IP |
+|---|---|---|---|---|
+| `service-main-llm-private` | main | Ollama + Flask (Vision-LLM) | GPU L4 (24 GB VRAM), 8 vCPU, 16 GB RAM, 150 GB | `83.228.200.109` |
+
+#### Projekt: Service-Teamsbot (PCP-KO2UYXT)
+
+| Instanzname | Env | Komponente | Flavor | Floating IP | DNS |
+|---|---|---|---|---|---|
+| `service-main-teams-browser-bot` | main | Docker + Playwright/Chrome | a2-ram4-disk20 | 179.237.73.4 | `teamsbot.poweron.swiss` |
+
+Key Pair: `teamsbot-deploy-key`
+
+## Deployment-Patterns
+
+### Porta (git pull + systemd restart)
+
+Deploy-Workflow: `.forgejo/workflows/deploy.yml` in `plattform-core`
+
+1. Forgejo Actions Runner verbindet per SSH auf die VM
+2. `git fetch origin main && git reset --hard origin/main`
+3. `pip install -r requirements.txt`
+4. `sudo systemctl restart gateway`
+
+### Private LLM (rsync + systemd restart)
+
+Deploy-Workflow: `.github/workflows/deploy.yml` in `service-llm-private`
+
+1. GitHub Actions (noch nicht migriert auf Forgejo) verbindet per SSH
+2. `rsync` des Codes nach `/opt/ollama-webapp/app/`
+3. `pip install -r requirements.txt`
+4. `sudo systemctl restart ollama-webapp`
+
+### Teams-Bot (rsync + docker compose, geplant)
+
+Deploy-Workflow: `.forgejo/workflows/deploy.yml` in `service-teams-browser-bot`
+
+1. Forgejo Actions Runner verbindet per SSH auf die VM
+2. `rsync` des Codes nach `/opt/teamsbot/`
+3. `docker compose build && docker compose up -d`
+4. Health-Check auf Port 4100
+
+## Zugriff
+
+| Ressource | URL / Pfad |
+|---|---|
+| Infomaniak Cloud Console | `https://www.infomaniak.com/cloud-computing` |
+| OpenStack Horizon | `https://api.pub1.infomaniak.cloud/horizon` |
+| Forgejo (Git + CI/CD) | `https://git.poweron.swiss` |
+| SSH Key (LLM) | `ollama-deploy-key.pem` |
+| SSH Key (Teamsbot) | `teamsbot-deploy-key.pem` (geplant) |
+
+Credentials: siehe lokale Datei `local/notes/key.txt` (nicht im Repo).
diff --git a/b-reference/product.md b/b-reference/product.md
index 2586e01..1501a49 100644
--- a/b-reference/product.md
+++ b/b-reference/product.md
@@ -1,5 +1,5 @@
-
+
# PowerOn PORTA -- Komponentenübersicht
@@ -9,11 +9,11 @@ PowerOn PORTA ist eine Multi-Tenant SaaS-Plattform mit Feature-Store-Modell, AI-
## Komponenten
-| Komponente | Repository | Technologie | Beschreibung |
+| Komponente | Repository (Forgejo) | Technologie | Beschreibung |
|-----------|-----------|-------------|-------------|
-| Frontend Nyla | frontend_nyla | React/TypeScript, Vite | Zentrales UI für alle Features |
-| Gateway | gateway | FastAPI, Python, PostgreSQL | Backend REST-API, Services, AI-Core |
-| Private LLM | private-llm | Python | Internes LLM für Neutralisierung + sensitive Daten |
+| Frontend Nyla | ui-nyla | React/TypeScript, Vite | Zentrales UI für alle Features |
+| Platform Core | plattform-core | FastAPI, Python, PostgreSQL | Backend REST-API, Services, AI-Core |
+| Private LLM | service-llm-private | Python | Internes LLM für Neutralisierung + sensitive Daten |
| Teams Bot | service-teams-browser-bot | TypeScript/Node.js | Bot für Teams-Meeting-Teilnahme |
| Wiki | wiki | Markdown | Dokumentation (dieses Repo) |
@@ -21,10 +21,10 @@ PowerOn PORTA ist eine Multi-Tenant SaaS-Plattform mit Feature-Store-Modell, AI-
| Layer | Technologie | Pfad |
|-------|------------|------|
-| Backend (Gateway) | FastAPI (Python), PostgreSQL | `@poweron/gateway` |
-| Frontend | React/TypeScript (Vite) | `@poweron/frontend_nyla` |
-| AI Core | Multi-Provider (Anthropic, OpenAI, Mistral, Perplexity, Tavily, PrivateLLM) | `@poweron/gateway/modules/aicore` |
-| DB-Connector | PostgreSQL mit pgvector (Embeddings) | `@poweron/gateway/modules/connectors/connectorDbPostgre.py` |
+| Backend (Platform Core) | FastAPI (Python), PostgreSQL | `plattform-core` |
+| Frontend (Nyla) | React/TypeScript (Vite) | `ui-nyla` |
+| AI Core | Multi-Provider (Anthropic, OpenAI, Mistral, Perplexity, Tavily, PrivateLLM) | `plattform-core/modules/aicore` |
+| DB-Connector | PostgreSQL mit pgvector (Embeddings) | `plattform-core/modules/connectors/connectorDbPostgre.py` |
## Feature-Module
diff --git a/c-work/_CHANGELOG.md b/c-work/_CHANGELOG.md
index da2326f..c794b09 100644
--- a/c-work/_CHANGELOG.md
+++ b/c-work/_CHANGELOG.md
@@ -12,6 +12,10 @@ type: `feat` `fix` `refactor` `docs` `test` `chore` `build` · scope: `gateway
Skip: reine Refactors, Formatting, Lint, Dep-Bumps, Test-only, Wiki-Tippfehler.
+## 2026-05-24
+
+- 2026-05-24 | docs | infra | **Deployment-Infrastruktur Doku** -- Neue kanonische Seite `b-reference/platform/infrastructure.md`: Infomaniak-Projektstruktur (Porta, LLM, Teamsbot), Naming Convention (`{bereich}-{env}-{komponente}`), VM-Instanzenliste, Deploy-Patterns. TOPICS.md ergaenzt.
+
## 2026-05-23
- 2026-05-23 | feat | gateway+frontend-nyla | **DB Migration Backup/Restore** — Neuer Tab "Migration" auf der Datenbank-Gesundheit-Seite (SysAdmin). Backup: dynamische DB-Auswahl via Registry, Export als JSON. Restore: JSON-Upload, Validierung, Import mit Modus "Neu" (replace) oder "Zusammenfuehren" (merge). System-Objekte (Root-Mandant, Admin-User, Event-User) werden nie geloescht; ihre IDs werden beim Import automatisch auf die Live-IDs remapped. Neue Dateien: `databaseMigration.py`, 4 API-Endpoints unter `/api/admin/database-health/migration/`, MigrationTab in `AdminDatabaseHealthPage.tsx`.