From d584d7540e59bd64b938d35d31e50433bbe7789e Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 4 Jul 2022 00:55:39 +0200 Subject: [PATCH] Copy plugins on server startup - Copying everything as we can't copy while the server is running, so we need to either know which plugins changed or just copy it all (since it needs to be copied to both places) --- .docker/mcserver/{ => plugins}/.gitkeep | 0 .docker/server/Dockerfile | 2 +- src/index.ts | 28 +++++++++++++++++-------- src/package-lock.json | 11 ++++++++++ src/package.json | 1 + 5 files changed, 32 insertions(+), 10 deletions(-) rename .docker/mcserver/{ => plugins}/.gitkeep (100%) diff --git a/.docker/mcserver/.gitkeep b/.docker/mcserver/plugins/.gitkeep similarity index 100% rename from .docker/mcserver/.gitkeep rename to .docker/mcserver/plugins/.gitkeep diff --git a/.docker/server/Dockerfile b/.docker/server/Dockerfile index 574d8a6..460fbe7 100644 --- a/.docker/server/Dockerfile +++ b/.docker/server/Dockerfile @@ -4,4 +4,4 @@ COPY .docker/server/start.sh ./ WORKDIR /mcserver -ENTRYPOINT ["sh", "/start.sh"] +ENTRYPOINT ["bash", "/start.sh"] diff --git a/src/index.ts b/src/index.ts index 6969bef..d69cb22 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,14 +1,20 @@ import fetch from 'node-fetch'; import { promises } from 'fs'; -import { ChildProcess, exec, ExecException } from 'child_process'; +import { exec, ExecException } from 'child_process'; import * as chokidar from 'chokidar'; +import debounce from 'debounce'; const running: { - process: ChildProcess, + watch: chokidar.FSWatcher, server1: boolean, serverName: () => string, prevServerName: () => string -} = {process: null, server1: false, serverName: () => 'server' + (running.server1 ? '1' : '2'), prevServerName: () => 'server' + (running.server1 ? '2' : '1')}; +} = { + watch: null, + server1: false, + serverName: () => 'server' + (running.server1 ? '1' : '2'), + prevServerName: () => 'server' + (running.server1 ? '2' : '1') +}; async function main() { console.log("Checking for server updates...", "MC", process.env.MC_VERSION); @@ -28,24 +34,28 @@ async function main() { console.log("Build downloaded", lastBuild.downloads.application.name); } } - await startNextServer(); - chokidar.watch(`/mcserver/${running.serverName()}/plugins/*.jar`).on('change', async () => { // TODO: Separate plugins dir - console.log("Plugin changes detected, restarting"); + const listener = async (changedPath) => { + console.log(`Plugin change detected at ${changedPath}, switching to ${running.prevServerName()}`); await startNextServer(); - }); + }; + running.watch = chokidar.watch(`/mcserver/plugins/*.jar`).on('change', debounce(listener, 500)); + await startNextServer(); } async function startNextServer() { running.server1 = !running.server1; + console.log("Copying plugin files to", running.serverName()); + await promises.cp('/mcserver/plugins', `/mcserver/${running.serverName()}/plugins`, {recursive: true}); // TODO: Don't run servers as root + // TODO: Copy config files back to main plugins dir console.log("Starting server", running.server1 ? 'one' : 'two'); - exec('docker compose -f /docker-compose.server.yml up -d '+running.serverName(), loggingCallback); + exec('docker compose -f /docker-compose.server.yml up -d ' + running.serverName(), loggingCallback); await waitForStartup(); await stopPrevServer(); } async function stopPrevServer() { console.log("Stopping previous server"); - exec('docker compose -f /docker-compose.server.yml stop '+running.prevServerName(), loggingCallback); + exec('docker compose -f /docker-compose.server.yml stop ' + running.prevServerName(), loggingCallback); } function waitForStartup() { diff --git a/src/package-lock.json b/src/package-lock.json index b6bc83b..cddb9d2 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "chokidar": "^3.5.3", + "debounce": "^1.2.1", "node-fetch": "^3.2.6", "read-last-lines": "^1.8.0" }, @@ -124,6 +125,11 @@ "node": ">= 12" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -653,6 +659,11 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", diff --git a/src/package.json b/src/package.json index b20af2c..c02feb1 100644 --- a/src/package.json +++ b/src/package.json @@ -27,6 +27,7 @@ }, "dependencies": { "chokidar": "^3.5.3", + "debounce": "^1.2.1", "node-fetch": "^3.2.6", "read-last-lines": "^1.8.0" }