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" }