I recently went down the rabbit hole of getting a Darkan world server running under CubeCoders AMP. Darkan is an open-source/community RuneScape private server project with its own cache, client, world server, and lobby architecture. The server is based on circa-2012 content. The setup is not a one-click AMP template, but it is very doable with AMP’s Java App Runner instance, a MongoDB instance, and a little bit of manual configuration.
This post walks through the process I used to run a Darkan world server in AMP using Podman-managed instances.
The Architecture
For this setup, I used two AMP instances:
Darkan World Server
└── Java App Runner instance
MongoDB
└── MongoDB AMP instance
The Darkan world server connects to MongoDB for persistence and uses the Darkan development lobby for account creation, lobby login, and world selection.
At the time of writing, a fully custom lobby is not practical yet. Darkan’s lobby is proprietary, and although a unified server/lobby project appears to be underway, there is not currently a public lobby server JAR that can be dropped into AMP the same way as the world server. You could create your own JAR since the code is available, but the public branches are, to my understanding, missing crucial functionality right now. Plus, I wanted something a little more plug-and-play than compiling my own custom JAR constantly.
The unified project is here:
https://gitlab.com/darkanrs/server
For now, the easiest path is to run your own world server and connect through the Darkan development lobby.
Create the Java Server Instance
In AMP, create a new Java App Runner instance for the Darkan world server.

Set the world server ports. In my case, I used the default ports:
43595 TCP
43596 TCP
Make sure this matches the port in worldConfig.json later. If you are crossing VLANs or exposing the server publicly, also make sure that the ports are allowed through your firewall and forwarded correctly.
In the Java App Runner settings, configure the Java version and startup options. I used the Java 25 podman container because the release JAR I downloaded required a newer Java runtime.

Now save your settings and start the server. Manage the instance, and go to
Configuration > Java App RunnerNow set the instance to use Java 24 since this is the current recommended version from the devs.
Example settings:
Java Version: Specific instance version
Specific Instance Java Version: 24
Java Arguments: --enable-preview -Xms512M -Xmx2G
Jar Name: world-server.jar
Jar Options: com.rs.Launcher
App Subdirectory: blank

Click the Download tab and configure as follows :
App Download Type: Git repo
App Download source: https://gitlab.com/darkanrs/world-server.git
Git Repo branch: dev or master
Then go to:
Status > Actions > Update
This lets AMP prepare the Java App Runner instance.
Create the MongoDB Instance
Next, create a separate MongoDB instance in AMP. Pretty much all values can be left as default this time around.

Once MongoDB is running, open the instance, open the MongoDB console, and create a database user for Darkan:
use darkan-server
db.createUser({
user: "darkan",
pwd: "choose-a-password-here",
roles: [
{ role: "readWrite", db: "darkan-server" }
]
})

Save this password. You will need it in the Darkan world server config.
Enter the Java Instance
SSH into the AMP host.
If AMP is using Podman, list the containers:
podman ps -a
Find the Java App Runner container name. Mine was similar to:
AMP_JavaAppRunner01
Enter the container:
podman exec -it AMP_JavaAppRunner01 bash
AMP maps the app files inside the container under:
/AMP/java-app-runner
The parent /AMP directory is important because Darkan expects the cache at ../cache/ relative to the world server directory.
Clone the Darkan Cache
Inside the Java App Runner container:
cd /AMP
rm -rf cache
git clone https://gitlab.com/darkanrs/cache.git cache
cd cache
git lfs install
git lfs pull
ls -lh main_file_cache.dat2
You should see main_file_cache.dat2, which is a large cache file.
If git lfs is not available, install it first:
apt update
apt install git-lfs -y
Depending on how AMP and Podman map the filesystem, you may need to fix permissions later so the amp user inside the container can read the cache.
Optional: Install Nano
If you prefer editing files from the shell:
apt update
apt install nano -y
You can also use AMP’s File Browser and File Editor instead.
Configure Darkan
The Darkan world server config lives here:
cd /AMP/java-app-runner
nano data/worldConfig.json
Set the MongoDB fields and world information.
Example:
{
"serverName": "choose-a-name",
"ownerName": "your-username",
"cachePath": "../cache/",
"debug": true,
"mongoUrl": "localhost",
"mongoPort": 27017,
"mongoUser": "darkan",
"mongoPass": "choose-a-password-here",
"mongoDbName": "darkan-server",
"lobbyIp": "dev.darkan.org",
"lobbyApiKey": "TEST_API_KEY",
"worldInfo": {
"number": 3,
"ipAddress": "IP_OR_DNS",
"port": 43595,
"activity": "world_name_in_lobby",
"country": 1,
"quickChat": false,
"lootShare": true,
"members": true,
"pvp": false,
"highlight": false
}
}

A few important notes:
localhost only works for MongoDB if both containers are running on the same AMP instance manager with host networking enabled, which is how my setup is running.
Do not use 0.0.0.0 for worldInfo.ipAddress. That may be fine for binding a service locally, but it is not a usable address for the lobby or client to connect to. Use a public IP, LAN IP, or DNS name that clients can actually reach.
In my case, I used a DNS name like:
rs2.example.com
Also make sure the port in worldInfo.port matches the AMP instance port and your firewall rules.
Download the Latest World Server Release JAR
AMP’s built-in download/update settings do not cleanly support “download the latest JAR from GitLab releases” for this project, so I used a small helper script.
Inside the Java App Runner directory:
cd /AMP/java-app-runner
cat > update-world-server-jar.sh <<'EOF'
#!/bin/bash
set -e
GITLAB_API_URL="https://gitlab.com/api/v4"
PROJECT_ID="42378996"
echo "Checking latest Darkan world-server release..."
PACKAGE_DOWNLOAD_URL="$(curl -s "${GITLAB_API_URL}/projects/${PROJECT_ID}/releases?order_by=created_at&sort=desc" \
| jq -r 'max_by(.released_at) | .assets.links | map(select(.name | endswith("-jar"))) | .[0].direct_asset_url')"
if [ -z "$PACKAGE_DOWNLOAD_URL" ] || [ "$PACKAGE_DOWNLOAD_URL" = "null" ]; then
echo "Could not determine latest release JAR URL"
exit 1
fi
echo "Downloading: $PACKAGE_DOWNLOAD_URL"
curl -L "$PACKAGE_DOWNLOAD_URL" -o world-server.jar
echo "Downloaded:"
ls -lh world-server.jar
EOF
chmod +x update-world-server-jar.sh
If jq is missing:
apt update
apt install jq curl -y
Download the latest server JAR:
./update-world-server-jar.sh
You should now have:
/AMP/java-app-runner/world-server.jar
Test the Server Manually
Before relying on the AMP UI, test the JAR directly.
If using Podman:
podman exec -it AMP_JavaAppRunner01 bash -lc '
su -s /bin/bash amp -c "
cd /AMP/java-app-runner
export JAVA_HOME=/usr/lib/jvm/temurin-25-jdk-amd64
export PATH=\$JAVA_HOME/bin:\$PATH
java --enable-preview -Xms512M -Xmx2G -jar world-server.jar com.rs.Launcher
"
'
A successful start should show the server loading config, connecting to MongoDB, loading the cache, and starting the embedded server components.
If AMP complains that the Java executable does not exist, check whether it is trying to launch:
/AMP/java-app-runner/java/bin/java
In my case, I had to recreate the Java path as a symlink to the installed Temurin runtime:
podman exec -it --user root AMP_JavaAppRunner01 bash -lc '
cd /AMP/java-app-runner
rm -rf java
ln -s /usr/lib/jvm/temurin-25-jdk-amd64 java
chown -h amp:amp java
/AMP/java-app-runner/java/bin/java -version
'
Then AMP’s Java App Runner could find the executable it expected.
Fix Permissions If Needed
Because AMP is running the Java process as the amp user, files created as root can cause failures.
If the server fails to read the cache or config, fix permissions from inside the container:
podman exec -it --user root AMP_JavaAppRunner01 bash -lc '
ls -ld /AMP/cache /AMP/java-app-runner
ls -lh /AMP/cache/main_file_cache.dat2
chown -R amp:amp /AMP/cache /AMP/java-app-runner
chmod -R u+rwX,go+rX /AMP/cache
chmod -R u+rwX /AMP/java-app-runner
su -s /bin/bash amp -c "head -c 1 /AMP/cache/main_file_cache.dat2 >/dev/null && echo cache-readable"
'
If you are working from the host as the amp user and see strange numeric ownership, such as 165536, that is probably rootless Podman UID mapping. In that case, fix ownership from inside the container rather than from the host.
Start from AMP
Once the manual test works, start the instance from the AMP UI.
Connecting with the Client
For now, use the Darkan development lobby.
Download the latest client loader from:
https://gitlab.com/darkanrs/client-loader/-/releases
Start the client, select the development lobby, create an account, and look for your world.
Make sure the world port is open and reachable. If you are hosting publicly, that means:
AMP instance port
Linux firewall
Router/NAT/firewall
DNS record
all need to agree on the same TCP port.
About Custom Lobbies
At the moment, there does not appear to be a simple public lobby JAR that can be dropped into AMP the same way as the world server JAR.
Darkan’s lobby is proprietary. An open-source unified server/lobby project appears to be underway here:
https://gitlab.com/darkanrs/server
The project includes lobby-related development, but there is not yet a public release workflow that makes a lobby JAR available for the same AMP setup. You could use public branches of both the server repo and the client with Kotlin or another IDE to build your own JARs, but since these are in early beta, I don’t consider this practical for many people.
The current practical approach is:
Use the Darkan development lobby
Run your own world server
Point the client at the development lobby
Connect to your world through the world list
Stay tuned for part two, where I’ll revisit this once the appropriate client executable and lobby server JAR files are available publicly.
Final Notes
This was more involved than a typical AMP game server because Darkan is not a native AMP app template. The big takeaways were:
Use Java App Runner
Use a separate MongoDB AMP instance
Put the cache at /AMP/cache
Make sure worldConfig.json points to MongoDB
Use a real reachable DNS/IP for worldInfo.ipAddress
Download the release JAR manually or with a helper script
Fix Podman/AMP permissions so the amp user can read the cache and config
Once those pieces are in place, the world server can run cleanly under AMP.