Skip to content

Instantly share code, notes, and snippets.

@troyfontaine
Created January 13, 2025 15:00
Show Gist options
  • Save troyfontaine/da231c30eb6bac55d4ae8bcadd29c9b5 to your computer and use it in GitHub Desktop.
Save troyfontaine/da231c30eb6bac55d4ae8bcadd29c9b5 to your computer and use it in GitHub Desktop.
Minecraft Bedrock Upgrade Script
#!/usr/bin/env bash
###############################################################################
# Minecraft Bedrock Server Update Script
#
# Intended to be used on Linux with a dedicated Bedrock Minecraft Server
#
# NOT COMPATIBLE WITH JAVA EDITION
#
# This script is intended to be used only in the following installation scenario
# if yours is different, then please modify the variables to fit your
# installation
# - The Minecraft install is using a dedicated user
# - The Minecraft install user has the username mcserver
# - The Minecraft install is located at /home/mcserver/minecraft_bedrock
# - The Minecraft server is managed via Systemd unit file
# - The Minecraft server's unit file is mcbedrock.service
###############################################################################
# Check for dependencies
if ! command -v date 2>&1 >/dev/null; then
echo "'date' command was not found. Exiting!"
exit 1
fi
if ! command -v curl 2>&1 >/dev/null; then
echo "'curl' command was not found. Exiting!"
exit 1
fi
if ! command -v wget 2>&1 >/dev/null; then
echo "'wget' command was not found. Exiting!"
exit 1
fi
CURRENT_DATE=$(date +%Y-%m-%d)
DOWNLOAD_URL=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -s -L -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; BEDROCK-UPDATER)" https://minecraft.net/en-us/download/server/bedrock/ | grep -o 'https.*/bin-linux/.*.zip')
BEDROCK_USERNAME="mcserver"
BEDROCK_USER_HOME="/home/${BEDROCK_USERNAME}"
BEDROCK_EXTRACT_DIR="${BEDROCK_USER_HOME}/extract"
BEDROCK_INSTALL_DIR="${BEDROCK_USER_HOME}/minecraft_bedrock"
BEDROCK_BACKUP_DIR="${BEDROCK_USER_HOME}/backup/${CURRENT_DATE}"
if [ "$EUID" -ne 0 ]; then
echo "Please execute this script as root"
exit 1
fi
if ! id -u "${BEDROCK_USERNAME}" >/dev/null 2>&1; then
echo "Required user '${BEDROCK_USERNAME}' not found. Exiting!"
exit 1
fi
# if [ -d "${BEDROCK_USER_HOME}/" ]; then
# echo "Expected home directory for Bedrock User '${BEDROCK_USERNAME}' at ${BEDROCK_USER_HOME} does not exist. Please check configuration! Exiting!"
# exit 1
# fi
if [ -f "${BEDROCK_USER_HOME}/bedrock-server.zip" ]; then
rm -rf "${BEDROCK_USER_HOME}/bedrock-server.zip"
fi
# Download the latest server installation files
wget -U "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; BEDROCK-UPDATER)" "${DOWNLOAD_URL}" -O "${BEDROCK_USER_HOME}/bedrock-server.zip"
if [ ! -f "${BEDROCK_USER_HOME}/bedrock-server.zip" ]; then
echo "Failed to download bedrock server. Please check your connection or if the download url has changed on 'minecraft.net'. Exiting!"
exit 1
fi
if [ ! -d "${BEDROCK_EXTRACT_DIR}/" ]; then
mkdir -p "${BEDROCK_EXTRACT_DIR}"
else
rm -rf "${BEDROCK_EXTRACT_DIR}"
mkdir -p "${BEDROCK_EXTRACT_DIR}"
fi
# Extract the upgrade
unzip "${BEDROCK_USER_HOME}/bedrock-server.zip" -d "${BEDROCK_EXTRACT_DIR}/"
# Check the extracted contents
if [ ! -f "${BEDROCK_EXTRACT_DIR}/server.properties" ];then
echo "Failed to locate required file in downloaded zip file extraction directory. Exiting!"
exit 1
fi
# Backup the existing install
# Make our backup directory
mkdir -p "${BEDROCK_BACKUP_DIR}/${CURRENT_DATE}"
systemctl stop mcbedrock.service
echo "Backing up the Bedrock Server Files"
# Backup the Bedrock server files
rsync -avz "${BEDROCK_INSTALL_DIR}/" "${BEDROCK_BACKUP_DIR}/"
echo "Syncing the new files to the existing Bedrock Folder"
# Copy the updated server files into the installation directory
rsync -avrz "${BEDROCK_EXTRACT_DIR}/bedrock_server" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/behavior_packs" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/config" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/definitions" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/permissions.json" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/release-notes.txt" "${BEDROCK_INSTALL_DIR}/"
rsync -avrz "${BEDROCK_EXTRACT_DIR}/resource_packs" "${BEDROCK_INSTALL_DIR}/"
# Fix permissions on the copied files
chown mcserver:mcserver "${BEDROCK_INSTALL_DIR}"
systemctl start mcbedrock.service
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment