# Genesis 게임 서버 + 포트폴리오 사이트 — 리눅스 컨테이너 이미지
#
# 빌드 컨텍스트는 저장소 루트다. (Dockerfile 이 루트에 있으므로 `docker build .`)
#
#   docker build -t genesis-gameserver .
#   docker run -d --name genesis -p 5281:8080 genesis-gameserver
#
# 주의: 업로드된 이미지는 /app/wwwroot/uploads 에 쌓인다.
#       볼륨으로 빼 두지 않으면 컨테이너를 새로 만들 때 전부 사라진다.

# ─────────────────────────────────────────────────────────────
# 1단계 — 빌드
#   프로젝트가 net9.0 을 대상으로 하므로 SDK 9 이미지를 쓴다.
# ─────────────────────────────────────────────────────────────
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src

# csproj 만 먼저 복사해 restore 한다.
# 소스만 바뀐 경우 이 레이어가 캐시되어 재빌드가 빨라진다.
COPY GameServer/GameServer.csproj GameServer/
RUN dotnet restore GameServer/GameServer.csproj

COPY . .
RUN dotnet publish GameServer/GameServer.csproj \
    -c Release \
    -o /app/publish \
    -p:UseAppHost=false

# ─────────────────────────────────────────────────────────────
# 2단계 — 실행
# ─────────────────────────────────────────────────────────────
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final
WORKDIR /app

COPY --from=build /app/publish .

# 업로드 폴더를 만들고 비루트 사용자(app, UID 1654)에게 쓰기 권한을 준다.
# 호스트 폴더를 마운트할 때도 같은 UID 로 맞춰야 한다. (README 참고)
RUN mkdir -p /app/wwwroot/uploads && chown -R app:app /app/wwwroot/uploads

# 마운트를 잊어도 최소한 컨테이너 수명 동안은 동작하도록 볼륨을 선언해 둔다.
VOLUME ["/app/wwwroot/uploads"]

# .NET 8 부터 컨테이너 기본 포트는 8080 이다. (루트 권한이 필요 없는 포트)
ENV ASPNETCORE_HTTP_PORTS=8080 \
    ASPNETCORE_ENVIRONMENT=Production \
    DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
EXPOSE 8080

USER app
ENTRYPOINT ["dotnet", "GameServer.dll"]
