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.
Une bonne sauvegarde est volontairement banale : arrêter proprement le serveur pendant une interruption prévue, créer une archive, redémarrer le service s’il fonctionnait, envoyer l’archive dans un compartiment privé et tester sa restauration avant une urgence.
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, pour les sauvegardes et les téléchargements de test. Une clé distincte avec accès complet reste sur le poste d’administration pour configurer le versionnage et le cycle de vie.
- 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.
# Remplacez minecraft par le compte qui exécute le serveur et la tâche planifiée.
sudo install -d -o minecraft -g minecraft -m 700 /etc/minecraft-backup
sudo install -d -o minecraft -g minecraft -m 700 /var/backups/minecraft
sudo -u minecraft nano /etc/minecraft-backup/spaces.env
# Ajoutez ces deux lignes, puis enregistrez :
# AWS_ACCESS_KEY_ID=votre_cle_spaces
# AWS_SECRET_ACCESS_KEY=votre_secret_spaces
sudo chmod 600 /etc/minecraft-backup/spaces.env
Contrôles de stockage : droits des clés Spaces, versionnement et points d’accès régionaux, cycle de vie. Conservez la clé administrateur à accès complet sur le poste d’administration ; ne chargez jamais la clé limitée du serveur de jeu pour configurer le bucket.
Activer le versionnage avant le premier envoi
Le versionnage conserve des versions antérieures après un remplacement ou une suppression ordinaire. Une fois activé, le compartiment ne revient pas à l’état sans versionnage ; vous pouvez le suspendre. Prévoyez la rétention des anciennes versions. Pour ces commandes, utilisez l’endpoint régional, par exemple nyc3.digitaloceanspaces.com, sans le nom du compartiment.
Références : Versionnage Spaces · États du versionnage S3.
Exécutez cette configuration ponctuelle sur le poste d’administration, dans un terminal où AWS CLI utilise déjà la clé Spaces distincte avec accès complet. Ne chargez pas /etc/minecraft-backup/spaces.env : ce fichier contient la clé limitée du serveur de jeu. Définissez AWS_DEFAULT_REGION sur us-east-1 pour le réglage client ; l’endpoint Spaces sélectionne la région du compartiment. Remplacez VOTRE_COMPARTIMENT et VOTRE_REGION.
Les droits requis sont détaillés dans la référence de l’API Spaces.
# Poste d’administration : AWS CLI utilise la clé Spaces avec accès complet.
# Ne chargez pas le fichier de clé limitée du serveur de jeu.
export AWS_DEFAULT_REGION=us-east-1
aws s3api put-bucket-versioning --bucket VOTRE_COMPARTIMENT \
--endpoint-url https://VOTRE_REGION.digitaloceanspaces.com \
--versioning-configuration Status=Enabled
aws s3api get-bucket-versioning --bucket VOTRE_COMPARTIMENT \
--endpoint-url https://VOTRE_REGION.digitaloceanspaces.com
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.
Le script ci-dessous ne conserve pas automatiquement le binaire server.jar, le lanceur du modpack ou une image de conteneur. Conservez séparément l’artefact exact nécessaire au démarrage, sa version, les bibliothèques requises et la commande de lancement ; pour un conteneur, notez aussi son digest. Utilisez ces mêmes éléments lors de la restauration. Extraire seulement les fichiers du monde ne prouve pas que le serveur redémarrera.
#!/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"
# After saving the script:
sudo chown root:root /usr/local/sbin/backup-minecraft-to-spaces
sudo chmod 700 /usr/local/sbin/backup-minecraft-to-spaces
sudo /usr/local/sbin/backup-minecraft-to-spaces
Planifier la tâche et rendre les erreurs visibles
Exécutez le script avec root, vérifiez l’archive dans Spaces et terminez le test de restauration isolé décrit plus bas 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. Configurez une alerte si la tâche échoue ou si aucune nouvelle archive n’est présente après l’échéance prévue. Vérifiez ce canal d’alerte avant de compter sur la tâche quotidienne.
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.
Avec le versionnage, l’expiration de l’objet courant ne suffit pas à supprimer les versions antérieures. L’exemple ci-dessous vise uniquement java-server/ : expiration de l’objet courant après 30 jours, suppression des versions devenues non courantes depuis 30 jours, abandon des envois multipartites incomplets après un jour et nettoyage séparé des marqueurs de suppression devenus inutiles. Le délai des versions non courantes commence quand elles deviennent non courantes, pas lors de l’envoi initial.
La commande remplace toute la configuration de cycle de vie du compartiment. Utilisez un compartiment dédié ou récupérez et fusionnez d’abord les règles existantes. Si la récupération échoue pour une raison autre que l’absence confirmée de règles, arrêtez-vous. N’appliquez pas cet exemple tel quel à un compartiment partagé. Ces expirations peuvent supprimer définitivement des points de récupération.
Vérifiez la compatibilité Spaces, le mode de configuration Spaces et la syntaxe AWS CLI. Relisez la configuration après l’envoi et vérifiez le comportement sur des objets de test avant de compter sur le nettoyage automatique. Aucun nettoyage ni aucune restauration ne sont présentés ici comme exécutés.
# Poste d’administration, avec la clé Spaces distincte à accès complet.
export AWS_DEFAULT_REGION=us-east-1
# Lisez et conservez les règles existantes avant toute modification.
aws s3api get-bucket-lifecycle-configuration \
--bucket VOTRE_COMPARTIMENT \
--endpoint-url https://VOTRE_REGION.digitaloceanspaces.com
# Exemple réservé à un compartiment dédié sans autre règle à conserver.
cat > lifecycle.json <<'JSON'
{
"Rules": [
{
"ID": "expire-java-server-backups",
"Filter": { "Prefix": "java-server/" },
"Status": "Enabled",
"Expiration": { "Days": 30 },
"NoncurrentVersionExpiration": { "NoncurrentDays": 30 },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 1 }
},
{
"ID": "remove-expired-java-server-delete-markers",
"Filter": { "Prefix": "java-server/" },
"Status": "Enabled",
"Expiration": { "ExpiredObjectDeleteMarker": true }
}
]
}
JSON
aws s3api put-bucket-lifecycle-configuration \
--bucket VOTRE_COMPARTIMENT \
--endpoint-url https://VOTRE_REGION.digitaloceanspaces.com \
--lifecycle-configuration file://lifecycle.json
aws s3api get-bucket-lifecycle-configuration \
--bucket VOTRE_COMPARTIMENT \
--endpoint-url https://VOTRE_REGION.digitaloceanspaces.com
Prouver qu’une restauration fonctionne avant l’urgence
Choisissez une archive récente et extrayez-la dans un nouveau dossier de test, sans toucher aux données de production. Vérifiez les fichiers du monde et la configuration, puis démarrez une instance isolée avec l’artefact exact conservé et un autre port. Empêchez les plugins de cette instance de joindre les bases ou services de production. Faites vérifier le monde restauré par un administrateur et consignez l’archive, la version, les contrôles et leur résultat. Terminez cet essai avant de planifier la sauvegarde ; l’extraction seule ne valide pas le redémarrage.
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.
# Terminal root du serveur de jeu, avec sa clé limitée de sauvegarde.
# Remplacez le nom d’archive par celui d’un objet réellement présent.
set -a
. /etc/minecraft-backup/spaces.env
set +a
export AWS_DEFAULT_REGION=us-east-1
restore_dir=$(mktemp -d /tmp/minecraft-restore-test.XXXXXX)
archive="$restore_dir/minecraft-AAAA-MM-JJTHH-MM-SSZ.tar.gz"
aws s3 cp "s3://VOTRE_COMPARTIMENT/java-server/minecraft-AAAA-MM-JJTHH-MM-SSZ.tar.gz" "$archive" \
--endpoint-url "https://VOTRE_REGION.digitaloceanspaces.com"
tar -tzf "$archive" | sed -n '1,40p'
tar -xzf "$archive" -C "$restore_dir"
printf 'Dossier de restauration : %s\n' "$restore_dir"
Questions fréquentes
Le compartiment de sauvegarde Minecraft doit-il être public ?
Non. Les sauvegardes peuvent contenir des données de joueurs, de la configuration et des secrets du serveur. Gardez le compartiment privé et utilisez une clé limitée réservée à la tâche de sauvegarde.
Puis-je sauvegarder un serveur Minecraft actif ?
La procédure de ce guide arrête proprement le service pendant la création de l’archive, puis le redémarre seulement s’il fonctionnait auparavant. Prévoyez cette interruption. Une simple pause des sauvegardes du monde ne fige pas nécessairement les fichiers des plugins ni leurs bases externes ; utilisez leur procédure de sauvegarde prise en charge et vérifiez la restauration.
Le versionnage Spaces remplace-t-il les sauvegardes ?
Non. Il protège contre certaines modifications et suppressions dans le compartiment. Il vous faut toujours des règles de rétention, un test de restauration et, quand le monde est critique, une copie de récupération indépendante en dehors du même système de stockage.