This fork adds first-class Kubernetes support for running RCONnect as a lightweight, in-cluster service using GitHub Container Registry (GHCR).
The application is deployed as a single Pod with two containers:
- web: Next.js UI
- api: Node.js backend (RCON API, port
6304)
Both containers run in the same Pod and communicate via localhost.
flowchart LR
User["Browser / Admin"]
-->|"HTTP :80"| SVC["Service\nrcon.minecraft.svc.cluster.local"]
subgraph K8S["Kubernetes Namespace: minecraft"]
SVC --> POD
subgraph POD["Pod: rconnect"]
WEB["Web UI\nNext.js\n:3000"]
API["Backend API\nNode.js\n:6304"]
WEB -->|"localhost:6304"| API
end
end
API -->|"RCON"| MC["Minecraft Server\nRCON Port"]
-
Single Deployment, two containers
- No process supervisors
- Independent health probes per component
-
ClusterIP Service
-
In-cluster access via:
rcon.minecraft.svc.cluster.local
-
-
Stateless backend
- No persistent volume required
-
GHCR-based images
- Simple build and distribution
- CI/CD ready
Images are built and pushed to GitHub Container Registry:
ghcr.io/gotthub/rconnect-web:latest
ghcr.io/gotthub/rconnect-api:latest
From the repository root:
docker build -f Dockerfile.web -t ghcr.io/gotthub/rconnect-web:latest .
docker build -f Dockerfile.api -t ghcr.io/gotthub/rconnect-api:latest .Authenticate once (required for push):
echo $GITHUB_TOKEN | docker login ghcr.io -u gotthub --password-stdinPush images:
docker push ghcr.io/gotthub/rconnect-web:latest
docker push ghcr.io/gotthub/rconnect-api:latest- Running Kubernetes cluster
- Namespace
minecraftexists - Images are public or an imagePullSecret is configured
kubectl apply -f k8s/rcn.yamlVerify rollout:
kubectl -n minecraft rollout status deployment/rconnect
kubectl -n minecraft get pods,svchttp://rcon.minecraft.svc.cluster.local
http://rcon.minecraft.svc.cluster.local:6304
Inside the Pod, the web UI communicates with the backend via:
http://127.0.0.1:6304
Configured through the environment variable:
env:
- name: RCONNECT_BACKEND_URL
value: "http://127.0.0.1:6304"The backend API listens on port 6304 and is configured via:
- name: PORT
value: "6304"RCON host, port, and password are currently configured through the UI.
They can be externalized later using Kubernetes Secret resources if required.
Both containers expose TCP-based health probes:
- Web UI: port
3000 - Backend API: port
6304
This allows Kubernetes to restart either container independently if needed.
-
The Service is ClusterIP only and not exposed externally
-
For external access, consider:
- Ingress with authentication
- Temporary
kubectl port-forwardfor admin use