feat: rewrite Docker setup on umu-launcher with health checks and permission fixes
Rewrite the Docker image and manager to match the native
ark_instance_manager.sh, based on umu-launcher 1.4.0 and pinned
GE-Proton10-34.
Dockerfile:
- Use umu-launcher 1.4.0 zipapp instead of raw Proton binary
- Pin GE-Proton10-34 (GE-Proton11-1 has a known ASA boot hang
during static import resolution) - Run steamcmd +quit during build to pre-download steamclient.so
- Add libzstd1 (umu dependency) and procps (health checks)
- Make /opt/steamcmd world-writable for non-root operation
entrypoint.sh:
- Rewrite to use umu-run instead of direct proton invocation
- Add Wine 10 compatibility fixes: disable Sentry plugin, write
steam_appid.txt (AppID 2430930), symlink Steam SDK to steamclient.so - Track prefix Proton version, recreate prefix on mismatch
- Add first-run prefix init with clear bwrap error message when
user namespaces are restricted on the host - Consume UMASK env (default 0007) so files created in bind
mounts are group-writable - Set PROTON_VERB=run for multi-process prefix compatibility
- Restore group-write after steamcmd validate resets permissions
ark_docker_manager.sh:
- Add 30s pgrep health check + 15s stability verification
- Add graceful shutdown via RCON DoExit with 120s timeout
- Add --security-opt seccomp=unconfined,apparmor=unconfined for
bwrap/pressure-vessel inside Docker - Run update container with --user to prevent root-owned files
- Use incremental SETGID + group-write setup (find -exec) on
host dirs so multiple users can manage the same install - Fix cluster parameters: bash array instead of escaped-quote string
- Add signal trap so Ctrl-C leaves running containers unaffected
- Add check_userns_restriction() with fix instructions
- Mount umu-data volume for persistent Steam Runtime cache
- Write launch command to server.log for diagnostics
- Resolve all UID/GID values dynamically via id/getent