Game server hosting
Fast RAM, high-speed internet
Eat lag for breakfast
Try our Soulmask server hosting free for 2 days!
Docker image for running a Soulmask dedicated server.
Supports Soulmask 1.0 including the Shifting Sands DLC.
-
Copy
.env.exampleto.envand edit your settings:cp .env.example .env
-
Remove the
soulmask-map2service fromdocker-compose.yml. -
Start the server:
docker compose up -d
See Cross-Map Setup below.
The server files are downloaded automatically on first start and updated on every restart (unless UPDATE_ON_START=false).
| Port | Protocol | Description |
|---|---|---|
| 8777 | UDP | Game port |
| 27015 | UDP | Steam query port |
| 18888 | TCP | Telnet port |
| Variable | Default | Description |
|---|---|---|
PUID |
1000 | Required. User ID to run as |
PGID |
1000 | Required. Group ID to run as |
SERVER_NAME |
Soulmask Dedicated Server |
The server name shown in the in-game server browser |
SERVER_PASSWORD |
(empty) | Server join password. Leave empty for a public server |
ADMIN_PASSWORD |
(empty) | Admin (GM) password. Use gm key <password> in the in-game console to elevate privileges |
GAME_MODE |
pve |
pve or pvp |
GAME_WORLD |
Level01_Main |
Map to load. See Map Selection below |
MAX_PLAYERS |
20 |
Maximum concurrent players (game cap: 70) |
GAME_PORT |
8777 |
UDP port for client connections |
QUERY_PORT |
27015 |
UDP port for Steam server browser queries |
ECHO_PORT |
18888 |
TCP port for Telnet maintenance (telnet <host> 18888) |
LISTEN_ADDRESS |
0.0.0.0 |
Network interface the server listens on |
SAVING_INTERVAL |
600 |
Seconds between writing game objects to the database |
BACKUP_INTERVAL |
900 |
Seconds between flushing the database to disk |
UPDATE_ON_START |
true |
Set to false to skip the Steam update check on container start |
SERVER_ID |
(unset) | Unique integer ID for this server instance. Required for cross-map; each server must have a different value |
CROSS_SERVER_MAIN_PORT |
(unset) | Main server only. Broadcast port child servers connect to (e.g. 20000) |
CROSS_SERVER_CONNECT |
(unset) | Child server only. host:port of the main server's broadcast port (e.g. soulmask-map1:20000) |
Use the GAME_WORLD variable to choose the map:
| Value | Map |
|---|---|
Level01_Main |
Cloud Mist Forest (base game, default) |
DLC_Level01_Main |
Shifting Sands (DLC, April 10 2026) |
Cross-map lets players travel between Cloud Mist Forest and Shifting Sands on the same private server cluster. It requires two container instances: a main server (hosts the shared character database) and a child server (connects back to the main).
- The main server stores character data in
Saved\Accounts\account.db(separate from world data). - The child server registers itself with the main via a broadcast port (
-clientserverconnect). - Both servers must use the same
SERVER_PASSWORD— mismatched passwords will reject cross-server logins. - Each server must have a unique
SERVER_ID.
-
Copy the example env files:
cp .env.map1.example .env.map1 cp .env.map2.example .env.map2
-
Edit both files and set a strong, matching
SERVER_PASSWORDon each. -
Start both servers:
docker compose up -d
-
Both servers appear in the Steam server browser as separate entries. Players connect to whichever map they want to play; their character transfers automatically when they use the in-game cross-server travel menu.
| Server | Game port | Query port | Echo port |
|---|---|---|---|
| Map 1 (Cloud Mist Forest) | 8777/udp | 27015/udp | 18888/tcp |
| Map 2 (Shifting Sands) | 8778/udp | 27016/udp | 18889/tcp |
The cross-server broadcast port (20000) is only used for inter-container communication and does not need to be forwarded in your firewall/router unless the two servers run on different physical hosts.
If map1 and map2 run on separate machines:
- Expose port
20000on the main server host (firewall + router). - In
.env.map2, setCROSS_SERVER_CONNECTto the main server's public IP:CROSS_SERVER_CONNECT=<main-server-public-ip>:20000 - In
docker-compose.ymlon the main server host, publish the broadcast port:ports: - 20000:20000/udp
The game ships a CLI tool for copying character records between databases:
WS\Plugins\DBAgent\ThirdParty\Binaries\CopyRoles.exe
Usage is documented in Readme.txt in the same directory. This is useful for migrating characters from a standalone server into a cross-map cluster.
Connect via Telnet for live server administration:
telnet <server-ip> 18888Useful commands:
help— list available commandssaveworld 1— force save the worldquit 30— graceful shutdown after 30 seconds
