Phase8
Some checks failed
CI / Node — lint, typecheck, test, build (push) Failing after 9s
CI / Go — node-agent tests (push) Failing after 9s
CI / Go — edge-gateway build (push) Successful in 17s

This commit is contained in:
smueller
2026-06-26 13:33:03 +02:00
parent ab21f53cdd
commit b335f6a497
39 changed files with 1477 additions and 20 deletions

View File

@@ -0,0 +1,40 @@
-- Phase 8: DNS metadata and join-to-start
CREATE TYPE "DnsRecordStatus" AS ENUM ('PENDING', 'ACTIVE', 'FAILED', 'REMOVED');
ALTER TABLE "game_servers"
ADD COLUMN IF NOT EXISTS "joinSlug" TEXT,
ADD COLUMN IF NOT EXISTS "joinToStartEnabled" BOOLEAN NOT NULL DEFAULT true;
CREATE UNIQUE INDEX IF NOT EXISTS "game_servers_joinSlug_key" ON "game_servers"("joinSlug");
ALTER TABLE "game_nodes"
ADD COLUMN IF NOT EXISTS "portRangeStart" INTEGER NOT NULL DEFAULT 25565,
ADD COLUMN IF NOT EXISTS "portRangeEnd" INTEGER NOT NULL DEFAULT 25664;
CREATE TABLE IF NOT EXISTS "server_dns_records" (
"id" TEXT NOT NULL,
"serverId" TEXT NOT NULL,
"fqdn" TEXT NOT NULL,
"recordType" TEXT NOT NULL,
"target" TEXT NOT NULL,
"port" INTEGER,
"srvPriority" INTEGER,
"srvWeight" INTEGER,
"status" "DnsRecordStatus" NOT NULL DEFAULT 'PENDING',
"lastSyncedAt" TIMESTAMPTZ(3),
"lastError" TEXT,
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
CONSTRAINT "server_dns_records_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "server_dns_records_serverId_recordType_fqdn_key"
ON "server_dns_records"("serverId", "recordType", "fqdn");
CREATE INDEX IF NOT EXISTS "server_dns_records_fqdn_idx" ON "server_dns_records"("fqdn");
ALTER TABLE "server_dns_records"
ADD CONSTRAINT "server_dns_records_serverId_fkey"
FOREIGN KEY ("serverId") REFERENCES "game_servers"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -128,6 +128,13 @@ enum CreditTransactionType {
EXPIRE
}
enum DnsRecordStatus {
PENDING
ACTIVE
FAILED
REMOVED
}
model User {
id String @id @default(uuid())
email String @unique
@@ -291,6 +298,8 @@ model GameServer {
idleStopAt DateTime? @db.Timestamptz(3)
runningSince DateTime? @db.Timestamptz(3)
lastMeteredAt DateTime? @db.Timestamptz(3)
joinSlug String? @unique
joinToStartEnabled Boolean @default(true)
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
@@ -306,6 +315,7 @@ model GameServer {
installedAddons InstalledAddon[]
startQueueEntry ServerStartQueueEntry?
usageRecords UsageRecord[]
dnsRecords ServerDnsRecord[]
@@index([userId])
@@index([nodeId])
@@ -359,6 +369,8 @@ model GameNode {
maxServers Int @default(10)
maxRamMb Int @default(16384)
platformRamMb Int @default(2048)
portRangeStart Int @default(25565)
portRangeEnd Int @default(25664)
activeServers Int @default(0)
lastHeartbeatAt DateTime? @db.Timestamptz(3)
agentVersion String?
@@ -650,3 +662,25 @@ model InstalledAddon {
@@index([status])
@@map("installed_addons")
}
model ServerDnsRecord {
id String @id @default(uuid())
serverId String
fqdn String
recordType String
target String
port Int?
srvPriority Int?
srvWeight Int?
status DnsRecordStatus @default(PENDING)
lastSyncedAt DateTime? @db.Timestamptz(3)
lastError String?
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
server GameServer @relation(fields: [serverId], references: [id], onDelete: Cascade)
@@unique([serverId, recordType, fqdn])
@@index([fqdn])
@@map("server_dns_records")
}