Old SchoolOps

Running Classic Yourself

What is inside the Gate to Heavens Classic release archive, how to start it, and how to get a client connected to your own server.

For Gate to Heavens Classic Updated 2026-08-23

What Is in the Archive

The archive lives with the client on classic.playgth.com, which is where this game’s page sends you for it. Unzip it anywhere you have write access, and avoid Program Files on Windows: the server writes its database and its logs next to itself, and Windows quietly redirects those writes somewhere you will not find them.

Inside are four folders and one file.

FolderWhat it is
server/The three servers, their config, the game data, and everything they write. Windows and Linux binaries both ship.
client/A complete, playable game client with its own launcher. There is nothing to go and find.
database-mysql/The schema, for the optional MySQL path. You do not need it to start.
tools/gmadmin, which is how you make yourself staff.
README.mdHalf a page: how to start it, what the four folders hold, and a link back to this documentation. Everything else was moved here on purpose, because a manual sealed inside a zip cannot be corrected once it is downloaded.

Everything the server needs lives inside server/: settings.cfg, logic.cfg, both start scripts, and the data/, scripts/, worlds/ and articles/ folders. db/ and logs/ appear in there on the first run. The shared install page draws those files at the top level of the archive, so if you go looking for settings.cfg up there you will not find it.

Leave server/ and client/ where they are, side by side. The website serves client patch files out of client/ relative to the folder the server runs from, so moving one of them breaks patching.

Start It

On Windows, open server\ and double-click start-server.bat. Three windows open: the login server, the game server and the website.

On Linux:

cd server
sh start-server.sh

That makes the binaries executable and backgrounds all three. Stop them again with pkill -f 'linux/(login|game|web)server'.

To run them yourself instead, open three terminals inside server\ and start one in each. The start scripts do nothing clever; they exist to guarantee the working directory, because each binary looks for settings.cfg and the game data relative to where it is running from rather than next to the executable.

windows\loginserver.exe
windows\gameserver.exe
windows\webserver.exe -http :80

The same three on Linux, from server/, after a chmod +x linux/*:

./linux/loginserver &
./linux/gameserver &
./linux/webserver -http :80 &

Login listens on UDP 26000, the game on UDP 26001, and the website on :80. Port 80 usually needs administrator or root, and it will fail to start if IIS, Apache or anything else already holds it.

The first start does more work than the ones after it: the databases get created and the schema applied. The console says so as it happens.

The Database

Nothing to install. The first start creates the database files under server/db/, one per database, from the same schema that ships in database-mysql/. A start that got that far leaves a .db file per database in there, so an empty server/db/ is worth knowing about: it means the server stopped before it reached the database, and the FATAL: line further down says why. To go back to a clean server, stop everything and delete server/db/. It rebuilds on the next start.

MySQL is supported and is what we run in production. If you switch to it later, the server copies the accounts and characters you already have into it on the next start and renames the old files out of the way. The switch itself is on the database page.

Switching needs no credentials of your own. The server/settings.cfg in the archive is already filled in for a MySQL on the same machine, using the limited user that database-mysql/00_create_databases.sql creates, and the password in those two files is generated when the archive is built. So they already agree with each other, and no two downloads share a password. Load the schema, set DATABASE_PROVIDER mysql, and start the server.

The server applies the rest of the schema itself, so one file is normally enough. If the MySQL user you have cannot create databases, load all four by hand instead:

mysql -u root -p < database-mysql/00_create_databases.sql
mysql -u root -p < database-mysql/01_gommo_accounts.sql
mysql -u root -p < database-mysql/03_gth_game_tables.sql
mysql -u root -p < database-mysql/05_seed_data.sql

Make Yourself Staff

A fresh install has nobody with any powers, on purpose. There is one seeded account, [email protected] with the password OSOGTH2026!, and it is an ordinary player: that password is printed in every copy of the archive, so change it or delete the account once you have your own.

Staff levels come from tools\gmadmin.exe (tools/gmadmin on Linux). Run it from the folder you unzipped and it finds server/settings.cfg by itself, so it reaches the right database on either backend with nothing to configure.

tools\gmadmin.exe create [email protected] YourName
tools\gmadmin.exe grant [email protected] classicgth 4
tools\gmadmin.exe list

Level 4 is the top of the ladder, and the grant names a game, which is why classicgth appears in it. The five levels, promoting other people and what to do if you lose every admin account are on the GM accounts page. What the commands themselves do is on the GM commands page.

Point the Client at Your Server

Two files in client/data/ decide where the client goes.

server.cfg is the game server address:

MASTER_SERVER_NUMBER	1
MASTER_SERVER_WEBSITE	127.0.0.1
MASTER_SERVER_PORT	26000

MASTER_SERVER_WEBSITE takes an IP address or a hostname, and a hostname is resolved for you. MASTER_SERVER_PORT is the login port, 26000, not the game port. Leave it at 127.0.0.1 while you are testing on the same machine.

general.cfg is where the launcher goes. webserver_url is what it signs in against, and update_url is what it patches from. Both ship pointing at http://127.0.0.1:8080 while start-server.bat runs the website on :80, so make them agree: either set both keys to http://127.0.0.1, or start the website on the port they already name by running windows\webserver.exe -http :8080 from inside server\ instead of using the start script.

Players run client/launcher.exe, not client.exe. It signs in against your website, brings the client files up to date from it, and starts the game. New logins register themselves on first use, so nobody has to be created ahead of time and nothing waits on your approval.

Opening It to Other People

Allow inbound UDP 26000 and UDP 26001 through the server’s firewall, and forward them if the machine is behind a router. The website needs TCP 80 as well if you want people to reach it. The servers already listen on every interface, so there is nothing to change on that side.

Every player’s copy of client/data/server.cfg needs your public address in MASTER_SERVER_WEBSITE, and their general.cfg needs the same address in webserver_url and update_url. The configuration page covers the settings.cfg side, and the website page covers certificates and running behind a reverse proxy.

Stopping It Safely

Order matters, and it is the reverse of how they start: game server, then login server, then the website. Stopping the game server first is what saves and disconnects the players who are on; stopping the login server first would leave them connected to a server that is about to go away.

Character saves are transactional and the game server flushes on shutdown, so a clean stop cannot leave a half-written character.

On Windows, close each window or press Ctrl+C in it. On Linux, if you started them with start-server.sh:

pkill -f gameserver
pkill -f loginserver
pkill -f webserver

If you set them up as systemd services, sudo systemctl stop the three units in that same order.

Updating to a New Version

  1. Back up first. Not after. See the database page; the schema upgrade on start is one-way.
  2. Download the new archive and stop the servers, in the order above.
  3. Replace server/ and its data folder with the new ones, and keep your own settings.cfg. That file holds your database credentials and your own settings, and no release will ever contain a copy worth having.
  4. Replace client/ wholesale. That is what your players patch from, so their launchers pick the new files up on their next run without anybody downloading anything by hand.
  5. Start the servers again.

Read the release notes before you start: if a version needs anything beyond this, that is where it will say so.

It Did Not Start

A server window that opens and closes in under a second hit a fatal startup error, and it said so before it went. The last console line, and the end of server/logs/history.log, is a line beginning FATAL: that names the cause. Older runs are kept beside it as history.<timestamp>.log.

Three messages account for almost all of them.

The FATAL: line saysWhat happenedWhat to do
no settings.cfg foundThe server was launched from the wrong folder. Double-clicking an executable in server\windows\ does this every time, because the working directory becomes that folder and there is no settings.cfg in it.Use start-server.bat, or run the executable from inside server\.
failed to connect to ... databaseOn the default database, server/db/ cannot be written: a read-only folder, a directory you do not own, or a network share. On MySQL, it is not running, not reachable, or the credentials are wrong.The message names what it tried, either the exact file or the user, host, port and database. Keep the database files on a local disk; a network filesystem corrupts them.
could not load server configurationsettings.cfg is malformed, or the game data is missing.Compare your settings.cfg against the shipped settings.cfg.example, and confirm server/data is present and was extracted whole.

For more logging, set DEBUG 1 under [general] in server/settings.cfg and restart. The default is 0, which logs at info level.

The client keeps its own logs\ folder beside client.exe, separate from the server’s. If the launcher stalls rather than the server failing, that is where to look, along with whether the website is running and whether client/data/general.cfg points at it.

When you ask for help, bring server/logs/history.log, the client’s logs\ if the client is involved, and what you did immediately before it broke. The FATAL: line and a run with DEBUG 1 are usually enough on their own.

If the game starts but the world is empty of monsters, or players cannot get in from outside, the troubleshooting page works through both.