製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A cost-efficient multi-game dedicated server platform on AWS Fargate with a local management UI and a fully serverless Discord bot. Servers only run — and only cost money — while someone is playing.
📚 Full documentation lives at codercoco-studios.github.io/Hyveon (built from
docs/by GitHub Pages). The rest of this README is a quick tour; deep-dives, setup steps, and architecture diagrams are on the site.
RunTask (no
persistent ECS Service, no idle costs).{game}.yourdomain.com on task start
and DELETEs it on stop.https = true, TLS
terminates in-task via Let's Encrypt automatic HTTPS. No load balancer.NetworkPacketsIn./server-start, /server-stop, /server-status, and /server-list
from chat without any 24/7 process running.The docs site is organised around three roles. Pick the one that matches what you need to do.
| Guide | You are… |
|---|---|
| Install | Just want to download and run the packaged app. |
| Setup guide | Going from a blank AWS account to a running Fargate task. |
| User guide | Driving an already-provisioned deployment — the dashboard, Discord commands, day-to-day ops. |
| Maintainer guide | Working on this codebase. |
Component deep-dives:
/server-start sequence.@hyveon/shared.# 1. Install dependencies
npm install
# 2. Build and launch the Electron app, then follow the in-app setup wizard
# (AWS credentials, S3 bucket bootstrap, Pulumi stack init)
npm run desktop:run
# 3. In the app: Games → Add game, then Infrastructure → Run plan →
# Approve plan → Apply. No CLI step — the wizard and the Infrastructure
# page do everything above.
See the setup guide for the full walkthrough, including the IAM policy, Discord bot setup, and troubleshooting.
Add and edit games from the app's Games page. Every write updates a
single versioned JSON configuration object (deployment-config.json, in
your S3 configuration bucket) — task definitions, EFS access points, DNS,
watchdog config, and Discord command autocomplete all derive from it. There
is no configuration file to hand-edit.
{
"awsRegion": "us-east-1",
"projectName": "hyveon",
"hostedZoneName": "yourdomain.com",
"gameServers": {
"palworld": {
"image": "thijsvanloef/palworld-server-docker:latest",
"cpu": 2048,
"memory": 8192,
"ports": [
{ "container": 8211, "protocol": "udp" },
{ "container": 27015, "protocol": "udp" },
{ "container": 8, "protocol": "icmp" }
],
"environment": [
{ "name": "PLAYERS", "value": "8" },
{ "name": "SERVER_NAME", "value": "My Palworld Server" }
],
"volumes": [{ "name": "saves", "container_path": "/palworld" }],
"https": false
}
}
}
The { "container": 8, "protocol": "icmp" } entry isn't a listening port: for protocol: "icmp", container carries the ICMP type (8 = echo request) instead of a port number, and it only shapes the security group ingress — it's never an ECS port mapping. Palworld's community server browser pings the server before showing it as joinable, so without this entry browser joins time out even though a direct connect (which skips the ping) still works.
Cost ballpark: Fargate 2 vCPU / 8 GB ≈ $0.12/hr while running; EFS is pennies/month. Playing 4 hours/day, 5 days/week ≈ $10–12/month, vs. ~$60/month for a 24/7 t3.large.
Hyveon/ # npm-workspaces root — one `npm install` installs everything below
├── app/ # Electron desktop app (Nest.js + React)
│ └── packages/
│ ├── shared/ # @hyveon/shared
│ ├── cloud-aws/ # @hyveon/cloud-aws — AWS implementations of the cloud-agnostic contracts
│ ├── desktop-main/ # @hyveon/desktop-main (Nest.js IPC microservice)
│ ├── desktop-preload/ # @hyveon/desktop-preload — contextBridge preload script
│ ├── infra/ # @hyveon/infra — Pulumi Automation API program (all AWS resources)
│ ├── web/ # @hyveon/web (React + Vite)
│ └── lambda/
│ ├── interactions/ # Discord Function URL entry point
│ ├── followup/ # Async ECS work + Discord PATCH
│ ├── update-dns/ # Route 53 on task state change
│ ├── watchdog/ # Idle detection + auto-stop
│ └── efs-seeder/ # Conditional, per game with file_seeds
├── docs/ # Documentation site (published via GH Pages)
├── CLAUDE.md # Project instructions + invariants
├── CONTRIBUTING.md # PR conventions, local checks
└── README.md # this file
Stop every server from the dashboard first (so the update-dns Lambda cleans
its records), then use the Destroy infrastructure panel on the
Infrastructure page —
type destroy infrastructure to confirm.
The two Discord Secrets Manager secrets use a zero-day recovery window, so they are deleted immediately and a later apply is clean.
See LICENSE.