Versions — bring your own game
A game's versions: the files a server installs. Upload a zip, install from Steam, or fetch a vendor archive.
A version is a set of files a game's servers install — your modpack's 1.0, then its 2.0. Each one belongs to one of your games, and the game points at one of them as current: that is what a new server gets. A server already running stays on the version it was created with until you upgrade it, so adding a version never changes a server under its players.
In the API a version is a Build, and it is named
accounts/{account}/builds/{build}Versions belong to the account, not a project: a studio building one server binary uses it across every project, and a copy per project would mean re-uploading gigabytes to change nothing.
The quickest way in is the console: Games → Add your own game asks where the files are and which published game yours works like, and creates the game and its first version together. A new version after that is Add a version on the game's Versions tab.
Every version has a kind
kind is required and cannot be changed afterwards. A dedicated server — anything
a Playpute server runs — is KIND_SERVER (--kind server in the CLI, kind = "server" in Terraform). A game refuses a build of the wrong kind when you save
it, rather than leaving you with a server that installs and has nothing to start.
Three sources
Most game servers are already published somewhere, so a version declares a source, and only an upload stores files with Plany.
For the large family of Source and Steamworks games, an app id is the whole configuration.
source: steam_cmd: app_id: 4020 # the DEDICATED SERVER's app id branch: "" # empty takes the public branch validate: trueUse the dedicated server's app id, which is usually not the game's. Garry's Mod is 4000 to play and 4020 to host.
username and password are for a dedicated server that refuses anonymous
downloads; most do not. branch_password opens a private branch.
For a vendor that publishes a server directly — Mojang's server jar, a Forge installer, a modpack zip.
source: archive: url: "https://example.com/server-1.20.4.zip" checksum_sha256: "9f86d0…" extract: true install_commands: - "java -jar forge-installer.jar --installServer"Nothing is mirrored: the URL is fetched when a server installs the build, so the vendor's terms stay between you and them.
checksum_sha256 is the difference between "this is the build I tested" and
"this is whatever is at that URL today". extract: false leaves the download
as it is, which is what a bare server.jar wants.
A zip of your own server, sent straight to storage — the bytes do not pass through Plany's API, so a large upload is as fast as your connection. One archive may be up to 5 GiB.
The CLI and Terraform do all of this for you; through the API it is four steps:
- CreateBuild with an upload source
The build waits in
STATE_PENDING_UPLOAD. - GetBuildUploadUrl
Hash your archive first and pass
checksum_sha256: storage then refuses an archive that does not match, so a corrupted or truncated upload is rejected outright rather than found at first boot. The URL is short-lived; if one expires, ask for a fresh one. - PUT the archive
Straight to the returned URL.
- FinalizeBuild
Checks what arrived and moves the build to
STATE_READY.
If an upload from the CLI fails partway, plany versions upload <version> <archive> tries again against the same version.
Games → your game → Versions → Add a version → Upload a file → choose the archiveIn Terraform, changing the uploaded file plans a new version: a version's
files never change under the servers already running from it. Add the next one as
a second plany_game_version and point plany_game_current_version at it.
plany builds and plany_game_build are the old names and still work.
plany_game_build is deprecated; renaming it in a configuration is a moved
block, and Terraform carries the state across without recreating anything:
moved { from = plany_game_build.my_server to = plany_game_version.my_server}install_commands
Commands run in order after the files are in place, for every source. Forge ships an installer rather than a server: fetch the installer with an archive source, then run it here.
The shape of an uploaded archive
No wrapper directory. What the archive unpacks to is what the launch command runs in.
A plany-install.sh at that root is run once, after unpacking, inside the
build directory. It can unpack, fetch and set up whatever it needs.
It cannot install system packages — everything outside your build's own directory is read-only. Bring what your server needs inside the archive, or fetch it into the build directory from the script.
States
| State | Meaning |
|---|---|
PENDING_UPLOAD | Created, waiting for its archive. Only uploaded versions wait here. |
PROCESSING | Being fetched, unpacked or checked. |
READY | Usable by a game, and can be made current. |
FAILED | Something went wrong; error says what. |
DELETED | Deleted, and kept so a server still referring to it can say what it ran. |
The current version
A game's current version is what its server.build points at, and it is what a
new server installs. Make another version current from the game's Versions tab,
with plany_game_current_version, or with UpdateGame on server.build.
- A version must belong to one of your own games. A game Plany publishes cannot be given versions; customise it — create a game based on it — and add versions to that.
gamecannot be changed after the version is created. A version does not move between games.- A game with no current version of its own runs what the game it is based on provides. The console says so on the Versions tab.
- Deleting a game leaves its versions in place, attached to nothing. They are still your files, and still count towards storage, until you delete them; Games → All your files lists them.
plany versions create modpack-v2 --game modpack --upload ./modpack-v2.zip --kind server --version 2.0plany versions list --game modpackA version alone runs nothing: the game supplies the launch command and the ports. See Making your own game.
Operating system
Game servers run on Linux. A server build is a Linux build, and a Windows-only dedicated server cannot be run.
Storage
Uploaded builds count against game.plany.cloud/build_storage_bytes — 20 GiB on
Hobby and 500 GiB on Pro, across the whole account. Steam and archive builds
store nothing with Plany and count against nothing. See
Quotas.