Everything broke, trying to fix
This commit is contained in:
parent
69d98c69b5
commit
e1caa9b0ad
6 changed files with 115 additions and 16 deletions
17
app/api/system/shutdown/route.ts
Normal file
17
app/api/system/shutdown/route.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
|
export async function POST(req: NextRequest) {
|
||||||
|
const token = req.cookies.get("token")?.value;
|
||||||
|
if (!token) {
|
||||||
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await fetch("http://localhost:3001/system/shutdown", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return NextResponse.json(await res.json(), { status: res.status });
|
||||||
|
}
|
||||||
|
|
@ -81,6 +81,13 @@ export default function ControlPanel({ onClose }: { onClose: () => void }) {
|
||||||
showToast(res.ok ? "Rebooting..." : "Reboot failed", res.ok);
|
showToast(res.ok ? "Rebooting..." : "Reboot failed", res.ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function handleShutdown() {
|
||||||
|
if (!confirm("Shut down the server? You will need physical access to turn it back on."))
|
||||||
|
return;
|
||||||
|
const res = await fetch("/api/system/shutdown", { method: "POST" });
|
||||||
|
showToast(res.ok ? "Shutting down..." : "Shutdown failed", res.ok);
|
||||||
|
}
|
||||||
|
|
||||||
const isLoading = (service: string, action: string) =>
|
const isLoading = (service: string, action: string) =>
|
||||||
loading[`${service}-${action}`] !== undefined;
|
loading[`${service}-${action}`] !== undefined;
|
||||||
|
|
||||||
|
|
@ -203,6 +210,22 @@ export default function ControlPanel({ onClose }: { onClose: () => void }) {
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="bg-gray-50 border border-gray-100 rounded-xl px-4 py-3.5 flex items-center justify-between mt-2">
|
||||||
|
<div>
|
||||||
|
<p className="text-[14px] text-gray-900 m-0 mb-0.5">
|
||||||
|
Shut down server
|
||||||
|
</p>
|
||||||
|
<p className="text-[12px] text-gray-400 m-0">
|
||||||
|
Powers off the machine
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={handleShutdown}
|
||||||
|
className="border border-red-200 rounded-lg px-3.5 py-1.5 text-[13px] text-red-400 cursor-pointer hover:bg-red-50 transition-colors whitespace-nowrap"
|
||||||
|
>
|
||||||
|
Shut down
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Toast */}
|
{/* Toast */}
|
||||||
{toast && (
|
{toast && (
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,20 @@
|
||||||
@import "tailwindcss";
|
@import "tailwindcss";
|
||||||
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--background: #f9fafb;
|
--background: #f9fafb;
|
||||||
--foreground: #111827;
|
--foreground: #111827;
|
||||||
|
--font-dm-sans: "DM Sans", sans-serif;
|
||||||
|
--font-playfair: "Playfair Display", serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
@theme inline {
|
@theme inline {
|
||||||
--color-background: var(--background);
|
--color-background: var(--background);
|
||||||
--color-foreground: var(--foreground);
|
--color-foreground: var(--foreground);
|
||||||
|
|
||||||
|
/* Link Tailwind to the Next.js Font Variables */
|
||||||
|
--font-sans: var(--font-dm-sans), ui-sans-serif, system-ui;
|
||||||
|
--font-serif: var(--font-playfair), ui-serif, Georgia;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
|
|
||||||
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1774709303,
|
||||||
|
"narHash": "sha256-D3Q07BbIA2KnTcSXIqqu9P586uWxN74zNoCH3h2ESHg=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "8110df5ad7abf5d4c0f6fb0f8f978390e77f9685",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
21
flake.nix
21
flake.nix
|
|
@ -17,20 +17,8 @@
|
||||||
pkgs = import nixpkgs { inherit system; };
|
pkgs = import nixpkgs { inherit system; };
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages.default = pkgs.buildNpmPackage {
|
devShells.default = pkgs.mkShell {
|
||||||
pname = "server-dash";
|
buildInputs = with pkgs; [ nodejs ];
|
||||||
version = "0.1.0";
|
|
||||||
src = ./.;
|
|
||||||
npmDepsHash = "sha256-jzVH/DKNE6m+RowHku7h3brC6T+a6xjl2SKSXiTmLgM=";
|
|
||||||
buildPhase = ''
|
|
||||||
npm run build
|
|
||||||
'';
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/.next
|
|
||||||
cp -r .next/standalone/. $out/
|
|
||||||
cp -r .next/static $out/.next/static
|
|
||||||
cp -r public $out/public
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -67,8 +55,11 @@
|
||||||
Type = "simple";
|
Type = "simple";
|
||||||
User = "server-dash";
|
User = "server-dash";
|
||||||
Group = "server-dash";
|
Group = "server-dash";
|
||||||
|
ExecStartPre = "${pkgs.bash}/bin/bash -c 'test -f ${config.services.server-dash.package}/server.js || (echo \"Build not found, run npm run deploy first\" && exit 1)'";
|
||||||
|
WorkingDirectory = config.services.server-dash.package;
|
||||||
ExecStart = "${pkgs.nodejs}/bin/node ${config.services.server-dash.package}/server.js";
|
ExecStart = "${pkgs.nodejs}/bin/node ${config.services.server-dash.package}/server.js";
|
||||||
Restart = "always";
|
Restart = "on-failure";
|
||||||
|
RestartSec = "10s";
|
||||||
EnvironmentFile = "/var/lib/server-dash/.env";
|
EnvironmentFile = "/var/lib/server-dash/.env";
|
||||||
Environment = [
|
Environment = [
|
||||||
"PORT=3000"
|
"PORT=3000"
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint",
|
"lint": "eslint",
|
||||||
"deploy": "npm run build && sudo mkdir -p /var/lib/server-dash/build && sudo cp -r .next/standalone/. /var/lib/server-dash/build/ && sudo mkdir -p /var/lib/server-dash/build/.next && sudo cp -r .next/static /var/lib/server-dash/build/.next/static && sudo cp -r public /var/lib/server-dash/build/public && sudo cp .env /var/lib/server-dash/.env && sudo chown -R server-dash:server-dash /var/lib/server-dash && sudo systemctl restart server-dash"
|
"deploy": "npm run build && sudo mkdir -p /var/lib/server-dash/build/.next && sudo cp -r .next/standalone/. /var/lib/server-dash/build/ && sudo cp -r .next/static /var/lib/server-dash/build/.next/static && sudo cp -r public /var/lib/server-dash/build/public && sudo cp .env /var/lib/server-dash/.env && sudo chown -R server-dash:server-dash /var/lib/server-dash && sudo systemctl restart server-dash"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"next": "16.2.1",
|
"next": "16.2.1",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue