Sign inSign up

jimbit0/aska-dedicated-server

By jimbit0

•Updated about 1 month ago

ASKA Dedicated Server (Proton-GE)

Image
3

1.8K

jimbit0/aska-dedicated-server repository overview

⁠ASKA Dedicated Server (Docker)

Docker Debian Alpine Status

Run an ASKA Dedicated Game Server in Docker on Linux. The ASKA server binary is Windows-only, hence both images run it under wine : Proton-GE on the unstable tag, Alpine's musl-native Wine on the experimental tag.

Images: jimbit0/aska-dedicated-server:unstable · jimbit0/aska-dedicated-server:experimental

⁠Changelog

⁠unstable — 0.2.1 (2026-09-05)
  • Proton-GE bumped to GE-Proton11-6
  • Debian base update
  • Housekeeping more noise
  • Reset version ; Runtime reported in the startup banner
  • xvfb-run replaced with a managed Xvfb
⁠experimental — 0.2.1 (2026-09-05)
  • Alpine musl-native Wine variant. Why? Im bored

⁠Quick Start

docker run -d \
  --name aska-server \
  --stop-timeout 90 \
  -p 27015:27015/udp \
  -p 27016:27016/udp \
  -e ASKA_DISPLAY_NAME="My ASKA Server" \
  -e ASKA_SERVER_NAME="my-server" \
  -e ASKA_AUTH_TOKEN="YOUR_TOKEN_HERE" \
  -e ASKA_SAVE_ID="" \
  -v ./aska/server:/home/steam/aska_server \
  -v ./aska/saves:/aska-saves \
  jimbit0/aska-dedicated-server:unstable

Do not skip the stop timeout. Good practice.

First boot downloads the server from Steam, expect several minutes before the container reports healthy. The healthcheck allows a 180-second start period.


⁠Features

  • Worker thread auto-detection — configures Unity JobSystem based on available CPU cores
  • Jemalloc — preloaded for the container's Linux-side allocations, with reclaim banded from the memory limit
  • Crash detection — log pattern matching, persistent crash reports across restarts
  • Save auto-detection — finds the newest save folder when ASKA_SAVE_ID is not set
  • Backup rotation — optional tar.gz backups on container start with configurable retention
  • Healthcheck — green only once the game reports its session is open
  • Non-root — runs as steam (UID 1000)

⁠Requirements

  • Linux host.
  • 4+ CPU cores, 8 GB+ RAM, 2 GB+ storage
  • UDP ports 27015 and 27016 open on the host firewall
  • Kernel 5.16+ recommended on the unstable tag, so Proton can use fsync

⁠Configuration

⁠Required
VariableDescription
ASKA_DISPLAY_NAMEName shown in server browser
ASKA_SERVER_NAMEInternal server identifier
ASKA_AUTH_TOKENSteam Game Server Login Token (manage here⁠, App ID: 1898300)

App ID 1898300 is the base game and is the one to use when generating a GSLT.

⁠Save Management

ASKA_SAVE_ID controls which world the server loads. Resolution order:

PrioritySourceBehaviour
1ASKA_SAVE_ID env varAlways wins if set
2server.properties.docker.txtChecked if env is empty
3Folder scanPicks the newest savegame_* folder in /aska-saves
4GenerationCreates a new world

Starting fresh , leave ASKA_SAVE_ID empty. The server generates a new world.

Loading an existing save :

  • Auto-detect: drop the savegame_* folder into the saves volume and clear any stale save id value from server.properties.docker.txt (otherwise the server tries to load the old ID).
  • Explicit: set ASKA_SAVE_ID to the folder suffix, e.g. 0fef8_181125131111 for a folder named savegame_0fef8_181125131111.

Migrating from Windows : copy the savegame_* folders from %USERPROFILE%\AppData\LocalLow\Sand Sailor Studio\Aska\data\server\ into the saves volume.

⁠Server Settings
VariableDefaultDescription
ASKA_PASSWORD""Join password (empty = open)
ASKA_REGION"default"default, Asia, EU, US, etc.
ASKA_MODE"normal"Game mode (see properties file)
ASKA_MAX_PLAYERS"4"Concurrent players
ASKA_SEED""World generation seed
ASKA_KEEP_WORLD_ALIVE"false"Keep world running with no players
ASKA_AUTOSAVE_STYLE"every morning"every morning, frequent, manual
ASKA_STEAM_GAME_PORT"27015"Game port inside the container
ASKA_STEAM_QUERY_PORT"27016"Steam query port inside the container

Only non-empty values are written to the properties file, so anything you leave unset keeps the game's own default.

⁠Performance
VariableDefaultDescription
ASKA_WORKER_THREADS"" (auto)Unity worker threads (auto = effective cores − 1, minimum 2)
ASKA_MAX_CPU_CORES"16"Caps the core count Unity is told about. No effect on experimental
ASKA_ENABLE_PROFILING"false"true = write a Unity profiler log to logs/profiler.log
ASKA_XVFB_SCREEN"800x600x16"Virtual display geometry
⁠Operational Settings
VariableDefaultDescription
ASKA_SKIP_STEAM_UPDATE"0"1 = skip game update on start
ASKA_STEAM_VALIDATE"0"1 = validate game files (slower)
ASKA_SAVE_BACKUP"0"1 = backup saves on start
ASKA_KEEP_SAVES"3"Backups to retain
ASKA_CRASH_PATTERN""Replaces the built-in crash pattern list with this single pattern
ASKA_CRASH_LOG_LINES"30"Log lines captured into a crash report
ASKA_PROPERTIES_FILENAME"server.properties.docker.txt"Properties file name inside the server volume
TZ—Container timezone, e.g. Asia/Kuala_Lumpur. Affects log and backup-file timestamps. Unset = UTC

ASKA_CRASH_PATTERN replaces, it does not add. Leaving it empty keeps the full built-in list; setting it means that string is the only pattern watched for. To disable pattern-based detection entirely (exit-code detection still applies):

environment:
  ASKA_CRASH_PATTERN: "NEVER_MATCH_THIS_STRING"

Restart behaviour is handled by Docker's restart policy.

⁠Backups

With ASKA_SAVE_BACKUP=1 a single tar.gz is taken at startup, before the server launches:

  • Written to /aska-saves/backups/backup_<save_id>_YYYYmmdd_HHMMSS.tar.gz
  • Rotated to the ASKA_KEEP_SAVES newest for that save ID
  • Skipped with a warning if no save ID resolves or the save folder does not exist yet first boot of a new world produces no backup

⁠Volumes

Container PathPurpose
/home/steam/aska_serverGame binaries, config, logs
/aska-savesWorld saves, backups, crash reports

Both must be writable by UID 1000.


⁠Compose Example

services:
  aska:
    image: jimbit0/aska-dedicated-server:unstable
    container_name: aska-server
    restart: unless-stopped

    # Shutdown saves the world and can take up to 75s.
    stop_grace_period: 90s

    ports:
      - "27015:27015/udp"
      - "27016:27016/udp"

    environment:
      ASKA_DISPLAY_NAME: "My ASKA Server"
      ASKA_SERVER_NAME: "my-server-01"
      ASKA_AUTH_TOKEN: "YOUR_TOKEN_HERE"
      ASKA_SAVE_ID: ""
      ASKA_PASSWORD: ""
      ASKA_REGION: "default"
      ASKA_MAX_PLAYERS: "4"
      ASKA_SAVE_BACKUP: "1"
      ASKA_KEEP_SAVES: "3"

    volumes:
      - /opt/aska/server:/home/steam/aska_server
      - /opt/aska/saves:/aska-saves

    deploy:
      resources:
        limits:
          cpus: "8"
          memory: 8G
        reservations:
          cpus: "4"
          memory: 4G

The memory limit is not just a cap, jemalloc's page-reclaim decay is banded from it at startup:

effective memorydirty_decay_ms / muzzy_decay_ms
≤ 4 GB5000 — reclaim aggressively
4–8 GB15000
> 8 GB30000 — reclaim lazily

⁠Healthcheck

--interval=30s --timeout=10s --start-period=180s --retries=3

Healthy requires both that the AskaServer.exe process is alive and that the game has logged The session is now open!.


⁠Logs & Debugging

# Container output (entrypoint + server)
docker logs -f aska-server

# Game log only
docker exec aska-server tail -f /home/steam/aska_server/logs/aska_game_output.log

# Proton/Wine stdout
docker exec aska-server tail -f /home/steam/aska_server/logs/proton_stdout.log

All logs live in /home/steam/aska_server/logs/ Each is rotated one deep to <name>.old on startup.

FileContents
aska_game_output.logUnity/game log
proton_stdout.logstdout/stderr of the game process
xvfb.logVirtual display
wine_wineboot.logWine prefix creation
proton_regfix.logRegistry fix (named wine_regfix.log on experimental)
steamcmd_update.log, steamcmd_selfcheck.logSteamCMD
crash_YYYYMMDD_HHMMSS.logPer-crash capture
profiler.logOnly with ASKA_ENABLE_PROFILING=true
⁠Crash Reports

If the previous run crashed, the container prints a summary on next boot:

╔══════════════════════════════════════════════════════════╗
║ PREVIOUS CRASH DETECTED                             ║
╠══════════════════════════════════════════════════════════╣
║ Time: 2025-12-28 12:33:03                           ║
║ Type: SIGKILL (137)                                 ║
║ Cause: OOM killer or forced termination             ║
╚══════════════════════════════════════════════════════════╝

Common types: SIGTERM (143) — docker stop timeout or external kill. SIGKILL (137) — OOM killer. Log Pattern Match — game-level crash detected in output. Exit codes 143 and 130 following a clean shutdown are not treated as crashes.

⁠Common Issues
  • Ports in use: check with ss -ulnp | grep 27015
  • Permission denied: ensure volumes are owned by UID 1000
  • Auth token invalid: verify at steamcommunity.com/dev/managegameservers⁠ — use App ID 1898300
  • World lost progress on restart: the stop timeout was too short or not set. Always save on exit in game first.
  • Timestamps are 'wrong': set TZ; unset, the container runs in UTC

⁠Internals

Componentunstableexperimental
Base OSDebian 13 (Trixie) SlimAlpine
Windows runtimeGE-Proton11-6Alpine musl-native Wine
Launchproton run AskaServer.exewine64 AskaServer.exe
DisplayXvfb (headless)Xvfb (headless)
MemoryJemalloc preloadedJemalloc preloaded
Wine fsyncenablednot supported
Inittini (PID 1)tini (PID 1)
Stop signalSIGTERM, up to 75s gracefulSIGTERM, up to 75s graceful

Both launch the game with -batchmode -nographics. Crash detection watches for Disconnected from chat with reason DisconnectByClientLogic, Fatal error, Segmentation fault, Stack overflow, OutOfMemoryException, Application will be terminated and Crash!!!, alongside exit codes. State persists in /aska-saves/.last_crash.

⁠Tags

TagDescription
unstableDebian 13 + Proton-GE.
experimentalAlpine + musl-native Wine.

⁠Acknowledgements



⁠License

MIT. Not affiliated with Sand Sailor Studio or Valve.

Last Updated: 2026-09-05 Image Versions: unstable 0.2.1 · experimental 0.2.1

Maintainer: jimbit

Tag summary

Content type

Image

Digest

sha256:95f35a478…

Size

256.5 MB

Last updated

about 1 month ago

docker pull jimbit0/aska-dedicated-server:experimental