Files
Provisioning/internal/db/migrations/0001_init.sql
T
josh bda568b25c Initial implementation: host lifecycle + PXE + admin dashboard
Go service for Proxmox homelab cluster provisioning. Handles PXE boot,
Proxmox autoinstall (answer file generation), cluster join via SSH,
and Infrastructure API registration.

- Host state machine (registered → pxe_ready → installing → ready)
- dnsmasq supervisor with MAC-based allowlist
- iPXE script and Proxmox answer file generation
- First-boot phone-home → cluster join → infra registration
- Operation locking with expiry (409 on conflict)
- SSE event hub for real-time dashboard updates
- Admin dashboard (host grid, detail, registration form)
- Config-driven server types with hot-reload
- Docker deployment (multi-stage fat image)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-03 20:55:14 -04:00

44 lines
1.6 KiB
SQL

CREATE TABLE hosts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname TEXT NOT NULL UNIQUE,
mac TEXT NOT NULL UNIQUE,
server_type TEXT NOT NULL,
state TEXT NOT NULL DEFAULT 'registered',
ip_address TEXT,
hardware_id TEXT,
infra_host_id INTEGER,
notes TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
);
CREATE TABLE operations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
host_id INTEGER NOT NULL REFERENCES hosts(id) ON DELETE CASCADE,
kind TEXT NOT NULL,
state TEXT NOT NULL DEFAULT 'active',
image_id INTEGER REFERENCES images(id),
started_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now')),
completed_at TEXT,
error_message TEXT
);
CREATE INDEX idx_operations_host ON operations(host_id);
CREATE TABLE operation_locks (
host_id INTEGER PRIMARY KEY REFERENCES hosts(id) ON DELETE CASCADE,
operation_id INTEGER NOT NULL REFERENCES operations(id),
locked_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now')),
expires_at TEXT NOT NULL
);
CREATE TABLE images (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
kind TEXT NOT NULL,
version TEXT NOT NULL,
kernel_path TEXT NOT NULL,
initrd_path TEXT NOT NULL,
is_default INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
);