Files

251 lines
6.1 KiB
Markdown
Raw Permalink Normal View History

2026-06-09 10:41:13 +00:00
# Foodlinkk Command Center — Platform A tot Z
*Laatst bijgewerkt: juni 2026 · VM106 `10.4.7.18`*
---
## A. Architectuur
```
Proxmox 10.4.7.14 (Dell R340)
├── VM105 10.4.7.19 — Ollama, ChromaDB, Herman orchestrator :8090
└── VM106 10.4.7.18 — Command Center (Docker)
├── cockpit :8600
├── tools-api :8700
├── gitea :3001
├── email-agent :8801
├── browser-agent :7790
├── prometheus :9090
├── grafana :3002
└── PostgreSQL foodlinkk_db (host)
```
**Dataflow:** Browser → Cockpit → (proxy) Tools API → PostgreSQL / externe APIs
---
## B. Bestandslocaties
| Pad | Inhoud |
|-----|--------|
| `/home/aissa/foodlinkk-command-center` | Volledige monorepo (live) |
| `/home/aissa/nas-clients` | Klant-NAS (gemount in cockpit) |
| `/tmp/sysops-daily.log` | SysOps cron log |
| `/tmp/herman-daily.log` | Herman briefing cron |
---
## C. Cockpit — alle pagina's
| Route | Module |
|-------|--------|
| `/` | Herman CEO dashboard |
| `/herman` | Herman chat (delegatie, packaging, foto's) |
| `/agents` | Souls, mesh, goedkeuringen, events |
| `/retail` | Retail 360 |
| `/marketing` | Social, reclame, RSS |
| `/clients` | CRM + supermarkten |
| `/products`, `/suppliers` | Assortiment & inkoop |
| `/projects` | Food-business projecten + NAS |
| `/packaging` | Packaging Studio |
| `/ops` | IT topology, SysOps verslag, Gitea |
| `/documents` | Documenten hub |
| `/settings` | Email, social, Herman permissions |
| `/studio` | ComfyUI |
| `/beurs` | Marktdata |
---
## D. Database (PostgreSQL)
Migraties in `migrations/`:
| # | Onderwerp |
|---|-----------|
| 001 | agent_events, clients |
| 005008 | email, browser, pgvector |
| 011017 | retail 360, CRM |
| 016 | packaging agent, sysops soul |
| 018 | agent_action_requests (goedkeuringen) |
| 019 | cockpit_projects, project_assets |
| 021 | locale_preferences (i18n) |
| 022 | NAS-structuur per klant |
| 023 | sysops_activity log |
**Kern-tabellen:** `agent_souls`, `agent_events`, `agent_action_requests`, `cockpit_projects`, `project_assets`, `packaging_outputs`, `config_backups`, `sysops_activity`, `clients`, `supermarkets`, `deals`
---
## E. Agents (16 + Herman)
| Key | Rol |
|-----|-----|
| herman | Co-CEO, briefing, orchestratie |
| sysops | IT, Gitea sync, maintenance |
| packaging | Verpakkingsontwerp |
| marketing | Social, campagnes |
| retail | Supermarkten 360 |
| research | Marktonderzoek |
| design | ComfyUI |
2026-06-09 12:56:59 +00:00
| … | bizdev, finance, sourcing, product, halal, knowledge, browser, hr, email |
2026-06-09 10:41:13 +00:00
**Events:** `agent_events` — zichtbaar op `/agents`, klikbaar per agent.
**Goedkeuringen:** SysOps vraagt vóór maintenance scan en optionele backup.
---
## F. SysOps — Gitea & verslag
### Automatische Gitea push
Bij **elke deploy** (`deploy-all.sh`):
1. Rsync code naar VM106
2. Docker rebuild
3. **SysOps pusht volledige repo** naar Gitea `main` (user `sysops`)
API: `POST /ops/gitea/sync` body `{"reason":"manual"}`
### Goedgekeurde backup
Na CEO ✓ op approval `config_backup` → zelfde volledige repo-sync.
### Activiteitenlog
Tabel `sysops_activity`:
- `gitea_sync` — deploy, backup
- `maintenance_scan` — na scan
Zichtbaar op **IT Ops** (`/ops`) → paneel "SysOps verslag".
### Herman briefing
`collect_briefing_data()` leest:
- `sysops_activity_24h`
- `sysops_events_24h`
- Sectie **"SysOps IT — laatste 24 uur"** in dagrapport
Cron: 07:00 SysOps requests, 07:30 Herman briefing.
---
## G. Gitea
- URL: http://10.4.7.18:3001
- Repo: `aissa/foodlinkk-command-center`
- SysOps user: `sysops` (write, setup via `scripts/setup_gitea_sysops.sh`)
- Documentatie staat **in de repo** onder `docs/`
**Clone op andere machine:**
```bash
git clone http://10.4.7.18:3001/aissa/foodlinkk-command-center.git
```
---
## H. Herman
- Chat: `/api/herman/chat`
- Briefing: `POST /api/herman/briefing`
- Orchestrator: `HERMAN_ORCHESTRATOR_URL` → VM105 `:8090`
- Packaging opdracht: `maak verpakking: pouch 100×140 voor Product X project #5`
---
## I. Packaging
- UI: `/packaging` — 6 types, brand, tekst, NAS-export
- API: Tools API `/packaging/*`
- NAS: `{klant}/projects/{id}/packaging/*.svg|png|pdf|json`
- Herman: `packaging_agent.py` → generate + events
---
## J. Projecten & NAS
Per klant: `/home/aissa/nas-clients/{slug}/`
Per project: `projects/{id-naam}/photos|documents|packaging|exports|briefs/`
API: `/api/projects` — create met `ensure_nas: true`
---
## K. Deploy
```bash
# Vanaf dev machine met /tmp/foodlinkk-deploy of lokale clone:
bash deploy-all.sh
```
Stappen: rsync → migraties → docker build → health checks → Gitea sync → Herman briefing.
Omgevingsvariabelen: `.env.example` (niet committen).
---
## L. i18n
- `cockpit/static/i18n/nl.json`, `en.json`
- Selector in topbar
- Uitgebreid: nav, clients, products, suppliers
---
## M. Monitoring
- Prometheus `:9090`, Grafana `:3002`
- IT Ops topology: Proxmox + services live
- Infra snapshots: `infra_snapshots`
---
## N. Email
- Settings → SMTP accounts
- Tools API `POST /emails/send`
- Packaging kan designs emailen met downloadlinks
---
## O. Ontwikkeling
| Component | Tech |
|-----------|------|
| Cockpit | Python 3.11, FastAPI, Jinja2, Alpine.js |
| Tools API | FastAPI, psycopg2 |
| Viz | Chart.js, viz-engine.js |
| Packaging | svgwrite, python-barcode, Pillow, reportlab |
**Tests:** health curls in `deploy-all.sh` en `docs/DEPLOY.md`
---
## P. Veiligheid
- SysOps: geen destructieve acties zonder goedkeuring
- `.env` in `.gitignore`
- Gitea: geen public registration
- Wachtwoorden in docker-compose op server (niet in git idealiter — gebruik `.env`)
---
## Q. Troubleshooting
| Probleem | Actie |
|----------|-------|
| Cockpit 502 | `docker compose logs cockpit` |
| Gitea push faalt | `scripts/setup_gitea_sysops.sh`, check collaborator |
| Briefing leeg | `python3 scripts/herman_daily_digest.py` |
| NAS map ontbreekt | Project → ensure-nas of opnieuw aanmaken |
---
## R. Referenties
- [ARCHITECTURE.md](./ARCHITECTURE.md)
- [APPS.md](./APPS.md)
- [API.md](./API.md)
- [AGENTS.md](./AGENTS.md)
- [DEPLOY.md](./DEPLOY.md)
- [CONTEXT.md](./CONTEXT.md) — korte Cursor-context