summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-24 22:36:57 +0300
committerPaul Buetow <paul@buetow.org>2026-05-24 22:36:57 +0300
commit30508d25d0d7856eec82aedca8004690fb543da6 (patch)
tree1c59461dfd0d1b16da31fa817fe3d61bd4ef6e0e
parent70dfe03757d3d9eb889f0ed85747b2c90412d8cb (diff)
chore(config): revert vm2 default to n3-A100x1; simplify justfile
-rw-r--r--hyperstack-vm2.toml3
-rw-r--r--justfile117
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
diff --git a/justfile b/justfile
index 04c625f..819db6e 100644
--- a/justfile
+++ b/justfile
@@ -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