Sign inSign up

svenbledt/palworld-paladmin

By svenbledt

Updated about 2 months ago

A palworld server containing a administrative webgui and anticheat management with modding support

Image
0

1.1K

svenbledt/palworld-paladmin repository overview

Palworld + PalAdmin

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:

TagComponentWhat it is
:serverGame serverWindows Palworld dedicated server run under wine + Xvfb on Linux, with UE4SS (Lua mods) and PalDefender (admin commands, anticheat, REST API).
:gatewayAdmin APIJWT-guarded HTTP API that talks to the game over RCON/REST. Internal-only.
:webWeb consoleThe 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).


Quick start (plain Docker, no Coolify)

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:

  • Game: connect to <host-ip>:8211 in Palworld.
  • Admin console: open 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-web container. Only 8211/udp needs to be internet-exposed for the game itself.


Pinning versions

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

Updating

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.

Ports

PortProtoExposurePurpose
8211UDPpublicGame — players connect here.
8080TCPyour choicePalAdmin web console (map to a reverse proxy for HTTPS).
25575TCPinternalRCON (gateway → game). Not published.
8212TCPinternalGame REST / PalDefender API (gateway → game). Not published.

Source & docs

Built from https://github.com/svenbledt/palworld-docker — issues, full environment-variable reference, and the mod setup live there.

Credits:

PalDefender - ultimeit

Tag summary

Content type

Image

Digest

sha256:a0ac26ed4

Size

1021 MB

Last updated

about 2 months ago

docker pull svenbledt/palworld-paladmin:server