diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9e03c48 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,32 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.DS_Store +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose.y*ml +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dd2db9c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,68 @@ +# syntax=docker/dockerfile:1 + +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Dockerfile reference guide at +# https://docs.docker.com/go/dockerfile-reference/ + +# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7 + +################################################################################ + +# Learn about building .NET container images: +# https://github.com/dotnet/dotnet-docker/blob/main/samples/README.md + +# Create a stage for building the application. +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build + +COPY . /source + +WORKDIR /source/SCHALE.GameServer + +# This is the architecture you’re building for, which is passed in by the builder. +# Placing it here allows the previous steps to be cached across architectures. +ARG TARGETARCH + +# Build the application. +# Leverage a cache mount to /root/.nuget/packages so that subsequent builds don't have to re-download packages. +# If TARGETARCH is "amd64", replace it with "x64" - "x64" is .NET's canonical name for this and "amd64" doesn't +# work in .NET 6.0. +RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \ + dotnet publish -a ${TARGETARCH/amd64/x64} --use-current-runtime --self-contained false -p:DefineConstants=DOCKER_BUILD -p:InvariantGlobalization=false -o /app + +# If you need to enable globalization and time zones: +# https://github.com/dotnet/dotnet-docker/blob/main/samples/enable-globalization.md +################################################################################ +# Create a new stage for running the application that contains the minimal +# runtime dependencies for the application. This often uses a different base +# image from the build stage where the necessary files are copied from the build +# stage. +# +# The example below uses an aspnet alpine image as the foundation for running the app. +# It will also use whatever happens to be the most recent version of that tag when you +# build your Dockerfile. If reproducability is important, consider using a more specific +# version (e.g., aspnet:7.0.10-alpine-3.18), +# or SHA (e.g., mcr.microsoft.com/dotnet/aspnet@sha256:f3d99f54d504a21d38e4cc2f13ff47d67235efeeb85c109d3d1ff1808b38d034). +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS final + +ENV \ + DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false \ + LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 + +RUN apk add --no-cache \ + curl \ + krb5-libs \ + icu-data-full \ + icu-libs + +WORKDIR /app + +# Copy everything needed to run the app from the "build" stage. +COPY --from=build /app . + +# Switch to a non-privileged user (defined in the base image) that the app will run under. +# See https://docs.docker.com/go/dockerfile-user-best-practices/ +# and https://github.com/dotnet/dotnet-docker/discussions/4764 +USER $APP_UID + +ENTRYPOINT ["dotnet", "SCHALE.GameServer.dll"] diff --git a/SCHALE.GameServer/Controllers/Api/GatewayController.cs b/SCHALE.GameServer/Controllers/Api/GatewayController.cs index 5b8ba0f..744410a 100644 --- a/SCHALE.GameServer/Controllers/Api/GatewayController.cs +++ b/SCHALE.GameServer/Controllers/Api/GatewayController.cs @@ -6,7 +6,6 @@ using System.IO.Compression; using System.Text; using System.Text.Json; using System.Text.Json.Nodes; -using Serilog; using System.Text.Json.Serialization; namespace SCHALE.GameServer.Controllers.Api @@ -14,13 +13,13 @@ namespace SCHALE.GameServer.Controllers.Api [Route("/api/[controller]")] public class GatewayController : ControllerBase { - static JsonSerializerOptions jsonOptions = new() // ignore null or fields not set, if this breaks anything, remove it, idk if it does but it makes the pcap logs look more readable + private readonly static JsonSerializerOptions jsonOptions = new() // ignore null or fields not set, if this breaks anything, remove it, idk if it does but it makes the pcap logs look more readable { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, }; - IProtocolHandlerFactory protocolHandlerFactory; - ILogger logger; + private readonly IProtocolHandlerFactory protocolHandlerFactory; + private readonly ILogger logger; public GatewayController(IProtocolHandlerFactory _protocolHandlerFactory, ILogger _logger) { @@ -96,7 +95,7 @@ namespace SCHALE.GameServer.Controllers.Api protocolErrorRet: return Results.Json(new { - packet = JsonSerializer.Serialize(new ErrorPacket() { Reason = "Protocol not implemented (Server Error)", ErrorCode = WebAPIErrorCode.InternalServerError }, jsonOptions), + packet = JsonSerializer.Serialize(new ErrorPacket() { Reason = "Protocol not implemented (Server Error)", ErrorCode = WebAPIErrorCode.ServerFailedToHandleRequest }, jsonOptions), protocol = Protocol.Error.ToString() }); } diff --git a/SCHALE.GameServer/GameServer.cs b/SCHALE.GameServer/GameServer.cs index 258a73c..777eb7f 100644 --- a/SCHALE.GameServer/GameServer.cs +++ b/SCHALE.GameServer/GameServer.cs @@ -20,8 +20,8 @@ namespace SCHALE.GameServer var config = new ConfigurationBuilder() .SetBasePath(Path.GetDirectoryName(AppContext.BaseDirectory)!) .AddJsonFile("appsettings.json") - .AddJsonFile("appsettings.Local.json", true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true) + .AddJsonFile("appsettings.Local.json", true) .Build(); { diff --git a/SCHALE.GameServer/appsettings.Docker.json b/SCHALE.GameServer/appsettings.Docker.json new file mode 100644 index 0000000..0d673bb --- /dev/null +++ b/SCHALE.GameServer/appsettings.Docker.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "SQLServer": "data source=db;User=sa;Password=5CH41364M353rV3r;initial catalog=schale;trusted_connection=false;TrustServerCertificate=True" + } +} diff --git a/SCHALE.GameServer/appsettings.json b/SCHALE.GameServer/appsettings.json index b25dd22..5d0385f 100644 --- a/SCHALE.GameServer/appsettings.json +++ b/SCHALE.GameServer/appsettings.json @@ -3,9 +3,6 @@ "EndPoints": { "Http": { "Url": "http://0.0.0.0:80" - }, - "Https": { - "Url": "https://0.0.0.0:443" } } }, diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..a7720ae --- /dev/null +++ b/compose.yaml @@ -0,0 +1,67 @@ +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Docker Compose reference guide at +# https://docs.docker.com/go/compose-spec-reference/ + +# Here the instructions define your application as a service called "server". +# This service is built from the Dockerfile in the current directory. +# You can add other services your application may depend on here, such as a +# database or a cache. For examples, see the Awesome Compose repository: +# https://github.com/docker/awesome-compose +services: + server: + environment: + - ASPNETCORE_ENVIRONMENT=Docker + depends_on: + - db + build: + context: . + target: final + ports: + - 80:80 + + db: + image: mcr.microsoft.com/mssql/server + environment: + SA_PASSWORD: "5CH41364M353rV3r" + ACCEPT_EULA: "Y" + restart: always + healthcheck: + test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 5CH41364M353rV3r -Q 'SELECT 1' || exit 1"] + interval: 20s + retries: 10 + start_period: 20s + timeout: 3s + +# The commented out section below is an example of how to define a PostgreSQL +# database that your application can use. `depends_on` tells Docker Compose to +# start the database before your application. The `db-data` volume persists the +# database data between container restarts. The `db-password` secret is used +# to set the database password. You must create `db/password.txt` and add +# a password of your choosing to it before running `docker compose up`. +# depends_on: +# db: +# condition: service_healthy +# db: +# image: postgres +# restart: always +# user: postgres +# secrets: +# - db-password +# volumes: +# - db-data:/var/lib/postgresql/data +# environment: +# - POSTGRES_DB=example +# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password +# expose: +# - 5432 +# healthcheck: +# test: [ "CMD", "pg_isready" ] +# interval: 10s +# timeout: 5s +# retries: 5 +# volumes: +# db-data: +# secrets: +# db-password: +# file: db/password.txt +