feat(devops): add Local LLM Lab to ecosystem deployment

- docker-compose.ecosystem.yml: add llmlab-dashboard service (port 3075)
- setup.sh: add learning_ai_local_llms as 12th repo
- README.md: update to 31 services, 11 products, add Docker vs K8s recommendation
- docker/README.md: update port map, phase descriptions
- prompt.md: update repo list and service counts
This commit is contained in:
saravanakumardb1 2026-03-27 00:10:40 -07:00
parent e3f638d609
commit fc12a8eaa2
5 changed files with 229 additions and 135 deletions

View File

@ -39,7 +39,6 @@ secrets:
environment: GITEA_NPM_TOKEN environment: GITEA_NPM_TOKEN
services: services:
# ═════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════
# INFRASTRUCTURE # INFRASTRUCTURE
# ═════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════
@ -529,6 +528,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_voice_ai_agent context: ../learning_voice_ai_agent
dockerfile: user-dashboard-web/Dockerfile dockerfile: user-dashboard-web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003
NEXT_PUBLIC_PRODUCT_ID: lysnrai
ports: ports:
- '3002:3002' - '3002:3002'
environment: environment:
@ -548,6 +551,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_clock context: ../learning_ai_clock
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_BACKEND_URL: http://localhost:4011
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003
ports: ports:
- '3030:3030' - '3030:3030'
environment: environment:
@ -565,6 +572,9 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_jarvis_jr context: ../learning_ai_jarvis_jr
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003
ports: ports:
- '3035:3035' - '3035:3035'
environment: environment:
@ -581,6 +591,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_flowmonk context: ../learning_ai_flowmonk
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_API_URL: http://localhost:4017
NEXT_PUBLIC_PLATFORM_URL: http://localhost:4003/api
ports: ports:
- '3040:3040' - '3040:3040'
environment: environment:
@ -598,6 +612,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_notes context: ../learning_ai_notes
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_NOTES_API_URL: http://localhost:4016/api
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003/api
ports: ports:
- '3045:3045' - '3045:3045'
environment: environment:
@ -615,6 +633,9 @@ services:
<<: *product-build <<: *product-build
context: ../learning_multimodal_memory_agents context: ../learning_multimodal_memory_agents
dockerfile: mindlyst-native/web/Dockerfile dockerfile: mindlyst-native/web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003
ports: ports:
- '3050:3050' - '3050:3050'
environment: environment:
@ -631,6 +652,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_fastgap context: ../learning_ai_fastgap
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_NOMGAP_API_URL: http://localhost:4013/api
NEXT_PUBLIC_PLATFORM_SERVICE_URL: http://localhost:4003/api
ports: ports:
- '3055:3055' - '3055:3055'
environment: environment:
@ -648,6 +673,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_trails context: ../learning_ai_trails
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_API_URL: http://localhost:4018
NEXT_PUBLIC_PLATFORM_URL: http://localhost:4003
ports: ports:
- '3060:3060' - '3060:3060'
environment: environment:
@ -665,6 +694,10 @@ services:
<<: *product-build <<: *product-build
context: ../learning_ai_local_memory_gpt context: ../learning_ai_local_memory_gpt
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
NEXT_PUBLIC_BACKEND_URL: http://localhost:4019
NEXT_PUBLIC_PLATFORM_URL: http://localhost:4003
ports: ports:
- '3070:3070' - '3070:3070'
environment: environment:
@ -677,6 +710,32 @@ services:
condition: service_healthy condition: service_healthy
restart: unless-stopped restart: unless-stopped
# ── Local LLM Lab (no backend — dashboard talks directly to Ollama) ──
llmlab-dashboard:
build:
<<: *product-build
context: ../learning_ai_local_llms
dockerfile: dashboard/Dockerfile
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
OLLAMA_URL: http://host.docker.internal:11434
ports:
- '3075:3075'
environment:
- NODE_ENV=production
- PORT=3075
- OLLAMA_URL=http://host.docker.internal:11434
- OLLAMA_HOST=http://host.docker.internal:11434
extra_hosts:
- 'host.docker.internal:host-gateway'
healthcheck:
test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3075']
interval: 15s
timeout: 5s
retries: 3
restart: unless-stopped
# ═════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════
# VOLUMES # VOLUMES
# ═════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════

View File

@ -1,6 +1,6 @@
# ByteLyst Single-VM Deployment # ByteLyst Single-VM Deployment
> Deploy the **entire ByteLyst ecosystem** (30 services, 10 products) on a single Azure VM. > Deploy the **entire ByteLyst ecosystem** (31 services, 11 products) on a single Azure VM.
> Two orchestration approaches — pick one or learn both side by side. > Two orchestration approaches — pick one or learn both side by side.
--- ---
@ -11,6 +11,7 @@
Proven, battle-tested deployment using `docker-compose.ecosystem.yml`. Proven, battle-tested deployment using `docker-compose.ecosystem.yml`.
Installs everything from scratch on a raw Ubuntu VM in ~20 minutes. Installs everything from scratch on a raw Ubuntu VM in ~20 minutes.
Includes Gitea CI (act_runner) for continuous integration.
```bash ```bash
sudo ./docker/setup.sh # Full install sudo ./docker/setup.sh # Full install
@ -22,7 +23,7 @@ sudo ./docker/setup.sh --resume # Resume after disconnect
### [`k8s/`](k8s/) — Kubernetes via k3s (Learning / Future-ready) ### [`k8s/`](k8s/) — Kubernetes via k3s (Learning / Future-ready)
Same 30 services orchestrated by Kubernetes on a single VM using k3s. Same 31 services orchestrated by Kubernetes on a single VM using k3s.
Builds on the same Docker images — no Dockerfile changes needed. Builds on the same Docker images — no Dockerfile changes needed.
**Use this if:** You want to learn K8s with real services, practice `kubectl`, **Use this if:** You want to learn K8s with real services, practice `kubectl`,
@ -35,21 +36,23 @@ and prepare for multi-node scaling later.
``` ```
Raw Ubuntu 24.04 VM (Standard_D8s_v5: 8 vCPU, 32 GB RAM) Raw Ubuntu 24.04 VM (Standard_D8s_v5: 8 vCPU, 32 GB RAM)
├── Ollama (systemd, :11434) ─── local LLM inference ├── Ollama (systemd, :11434) ─── local LLM inference
├── Gitea (Docker/:3300) ──────── npm package registry ├── Gitea (Docker/:3300) ──────── npm package registry + CI
└── 30 Services ├── act_runner (systemd) ──────── Gitea CI runner (host mode)
└── 31 Services
├── Infrastructure (6): cosmos-emulator, azurite, mailpit, loki, grafana, traefik ├── Infrastructure (6): cosmos-emulator, azurite, mailpit, loki, grafana, traefik
├── Platform (3): platform-service, extraction-service, mcp-server ├── Platform (3): platform-service, extraction-service, mcp-server
├── Dashboards (2): admin-web, tracker-web ├── Dashboards (2): admin-web, tracker-web
├── Backends (10): peakpulse, chronomind, jarvisjr, nomgap, mindlyst, ├── Backends (10): peakpulse, chronomind, jarvisjr, nomgap, mindlyst,
│ lysnrai, notelett, flowmonk, actiontrail, localmemgpt │ lysnrai, notelett, flowmonk, actiontrail, localmemgpt
└── Web Apps (9): lysnrai-dashboard, chronomind-web, jarvisjr-web, flowmonk-web, ├── Web Apps (9): lysnrai-dashboard, chronomind-web, jarvisjr-web, flowmonk-web,
notelett-web, mindlyst-web, nomgap-web, actiontrail-web, localmemgpt-web │ notelett-web, mindlyst-web, nomgap-web, actiontrail-web, localmemgpt-web
└── Standalone (1): llmlab-dashboard (LLM Lab Mission Control)
``` ```
## Comparison ## Comparison
| | Docker Compose | K8s (k3s) | | | Docker Compose | K8s (k3s) |
|--|----------------|-----------| | ------------------- | ------------------ | ---------------------------------- |
| **Setup time** | ~20 min | ~30 min | | **Setup time** | ~20 min | ~30 min |
| **RAM overhead** | ~100 MB | ~600 MB | | **RAM overhead** | ~100 MB | ~600 MB |
| **Config files** | 1 compose + 1 .env | ~30 manifests (or Helm) | | **Config files** | 1 compose + 1 .env | ~30 manifests (or Helm) |
@ -58,3 +61,22 @@ Raw Ubuntu 24.04 VM (Standard_D8s_v5: 8 vCPU, 32 GB RAM)
| **Resource limits** | Basic | Fine-grained per pod | | **Resource limits** | Basic | Fine-grained per pod |
| **Multi-VM ready** | Docker Swarm | Native `kubectl join` | | **Multi-VM ready** | Docker Swarm | Native `kubectl join` |
| **Learning value** | Low | High (transferable to AKS/EKS/GKE) | | **Learning value** | Low | High (transferable to AKS/EKS/GKE) |
## Recommendation
**For a single Azure VM → use Docker Compose.** Here's why:
1. **One VM = no cluster benefits.** K8s shines at multi-node scheduling, auto-healing across hosts, and rolling deploys with replica sets. With 1 node, all pods compete for the same resources anyway.
2. **RAM matters.** k3s adds ~500-600 MB overhead. On a 32 GB VM running 31 services + Cosmos emulator + Ollama, that headroom is useful.
3. **Operational simplicity.** `docker compose logs -f platform-service` vs `kubectl logs deploy/platform-service -n bytelyst-platform -f` — Compose wins for a solo developer.
4. **Faster iteration.** `docker compose up --build flowmonk-backend` rebuilds + restarts in seconds. K8s requires image tag bumps, manifest edits, and `kubectl apply`.
5. **CI already runs on host.** act_runner uses host mode, not Docker-in-Docker. Compose services are reachable at `localhost:<port>` — K8s NodePort adds a layer.
**When to switch to K8s:**
- Scaling beyond 1 VM (add nodes with `k3s agent`)
- Need zero-downtime rolling updates for beta users
- Want fine-grained resource limits per service
- Preparing for AKS/EKS production migration
The `k8s/` folder is ready for when you need it. Both approaches share the same Docker images and Gitea registry.

View File

@ -1,6 +1,6 @@
# ByteLyst Single-VM Deployment # ByteLyst Single-VM Deployment
> Deploy the **entire ByteLyst ecosystem** (30 services, 10 products) on a single **raw** Azure VM. > Deploy the **entire ByteLyst ecosystem** (31 services, 11 products) on a single **raw** Azure VM.
> Nothing pre-installed required — the script handles everything from a blank Ubuntu machine. > Nothing pre-installed required — the script handles everything from a blank Ubuntu machine.
> Two files: this README and `setup.sh`. Copy both to the VM and run the script. > Two files: this README and `setup.sh`. Copy both to the VM and run the script.
@ -51,7 +51,7 @@ sudo ./setup.sh --help # Show full usage
### Software installed on the VM (from scratch) ### Software installed on the VM (from scratch)
| Software | Version | Purpose | | Software | Version | Purpose |
|----------|---------|----------| | ----------------- | ------------- | ----------------------------------------------- |
| **Docker CE** | latest | Container runtime + Compose + BuildKit | | **Docker CE** | latest | Container runtime + Compose + BuildKit |
| **Node.js** | 22 LTS | Build toolchain for TypeScript packages | | **Node.js** | 22 LTS | Build toolchain for TypeScript packages |
| **pnpm** | 10.6.5 | Package manager (workspace-aware) | | **pnpm** | 10.6.5 | Package manager (workspace-aware) |
@ -62,21 +62,22 @@ sudo ./setup.sh --help # Show full usage
### Execution phases ### Execution phases
| Phase | Duration | Description | | Phase | Duration | Description |
|-------|----------|-------------| | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
| 1. System | ~3 min | Pre-flight checks (disk ≥40 GB, RAM ≥16 GB), install Docker, Node.js 22, pnpm 10.6.5, Ollama, git, jq, build-essential | | 1. System | ~3 min | Pre-flight checks (disk ≥40 GB, RAM ≥16 GB), install Docker, Node.js 22, pnpm 10.6.5, Ollama, git, jq, build-essential |
| 2. Gitea | ~1 min | Start Gitea Docker container, create admin + org + API token | | 2. Gitea + CI | ~2 min | Start Gitea Docker container, admin + org + token, install act_runner |
| 3. Clone | ~3 min | Clone all 11 repos to `/opt/bytelyst/` | | 3. Clone | ~3 min | Clone all 12 repos to `/opt/bytelyst/`, push to Gitea for CI |
| 4. Build | ~5 min | `pnpm install && pnpm -r build` all `@bytelyst/*` packages | | 4. Build | ~5 min | `pnpm install && pnpm -r build` all `@bytelyst/*` packages |
| 5. Publish | ~3 min | Publish all packages to local Gitea npm registry | | 5. Publish | ~3 min | Publish all packages to local Gitea npm registry |
| 6. Env | instant | Generate `.env.ecosystem` with Cosmos emulator key, Azurite key, JWT secret | | 6. Env | instant | Generate `.env.ecosystem` with Cosmos emulator key, Azurite key, JWT secret |
| 7. Deploy | ~10 min | Stop Ollama (free RAM), per-service Docker build + deploy (30 services, with fallback), prune build cache, restart Ollama | | 7. Deploy | ~10 min | Stop Ollama (free RAM), per-service Docker build + deploy (30 services, with fallback), prune build cache, restart Ollama |
| 8. Verify | ~1 min | Health-check all 30+ endpoints + create `/opt/bytelyst/check-health.sh` | | 8. Verify | ~1 min | Health-check all 31+ endpoints + create `/opt/bytelyst/check-health.sh` |
## Port Map (after deployment) ## Port Map (after deployment)
### Infrastructure (installed by setup.sh) ### Infrastructure (installed by setup.sh)
| Service | Port | URL | | Service | Port | URL |
|---------|------|-----| | -------------------- | ----- | --------------------------- |
| Gitea (npm registry) | 3300 | `http://<vm-ip>:3300` | | Gitea (npm registry) | 3300 | `http://<vm-ip>:3300` |
| Ollama (LLM API) | 11434 | `http://<vm-ip>:11434` | | Ollama (LLM API) | 11434 | `http://<vm-ip>:11434` |
| Cosmos Data Explorer | 1234 | `http://<vm-ip>:1234` | | Cosmos Data Explorer | 1234 | `http://<vm-ip>:1234` |
@ -87,21 +88,24 @@ sudo ./setup.sh --help # Show full usage
| Traefik Dashboard | 8080 | `http://<vm-ip>:8080` | | Traefik Dashboard | 8080 | `http://<vm-ip>:8080` |
### Platform Services ### Platform Services
| Service | Port | URL | | Service | Port | URL |
|---------|------|-----| | ------------------ | ---- | ---------------------------- |
| platform-service | 4003 | `http://<vm-ip>:4003/health` | | platform-service | 4003 | `http://<vm-ip>:4003/health` |
| extraction-service | 4005 | `http://<vm-ip>:4005/health` | | extraction-service | 4005 | `http://<vm-ip>:4005/health` |
| mcp-server | 4007 | `http://<vm-ip>:4007/health` | | mcp-server | 4007 | `http://<vm-ip>:4007/health` |
### Platform Dashboards ### Platform Dashboards
| Dashboard | Port | URL | | Dashboard | Port | URL |
|-----------|------|-----| | ------------- | ---- | --------------------- |
| Admin Console | 3001 | `http://<vm-ip>:3001` | | Admin Console | 3001 | `http://<vm-ip>:3001` |
| Issue Tracker | 3003 | `http://<vm-ip>:3003` | | Issue Tracker | 3003 | `http://<vm-ip>:3003` |
### Product Backends ### Product Backends
| Product | Port | Health | | Product | Port | Health |
|---------|------|--------| | ----------- | ---- | ---------------------------- |
| PeakPulse | 4010 | `http://<vm-ip>:4010/health` | | PeakPulse | 4010 | `http://<vm-ip>:4010/health` |
| ChronoMind | 4011 | `http://<vm-ip>:4011/health` | | ChronoMind | 4011 | `http://<vm-ip>:4011/health` |
| JarvisJr | 4012 | `http://<vm-ip>:4012/health` | | JarvisJr | 4012 | `http://<vm-ip>:4012/health` |
@ -114,8 +118,9 @@ sudo ./setup.sh --help # Show full usage
| LocalMemGPT | 4019 | `http://<vm-ip>:4019/health` | | LocalMemGPT | 4019 | `http://<vm-ip>:4019/health` |
### Product Web Apps ### Product Web Apps
| Product | Port | URL | | Product | Port | URL |
|---------|------|-----| | ----------------- | ---- | --------------------- |
| LysnrAI Dashboard | 3002 | `http://<vm-ip>:3002` | | LysnrAI Dashboard | 3002 | `http://<vm-ip>:3002` |
| ChronoMind | 3030 | `http://<vm-ip>:3030` | | ChronoMind | 3030 | `http://<vm-ip>:3030` |
| JarvisJr | 3035 | `http://<vm-ip>:3035` | | JarvisJr | 3035 | `http://<vm-ip>:3035` |
@ -125,6 +130,7 @@ sudo ./setup.sh --help # Show full usage
| NomGap | 3055 | `http://<vm-ip>:3055` | | NomGap | 3055 | `http://<vm-ip>:3055` |
| ActionTrail | 3060 | `http://<vm-ip>:3060` | | ActionTrail | 3060 | `http://<vm-ip>:3060` |
| LocalMemGPT | 3070 | `http://<vm-ip>:3070` | | LocalMemGPT | 3070 | `http://<vm-ip>:3070` |
| LLM Lab Dashboard | 3075 | `http://<vm-ip>:3075` |
## Post-Deployment Commands ## Post-Deployment Commands
@ -152,7 +158,7 @@ docker compose -f /opt/bytelyst/learning_ai_common_plat/docker-compose.ecosystem
All optional — defaults work for most setups: All optional — defaults work for most setups:
| Variable | Default | Description | | Variable | Default | Description |
|----------|---------|-------------| | -------------- | ------------------ | ----------------------------------------------- |
| `GITHUB_USER` | `saravanakumardb1` | GitHub org/user to clone repos from | | `GITHUB_USER` | `saravanakumardb1` | GitHub org/user to clone repos from |
| `GITHUB_TOKEN` | (empty) | Set for private repos (HTTPS auth) | | `GITHUB_TOKEN` | (empty) | Set for private repos (HTTPS auth) |
| `GITEA_ADMIN` | `bytelyst-admin` | Gitea admin username | | `GITEA_ADMIN` | `bytelyst-admin` | Gitea admin username |
@ -164,7 +170,7 @@ All optional — defaults work for most setups:
## CLI Flags ## CLI Flags
| Flag | Description | | Flag | Description |
|------|-------------| | ----------------- | -------------------------------------- |
| `--resume` | Auto-resume from last completed phase | | `--resume` | Auto-resume from last completed phase |
| `--resume-from=N` | Resume from phase N (1-8) | | `--resume-from=N` | Resume from phase N (1-8) |
| `--phase=N` | Run ONLY phase N (useful for retrying) | | `--phase=N` | Run ONLY phase N (useful for retrying) |

View File

@ -14,7 +14,7 @@ This folder contains three files you must work with:
- **`README.md`** — Deployment guide documenting what the script does, ports, troubleshooting - **`README.md`** — Deployment guide documenting what the script does, ports, troubleshooting
- **`prompt.md`** — This file (agent instructions) - **`prompt.md`** — This file (agent instructions)
The script installs everything from scratch (Docker, Node.js, pnpm, Gitea, Ollama) then clones 11 repos, builds + publishes ~49 `@bytelyst/*` npm packages to a local Gitea registry, generates environment config, and deploys 30 Docker Compose services (6 infra + 3 platform + 2 dashboards + 10 backends + 9 webs). The script installs everything from scratch (Docker, Node.js, pnpm, Gitea, act_runner, Ollama) then clones 12 repos, builds + publishes ~57 `@bytelyst/*` npm packages to a local Gitea registry, generates environment config, and deploys 31 Docker Compose services (6 infra + 3 platform + 2 dashboards + 10 backends + 9 webs + 1 standalone).
### Current State (ALREADY IMPLEMENTED — do NOT redo) ### Current State (ALREADY IMPLEMENTED — do NOT redo)
@ -35,7 +35,7 @@ The following features are already built and tested in `setup.sh`:
### Key files outside this folder that the script depends on ### Key files outside this folder that the script depends on
| File | Repo | Purpose | | File | Repo | Purpose |
|------|------|---------| | ------------------------------ | -------------------------------- | ------------------------------------------- |
| `docker-compose.ecosystem.yml` | `learning_ai_common_plat` (root) | Defines all 30 services | | `docker-compose.ecosystem.yml` | `learning_ai_common_plat` (root) | Defines all 30 services |
| `.env.ecosystem.example` | `learning_ai_common_plat` (root) | Template for env vars | | `.env.ecosystem.example` | `learning_ai_common_plat` (root) | Template for env vars |
| `packages/*/package.json` | `learning_ai_common_plat` | ~49 `@bytelyst/*` packages to publish | | `packages/*/package.json` | `learning_ai_common_plat` | ~49 `@bytelyst/*` packages to publish |
@ -43,7 +43,7 @@ The following features are already built and tested in `setup.sh`:
| `web/Dockerfile` | Each of the 10 product repos | Product web Docker builds | | `web/Dockerfile` | Each of the 10 product repos | Product web Docker builds |
| `.npmrc.docker` | Each of the 10 product repos | Gitea npm registry config for Docker builds | | `.npmrc.docker` | Each of the 10 product repos | Gitea npm registry config for Docker builds |
### Repo list (all 11, cloned to `/opt/bytelyst/`) ### Repo list (all 12, cloned to `/opt/bytelyst/`)
``` ```
learning_ai_common_plat # Shared platform: packages, services, dashboards, compose learning_ai_common_plat # Shared platform: packages, services, dashboards, compose
@ -57,6 +57,7 @@ learning_ai_flowmonk # FlowMonk
learning_ai_notes # NoteLett learning_ai_notes # NoteLett
learning_ai_trails # ActionTrail learning_ai_trails # ActionTrail
learning_ai_local_memory_gpt # LocalMemGPT learning_ai_local_memory_gpt # LocalMemGPT
learning_ai_local_llms # Local LLM Lab (dashboard only, no backend)
``` ```
GitHub org: `saravanakumardb1` (repos are public). GitHub org: `saravanakumardb1` (repos are public).
@ -68,7 +69,7 @@ GitHub org: `saravanakumardb1` (repos are public).
The following issues have already been identified and fixed in the current `setup.sh`: The following issues have already been identified and fixed in the current `setup.sh`:
| Bug | Fix | Commit | | Bug | Fix | Commit |
|-----|-----|--------| | --------------------------------------------------------------------------- | --------------------------------------------------------------- | ---------- | ----- | ---------- |
| Docker apt source had extra whitespace from `\` continuation | Single-line echo | `ddd2db84` | | Docker apt source had extra whitespace from `\` continuation | Single-line echo | `ddd2db84` |
| Gitea 1.22 returns token in `.sha1`, newer versions use `.token` | `jq -r '.sha1 // .token'` fallback | `ddd2db84` | | Gitea 1.22 returns token in `.sha1`, newer versions use `.token` | `jq -r '.sha1 // .token'` fallback | `ddd2db84` |
| jfrog registry sed didn't handle multi-line `\` continuation | Added `/jfrog-pkg-proxy.*\\$/d` pattern | `ddd2db84` | | jfrog registry sed didn't handle multi-line `\` continuation | Added `/jfrog-pkg-proxy.*\\$/d` pattern | `ddd2db84` |
@ -111,6 +112,7 @@ The following issues have already been identified and fixed in the current `setu
### ~~1. Audit `setup.sh` for correctness~~ ✅ DONE ### ~~1. Audit `setup.sh` for correctness~~ ✅ DONE
The script has been audited and all identified bugs fixed (see table above). Phases 1-8 are tested. Key things already verified: The script has been audited and all identified bugs fixed (see table above). Phases 1-8 are tested. Key things already verified:
- Docker CE install, Node.js 22 (NodeSource), pnpm 10.6.5, Ollama — all idempotent - Docker CE install, Node.js 22 (NodeSource), pnpm 10.6.5, Ollama — all idempotent
- Gitea token: `.sha1 // .token` fallback in place - Gitea token: `.sha1 // .token` fallback in place
- Corporate proxy: removed at source in all repos, no runtime `sed` needed - Corporate proxy: removed at source in all repos, no runtime `sed` needed
@ -127,6 +129,7 @@ All bugs fixed — see the 16-item table in "Bugs Already Fixed" above.
### ~~3. Add error recovery and logging~~ ✅ DONE ### ~~3. Add error recovery and logging~~ ✅ DONE
Already implemented: Already implemented:
- **Phase completion markers:** `/opt/bytelyst/.setup-state/phaseN.done` - **Phase completion markers:** `/opt/bytelyst/.setup-state/phaseN.done`
- **Resume:** `--resume` (auto-detect), `--resume-from=N`, `--phase=N` (single), `--reset`, `--status` - **Resume:** `--resume` (auto-detect), `--resume-from=N`, `--phase=N` (single), `--reset`, `--status`
- **Logging:** `exec > >(tee -a setup.log) 2>&1` - **Logging:** `exec > >(tee -a setup.log) 2>&1`
@ -136,6 +139,7 @@ Already implemented:
### 4. Add a dry-run / validation mode (TODO) ### 4. Add a dry-run / validation mode (TODO)
Add `--dry-run` support that: Add `--dry-run` support that:
- Checks all prerequisites (disk space, memory, network access to GitHub) - Checks all prerequisites (disk space, memory, network access to GitHub)
- Validates Docker is installed and running - Validates Docker is installed and running
- Validates Gitea is reachable - Validates Gitea is reachable
@ -157,6 +161,7 @@ Read `docker-compose.ecosystem.yml` (in the repo root) and verify:
### 6. Update `README.md` ### 6. Update `README.md`
After all fixes, update `README.md` to reflect: After all fixes, update `README.md` to reflect:
- CLI flags: `--resume`, `--resume-from=N`, `--phase=N`, `--reset`, `--status`, `--help` - CLI flags: `--resume`, `--resume-from=N`, `--phase=N`, `--reset`, `--status`, `--help`
- Correct service count: 30 (not 27) - Correct service count: 30 (not 27)
- Updated duration estimates if phases changed - Updated duration estimates if phases changed
@ -269,6 +274,7 @@ Raw Ubuntu 24.04 VM
## How Docker Builds Reach Gitea ## How Docker Builds Reach Gitea
Product Dockerfiles use BuildKit secret mount for the npm token: Product Dockerfiles use BuildKit secret mount for the npm token:
```dockerfile ```dockerfile
RUN --mount=type=secret,id=gitea_npm_token \ RUN --mount=type=secret,id=gitea_npm_token \
cp .npmrc.docker .npmrc && \ cp .npmrc.docker .npmrc && \

View File

@ -11,7 +11,7 @@
# - Gitea (Docker container — npm package registry + CI on :3300) # - Gitea (Docker container — npm package registry + CI on :3300)
# - act_runner (Gitea CI runner — systemd service, host mode) # - act_runner (Gitea CI runner — systemd service, host mode)
# - Ollama (local LLM inference for LocalMemGPT on :11434) # - Ollama (local LLM inference for LocalMemGPT on :11434)
# - All 11 ByteLyst repos (cloned from GitHub) # - All 12 ByteLyst repos (cloned from GitHub)
# - All @bytelyst/* packages (built + published to Gitea) # - All @bytelyst/* packages (built + published to Gitea)
# - Full 30-service ecosystem (via docker-compose.ecosystem.yml) # - Full 30-service ecosystem (via docker-compose.ecosystem.yml)
# #
@ -28,7 +28,7 @@
# Phases: # Phases:
# 1 System dependencies (Docker, Node, pnpm, Ollama) # 1 System dependencies (Docker, Node, pnpm, Ollama)
# 2 Gitea npm registry + CI runner (container on :3300 + act_runner systemd) # 2 Gitea npm registry + CI runner (container on :3300 + act_runner systemd)
# 3 Clone 11 repositories from GitHub + push to Gitea # 3 Clone 12 repositories from GitHub + push to Gitea
# 4 Build all @bytelyst/* packages # 4 Build all @bytelyst/* packages
# 5 Publish packages to Gitea npm registry # 5 Publish packages to Gitea npm registry
# 6 Generate .env.ecosystem config # 6 Generate .env.ecosystem config
@ -87,6 +87,7 @@ REPOS=(
learning_ai_notes learning_ai_notes
learning_ai_trails learning_ai_trails
learning_ai_local_memory_gpt learning_ai_local_memory_gpt
learning_ai_local_llms
) )
# ── Helpers ────────────────────────────────────────────────────────── # ── Helpers ──────────────────────────────────────────────────────────
@ -471,7 +472,7 @@ phase3_clone() {
return return
fi fi
log "Phase 3: Cloning ${#REPOS[@]} repositories..." log "Phase 3: Cloning ${#REPOS[@]} repositories (12 repos)..."
local clone_base="https://github.com/${GITHUB_USER}" local clone_base="https://github.com/${GITHUB_USER}"
if [ -n "${GITHUB_TOKEN:-}" ]; then if [ -n "${GITHUB_TOKEN:-}" ]; then