This is a brief history of the creation and maintenance of is.xivup.com.

I have been running a server status website for FFXIV (Final Fantasy XIV, an MMO) since 2017 at is.xivup.com. The primary purpose of it is to have an auto-refreshing site that can tell people if the FFXIV servers are up. Because I suck at coming up with new ideas, this 2017 site was already a “v2”, as my original one was embedded on my FFXIV fansite I ran back before the game first came out. I had a server status site in 2011 before A Realm Reborn was launched.

Screenshot ff14news.com from Feb 2011, provided by the wayback machine

Screenshot ff14news.com from Feb 2011, provided by the wayback machine

Recreating the Server Status Site (2017)

I did some digging into the FFXIV connection logic back in 2013, though I didn’t do anything with it at the time. In 2017 I used that knowledge to create the is.xivup.com, which does a few things to record status about the FFXIV game servers:

  • Ping: send ICMP pings to each lobby and each potential game server.
  • Port Scanning: for each potential game server, there are 12 ports where people will be routed to. I attempt to connect to each (recording if it’s open or closed).
  • Data Gathering: SquareEnix has a few endpoints that report data in a easily consumable (JSON) format to tell the status of their various servers.
  • Data Scraping: Only used for the login server, to check that the login form is available.
Screenshot is.xivup.com in Sept 2017 provided by the wayback machine

Screenshot is.xivup.com in Sept 2017 provided by the wayback machine

Maintenance Mode (2017-2023)

During this time, I didn’t do a lot with the site. Mainly just kept it up and running, tweaking a few things. But no big changes were done.

I’ve changed my compile/deploy pipeline multiple times, partially for learn various tech, partially because I got annoyed with how my existing system was working.

The site started with Docker, hosted on GCP (Google Cloud) with the create-with-container (docs), which allowed for direct hosting a docker image on GCP, with little maintenance. GCP would handle most everything the rest. It was a poor man’s GKE, though deployments would temporarily take the site offline.

Building the site’s Docker image went through a few iterations. I started off building the Docker image locally and just deploying it from my machine to GCP. Then moved to Cloud Builds in 2019, which made the process more repeatable. I also ditched Docker in 2019 in an attempt to get every inch out of the free-tier servers on GCP.

But I kept having server lockup issues. I actually was able to repeatedly lock up the OS on the nano GCP instance when the server was hit with a lot of traffic. I never found a solution, so I left GCP for Linode. (No, I didn’t report the issue.)

The move to Linode definitely has caused some more work (all self imposed), but has made it easier to consolidate my web hosting. This blog is now hosted on the same server, plus a few other things. This move fixed the server lockup issue (mostly, but that’s for another post).

Design Refresh (2023-2024)

I had some time off work with a new kid, and used it to work on a redesign. The site was still using JQuery and was sort of ugly (just some simple CSS I cooked up in 2017). I had a few things I wanted to do:

  1. Make it prettier. I went with Bootstrap because I’m not a designer. I wanted to ride on someone elses coattails. Most of my time was spent getting layouts looking good on desktop and mobile (and playing with different layout ideas).
  2. Drop JQuery. With the new page layout, I redid the front-end script and was able to use standard Javascript for most of the site.
  3. History/Data/Graphs. I wanted to collect and show historical of data, though I didn’t complete all my ideas, I got some shipped. I landed on SQLite and ChartJS, and it’s working decently well at this point.

The Future?

I have other things I want to do to improve the site (more dynamic graphs, more graphs, collecting some more data about server state). But that will have to come later.