Vapora/provisioning/COMPOSED_CONFIGS_GUIDE.md
Jesús Pérez a395bd972f
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
mdBook Build & Deploy / Build mdBook (push) Has been cancelled
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
mdBook Build & Deploy / Documentation Quality Check (push) Has been cancelled
mdBook Build & Deploy / Deploy to GitHub Pages (push) Has been cancelled
mdBook Build & Deploy / Notification (push) Has been cancelled
chore: add cd/ci ops
2026-01-12 03:36:55 +00:00

10 KiB

Composed Configurations Guide

Status: Complete Created: January 12, 2026 Total Config Files: 4 (solo, multiuser, enterprise, main)

Overview

Composed Nickel configurations that combine schema, constraints, defaults, and user customizations into production-ready configurations for all VAPORA deployment modes.

Files Created

schemas/platform/configs/
├── vapora-solo.ncl          ✅ Solo mode composition
├── vapora-multiuser.ncl     ✅ Multiuser mode composition
├── vapora-enterprise.ncl    ✅ Enterprise mode composition
├── main.ncl                 ✅ Entry point for all configs
├── README.md                ✅ Comprehensive usage guide

Composition Architecture

Each configuration file follows the 4-layer composition pattern:

Layer 1: Schema Definition
  ↓ imports from ../../vapora/main.ncl
  Defines all fields, types, contracts

Layer 2: Constraints & Validation
  ↓ checked by Platform Constraints
  Validates values are in valid ranges

Layer 3: Defaults
  ↓ imports from ../defaults/common/ and ../defaults/deployment/
  Provides sensible starting values

Layer 4: User Customizations
  ↓ composable via helpers.compose_config()
  Allows final overrides for specific deployments

Configuration Files Breakdown

Solo Mode (vapora-solo.ncl)

Purpose: Development and testing

Composition:

let schema = import "../../vapora/main.ncl" in
let defaults_mode = import "../defaults/deployment/solo.ncl" in

helpers.compose_config schema defaults_mode {
  # User customizations (optional)
}

Preset Values:

  • Host: 127.0.0.1 (localhost only)
  • Backend: 2 workers
  • Agents: 3 max instances
  • Database: File-based
  • NATS: Disabled
  • Cost tracking: Disabled
  • Security: JWT only

Export:

nickel export schemas/platform/configs/vapora-solo.ncl > vapora-solo.json

Multiuser Mode (vapora-multiuser.ncl)

Purpose: Team collaboration and staging

Composition:

let schema = import "../../vapora/main.ncl" in
let defaults_mode = import "../defaults/deployment/multiuser.ncl" in

helpers.compose_config schema defaults_mode {
  # User customizations with examples
  frontend.api_url = "https://api.vapora.internal:8001",
  # ... more customizations commented
}

Preset Values:

  • Host: 0.0.0.0 (network accessible)
  • Backend: 4 workers
  • Agents: 10 max instances
  • Database: Remote SurrealDB
  • NATS: Enabled
  • Cost tracking: Enabled
  • Security: TLS + MFA + audit

Export:

nickel export schemas/platform/configs/vapora-multiuser.ncl > vapora-multiuser.json

Enterprise Mode (vapora-enterprise.ncl)

Purpose: Production high-availability

Composition:

let schema = import "../../vapora/main.ncl" in
let defaults_mode = import "../defaults/deployment/enterprise.ncl" in

helpers.compose_config schema defaults_mode {
  # User customizations with detailed examples
  frontend.api_url = "https://api.vapora.production.com",
  providers = { ... },
  # ... more customizations commented
}

Preset Values:

  • Host: 0.0.0.0 (clustered)
  • Backend: 8 workers, 2000 connections
  • Agents: 50 max instances
  • Database: SurrealDB cluster, 100 pool size
  • NATS: JetStream cluster
  • Providers: All enabled (Claude, OpenAI, Gemini, Ollama)
  • Security: TLS enforced, MFA required
  • Observability: Prometheus, tracing, detailed logging
  • Backup: Every 6 hours

Export:

nickel export schemas/platform/configs/vapora-enterprise.ncl > vapora-enterprise.json

Main Entry Point (main.ncl)

Purpose: Load all configurations in one place

Usage:

let configs = import "schemas/platform/configs/main.ncl" in

# Access each configuration
configs.solo
configs.multiuser
configs.enterprise

# Export all at once
configs.export.all

Export All:

nickel export schemas/platform/configs/main.ncl > all-vapora-configs.json

Customization Patterns

Pattern 1: Extend Solo for Testing

# test-vapora.ncl
let helpers = import "schemas/platform/common/helpers.ncl" in
let schema = import "schemas/vapora/main.ncl" in
let solo = import "schemas/platform/defaults/deployment/solo.ncl" in

helpers.compose_config schema solo {
  # Testing customizations
  monitoring.log_level = "debug",
  llm_router.providers.ollama_enabled = true,
  backend.port = 9001,
}

Pattern 2: Customize Multiuser for Specific Team

# team-vapora.ncl
let helpers = import "schemas/platform/common/helpers.ncl" in
let schema = import "schemas/vapora/main.ncl" in
let multiuser = import "schemas/platform/defaults/deployment/multiuser.ncl" in

helpers.compose_config schema multiuser {
  # Team-specific configuration
  frontend.api_url = "https://api.my-team.internal",

  llm_router.budget_enforcement.role_limits = {
    architect_cents = 750000,
    developer_cents = 500000,
    reviewer_cents = 300000,
    testing_cents = 150000,
  },

  agents.learning.recency_window_days = 14,
  monitoring.log_level = "info",
}

Pattern 3: Custom Enterprise with Regional Setup

# us-west-vapora.ncl
let helpers = import "schemas/platform/common/helpers.ncl" in
let schema = import "schemas/vapora/main.ncl" in
let enterprise = import "schemas/platform/defaults/deployment/enterprise.ncl" in

helpers.compose_config schema enterprise {
  # Regional customization
  frontend.api_url = "https://api.us-west.vapora.production",

  database.url = "ws://surrealdb-us-west.internal:8000",

  providers.ollama_url = "http://ollama-us-west.internal:11434",

  storage.base_path = "/mnt/production-us-west/vapora",
}

Export Workflows

Workflow 1: Generate JSON for Validation

# Export and validate JSON structure
nickel export schemas/platform/configs/vapora-multiuser.ncl | jq .

Workflow 2: Generate TOML Configuration

# Export to JSON, then render TOML template
nickel export schemas/platform/configs/vapora-solo.ncl | \
  jinja2 schemas/platform/templates/configs/toml.j2 > config.toml

# Use with backend
./vapora-backend --config config.toml

Workflow 3: Generate Docker Compose Stack

# Render docker-compose.yml from multiuser config
nickel export schemas/platform/configs/vapora-multiuser.ncl | \
  jinja2 schemas/platform/templates/docker-compose/docker-compose.yaml.j2 > docker-compose.yml

# Deploy
docker compose up -d

Workflow 4: Generate Kubernetes ConfigMap

# Render Kubernetes ConfigMap from enterprise config
nickel export schemas/platform/configs/vapora-enterprise.ncl | \
  jinja2 schemas/platform/templates/kubernetes/configmap.yaml.j2 > configmap.yaml

# Create ConfigMap in cluster
kubectl create -f configmap.yaml

# Or update existing
kubectl replace -f configmap.yaml

Workflow 5: Multi-File Deployment

# Generate all configurations
for mode in solo multiuser enterprise; do
  nickel export schemas/platform/configs/vapora-${mode}.ncl > vapora-${mode}.json
done

# Validate all
for f in vapora-*.json; do jq . "$f" > /dev/null && echo "✓ $f"; done

# Generate deployment artifacts
nickel export schemas/platform/configs/vapora-enterprise.ncl | \
  jinja2 schemas/platform/templates/kubernetes/configmap.yaml.j2 > configmap.yaml

nickel export schemas/platform/configs/vapora-enterprise.ncl | \
  jinja2 schemas/platform/templates/kubernetes/deployment.yaml.j2 > deployment.yaml

# Deploy to Kubernetes
kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml

Integration with Deployment Pipeline

CI/CD Integration

# In CI/CD pipeline (e.g., .github/workflows/deploy.yml)

# 1. Validate all configurations
for config in schemas/platform/configs/vapora-*.ncl; do
  nickel typecheck "$config" || exit 1
  nickel export "$config" | jq . > /dev/null || exit 1
done

# 2. Generate all outputs
nickel export schemas/platform/configs/vapora-${DEPLOYMENT_MODE}.ncl > config.json

# 3. Render templates
jinja2 schemas/platform/templates/kubernetes/configmap.yaml.j2 < config.json > configmap.yaml
jinja2 schemas/platform/templates/kubernetes/deployment.yaml.j2 < config.json > deployment.yaml

# 4. Deploy
kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml

Manual Deployment

# 1. Choose deployment mode
DEPLOYMENT_MODE=multiuser

# 2. Export configuration
nickel export schemas/platform/configs/vapora-${DEPLOYMENT_MODE}.ncl > vapora.json

# 3. Validate
jq . vapora.json > /dev/null && echo "✓ Configuration valid"

# 4. Generate Docker Compose (for local testing)
jinja2 schemas/platform/templates/docker-compose/docker-compose.yaml.j2 < vapora.json > docker-compose.yml

# 5. Deploy
docker compose up -d

# 6. Verify
docker compose ps

Key Benefits

Composable - Mix and match schema, defaults, customizations Type-Safe - Schema defines all valid fields and types Validated - Constraints enforce valid value ranges Defaulted - Sensible defaults for each mode Customizable - Easy to override for specific needs Reproducible - Same config generates same output Version-Controlled - Configurations in Git Multi-Format - Generate JSON, TOML, YAML, K8s, Docker

File Statistics

Item Count
Composed config files 3
Entry point files 1
Documentation 1 README + this guide
Lines of Nickel code ~80
Lines of documentation ~400

References

  • Platform Guide: schemas/platform/README.md
  • Configs Details: schemas/platform/configs/README.md
  • Defaults: schemas/platform/defaults/README.md
  • Values: schemas/platform/values/README.md
  • Templates: schemas/platform/templates/README.md
  • Helpers: schemas/platform/common/helpers.ncl

Next Steps

  1. Create Jinja2 templates for output formats:

    • templates/configs/{toml,yaml,json}.j2
    • templates/kubernetes/{deployment,configmap,service}.yaml.j2
    • templates/docker-compose/docker-compose.yaml.j2
  2. Test composition with real exports:

    nickel export schemas/platform/configs/vapora-solo.ncl
    
  3. Integrate with deployment pipeline:

    • Add validation steps
    • Generate outputs for each mode
    • Deploy via docker-compose or Kubernetes

Status: Complete Ready for: JSON export, template rendering, deployment Date: January 12, 2026