6. Minecraft server in Portainer - JiltedGeek/Docker-Portainer GitHub Wiki

Stacks script for creating a Minecraft server as a container in Portainer

version: "3.8"

services:
  init-minecraft-dirs:
    image: busybox
    command: >
      sh -c "mkdir -p /data /data/minecraft /data/minecraft/backups /data/minecraft/world &&
             chown -R 1000:1000 /data && chmod -R u+rwX /data/minecraft/backups"
    restart: "no"

  minecraft-server:
    image: itzg/minecraft-server:latest
    depends_on:
      - init-minecraft-dirs
    environment:
      EULA: "TRUE"
      VERSION: "1.21.4"
      TYPE: "VANILLA"
      ENABLE_ROLLING_LOGS: "true"
      TZ: "Europe/Amsterdam"
      SEED: "-5633977550482986697"
      DIFFICULTY: "normal"
      MODE: "survival"
    ports:
      - "25565:25565"
    volumes:
      - /data/minecraft:/data
      - /data/minecraft/world:/data/world  # world map op een aparte hostmap
    restart: unless-stopped

volumes:
  minecraft_data:


Backup of the minecraft server every day, 7 day retention

Create folder

sudo mkdir -p /data/minecraft/backups

Create script in home folder calles backup-minecraft.sh

sudo nano /home/pi/backup-minecraft.sh

The script

#!/bin/bash

# Instellingen
CONTAINER_NAME="minecraft-minecraft-server-1"
WORLD_DIR="/data/minecraft/world"
BACKUP_DIR="/data/minecraft/backups"
DATE=$(date +'%Y-%m-%d')
BACKUP_FILE="$BACKUP_DIR/world-$DATE.tar.gz"

# Backup directory aanmaken als die nog niet bestaat
mkdir -p "$BACKUP_DIR"

# Container pauzeren om corrupte saves te voorkomen
docker pause "$CONTAINER_NAME"

# Wacht een paar seconden zodat alles stabiel is
sleep 5

# Maak de backup
tar -czf "$BACKUP_FILE" -C "$(dirname "$WORLD_DIR")" "$(basename "$WORLD_DIR")"

# Container weer hervatten
docker unpause "$CONTAINER_NAME"

# Oude backups opruimen (alleen de 7 nieuwste houden)
ls -tp "$BACKUP_DIR"/*.tar.gz | grep -v '/$' | tail -n +8 | xargs -r rm --

echo "Backup voltooid: $BACKUP_FILE"

Make the script executable

sudo chmod +x /home/pi/backup-minecraft.sh

Schedule the script for everyday at 3:00 (AM) and 7 days a week (removes the first when the 8th is created)

sudo crontab -e

Add the following line at the bottom

0 3 * * * /home/pi/backup-minecraft.sh >> /data/minecraft/backups/backup-log.txt 2>&1

Restore script

#!/bin/bash

if [ -z "$1" ]; then
  echo "Gebruik: restore-minecraft.sh <backup-bestand.tar.gz>"
  exit 1
fi

BACKUP_FILE="/data/minecraft/backups/$1"
WORLD_DIR="/data/minecraft/world"
CONTAINER="minecraft-minecraft-server-1"

if [ ! -f "$BACKUP_FILE" ]; then
  echo "Backup-bestand niet gevonden: $BACKUP_FILE"
  exit 1
fi

echo "Stoppen van container..."
docker stop "$CONTAINER"

echo "Backuppen van huidige wereldmap..."
cp -r "$WORLD_DIR" "/data/minecraft/world.bak.$(date +%F-%H%M)"

echo "Verwijderen van huidige wereldmap..."
rm -rf "$WORLD_DIR"

echo "Uitpakken van backup..."
tar -xzf "$BACKUP_FILE" -C /data/minecraft

echo "Starten van container..."
docker start "$CONTAINER"

echo "Restore voltooid."

Make the script executable

sudo chmod +x restore-minecraft.sh

Start the script as follows

sudo ./restore-minecraft.sh world-2025-04-14.tar.gz