aboutsummaryrefslogtreecommitdiff
path: root/docker/dedicated-server/entrypoint.sh
diff options
context:
space:
mode:
Diffstat (limited to 'docker/dedicated-server/entrypoint.sh')
-rw-r--r--docker/dedicated-server/entrypoint.sh78
1 files changed, 77 insertions, 1 deletions
diff --git a/docker/dedicated-server/entrypoint.sh b/docker/dedicated-server/entrypoint.sh
index a8f8907a..26b40da9 100644
--- a/docker/dedicated-server/entrypoint.sh
+++ b/docker/dedicated-server/entrypoint.sh
@@ -30,6 +30,65 @@ ensure_persist_file() {
ln -sfn "${persist_path}" "${runtime_path}"
}
+wait_for_xvfb_ready() {
+ local display="$1"
+ local xvfb_pid="$2"
+ local wait_seconds="${XVFB_WAIT_SECONDS:-10}"
+ local wait_ticks=$((wait_seconds * 10))
+ local display_number="${display#:}"
+ display_number="${display_number%%.*}"
+
+ if [ -z "${display_number}" ] || ! [[ "${display_number}" =~ ^[0-9]+$ ]]; then
+ echo "[error] Invalid DISPLAY format for Xvfb wait: ${display}" >&2
+ return 1
+ fi
+
+ local socket_path="/tmp/.X11-unix/X${display_number}"
+ local elapsed=0
+
+ while [ "${elapsed}" -lt "${wait_ticks}" ]; do
+ if ! kill -0 "${xvfb_pid}" 2>/dev/null; then
+ echo "[error] Xvfb exited before the display became ready." >&2
+ if [ -f /tmp/xvfb.log ]; then
+ echo "[error] ---- /tmp/xvfb.log ----" >&2
+ tail -n 200 /tmp/xvfb.log >&2 || true
+ echo "[error] ----------------------" >&2
+ fi
+ return 1
+ fi
+
+ if [ -S "${socket_path}" ]; then
+ # Keep a short extra delay so Wine does not race display handshake.
+ sleep 0.2
+ if kill -0 "${xvfb_pid}" 2>/dev/null && [ -S "${socket_path}" ]; then
+ return 0
+ fi
+ fi
+
+ # One more liveness check after the ready probe branch.
+ if ! kill -0 "${xvfb_pid}" 2>/dev/null; then
+ echo "[error] Xvfb exited during display readiness probe." >&2
+ if [ -f /tmp/xvfb.log ]; then
+ echo "[error] ---- /tmp/xvfb.log ----" >&2
+ tail -n 200 /tmp/xvfb.log >&2 || true
+ echo "[error] ----------------------" >&2
+ fi
+ return 1
+ fi
+
+ sleep 0.1
+ elapsed=$((elapsed + 1))
+ done
+
+ echo "[error] Timed out waiting for Xvfb display ${display}." >&2
+ if [ -f /tmp/xvfb.log ]; then
+ echo "[error] ---- /tmp/xvfb.log ----" >&2
+ tail -n 200 /tmp/xvfb.log >&2 || true
+ echo "[error] ----------------------" >&2
+ fi
+ return 1
+}
+
if [ ! -d "$SERVER_DIR" ]; then
echo "[error] Server directory not found: $SERVER_DIR" >&2
exit 1
@@ -78,8 +137,25 @@ fi
if [ -z "${DISPLAY:-}" ]; then
export DISPLAY="${XVFB_DISPLAY:-:99}"
XVFB_SCREEN="${XVFB_SCREEN:-64x64x16}"
+ DISPLAY_NUMBER="${DISPLAY#:}"
+ DISPLAY_NUMBER="${DISPLAY_NUMBER%%.*}"
+ if [ -z "${DISPLAY_NUMBER}" ] || ! [[ "${DISPLAY_NUMBER}" =~ ^[0-9]+$ ]]; then
+ echo "[error] Invalid XVFB_DISPLAY format: ${DISPLAY}" >&2
+ exit 1
+ fi
+ XVFB_SOCKET="/tmp/.X11-unix/X${DISPLAY_NUMBER}"
+ XVFB_LOCK="/tmp/.X${DISPLAY_NUMBER}-lock"
+ # The check is performed assuming the same container will be restarted.
+ if [ -S "${XVFB_SOCKET}" ] || [ -e "${XVFB_LOCK}" ]; then
+ echo "[warn] Removing stale Xvfb state for ${DISPLAY} before startup." >&2
+ rm -f "${XVFB_SOCKET}" "${XVFB_LOCK}"
+ fi
Xvfb "${DISPLAY}" -nolisten tcp -screen 0 "${XVFB_SCREEN}" >/tmp/xvfb.log 2>&1 &
- sleep 0.2
+ XVFB_PID=$!
+ wait_for_xvfb_ready "${DISPLAY}" "${XVFB_PID}"
+ echo "[info] Xvfb ready on ${DISPLAY} (pid=${XVFB_PID}, screen=${XVFB_SCREEN})"
+else
+ echo "[info] Using existing DISPLAY=${DISPLAY}; skipping Xvfb startup"
fi
args=(