Deployment profiles
mts1b-deploy is a kernel-menuconfig-style installer with a single config file (mts1b.config) and many targets. You choose a target (where to run) and a profile (what to install) and the rest is rendered.
This page covers the available targets, profiles, and the file layout mts1b-deploy produces.
Targets
| Target | v1 | v2 | v3 | Notes |
|---|---|---|---|---|
docker-compose | ✅ | Default. Single-host, all 12 v1 services | ||
proxmox-lxc ⭐ | ✅ | Maintainer's primary testbed | ||
kubernetes-helm | ✅ | EKS / GKE / AKS / k3s / kind | ||
nomad | ✅ | HashiCorp Nomad clusters | ||
crossplane | ✅ | XRDs for multi-cloud composition | ||
pulumi / terraform | ✅ | Cloud IaC for AWS / GCP / Azure | ||
ansible | ✅ | Bare-metal / VM provisioning | ||
vmware-ovf | ✅ | OVF appliance | ||
packer | ✅ | AMI / qcow2 / OVA | ||
native-mac | ✅ | brew install mts1b | ||
native-windows | ✅ | winget / scoop | ||
native-linux | ✅ | deb / rpm / pacman |
Target choice is orthogonal to profile choice. Want proxmox-lxc + minimal profile? Fine. Want kubernetes-helm + full profile? Also fine.
Profiles
| Profile | What's installed | Use |
|---|---|---|
minimal | Postgres, NATS, foundation, platform, deploy | Smoke test the installer |
backtest-only | minimal + quantkit, GPUbacktester, datalake, research (read-only) | Researchers without trading |
paper-trading | backtest-only + brokers (paper), oms, oms-algos, riskengine, portfolio, marketdata | Try strategies without real money |
foundational-12 | All 12 v1 repos | The v1 launch reference profile |
live-trading | foundational-12 + live broker creds + halt manager hardening | Production trading |
full | All 29 repos (after v3) | Everything |
The menuconfig UX
mts1b-deploy menuconfig
Launches a Textual TUI:
┌─ MTS1B Deploy ────────────────────────────────────────────────────┐
│ │
│ [*] Target │
│ ( ) docker-compose │
│ (*) proxmox-lxc ← cursor │
│ ( ) kubernetes-helm │
│ ( ) nomad │
│ ( ) native-linux │
│ │
│ [*] Profile │
│ ( ) minimal │
│ ( ) backtest-only │
│ (*) foundational-12 │
│ ( ) paper-trading │
│ ( ) full │
│ │
│ [*] Asset classes │
│ [*] equities │
│ [*] crypto │
│ [ ] options │
│ [ ] fx │
│ [ ] futures │
│ │
│ [*] Optional services │
│ [ ] LLM router (mts1b-llm) │
│ [ ] GitHub bot (mts1b-githubbot) │
│ [ ] Discord bot (mts1b-discordbot) │
│ [ ] Frontends (webui + TUI + CLI) │
│ │
│ [*] Secrets │
│ ( ) Managed by mts1b-deploy (Vault auto-bootstrap) │
│ (*) External Vault (recommended for production) │
│ ( ) Plain .env (NOT recommended) │
│ │
│ <Save> <Help> <Quit> │
└───────────────────────────────────────────────────────────────────┘
Save → writes mts1b.config (annotated YAML).
The config file
# Generated by mts1b-deploy menuconfig — edit and re-render with
# mts1b-deploy validate to keep this in sync.
target: proxmox-lxc
profile: foundational-12
asset_classes: [equities, crypto]
optional:
llm: false
githubbot: false
discordbot: false
frontends: false
secrets:
source: external-vault
vault_addr: https://vault.local:8200
vault_role: mts1b
proxmox:
api_url: https://proxmox.local:8006/api2/json
node: pve1
storage: local-lvm
network: vmbr0
template: ubuntu-22.04-standard
ssh_keys:
- "ssh-ed25519 AAAA..."
ports:
oms_grpc: 50051
oms_http: 8001
riskengine: 8002
portfolio: 8003
marketdata: 8004
# ... (one per service, all configurable)
postgres:
version: "16"
shared_buffers: 4GB
data_dir: /var/lib/postgres
What gets rendered
For target=proxmox-lxc:
./out/
├── proxmox/
│ ├── lxc-templates/
│ │ ├── mts1b-foundation.conf # LXC container spec
│ │ ├── mts1b-platform.conf
│ │ ├── mts1b-oms.conf
│ │ └── ... (one per service)
│ ├── provision.sh # idempotent provisioning
│ └── teardown.sh
├── env/
│ ├── foundation.env # Vault-rendered secrets
│ ├── platform.env
│ └── ...
└── observability/
├── prometheus.yml
└── grafana-dashboards/
For target=docker-compose:
./out/
├── docker-compose.yml # all services
├── docker-compose.override.yml # local overrides
├── .env # generated, Vault-rendered
└── volumes/
├── postgres/
├── nats/
└── minio/
For target=kubernetes-helm (v2):
./out/
├── charts/
│ ├── mts1b-foundation/Chart.yaml
│ ├── mts1b-platform/Chart.yaml
│ └── ...
├── values.yaml
└── kustomization.yaml
Install + verify
mts1b-deploy install --config mts1b.config
# ... (provisions, pulls images, starts services)
mts1b-deploy status
# ✓ mts1b-foundation loaded
# ✓ mts1b-platform /healthz green
# ✓ mts1b-marketdata /healthz green
# ... (12/12 green)
mts1b-deploy demo backtest-equities
# Runs a 10-year SPY momentum backtest end-to-end through
# mts1b-GPUbacktester. Writes result parquet + prints summary.
Idempotency
mts1b-deploy install is idempotent. Running it twice with the same config does nothing the second time. The renderer diffs the generated files against the current state and applies only changes.
This means:
- Safe to run in CI on every commit.
- Config drift detection:
mts1b-deploy diffshows config-vs-running deltas. - Rollback via
mts1b-deploy rollback --to <commit>.
Profile composition
You can combine profile + optional flags arbitrarily:
mts1b-deploy install \
--profile foundational-12 \
--include llm \
--include frontends \
--exclude marketdata # I have my own market data feed
The CLI is a thin wrapper over the same logic the TUI calls.
Why kernel-style menuconfig?
- Discoverable: you see every option without reading docs.
- Auditable: the saved config file is the source of truth, version-controlled.
- Composable: any profile × target × optional flag combination is supported.
- Boring: Linux kernel devs have solved this UX problem; we reuse the convention.
See also
mts1b-deployrepo spec — full CLI reference- Tutorial: Deploy to Proxmox LXC — end-to-end walkthrough
- Risk envelopes — what enforcement looks like in
live-tradingprofile