diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-24 22:36:57 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-24 22:36:57 +0300 |
| commit | 30508d25d0d7856eec82aedca8004690fb543da6 (patch) | |
| tree | 1c59461dfd0d1b16da31fa817fe3d61bd4ef6e0e | |
| parent | 70dfe03757d3d9eb889f0ed85747b2c90412d8cb (diff) | |
chore(config): revert vm2 default to n3-A100x1; simplify justfile
| -rw-r--r-- | hyperstack-vm2.toml | 3 | ||||
| -rw-r--r-- | justfile | 117 |
2 files changed, 6 insertions, 114 deletions
diff --git a/hyperstack-vm2.toml b/hyperstack-vm2.toml index 070b8aa..2243f5e 100644 --- a/hyperstack-vm2.toml +++ b/hyperstack-vm2.toml @@ -14,8 +14,7 @@ hostname = "hyperstack2" environment_name = "snonux-ollama" # A100-80GB for Qwen3.6 27B; H100 fallback if n3-A100x1 unavailable. -# 2026-05-24: A100 sold out, switched to H100. -flavor_name = "n3-H100x1" +flavor_name = "n3-A100x1" image_name = "Ubuntu Server 24.04 LTS R570 CUDA 12.8 with Docker" assign_floating_ip = true create_bootable_volume = false @@ -1,134 +1,27 @@ -# Justfile for hyperstack.rb — common VM and vLLM operations -# Usage: just <recipe> [args] -# Install: cargo install just +# Minimal justfile for hyperstack.rb set dotenv-load := false set shell := ["/bin/bash", "-cu"] -# Path to the Ruby CLI script -ruby := "ruby" -hypr_dir := source_directory() -hypr := ruby + " -I" + hypr_dir + "/lib " + hypr_dir + "/hyperstack.rb" +hypr := "ruby -Ilib hyperstack.rb" -# Default recipe: show help -[private] -default: - @just --list --unsorted - -# ── VM Lifecycle ───────────────────────────────────────────────────────── - -# Create VM1 (defaults to hyperstack-vm1.toml) create-vm1: {{hypr}} --vm 1 create -# Create VM2 (hyperstack-vm2.toml) create-vm2: {{hypr}} --vm 2 create -# Create both VMs concurrently -create-both: - {{hypr}} --vm both create - -# Delete VM1 delete-vm1: {{hypr}} --vm 1 delete -# Delete VM2 delete-vm2: {{hypr}} --vm 2 delete -# Delete both VMs concurrently -delete-both: - {{hypr}} --vm both delete - -# Recreate VM1 (delete then create, non-interactive) -recreate-vm1: delete-vm1 create-vm1 - -# Recreate VM2 (delete then create, non-interactive) -recreate-vm2: delete-vm2 create-vm2 - -# ── Observability ─────────────────────────────────────────────────────── - -# Watch dashboard: auto-detects active VMs, updates every 5s watch: {{hypr}} watch -# Show status of VM1 -status-vm1: - {{hypr}} --vm 1 status +status: + {{hypr}} status -# Show status of VM2 -status-vm2: - {{hypr}} --vm 2 status - -# Show status of all tracked VMs -status-both: - {{hypr}} --vm both status - -# ── Testing ───────────────────────────────────────────────────────────── - -# Run inference tests against VM1 -test-vm1: - {{hypr}} --vm 1 test - -# Run inference tests against VM2 -test-vm2: - {{hypr}} --vm 2 test - -# Run inference tests against all active VMs -test-all: +test: {{hypr}} test - -# ── Model Management ──────────────────────────────────────────────────── - -# List available model presets for VM1 -model-list-vm1: - {{hypr}} --vm 1 model list - -# List available model presets for VM2 -model-list-vm2: - {{hypr}} --vm 2 model list - -# Switch VM1 to a named preset (requires VM to be running) -model-switch-vm1 PRESET: - {{hypr}} --vm 1 model switch {{PRESET}} - -# Switch VM2 to a named preset (requires VM to be running) -model-switch-vm2 PRESET: - {{hypr}} --vm 2 model switch {{PRESET}} - -# ── SSH Access ────────────────────────────────────────────────────────── - -# SSH into VM1 (reads public IP from state file) -ssh-vm1: - @python3 -c "import json, subprocess, os; state = json.load(open(os.path.expanduser('{{hypr_dir}}/.hyperstack-vm1-state.json'))); subprocess.run(['ssh', '-i', '~/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=accept-new', f\"ubuntu@{state['public_ip']}\"])" || echo "VM1 state file not found." - -# SSH into VM2 (reads public IP from state file) -ssh-vm2: - @python3 -c "import json, subprocess, os; state = json.load(open(os.path.expanduser('{{hypr_dir}}/.hyperstack-vm2-state.json'))); subprocess.run(['ssh', '-i', '~/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=accept-new', f\"ubuntu@{state['public_ip']}\"])" || echo "VM2 state file not found." - -# ── vLLM Logs ─────────────────────────────────────────────────────────── - -# Tail vLLM container logs on VM1 -logs-vm1: - @python3 -c "import json, subprocess, os; state = json.load(open(os.path.expanduser('{{hypr_dir}}/.hyperstack-vm1-state.json'))); container = state.get('vllm_container_name', 'vllm_qwen36_27b'); subprocess.run(['ssh', '-i', '~/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=accept-new', f\"ubuntu@{state['public_ip']}\", f'sudo docker logs -f {container}'])" || echo "VM1 state file not found." - -# Tail vLLM container logs on VM2 -logs-vm2: - @python3 -c "import json, subprocess, os; state = json.load(open(os.path.expanduser('{{hypr_dir}}/.hyperstack-vm2-state.json'))); container = state.get('vllm_container_name', 'vllm_qwen36_27b'); subprocess.run(['ssh', '-i', '~/.ssh/id_rsa', '-o', 'StrictHostKeyChecking=accept-new', f\"ubuntu@{state['public_ip']}\", f'sudo docker logs -f {container}'])" || echo "VM2 state file not found." - -# ── WireGuard ───────────────────────────────────────────────────────────── - -# Show local WireGuard tunnel status -wg-status: - sudo wg show wg1 - -# Restart local WireGuard tunnel -wg-restart: - sudo systemctl restart wg-quick@wg1 - -# ── Git helpers (optional) ──────────────────────────────────────────────── - -# Show recent commits touching hyperstack files -log: - git log --oneline -10 -- hyperstack-vm1.toml hyperstack-vm2.toml lib/hyperstack.rb wg1-setup.sh justfile |
