Game servers running on dedicated DMZ VMs as Docker Compose workloads. Provisioned by Terraform, configured by Ansible, deployed through GitHub Actions.

Hosts#

HostVM SpecsAnsible Role
dmz-cs162 cores, 2GB RAMcs16-server
dmz-minecraft2 cores, default RAMminecraft-server
dmz-minecraft-java4 cores, 16GB RAMminecraft-java-server
dmz-ut2k42 cores, 4GB RAMut2k4-server

Each VM runs on Proxmox, sits on VLAN 3 (DMZ), and ships logs to Loki via Promtail.

Public Servers#

Accessible from the internet via FortiGate VIP NAT.

GameAddressPortProtocol
Counter-Strike 1.6cs16.heezy.info27015UDP/TCP
CS 1.6 Fast Downloadcs16.heezy.info80TCP
Minecraft Bedrock (Creative)mc.heezy.info19132UDP
Minecraft Bedrock (Survival)mc.heezy.info19133UDP
Unreal Tournament 2004ut2k4.heezy.info7777, 7778, 7787, 28902, 80UDP/TCP

Counter-Strike 1.6#

Image: archont94/counter-strike1.6. AMX Mod X enabled, 16 player max, de_dust2 default. Fast download on port 80. Config, map cycle, AMX config, and ban lists managed in the cs16-server Ansible role.

Map rotation: de_dust2, de_dust, de_inferno, de_nuke, de_train, cs_office, cs_italy, cs_assault, de_aztec, de_cbble, de_prodigy, cs_militia.

Minecraft Bedrock#

Two itzg/minecraft-bedrock-server containers on dmz-minecraft. Creative on 19132, Survival on 19133. Both require Xbox Live auth (ONLINE_MODE: true). Weekly backups via cron, pulled to NFS by the minecraft-backup-manager role, rotated at 28 days.

Unreal Tournament 2004#

Image: phasecorex/ut2004-server:latest. Deathmatch and Capture the Flag modes, 12 player max. Config and map cycle managed in the ut2k4-server Ansible role. GameSpy query port 7787, web admin on 80.

LAN-Only Servers#

Three itzg/minecraft-server containers on dmz-minecraft-java. An external VIP exists but the firewall policy is set to deny. These run with online-mode=false (no Mojang auth). Clients connect using offline profiles via Prism Launcher. See Minecraft, Modding, and Java.

ServerLoaderVersionPortMemory
VanillaNoneLatest255652GB
AdventureForge1.20.1255666GB
CobblemonFabric1.21.1255672GB

Adventure server mods (auto-resolved from Modrinth with dependencies):

  • Cataclysm
  • Deeper and Darker
  • Dungeons and Taverns
  • Alex’s Mobs
  • YUNG’s Better Dungeons
  • YUNG’s Better Nether Fortresses
  • YUNG’s Better Ocean Monuments
  • YUNG’s Better Strongholds
  • YUNG’s Better Mineshafts
  • YUNG’s Better Desert Temples
  • YUNG’s Better Jungle Temples
  • YUNG’s Better Witch Huts
  • YUNG’s Better End Island
  • Knight Quest
  • Combat Nouveau
  • Expanded Combat
  • When Dungeons Arise
  • Simply Swords
  • Mowzie’s Mobs
  • Blue Skies

Cobblemon server runs the Cobblemon mod via Modrinth with required dependencies auto-downloaded.

Deployment#

Each game server is a dedicated DMZ VM provisioned by Terraform and configured by Ansible. The general flow for any server:

  1. Terraform creates the VM on Proxmox, assigns it to VLAN 3 (DMZ), and triggers the baseline Ansible playbook via GitHub Actions
  2. The VM gets a DHCP lease, the IP gets hardcoded as a DHCP reservation so it never shuffles on reboot
  3. Firewall objects and VIP NAT rules are added to terraform-heezy: an address object for the VM’s IP, a VIP for each public port, and policies for inbound game traffic and Ansible SSH access from the runner
  4. The Ansible role deploys a Docker Compose stack with the game server image, a systemd service to manage it, and UFW rules for the exposed ports
  5. The docker-compose-updater role schedules weekly image pulls every Sunday at 5am Eastern

Pushing to the relevant Ansible role paths triggers the workflow automatically. All four servers follow this same pattern.