Admin: Gameserver-Einstellungen, Docker-Hosts und Image-Update im Admin-Bereich
This commit is contained in:
1 parent
472bda31a9
commit
929134f2bc
10 files changed
+710
-12
No files matched your search
@@ -14,7 +14,7 @@ function bearer(req) {
|
||||
* (nur im Speicher, verfällt nach 12 Stunden oder beim Neustart). Admin-Aktionen nutzen die bestehenden
|
||||
* Organisator-Funktionen mit einem Admin-Zugang, die Berechtigungen bleiben also an einer Stelle.
|
||||
*/
|
||||
export function createAdminRouter({ service, manager, config }) {
|
||||
export function createAdminRouter({ service, manager, config, settings }) {
|
||||
const router = express.Router();
|
||||
const sessions = new Map(); // Token -> Ablaufzeit (ms)
|
||||
const loginLimit = createRateLimiter({ windowMs: 60_000, max: 5 });
|
||||
@@ -77,6 +77,52 @@ export function createAdminRouter({ service, manager, config }) {
|
||||
router.get('/session', requireAdmin, (req, res) => res.json({ ok: true }));
|
||||
|
||||
// Discord-Meldungen: welche Ereignisse gemeldet werden
|
||||
// Gameserver-Einstellungen: Vorgaben aus der .env, vom Admin überschreibbar
|
||||
router.get('/server-settings', requireAdmin, wrap(() => ({ fields: settings.view() })));
|
||||
router.put('/server-settings', requireAdmin, wrap(async (req) => {
|
||||
const changed = settings.update(req.body?.values ?? {});
|
||||
if (changed.includes('vetoStepSeconds')) service.startVetoTimer();
|
||||
const live = changed.length ? await manager.applyLiveSettings(changed) : { updated: 0, failed: [] };
|
||||
return { fields: settings.view(), changed, live };
|
||||
}));
|
||||
|
||||
// Docker-Hosts: Liste wie CS2_DOCKER_HOSTS, gespeichert in der Datenbank
|
||||
const hostView = () => ({
|
||||
hosts: (manager.adapter.hosts ?? []).map((h) => ({
|
||||
name: h.name,
|
||||
dockerHost: h.dockerHost,
|
||||
publicHost: h.publicHost,
|
||||
rconHost: h.rconHost,
|
||||
portStart: h.portRangeStart,
|
||||
portEnd: h.portRangeEnd,
|
||||
volume: h.volume,
|
||||
})),
|
||||
overridden: settings.hostsOverridden(),
|
||||
editable: !!manager.adapter.setHosts,
|
||||
image: config.docker.image,
|
||||
pull: manager.adapter.pullStatus?.() ?? null,
|
||||
});
|
||||
router.get('/docker-hosts', requireAdmin, wrap(() => hostView()));
|
||||
router.put('/docker-hosts', requireAdmin, wrap((req) => {
|
||||
const list = req.body?.hosts;
|
||||
const hosts = settings.parseHosts(list);
|
||||
manager.setDockerHosts(hosts);
|
||||
settings.saveHosts(list, hosts);
|
||||
return hostView();
|
||||
}));
|
||||
router.delete('/docker-hosts', requireAdmin, wrap(() => {
|
||||
manager.setDockerHosts(settings.defaultHosts);
|
||||
settings.resetHosts();
|
||||
return hostView();
|
||||
}));
|
||||
// Image auf allen Hosts neu laden. Läuft im Hintergrund, Stand über GET /docker-hosts.
|
||||
router.post('/docker-hosts/pull', requireAdmin, wrap(() => {
|
||||
if (!manager.adapter.pullImage) throw new HttpError(409, 'Nur mit dem Docker-Adapter möglich', 'unsupported');
|
||||
if (manager.adapter.pullStatus().running) throw new HttpError(409, 'Das Image wird bereits aktualisiert', 'busy');
|
||||
manager.adapter.pullImage().catch(() => {});
|
||||
return hostView();
|
||||
}));
|
||||
|
||||
router.get('/notifications', requireAdmin, wrap(() => service.notificationSettings()));
|
||||
router.put('/notifications', requireAdmin, wrap((req) => service.setNotificationEvents(req.body?.events)));
|
||||
router.post('/notifications/test', requireAdmin, wrap(async () => {
|
||||
|
||||
Reference in new issue
Block a user