diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..1f5ce823 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,102 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "main", "nightly" ] + pull_request: + branches: [ "main" ] + schedule: + - cron: '29 15 * * 5' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + - language: go + build-mode: autobuild + - language: javascript-typescript + build-mode: none + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/docker-publish.yml.disabled b/.github/workflows/docker-publish.yml.disabled deleted file mode 100644 index 11e91296..00000000 --- a/.github/workflows/docker-publish.yml.disabled +++ /dev/null @@ -1,64 +0,0 @@ -name: Build and Publish Docker Image - -on: - push: - branches: - - '**' - pull_request: - types: [closed] - -env: - REPO_OWNER: ${{ github.repository_owner }} - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Set environment variables - run: echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - - - name: Build Docker image - uses: docker/build-push-action@v2 - with: - context: . - push: false - tags: ghcr.io/${{ env.REPO_OWNER }}/stationeers-server-ui:latest - - publish: - if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main' - needs: build - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Set environment variables - run: echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - - - name: Log in to GitHub Container Registry - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push Docker image - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ghcr.io/${{ env.REPO_OWNER }}/stationeers-server-ui:latest - - - name: Log out from GitHub Container Registry - run: docker logout ghcr.io \ No newline at end of file diff --git a/.github/workflows/ghcr-build-nightly.yaml b/.github/workflows/ghcr-build-nightly.yaml new file mode 100644 index 00000000..302364ad --- /dev/null +++ b/.github/workflows/ghcr-build-nightly.yaml @@ -0,0 +1,59 @@ +name: Build and Push Nightly Image + +on: + push: + branches: ["nightly"] + +env: + REGISTRY: ghcr.io + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Fetch all history for all tags and branches + + - name: Lowercase the repo name + run: | + echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=nightly + flavor: | + latest=false + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/ghcr-build-release.yaml b/.github/workflows/ghcr-build-release.yaml new file mode 100644 index 00000000..43e3df7e --- /dev/null +++ b/.github/workflows/ghcr-build-release.yaml @@ -0,0 +1,58 @@ +name: Build and Push Release Image + +on: + push: + tags: ["v*"] + +env: + REGISTRY: ghcr.io + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Fetch all history for all tags and branches + + - name: Lowercase the repo name + run: | + echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=semver,pattern={{version}} + type=raw,value=latest + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 747b3a62..e4406cab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,66 @@ -FROM debian:12-slim AS runner +############### +# Frontend build +############### +FROM node:24-bookworm-slim AS frontend-builder + +WORKDIR /src/frontend + +# Only copy frontend to leverage Docker layer caching for npm install +COPY ./frontend/package.json ./frontend/package-lock.json* ./ +RUN npm install + +COPY ./frontend/ ./ +# Build Svelte UI into ../UIMod/onboard_bundled/v2 (as configured in vite.config.js) +RUN npm run build + +############ +# Go build +############ +FROM golang:1.25-bookworm AS go-builder + +WORKDIR /src + +# Pre-copy go.mod and go.sum for better caching +COPY ./go.mod ./go.sum ./ +RUN go mod download + +COPY . ./ + +COPY --from=frontend-builder /src/UIMod /src/UIMod + +# Build the server (embed will include UIMod/* at build time) +RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /out/StationeersServerControl ./server.go + +############ +# Runtime +############ +FROM debian:13-slim AS runner -# Set the working directory inside the container WORKDIR /app -# Copy the rest of the application source code -COPY ./build/StationeersServerControl*.x86_64 /app/StationeersServerControl -COPY ./LICENSE /app/LICENSE -RUN chmod +x /app/StationeersServerControl +ENV HOME=/app +# Minimal runtime dependencies. SteamCMD needs 32-bit runtime. RUN dpkg --add-architecture i386 \ && apt-get update -y \ - && apt-get install -y --no-install-recommends ca-certificates locales lib32gcc-s1 file + && apt-get install -y --no-install-recommends \ + ca-certificates \ + locales \ + lib32gcc-s1 \ + file \ + && rm -rf /var/lib/apt/lists/* + +RUN useradd -m -d /app -s /bin/sh app + +# Copy compiled binary and license +COPY --from=go-builder /out/StationeersServerControl /usr/local/bin/StationeersServerControl +COPY ./LICENSE /app/LICENSE +RUN chmod +x /usr/local/bin/StationeersServerControl -# Verify that the executable was copied and renamed successfully -RUN echo "Verifying the copied and renamed StationeersServerControl executable:" && \ - if ls -l /app/StationeersServerControl; then \ - echo "StationeersServerControl copy and rename successful."; \ - else \ - echo "Error: StationeersServerControl executable not found after copy."; \ - exit 1; \ - fi +RUN chown -R app:app /app -# Expose the ports -EXPOSE 8443 27016 27015 +USER app -# Set the entrypoint to the application -ENTRYPOINT ["/app/StationeersServerControl"] +EXPOSE 8443/tcp 27016/udp 27015/udp -# Provide default arguments to the entrypoint -CMD [] \ No newline at end of file +ENTRYPOINT ["/usr/local/bin/StationeersServerControl"] diff --git a/UIMod/onboard_bundled/localization/de-DE.json b/UIMod/onboard_bundled/localization/de-DE.json index 5ec5abd6..eb1f2454 100644 --- a/UIMod/onboard_bundled/localization/de-DE.json +++ b/UIMod/onboard_bundled/localization/de-DE.json @@ -26,7 +26,6 @@ "UIText_BasicSettings": "Basis", "UIText_NetworkSettings": "Netzwerk", "UIText_AdvancedSettings": "Erweitert", - "UIText_BetaSettings": "Beta", "basic": { "UIText_BasicServerSettings": "Grundlegende Servereinstellungen", "UIText_ServerName": "Servername", @@ -78,11 +77,7 @@ "UIText_GameBranch": "Spiel Branch", "UIText_GameBranchInfo": "Branch des Spiels. Bei Änderung SSUI Neustart erforderlich!" }, - "beta": { - "UIText_BetaOnlySettings": "NUR BETA: NEUE TERRAIN UND SPEICHERSYSTEM EINSTELLUNGEN", - "UIText_BetaWarning": "Diese Einstellungen sind nur nützlich bei Stationeers Dedicated Server Beta. Wechsel möglich unter Erweiterte Einstellungen -> Spiel Branch. Alte Speicherstände NICHT kompatibel, aber migrierbar mit JacksonTheMaster's Migration Tool. \"How to\" Infos im FAQ gelten auch für Dedicated Server.", - "UIText_UseNewTerrainAndSave": "Neues Terrain- und Speichersystem Nutzen", - "UIText_UseNewTerrainAndSaveInfo": "Auf TRUE setzen für .save Dateien im Backup Manager und Argument-Parsing. Bei false funktionieren nur Stationeers Versionen vor Terrain-Überarbeitung (≈ Mitte 2025). Standard false bis neues System veröffentlicht.", + "terrain": { "UIText_Difficulty": "Schwierigkeit", "UIText_DifficultyInfo": "Schwierigkeit für Welterstellung. Standard Normal wenn leer.", "UIText_StartCondition": "Startbedingung", @@ -177,7 +172,6 @@ "UIText_GameBranch_SkipButton": "Release Version nutzen", "UIText_NewTerrainAndSaveSystem_Title": "Wichtig", "UIText_NewTerrainAndSaveSystem_HeaderTitle": "Terrainsystem wählen", - "UIText_NewTerrainAndSaveSystem_StepMessage": "Gerade zu Beta gewechselt? Terrain- und Speichersystem umschalten! 'ja' eingeben zum Aktivieren oder 'nein' zum Deaktivieren.", "UIText_NewTerrainAndSaveSystem_PrimaryPlaceholder": "nein", "UIText_NewTerrainAndSaveSystem_PrimaryLabel": "Neues System aktivieren", "UIText_NewTerrainAndSaveSystem_SubmitButton": "Speichern & Weiter", diff --git a/UIMod/onboard_bundled/localization/en-US.json b/UIMod/onboard_bundled/localization/en-US.json index 4e0b9806..b41e566c 100644 --- a/UIMod/onboard_bundled/localization/en-US.json +++ b/UIMod/onboard_bundled/localization/en-US.json @@ -26,7 +26,7 @@ "UIText_BasicSettings": "Basic Settings", "UIText_NetworkSettings": "Network Settings", "UIText_AdvancedSettings": "Advanced Settings", - "UIText_BetaSettings": "Beta Settings", + "UIText_TerrainSettings": "New Terrain", "basic": { "UIText_BasicServerSettings": "Basic Server Settings", "UIText_ServerName": "Server Name", @@ -80,11 +80,11 @@ "UIText_AllowAutoGameServerUpdates": "Enable Auto Game Server Updates", "UIText_AllowAutoGameServerUpdatesInfo": "Allow the gameserver to automatically query for and update to the latest version. Attention: Restarts the server when a new version was found and installed. Will send multiple warning messages to the sever with SAY commands 60-10 seconds before the restart." }, - "beta": { - "UIText_BetaOnlySettings": "BETA ONLY: NEW TERRAIN AND SAVE SYSTEM SETTINGS", - "UIText_BetaWarning": "These settings are only useful if you are running the Stationeers Dedicated Server Beta. Switching is possible from Advanced Settings -> Game Branch. Old savegames are NOT compatible with the new system, but can be migrated with JacksonTheMaster's Migration tool.. Related \"how to\" Information on the FAQ there also applies to the Dedicated Server.", + "terrain": { + "UIText_TerrainSettingsHeader": "NEW TERRAIN AND SAVE SYSTEM SETTINGS", + "UIText_TerrainWarning": "These settings are only useful if you are running a Stationeers build NEWER than September 2025. Old savegames are NOT compatible with the new system, but can be migrated with JacksonTheMaster's Migration tool.. Related \"how to\" Information on the FAQ there also applies to the Dedicated Server.", "UIText_UseNewTerrainAndSave": "Use New Terrain and Save System", - "UIText_UseNewTerrainAndSaveInfo": "Set to TRUE to enable handling of .save files in the Backup manager and argument parsing. If set to false, only Stationeers versions before the terrain rework (≈ mid 2025) will work. Defaults to false until new Stationeers Terrain and Save System is released.", + "UIText_UseNewTerrainAndSaveInfo": "Set to TRUE to enable handling of .save files in the Backup manager and argument parsing. If set to false, only Stationeers versions before the terrain rework (≈ mid 2025) will work. Defaults to TRUE!", "UIText_Difficulty": "Difficulty", "UIText_DifficultyInfo": "Difficulty to create the world with. Defaults to Normal if empty.", "UIText_StartCondition": "Start Condition", @@ -176,8 +176,8 @@ "UIText_GameBranch_SkipButton": "Use Normal Version", "UIText_NewTerrainAndSaveSystem_Title": "IMPORTANT", "UIText_NewTerrainAndSaveSystem_HeaderTitle": "Select Terrain System", - "UIText_NewTerrainAndSaveSystem_StepMessage": "Just switched to Beta? If yes, enable handling of the new terrain and save system here. Enter 'yes' to enable or 'no' to use the old system.", - "UIText_NewTerrainAndSaveSystem_PrimaryPlaceholder": "no", + "UIText_NewTerrainAndSaveSystem_StepMessage": "Using an OLD branch, such as preterrain or older without the terrain system changes? If yes, disable handling of the new terrain and save system here. Enter 'yes' or skip to enable (default) or 'no' to use the old save and terrain system. If you are unsure, skip this step.", + "UIText_NewTerrainAndSaveSystem_PrimaryPlaceholder": "yes", "UIText_NewTerrainAndSaveSystem_PrimaryLabel": "Enable new System", "UIText_NewTerrainAndSaveSystem_SubmitButton": "Save & Continue", "UIText_NewTerrainAndSaveSystem_SkipButton": "Skip", diff --git a/UIMod/onboard_bundled/localization/sv-SE.json b/UIMod/onboard_bundled/localization/sv-SE.json index ac731882..77784747 100644 --- a/UIMod/onboard_bundled/localization/sv-SE.json +++ b/UIMod/onboard_bundled/localization/sv-SE.json @@ -26,7 +26,6 @@ "UIText_BasicSettings": "Grund", "UIText_NetworkSettings": "Nätverk", "UIText_AdvancedSettings": "Avancerad", - "UIText_BetaSettings": "Beta", "basic": { "UIText_BasicServerSettings": "Grundläggande serverinställningar", "UIText_ServerName": "Servernamn", @@ -80,11 +79,8 @@ "UIText_AllowAutoGameServerUpdates": "Aktivera automatiska uppdateringar av spelservern", "UIText_AllowAutoGameServerUpdatesInfo": "Tillåt spelservern att automatiskt söka efter och uppdatera till den senaste versionen. Obs! Servern startas om när en ny version har hittats och installerats. Flera varningsmeddelanden skickas till servern med SAY-kommandon 60–10 sekunder före omstarten." }, - "beta": { - "UIText_BetaOnlySettings": "ENDAST BETA: INSTÄLLNINGAR FÖR NYTT TERRÄNG- OCH SPARSYSTEM", - "UIText_BetaWarning": "Dessa inställningar är endast användbara om du kör Stationeers Dedicated Server Beta. Byte är möjligt via Avancerade inställningar -> Spelgren. Gamla sparfiler är INTE kompatibla med det nya systemet, men kan migreras med JacksonTheMasters Migreringsverktyg. Relaterad \"hur man gör\"-info i FAQ gäller även för Dedicated Server.", + "terrain": { "UIText_UseNewTerrainAndSave": "Använd nytt system", - "UIText_UseNewTerrainAndSaveInfo": "Sätt till TRUE för att aktivera hantering av .save-filer i Backup-hanteraren och argumentparsning. Om satt till false fungerar endast Stationeers-versioner före terrängomarbetningen (≈ mitten av 2025). Standard är false tills nya Stationeers terräng- och sparsystemet släpps.", "UIText_Difficulty": "Svårighetsgrad", "UIText_DifficultyInfo": "Svårighetsgrad för världsskapande. Standard är Normal om tomt.", "UIText_StartCondition": "Startvillkor", @@ -176,7 +172,6 @@ "UIText_GameBranch_SkipButton": "Använd standardversion", "UIText_NewTerrainAndSaveSystem_Title": "Viktigt", "UIText_NewTerrainAndSaveSystem_HeaderTitle": "Välj terrängsystem", - "UIText_NewTerrainAndSaveSystem_StepMessage": "Bytt till beta? Aktivera terräng- och sparsystem för att stödja det! Ange 'ja' för att aktivera eller 'nej' för att inaktivera.", "UIText_NewTerrainAndSaveSystem_PrimaryPlaceholder": "nej", "UIText_NewTerrainAndSaveSystem_PrimaryLabel": "Aktivera nytt system", "UIText_NewTerrainAndSaveSystem_SubmitButton": "Spara & fortsätt", diff --git a/UIMod/onboard_bundled/ui/config.html b/UIMod/onboard_bundled/ui/config.html index 3ceef7a3..64938633 100644 --- a/UIMod/onboard_bundled/ui/config.html +++ b/UIMod/onboard_bundled/ui/config.html @@ -56,7 +56,7 @@