From 4441524447364ce099254bc1b0a87101f7dd6d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Jurmanovi=C4=87?= Date: Thu, 19 Mar 2026 19:23:33 +0100 Subject: [PATCH] fix acc server container restarting --- docker-compose.yml | 4 ++-- docker/acc-server/Dockerfile | 7 ++----- docker/acc-server/entrypoint.sh | 16 +++++++++++++--- local/service/docker_runtime.go | 20 +++++++++++--------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 82f653a..6ac7862 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,8 @@ services: PLATFORM: docker DB_NAME: /data/db/acc.db STEAMCMD_LINUX_PATH: /usr/games/steamcmd - PORT_POOL_MIN: "9600" - PORT_POOL_MAX: "9700" + PORT_POOL_MIN: "9601" + PORT_POOL_MAX: "9699" ACC_IMAGE: acc-wine:latest ACC_SERVERS_PATH: /data/servers ACC_SERVERS_HOST_PATH: /opt/acc-servers diff --git a/docker/acc-server/Dockerfile b/docker/acc-server/Dockerfile index 861bdb2..47e0bd0 100644 --- a/docker/acc-server/Dockerfile +++ b/docker/acc-server/Dockerfile @@ -15,10 +15,9 @@ RUN dpkg --add-architecture i386 && \ && \ rm -rf /var/lib/apt/lists/* -# Create a non-root user for running the server. -RUN useradd -ms /bin/bash accserver +RUN mkdir -p /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix -WORKDIR /home/accserver +WORKDIR /root # Copy entrypoint script. COPY entrypoint.sh /entrypoint.sh @@ -30,10 +29,8 @@ VOLUME ["/acc/game"] # Default server port — overridden at runtime via SERVER_PORT env var. ENV SERVER_PORT=9600 ENV WINEDEBUG=-all -ENV DISPLAY=:99 EXPOSE ${SERVER_PORT}/tcp EXPOSE ${SERVER_PORT}/udp -USER accserver ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/acc-server/entrypoint.sh b/docker/acc-server/entrypoint.sh index f3ce7f0..67d6e1b 100644 --- a/docker/acc-server/entrypoint.sh +++ b/docker/acc-server/entrypoint.sh @@ -1,7 +1,15 @@ #!/bin/bash set -e -Xvfb :99 -screen 0 1024x768x16 & +# Use a display number derived from the server port to avoid conflicts +# between containers (each server gets its own unique display). +DISPLAY_NUM=$((SERVER_PORT % 1000 + 100)) +export DISPLAY=:${DISPLAY_NUM} + +# Clean up any stale X lock from a previous container run. +rm -f /tmp/.X${DISPLAY_NUM}-lock /tmp/.X11-unix/X${DISPLAY_NUM} 2>/dev/null || true + +Xvfb ${DISPLAY} -screen 0 1024x768x16 -nolisten tcp & XVFB_PID=$! cleanup() { @@ -10,7 +18,9 @@ cleanup() { } trap cleanup SIGTERM SIGINT +mkdir -p /acc/game/log + echo "Starting ACC server on port ${SERVER_PORT}..." -exec wine /acc/game/accServer.exe \ - -port "${SERVER_PORT}" +cd /acc/game +exec wine /acc/game/accServer.exe diff --git a/local/service/docker_runtime.go b/local/service/docker_runtime.go index b129666..7ecd23d 100644 --- a/local/service/docker_runtime.go +++ b/local/service/docker_runtime.go @@ -33,23 +33,25 @@ func NewDockerRuntime(client *dockerclient.Client, repo *repository.ServerReposi func (r *DockerRuntime) Create(ctx context.Context, server *model.Server) error { image := env.GetACCImage() - portStr := strconv.Itoa(server.Port) - natPort, err := nat.NewPort("tcp", portStr) + tcpPortStr := strconv.Itoa(server.Port) + udpPortStr := strconv.Itoa(server.Port - 1) + + natTCP, err := nat.NewPort("tcp", tcpPortStr) if err != nil { - return fmt.Errorf("invalid port %d: %v", server.Port, err) + return fmt.Errorf("invalid tcp port %d: %v", server.Port, err) } - natPortUDP, err := nat.NewPort("udp", portStr) + natUDP, err := nat.NewPort("udp", udpPortStr) if err != nil { - return fmt.Errorf("invalid udp port %d: %v", server.Port, err) + return fmt.Errorf("invalid udp port %d: %v", server.Port-1, err) } portBindings := nat.PortMap{ - natPort: []nat.PortBinding{{HostPort: portStr}}, - natPortUDP: []nat.PortBinding{{HostPort: portStr}}, + natTCP: []nat.PortBinding{{HostPort: tcpPortStr}}, + natUDP: []nat.PortBinding{{HostPort: udpPortStr}}, } exposedPorts := nat.PortSet{ - natPort: struct{}{}, - natPortUDP: struct{}{}, + natTCP: struct{}{}, + natUDP: struct{}{}, } containerBase := env.GetACCServersPath()