← Tous les guidesGitHub
Exploitation de serveur de jeu

Sauvegarder un serveur Minecraft avec DigitalOcean Spaces

Créez des sauvegardes Minecraft cohérentes, envoyez-les dans un compartiment DigitalOcean Spaces privé et vérifiez réellement une restauration.

Lire l’articleGitHub: TylorMayfield/minecraft-spaces-backup

Définir ce qu’une restauration réussie doit contenir

Une sauvegarde ne sert que si elle restaure le monde attendu par vos joueurs. Pour un serveur Java classique, cela comprend généralement les dossiers de monde, la configuration, la liste blanche, les opérateurs, les plugins ou mods, ainsi que la version du serveur ou la définition du conteneur nécessaire pour le démarrer. Notez d’abord où se trouvent ces éléments : certains hébergements placent le monde hors du dossier qui contient server.jar.

Ce guide vise un serveur Java hébergé sous Linux et utilise AWS CLI, car Spaces accepte les requêtes compatibles S3. Il ne remplace ni une copie cohérente d’une base de données en cours d’utilisation ni un plan de reprise testé. Si votre serveur utilise un panneau, un volume Docker ou un modpack avec ses propres données, ajoutez ces chemins explicitement et testez le résultat sur une autre machine ou dans un autre dossier.

  • Un compartiment Spaces privé, dans une région choisie volontairement.
  • Une clé Spaces à accès limité, avec lecture/écriture/suppression sur ce seul compartiment.
  • AWS CLI, tar et assez d’espace local pour créer une archive.
  • Une unité systemd dont l’arrêt enregistre et ferme Minecraft proprement.

Créer un compartiment privé et une clé réservée à la sauvegarde

Définissez la frontière de stockage avant de placer un identifiant sur le serveur de jeu. Gardez le compartiment privé : n’activez pas l’affichage public des fichiers et n’utilisez pas le CDN pour les sauvegardes.

  1. Dans DigitalOcean, ouvrez Spaces Object Storage et créez un compartiment tel que minecraft-backups-votre-serveur. Choisissez soigneusement la région : les noms de compartiment sont uniques au niveau mondial, la région ne peut pas être changée par la suite et l’endpoint régional est utilisé par chaque commande CLI.
  2. Ouvrez l’onglet Spaces Access Keys et créez une clé limitée à ce seul compartiment avec la permission Read/Write/Delete. Enregistrez son secret lorsqu’il apparaît : le panneau de contrôle ne l’affiche qu’une fois.
  3. Conservez cette clé limitée uniquement sur le serveur de jeu avec la commande ci-dessous. Elle peut envoyer, télécharger, lister et supprimer les sauvegardes, et peut être renouvelée ou révoquée sans perturber une autre application.
  4. Gardez une clé distincte avec accès complet sur un poste d’administration pour la configuration ponctuelle du versionnage et du cycle de vie aux étapes suivantes. N’ajoutez pas de politique de compartiment S3 : les clés limitées et les politiques de compartiment ne sont pas compatibles dans cette configuration.
  1. Créer le dossier de configurationServeur distant
    sudo install -d -o minecraft -g minecraft -m 700 /etc/minecraft-backup
  2. Créer le dossier de sauvegarde
    sudo install -d -o minecraft -g minecraft -m 700 /var/backups/minecraft
  3. Ouvrir le fichier d’identifiantsÉditeur de fichiers
    sudo -u minecraft nano /etc/minecraft-backup/spaces.env

    Enregistrez les deux variables d’identification, quittez l’éditeur, puis continuez.

  4. Saisir les deux variables d’identificationContenu du fichier
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    AWS_ACCESS_KEY_ID=votre_cle_spaces
    AWS_SECRET_ACCESS_KEY=votre_secret_spaces
  5. Protéger le fichier d’identifiantsServeur distant
    sudo chmod 600 /etc/minecraft-backup/spaces.env

Activer le versionnage avant le premier envoi

Le versionnage est une couche de récupération supplémentaire, pas un substitut à la rétention. Une modification ou une suppression ordinaire laisse un historique que vous pouvez inspecter et restaurer. DigitalOcean exige ici l’endpoint régional : utilisez par exemple nyc3.digitaloceanspaces.com, et non l’endpoint d’origine qui contient le nom du compartiment.

Définissez AWS_DEFAULT_REGION sur us-east-1 pour satisfaire le réglage requis côté client par AWS CLI ; l’endpoint Spaces, et non cette valeur, détermine la région effective du compartiment. Remplacez les espaces réservés ci-dessous par votre compartiment et votre région Spaces.

  1. Définir la région du client AWSPoste d’administration
    export AWS_DEFAULT_REGION=us-east-1
  2. Activer le versionnage
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    aws s3api put-bucket-versioning --bucket VOTRE_COMPARTIMENT --endpoint-url https://VOTRE_REGION.digitaloceanspaces.com --versioning-configuration Status=Enabled
  3. Vérifier le versionnage
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    aws s3api get-bucket-versioning --bucket VOTRE_COMPARTIMENT --endpoint-url https://VOTRE_REGION.digitaloceanspaces.com

    Vérifiez que l’état renvoyé est Enabled avant de continuer.

Créer une archive cohérente du monde, puis l’envoyer

Cette méthode utilise un serveur existant géré par systemd et une interruption prévue. Réglez SERVICE sur votre unité et vérifiez que systemctl stop arrête Minecraft proprement. Consultez son journal et attendez la fin de l’enregistrement lors d’un essai manuel avant de planifier. Le script s’exécute avec root, arrête le service, archive puis redémarre seulement s’il était actif.

Réglez SERVER_DIR et WORLD_NAME selon l’installation et level-name dans server.properties. La liste inclut les dossiers existants du monde, de configuration, plugins et mods. save-off ne bloque pas tous les fichiers de plugins ni les bases externes. Sauvegardez ces bases séparément avec leur procédure officielle.

/usr/local/sbin/backup-minecraft-to-spacesContenu du fichier
#!/usr/bin/env bash
set -euo pipefail
PATH=/usr/local/bin:/usr/bin:/bin
export PATH

SERVER_DIR=/srv/minecraft
WORLD_NAME=world # Match level-name in server.properties.
BACKUP_DIR=/var/backups/minecraft
BUCKET=YOUR_BUCKET
REGION=YOUR_REGION
PREFIX=java-server
SERVICE=minecraft.service # Replace with your systemd unit.
was_running=false
resume_server() {
  if [[ "$was_running" == true ]]; then systemctl start "$SERVICE"; fi
}
trap resume_server EXIT

set -a
. /etc/minecraft-backup/spaces.env
set +a
export AWS_DEFAULT_REGION=us-east-1
mkdir -p "$BACKUP_DIR"
STAMP=$(date -u +%Y-%m-%dT%H-%M-%SZ)
ARCHIVE="$BACKUP_DIR/minecraft-$STAMP.tar.gz"

[[ -d "$SERVER_DIR/$WORLD_NAME" ]] || {
  echo "Set SERVER_DIR and WORLD_NAME before running this backup." >&2
  exit 1
}
[[ -f "$SERVER_DIR/server.properties" ]] || {
  echo "server.properties is missing from SERVER_DIR." >&2
  exit 1
}
INCLUDE=("$WORLD_NAME" server.properties)
for path in \
  "${WORLD_NAME}_nether" "${WORLD_NAME}_the_end" \
  whitelist.json ops.json banned-players.json banned-ips.json plugins mods config; do
  [[ -e "$SERVER_DIR/$path" ]] && INCLUDE+=("$path")
done

systemctl cat "$SERVICE" > /dev/null
if systemctl is-active --quiet "$SERVICE"; then
  was_running=true
  systemctl stop "$SERVICE"
fi
state=$(systemctl show -p ActiveState --value "$SERVICE")
[[ "$state" == inactive ]] || { echo "Server is not fully stopped: $state" >&2; exit 1; }
tar -C "$SERVER_DIR" -czf "$ARCHIVE" \
  --exclude=logs --exclude=cache --exclude=backups \
  "${INCLUDE[@]}"
resume_server
was_running=false
trap - EXIT

aws s3 cp "$ARCHIVE" "s3://$BUCKET/$PREFIX/$(basename "$ARCHIVE")" \
  --endpoint-url "https://$REGION.digitaloceanspaces.com" --only-show-errors
rm -f "$ARCHIVE"
  1. Définir le propriétaire du scriptServeur distant
    sudo chown root:minecraft /usr/local/sbin/backup-minecraft-to-spaces
  2. Limiter l’exécution du script
    sudo chmod 750 /usr/local/sbin/backup-minecraft-to-spaces

Planifier la tâche et rendre les erreurs visibles

Exécutez le script avec root et vérifiez l’archive dans Spaces avant de planifier. Créez le journal avec sudo install -o root -g root -m 600 /dev/null /var/log/minecraft-backup.log. Enregistrez le bloc dans /etc/cron.d/minecraft-backup, propriétaire root, mode 644 et saut de ligne final. Il utilise l’heure locale du serveur. Prévoyez une alerte pour tout échec ou archive quotidienne manquante.

Une sauvegarde quotidienne est un bon départ pour un serveur personnel peu actif, mais ce n’est pas une réponse universelle. Choisissez la fréquence d’après la quantité de données que vous acceptez de perdre. Si perdre une soirée de construction est inacceptable, sauvegardez plus souvent et équilibrez ce choix avec la taille des archives, le temps d’envoi et le coût de rétention.

  1. Enregistrer dans /etc/cron.d/minecraft-backupContenu du fichier
    # /etc/cron.d/minecraft-backup
    SHELL=/bin/bash
    PATH=/usr/local/bin:/usr/bin:/bin
    17 4 * * * root /usr/local/sbin/backup-minecraft-to-spaces >> /var/log/minecraft-backup.log 2>&1
    

Appliquer une rétention sans supprimer le seul point de récupération

Les règles de cycle de vie Spaces peuvent expirer des objets après un certain nombre de jours et supprimer les envois multipartites incomplets. Choisissez une durée qui correspond à vos besoins de récupération, puis vérifiez exactement ce qu’elle couvre avant de l’activer. Une règle de 30 jours est simple à expliquer, mais elle peut être trop courte si un dommage au monde n’est détecté que plusieurs semaines après.

Le versionnage modifie la manière dont les suppressions fonctionnent : supprimer un objet peut laisser des versions antérieures et des marqueurs de suppression. Examinez ensemble le versionnage et le cycle de vie, surtout avant de compter sur un nettoyage automatique. Gardez au moins un chemin de récupération testé et indépendant pour un monde que vous ne pouvez pas perdre.

Avant de continuer : Cette commande expire des objets de sauvegarde. Vérifiez le compartiment et la durée de conservation avant de l’exécuter.

  1. Enregistrer comme lifecycle.jsonContenu du fichier
    {
      "Rules": [
        {
          "ID": "expire-minecraft-backups",
          "Filter": { "Prefix": "serveur-java/" },
          "Status": "Enabled",
          "Expiration": { "Days": 30 },
          "NoncurrentVersionExpiration": { "NoncurrentDays": 30 },
          "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 1 }
        }
      ]
    }
  2. Avant de continuer : Cette commande remplace toute la configuration du cycle de vie du compartiment. Vérifiez le compartiment, le fichier lifecycle.json et les règles existantes avant de l’exécuter.

    Appliquer la configuration du cycle de viePoste d’administration
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    aws s3api put-bucket-lifecycle-configuration --bucket VOTRE_COMPARTIMENT --endpoint-url https://VOTRE_REGION.digitaloceanspaces.com --lifecycle-configuration file://lifecycle.json

    Relisez ensuite la configuration et vérifiez le préfixe et la rétention.

Prouver qu’une restauration fonctionne avant l’urgence

Choisissez une archive récente et restaurez-la dans un dossier de test vide. Vérifiez que l’archive contient les fichiers de monde et de configuration attendus avant de démarrer un processus Minecraft dessus. Pour un test plus solide, lancez une copie isolée sur un autre port avec la même version du serveur et laissez un administrateur la rejoindre.

Ne restaurez pas sur le dossier de production tant que le serveur de production fonctionne. Arrêtez le serveur, conservez le dossier endommagé jusqu’à ce que le monde restauré soit vérifié, puis échangez les dossiers pendant une fenêtre de maintenance planifiée.

  1. Charger l’environnement SpacesMachine de test isolée
    set -a && . /etc/minecraft-backup/spaces.env && set +a && export AWS_DEFAULT_REGION=us-east-1
  2. Créer un dossier de restauration vide
    restore_dir=$(mktemp -d /tmp/minecraft-restore-test.XXXXXX)
  3. Définir le chemin de l’archive
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    archive="$restore_dir/minecraft-AAAA-MM-JJTHH-MM-SSZ.tar.gz"
  4. Télécharger l’archive
    Remplacez chaque valeur surlignée avant d’exécuter la commande.
    aws s3 cp "s3://VOTRE_COMPARTIMENT/serveur-java/minecraft-AAAA-MM-JJTHH-MM-SSZ.tar.gz" "$archive" --endpoint-url "https://VOTRE_REGION.digitaloceanspaces.com"
  5. Examiner l’archive
    tar -tzf "$archive" | sed -n '1,40p'

    La liste contient le monde et les fichiers de configuration attendus.

  6. Extraire l’archive
    tar -xzf "$archive" -C "$restore_dir"

    L’archive est extraite dans le nouveau dossier temporaire sans toucher à la production.

Vérifier le résultat

Résultat attendu
L’archive distante existe sous le bon préfixe du compartiment privé et le dossier de test restauré contient le monde et les fichiers de configuration attendus.
Arrêter si
Arrêtez si l’archive manque, si la cible est le dossier du serveur de production, si le compartiment est public ou si l’archive ne contient pas les fichiers nécessaires.
Étape suivante
Lancez la copie restaurée sur un autre port lorsque c’est possible et vérifiez qu’un administrateur peut la rejoindre avant de compter sur la planification des sauvegardes.