Skip to content

Instantly share code, notes, and snippets.

@egormkn
Last active April 9, 2022 16:20
Show Gist options
  • Save egormkn/5318584ac20c62da9cdcf05590acbeb2 to your computer and use it in GitHub Desktop.
Save egormkn/5318584ac20c62da9cdcf05590acbeb2 to your computer and use it in GitHub Desktop.
Minecraft Server setup script
#!/bin/bash
# https://minecraft.gamepedia.com/Tutorials/Server_startup_script
# https://gist.github.com/justinjahn/4fe65b552b0622662420928cc8ffc7c0
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
# Create user if needed
id -u minecraft &> /dev/null
if [ $? -eq 1 ]; then
echo "Initial setup"
echo "- Creating 'minecraft' user"
sudo useradd -r -m -d /opt/minecraft minecraft
sudo chown -R minecraft:minecraft /opt/minecraft
echo "- Create systemd service"
echo "[Unit]
Description=Minecraft Server: %i
After=network.target
[Service]
WorkingDirectory=/opt/minecraft/instances/%i
User=minecraft
Group=minecraft
Restart=always
RestartSec=1s
ExecStart=/usr/bin/screen -DmS mc-%i /usr/bin/java -Xms1024M -Xmx1900M -jar minecraft_server.jar nogui
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff \"say SERVER SHUTTING DOWN IN 15 SECONDS...\"\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS...\"\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff \"say SERVER SHUTTING DOWN IN 5 SECONDS...\"\015'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff \"save-all\"\015'
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff \"stop\"\015'
[Install]
WantedBy=multi-user.target" > /etc/systemd/system/minecraft@.service
fi
# Setup folders if needed
cd /opt/minecraft
[ -d server-images ] || mkdir server-images
[ -d instances ] || mkdir instances
# Get server info
echo -en "\nEnter the new server's id (snake_case): "
read SERVER_ID
while [ -d "instances/$SERVER_ID" ]; do
echo -en "'instances/$SERVER_ID' already exists.\nTry Again: "
read SERVER_ID
done
echo -e "\nExisting server images:"
ls server-images
echo -en "\nEnter the image you want to use or ? to download a new one: "
read IMAGE_NAME
while [ ! -f "server-images/$IMAGE_NAME" ] && [ "$IMAGE_NAME" != "?" ]; do
echo -en "'server-images/$IMAGE_NAME' does not exist.\nTry Again: "
read IMAGE_NAME
done
# Donwload new image
if [ "$IMAGE_NAME" = "?" ]; then
echo -n "Enter download URL: "
read DOWNLOAD_URL
echo -n "Enter the image name (example: 'vanilla-1.15.2.jar'): "
read IMAGE_NAME
echo "$DOWNLOAD_URL > $IMAGE_NAME"
echo -en "Downloading server image... "
curl "$DOWNLOAD_URL" --output "server-images/$IMAGE_NAME"
echo "Done!"
fi
# Accept EULA
echo -en "\nBy continuing, you accept the following EULA (https://account.mojang.com/documents/minecraft_eula)\n[Press enter to accept]"
read ACCEPT_EULA
# Generate instance
echo -en "\nCreating 'instances/$SERVER_ID'... "
mkdir "instances/$SERVER_ID"
cp "server-images/$IMAGE_NAME" "instances/$SERVER_ID/$IMAGE_NAME"
cd "instances/$SERVER_ID"
echo "eula=true" > eula.txt
ln -s "$IMAGE_NAME" minecraft_server.jar
# POINT THE NEXT LINE TO AN EXISTING INSTANCE
# If you don't have an existing instance, it will log an error and minecraft will generate this file for you.
cp "../default_instance/server.properties" server.properties
sudo chown -R minecraft:minecraft .
cd /opt/minecraft
echo "Done!"
# Spinning up for the first time
echo -en "\nSpinning up to generate necessary server files (this will take ~2 minutes)... "
sudo systemctl start "minecraft@$SERVER_ID"
sleep 2m # lol
sudo systemctl stop "minecraft@$SERVER_ID"
sudo chown -R minecraft:minecraft "instances/$SERVER_ID"
echo "Done!"
# Helpful stuff
echo -e "\nYour server is ready to go! Helpful commands:"
echo "------"
echo " # Start it up"
echo " sudo systemctl start minecraft@$SERVER_ID"
echo " sudo systemctl stop minecraft@$SERVER_ID"
echo " sudo systemctl restart minecraft@$SERVER_ID"
echo " sudo systemctl reload minecraft@$SERVER_ID"
echo ""
echo " # If you want to start this server on startup"
echo " sudo systemctl enable minecraft@$SERVER_ID"
echo " # If you want to undo enabling it"
echo " sudo systemctl disable minecraft@$SERVER_ID"
echo "------"
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment