Skip to main content

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

Targetv1v2v3Notes
docker-composeDefault. Single-host, all 12 v1 services
proxmox-lxcMaintainer's primary testbed
kubernetes-helmEKS / GKE / AKS / k3s / kind
nomadHashiCorp Nomad clusters
crossplaneXRDs for multi-cloud composition
pulumi / terraformCloud IaC for AWS / GCP / Azure
ansibleBare-metal / VM provisioning
vmware-ovfOVF appliance
packerAMI / qcow2 / OVA
native-macbrew install mts1b
native-windowswinget / scoop
native-linuxdeb / rpm / pacman

Target choice is orthogonal to profile choice. Want proxmox-lxc + minimal profile? Fine. Want kubernetes-helm + full profile? Also fine.

Profiles

ProfileWhat's installedUse
minimalPostgres, NATS, foundation, platform, deploySmoke test the installer
backtest-onlyminimal + quantkit, GPUbacktester, datalake, research (read-only)Researchers without trading
paper-tradingbacktest-only + brokers (paper), oms, oms-algos, riskengine, portfolio, marketdataTry strategies without real money
foundational-12All 12 v1 reposThe v1 launch reference profile
live-tradingfoundational-12 + live broker creds + halt manager hardeningProduction trading
fullAll 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

mts1b.config
# 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 diff shows 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