Skip to content

Instantly share code, notes, and snippets.

@ConoHa
Last active April 6, 2023 07:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ConoHa/d16fedf984db8484cbeb867fcbce5534 to your computer and use it in GitHub Desktop.
Save ConoHa/d16fedf984db8484cbeb867fcbce5534 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -eu
yum install -y jq
readonly MINECRAFT_DIR="/opt/minecraft_server"
readonly BACKUP_DIR_PREFIX="backup"
readonly MINECRAFT_SERVER_SERVICE="/etc/systemd/system/minecraft-server.service"
readonly MINECRAFT_SERVER_LATEST_VER=$( curl https://launchermeta.mojang.com/mc/game/version_manifest.json|jq -r '."latest"."release"' )
readonly MINECRAFT_SERVER_LATEST_MANIFEST_URL=$( curl https://launchermeta.mojang.com/mc/game/version_manifest.json | jq -r ".\"versions\"[] | select (.\"id\"==\"${MINECRAFT_SERVER_LATEST_VER}\") | .\"url\" " )
readonly MINECRAFT_SERVER_LATEST_JAR_URL=$( curl "${MINECRAFT_SERVER_LATEST_MANIFEST_URL}" | jq -r ".\"downloads\".\"server\".\"url\"" )
readonly MINECRAFT_SERVER_CURRENT_INSTALLED_VER=$( find /opt/minecraft_server -maxdepth 1 -name "*.jar" | cut -d '/' -f4 | sed -e "s/minecraft_server\.//" -e "s/\.jar//" )
readonly BACKUP_DIR="${MINECRAFT_SERVER_CURRENT_INSTALLED_VER}-$(date --iso-8601='minutes')"
function fullfill_requirements(){
echo "Fullfill requirements"
yum install -y screen
groupadd minecraft || true
useradd -g minecraft minecraft || true
}
function backup_installed_minecraft(){
echo "Backup installed minecraft"
mkdir -p "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
cp -r ${MINECRAFT_DIR}/[^backup]* "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
mv /etc/systemd/system/minecraft-server.service "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
}
function install_latest_openjdk(){
echo "Install latest openjdk"
yum install -y java-latest-openjdk
local latest_java_profile_number
readonly latest_java_profile_number=$(echo '' | alternatives --config java | grep 'latest'|awk '{print $1}')
echo "${latest_java_profile_number}" | alternatives --config java
}
function install_latest_minecraft_server(){
echo "Install latest minecraft server: ${MINECRAFT_SERVER_LATEST_VER}"
rm "${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_CURRENT_INSTALLED_VER}.jar"
wget "${MINECRAFT_SERVER_LATEST_JAR_URL}" -O "${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_LATEST_VER}.jar"
chown -R minecraft:minecraft ${MINECRAFT_DIR}
}
function generate_systemd_service(){
local jvm_xmx_param
readonly jvm_xmx_param=${1}
echo "Generate newer systemd.service for Minecraft server"
cat >> ${MINECRAFT_SERVER_SERVICE} <<EOF
[Unit]
Description=Minecraft Server
After=network.target
[Service]
WorkingDirectory=${MINECRAFT_DIR}
User=minecraft
Group=minecraft
ProtectSystem=full
ProtectHome=true
ExecStart=/bin/sh -c '/usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms512M -Xmx${jvm_xmx_param} -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar ${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_LATEST_VER}.jar --forceUpgrade nogui'
ExecReload=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "reload"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 5
Restart=on-failure
RestartSec=60s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
}
function get_java_xmx_param(){
for line in $(grep ExecStart ${MINECRAFT_SERVER_SERVICE});do
if echo "${line}" | grep -q "\-Xmx"; then
echo "${line}" | tr -d "\-Xmx"
fi
done
}
function main(){
yum makecache
systemctl disable --now minecraft-server.service
fullfill_requirements
local jvm_xmx_param
readonly jvm_xmx_param=$(get_java_xmx_param)
backup_installed_minecraft
local default_java_version
readonly default_java_version=$(java -version |& grep version | awk '{print $3}' | tr -d '"')
local query_java_180="1.8.0*"
if [[ ${default_java_version} =~ ${query_java_180} ]];then
install_latest_openjdk
fi
install_latest_minecraft_server
generate_systemd_service "${jvm_xmx_param}"
systemctl enable --now minecraft-server.service
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment