# SXTVIP 游戏服务器管理系统 — 通用 Docker 镜像（0.9.47 起，第 4 个发布形态）
#
# 与 fnOS 容器版同源同构：跑同一份无头核心（core.js/server.js/src + platform-shim +
# headless-main），通过 GSM_PLATFORM=docker 走 Docker 专属适配（自更新引导 compose 重建、
# 穿透引导手动放 Linux 二进制、端口由 compose 映射决定）。
#
# 基础镜像选 Debian(bookworm)-slim 而非 Alpine：
#   SteamCMD 与各游戏 Linux 专用服务端都是 glibc 链接的二进制，Alpine 的 musl 无法直接运行；
#   SteamCMD 本体还依赖 32 位运行库。故用 glibc 系 + lib32gcc。
FROM node:22-bookworm-slim

LABEL org.opencontainers.image.title="SXTVIP游戏服务器管理系统（Docker 版）" \
      org.opencontainers.image.description="游戏市场一键创建、服务器一键启停、实时监控、存档备份、多用户与权限、日志控制台" \
      org.opencontainers.image.version="0.9.51" \
      org.opencontainers.image.vendor="冰霜蘑菇"

# 容器内固定环境变量；对外端口由 compose 的 ${WEB_PORT} 映射
ENV GSM_DATA_DIR=/data \
    GSM_INSTALL_DIR=/app/install \
    GSM_HOST=0.0.0.0 \
    GSM_WEB_PORT=5680 \
    GSM_PLATFORM=docker \
    NODE_ENV=production \
    LANG=en_US.UTF-8 \
    LC_ALL=en_US.UTF-8 \
    TZ=Asia/Shanghai

# 运行时依赖（与 fnOS 容器版一致）：
#   tini 做 PID1 转发信号；gosu 降权；locales 生成 en_US.UTF-8 消除 SteamCMD 的 setlocale 警告；
#   lib32gcc-s1/libc6-i386 供 SteamCMD；其余为常见游戏服务端的运行库。
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        ca-certificates curl wget tar gzip procps tini gosu locales \
        lib32gcc-s1 libc6-i386 \
        libcurl4 libsdl2-2.0-0 libicu72 \
        libgl1 libglu1-mesa libx11-6 libstdc++6 \
        iproute2 iputils-ping netcat-openbsd; \
    sed -i 's/^# *en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen; \
    locale-gen; \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 应用代码（零运行时 npm 依赖，全部使用 Node 内置模块，故不装 node_modules）
COPY app/ /app/

RUN mkdir -p /app/install /data && chmod +x /app/entrypoint.sh

EXPOSE 5680

HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
    CMD curl -fsS http://127.0.0.1:5680/api/health || exit 1

ENTRYPOINT ["/usr/bin/tini", "--", "/app/entrypoint.sh"]
