Initial commit.
This commit is contained in:
32
Dockerfile
Normal file
32
Dockerfile
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
# Using Ubuntu because it's the most popular, which typically makes
|
||||||
|
# troubleshooting easier
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
WORKDIR /minecraft-server
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
COPY packages-ubuntu.txt .
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get upgrade -y \
|
||||||
|
&& apt-get install -y $(cat packages-ubuntu.txt)
|
||||||
|
|
||||||
|
COPY get-papermc.sh .
|
||||||
|
RUN ./get-papermc.sh
|
||||||
|
|
||||||
|
# lightweight profiler
|
||||||
|
COPY get-spark.sh .
|
||||||
|
RUN ./get-spark.sh
|
||||||
|
|
||||||
|
COPY entrypoint.sh .
|
||||||
|
|
||||||
|
RUN groupadd -r mcserver \
|
||||||
|
&& useradd -r -g mcserver mcserver \
|
||||||
|
&& chown mcserver:mcserver --recursive /minecraft-server
|
||||||
|
|
||||||
|
USER mcserver:mcserver
|
||||||
|
|
||||||
|
ENTRYPOINT ["./entrypoint.sh"]
|
||||||
|
|
||||||
|
EXPOSE 25565/tcp
|
||||||
|
EXPOSE 25565/udp
|
||||||
56
entrypoint.sh
Executable file
56
entrypoint.sh
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
memory_heuristic () {
|
||||||
|
if [[ -v memory_heuristic_cache ]]; then
|
||||||
|
echo $memory_heuristic_cache
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local total_memory=$(free | awk '/Mem:/{print $2}')
|
||||||
|
|
||||||
|
# Below 8 GB we assume this is running on a dedicated server, so we
|
||||||
|
# allocate all but 10mb of the RAM. Otherwise allocate 30%. This is not
|
||||||
|
# based on any profiling or testing
|
||||||
|
if [[ total_memory -lt 8388608 ]]; then
|
||||||
|
memory_heuristic_cache=$((total_memory - 10240))
|
||||||
|
else
|
||||||
|
memory_heuristic_cache=$((total_memory * 3/10))
|
||||||
|
fi
|
||||||
|
|
||||||
|
memory_heuristic_cache+=k
|
||||||
|
|
||||||
|
echo $memory_heuristic_cache
|
||||||
|
}
|
||||||
|
|
||||||
|
# https://docs.papermc.io/paper/aikars-flags
|
||||||
|
args=()
|
||||||
|
args+=("-Xms$(memory_heuristic)")
|
||||||
|
args+=("-Xmx$(memory_heuristic)")
|
||||||
|
args+=("-XX:+UnlockExperimentalVMOptions")
|
||||||
|
args+=("-XX:+ParallelRefProcEnabled")
|
||||||
|
args+=("-XX:+DisableExplicitGC")
|
||||||
|
args+=("-XX:+AlwaysPreTouch")
|
||||||
|
args+=("-XX:+PerfDisableSharedMem")
|
||||||
|
args+=("-XX:MaxGCPauseMillis=200")
|
||||||
|
args+=("-XX:InitiatingHeapOccupancyPercent=15")
|
||||||
|
args+=("-XX:SurvivorRatio=32")
|
||||||
|
args+=("-XX:MaxTenuringThreshold=1")
|
||||||
|
# G1 options
|
||||||
|
args+=("-XX:+UseG1GC")
|
||||||
|
args+=("-XX:G1NewSizePercent=30")
|
||||||
|
args+=("-XX:G1MaxNewSizePercent=40")
|
||||||
|
args+=("-XX:G1HeapRegionSize=8M")
|
||||||
|
args+=("-XX:G1ReservePercent=20")
|
||||||
|
args+=("-XX:G1HeapWastePercent=5")
|
||||||
|
args+=("-XX:G1MixedGCCountTarget=4")
|
||||||
|
args+=("-XX:G1MixedGCLiveThresholdPercent=90")
|
||||||
|
args+=("-XX:G1RSetUpdatingPauseTimePercent=5")
|
||||||
|
mkdir -p logs
|
||||||
|
args+=("-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=1M")
|
||||||
|
args+=("-Dcom.mojang.eula.agree=true")
|
||||||
|
|
||||||
|
args+=("-jar" "paper.jar" "--nogui")
|
||||||
|
|
||||||
|
exec java ${args[@]}
|
||||||
34
get-papermc.sh
Executable file
34
get-papermc.sh
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# print msg to stderr
|
||||||
|
debug_msg () {
|
||||||
|
echo "$@" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
# get the download url for the latest version
|
||||||
|
latest_url() {
|
||||||
|
if [[ -v latest_url_cache ]]; then
|
||||||
|
echo $latest_url_cache
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
debug_msg "finding download url to latest version..."
|
||||||
|
|
||||||
|
local url=https://papermc.io/api/v2/projects/paper
|
||||||
|
|
||||||
|
local minecraft_version=$(curl --silent "$url" | jq -r '.versions[-1]')
|
||||||
|
url+=/versions/$minecraft_version
|
||||||
|
|
||||||
|
local papermc_build=$(curl --silent $url | jq -r '.builds[-1]')
|
||||||
|
url+=/builds/$papermc_build
|
||||||
|
|
||||||
|
latest_url_cache=$url/downloads/paper-$minecraft_version-$papermc_build.jar
|
||||||
|
debug_msg "Found url" $latest_url_cache
|
||||||
|
echo $latest_url_cache
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_msg "downloading..."
|
||||||
|
curl --silent $(latest_url) > paper.jar
|
||||||
|
|
||||||
|
|
||||||
26
get-spark.sh
Executable file
26
get-spark.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# print msg to stderr
|
||||||
|
debug_msg () {
|
||||||
|
echo "$@" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! [[ -d plugins ]]; then
|
||||||
|
debug_msg Creating directory \'plugins\'...
|
||||||
|
mkdir plugins
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd plugins
|
||||||
|
|
||||||
|
debug_msg downloading spark...
|
||||||
|
curl --silent \
|
||||||
|
https://ci.lucko.me/job/spark/400/artifact/spark-bukkit/build/libs/spark-*-bukkit.jar/*zip*/libs.zip \
|
||||||
|
> spark.zip
|
||||||
|
|
||||||
|
debug_msg unzipping...
|
||||||
|
unzip -oq spark.zip # -o is not 'output', but 'overwrite'. -q is quiet
|
||||||
|
|
||||||
|
debug_msg deleting zip...
|
||||||
|
rm spark.zip
|
||||||
5
packages-ubuntu.txt
Normal file
5
packages-ubuntu.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
openjdk-21-jre-headless
|
||||||
|
curl
|
||||||
|
jq
|
||||||
|
bash
|
||||||
|
unzip
|
||||||
Reference in New Issue
Block a user