Files
firefrost-services/services/arbiter-3.0/migrations/144_install_history.sql
Claude Code bca31bf677 Task #101: AI-Powered Modpack Server Installer (REQ-2026-04-16-modpack-installer)
Full modpack installer integrated into Trinity Console. Architecture locked
via 4-round Gemini consultation.

Migrations:
- 143: server_config modpack columns (provider, version tracking, RAM, hibernation, spawn_verified)
- 144: install_history table (UUID PK, JSONB log_output, FK to server_config)

Provider API clients (src/services/providerApi/):
- curseforge.js: search, pack details, version list, download URL resolution
- modrinth.js: search, pack details, version list, download URL
- ftb.js: stub (+ ATLauncher, Technic, VoidsWrath aliases)
- index.js: provider registry with getProvider() + listProviders()

Job queue:
- pg-boss ^10.1.5 added to package.json
- index.js: initializes pg-boss, registers modpack-installs worker (concurrency 2)
- modpackInstaller.js: 11-step install pipeline (preflight → Pterodactyl create →
  download → DNS → Discord → server_config seed → power on). Each step logged to
  install_history.log_output JSONB for live status streaming.

Admin routes (src/routes/admin/modpack-installer.js):
- GET /admin/modpack-installer — main page (provider select → search → configure → install)
- GET /search — HTMX pack search partial
- GET /pack/:provider/:id — HTMX pack details + install form
- POST /install — enqueue pg-boss job, redirect to status
- GET /status/:id — live status page (polls /status/:id/json every 3s)
- GET /history — install history table
- GET /pending-spawns — Holly's spawn verification queue
- POST /verify-spawn/:id — mark spawn verified

Views (6 EJS files):
- index.ejs: 3-step flow (provider cards → search with MC version filter → pack details + form)
- _pack_list.ejs: search results grid partial
- _pack_details.ejs: pack info + install config form (version, name, short_name, node, RAM, spawn type)
- status.ejs: live log viewer with 3s polling, color-coded steps
- history.ejs: filterable job history table
- pending-spawns.ejs: Holly's queue with Mark Verified buttons

Also: sidebar nav link, .env.example (CURSEFORGE_API_KEY, BITCH_BOT_SCHEMATIC_*, CLOUDFLARE_ZONE_ID)

All 8 JS files pass node --check. All 7 EJS files pass ejs.compile().
2026-04-16 00:24:48 -05:00

26 lines
1.1 KiB
SQL

-- Migration 144: install_history table (Task #101)
-- Tracks every modpack install/update job through the pg-boss queue.
CREATE TABLE IF NOT EXISTS install_history (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
server_identifier VARCHAR(36) REFERENCES server_config(server_identifier) ON DELETE SET NULL,
pterodactyl_server_id VARCHAR(100),
job_type VARCHAR(50) NOT NULL, -- fresh_install, update, ghost_update
target_version_id VARCHAR(100) NOT NULL,
triggered_by VARCHAR(100) NOT NULL, -- Discord username
status VARCHAR(50) NOT NULL DEFAULT 'queued', -- queued, running, success, failed
started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
completed_at TIMESTAMP WITH TIME ZONE,
duration_seconds INT,
mods_injected INT DEFAULT 0,
log_output JSONB DEFAULT '{}',
error_message TEXT
);
CREATE INDEX IF NOT EXISTS idx_install_history_server
ON install_history(server_identifier);
CREATE INDEX IF NOT EXISTS idx_install_history_recent_failures
ON install_history(server_identifier, status, started_at);
CREATE INDEX IF NOT EXISTS idx_install_history_status
ON install_history(status);