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.
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.
- 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.
- 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.
- 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.
- 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.
sudo install -d -o minecraft -g minecraft -m 700 /etc/minecraft-backupsudo install -d -o minecraft -g minecraft -m 700 /var/backups/minecraftsudo -u minecraft nano /etc/minecraft-backup/spaces.envEnregistrez les deux variables d’identification, quittez l’éditeur, puis continuez.
- 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 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.
export AWS_DEFAULT_REGION=us-east-1- 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 - 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.comVé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/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"sudo chown root:minecraft /usr/local/sbin/backup-minecraft-to-spacessudo 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.
# /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.
{ "Rules": [ { "ID": "expire-minecraft-backups", "Filter": { "Prefix": "serveur-java/" }, "Status": "Enabled", "Expiration": { "Days": 30 }, "NoncurrentVersionExpiration": { "NoncurrentDays": 30 }, "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 1 } } ] }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.
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.jsonRelisez 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.
set -a && . /etc/minecraft-backup/spaces.env && set +a && export AWS_DEFAULT_REGION=us-east-1restore_dir=$(mktemp -d /tmp/minecraft-restore-test.XXXXXX)- Remplacez chaque valeur surlignée avant d’exécuter la commande.
archive="$restore_dir/minecraft-AAAA-MM-JJTHH-MM-SSZ.tar.gz" - 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" tar -tzf "$archive" | sed -n '1,40p'La liste contient le monde et les fichiers de configuration attendus.
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.