Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ on:
- "LICENSE"
- "specs/**/outreach.md"
- "specs/**/coverage-gaps.md"
# Feature catalog and the website gitlink feed the features sync gate (spec 024).
- "FEATURES.md"
- "website"
# Cancel superseded runs so rapid pushes to the same ref don't waste
# runner minutes on stale commits.
concurrency:
Expand Down Expand Up @@ -272,12 +275,16 @@ jobs:
- 'mcp-server/README.md'
- 'telemetry-receiver/README.md'
- 'docs/comparison-sources.md'
- 'FEATURES.md'
Comment thread
ValgulNecron marked this conversation as resolved.
- 'hack/check-links.sh'
- 'hack/check-doc-versions.sh'
- 'hack/test-check-doc-versions.sh'
- 'hack/testdata/check-doc-versions/**'
- 'hack/check-features-sync.sh'
- 'hack/test-check-features-sync.sh'
- 'hack/testdata/check-features-sync/**'
# `docs/**` broadly: check-links resolves relative links from
# the 18 audited files against ANY file under docs/ (e.g.
# the 19 audited files against ANY file under docs/ (e.g.
# docs/architecture.md -> docs/agent-architecture.md), not
# just the other audited files, so renaming a non-audited doc
# must still run the gate.
Expand All @@ -297,6 +304,8 @@ jobs:
- 'signing/2026-07-24-cosign-legacy.pub'
- 'signing/cosign.pub.legacy-sig'
- 'specs/**/outreach.md'
# website/ features page is checked against FEATURES.md by check-features-sync.
- 'website'
- id: combine
# Fold the raw filters into single-token booleans so every downstream
# `if:` is one expression (fewer chances to get wrong when the only way
Expand Down Expand Up @@ -561,6 +570,8 @@ jobs:
contents: read
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: init website submodule
run: git submodule update --init website
- name: verify lint gate configuration
run: ./test/e2e/lint-gate-verify.sh verify
- name: check documentation links
Expand All @@ -569,6 +580,10 @@ jobs:
run: make check-doc-versions
- name: test documentation version checker
run: make test-doc-versions
- name: check features sync
run: make check-features-sync
- name: test features sync checker
run: make test-features-sync
- name: check specs compliance
run: make check-specs
- name: check coverage gap record
Expand Down
245 changes: 245 additions & 0 deletions FEATURES.md

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,14 @@ test-doc-versions: ## Run the fixture tests for hack/check-doc-versions.sh
check-links: ## Verify internal documentation links and anchors resolve
hack/check-links.sh

.PHONY: check-features-sync
check-features-sync: ## Verify FEATURES.md and the website features page carry the same capability catalog
bash hack/check-features-sync.sh

.PHONY: test-features-sync
test-features-sync: ## Run the fixture tests for hack/check-features-sync.sh
bash hack/test-check-features-sync.sh

.PHONY: check-telemetry-catalog
check-telemetry-catalog: ## Verify telemetryschema/catalog.txt matches the chart's official module list
hack/check-telemetry-catalog.sh
Expand All @@ -273,7 +281,7 @@ test-up-registry: ## Run the fixture tests for deploy/kind/up.sh's registry/cont
hack/test-up-registry.sh

.PHONY: lint
lint: check-doc-versions check-links check-specs check-telemetry-catalog check-dev-load-images check-coverage-gaps test-up-registry lint-go lint-web ## Run all linters
lint: check-doc-versions check-links check-features-sync check-specs check-telemetry-catalog check-dev-load-images check-coverage-gaps test-up-registry lint-go lint-web ## Run all linters

.PHONY: lint-go
lint-go: ## Run golangci-lint across all modules
Expand Down
22 changes: 7 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,29 +67,21 @@ are feature-complete for the v1 scope and stabilized for external testing.

| Dimension | Gameplane | Pterodactyl | CubeCoders AMP | Agones |
|-----------|-----------|-------------|----------------|--------|
| Deployment/runtime model | Combined Kubernetes install or standalone panel on Docker Compose; game workloads use Kubernetes CRDs and a controller-runtime operator, from k3s to multi-node clusters. [BETA] [G-a](docs/comparison-sources.md#gameplane-row-a) | Self-hosted Panel with PHP/MySQL/Redis dependencies; Wings backend manages Docker containers. [P-a](docs/comparison-sources.md#pterodactyl-row-a) | Web-based control panel supporting Windows (native) and Linux (Debian 10+). [C-a](docs/comparison-sources.md#cubecoders-row-a) | Kubernetes-native library extending K8s with GameServer/Fleet CRDs. [A-a](docs/comparison-sources.md#agones-row-a) |
| Deployment/runtime model | Combined Kubernetes install or standalone panel on Docker Compose; game workloads use Kubernetes CRDs and a controller-runtime operator, from k3s to multi-node clusters. [G-a](docs/comparison-sources.md#gameplane-row-a) | Self-hosted Panel with PHP/MySQL/Redis dependencies; Wings backend manages Docker containers. [P-a](docs/comparison-sources.md#pterodactyl-row-a) | Web-based control panel supporting Windows (native) and Linux (Debian 10+). [C-a](docs/comparison-sources.md#cubecoders-row-a) | Kubernetes-native library extending K8s with GameServer/Fleet CRDs. [A-a](docs/comparison-sources.md#agones-row-a) |
| Scaling & auto-sleep | Opt-in idle auto-sleep with configurable wake windows, manual wake button, or wake-on-connect. Minecraft/Terraria full protocol support; others use packet heuristics. [optional] [G-b](docs/comparison-sources.md#gameplane-row-b) | Multi-node support with cron-based power scheduling; no dedicated idle/auto-sleep feature. [P-b](docs/comparison-sources.md#pterodactyl-row-b) | Instance Automatic Sleep feature; multi-server architecture with controller managing instances. [C-b](docs/comparison-sources.md#cubecoders-row-b) | Fleet autoscaling via buffer/webhook strategies; no idle/sleep state. [A-b](docs/comparison-sources.md#agones-row-b) |
| Inbound connectivity (NAT traversal, relay) | Integrated frp, Tailscale, playit relay sidecars; playit mappings user-managed via playit.gg account. [optional; disabled by default] [G-c](docs/comparison-sources.md#gameplane-row-c) | No integrated relay sidecars; manual proxy/port forwarding configuration required. [P-c](docs/comparison-sources.md#pterodactyl-row-c) | not publicly documented (checked 2026-09-02) [C-c](docs/comparison-sources.md#cubecoders-row-c) | No relay or NAT traversal features documented. [A-c](docs/comparison-sources.md#agones-row-c) |
| Backup and restore | Restic snapshots to S3-compatible storage; on-demand or cron-scheduled via BackupSchedule; one-click restore. [G-d](docs/comparison-sources.md#gameplane-row-d) | Wings (local, default) or S3-compatible backup drivers; cron scheduling and on-demand backups. [P-d](docs/comparison-sources.md#pterodactyl-row-d) | not publicly documented (checked 2026-09-02) [C-d](docs/comparison-sources.md#cubecoders-row-d) | not applicable (Agones is a Kubernetes operator library) [A-d](docs/comparison-sources.md#agones-row-d) |
| Access control & authentication | Local argon2id + OIDC (Keycloak/Google/GitHub); three built-in roles (admin/operator/viewer); custom roles supported. [G-e](docs/comparison-sources.md#gameplane-row-e) | 2FA configurable per account or admin-only; subuser management via Artisan CLI. [P-e](docs/comparison-sources.md#pterodactyl-row-e) | Role-based access control; OIDC single-sign-on in Advanced Edition. [C-e](docs/comparison-sources.md#cubecoders-row-e) | not applicable (Agones is a Kubernetes operator library) [A-e](docs/comparison-sources.md#agones-row-e) |
| Game template distribution | OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 30 ready-to-use templates shipped. [G-f](docs/comparison-sources.md#gameplane-row-f) | Community eggs repository (eggs.pterodactyl.io) with nests and custom egg creation support. [P-f](docs/comparison-sources.md#pterodactyl-row-f) | Customizable templates framework; community-contributed templates available via external repositories. [C-f](docs/comparison-sources.md#cubecoders-row-f) | not applicable (Agones is a Kubernetes operator library) [A-f](docs/comparison-sources.md#agones-row-f) |
| Access control & authentication | Local argon2id + OIDC (Keycloak, Authentik, Google, Okta, Entra ID); three built-in roles (admin/operator/viewer); custom roles supported. [G-e](docs/comparison-sources.md#gameplane-row-e) | 2FA configurable per account or admin-only; subuser management via Artisan CLI. [P-e](docs/comparison-sources.md#pterodactyl-row-e) | Role-based access control; OIDC single-sign-on in Advanced Edition. [C-e](docs/comparison-sources.md#cubecoders-row-e) | not applicable (Agones is a Kubernetes operator library) [A-e](docs/comparison-sources.md#agones-row-e) |
| Game template distribution | OCI bundles via ModuleSource (git/http/oci/local/upload); optional cosign signature verification per source. 29 ready-to-use templates shipped. [G-f](docs/comparison-sources.md#gameplane-row-f) | Community eggs repository (eggs.pterodactyl.io) with nests and custom egg creation support. [P-f](docs/comparison-sources.md#pterodactyl-row-f) | Customizable templates framework; community-contributed templates available via external repositories. [C-f](docs/comparison-sources.md#cubecoders-row-f) | not applicable (Agones is a Kubernetes operator library) [A-f](docs/comparison-sources.md#agones-row-f) |
| Multi-tenancy & multi-cluster | Remote registration through Cluster CRDs in combined mode or SQL in standalone mode; central user grants, remote Pod logs/PTY, and optional private gateway for agent operations. UID-bound capture downloads/cleanup; modpack and ID-list configuration on the selected cluster. Requires matching gateway, operator, agent and capture-sidecar versions. [G-g](docs/comparison-sources.md#gameplane-row-g) | Single Panel managing multiple nodes; no documented remote cluster or cross-cluster streaming. [P-g](docs/comparison-sources.md#pterodactyl-row-g) | Multi-server management via controller architecture; multi-tenancy not supported in AMP 2 (planned for AMP 3). [C-g](docs/comparison-sources.md#cubecoders-row-g) | Multi-cluster allocation via GameServerAllocationPolicy; allocator service with mTLS authentication. [A-g](docs/comparison-sources.md#agones-row-g) |
| Licensing | GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). [G-h](docs/comparison-sources.md#gameplane-row-h) | MIT License (Panel and Wings). [P-h](docs/comparison-sources.md#pterodactyl-row-h) | Proprietary; per-instance tiers (Standard/Professional/Advanced/Enterprise). [C-h](docs/comparison-sources.md#cubecoders-row-h) | Apache License 2.0. [A-h](docs/comparison-sources.md#agones-row-h) |
| Target operator scope (self-hosted vs. managed SaaS) | Self-hosted only; panel runs on Docker Compose or Kubernetes, while games require Kubernetes (k3s, kubeadm, managed services); no managed SaaS offering. [G-i](docs/comparison-sources.md#gameplane-row-i) | Self-hosted only; requires Linux system capable of running Docker containers. [P-i](docs/comparison-sources.md#pterodactyl-row-i) | Self-installed on user hardware (Windows or Linux); no managed SaaS version. [C-i](docs/comparison-sources.md#cubecoders-row-i) | Self-hosted operator software; runs anywhere Kubernetes can run. [A-i](docs/comparison-sources.md#agones-row-i) |

## Features

- **Graceful Lifecycle Management**: Create, start, stop, restart, clone, and delete game servers. Stopping or restarting executes the game's native shutdown sequence (over RCON, telnet, or stdin) first, ensuring world saves complete before stopping containers.
- **Smart Idle Auto-Sleep & Wake-on-Connect**: Save hardware resources by automatically scaling empty servers down to zero after a set idle period. Servers wake up automatically on scheduled cron windows, via the dashboard **Wake** button, or when players attempt to join.
- **Built-in Relay Tunnels**: Host servers on home labs or behind CGNAT without public IPs or router port-forwarding using integrated `frp`, `Tailscale`, or `playit.gg` relay sidecars.
- **Live Console & Admin Actions**: Stream stdout/stderr in real time over WebSockets, send RCON/stdin commands, and execute custom game admin actions (like broadcast messages or give items) safely with built-in injection guards.
- **Web File Manager**: Browse, edit, upload, and download server files directly in the browser with an integrated Monaco code editor.
- **Player Management**: View active players and issue kicks or bans for supported game protocols.
- **S3 Backups & Restores**: Perform on-demand or cron-scheduled restic snapshots to S3-compatible storage, with one-click restoration into server volumes.
- **OCI Game Modules**: 30 ready-to-use game templates packaged as OCI artifacts (Minecraft Java, Valheim, Terraria, Rust, Palworld, Factorio, CS2, etc.).
- **Extensive Mod Support**: Browse and install mods across 10 registries (Modrinth, CurseForge, Steam Workshop, Thunderstore, SpigotMC, Hangar, etc.) with support for both direct file-drop and launch-parameter mod IDs.
- **Authentication & RBAC**: Local user accounts plus OIDC SSO support (Keycloak, Google, GitHub) with fine-grained access permissions.
- **Multi-Cluster Fleet Management**: Register, monitor, and manage game servers across multiple Kubernetes clusters from a single dashboard.
Gameplane runs game servers as Kubernetes resources and manages them from one dashboard. Operators can create, start, stop, restart, clone, and delete servers, use a live console, edit files in the browser, and view players with kicks and bans where the game supports them. Mods install from 10 registries, restic backups go to S3-compatible storage with one-click restore, and the catalog ships 29 OCI game modules. Networking covers optional relay tunnels (frp, Tailscale, playit.gg) and idle auto-sleep with wake-on-connect, while multi-cluster registration, OIDC SSO, role-based access (admin, operator, viewer), and audit logging round out the platform. Notifications are available, and usage telemetry (daily counts; extended reports add a random install ID and its public key) is on by default for new installs and can be turned off in the Telemetry settings.

See [FEATURES.md](FEATURES.md) for the full catalog with maturity and defaults.

## Mod Management

Expand Down Expand Up @@ -159,7 +151,7 @@ legacy default for custom deployments. See [storage and recovery](docs/standalon
| `capture-sidecar/` | Go | Network packet capture sidecar [optional], opt-in per server, admin-only. |
| `tunnel/` | Go | Relay supervisor pod managing third-party tunnels (`frp`, `Tailscale`, `playit`) [optional]. |
| `web/` | TS + React | Modern dashboard UI built with Vite, TanStack Query, xterm.js, and Monaco Editor. |
| `modules/` | YAML | 30 pre-packaged game templates (Minecraft, Valheim, Terraria, Rust, etc.) as OCI bundles. |
| `modules/` | YAML | 29 pre-packaged game templates (Minecraft, Valheim, Terraria, Rust, etc.) as OCI bundles. |
| `charts/` | Helm | Official Helm deployment chart for operator, API gateway, ingress, and helper services. |
| `gameproto/` | Go | Shared protocol library for parsing game handshakes (Minecraft, Terraria) in `sentinel`. |
| `gameaction/` | Go | Security guard and command renderer for custom module admin actions. |
Expand Down
2 changes: 1 addition & 1 deletion charts/gameplane/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ operator:
# empty string (default) = use cluster's default StorageClass
# "fast-nvme", "gpu-attached", etc. = use named StorageClass
# If the named class doesn't exist, PVC provisioning fails and GameServer
# status.conditions surfaces "StorageClassNotFound" reason.
# status.conditions surfaces the "PVCProvisioningFailed" reason.
storageClassName: ""

api:
Expand Down
2 changes: 1 addition & 1 deletion docs/comparison-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ verified.
**Source ID**: G-f
**Evidence**: docs/module-authoring.md § Verifying and pinning bundles (lines 340–414); CLAUDE.md § Repository Map (`modules/`)
**Checked on**: 2026-09-26 (re-verified)
**What was verified**: OCI bundles via ModuleSource CRD supporting git/http/oci/local/upload sources; cosign signature verification documented at lines 340–414; 30 ready-to-use templates in gameplane-module repository.
**What was verified**: OCI bundles via ModuleSource CRD supporting git/http/oci/local/upload sources; cosign signature verification documented at lines 340–414; 29 ready-to-use templates in gameplane-module repository.
**Last-known URL**: https://github.com/GameplanePanel/Gameplane/tree/master/modules

<a id="gameplane-row-g"></a>
Expand Down
2 changes: 1 addition & 1 deletion docs/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ were added and verified on **2026-09-26**.
| `api/` | Go | 17 | chi REST + WebSocket gateway: auth (local + OIDC), RBAC, K8s client, SQLite/Postgres persistence, notifications |
| `agent/` | Go | 6 | In-pod sidecar: RCON/WebRcon console, chi HTTP surface, heartbeat status patch, disk usage stats |
| `audit-syslog-bridge/` | Go | 0 (stdlib only) | Standalone HTTP-JSON → syslog relay for the audit webhook sink |
| `telemetry-receiver/` | Go | 1 | Standalone collector for the API's opt-in anonymous usage telemetry |
| `telemetry-receiver/` | Go | 1 | Standalone collector for the API's usage telemetry (daily counts; extended reports add a random install ID and its public key; on by default for new installs; `api.telemetry.enabled=false` turns it off) |
| `sentinel/` | Go | 2 | Wake-on-connect listener holding ports for sleeping pods |
| `capture-sidecar/` | Go | 3 | Ephemeral AF_PACKET packet capture sidecar with BPF filtering |
| `tunnel/` | Go | 0 (stdlib only) | Relay client supervisor for frp/Tailscale/playit |
Expand Down
4 changes: 2 additions & 2 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ Top-level knobs (see `values.yaml` for the full list):
`--config-init-image` / `--restic-image` flags, mirroring `operator.agentImage`
- `operator.backupJobBackoffLimit` / `operator.backupJobActiveDeadlineSeconds` — retry limit (default `2`, must be >= 0) and wall-clock deadline in seconds (default `86400`, must be > 0) for the restic backup/restore Jobs. They map to the operator's `--backup-job-backoff-limit` / `--backup-job-active-deadline-seconds` flags. Negative or non-integer values fail the render; an unset key (e.g. `helm upgrade --reuse-values` from an older release) or a `0` deadline uses the default, while an explicit `0` backoff is honoured.
- `operator.gameDataStorage.storageClassName` — install-time default storage class
for game server data volumes (unreleased; ships in the next release) (default `""`). Empty string uses the cluster's
for game server data volumes (since v0.3.0) (default `""`). Empty string uses the cluster's
default StorageClass. Applies to all GameServers where neither the GameTemplate
nor GameServer-level override specifies a class. **Precedence**: GameServer
override > GameTemplate default > install-time default > cluster default.
Expand All @@ -145,7 +145,7 @@ Top-level knobs (see `values.yaml` for the full list):
- Core connection: `issuer` / `clientID` / `clientSecretRef` / `redirectURL` /
`displayName` — OIDC provider credentials and endpoints. Per-IdP walkthroughs
(Keycloak, Authentik, Google) live in [oidc.md](oidc.md)
- Role mapping (new, seeded at install time) (unreleased; ships in the next release):
- Role mapping (new, seeded at install time) (since v0.3.0):
- `groupsClaim` — OIDC claim name containing group memberships (default `""`).
Typically `"groups"` or `"roles"` depending on your IdP. Empty/omitted =
read the `"groups"` claim. This only chooses which claim is read; it does
Expand Down
Loading
Loading