Phase8
This commit is contained in:
@@ -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;
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -57,6 +57,8 @@ async function main(): Promise<void> {
|
||||
maxServers: 10,
|
||||
maxRamMb: 16384,
|
||||
platformRamMb: 2048,
|
||||
portRangeStart: 25565,
|
||||
portRangeEnd: 25664,
|
||||
enrollmentTokenHash: hashToken(DEV_NODE_ENROLLMENT_TOKEN),
|
||||
},
|
||||
update: {
|
||||
@@ -64,6 +66,8 @@ async function main(): Promise<void> {
|
||||
hostname: 'localhost',
|
||||
maxRamMb: 16384,
|
||||
platformRamMb: 2048,
|
||||
portRangeStart: 25565,
|
||||
portRangeEnd: 25664,
|
||||
enrollmentTokenHash: hashToken(DEV_NODE_ENROLLMENT_TOKEN),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -17,6 +17,7 @@ export type {
|
||||
BackupSchedule,
|
||||
WorldUpload,
|
||||
InstalledAddon,
|
||||
ServerDnsRecord,
|
||||
GameNode,
|
||||
GameNodeHeartbeat,
|
||||
ServerStartQueueEntry,
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user