Ondřej Chrastina
Menu

UpCloud & Doom

Learn how to package classic DOOM into a Docker image, deploy it on UpCloud Kubernetes, and stream gameplay via noVNC—proof UKS handles full GUI apps.

Back to projects
  • Released: Tue Mar 04 2025

This project shows how to run a full-blown GUI application—specifically, the classic first-person shooter DOOM (1993)—inside containers on UpCloud Kubernetes Service (UKS).

Instead of another “Hello World” or WordPress chart, the authors picked the cult-classic DOOM. The goal: package the original Linux DOOM, wire it to a headless X server, expose it over VNC/noVNC, push the container to an UpCloud registry, and deploy it on a vanilla UKS cluster—all with a single helm/kubectl apply.

Key moments

  1. Container build – Multi-stage Dockerfile installs linuxdoom-1.10, xvfb, x11vnc, and noVNC, bundling the shareware WAD for clean licensing.
  2. Registry push – Image is tagged and pushed to UpCloud Container Registry so UKS nodes pull it entirely inside UpCloud’s network.
  3. Kubernetes objects –
    • Deployment runs one DOOM pod per replica, each exposing VNC on port 5900.
    • Service + Ingress forward WebSocket traffic through UpCloud’s load balancer to noVNC.
    • ConfigMap passes runtime flags (e.g., -warp 1) so live demos can swap levels.
  4. Access & scaling – Opening the ingress URL launches DOOM in the browser; increasing replica count instantly spawns more playable pods.
  5. Cost demo – kubectl scale deployment doom --replicas=0 shows how workloads shut down when not in use, eliminating idle compute costs.

Quick summary

ItemDetails
RepoSimply007/upcloud-doom
PurposeShowcase running legacy GUI software (DOOM) on UpCloud Kubernetes Service via Docker + noVNC.
Tech stackDocker, Linux DOOM 1.10, Xvfb, x11vnc, noVNC, Helm/Kubectl, UKS, UpCloud Container Registry.
How it works1. Build image → 2. Push to registry → 3. kubectl apply -f k8s/ → 4. Open ingress URL and play DOOM in the browser.
Why it mattersDemonstrates UKS networking, ingress, persistent storage (for WADs), and zero-to-hero app onboarding in a fun, memorable way.
Live demo footprint~250 MB image, < 300 Mi B RAM, scales from 1–N replicas; costs tied only to active nodes.
  • Twitter
  • GitHub
  • LinkedIn
  • Facebook
  • Instagram
  • YouTube
  • Medium
  • dev.to
  • Discord
    • © Ondřej Chrastina 2020
    • Design: HTML5 UP
    • 💾 Source code
  • Home
  • Journal
  • Projects
  • PWA series
  • GitHub
Close