Advertisement
KC9UZR

Minecraft Server Deploy And Maintenance Linux

Jun 15th, 2025
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 36.28 KB | Gaming | 0 0
  1. #!/bin/bash
  2.  
  3. # --- Configuration ---
  4. # Set your desired Minecraft version here. E.g., "1.20.4", "1.19.2"
  5. MINECRAFT_VERSION="1.20.4"
  6. # The directory where your Minecraft server files will be stored.
  7. # Using /opt/minecraft is recommended for system-wide servers.
  8. SERVER_DIR="/opt/minecraft"
  9. # Default Java memory allocation. Adjust based on your server's needs.
  10. # Examples: "2G" (2 Gigabytes), "4096M" (4096 Megabytes)
  11. JAVA_MEMORY="4G"
  12.  
  13. # Internal variable for the server JAR file name.
  14. # This will be automatically detected or set during installation.
  15. SERVER_JAR_NAME=""
  16. # Internal variable for the server type.
  17. # This will be automatically detected or set during installation.
  18. SERVER_TYPE="unknown" # "vanilla", "paper", "forge", "fabric", "unknown"
  19.  
  20. # --- Colors for better readability ---
  21. GREEN='\033[0;32m'
  22. YELLOW='\033[0;33m'
  23. RED='\033[0;31m'
  24. BLUE='\033[0;34m' # Added Blue for some options
  25. CYAN='\033[0;36m' # Added Cyan for some options
  26. NC='\033[0m' # No Color
  27.  
  28. # --- Helper Functions ---
  29. log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  30. log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  31. log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
  32.  
  33. # Function to get current server status (Running/Stopped)
  34. get_server_status() {
  35.     if screen -list | grep -q "minecraft"; then
  36.         echo -e "${GREEN}RUNNING${NC}"
  37.     else
  38.         echo -e "${RED}STOPPED${NC}"
  39.     fi
  40. }
  41.  
  42. # --- Check and Install Prerequisites ---
  43. check_prerequisites() {
  44.     log_info "Checking system prerequisites..."
  45.  
  46.     # Check for Java (OpenJDK 17 or higher is recommended for MC 1.17+)
  47.     if ! command -v java &> /dev/null; then
  48.         log_warn "Java is not installed. Attempting to install OpenJDK 17 JRE..."
  49.         sudo apt update
  50.         sudo apt install -y openjdk-17-jre-headless
  51.         if ! command -v java &> /dev/null; then
  52.             log_error "Failed to install Java. Please install OpenJDK 17 (or higher) manually."
  53.             exit 1
  54.         fi
  55.     else
  56.         local java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | cut -d'.' -f1)
  57.         if [[ "$java_version" -lt 17 ]]; then
  58.             log_warn "Detected Java version ${java_version}. Minecraft ${MINECRAFT_VERSION} requires Java 17 or higher."
  59.             log_warn "Attempting to install OpenJDK 17. If this fails, please upgrade Java manually."
  60.             sudo apt update
  61.             sudo apt install -y openjdk-17-jre-headless
  62.             if ! command -v java &> /dev/null || [[ "$(java -version 2>&1 | awk -F '"' '/version/ {print $2}' | cut -d'.' -f1)" -lt 17 ]]; then
  63.                 log_error "Failed to install or upgrade Java to version 17. Please install Java 17 or higher manually."
  64.                 exit 1
  65.             fi
  66.         fi
  67.     fi
  68.     log_info "Java is installed and sufficient."
  69.  
  70.     # Check for 'screen' (for detached server sessions)
  71.     if ! command -v screen &> /dev/null; then
  72.         log_warn "Screen is not installed. Attempting to install 'screen'..."
  73.         sudo apt update
  74.         sudo apt install -y screen
  75.         if ! command -v screen &> /dev/null; then
  76.             log_error "Failed to install 'screen'. Please install it manually: sudo apt install screen."
  77.             exit 1
  78.         fi
  79.     fi
  80.     log_info "Screen is installed."
  81.  
  82.     # Check for 'curl' or 'wget' (for downloading server JARs)
  83.     if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
  84.         log_warn "Neither 'curl' nor 'wget' are installed. Attempting to install 'wget'..."
  85.         sudo apt update
  86.         sudo apt install -y wget
  87.         if ! command -v wget &> /dev/null; then
  88.             log_error "Failed to install 'wget'. Please install 'wget' or 'curl' manually."
  89.             exit 1
  90.         fi
  91.     fi
  92.     log_info "Download tools (curl/wget) are available."
  93.  
  94.     # Check for 'jq' (for parsing JSON APIs, especially PaperMC and Vanilla)
  95.     if ! command -v jq &> /dev/null; then
  96.         log_warn "'jq' is not installed. It's needed for downloading PaperMC/Vanilla servers. Attempting to install 'jq'..."
  97.         sudo apt update
  98.         sudo apt install -y jq
  99.         if ! command -v jq &> /dev/null; then
  100.             log_error "Failed to install 'jq'. Please install 'jq' manually: sudo apt install jq."
  101.             exit 1
  102.         fi
  103.     fi
  104.     log_info "jq is installed."
  105.  
  106.     log_info "All prerequisites met."
  107. }
  108.  
  109. # --- Server Installation Functions ---
  110.  
  111. # Install Vanilla Minecraft Server
  112. install_vanilla() {
  113.     log_info "Attempting to install Vanilla Minecraft server version ${MINECRAFT_VERSION}..."
  114.     local version_manifest_url="https://launchermeta.mojang.com/mc/game/version_manifest.json"
  115.     local version_data_url=$(curl -s "$version_manifest_url" | jq -r ".versions[] | select(.id == \"${MINECRAFT_VERSION}\") | .url")
  116.  
  117.     if [ -z "$version_data_url" ] || [ "$version_data_url" = "null" ]; then
  118.         log_error "Could not find Vanilla version data for Minecraft ${MINECRAFT_VERSION}. Please check the version number."
  119.         return 1
  120.     fi
  121.  
  122.     local server_jar_url=$(curl -s "$version_data_url" | jq -r ".downloads.server.url")
  123.  
  124.     if [ -z "$server_jar_url" ] || [ "$server_jar_url" = "null" ]; then
  125.         log_error "Could not find server JAR download URL for Minecraft ${MINECRAFT_VERSION}. Aborting."
  126.         return 1
  127.     fi
  128.  
  129.     SERVER_JAR_NAME="server.jar"
  130.     log_info "Downloading Vanilla server JAR from: ${server_jar_url}"
  131.     wget -q --show-progress -O "${SERVER_DIR}/${SERVER_JAR_NAME}" "$server_jar_url"
  132.     if [ $? -ne 0 ]; then
  133.         log_error "Failed to download Vanilla server JAR."
  134.         return 1
  135.     fi
  136.     log_info "Vanilla server JAR downloaded."
  137.     return 0
  138. }
  139.  
  140. # Install PaperMC Server
  141. install_papermc() {
  142.     log_info "Attempting to install PaperMC server version ${MINECRAFT_VERSION}..."
  143.     local api_url="https://api.papermc.io/v2/projects/paper/versions/${MINECRAFT_VERSION}"
  144.     local latest_build_number=$(curl -s "$api_url" | jq -r '.builds | last')
  145.  
  146.     if [ -z "$latest_build_number" ] || [ "$latest_build_number" = "null" ]; then
  147.         log_error "Could not find latest PaperMC build for Minecraft ${MINECRAFT_VERSION}. Aborting."
  148.         log_error "PaperMC might not support version ${MINECRAFT_VERSION} yet, or the API structure has changed."
  149.         return 1
  150.     fi
  151.  
  152.     local download_url="https://api.papermc.io/v2/projects/paper/versions/${MINECRAFT_VERSION}/builds/${latest_build_number}/downloads/paper-${MINECRAFT_VERSION}-${latest_build_number}.jar"
  153.     SERVER_JAR_NAME="paper-${MINECRAFT_VERSION}-${latest_build_number}.jar"
  154.  
  155.     log_info "Downloading PaperMC server JAR from: ${download_url}"
  156.     wget -q --show-progress -O "${SERVER_DIR}/${SERVER_JAR_NAME}" "$download_url"
  157.     if [ $? -ne 0 ]; then
  158.         log_error "Failed to download PaperMC server JAR."
  159.         return 1
  160.     fi
  161.     log_info "PaperMC server JAR downloaded."
  162.     return 0
  163. }
  164.  
  165. # Install Forge Server (Manual steps involved)
  166. install_forge() {
  167.     log_info "Installing Forge server for Minecraft version ${MINECRAFT_VERSION}..."
  168.     log_warn "Forge server installation is more involved and requires manual steps after download."
  169.     log_warn "This script will NOT automatically run the Forge installer due to varying prompts and EULAs."
  170.  
  171.     echo ""
  172.     echo -e "${YELLOW}Manual Steps for Forge Server Installation:${NC}"
  173.     echo "1. Go to the official Forge download page: ${GREEN}https://files.minecraftforge.net/net/minecraftforge/forge/index.html${NC}"
  174.     echo "2. Select Minecraft version ${MINECRAFT_VERSION} from the left sidebar."
  175.     echo "3. Download the 'Installer' JAR file for the Recommended Build."
  176.     echo "4. Place the downloaded Forge installer JAR (e.g., 'forge-*-installer.jar') into your server directory: ${SERVER_DIR}"
  177.     echo "5. Navigate to your server directory: ${YELLOW}cd ${SERVER_DIR}${NC}"
  178.     echo "6. Run the installer from the command line: ${YELLOW}java -jar <installer_name>.jar --installServer${NC}"
  179.     echo "   (Replace <installer_name>.jar with the actual file name you downloaded)"
  180.     echo "7. This will create a 'libraries' folder and a new server JAR (e.g., 'forge-<version>.jar' or 'minecraft_server.<version>.jar')."
  181.     echo "8. The installer may also create a 'run.sh' or 'run.bat' script. You can use the generated server JAR directly with this script."
  182.     echo "   The actual server JAR file is typically named something like 'forge-$(echo ${MINECRAFT_VERSION})-<forge_version>.jar'."
  183.     echo "   You may want to rename it to 'server.jar' for simplicity, or update the SERVER_JAR_NAME variable in this script."
  184.     echo ""
  185.  
  186.     read -p "Press Enter after you have manually downloaded and installed Forge (and placed the server JAR in ${SERVER_DIR})..."
  187.  
  188.     # Try to detect the generated server JAR
  189.     local found_jar=$(find "${SERVER_DIR}" -maxdepth 1 -name "forge-*-${MINECRAFT_VERSION}-*.jar" -o -name "server.jar" -o -name "minecraft_server.*.jar" -print -quit)
  190.     if [ -n "$found_jar" ]; then
  191.         SERVER_JAR_NAME=$(basename "$found_jar")
  192.         log_info "Detected server JAR: ${SERVER_JAR_NAME}. Please confirm this is correct for your Forge installation."
  193.     else
  194.         log_warn "Could not automatically detect Forge server JAR. Please verify it's in ${SERVER_DIR} and set SERVER_JAR_NAME manually in the script if issues arise."
  195.         SERVER_JAR_NAME="forge-server.jar" # Placeholder, user needs to ensure correct name
  196.     fi
  197.     return 0
  198. }
  199.  
  200. # Install Fabric Server (Manual steps involved)
  201. install_fabric() {
  202.     log_info "Installing Fabric server for Minecraft version ${MINECRAFT_VERSION}..."
  203.     log_warn "Fabric server installation requires manual steps after downloading the installer."
  204.  
  205.     local fabric_installer_url="https://meta.fabricmc.net/v2/versions/installer"
  206.     local latest_installer=$(curl -s "$fabric_installer_url" | jq -r '.[0].url')
  207.     local installer_name="fabric-installer.jar"
  208.  
  209.     if [ -z "$latest_installer" ] || [ "$latest_installer" = "null" ]; then
  210.         log_error "Failed to get latest Fabric installer URL from API."
  211.         return 1
  212.     fi
  213.  
  214.     log_info "Downloading Fabric installer from: ${latest_installer}"
  215.     wget -q --show-progress -O "${SERVER_DIR}/${installer_name}" "$latest_installer"
  216.     if [ $? -ne 0 ]; then
  217.         log_error "Failed to download Fabric installer."
  218.         return 1
  219.     fi
  220.     log_info "Fabric installer downloaded to ${SERVER_DIR}/${installer_name}."
  221.  
  222.     echo ""
  223.     echo -e "${YELLOW}Manual Steps for Fabric Server Installation:${NC}"
  224.     echo "1. Navigate to your server directory: ${YELLOW}cd ${SERVER_DIR}${NC}"
  225.     echo "2. Run the Fabric installer to create the server JAR:"
  226.     echo "   ${YELLOW}java -jar ${installer_name} server -mcversion ${MINECRAFT_VERSION}${NC}"
  227.     echo "3. This will generate a Fabric server JAR (e.g., 'fabric-server-mc.${MINECRAFT_VERSION}-loader.<loader_version>.jar')."
  228.     echo "   You may want to rename it to 'server.jar' for simplicity, or update the SERVER_JAR_NAME variable in this script."
  229.     echo ""
  230.  
  231.     read -p "Press Enter after you have manually run the Fabric installer (and placed the server JAR in ${SERVER_DIR})..."
  232.  
  233.     # Try to detect the generated server JAR
  234.     local found_jar=$(find "${SERVER_DIR}" -maxdepth 1 -name "fabric-server-mc*.jar" -o -name "server.jar" -print -quit)
  235.     if [ -n "$found_jar" ]; then
  236.         SERVER_JAR_NAME=$(basename "$found_jar")
  237.         log_info "Detected server JAR: ${SERVER_JAR_NAME}. Please confirm this is correct for your Fabric installation."
  238.     else
  239.         log_warn "Could not automatically detect Fabric server JAR. Please verify it's in ${SERVER_DIR} and set SERVER_JAR_NAME manually in the script if issues arise."
  240.         SERVER_JAR_NAME="fabric-server.jar" # Placeholder, user needs to ensure correct name
  241.     fi
  242.     return 0
  243. }
  244.  
  245. # --- Main Server Installation Flow ---
  246. install_minecraft_server() {
  247.     log_info "Starting Minecraft server installation..."
  248.  
  249.     if [ -d "$SERVER_DIR" ]; then
  250.         log_warn "Server directory $SERVER_DIR already exists."
  251.         read -p "Do you want to reinstall/update the server? (y/N): " choice
  252.         case "$choice" in
  253.             y|Y)
  254.                 log_warn "Existing server files will be moved to a backup directory ($SERVER_DIR.bak) before proceeding."
  255.                 if [ -d "${SERVER_DIR}.bak" ]; then
  256.                     rm -rf "${SERVER_DIR}.bak"
  257.                 fi
  258.                 mv "$SERVER_DIR" "${SERVER_DIR}.bak"
  259.                 log_info "Old server directory moved to ${SERVER_DIR}.bak"
  260.                 ;;
  261.             *)
  262.                 log_info "Installation cancelled. Exiting to main menu."
  263.                 return 1
  264.                 ;;
  265.         esac
  266.     fi
  267.  
  268.     # Create server directory and set ownership
  269.     sudo mkdir -p "$SERVER_DIR"
  270.     sudo chown -R "$USER":"$USER" "$SERVER_DIR"
  271.     log_info "Minecraft server directory created: $SERVER_DIR"
  272.  
  273.     echo ""
  274.     echo "Choose your desired Minecraft server type:"
  275.     echo "1) Vanilla (Official Minecraft Server - No mods or plugins)"
  276.     echo "2) PaperMC (High-performance Spigot/Bukkit fork - Supports plugins)"
  277.     echo "3) Forge (Modding API - Supports mods, often used for modpacks)"
  278.     echo "4) Fabric (Lightweight Modding API - Supports mods, often for performance mods)"
  279.     read -p "Enter your choice (1-4): " server_choice
  280.  
  281.     local install_success=1
  282.     case "$server_choice" in
  283.         1) SERVER_TYPE="vanilla"; install_vanilla && install_success=0 ;;
  284.         2) SERVER_TYPE="paper"; install_papermc && install_success=0 ;;
  285.         3) SERVER_TYPE="forge"; install_forge && install_success=0 ;;
  286.         4) SERVER_TYPE="fabric"; install_fabric && install_success=0 ;;
  287.         *) log_error "Invalid choice. Aborting installation."; return 1 ;;
  288.     esac
  289.  
  290.     if [ "$install_success" -ne 0 ]; then
  291.         log_error "Server type installation failed. Aborting."
  292.         return 1
  293.     fi
  294.  
  295.     # Accept EULA
  296.     echo "eula=true" > "${SERVER_DIR}/eula.txt"
  297.     log_info "Minecraft EULA accepted."
  298.  
  299.     # Initial server run to generate configuration files (server.properties, etc.)
  300.     # This is crucial for Forge/Fabric too, as it sets up their environment.
  301.     log_info "Performing initial server run to generate configuration files (this may take a moment)..."
  302.     log_info "The server will start briefly and then stop automatically (or may require manual Ctrl+C if not shutting down on its own)."
  303.     log_info "Please do NOT try to connect to the server during this step."
  304.  
  305.     cd "$SERVER_DIR" || { log_error "Failed to change to server directory: $SERVER_DIR."; return 1; }
  306.     # Run in the foreground, wait a bit, then kill it.
  307.     java -Xmx128M -Xms128M -jar "${SERVER_JAR_NAME}" nogui &
  308.     SERVER_PID=$!
  309.     sleep 30 # Give it time to generate files
  310.  
  311.     if kill -0 $SERVER_PID 2>/dev/null; then # Check if process is still running
  312.         log_warn "Server process still active after initial run. Attempting graceful shutdown."
  313.         kill $SERVER_PID # Send SIGTERM
  314.         sleep 10
  315.         if kill -0 $SERVER_PID 2>/dev/null; then # If still running, force kill
  316.             log_error "Server did not shut down gracefully. Forcing termination."
  317.             kill -9 $SERVER_PID
  318.         fi
  319.     fi
  320.     log_info "Initial server file generation complete."
  321.  
  322.     log_info "Minecraft server installation complete."
  323.     log_info "Remember to configure server.properties (and any other config files) in $SERVER_DIR before starting the server."
  324.     log_info "You can adjust the allocated RAM using option 9 in the main menu."
  325.     return 0
  326. }
  327.  
  328. # --- Server Management Functions ---
  329.  
  330. # Start the Minecraft server in a screen session
  331. start_server() {
  332.     if [ ! -f "${SERVER_DIR}/${SERVER_JAR_NAME}" ]; then
  333.         log_error "Server JAR not found at ${SERVER_DIR}/${SERVER_JAR_NAME}. Please install the server first (Option 1)."
  334.         return 1
  335.     fi
  336.  
  337.     if screen -list | grep -q "minecraft"; then
  338.         log_warn "Minecraft server is already running."
  339.         return 0
  340.     fi
  341.  
  342.     log_info "Starting Minecraft server with ${JAVA_MEMORY} RAM..."
  343.     cd "$SERVER_DIR" || { log_error "Failed to change to server directory: $SERVER_DIR."; return 1; }
  344.     screen -dmS minecraft java -Xmx${JAVA_MEMORY} -Xms${JAVA_MEMORY} -jar "${SERVER_JAR_NAME}" nogui
  345.     if [ $? -eq 0 ]; then
  346.         log_info "Minecraft server started in a screen session named 'minecraft'."
  347.         log_info "To attach to the server console, select Option 8 from the main menu."
  348.         log_info "To detach from the console, press Ctrl+A then D."
  349.     else
  350.         log_error "Failed to start Minecraft server. Check Java and server JAR path."
  351.     fi
  352. }
  353.  
  354. # Stop the Minecraft server
  355. stop_server() {
  356.     if ! screen -list | grep -q "minecraft"; then
  357.         log_warn "Minecraft server is not running."
  358.         return 0
  359.     fi
  360.  
  361.     log_info "Stopping Minecraft server gracefully..."
  362.     # Send 'stop' command to the screen session
  363.     screen -p 0 -S minecraft -X eval 'stuff "stop"\015'
  364.    
  365.     local wait_time=0
  366.     local max_wait=60 # Wait up to 60 seconds
  367.     while screen -list | grep -q "minecraft" && [ "$wait_time" -lt "$max_wait" ]; do
  368.         echo -n "."
  369.         sleep 5
  370.         wait_time=$((wait_time+5))
  371.     done
  372.     echo "" # Newline after dots
  373.  
  374.     if screen -list | grep -q "minecraft"; then
  375.         log_warn "Server did not shut down gracefully within ${max_wait} seconds. Forcibly terminating screen session."
  376.         screen -X -S minecraft quit
  377.     fi
  378.     log_info "Minecraft server stopped."
  379. }
  380.  
  381. # Restart the Minecraft server
  382. restart_server() {
  383.     log_info "Restarting Minecraft server..."
  384.     stop_server
  385.     sleep 5 # Give it a moment to fully shut down
  386.     start_server
  387.     log_info "Minecraft server restart sequence complete."
  388. }
  389.  
  390. # Backup the Minecraft server directory
  391. backup_server() {
  392.     if [ ! -d "$SERVER_DIR" ]; then
  393.         log_error "Server directory not found at $SERVER_DIR. Cannot perform backup."
  394.         return 1
  395.     fi
  396.  
  397.     log_info "Starting Minecraft server backup..."
  398.     local backup_base_dir="/var/backups/minecraft_servers" # Central backup location
  399.     sudo mkdir -p "$backup_base_dir"
  400.     sudo chown -R "$USER":"$USER" "$backup_base_dir"
  401.  
  402.     local timestamp=$(date +%Y%m%d-%H%M%S)
  403.     local backup_filename="minecraft-server-backup-${timestamp}.tar.gz"
  404.     local full_backup_path="${backup_base_dir}/${backup_filename}"
  405.  
  406.     # Change to parent directory of SERVER_DIR for tar to work correctly
  407.     # e.g., if SERVER_DIR is /opt/minecraft, tar from /opt
  408.     log_info "Creating archive: ${full_backup_path}"
  409.     tar -czvf "${full_backup_path}" -C "$(dirname "$SERVER_DIR")" "$(basename "$SERVER_DIR")"
  410.     if [ $? -eq 0 ]; then
  411.         log_info "Backup complete: ${full_backup_path}"
  412.         log_info "You may want to move this backup to a safe off-site location."
  413.     else
  414.         log_error "Backup failed."
  415.     fi
  416. }
  417.  
  418. # Update the Minecraft server JAR
  419. update_server() {
  420.     if [ ! -f "${SERVER_DIR}/${SERVER_JAR_NAME}" ]; then
  421.         log_error "Server JAR not found at ${SERVER_DIR}/${SERVER_JAR_NAME}. Please install the server first."
  422.         return 1
  423.     fi
  424.  
  425.     log_info "Attempting to update Minecraft server JAR to the latest for version ${MINECRAFT_VERSION}..."
  426.     read -p "This will replace your current server JAR. Do you want to proceed? (y/N): " confirm_update
  427.     if [[ ! "$confirm_update" =~ ^[Yy]$ ]]; then
  428.         log_info "Server update cancelled."
  429.         return 0
  430.     fi
  431.  
  432.     # Stop server before update
  433.     if screen -list | grep -q "minecraft"; then
  434.         log_warn "Server is running. Stopping it before update..."
  435.         stop_server
  436.         sleep 5
  437.     fi
  438.  
  439.     # Backup existing JAR before replacement
  440.     mv "${SERVER_DIR}/${SERVER_JAR_NAME}" "${SERVER_DIR}/${SERVER_JAR_NAME}.old"
  441.     log_info "Old server JAR backed up to ${SERVER_JAR_NAME}.old"
  442.  
  443.     local update_success=1
  444.     case "$SERVER_TYPE" in
  445.         "vanilla") install_vanilla && update_success=0 ;;
  446.         "paper") install_papermc && update_success=0 ;;
  447.         "forge")
  448.             log_warn "Forge server updates typically involve downloading and running a new installer for your chosen Minecraft version."
  449.             log_warn "This process is manual. Please download the new Forge installer for ${MINECRAFT_VERSION}."
  450.             log_warn "Run it inside ${SERVER_DIR} to generate the updated server JAR."
  451.             log_warn "Then, ensure the new server JAR is correctly named and located in ${SERVER_DIR}."
  452.             read -p "Press Enter after you have manually updated Forge..."
  453.             # Re-detect JAR name after manual update
  454.             local found_jar=$(find "${SERVER_DIR}" -maxdepth 1 -name "forge-*-${MINECRAFT_VERSION}-*.jar" -o -name "server.jar" -o -name "minecraft_server.*.jar" -print -quit)
  455.             if [ -n "$found_jar" ]; then
  456.                 SERVER_JAR_NAME=$(basename "$found_jar")
  457.                 log_info "Detected new server JAR: ${SERVER_JAR_NAME}. If this is incorrect, manually set SERVER_JAR_NAME in the script."
  458.                 update_success=0
  459.             else
  460.                 log_error "Could not detect new Forge server JAR. Manual verification needed."
  461.             fi
  462.             ;;
  463.         "fabric")
  464.             log_warn "Fabric server updates typically involve downloading and running a new installer for your chosen Minecraft version."
  465.             log_warn "This process is manual. Please download the new Fabric installer for ${MINECRAFT_VERSION}."
  466.             log_warn "Run it inside ${SERVER_DIR} to generate the updated server JAR."
  467.             log_warn "Then, ensure the new server JAR is correctly named and located in ${SERVER_DIR}."
  468.             read -p "Press Enter after you have manually updated Fabric..."
  469.             # Re-detect JAR name after manual update
  470.             local found_jar=$(find "${SERVER_DIR}" -maxdepth 1 -name "fabric-server-mc*.jar" -o -name "server.jar" -print -quit)
  471.             if [ -n "$found_jar" ]; then
  472.                 SERVER_JAR_NAME=$(basename "$found_jar")
  473.                 log_info "Detected new server JAR: ${SERVER_JAR_NAME}. If this is incorrect, manually set SERVER_JAR_NAME in the script."
  474.                 update_success=0
  475.             else
  476.                 log_error "Could not detect new Fabric server JAR. Manual verification needed."
  477.             fi
  478.             ;;
  479.         *) log_error "Unknown server type (${SERVER_TYPE}) for automated update. Manual update required."; return 1 ;;
  480.     esac
  481.  
  482.     if [ "$update_success" -eq 0 ]; then
  483.         log_info "Server update attempt complete. Please check the logs if you experience issues."
  484.     else
  485.         log_error "Server update failed. Reverting to old JAR..."
  486.         mv "${SERVER_DIR}/${SERVER_JAR_NAME}.old" "${SERVER_DIR}/${SERVER_JAR_NAME}" # Revert
  487.         # If the JAR name changed, revert it in the script too
  488.         SERVER_JAR_NAME=$(basename "${SERVER_DIR}/${SERVER_JAR_NAME}")
  489.     fi
  490.  
  491.     # Start server after update (if it was running before)
  492.     if [[ "$(get_server_status)" != *RUNNING* ]]; then # Only restart if it was actually stopped
  493.         start_server
  494.     fi
  495. }
  496.  
  497. # --- Mod/Plugin Management Guidance (Not automated installation) ---
  498. manage_mods_plugins() {
  499.     clear
  500.     log_info "Minecraft Mod/Plugin Management Guidance"
  501.     echo ""
  502.     echo "Minecraft mods and plugins are highly dependent on your server type and Minecraft version."
  503.     echo "This script does NOT automatically download or install specific mods/plugins due to:"
  504.     echo "  - Their dynamic nature (versions, dependencies change constantly)."
  505.     echo "  - Compatibility issues (mods/plugins must match exact Minecraft and loader versions)."
  506.     echo "  - Legal/Terms of Service for downloading from third-party sites."
  507.     echo ""
  508.  
  509.     echo "Based on your current detected server type (${YELLOW}${SERVER_TYPE}${NC}):"
  510.     case "$SERVER_TYPE" in
  511.         "vanilla")
  512.             echo "  ${RED}Vanilla Minecraft servers do not natively support mods or plugins.${NC}"
  513.             echo "  If you want to use mods/plugins, you must install a PaperMC, Forge, or Fabric server (Option 1)."
  514.             ;;
  515.         "paper")
  516.             echo "  ${GREEN}PaperMC servers support Bukkit/Spigot/Paper plugins.${NC}"
  517.             echo "  These are server-side only and do not require client modifications."
  518.             echo "  To install plugins:"
  519.             echo "  1. Download plugin JAR files from reputable sources."
  520.             echo "     ${YELLOW}Recommended sites:${NC} https://www.spigotmc.org/resources/, https://modrinth.com/plugins"
  521.             echo "     Always check if the plugin supports Minecraft version ${MINECRAFT_VERSION}."
  522.             echo "  2. Place the downloaded plugin JAR files into the ${YELLOW}${SERVER_DIR}/plugins/${NC} directory."
  523.             echo "     If this directory doesn't exist, start the server once to create it, then stop it."
  524.             echo "  3. Restart your server for the plugins to load."
  525.             echo ""
  526.             echo "  ${YELLOW}Examples of popular PaperMC plugins (check compatibility for ${MINECRAFT_VERSION}):${NC}"
  527.             echo "  - EssentialsX: Core commands, homes, warps, kits, etc."
  528.             echo "  - LuckPerms: Advanced permissions management."
  529.             echo "  - WorldEdit/WorldGuard: Powerful tools for building and region protection."
  530.             echo "  - CoreProtect: Logging and rollback for grief prevention."
  531.             echo "  - Dynmap: Live, interactive web map of your server."
  532.             echo "  - Vault: API for plugins to hook into economic systems and permissions."
  533.             echo "  - ClearLag: Reduces server lag by clearing entities."
  534.             echo "  - MobStacker: Stacks mobs to reduce entity count and lag."
  535.             echo "  - ProtocolLib: Required by many advanced plugins."
  536.             echo "  - TAB: Customizes tab list, nametags, and prefixes."
  537.             ;;
  538.         "forge")
  539.             echo "  ${GREEN}Forge servers support Forge mods.${NC}"
  540.             echo "  Both your server AND players connecting must have the exact same Forge version and mods."
  541.             echo "  To install mods:"
  542.             echo "  1. Download mod JAR files from reputable sources."
  543.             echo "     ${YELLOW}Recommended sites:${NC} https://www.curseforge.com/minecraft/mc-mods, https://modrinth.com/mods"
  544.             echo "     Always check if the mod is for Minecraft version ${MINECRAFT_VERSION} AND your Forge version."
  545.             echo "  2. Place the downloaded mod JAR files into the ${YELLOW}${SERVER_DIR}/mods/${NC} directory."
  546.             echo "     If this directory doesn't exist, start the server once to create it, then stop it."
  547.             echo "  3. Restart your server for the mods to load."
  548.             echo ""
  549.             echo "  ${YELLOW}Examples of popular Forge mods (check compatibility for ${MINECRAFT_VERSION}):${NC}"
  550.             echo "  - Applied Energistics 2 / Refined Storage: Advanced item storage and automation."
  551.             echo "  - Thermal Expansion / Mekanism: Tech mods for power generation, machinery, and automation."
  552.             echo "  - Biomes O' Plenty / Oh The Biomes You'll Go: Adds many new biomes and world generation features."
  553.             echo "  - Twilight Forest: A new, exploration-focused dimension."
  554.             echo "  - Iron Chests: Upgraded chests with more storage space."
  555.             echo "  - Waystones: Teleportation points for easier travel."
  556.             echo "  - Botania: A magic-themed tech mod using natural flora."
  557.             echo "  - Create: A unique mod focused on contraptions, automation, and moving parts."
  558.             echo "  - Immersive Engineering: Adds realistic industrial machinery and power generation."
  559.             echo "  - Pam's HarvestCraft 2: Adds a vast array of new crops, foods, and cooking mechanics."
  560.             echo "  - Mystical Agriculture: Allows growing resources (ores, mob drops) from crops."
  561.             echo "  - JourneyMap / Xaero's World Map (Client-side maps, but popular in modpacks)."
  562.             echo "  - JEI (Just Enough Items): (Client-side, shows recipes and item info, essential for modpacks)."
  563.             ;;
  564.         "fabric")
  565.             echo "  ${GREEN}Fabric servers support Fabric mods.${NC}"
  566.             echo "  Both your server AND players connecting must have the exact same Fabric version and mods."
  567.             echo "  To install mods:"
  568.             echo "  1. Download mod JAR files from reputable sources."
  569.             echo "     ${YELLOW}Recommended sites:${NC} https://www.curseforge.com/minecraft/mc-mods, https://modrinth.com/mods"
  570.             echo "     Always check if the mod is for Minecraft version ${MINECRAFT_VERSION} AND your Fabric version."
  571.             echo "  2. Place the downloaded mod JAR files into the ${YELLOW}${SERVER_DIR}/mods/${NC} directory."
  572.             echo "     If this directory doesn't exist, start the server once to create it, then stop it."
  573.             echo "  3. Restart your server for the mods to load."
  574.             echo ""
  575.             echo "  ${YELLOW}Examples of popular Fabric mods (check compatibility for ${MINECRAFT_VERSION}):${NC}"
  576.             echo "  - Lithium: Server-side performance optimizations for game logic."
  577.             echo "  - Phosphor: Server-side performance optimizations for lighting engine."
  578.             echo "  - Carpet Mod: Technical utilities and bug fixes, often used by technical players."
  579.             echo "  - Fabric API: A library required by many Fabric mods."
  580.             echo "  - TerraLith / Tectonic / Incendium: Comprehensive world generation overhauls."
  581.             echo "  - Applied Energistics 2 / Refined Storage (available on Fabric): Advanced storage."
  582.             echo "  - Create (available on Fabric): Mechanical automation and contraptions."
  583.             echo "  - Waystones (available on Fabric): Teleportation points."
  584.             echo "  - BetterF3: (Client-side, improved debug screen)."
  585.             echo "  - Mod Menu: (Client-side, in-game mod configuration list)."
  586.             echo "  - Sodium / Iris / Indium: (Client-side performance & shaders, complement server)."
  587.             echo "  - Litematica: (Client-side, schematic placements for building)."
  588.             echo "  - Xaero's World Map / Minimap (Client-side maps, but popular)."
  589.             ;;
  590.         *)
  591.             echo "  ${YELLOW}Server type ${SERVER_TYPE} is unknown or not yet configured.${NC}"
  592.             echo "  Please install a server type (Option 1) to get specific mod/plugin guidance."
  593.             ;;
  594.     esac
  595.     echo ""
  596.     read -p "Press Enter to return to the main menu..."
  597. }
  598.  
  599. # Attach to the server console via screen
  600. attach_to_console() {
  601.     if screen -list | grep -q "minecraft"; then
  602.         log_info "Attaching to Minecraft server console. Press Ctrl+A then D to detach."
  603.         screen -r minecraft
  604.     else
  605.         log_warn "Minecraft server screen session not found. Is the server running (Option 2)?"
  606.         read -p "Press Enter to return to the main menu..."
  607.     fi
  608. }
  609.  
  610. # Change server configuration (RAM, Minecraft Version)
  611. change_config() {
  612.     clear
  613.     log_info "Current Server Configuration:"
  614.     echo "1) Minecraft Version: ${YELLOW}${MINECRAFT_VERSION}${NC}"
  615.     echo "2) Allocated RAM: ${YELLOW}${JAVA_MEMORY}${NC}"
  616.     echo "3) Server Directory: ${YELLOW}${SERVER_DIR}${NC} (Cannot be changed here without reinstall)"
  617.  
  618.     echo ""
  619.     read -p "Enter number to change (1, 2) or 'b' to go back: " config_choice
  620.  
  621.     case "$config_choice" in
  622.         1)
  623.             read -p "Enter new Minecraft version (e.g., 1.20.4, 1.19.2): " new_version
  624.             # Basic validation: check for X.Y.Z or X.Y format
  625.             if [[ "$new_version" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then
  626.                 MINECRAFT_VERSION="$new_version"
  627.                 log_info "Minecraft Version updated to ${MINECRAFT_VERSION}. Remember to run 'Install/Reinstall' (Option 1) or 'Update' (Option 6) for changes to take effect."
  628.             else
  629.                 log_error "Invalid version format. Please use X.Y.Z or X.Y (e.g., 1.20.4)."
  630.             fi
  631.             ;;
  632.         2)
  633.             read -p "Enter new allocated RAM (e.g., 2G, 4G, 8G, 4096M): " new_ram
  634.             if [[ "$new_ram" =~ ^[0-9]+[MG]$ ]]; then
  635.                 JAVA_MEMORY="$new_ram"
  636.                 log_info "Allocated RAM updated to ${JAVA_MEMORY}. Restart server (Option 4) for changes to take effect."
  637.             else
  638.                 log_error "Invalid RAM format. Please use numbers followed by G (Gigabytes) or M (Megabytes)."
  639.             fi
  640.             ;;
  641.         b|B)
  642.             log_info "Returning to main menu."
  643.             ;;
  644.         *)
  645.             log_error "Invalid choice."
  646.             ;;
  647.     esac
  648.     read -p "Press Enter to continue..."
  649. }
  650.  
  651. # --- Main Menu Display ---
  652. display_menu() {
  653.     clear
  654.     echo -e "${GREEN}------------------------------------------------${NC}"
  655.     echo -e "${CYAN}  Minecraft Server Management Script for Ubuntu ${NC}"
  656.     echo -e "${GREEN}------------------------------------------------${NC}"
  657.     echo -e "${BLUE}Server Information:${NC}"
  658.     echo -e "${GREEN}  Server Directory: ${YELLOW}${SERVER_DIR}${NC}"
  659.     echo -e "${GREEN}  Minecraft Version: ${YELLOW}${MINECRAFT_VERSION}${NC}"
  660.     echo -e "${GREEN}  Server Type: ${YELLOW}${SERVER_TYPE}${NC}"
  661.     echo -e "${GREEN}  Allocated RAM: ${YELLOW}${JAVA_MEMORY}${NC}"
  662.     echo -e "${GREEN}  Server Status: $(get_server_status)${NC}"
  663.     echo -e "${GREEN}------------------------------------------------${NC}"
  664.     echo -e "${BLUE}Server Actions:${NC}"
  665.     echo -e "${GREEN}1)${NC} ${YELLOW}Install/Reinstall Minecraft Server${NC}"
  666.     echo -e "${GREEN}2)${NC} ${YELLOW}Start Minecraft Server${NC}"
  667.     echo -e "${GREEN}3)${NC} ${YELLOW}Stop Minecraft Server${NC}"
  668.     echo -e "${GREEN}4)${NC} ${YELLOW}Restart Minecraft Server${NC}"
  669.     echo -e "${GREEN}5)${NC} ${YELLOW}Backup Minecraft Server${NC}"
  670.     echo -e "${GREEN}6)${NC} ${YELLOW}Update Minecraft Server JAR${NC}"
  671.     echo -e "${GREEN}7)${NC} ${YELLOW}Manage Mods/Plugins (Guidance Only)${NC}"
  672.     echo -e "${GREEN}8)${NC} ${YELLOW}Attach to Server Console${NC}"
  673.     echo -e "${GREEN}9)${NC} ${YELLOW}Change Server Configuration (RAM/Version)${NC}"
  674.     echo -e "${GREEN}0)${NC} ${RED}Exit${NC}"
  675.     echo -e "${GREEN}------------------------------------------------${NC}"
  676.     read -p "Enter your choice: " choice
  677. }
  678.  
  679. # --- Main Script Logic ---
  680. main() {
  681.     # Perform initial prerequisite checks
  682.     check_prerequisites
  683.  
  684.     # Attempt to detect SERVER_JAR_NAME and SERVER_TYPE if server directory already exists
  685.     if [ -d "$SERVER_DIR" ]; then
  686.         local found_jar=$(find "${SERVER_DIR}" -maxdepth 1 -name "*.jar" -print -quit)
  687.         if [ -n "$found_jar" ]; then
  688.             SERVER_JAR_NAME=$(basename "$found_jar")
  689.             log_info "Detected existing server JAR: ${SERVER_JAR_NAME}"
  690.  
  691.             # Infer server type from JAR name heuristics
  692.             if [[ "$SERVER_JAR_NAME" == "server.jar" ]]; then
  693.                 SERVER_TYPE="vanilla"
  694.             elif [[ "$SERVER_JAR_NAME" == paper-*-*.jar ]]; then
  695.                 SERVER_TYPE="paper"
  696.             elif [[ "$SERVER_JAR_NAME" == forge-*.jar ]]; then
  697.                 SERVER_TYPE="forge"
  698.             elif [[ "$SERVER_JAR_NAME" == fabric-server-mc*.jar ]]; then
  699.                 SERVER_TYPE="fabric"
  700.             else
  701.                 SERVER_TYPE="unknown"
  702.                 log_warn "Could not determine server type from JAR name. Please manually set SERVER_TYPE if needed."
  703.             fi
  704.             log_info "Inferred server type: ${SERVER_TYPE}"
  705.         else
  706.             log_warn "No server JAR detected in ${SERVER_DIR}. Please run installation (Option 1)."
  707.             SERVER_TYPE="unknown"
  708.             SERVER_JAR_NAME="server.jar" # Set a default placeholder
  709.         fi
  710.     fi
  711.  
  712.     # Main menu loop
  713.     while true; do
  714.         display_menu
  715.         case "$choice" in
  716.             1) install_minecraft_server ;;
  717.             2) start_server ;;
  718.             3) stop_server ;;
  719.             4) restart_server ;;
  720.             5) backup_server ;;
  721.             6) update_server ;;
  722.             7) manage_mods_plugins ;;
  723.             8) attach_to_console ;;
  724.             9) change_config ;;
  725.             0)
  726.                 log_info "Exiting. Goodbye!"
  727.                 exit 0
  728.                 ;;
  729.             *) log_error "Invalid choice. Please enter a number from the menu." ;;
  730.         esac
  731.         # Pause after each action, unless it's attaching to console or exiting
  732.         if [[ "$choice" != "8" && "$choice" != "0" ]]; then
  733.             read -p "Press Enter to return to the menu..."
  734.         fi
  735.     done
  736. }
  737.  
  738. # Execute the main function
  739. main
Tags: minecraft
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement