From 0aabfc8a7223de1e67de14d6a3ec650e7b64a142 Mon Sep 17 00:00:00 2001 From: Joachim Friberg Date: Sun, 19 Apr 2026 22:25:22 +0200 Subject: [PATCH 1/5] Add llama-server and open-webui apps for local LLM inference - llama-server: llama.cpp REST API server, 8G memory, port 8080 - open-webui: Chat UI connecting to llama-server, 2G memory, port 3000 - Both include x-casaos metadata for ZimaOS app store - README with model download instructions and API examples --- Apps/llama-server/README.md | 86 +++++++++++++++++++++++++++ Apps/llama-server/docker-compose.yaml | 82 +++++++++++++++++++++++++ Apps/open-webui/README.md | 73 +++++++++++++++++++++++ Apps/open-webui/docker-compose.yaml | 68 +++++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 Apps/llama-server/README.md create mode 100644 Apps/llama-server/docker-compose.yaml create mode 100644 Apps/open-webui/README.md create mode 100644 Apps/open-webui/docker-compose.yaml diff --git a/Apps/llama-server/README.md b/Apps/llama-server/README.md new file mode 100644 index 0000000..18cb37d --- /dev/null +++ b/Apps/llama-server/README.md @@ -0,0 +1,86 @@ +# Llama Server + +Local LLM inference server using llama.cpp. Serves GGUF models via OpenAI-compatible REST API. + +## Purpose + +- **Port**: 8080 (TCP) +- **Memory**: 8G reservation (7B Q4 models fit in ~6-7GB RAM) +- **Category**: AI / LLM inference + +CPU-only inference with AVX2/AVX512 auto-detection. No GPU needed. + +## Model Setup + +llama-server does not bundle models. You must download GGUF files manually. + +SSH into your ZimaOS device and run: + +```bash +# Create models directory +mkdir -p /DATA/AppData/llama-server/models + +# Example: Download Llama 3.2 3B Q4_K_M (~1.8GB) +curl -L -o /DATA/AppData/llama-server/models/llama-3.2-3b-q4_k_m.gguf \ + "https://huggingface.co/QuantFactory/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct.Q4_K_M.gguf" +``` + +## Recommended Models for 16GB RAM + +| Model | Size | Quant | RAM Needed | Speed (est.) | +|-------|------|-------|------------|--------------| +| Llama 3.2 3B | 1.8GB | Q4_K_M | ~4GB | ~15-20 tok/s | +| Phi-3.5 Mini 3B | 1.8GB | Q4_K_M | ~4GB | ~15-20 tok/s | +| Mistral 7B | 4.1GB | Q4_K_M | ~6-7GB | ~8-12 tok/s | +| Qwen 2.5 7B | 4.4GB | Q4_K_M | ~6-7GB | ~8-12 tok/s | + +For 7B models, close other apps to free RAM. 8G reservation leaves headroom. + +## Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `MODEL` | `llama-3.2-3b-q4_k_m.gguf` | Model filename in `/models` | +| `CTX_SIZE` | `2048` | Context window size (tokens) | +| `N_THREADS` | `0` | CPU threads (0 = auto) | +| `HOST` | `0.0.0.0` | Listen address | +| `PORT` | `8080` | API port | +| `MAX_TOKENS` | `512` | Max tokens per response | + +Change `MODEL` to match your downloaded file. Restart container after changing. + +## API Testing + +Once running, test the API: + +```bash +# Check server info +curl http://localhost:8080/v1/models + +# Chat completions (OpenAI-compatible) +curl http://localhost:8080/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "llama-3.2-3b-q4_k_m.gguf", + "messages": [{"role": "user", "content": "Hello, who are you?"}], + "max_tokens": 128 + }' +``` + +## Volumes + +| Path | Description | +|------|-------------| +| `/models` | GGUF model files | +| `/logs` | Server log output | + +## Architecture + +- `amd64` (Intel/AMD x86_64) +- `arm64` (Apple Silicon, ARM servers) + +## Security + +- `security_opt: no-new-privileges:true` +- `cap_drop: ALL` +- CPU-only, no privileged access needed diff --git a/Apps/llama-server/docker-compose.yaml b/Apps/llama-server/docker-compose.yaml new file mode 100644 index 0000000..6cc2126 --- /dev/null +++ b/Apps/llama-server/docker-compose.yaml @@ -0,0 +1,82 @@ +name: llama-server + +services: + llama-server: + image: ghcr.io/ggerganov/llama.cpp:server + container_name: llama-server + restart: unless-stopped + environment: + TZ: Europe/Stockholm + MODEL: llama-3.2-3b-q4_k_m.gguf + CTX_SIZE: "2048" + N_THREADS: "0" + HOST: 0.0.0.0 + PORT: "8080" + MAX_TOKENS: "512" + ports: + - target: 8080 + published: "8080" + protocol: tcp + volumes: + - type: bind + source: /DATA/AppData/$AppID/models + target: /models + - type: bind + source: /DATA/AppData/$AppID/logs + target: /logs + deploy: + resources: + reservations: + memory: 8G + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + x-casaos: + envs: + - container: MODEL + description: + en_us: Model filename inside /models (e.g. llama-3.2-3b-q4_k_m.gguf). Download GGUF files manually into /models. + - container: CTX_SIZE + description: + en_us: Context window size in tokens + - container: N_THREADS + description: + en_us: CPU threads (0 = auto-detect all cores) + - container: MAX_TOKENS + description: + en_us: Maximum tokens to generate per response + - container: TZ + description: + en_us: Timezone, for example Europe/Stockholm + ports: + - container: "8080" + description: + en_us: llama.cpp REST API port + volumes: + - container: /models + description: + en_us: Model GGUF files directory + - container: /logs + description: + en_us: Server log output + +x-casaos: + architectures: + - amd64 + - arm64 + main: llama-server + category: ai + author: Joachim Friberg + developer: Joachim Friberg + icon: https://cdn.simpleicons.org/llama + tagline: + en_us: CPU-only LLM inference server with REST API + description: + en_us: > + Local LLM inference server using llama.cpp. Serves GGUF models via OpenAI-compatible REST API. + CPU-only with AVX2/AVX512 optimization. Requires manual model download. + title: + en_us: Llama Server + index: / + port_map: "8080" diff --git a/Apps/open-webui/README.md b/Apps/open-webui/README.md new file mode 100644 index 0000000..a0fdb86 --- /dev/null +++ b/Apps/open-webui/README.md @@ -0,0 +1,73 @@ +# OpenWebUI + +Modern chat web interface for local LLMs. Connects to llama-server via Docker internal networking. + +## Purpose + +- **Port**: 3000 (TCP) +- **Memory**: 2G reservation +- **Category**: AI / LLM UI + +Requires the **llama-server** app to be running first. Connects to `http://llama-server:8080` internally. + +## Prerequisites + +1. Deploy and start **llama-server** app first +2. Download a GGUF model into llama-server's `/models` directory +3. Ensure llama-server container is healthy + +## Access + +Open in browser: + +``` +http://:3000 +``` + +First run may take a moment to initialize. + +## Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `OLLAMA_BASE_URL` | `http://llama-server:8080` | Internal URL to llama-server API | +| `WEBUI_PORT` | `3000` | Container listen port | +| `TZ` | `Europe/Stockholm` | Timezone | + +## If Connection Fails + +1. Verify llama-server is running: `docker ps | grep llama-server` +2. Check llama-server logs: `docker logs llama-server` +3. Ensure llama-server MODEL env matches your downloaded file +4. From ZimaOS shell, test connectivity: + ```bash + curl http://llama-server:8080/v1/models + ``` + +## Volumes + +| Path | Description | +|------|-------------| +| `/app/backend/data` | OpenWebUI persistent data (chat history, settings) | + +## Architecture + +- `amd64` (Intel/AMD x86_64) +- `arm64` (Apple Silicon, ARM servers) + +## Security + +- `security_opt: no-new-privileges:true` +- `cap_drop: ALL` + +## Troubleshooting + +**"Cannot connect to LLM" error in UI** +- Verify llama-server is running before open-webui +- Check that `OLLAMA_BASE_URL` is set to `http://llama-server:8080` +- Verify model file exists in `/DATA/AppData/llama-server/models/` + +**Slow responses** +- 7B models on CPU are limited by single-thread performance +- 3B models recommended for interactive speeds (~15+ tok/s) +- Close other apps to free RAM diff --git a/Apps/open-webui/docker-compose.yaml b/Apps/open-webui/docker-compose.yaml new file mode 100644 index 0000000..8569bb3 --- /dev/null +++ b/Apps/open-webui/docker-compose.yaml @@ -0,0 +1,68 @@ +name: open-webui + +services: + open-webui: + image: ghcr.io/open-webui/open-webui:main + container_name: open-webui + restart: unless-stopped + environment: + TZ: Europe/Stockholm + OLLAMA_BASE_URL: http://llama-server:8080 + WEBUI_PORT: "3000" + ports: + - target: 3000 + published: "3000" + protocol: tcp + volumes: + - type: bind + source: /DATA/AppData/$AppID/data + target: /app/backend/data + deploy: + resources: + reservations: + memory: 2G + depends_on: + - llama-server + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + x-casaos: + envs: + - container: OLLAMA_BASE_URL + description: + en_us: Internal URL to llama-server API (http://llama-server:8080) + - container: WEBUI_PORT + description: + en_us: Web UI listen port inside container + - container: TZ + description: + en_us: Timezone, for example Europe/Stockholm + ports: + - container: "3000" + description: + en_us: OpenWebUI web interface port + volumes: + - container: /app/backend/data + description: + en_us: OpenWebUI persistent data (chat history, settings) + +x-casaos: + architectures: + - amd64 + - arm64 + main: open-webui + category: ai + author: Joachim Friberg + developer: Joachim Friberg + icon: https://cdn.simpleicons.org/webui + tagline: + en_us: Modern chat UI for local LLMs + description: + en_us: > + OpenWebUI provides a modern, feature-rich web interface for interacting with local LLMs. + Connect to llama-server or any OpenAI-compatible API. Requires llama-server app to be running first. + title: + en_us: OpenWebUI + index: / + port_map: "3000" From ed75613a08f7ad0ed6bc27e93e15dba665507f3d Mon Sep 17 00:00:00 2001 From: Joachim Friberg Date: Sun, 19 Apr 2026 22:26:10 +0200 Subject: [PATCH 2/5] Build appstore zip with llama-server and open-webui --- dist/phirna-appstore.zip | Bin 303044 -> 307981 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/phirna-appstore.zip b/dist/phirna-appstore.zip index 543edfa11f5d7b54ffe13905a54fb016d6f8318b..647bda7cfc97c400f75cd7d60d9e1eabc9f4d3e5 100644 GIT binary patch delta 11345 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 delta 6581 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 Date: Sun, 19 Apr 2026 22:30:54 +0200 Subject: [PATCH 3/5] Fix llama.cpp image reference: use ghcr.io/ggml-org/llama.cpp:server-b8840 with digest --- Apps/llama-server/README.md | 2 ++ Apps/llama-server/docker-compose.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Apps/llama-server/README.md b/Apps/llama-server/README.md index 18cb37d..e8c632a 100644 --- a/Apps/llama-server/README.md +++ b/Apps/llama-server/README.md @@ -2,6 +2,8 @@ Local LLM inference server using llama.cpp. Serves GGUF models via OpenAI-compatible REST API. +**Image**: `ghcr.io/ggml-org/llama.cpp:server-b8840` (CPU-only, AVX2/AVX512) + ## Purpose - **Port**: 8080 (TCP) diff --git a/Apps/llama-server/docker-compose.yaml b/Apps/llama-server/docker-compose.yaml index 6cc2126..d2557a7 100644 --- a/Apps/llama-server/docker-compose.yaml +++ b/Apps/llama-server/docker-compose.yaml @@ -2,7 +2,7 @@ name: llama-server services: llama-server: - image: ghcr.io/ggerganov/llama.cpp:server + image: ghcr.io/ggml-org/llama.cpp:server-b8840@sha256:99d2554c4c8d5339649dde530056cf10771823d7cd983dbd0441da9c419976b1 container_name: llama-server restart: unless-stopped environment: From eb340eb664976570a2d6739381cb4d6d5cbcc9db Mon Sep 17 00:00:00 2001 From: Joachim Friberg Date: Sun, 19 Apr 2026 22:32:01 +0200 Subject: [PATCH 4/5] Rebuild appstore zip with fixed llama.cpp image --- dist/phirna-appstore.zip | Bin 307981 -> 308090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/phirna-appstore.zip b/dist/phirna-appstore.zip index 647bda7cfc97c400f75cd7d60d9e1eabc9f4d3e5..fb7db147caa570865947d02dce12e945bcc69804 100644 GIT binary patch delta 7025 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 VNPjTGGrB1HFJ$2KNP$%${{!{pEn)xw delta 7124 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 From 100213de2de12db1088da452917dec6892e44478 Mon Sep 17 00:00:00 2001 From: Joachim Friberg Date: Mon, 20 Apr 2026 10:19:43 +0200 Subject: [PATCH 5/5] Added publishing info to agents.md --- AGENTS.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 0b94ccb..67d8ed7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -122,9 +122,63 @@ Filen ska vara praktiskt körbar och innehålla: - exakta kommandon för att verifiera DNS, nät och TLS, - en sektion \"data att samla\" för snabb Codex-felsökning. -Sektionen \"data att samla\" ska minst täcka: +Sektionen "data att samla" ska minst täcka: - versions-/buildinfo (appversion, branch/commit eller zip + checksum), - relevant konfiguration (med maskade secrets), - loggar från berörda containers, - konkreta felobservationer (hostname, tidpunkt, förväntat vs faktiskt beteende). + +## 11) Release- och publiceringsarbetsflöde + +### Steg 1: Branch +Skapa branch enligt format i sektion 8: +`//` + +### Steg 2: Verifiera images (innan commit) +Kontrollera att alla Docker-images är tillgängliga online. Scriptet `build-appstore-zip.sh` verifierar automatiskt -- kör det för att kontrollera, eller använd: + +```bash +docker manifest inspect +``` + +### Steg 3: Validera lokalt +Kör validering innan commit: + +```bash +./scripts/validate-appstore.sh +``` + +### Steg 4: Committa ändringar +- Små, reviewbara commits. +- Separera appfiler från `dist/`-filer. +- Commit-meddelande: rubrik + bulletpunkter. + +### Steg 5: Bygg appstore-zip + +```bash +./scripts/build-appstore-zip.sh +``` + +- Skapar `dist/phirna-appstore.zip`. +- Verifierar alla images online automatiskt. +- Genererar SHA256 checksum. +- Med `CI=true` eller `--strict-images` misslyckas bygget om en image saknas. + +### Steg 6: Committa dist/ +Separer commit för `dist/` från appfiler: + +```bash +git add dist/ && git commit -m "Build appstore zip" +``` + +### Steg 7: Push och PR + +```bash +git push -u origin +``` + +PR ska inkludera: +- Vilka app-id som påverkas. +- Säkerhetsrisk (låg/medel/hög). +- Högrisk-inställningar vid introduktion eller förändring.