fix acc server container restarting

This commit is contained in:
2026-03-19 19:23:33 +01:00
parent 99d7e5fdc9
commit 21265a649b
4 changed files with 28 additions and 19 deletions

View File

@@ -12,8 +12,8 @@ services:
PLATFORM: docker PLATFORM: docker
DB_NAME: /data/db/acc.db DB_NAME: /data/db/acc.db
STEAMCMD_LINUX_PATH: /usr/games/steamcmd STEAMCMD_LINUX_PATH: /usr/games/steamcmd
PORT_POOL_MIN: "9600" PORT_POOL_MIN: "9601"
PORT_POOL_MAX: "9700" PORT_POOL_MAX: "9699"
ACC_IMAGE: acc-wine:latest ACC_IMAGE: acc-wine:latest
ACC_SERVERS_PATH: /data/servers ACC_SERVERS_PATH: /data/servers
ACC_SERVERS_HOST_PATH: /opt/acc-servers ACC_SERVERS_HOST_PATH: /opt/acc-servers

View File

@@ -15,10 +15,9 @@ RUN dpkg --add-architecture i386 && \
&& \ && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Create a non-root user for running the server. RUN mkdir -p /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix
RUN useradd -ms /bin/bash accserver
WORKDIR /home/accserver WORKDIR /root
# Copy entrypoint script. # Copy entrypoint script.
COPY entrypoint.sh /entrypoint.sh COPY entrypoint.sh /entrypoint.sh
@@ -30,10 +29,8 @@ VOLUME ["/acc/game"]
# Default server port — overridden at runtime via SERVER_PORT env var. # Default server port — overridden at runtime via SERVER_PORT env var.
ENV SERVER_PORT=9600 ENV SERVER_PORT=9600
ENV WINEDEBUG=-all ENV WINEDEBUG=-all
ENV DISPLAY=:99
EXPOSE ${SERVER_PORT}/tcp EXPOSE ${SERVER_PORT}/tcp
EXPOSE ${SERVER_PORT}/udp EXPOSE ${SERVER_PORT}/udp
USER accserver
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]

View File

@@ -1,7 +1,15 @@
#!/bin/bash #!/bin/bash
set -e 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=$! XVFB_PID=$!
cleanup() { cleanup() {
@@ -10,7 +18,9 @@ cleanup() {
} }
trap cleanup SIGTERM SIGINT trap cleanup SIGTERM SIGINT
mkdir -p /acc/game/log
echo "Starting ACC server on port ${SERVER_PORT}..." echo "Starting ACC server on port ${SERVER_PORT}..."
exec wine /acc/game/accServer.exe \ cd /acc/game
-port "${SERVER_PORT}" exec wine /acc/game/accServer.exe

View File

@@ -33,23 +33,25 @@ func NewDockerRuntime(client *dockerclient.Client, repo *repository.ServerReposi
func (r *DockerRuntime) Create(ctx context.Context, server *model.Server) error { func (r *DockerRuntime) Create(ctx context.Context, server *model.Server) error {
image := env.GetACCImage() image := env.GetACCImage()
portStr := strconv.Itoa(server.Port) tcpPortStr := strconv.Itoa(server.Port)
natPort, err := nat.NewPort("tcp", portStr) udpPortStr := strconv.Itoa(server.Port - 1)
natTCP, err := nat.NewPort("tcp", tcpPortStr)
if err != nil { 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 { 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{ portBindings := nat.PortMap{
natPort: []nat.PortBinding{{HostPort: portStr}}, natTCP: []nat.PortBinding{{HostPort: tcpPortStr}},
natPortUDP: []nat.PortBinding{{HostPort: portStr}}, natUDP: []nat.PortBinding{{HostPort: udpPortStr}},
} }
exposedPorts := nat.PortSet{ exposedPorts := nat.PortSet{
natPort: struct{}{}, natTCP: struct{}{},
natPortUDP: struct{}{}, natUDP: struct{}{},
} }
containerBase := env.GetACCServersPath() containerBase := env.GetACCServersPath()