Publishing Server Images
[!SUMMARY] This page explains how to:
- See which image each hosted server runs
- Move a hosted server to a release, a pre-release or a server built on your machine
- Roll production back to an earlier release
- Run a server on your own machine
The dedicated server ships as the Docker image itlfi/anywhere-academy-server: Ubuntu with the
contents of Build/Server in /app (Server-Dockerfile in the project root). The
CI/CD Pipeline publishes it as :X.Y.Z, :latest and :stable for a release and
as :pre-release for a pre-release.
Hosted Servers
Each hosted server runs the image under a tag of its own, so it changes only when its own tag is
moved. publish_local_server.ps1 in the project root knows them as presets:
-Server |
Tag |
|---|---|
production |
stable |
internal-testing |
internal-testing (may run any tag) |
public-testing |
public-testing |
demo |
demo-<DemoName> |
univrse-connect |
univrse-connect |
Run the script without parameters for an overview, and Get-Help .\publish_local_server.ps1 -Full
for every detail. It needs Docker with buildx (part of Docker Desktop) and the
DOCKER_HUB_PASSWORD environment variable.
# What every server's tag points at now, and which versions are the same image. Changes nothing.
.\publish_local_server.ps1 -List
# Copy an image the pipeline built (a release, or the current pre-release). Preferred.
.\publish_local_server.ps1 -Server public-testing -From pre-release
.\publish_local_server.ps1 -Server univrse-connect -From 1.0.5
# Build Build/Server on this machine and push it.
.\publish_local_server.ps1 -Server demo -DemoName xrmas
# Roll production back to an earlier release. Asks for confirmation (-Force skips it).
.\publish_local_server.ps1 -Server production -From 1.0.4
Prefer -From. It copies the image on Docker Hub without pulling or rebuilding it, so the
server runs exactly what the pipeline built and checked against the clients of the same pipeline.
A server built on your machine has had no such check, and until AnyVR no longer splits RPCs across
partial files, one built on Windows can disagree with the Linux-built Quest client even at the same
commit (see the incident).
The script warns when it pushes one.
Production follows the release pipeline. Every release moves stable, so merging into main
updates production the next time its container is pulled and restarted. By hand, production only
moves with -From, to roll back; the next release moves it on again. The script never pushes a
locally built image there.
The script never writes the tags the pipeline owns (X.Y.Z, latest, pre-release,
staging-<commit>-<pipeline>), and the pipeline's cleanup never deletes anything but a staging- tag.
A moved tag does nothing until the server's host pulls it: pull the image and restart the
container, e.g. docker compose pull && docker compose up -d.
Running a Server on Your Machine
create_local_server.ps1 builds itlfi/anywhere-academy-server:local from Build/Server and starts
it as aa-local-server, next to a LiveKit server in development mode
(Docker/docker-compose-local-server.yml). That tag is never
pushed. Build the Linux server first, see Building in the Editor.