36 Commits

Author SHA1 Message Date
a88437f95f Add world management for Space Engineers (list/switch/create/clone/rename/delete)
All checks were successful
Deploy GSM / deploy (push) Successful in 25s
Mirrors Factorio's world feature for the SE server. The SE docker image always
loads the flat config/World dir and its entrypoint rewrites <LoadWorld> on every
start, so repointing the cfg is useless. Instead inactive worlds live in a
sibling config/Worlds library (not mounted) and switching is an instant mv-swap;
the active world name is tracked in .gsm-worldname and files are chowned to
1000:1000. New worlds are created from the image's built-in CustomWorlds
templates or by cloning the active world. Switch/clone require a stopped server.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 23:12:45 +02:00
024d97e544 Speed up server list & detail loads
All checks were successful
Deploy GSM / deploy (push) Successful in 28s
Three compounding causes made the dashboard and detail pages slow:

- Detail page fetched the WHOLE fleet (every SSH/Prometheus/RCON call for
  all servers) just to show one. Switch ServerDetail to GET /servers/:id
  (add api.getServer) so it costs one server's worth of work, not N.
- No server-side caching: every 10s poll, from every open tab, recomputed
  everything. Add a shared 5s-TTL per-server cache + in-flight dedup behind
  both GET / and GET /:id; invalidate on start/stop/restart so power
  actions still reflect immediately.
- Prometheus fetch had no timeout, so a slow/restarting Prometheus hung the
  whole aggregation indefinitely (the .catch can't catch a hang). Add
  AbortSignal.timeout to queryPrometheus/queryPrometheusRange.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 13:46:34 +02:00
2f6fc841b2 Keep sessions alive: proactive token refresh + longer access TTL
All checks were successful
Deploy GSM / deploy (push) Successful in 27s
The 15m access token only refreshed on a 401, but the dashboard uses optionalAuth and returns 200 even with an expired token, so the live page never noticed expiry until a manual reload.

Backend: ACCESS_TOKEN_TTL 15m -> 1h. Frontend: export refreshAccessToken; App.jsx schedules a refresh ~1min before the token expires (and on tab focus/return), and logs out cleanly (redirect to /login) if the refresh token is gone — no reload needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 19:28:50 +02:00
5ab3154351 Switch Minecraft server to FTB StoneBlock 4 (name + modpack metadata)
All checks were successful
Deploy GSM / deploy (push) Successful in 43s
config.json, discordBot.js, serverUpdates.js and ServerCard.jsx updated from Biohazard to FTB StoneBlock 4. Docs (infrastructure/gsm/CLAUDE) updated and docs/minecraft-modpack-install.md added. No Discord update notification is triggered (minecraft supportsUpdate=false).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:44:09 +02:00
902aa04726 Add Space Engineers update handler that works around broken upstream entrypoint
All checks were successful
Deploy GSM / deploy (push) Successful in 21s
The mmmaxwwwell SE image calls steamcmd with +login before +force_install_dir,
which Steam rejects ("Please use force_install_dir before logon!"), so container
restarts never actually update the game. The new handler runs SteamCMD in a
sibling one-shot container with the correct argument order, mounting the same
volumes as the live container, then leaves the server stopped for the operator
to start. The version cache is invalidated after a successful update so the UI
shows the new build immediately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 20:07:13 +02:00
bb48f75b5d Show Space Engineers build ID and last update time in detail view
All checks were successful
Deploy GSM / deploy (push) Successful in 23s
Reads the SteamCMD appmanifest_298740.acf via SSH and exposes
buildid + LastUpdated through a new /api/servers/:id/version endpoint.
The overview tab now renders a "Server Version" card and surfaces a
pending update hint when TargetBuildID differs from the installed build.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 20:02:48 +02:00
7bc93f3b70 Refresh-Token-System: kurzlebiger Access-Token (15m) + rotierender Refresh-Token (90d)
All checks were successful
Deploy GSM / deploy (push) Successful in 29s
Bisher: 7d JWT im localStorage. Jeder 403 loggte den User aus — auch "Insufficient
permissions"-Responses fuer Background-Requests — wodurch User sich effektiv taeglich
neu einloggen mussten.

Backend:
- Neue refresh_tokens Tabelle (SHA256-gehasht, mit Rotation + Revoke)
- /auth/refresh tauscht Refresh-Token gegen frischen Access-Token (rotiert beide)
- /auth/logout revoked den Refresh-Token
- Access-Token-TTL auf 15m; Guest-Refresh 7d, Discord-Refresh 90d
- Daily cleanup-Job fuer abgelaufene/revoked Tokens

Frontend:
- api.js refreshed bei 401 automatisch (single-flight) und retryt die Anfrage
- 403 wird nicht mehr als Session-Ablauf behandelt
- Discord-Callback + Guest-Login liefern beide Tokens
- App.jsx synced React-State per gsm_token_refreshed CustomEvent

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 11:21:38 +02:00
dfbcc2da82 Dashboard: hide unreachable servers by default + keep card height consistent
All checks were successful
Deploy GSM / deploy (push) Successful in 30s
- Unreachable cards now show a disabled 'Starten' button so moderator cards
  stay the same height as reachable ones
- Dashboard hides unreachable servers by default; a toggle button (bottom
  of header area, only visible when unreachable count > 0) flips the view
  and persists the preference in localStorage

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 21:34:55 +02:00
8cc7397f44 Shorten Space Engineers address to space.zeasy.dev
All checks were successful
Deploy GSM / deploy (push) Successful in 31s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 21:14:51 +02:00
49002a515f Change Space Engineers port to 27020
All checks were successful
Deploy GSM / deploy (push) Successful in 32s
Router conflict on 27016 — move SE to 27020 everywhere.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 21:12:03 +02:00
23f640ab66 Add Space Engineers logo
All checks were successful
Deploy GSM / deploy (push) Successful in 31s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 21:02:13 +02:00
807446920f Add Space Engineers server support
All checks were successful
Deploy GSM / deploy (push) Successful in 34s
Integrates Space Engineers dedicated server (docker+wine on 192.168.2.78) into GSM:
- config.json entry with docker runtime and log-based player detection
- getSpaceEngineersPlayers() parses docker logs for connect/disconnect events
- Extends type-check sites in rcon, autoshutdown, discordBot, servers routes
- Frontend ServerCard/ServerDetail logo + address wiring

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:57:14 +02:00
99ca25c9e3 Replace ATM10 with Biohazard: Project Genesis modpack
All checks were successful
Deploy GSM / deploy (push) Successful in 31s
Switched Minecraft server from All the Mods 10 to Biohazard: Project Genesis
(Beta 0.4.5, MC 1.20.1 + Forge 47.4.0). Updated server name, Discord bot
display, frontend modpack link, and documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 23:27:58 +02:00
Alexander Zielonka
6771722cdd Add SteamCMD-based updates for V Rising, Palworld, Zomboid, Terraria
All checks were successful
Deploy GSM / deploy (push) Successful in 24s
- Create generic SteamCMD handler factory for reusable update logic
- Check build IDs via appmanifest files and Steam API
- Support V Rising (1829350), Palworld (2394010), Zomboid (380870), tModLoader (1281930)
- Show update button for all supported server types in UI
- Minecraft, OpenTTD, Hytale marked as manual-update-only

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 11:50:19 +01:00
Alexander Zielonka
d840faeda9 Add modular server update feature with Discord notifications
All checks were successful
Deploy GSM / deploy (push) Successful in 25s
- Add serverUpdates.js service with handler registry for extensibility
- Implement Factorio Docker image update (pull + container recreate)
- Add GET/POST /servers/:id/update routes for check/perform
- Add ServerUpdateButton component with auto-check and confirm dialog
- Integrate update card in ServerDetail overview tab
- Auto-send Discord notification on successful update

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 11:42:22 +01:00
Alexander Zielonka
0f1fdca66a Make Discord update server types dynamic from server list
All checks were successful
Deploy GSM / deploy (push) Successful in 23s
Server dropdown now shows actual servers from the API instead of
hardcoded list.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 12:28:02 +01:00
Alexander Zielonka
bc69201139 Add Discord update feature for superadmins in Dashboard
All checks were successful
Deploy GSM / deploy (push) Successful in 30s
Superadmins can now send custom update messages to Discord directly from
the Dashboard via a new modal with server type selection, title template,
description, and color picker.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 12:23:22 +01:00
52a06e435f Fix config editor syntax highlighting with character parser
All checks were successful
Deploy GSM / deploy (push) Successful in 25s
Replace regex-based tokenization with character-by-character parsing
to completely avoid issues with numbers in CSS class names.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 13:58:59 +01:00
7aad85c5d4 Fix Hytale prometheus metrics and config editor syntax highlighting
All checks were successful
Deploy GSM / deploy (push) Successful in 27s
- Add missing "hytale" entry to SERVER_JOBS in prometheus.js
- Fix config editor regex bug that was corrupting CSS class names (e.g. text-cyan-400 becoming text-cyan-<span>400</span>)
- Use placeholder tokens to prevent numbers regex from matching inside already-replaced spans

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 13:55:28 +01:00
8a3690d61f Add Hytale config editor and Prometheus integration
All checks were successful
Deploy GSM / deploy (push) Successful in 25s
- Add Node Exporter target for Hytale server (10.0.30.204:9100)
- Add Hytale config read/write functions to ssh.js
- Add GET/PUT /hytale/config API routes
- Create HytaleConfigEditor.jsx with JSON syntax highlighting
- Add Hytale config tab to ServerDetail.jsx
- Add stopCmd and port to Hytale server config

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 13:50:45 +01:00
1f98747d59 Hytale logo angepasst
All checks were successful
Deploy GSM / deploy (push) Successful in 27s
2026-01-15 13:42:20 +01:00
b2dde62476 Add Hytale server support with tmux runtime
All checks were successful
Deploy GSM / deploy (push) Successful in 29s
- Add tmux runtime support to ssh.js (status, start, stop, logs, uptime)
- Add Hytale server configuration to config.json
- Add Hytale server info and logo to frontend (ServerCard, ServerDetail)
- Add Hytale emoji to Discord notification mapping
- Update documentation with Hytale server details

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 13:39:58 +01:00
Alexander Zielonka
8af57aa81a Fix console showing endless loading when logs are empty
All checks were successful
Deploy GSM / deploy (push) Successful in 23s
Changed logs state initialization from empty string to null to properly
distinguish between "not yet loaded" and "loaded but empty" states.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 10:17:11 +01:00
66716279ad Fix syntax highlighting regex order in config editors
All checks were successful
Deploy GSM / deploy (push) Successful in 22s
The number regex was applied after the boolean regex, causing it to
match "400" in CSS class names like "text-orange-400" and corrupt
the HTML output. Now uses placeholder tokens to mark numbers before
adding any HTML tags.

Affected editors: Palworld, Zomboid, OpenTTD

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 03:31:20 +01:00
a07e8df3e7 Add server control buttons to dashboard with confirmation dialogs
All checks were successful
Deploy GSM / deploy (push) Successful in 24s
- Add ConfirmModal component for stop/restart confirmations
- Add start/stop/restart buttons to ServerCard (moderator/admin only)
- Add confirmation dialogs to ServerDetail for stop/restart actions
- Add btn-sm CSS class for smaller buttons

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 13:40:45 +01:00
3dc7e9e7e7 Restrict server detail access for guests
All checks were successful
Deploy GSM / deploy (push) Successful in 26s
- Add isGuest flag to UserContext
- Block guests from navigating to /server/:id route
- Make ServerCards non-clickable for guests
- Add rejectGuest middleware to backend
- Protect server detail endpoints (/:id, /metrics/history, /whitelist)

Guests can now only view the dashboard overview without accessing
individual server details.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 20:57:34 +01:00
Alexander Zielonka
e88e246be6 Add unreachable status handling to ServerCard
All checks were successful
Deploy GSM / deploy (push) Successful in 24s
- Gray out unreachable servers with 50% opacity
- Disable click interaction for unreachable servers
- Show "Nicht erreichbar" badge

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 13:28:34 +01:00
Alexander Zielonka
f2b7b62d81 Bump frontend version to 1.0.0
All checks were successful
Deploy GSM / deploy (push) Successful in 23s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 12:36:19 +01:00
f2f9e02fb2 zustand auf server wiederhergestellt 2026-01-09 08:43:18 +01:00
Alexander Zielonka
1010fe7d11 Add OpenTTD and Terraria support, improve config editors
- Add OpenTTD server integration (config editor, server card, API)
- Add Terraria server integration (config editor, API)
- Add legends to all config editors for syntax highlighting
- Simplify UserManagement: remove edit/delete buttons, add Discord avatars
- Add auto-logout on 401/403 API errors
- Update save button styling with visible borders

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 12:32:38 +01:00
Alexander Zielonka
4fcc111def Add multi-guild Discord bot support with auto-setup
- Bot creates category and channels automatically when joining a server
- Channel structure: info, status, alerts, updates, diskussion, requests (forum)
- Add guild_settings database table for per-server configuration
- Add Discord bot invite button to Dashboard
- Add display settings API functions
- Add comprehensive Discord bot documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 18:29:13 +01:00
Alexander Zielonka
ff3fa0752e palworld added 2026-01-07 12:35:23 +01:00
2bb4dd723c ja 2026-01-07 02:41:37 +01:00
4194f68968 xd 2026-01-06 21:22:10 +01:00
Alexander Zielonka
be3e915980 Add world settings viewing with legacy fallback
- Store map generation settings in DB when creating new worlds
- Add info button to view settings for each saved world
- Show legacy warning for worlds created before this feature

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 15:51:35 +01:00
Alexander Zielonka
ff6adb093b Add Factorio World Management feature to GSM
- Add gsm-frontend to repository (React + Vite + TailwindCSS)
- New "Worlds" tab for Factorio server with:
  - List saved worlds with Start/Delete actions
  - Create new world with full map generation parameters
  - Preset selection (Default, Rich Resources, Rail World, etc.)
  - Save custom configurations as templates
- Show which save will be loaded in Overview tab
- Lock world management while server is running
- Backend changes deployed to server separately

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 15:42:14 +01:00