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
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

View File

@@ -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"]

View File

@@ -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

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 {
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()