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`.