A palworld server containing a administrative webgui and anticheat management with modding support
1.1K
A self-hosted Palworld dedicated server (modded with UE4SS + PalDefender) bundled with PalAdmin — a web console to manage it: players, live logs, game settings, and PalDefender config, all behind a login.
Everything ships from one repo using a tag per component:
| Tag | Component | What it is |
|---|---|---|
:server | Game server | Windows Palworld dedicated server run under wine + Xvfb on Linux, with UE4SS (Lua mods) and PalDefender (admin commands, anticheat, REST API). |
:gateway | Admin API | JWT-guarded HTTP API that talks to the game over RCON/REST. Internal-only. |
:web | Web console | The PalAdmin UI (nginx + SPA). The single front door — serves the app and reverse-proxies /api to the gateway. |
Each tag has a moving pointer (:server) and immutable versions (:server-0.1.0).
You need Docker + Docker Compose v2 on a native-Linux host. (Docker Desktop / WSL2 can build the images but wine misreports memory there, so the game never becomes joinable — use a real Linux host for actual play.)
1. Create a .env next to the compose file:
# REQUIRED — no defaults, the stack refuses to start without these:
ADMIN_PASSWORD=change-me-strong # admin / RCON / REST password (no " or ,)
JWT_SECRET=change-me-to-a-long-random-string # signs PalAdmin login tokens
# Optional server settings:
SERVER_NAME=My Palworld Server
MAX_PLAYERS=32
PUBLIC=false # true = list in the community browser
# Host port the PalAdmin web console is served on:
WEB_PORT=8080
2. Save this as docker-compose.yml:
services:
palworld:
image: svenbledt/palworld-paladmin:server
restart: unless-stopped
stop_grace_period: 30s
environment:
SERVER_NAME: ${SERVER_NAME:-Palworld Server}
SERVER_PASSWORD: ${SERVER_PASSWORD:-}
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?set ADMIN_PASSWORD in .env}
MAX_PLAYERS: ${MAX_PLAYERS:-32}
PUBLIC: ${PUBLIC:-false}
GAME_PORT: 8211
RCON_ENABLED: "true"
RCON_PORT: 25575
REST_API_ENABLED: "true"
REST_API_PORT: 8212
ports:
# Only the game port must be public (UDP) so players can connect / it can
# appear in the community list. RCON/REST stay internal to the stack.
- "8211:8211/udp"
volumes:
- pal_data:/home/steam/palworld
healthcheck:
test: ["CMD-SHELL", "curl -sf -u admin:$${ADMIN_PASSWORD} http://localhost:8212/v1/api/info || exit 1"]
interval: 30s
timeout: 10s
retries: 10
start_period: 600s # modded first boot is slow: wine prefix + SteamCMD download
paladmin-gateway:
image: svenbledt/palworld-paladmin:gateway
restart: unless-stopped
depends_on:
palworld:
condition: service_started
environment:
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?set ADMIN_PASSWORD in .env}
JWT_SECRET: ${JWT_SECRET:?set JWT_SECRET in .env}
PAL_RCON_HOST: palworld
PAL_RCON_PORT: 25575
PAL_REST_URL: http://palworld:8212
PORT: 3000
PAL_DEFENDER_DIR: /palworld-cfg
PAL_CATALOG_DIR: /palworld/persist/catalog
PAL_GAME_CFG_DIR: /palworld-gamecfg
volumes:
- paladmin_data:/data
- pal_data:/palworld:ro # read game logs
- type: volume # PalDefender config (read-write, scoped)
source: pal_data
target: /palworld-cfg
volume:
subpath: persist/PalDefender
- type: volume # PalWorldSettings.ini (read-write, scoped)
source: pal_data
target: /palworld-gamecfg
volume:
subpath: Pal/Saved/Config/WindowsServer
paladmin-web:
image: svenbledt/palworld-paladmin:web
restart: unless-stopped
depends_on:
- paladmin-gateway
ports:
# The web console. Open http://<host>:8080 and sign in with ADMIN_PASSWORD.
- "${WEB_PORT:-8080}:80"
volumes:
pal_data:
paladmin_data:
3. Launch:
docker compose up -d
docker compose logs -f palworld # first boot downloads the server (a few minutes)
4. Play & manage:
<host-ip>:8211 in Palworld.http://<host-ip>:8080 and sign in with your ADMIN_PASSWORD.Put PalAdmin behind HTTPS for anything internet-facing — front it with a reverse proxy (Caddy / Traefik / nginx) terminating TLS to the
paladmin-webcontainer. Only8211/udpneeds to be internet-exposed for the game itself.
The example uses moving tags (:server, :gateway, :web) that always track
the latest release. For reproducible deploys, pin the immutable versioned tags:
image: svenbledt/palworld-paladmin:server-0.1.0
image: svenbledt/palworld-paladmin:gateway-0.1.0
image: svenbledt/palworld-paladmin:web-0.1.0
docker compose pull && docker compose up -d
Your world save, PalDefender tokens, and game config live on the pal_data
volume and survive updates and restarts.
| Port | Proto | Exposure | Purpose |
|---|---|---|---|
8211 | UDP | public | Game — players connect here. |
8080 | TCP | your choice | PalAdmin web console (map to a reverse proxy for HTTPS). |
25575 | TCP | internal | RCON (gateway → game). Not published. |
8212 | TCP | internal | Game REST / PalDefender API (gateway → game). Not published. |
Built from https://github.com/svenbledt/palworld-docker — issues, full environment-variable reference, and the mod setup live there.
PalDefender - ultimeit
Content type
Image
Digest
sha256:a0ac26ed4…
Size
1021 MB
Last updated
about 2 months ago
docker pull svenbledt/palworld-paladmin:server