Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
4f3fbde
feat: kubernetes
ArikSquad Mar 23, 2026
40f7678
feat: Go TUI
ArikSquad Mar 23, 2026
0fe8d1d
ci: update release.yml
ArikSquad Mar 28, 2026
26e5c44
ci: update release.yml
ArikSquad Mar 28, 2026
90c52d6
feat: clone automatically
ArikSquad Mar 28, 2026
ea7a4f6
feat: ghcr
ArikSquad Mar 28, 2026
1a51ac1
ci: bump actions
ArikSquad Mar 28, 2026
6638c16
feat: build stuff locally
ArikSquad Mar 28, 2026
1bac690
refactor: remove the note
ArikSquad Mar 28, 2026
3b891c5
feat: clean ups
ArikSquad Mar 28, 2026
abccfa6
feat: stuff
ArikSquad Apr 5, 2026
16c1929
feat: some calc stuff
ArikSquad Apr 8, 2026
36564a3
Merge remote-tracking branch 'origin/master' into feat/kubernetes
ArikSquad Apr 8, 2026
ead298d
fix: docker
ArikSquad Apr 8, 2026
5514df7
fix: docker
ArikSquad Apr 8, 2026
3ada008
fix: make sure all world files are being copied
ArikSquad Apr 8, 2026
98a02c7
perf: try to make docker builds faster
ArikSquad Apr 8, 2026
878d120
revert: those performance things were bad
ArikSquad Apr 8, 2026
507d7be
fix: faulty dockerfile runtime stage
ArikSquad Apr 8, 2026
85e7974
fix: faulty everything about connections
ArikSquad Apr 8, 2026
a64cda3
fix: skyblock islands
ArikSquad Apr 9, 2026
6f0950f
refactor: some clean-ups
ArikSquad Apr 9, 2026
71a1221
refactor: change default management settings enabled to false
ArikSquad Apr 13, 2026
d1dff9e
fix: don't advertise ports always
ArikSquad Apr 14, 2026
b5cb817
Merge remote-tracking branch 'origin/master' into feat/kubernetes
ArikSquad Apr 14, 2026
99ac7dc
feat: clean up kubernetes setup
ArikSquad Apr 14, 2026
70676f4
chore: format go.mod
ArikSquad Apr 14, 2026
c07a625
fix: add some validation
ArikSquad Apr 14, 2026
c67a678
fix: add import back
ArikSquad Apr 14, 2026
562bb14
feat: experimental optimisations
ArikSquad Apr 14, 2026
4ac2937
feat: experimental optimisations v2
ArikSquad Apr 14, 2026
e0d6652
fix: update test
ArikSquad Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.git
.gradle
.idea
**/build
**/.DS_Store
out
33 changes: 28 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- uses: actions/checkout@v6
- name: Set up JDK 25
uses: actions/setup-java@v5.1.0
uses: actions/setup-java@v5.2.0
with:
java-version: '25'
distribution: 'temurin'
Expand All @@ -24,12 +23,13 @@ jobs:
run: chmod +x gradlew

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
uses: gradle/actions/setup-gradle@v6

- name: Build with Gradle
run: ./gradlew shadowJar

- name: Cache Gradle packages
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
Expand All @@ -38,6 +38,27 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-

- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: setup/go.mod

- name: Run Go tests
working-directory: setup
run: go test ./...

- name: Build setup CLI archives
working-directory: setup
env:
CGO_ENABLED: 0
run: |
set -euo pipefail
mkdir -p dist
GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o dist/hypixel-setup-linux-amd64 .
GOOS=linux GOARCH=arm64 go build -trimpath -ldflags="-s -w" -o dist/hypixel-setup-linux-arm64 .
tar -C dist -czf dist/hypixel-setup-linux-amd64.tar.gz hypixel-setup-linux-amd64 --transform 's/hypixel-setup-linux-amd64/hypixel-setup/'
tar -C dist -czf dist/hypixel-setup-linux-arm64.tar.gz hypixel-setup-linux-arm64 --transform 's/hypixel-setup-linux-arm64/hypixel-setup/'

- name: Add Jar to GitHub releases
uses: marvinpinto/action-automatic-releases@latest
with:
Expand All @@ -60,3 +81,5 @@ jobs:
service.orchestrator/build/libs/*.jar
service.friend/build/libs/*.jar
service.darkauction/build/libs/*.jar
setup/dist/hypixel-setup-linux-amd64.tar.gz
setup/dist/hypixel-setup-linux-arm64.tar.gz
111 changes: 79 additions & 32 deletions DockerFiles/Dockerfile.game_server
Original file line number Diff line number Diff line change
@@ -1,32 +1,79 @@
FROM eclipse-temurin:25-jdk

WORKDIR /app

RUN apt-get update && apt-get install -y jq curl && apt-get clean

# Download all JARs in a single layer
RUN curl -fSL -o HypixelCore.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/HypixelCore.jar" && \
curl -fSL -o ServiceAPI.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceAPI.jar" && \
curl -fSL -o ServiceAuctionHouse.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceAuctionHouse.jar" && \
curl -fSL -o ServiceBazaar.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceBazaar.jar" && \
curl -fSL -o ServiceItemTracker.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceItemTracker.jar" && \
curl -fSL -o ServiceDataMutex.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceDataMutex.jar" && \
curl -fSL -o ServiceParty.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceParty.jar" && \
curl -fSL -o ServiceDarkAuction.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceDarkAuction.jar" && \
curl -fSL -o ServiceOrchestrator.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceOrchestrator.jar" && \
curl -fSL -o ServiceFriend.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/ServiceFriend.jar"

# Copy configuration data
COPY ./configuration /app/configuration_files

RUN mkdir -p configuration && \
cp configuration_files/config.yml ./configuration/config.yml

EXPOSE 25565 65535 8080 20000

RUN cp configuration_files/server.toml ./server.toml && \
cp -a configuration_files/skyblock/. configuration/skyblock/ && \
cp configuration_files/entrypoint.sh ./entrypoint.sh && \
chmod +x entrypoint.sh

CMD ["sh", "entrypoint.sh"]
FROM eclipse-temurin:25-jdk AS builder

WORKDIR /workspace

COPY gradlew gradlew.bat settings.gradle.kts build.gradle.kts gradle.properties ./
COPY configuration ./configuration
COPY gradle ./gradle
COPY anticheat ./anticheat
COPY commons ./commons
COPY dungeons ./dungeons
COPY loader ./loader
COPY packer ./packer
COPY proxy.api ./proxy.api
COPY pvp ./pvp
COPY service.api ./service.api
COPY service.auctionhouse ./service.auctionhouse
COPY service.bazaar ./service.bazaar
COPY service.darkauction ./service.darkauction
COPY service.datamutex ./service.datamutex
COPY service.friend ./service.friend
COPY service.generic ./service.generic
COPY service.itemtracker ./service.itemtracker
COPY service.orchestrator ./service.orchestrator
COPY service.party ./service.party
COPY service.punishment ./service.punishment
COPY spark ./spark
COPY type.backwaterbayou ./type.backwaterbayou
COPY type.bedwarsconfigurator ./type.bedwarsconfigurator
COPY type.bedwarsgame ./type.bedwarsgame
COPY type.bedwarslobby ./type.bedwarslobby
COPY type.crimsonisle ./type.crimsonisle
COPY type.deepcaverns ./type.deepcaverns
COPY type.dungeonhub ./type.dungeonhub
COPY type.dwarvenmines ./type.dwarvenmines
COPY type.galatea ./type.galatea
COPY type.generic ./type.generic
COPY type.goldmine ./type.goldmine
COPY type.hub ./type.hub
COPY type.island ./type.island
COPY type.jerrysworkshop ./type.jerrysworkshop
COPY type.lobby ./type.lobby
COPY type.murdermysteryconfigurator ./type.murdermysteryconfigurator
COPY type.murdermysterygame ./type.murdermysterygame
COPY type.murdermysterylobby ./type.murdermysterylobby
COPY type.prototypelobby ./type.prototypelobby
COPY type.ravengardgeneric ./type.ravengardgeneric
COPY type.ravengardlobby ./type.ravengardlobby
COPY type.skyblockgeneric ./type.skyblockgeneric
COPY type.skywarsconfigurator ./type.skywarsconfigurator
COPY type.skywarsgame ./type.skywarsgame
COPY type.skywarslobby ./type.skywarslobby
COPY type.spidersden ./type.spidersden
COPY type.theend ./type.theend
COPY type.thefarmingislands ./type.thefarmingislands
COPY type.thepark ./type.thepark
COPY velocity.extension ./velocity.extension

RUN chmod +x ./gradlew && ./gradlew --no-daemon --parallel assembleDeploymentArtifacts

FROM eclipse-temurin:25-jre

WORKDIR /app

RUN apt-get update \
&& apt-get install -y --no-install-recommends bash curl jq ca-certificates \
&& rm -rf /var/lib/apt/lists/*

COPY --from=builder /workspace/build/deployment/ /app/
COPY ./configuration /app/configuration_files

RUN chmod +x /app/configuration_files/bootstrap-config.sh /app/configuration_files/entrypoint.sh

ENV MANAGEMENT_PORT=9090
ENV JAVA_OPTS="-XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxRAMPercentage=70 -XX:InitialRAMPercentage=25 -Dfile.encoding=UTF-8"
ENV SERVICE_CMD="java ${JAVA_OPTS} -jar HypixelCore.jar PROTOTYPE_LOBBY"

EXPOSE 25565 9090

ENTRYPOINT ["/app/configuration_files/entrypoint.sh"]
64 changes: 37 additions & 27 deletions DockerFiles/Dockerfile.proxy
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
FROM eclipse-temurin:25-jdk

WORKDIR /app

RUN apt-get update && apt-get install -y jq netcat-traditional curl && apt-get clean

# Download Velocity proxy JAR
RUN curl -fSL -o velocity.jar "https://fill-data.papermc.io/v1/objects/ef1a852bfae7397e84907837925e7ad21c6312066290edaae401b77f6f423ac3/velocity-3.4.0-SNAPSHOT-558.jar"

# Download SkyBlockProxy.jar
RUN mkdir -p plugins && \
curl -fSL -o plugins/SkyBlockProxy.jar "https://github.com/Swofty-Developments/HypixelSkyBlock/releases/download/latest/SkyBlockProxy.jar"

# Copy configuration data
COPY ./configuration /app/configuration_files

# Replace generated velocity.toml with our own
RUN rm -f velocity.toml && \
cp configuration_files/velocity.toml velocity.toml

# Set up config.yml template
RUN mkdir -p configuration && \
cp configuration_files/config.example.yml ./configuration/config.yml

EXPOSE 25565

CMD ["sh", "-c", "[ -n \"$FORWARDING_SECRET\" ] || { echo 'FORWARDING_SECRET is required' >&2; exit 1; }; printf '%s' \"$FORWARDING_SECRET\" > /app/forwarding.secret; sed -i \"s/velocity-secret: .*/velocity-secret: '$FORWARDING_SECRET'/\" /app/configuration/config.yml; java -jar velocity.jar"]
FROM eclipse-temurin:25-jdk AS builder

WORKDIR /workspace

COPY gradlew gradlew.bat settings.gradle.kts build.gradle.kts gradle.properties ./
COPY configuration ./configuration
COPY gradle ./gradle
COPY commons ./commons
COPY packer ./packer
COPY proxy.api ./proxy.api
COPY velocity.extension ./velocity.extension

RUN chmod +x ./gradlew && ./gradlew --no-daemon :velocity.extension:shadowJar

FROM eclipse-temurin:25-jre

WORKDIR /app

ARG VELOCITY_BUILD_URL="https://fill-data.papermc.io/v1/objects/ef1a852bfae7397e84907837925e7ad21c6312066290edaae401b77f6f423ac3/velocity-3.4.0-SNAPSHOT-558.jar"

RUN apt-get update \
&& apt-get install -y --no-install-recommends bash curl netcat-traditional ca-certificates \
&& rm -rf /var/lib/apt/lists/*

RUN curl -fsSL -o /app/velocity.jar "${VELOCITY_BUILD_URL}"

COPY --from=builder /workspace/velocity.extension/build/libs/SkyBlockProxy.jar /app/plugins/SkyBlockProxy.jar
COPY ./configuration /app/configuration_files

RUN chmod +x /app/configuration_files/bootstrap-config.sh

EXPOSE 25565 9090

ENV HYPIXEL_MANAGEMENT_PORT=9090
ENV JAVA_OPTS="-XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxRAMPercentage=70 -XX:InitialRAMPercentage=25 -Dfile.encoding=UTF-8"

CMD ["bash", "-lc", "[ -n \"$FORWARDING_SECRET\" ] || { echo 'FORWARDING_SECRET is required' >&2; exit 1; }; printf '%s' \"$FORWARDING_SECRET\" > /app/forwarding.secret; mkdir -p /app/configuration; /app/configuration_files/bootstrap-config.sh /app/configuration; cp /app/configuration_files/velocity.toml /app/velocity.toml; java $JAVA_OPTS -jar /app/velocity.jar"]
50 changes: 50 additions & 0 deletions DockerFiles/Dockerfile.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
FROM eclipse-temurin:25-jdk AS builder

WORKDIR /workspace

ARG SERVICE_MODULE=service.orchestrator

COPY gradlew gradlew.bat settings.gradle.kts build.gradle.kts gradle.properties ./
COPY configuration ./configuration
COPY gradle ./gradle
COPY commons ./commons
COPY packer ./packer
COPY proxy.api ./proxy.api
COPY service.api ./service.api
COPY service.auctionhouse ./service.auctionhouse
COPY service.bazaar ./service.bazaar
COPY service.darkauction ./service.darkauction
COPY service.datamutex ./service.datamutex
COPY service.friend ./service.friend
COPY service.generic ./service.generic
COPY service.itemtracker ./service.itemtracker
COPY service.orchestrator ./service.orchestrator
COPY service.party ./service.party
COPY service.punishment ./service.punishment
COPY type.generic ./type.generic
COPY type.skyblockgeneric ./type.skyblockgeneric

RUN chmod +x ./gradlew && ./gradlew --no-daemon ":${SERVICE_MODULE}:shadowJar"

FROM eclipse-temurin:25-jre

WORKDIR /app

ARG SERVICE_MODULE=service.orchestrator
ARG SERVICE_JAR=ServiceOrchestrator.jar

RUN apt-get update \
&& apt-get install -y --no-install-recommends bash ca-certificates \
&& rm -rf /var/lib/apt/lists/*

COPY --from=builder /workspace/${SERVICE_MODULE}/build/libs/${SERVICE_JAR} /app/service.jar
COPY ./configuration /app/configuration_files

RUN chmod +x /app/configuration_files/bootstrap-config.sh

ENV HYPIXEL_MANAGEMENT_PORT=9090
ENV JAVA_OPTS="-XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxRAMPercentage=70 -XX:InitialRAMPercentage=25 -Dfile.encoding=UTF-8"

EXPOSE 9090

CMD ["bash", "-lc", "mkdir -p /app/configuration; /app/configuration_files/bootstrap-config.sh /app/configuration; java $JAVA_OPTS -jar /app/service.jar"]
37 changes: 33 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.getByType

plugins {
base
java
Expand Down Expand Up @@ -52,3 +48,36 @@ subprojects {
useJUnitPlatform()
}
}

val deployableProjects = linkedMapOf(
":loader" to "HypixelCore.jar",
":velocity.extension" to "SkyBlockProxy.jar",
":service.api" to "ServiceAPI.jar",
":service.auctionhouse" to "ServiceAuctionHouse.jar",
":service.bazaar" to "ServiceBazaar.jar",
":service.darkauction" to "ServiceDarkAuction.jar",
":service.datamutex" to "ServiceDataMutex.jar",
":service.friend" to "ServiceFriend.jar",
":service.itemtracker" to "ServiceItemTracker.jar",
":service.orchestrator" to "ServiceOrchestrator.jar",
":service.party" to "ServiceParty.jar",
":service.punishment" to "ServicePunishment.jar"
)

val availableDeployableProjects = deployableProjects.filterKeys { path ->
findProject(path) != null
}

tasks.register<Sync>("assembleDeploymentArtifacts") {
group = "distribution"
description = "Builds and collects all deployable fat jars into build/deployment."

val shadowTasks = availableDeployableProjects.keys.map { path -> "$path:shadowJar" }
dependsOn(shadowTasks)

into(layout.buildDirectory.dir("deployment"))
availableDeployableProjects.forEach { (path, jarName) ->
val projectPath = path.removePrefix(":")
from(layout.projectDirectory.file("$projectPath/build/libs/$jarName"))
}
}
23 changes: 23 additions & 0 deletions commons/src/main/java/net/swofty/commons/config/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public class Settings {
@Comment("Settings related to configuration of Limbo server connections")
private LimboSettings limbo = new LimboSettings();

@Comment("Management endpoint settings used for Kubernetes probes and metrics scraping")
private KubernetesSettings kubernetes = new KubernetesSettings();

@Comment("Resource pack settings keyed by pack name (e.g. testingpack, bedwarspack)")
private Map<String, ResourcePackSettings> resourcePacks = new HashMap<>();

Expand All @@ -48,6 +51,26 @@ public static class LimboSettings {
private int port = 65535;
}

@Getter
@Configuration
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public static class KubernetesSettings {
@Comment("Whether to expose HTTP management endpoints such as /healthz, /readyz and /metrics and enable Kubernetes advertising")
private boolean enabled = false;

@Comment("The host name or IP address to bind management endpoints to")
private String hostName = "0.0.0.0";

@Comment("The TCP port to bind management endpoints to")
private int port = 9090;

@Comment("The host or IP address this server should advertise back to the proxy. Leave blank to auto-detect")
private String advertisedHost = "";

@Comment("The port this server should advertise back to the proxy")
private int advertisedPort = 25565;
}

@Getter
@Configuration
@NoArgsConstructor
Expand Down
Loading
Loading