Investigation: UIS Distribution Architecture
Purpose: Design a new distribution model for UIS that allows users to install and update without forking the repo or editing core files.
Status: Completed
Goal: Design a container-based distribution model for UIS.
Created: 2026-01-22 Completed: 2026-02-18
Priority: High (foundational for product scalability)
Decision: Container-as-Deliverable - The UIS product is delivered as a container image, not a zip file. Users only need to provide their topsecret/ folder (secrets + config).
Completed: PLAN-003 implemented minimal container delivery:
- Container image published to
ghcr.io/terchris/uis-provision-host:latest - Size reduced from 2.7GB to 1.86GB
./uiswrapper script with auto-pull from registry- CI/CD pipeline for multi-arch builds (amd64/arm64)
- Branded welcome page for nginx catch-all
Next Action: Implement full orchestration system (Phase 1-6 below).
Related Plans:
- PLAN-003-minimal-container-delivery.md - ✅ Complete
- PLAN-004-uis-orchestration-system.md - ✅ Complete
- PLAN-002-json-generator.md - Complete
Problem Statement
Current Model (Fork & Edit)
- Users fork the entire repository
- Users edit files directly (move from
not-in-use/, modify configs) - Updates require git pull and merge conflicts
- Works for creator/power users, not scalable for product
Desired Model (Install & Configure)
- CI/CD creates distributable package
- Users install via simple command
- Users customize via config files (never edit core files)
- Updates via
uis-updatecommand - Parallel to existing system during development
Investigation Questions
1. Distribution Package
- What files should be included in the distribution? → Container image with baked-in files
- What files should be excluded (website, docs, dev tools)? → website/, docs/, .devcontainer/, .git/
- What is the package format (zip, tar.gz)? → Container image (not zip)
- Where is the package hosted (GitHub releases)? → Container registry: ghcr.io/sovereignsky/uis-provision-host
2. User Customization
- Where does the user customization folder live? →
topsecret/config/for config,topsecret/secrets-config/for secrets - What is the structure of
enabled-services.conf? → One SCRIPT_ID per line (like DCT) - How do users override service configurations (Helm values, manifests)? →
topsecret/config/service-overrides/ - How do users add their own custom services? →
topsecret/config/custom-manifests/
3. Service Enable/Disable
- How does config-driven enable/disable work? → Read enabled-services.conf, match against SCRIPT_ID
- What happens to
not-in-use/folders? → Keep for old system; new system ignores file location - Should all services be in the package (enabled via config)? → Yes, all in container, enabled via config
- Or should there be "core" vs "optional" services? → No distinction - all config-driven
4. Update Mechanism
- How does
uis-updatework? →docker pullnew image; user config in mounts preserved - How are user customizations preserved during update? → Mounts stay on host, image gets replaced
- How is version tracked? → Container image tags +
.versionfile inside container - What about breaking changes between versions? → TBD during implementation
5. Provision-Host Integration
- How does the new system integrate with provision-host container? → UIS IS the container
- What paths are mounted into the container? →
topsecret/→/mnt/urbalurbadisk/topsecret/ - How does
uis-setup.sh(wrapper on host) call into provision-host? →docker exectouis-cli.sh
6. Migration Path
- How do existing users migrate to new system? → TBD (Phase 6)
- Can both systems coexist during transition? → Yes, container includes both orchestration systems
- What documentation is needed? → TBD (Phase 6)
Reference: DCT Architecture
Distribution
CI/CD creates: dev_containers.zip
├── .devcontainer/ # Product (never edited by user)
│ ├── additions/
│ ├── manage/
│ ├── devcontainer.json
│ └── .version
User Customization
.devcontainer.extend/ # User customization (persisted)
├── enabled-tools.conf # Which tools to install
├── enabled-services.conf # Which services to start
└── project-installs.sh # Custom project setup
Update Flow
dev-update
# 1. Downloads latest zip from GitHub releases
# 2. Extracts to temp folder
# 3. Replaces .devcontainer/ (preserves .devcontainer.extend/)
# 4. Records version in .devcontainer/.version
# 5. Prompts rebuild if devcontainer.json changed
Key DCT Files to Study
.devcontainer/manage/dev-update.sh- Update mechanism.devcontainer/manage/dev-setup.sh- Interactive menu.devcontainer.extend/enabled-tools.conf- Config-driven installation.devcontainer/additions/lib/component-scanner.sh- Metadata discovery
Proposed UIS Architecture: Container-as-Deliverable
Key Decision: The UIS product is delivered as a container image, not a zip file. The repository structure stays as-is. CI/CD builds a container with everything inside. Users only need their
topsecret/folder locally (config + secrets).
Container Image Contents
ghcr.io/sovereignsky/uis-provision-host:1.0.0
│
├── /mnt/urbalurbadisk/ # UIS product (baked into image) - SAME PATH AS TODAY
│ ├── ansible/ # Playbooks
│ ├── manifests/ # K8s manifests
│ ├── hosts/ # Cluster setup scripts
│ ├── cloud-init/ # VM templates
│ ├── networking/ # Network scripts
│ ├── provision-host/
│ │ ├── kubernetes/ # Existing orchestration (unchanged)
│ │ └── uis/ # NEW orchestration (to be built)
│ │ ├── lib/
│ │ ├── manage/
│ │ └── services/
│ ├── topsecret/ # Mount point - user's folder overlays this
│ │ └── secrets-templates/ # Base templates (baked in)
│ ├── scripts/
│ └── .version
│
└── (tools: ansible, kubectl, helm, az, tailscale, etc.)
User's Local Folder
my-project/
├── topsecret/ # User's folder (mounted into container)
│ ├─ ─ secrets-templates/ # Can override templates (optional)
│ ├── secrets-config/ # User-edited secret values (required)
│ │ └── 00-common-values.env
│ ├── secrets-generated/ # Temp processing
│ ├── kubernetes/ # Generated K8s secrets
│ └── config/ # NEW - user config files
│ ├── enabled-services.conf # Which services to deploy
│ ├── cluster-config.sh # Cluster type, project name, domain
│ └── service-overrides/ # Per-service customization (optional)
│
└── (user's own project files...)
What's In Container vs Local
Note: Current system uses
docker cpto copy files. New model uses mounts instead.
| Location | Contents | New Model |
|---|---|---|
Container /mnt/urbalurbadisk/ | UIS product (ansible, manifests, scripts) | Baked in |
Local topsecret/ → /mnt/urbalurbadisk/topsecret/ | User config + secrets | Mounted |
Local ~/.kube/ → /home/ansible/.kube/ | Kubernetes config | Mounted (ro) |
Repository Structure (Unchanged)
The repo stays as-is. CI/CD builds the container from it:
urbalurba-infrastructure/ # Repository (source)
├── ansible/ # → /mnt/urbalurbadisk/ansible/
├── manifests/ # → /mnt/urbalurbadisk/manifests/
├── hosts/ # → /mnt/urbalurbadisk/hosts/
├── cloud-init/ # → /mnt/urbalurbadisk/cloud-init/
├── networking/ # → /mnt/urbalurbadisk/networking/
├── provision-host/ # → /mnt/urbalurbadisk/provision-host/
│ ├── kubernetes/ # Existing (keep working)
│ └── uis/ # NEW (build alongside)
├── topsecret/ # → /mnt/urbalurbadisk/topsecret/
├── scripts/ # → /mnt/urbalurbadisk/scripts/
│
├── website/ # NOT in container
├── docs/ # NOT in container
├── .devcontainer/ # NOT in container
└── .github/workflows/ # Builds the container
User Config Folder (topsecret/config/)
topsecret/config/ # NEW - user config files
├── enabled-services.conf # Services to deploy
├── cluster-config.sh # Cluster type, project name, domain
├── service-overrides/ # Per-service customization
│ ├── prometheus/
│ │ └── values.yaml # Helm value overrides
│ └── grafana/
│ └── values.yaml
└── custom-manifests/ # User's own manifests
enabled-services.conf Format
# UIS Enabled Services
# Format: One SCRIPT_ID per line
# Run 'uis-setup --list' to see available services
# === Core (recommended) ===
nginx
traefik
# === Monitoring ===
prometheus
grafana
loki
# tempo # Commented = disabled
# === AI ===
# openwebui # Commented = disabled
# ollama
# === Databases ===
# postgresql
# redis
Wrapper Commands
# On host machine (scripts/manage/)
./uis-setup.sh # Interactive menu
./uis-setup.sh --list # List all available services
./uis-setup.sh --status # Show which are deployed
./uis-setup.sh --deploy # Deploy enabled services
./uis-setup.sh --deploy prometheus # Deploy specific service
./uis-setup.sh --remove prometheus # Remove specific service
./uis-update.sh # Update to latest version
Parallel Development Strategy
CRITICAL CONSTRAINT: Do NOT modify
provision-host/kubernetes/or anything below it. The existing system must continue working unchanged while the new system is developed.
Phase 1: Build New System in Separate Location
provision-host/kubernetes/ # EXISTING - DO NOT TOUCH
├── 01-core/
├── 11-monitoring/
│ ├── 01-setup-prometheus.sh # Leave as-is
│ └── not-in-use/
└── provision-kubernetes.sh
provision-host/uis/ # NEW - Build from scratch
├── lib/
│ └── service-scanner.sh
├── manage/
│ ├── uis-setup.sh
│ └── uis-update.sh
├── services/
│ ├── core/
│ ├── monitoring/
│ └── ...
└── .version
Phase 2: Validate New System
- Test with fresh installs
- Test update mechanism
- Test config-driven enable/disable
- Document migration path
Phase 3: Switchover
- When new system is validated, it becomes primary
- Provide migration guide for existing users
- Old
provision-host/kubernetes/can be removed later
Research Findings
DCT Architecture Deep Dive (Completed)
1. dev-update.sh - Self-Updating Mechanism
Key Pattern: Self-copy before execution for safe self-update
# dev-update.sh copies itself to temp before running
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
UPDATE_SCRIPT="$SCRIPT_DIR/dev-update.sh"
TEMP_SCRIPT="/tmp/dev-update-$$.sh"
cp "$UPDATE_SCRIPT" "$TEMP_SCRIPT"
exec bash "$TEMP_SCRIPT" --from-temp
Update Flow:
- Download latest zip from GitHub releases
- Extract to temp folder
- Replace
.devcontainer/(preserves.devcontainer.extend/) - Track version in
.devcontainer/.version(format:VERSION=1.2.3) - Compare devcontainer.json - prompt rebuild if changed
2. enabled-tools.conf Processing
File: .devcontainer/additions/lib/tool-installation.sh
# install_enabled_tools() function:
# 1. Read enabled-tools.conf line by line (skip # comments and empty lines)
# 2. Call scan_install_scripts() to discover all install-*.sh scripts
# 3. Match SCRIPT_ID from scripts against enabled tools list
# 4. Install matching tools using install_single_tool()
enabled-tools.conf Format:
# One tool identifier per line (matches SCRIPT_ID in scripts)
dev-imagetools
dev-python
# dev-nodejs # Commented = disabled
3. postCreateCommand.sh - Orchestration
Flow:
- Source libraries:
component-scanner.sh,tool-installation.sh,prerequisite-check.sh - Call
install_enabled_tools "$ADDITIONS_DIR"for config-driven installation - Run
.devcontainer.extend/project-installs.shfor custom user installations - Start supervisor services if configured
4. component-scanner.sh - Metadata Discovery
Scan Functions (each script type has its own scanner):
scan_install_scripts()- Scansinstall-*.shfilesscan_service_scripts()- Scansstart-*.shfilesscan_config_scripts()- Scansconfig-*.shfilesscan_cmd_scripts()- Scanscmd-*.shfilesscan_manage_scripts()- Scansdev-*.shfiles
Metadata Extraction:
extract_script_metadata() {
local script_path="$1"
local field_name="$2"
# Extract using grep: grep "^${field_name}=" "$script_path" | cut -d'"' -f2
}
Output Format (tab-separated):
script_basename<TAB>SCRIPT_ID<TAB>SCRIPT_NAME<TAB>SCRIPT_DESCRIPTION<TAB>SCRIPT_CATEGORY<TAB>SCRIPT_CHECK_COMMAND<TAB>SCRIPT_PREREQUISITES
Repository Root Structure Analysis (Completed)
The UIS repository has multiple interconnected folders. Understanding these is critical for designing the new distribution.
Root Folder Map
urbalurba-infrastructure/
├── .devcontainer/ # DevContainer Toolbox (for development)
├── .devcontainer.extend/ # DCT user customization
├── .github/ # CI/CD workflows
│
├── ansible/ # Ansible automation
│ ├── ansible.cfg
│ ├── inventory.yml
│ └── playbooks/ # 60+ playbooks (030-setup-prometheus.yml, etc.)
│
├── manifests/ # Kubernetes manifests (60+ YAML files)
│ ├── 030-prometheus-config.yaml
│ ├── 030-grafana-config.yaml
│ └── ...
│
├── provision-host/ # Main provisioning system
│ ├── kubernetes/ # ← Setup scripts (DO NOT TOUCH)
│ │ ├── 01-core/
│ │ ├── 11-monitoring/
│ │ └── provision-kubernetes.sh
│ ├── provision-host-*.sh # Container provisioning scripts
│ └── ...
│
├── hosts/ # Host-specific installation scripts
│ ├── install-rancher-kubernetes.sh
│ ├── install-azure-microk8s.sh
│ ├── rancher-kubernetes/
│ └── azure-microk8s/
│
├── cloud-init/ # Cloud-init templates for VMs
│ ├── azure-cloud-init.yml
│ ├── multipass-cloud-init.yml
│ └── raspberry-cloud-init.yml
│
├── scripts/ # Utility scripts
│ └── manage/
│ └── k9s.sh
│
├── containers/ # Container configurations
│ └── postgresql/
│
├── secrets/ # SSH keys for Ansible
│ ├── id_rsa_ansible
│ └── create-secrets.sh
│
├── networking/ # Network configurations
├── topsecret/ # Sensitive configs (gitignored content)
├── troubleshooting/ # Debug/troubleshooting scripts
│
├── website/ # Docusaurus documentation site
└── docs/ # Legacy docs (being migrated)
Supported Kubernetes Cluster Types
The hosts/ folder defines different Kubernetes environments that UIS can deploy to:
| Host Type | Folder | Description |
|---|---|---|
| Rancher Desktop | rancher-kubernetes/ | Local laptop (macOS/Windows/Linux) |
| Azure MicroK8s | azure-microk8s/ | MicroK8s on Azure VM |
| Azure AKS | azure-aks/ | Azure Kubernetes Service (managed) |
| Multipass MicroK8s | multipass-microk8s/ | MicroK8s on local Multipass VM |
| Raspberry Pi | raspberry-microk8s/ | MicroK8s on Raspberry Pi cluster |
Workflow:
1. User runs: hosts/install-azure-microk8s.sh
↓
2. Creates VM using cloud-init/azure-cloud-init.yml
↓
3. Registers in ansible/inventory.yml
↓
4. Merges kubeconfig
↓
5. Now ready for: provision-host/kubernetes/provision-kubernetes.sh
Two-Phase Setup:
- Phase 1:
hosts/- Sets up the Kubernetes cluster itself - Phase 2:
provision-host/kubernetes/- Deploys services on the cluster
Key Dependencies Between Folders
| Folder | Used By | Purpose |
|---|---|---|
hosts/ | Users (Phase 1) | Create/configure K8s cluster |
cloud-init/ | hosts/*.sh | VM bootstrap templates |
ansible/playbooks/ | provision-host/kubernetes/*/*.sh | Service deployment |
manifests/ | ansible/playbooks/*.yml | K8s resource definitions |
secrets/ | Ansible | SSH authentication |
How Scripts Reference Other Folders
From setup scripts (provision-host/kubernetes/11-monitoring/01-setup-prometheus.sh):
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
ansible-playbook "$PROJECT_ROOT/ansible/playbooks/030-setup-prometheus.yml" -e "target_host=$TARGET_HOST"
From Ansible playbooks (ansible/playbooks/030-setup-prometheus.yml):
vars:
manifests_folder: "/mnt/urbalurbadisk/manifests" # Mounted path in provision-host container
prometheus_config_file: "{{ manifests_folder }}/030-prometheus-config.yaml"
Provision-Host Container Mount Points
When running inside provision-host container:
/mnt/urbalurbadisk/= Repository root/mnt/urbalurbadisk/manifests/= Manifests folder/mnt/urbalurbadisk/ansible/= Ansible folder/mnt/urbalurbadisk/provision-host/= Provisioning scripts
Current UIS Scripts Analysis (Completed)
Directory Structure
provision-host/kubernetes/
├── provision-kubernetes.sh # Main orchestration (runs all scripts in order)
├── 01-core/
│ ├── 020-setup-nginx.sh # Active scripts
│ └── not-in-use/ # Disabled scripts
│ └── 020-remove-nginx.sh
├── 02-databases/
│ └── not-in-use/
│ ├── 05-setup-postgres.sh
│ └── 05-remove-postgres.sh
├── 11-monitoring/
│ ├── 01-setup-prometheus.sh # Active
│ ├── 02-setup-tempo.sh
│ ├── 03-setup-loki.sh
│ ├── 04-setup-otel-collector.sh
│ ├── 05-setup-grafana.sh
│ ├── 06-setup-testdata.sh
│ └── not-in-use/ # Disabled/remove scripts
│ ├── 01-remove-prometheus.sh
│ └── ...
└── ... (other categories)
provision-kubernetes.sh Logic
# 1. Find all directories starting with a number, sorted
directories=$(find . -maxdepth 1 -type d -name "[0-9]*" | sort -n)
# 2. For each directory, find scripts starting with number
scripts=$(find "$dir" -maxdepth 1 -type f -name "[0-9]*.sh" | sort -n)
# 3. Execute each script with TARGET_HOST parameter
bash "$script" "$TARGET_HOST"
Note: Scripts in not-in-use/ are NOT in maxdepth 1, so they're skipped.
Current Script Pattern (No Metadata)
#!/bin/bash
# File: provision-host/kubernetes/11-monitoring/01-setup-prometheus.sh
# Description: Deploy Prometheus for metrics collection and storage
# Usage: ./01-setup-prometheus.sh [target_host]
set -e
TARGET_HOST=${1:-rancher-desktop}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
# Call Ansible playbook
ansible-playbook "$PROJECT_ROOT/ansible/playbooks/030-setup-prometheus.yml" -e "target_host=$TARGET_HOST"
Comparison: DCT vs UIS
| Feature | DCT | UIS Current |
|---|---|---|
| Metadata in scripts | Yes (SCRIPT_ID, SCRIPT_NAME, etc.) | No (just comments) |
| Config-driven enable | enabled-tools.conf | Move files to not-in-use/ |
| Scanner library | component-scanner.sh | None |
| Interactive menu | dev-setup.sh | None |
| Update mechanism | dev-update.sh | Fork & git pull |
| JSON generation | dev-docs.sh | Manual services.json |
| User customization | .devcontainer.extend/ | Fork entire repo |
| Remove scripts | --uninstall flag | Separate *-remove-*.sh files |
| Script naming | install-dev-python.sh | 01-setup-prometheus.sh |
| Ordering | Category-based (no numbers) | Number prefix (01-, 02-) |
Tasks
Research (Completed)
- Study DCT
dev-update.shin detail - Study DCT
enabled-tools.confprocessing - Study DCT
postCreateCommand.sh(how it reads configs) - Map current UIS scripts to understand what exists
- Investigate root folder structure (ansible/, manifests/, hosts/, cloud-init/, topsecret/)
- Analyze secrets management system
- Understand copy model (docker cp vs mounts)
Design Decisions (Resolved)
- Package name and format → Container image:
ghcr.io/sovereignsky/uis-provision-host - User customization folder name and location →
topsecret/config/(uses existing topsecret folder) - How to handle manifests (in package vs separate) → Baked into container
- How to handle Ansible playbooks → Baked into container
- Version numbering scheme → SemVer (1.0.0) + container image tags
- Keep number prefixes for ordering or use dependencies? → Hybrid: keep numbers + add SCRIPT_REQUIRES
- Merge setup/remove into single script with flags or keep separate? → Keep separate + add SCRIPT_REMOVE metadata
Implementation (To Do)
Completed in PLAN-003:
- Create
Dockerfile.uis-provision-host - Create CI/CD workflow for container build
- Create
./uisthin wrapper script - Container image at
ghcr.io/terchris/uis-provision-host:latest - Size reduced from 2.7GB to 1.86GB
- Auto-pull from registry
- Branded welcome page
Remaining for full orchestration system (see PLAN-004):
All remaining items are detailed in PLAN-004-uis-orchestration-system.md:
- Phase 1: Foundation - Library and Scanner
- Phase 2: Service Scripts with Metadata
- Phase 3: Config System - enabled-services.conf
- Phase 4: CLI Entry Point
- Phase 5: Interactive Menu
- Phase 6: Init Wizard
- Phase 7: Install Script
- Phase 8: Platform Support (Windows/WSL2)
Container Optimization (To Do)
- Add
noneoption toprovision-host-01-cloudproviders.shto skip cloud CLI installation - Create
topsecret/config/container-options.conftemplate for tool selection - UIS setup system to read available options from
provision-host-01-cloudproviders.sh -
uis initwizard asks user which cloud providers they need - Consider multiple container image variants (full/local/azure)
- Review provision-host-*.sh scripts - remove unused tools (MkDocs), make optional tools configurable
- Remove
provision-host-05-builddocs.sh(MkDocs no longer used) - Remove MkDocs installation from
provision-host-00-coresw.sh
Design Decisions (Analysis & Recommendations)
1. Package Name and Format
Options:
- A)
uis-kubernetes.zip- Matches content - B)
uis-provision-host.zip- Matches folder - C)
urbalurba-stack.zip- Product name
Recommendation: Option A - uis-kubernetes.zip
- Clear what's included
- Leaves room for future
uis-ansible.zipetc. - Format:
.zip(like DCT, cross-platform) - Hosted: GitHub releases (like DCT)
2. User Customization Folder Location
Options:
- A)
/uis.extend/in repo root (like DCT's.devcontainer.extend/) - B)
/provision-host/uis.extend/inside provision-host - C)
~/.uis/in user home directory
Recommendation: Option A - /uis.extend/ in repo root
- Consistent with DCT pattern
- Easy to find
- Clearly separated from distributed files
- Can be gitignored for user secrets
3. Keep Number Prefixes or Use Dependencies?
Current: 01-setup-prometheus.sh, 02-setup-tempo.sh (order by number)
Options:
- A) Keep number prefixes (current system works)
- B) Remove numbers, use dependency metadata (SCRIPT_REQUIRES)
- C) Hybrid: Keep numbers for human readability, but scanner reads SCRIPT_REQUIRES
Recommendation: Option C - Hybrid approach
- Keep
01-setup-prometheus.shnaming (humans can see order) - Add
SCRIPT_REQUIRES="prometheus"to scripts that depend on others uis-setup --deployresolves dependencies automatically- Backwards compatible with
provision-kubernetes.sh
4. Merge Setup/Remove into Single Script or Keep Separate?
Current: Separate files (01-setup-prometheus.sh, 01-remove-prometheus.sh)
Options:
- A) Merge into single script with
--uninstallflag (like DCT) - B) Keep separate (current system)
- C) Keep separate but add metadata pointing to removal script
Recommendation: Option B - Keep separate for now
- Less invasive change
- Backwards compatible
- Add metadata
SCRIPT_REMOVE="01-remove-prometheus.sh"to link them - Future: Can migrate to flags later if desired
5. Manifests Handling
Current: manifests/ folder with numbered YAML files
Options:
- A) Include in distribution package
- B) Keep separate (users can modify)
- C) Split: Core manifests in package, user overrides in
uis.extend/
Recommendation: Option C - Split approach
manifests/- Core manifests (in distribution)uis.extend/custom-manifests/- User additionsuis.extend/manifest-overrides/- Patches to core manifests
6. Ansible Playbooks Handling
Current: ansible/playbooks/ with numbered playbooks
Recommendation: Include in distribution
- Scripts call playbooks, so they must be present
- Playbooks are part of the "product"
- User customization via Ansible variables in
uis.extend/ansible-vars/
7. Version Numbering Scheme
Options:
- A) SemVer:
1.0.0,1.1.0,2.0.0 - B) CalVer:
2026.01,2026.02 - C) Simple incrementing:
1,2,3
Recommendation: Option A - SemVer
- Industry standard
- Clear meaning: major.minor.patch
- Breaking changes = major bump
.versionfile format:VERSION=1.0.0
8. Metadata Format (UIS-Specific Adaptations)
DCT Metadata Fields:
SCRIPT_ID="dev-python"
SCRIPT_NAME="Python Development Tools"
SCRIPT_DESCRIPTION="Install Python development environment"
SCRIPT_CATEGORY="LANGUAGE_DEV"
SCRIPT_CHECK_COMMAND="command -v python3"
SCRIPT_PREREQUISITES="config-identity"
Proposed UIS Metadata Fields:
# === Service Metadata (Required) ===
SCRIPT_ID="prometheus"
SCRIPT_NAME="Prometheus"
SCRIPT_DESCRIPTION="Metrics collection and storage for observability"
SCRIPT_CATEGORY="MONITORING"
# === UIS-Specific (Optional) ===
SCRIPT_PLAYBOOK="030-setup-prometheus.yml" # Ansible playbook
SCRIPT_MANIFEST="030-prometheus.yaml" # Primary manifest
SCRIPT_CHECK_COMMAND="kubectl get pods -n monitoring -l app=prometheus --no-headers | grep -q Running"
SCRIPT_REMOVE="01-remove-prometheus.sh" # Removal script
SCRIPT_REQUIRES="" # Dependencies (space-separated SCRIPT_IDs)
# === Website Metadata (Optional) ===
SCRIPT_ABSTRACT="Time-series database for metrics"
SCRIPT_LOGO="prometheus.svg"
SCRIPT_WEBSITE="https://prometheus.io"
SCRIPT_SUMMARY="Prometheus is an open-source systems monitoring toolkit..."
SCRIPT_TAGS="metrics monitoring alerting time-series"
SCRIPT_RELATED="grafana loki tempo"
Open Questions (Remaining)
-
How to handle the website/docs?
- Recommendation: Same repo but excluded from distribution
- Website is built from metadata in scripts
website/folder excluded fromuis-kubernetes.zip
-
What scanner function should UIS have?
- DCT has:
scan_install_scripts,scan_service_scripts, etc. - UIS needs:
scan_setup_scripts()for*-setup-*.shfiles - Follow same pattern but adapted for UIS naming
- DCT has:
-
Provision-host container integration?
uis.extend/mounted into container at/mnt/urbalurbadisk/uis.extend/- Scripts read from there when running inside provision-host
uis-setup.shon host machine calls into container
Secrets Management System Analysis
Current topsecret/ Structure
topsecret/
├── secrets-templates/ # Git tracked - base templates with ${VARIABLES}
│ ├── 00-common-values.env.template # Central config (domains, passwords, API keys)
│ ├── 00-master-secrets.yml.template # Master K8s secrets template
│ ├── 01-core-secrets.yml.template
│ ├── 02-database-secrets.yml.template
│ ├── 07-ai-secrets.yml.template
│ ├── 09-network-secrets.yml.template
│ ├── 12-auth-secrets.yml.template
│ └── ...
│
├── secrets-config/ # Gitignored - USER EDITS THIS
│ └── (copied from templates, user fills in actual values)