Pin Minecraft 26.3 and add safe Orion managed deployment support
This commit is contained in:
1 parent
dff2b5a9c4
commit
008120dbad
40 files changed
+1877
-490
No files matched your search
@@ -26,7 +26,7 @@ export async function DELETE(req: NextRequest) {
|
||||
return handle(async () => {
|
||||
const name = req.nextUrl.searchParams.get("name");
|
||||
if (!name) return fail("Missing backup name");
|
||||
deleteBackup(name);
|
||||
await deleteBackup(name);
|
||||
return ok({ deleted: name });
|
||||
});
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import { assertDeploymentEditable } from "@/server/managed";
|
||||
import { withServerOperation } from "@/server/operation";
|
||||
import { NextRequest } from "next/server";
|
||||
import { applyMcConfig, applyBackupConfig } from "@/server/compose";
|
||||
import { safetyBackup } from "@/server/backups";
|
||||
@@ -5,9 +7,10 @@ import { notify } from "@/server/notify";
|
||||
import { ok, fail, readJson, handle } from "@/server/api";
|
||||
|
||||
export async function POST(req: NextRequest) {
|
||||
return handle(async () => {
|
||||
return handle(() => withServerOperation(async () => {
|
||||
assertDeploymentEditable();
|
||||
const { service, backupFirst } = await readJson<{ service?: string; backupFirst?: boolean }>(req);
|
||||
if (backupFirst) await safetyBackup("config apply");
|
||||
if (service !== "backup" || backupFirst) await safetyBackup("config apply");
|
||||
const res = service === "backup" ? await applyBackupConfig() : await applyMcConfig();
|
||||
if (!res.ok) {
|
||||
notify("error", "Config apply failed", res.output.slice(-800));
|
||||
@@ -15,5 +18,5 @@ export async function POST(req: NextRequest) {
|
||||
}
|
||||
notify("success", "Configuration applied", "Container recreated with the new settings.", { discord: false });
|
||||
return ok({ output: res.output.slice(-1000) });
|
||||
});
|
||||
}));
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { env } from "@/server/env";
|
||||
import { ok } from "@/server/api";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
export function GET() { return ok({ managed: env.managed }); }
|
||||
@@ -1,10 +1,15 @@
|
||||
import { safetyBackup } from "@/server/backups";
|
||||
import { assertDeploymentEditable } from "@/server/managed";
|
||||
import { withServerOperation } from "@/server/operation";
|
||||
import { applyMcConfig } from "@/server/compose";
|
||||
import { notify } from "@/server/notify";
|
||||
import { ok, fail, handle } from "@/server/api";
|
||||
|
||||
/** Recreate the mc container so the itzg image re-resolves MODRINTH_PROJECTS. */
|
||||
export async function POST() {
|
||||
return handle(async () => {
|
||||
return handle(() => withServerOperation(async () => {
|
||||
assertDeploymentEditable();
|
||||
await safetyBackup("mod apply");
|
||||
const res = await applyMcConfig();
|
||||
if (!res.ok) {
|
||||
notify("error", "Mod apply failed", res.output.slice(-800));
|
||||
@@ -12,5 +17,5 @@ export async function POST() {
|
||||
}
|
||||
notify("success", "Mod changes applied", "Server container recreated; mods re-resolved.", { discord: false });
|
||||
return ok({ output: res.output.slice(-1000) });
|
||||
});
|
||||
}));
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import { assertDeploymentEditable } from "@/server/managed";
|
||||
import { withServerOperation } from "@/server/operation";
|
||||
import { NextRequest } from "next/server";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
@@ -18,7 +20,8 @@ export async function GET() {
|
||||
|
||||
/** Danger zone: archive the current world and generate a fresh one. */
|
||||
export async function POST(req: NextRequest) {
|
||||
return handle(async () => {
|
||||
return handle(() => withServerOperation(async () => {
|
||||
assertDeploymentEditable();
|
||||
const { op, confirm } = await readJson<{ op?: string; confirm?: string }>(req);
|
||||
if (op !== "reset") return fail("Unknown operation");
|
||||
if (confirm !== "reset the world") return fail('Type "reset the world" to confirm');
|
||||
@@ -27,6 +30,8 @@ export async function POST(req: NextRequest) {
|
||||
if (!fs.existsSync(worldDir)) return fail("No world folder found");
|
||||
|
||||
await safetyBackup("world reset");
|
||||
const backup = await inspectContainer(env.backupContainer);
|
||||
if (backup.running) await powerContainer(env.backupContainer, "stop");
|
||||
const state = await inspectContainer(env.mcContainer);
|
||||
if (state.running) await powerContainer(env.mcContainer, "stop");
|
||||
|
||||
@@ -34,8 +39,9 @@ export async function POST(req: NextRequest) {
|
||||
fs.renameSync(worldDir, path.join(env.mcDataDir, archived));
|
||||
|
||||
await powerContainer(env.mcContainer, "start");
|
||||
if (backup.running) await powerContainer(env.backupContainer, "start");
|
||||
logActivity("world_reset", null, `old world kept as ${archived}`);
|
||||
notify("warn", "World reset", `A fresh world is generating. Old world kept as ${archived}.`);
|
||||
return ok({ archived });
|
||||
});
|
||||
}));
|
||||
}
|
||||
Reference in new issue
Block a user