Skip to content

Quick start

You need JDK 25 and Docker. On Windows, clone with git clone -c core.longpaths=true: some script paths are longer than the Windows path limit allows by default.

Terminal window
docker compose up -d

This starts PostgreSQL 18 on 127.0.0.1:5432 with the database l2nx, and on the first start creates one role and one schema per server: l2nx_login owns login, l2nx_game owns game. The servers create their tables themselves at start (Liquibase). This matches the defaults of both servers (spring.datasource.*): password l2nx. The port is open to your machine only; change the passwords before you expose the database anywhere else, and set the same ones for the servers in config/application.yaml (see operations). To set up a database without Compose, see the database section of operations.

The roles and schemas are created only when the volume is created. Before 1.0 each server has a single schema baseline that is edited in place, so after you pull a change that touches the database, recreate it with docker compose down -v and docker compose up -d; this deletes the local data. A Liquibase checksum error at start means exactly this.

Both servers need the same GS-link secret of at least 32 characters; export it in each terminal before starting:

Terminal window
export L2NX_GSLINK_SECRET=$(openssl rand -base64 32) # first terminal; copy the value to the second
Terminal window
./gradlew :login:boot:run
./gradlew :chronicles:high-five:boot:run

The login server accepts clients on port 2106. The game server registers on it over the GS-link (port 9014, operations) and accepts clients on port 7777. Accounts are created on the first login (l2nx.login.auto-create-accounts in the login application.yaml).

High Five clients with protocol revisions 267, 268, 271 and 273 are accepted; the set belongs to the highfive protocol adapter and has no setting.

Terminal window
./gradlew installDist

builds two runnable directories:

Directory Contents
login/boot/build/install/login-server bin/login-server, config/
chronicles/high-five/boot/build/install/game-server bin/game-server, config/, data/

The servers run headless. A restart from the game or by schedule exits with code 2, a crash with another non-zero code, a shutdown with 0: run the server under a supervisor that restarts it on a non-zero exit (systemd Restart=on-failure, Docker restart: on-failure; examples in operations). ./gradlew distZip packs the same directories into archives.

The build rewrites everything in these directories that comes from the sources, including config/. It keeps log/ and data/geodata/.

Geodata is not shipped. Put the files into data/geodata of the game server directory; the format and the path are set in config/GeoEngine.ini.