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)
This commit is contained in:
parent
3d81bd3700
commit
d584d7540e
5 changed files with 32 additions and 10 deletions
|
@ -4,4 +4,4 @@ COPY .docker/server/start.sh ./
|
||||||
|
|
||||||
WORKDIR /mcserver
|
WORKDIR /mcserver
|
||||||
|
|
||||||
ENTRYPOINT ["sh", "/start.sh"]
|
ENTRYPOINT ["bash", "/start.sh"]
|
||||||
|
|
26
src/index.ts
26
src/index.ts
|
@ -1,14 +1,20 @@
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import { promises } from 'fs';
|
import { promises } from 'fs';
|
||||||
import { ChildProcess, exec, ExecException } from 'child_process';
|
import { exec, ExecException } from 'child_process';
|
||||||
import * as chokidar from 'chokidar';
|
import * as chokidar from 'chokidar';
|
||||||
|
import debounce from 'debounce';
|
||||||
|
|
||||||
const running: {
|
const running: {
|
||||||
process: ChildProcess,
|
watch: chokidar.FSWatcher,
|
||||||
server1: boolean,
|
server1: boolean,
|
||||||
serverName: () => string,
|
serverName: () => string,
|
||||||
prevServerName: () => 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() {
|
async function main() {
|
||||||
console.log("Checking for server updates...", "MC", process.env.MC_VERSION);
|
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);
|
console.log("Build downloaded", lastBuild.downloads.application.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const listener = async (changedPath) => {
|
||||||
|
console.log(`Plugin change detected at ${changedPath}, switching to ${running.prevServerName()}`);
|
||||||
await startNextServer();
|
await startNextServer();
|
||||||
chokidar.watch(`/mcserver/${running.serverName()}/plugins/*.jar`).on('change', async () => { // TODO: Separate plugins dir
|
};
|
||||||
console.log("Plugin changes detected, restarting");
|
running.watch = chokidar.watch(`/mcserver/plugins/*.jar`).on('change', debounce(listener, 500));
|
||||||
await startNextServer();
|
await startNextServer();
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function startNextServer() {
|
async function startNextServer() {
|
||||||
running.server1 = !running.server1;
|
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');
|
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 waitForStartup();
|
||||||
await stopPrevServer();
|
await stopPrevServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function stopPrevServer() {
|
async function stopPrevServer() {
|
||||||
console.log("Stopping previous server");
|
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() {
|
function waitForStartup() {
|
||||||
|
|
11
src/package-lock.json
generated
11
src/package-lock.json
generated
|
@ -9,6 +9,7 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": "^3.5.3",
|
"chokidar": "^3.5.3",
|
||||||
|
"debounce": "^1.2.1",
|
||||||
"node-fetch": "^3.2.6",
|
"node-fetch": "^3.2.6",
|
||||||
"read-last-lines": "^1.8.0"
|
"read-last-lines": "^1.8.0"
|
||||||
},
|
},
|
||||||
|
@ -124,6 +125,11 @@
|
||||||
"node": ">= 12"
|
"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": {
|
"node_modules/duplexer": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
|
"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",
|
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
|
||||||
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
|
"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": {
|
"duplexer": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": "^3.5.3",
|
"chokidar": "^3.5.3",
|
||||||
|
"debounce": "^1.2.1",
|
||||||
"node-fetch": "^3.2.6",
|
"node-fetch": "^3.2.6",
|
||||||
"read-last-lines": "^1.8.0"
|
"read-last-lines": "^1.8.0"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue