Merge branch 'main' of ssh://gitea.bchen.dev:2222/brendan/brendan-ch.github.io
All checks were successful
Deploy Jekyll site to Cloudflare Pages / build (push) Successful in 3m22s

This commit is contained in:
2026-09-21 21:04:00 -04:00
2 changed files with 10 additions and 46 deletions

View File

@@ -1,10 +1,4 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# Sample workflow for building and deploying a Jekyll site to GitHub Pages
name: Deploy Jekyll site to Pages
name: Deploy Jekyll site to Cloudflare Pages
on:
# Runs on pushes targeting the default branch
@@ -41,14 +35,13 @@ jobs:
ruby-version: '3.4.1' # Not needed with a .ruby-version file
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 0 # Increment this number if you need to re-download cached gems
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
- name: Build with Jekyll
# Outputs to the './_site' directory by default
run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
env:
JEKYLL_ENV: production
- name: Push image optimizations onto main
continue-on-error: true
run: |
@@ -58,18 +51,11 @@ jobs:
git add assets/img
git commit -m "chore: optimize images"
git push
- name: Upload artifact
# Automatically uploads an artifact from the './_site' directory by default
uses: actions/upload-pages-artifact@v3
- name: Publish to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy _site --project-name=${{ vars.CLOUDFLARE_PROJECT_NAME }}
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5

View File

@@ -1,22 +0,0 @@
---
title: Game server orchestration
---
To me, *game server orchestration* is solving the problem of provisioning dedicated game servers in a scalable manner for a multiplayer game.
When I added dedicated server builds through [[PurrNet]] for [[Resonance]], a cyberpunk-themed first person shooter, I did not realize the work I was giving myself later when it came to launching the game. Pre-rewrite, the [vibe-coded prototype](https://github.com/brendan-ch/ResonanceServerOrchestrator/tree/2d71f0491830dfa91d7887c208c14c52d6513202) I created comes nowhere close to being production ready.
Previously the game used [PurrLay](https://github.com/PurrNet/PurrLay), a peer-to-peer relay that clients connect to, where one of the clients becomes the *host* for a match. With the *dedicated server* architecture, all clients connect directly to the game server which can run game logic.[^1][^2] Adding the game server orchestrator means knowing when to start and stop a server, and how to point players to the server with the correct match.
I decided to try and turn the aforementioned prototype into a [custom backend](https://github.com/brendan-ch/ResonanceServerOrchestrator/tree/2d71f0491830dfa91d7887c208c14c52d6513202) for the orchestration. The basic flows look something like this:
- Players *join* a match in the orchestrator after having been in the same lobby, so the orchestrator doesn't depend on the lobby backend
- When all players have joined, the orchestrator provisions the dedicated server, and players *connect to the dedicated server* to play the game
- When the game ends, players *leave* the match in the orchestrator, and the server exits
[Edgegap](https://edgegap.com) is currently planned as the dedicated server platform. But, hopefully, with the custom orchestrator, we retain some ability to switch to other providers.
Right now this system works fine in development when conditions are predictable, but there is still much work to be done. I am *not* a backend engineer by trade.
[^1]: I didn't realize that I could drop [PurrLay](https://github.com/PurrNet/PurrLay) when adding the dedicated server until later.
[^2]: With Unity, a dedicated server build generates a Linux executable that can be put into a Docker container.