new version
Some checks failed
Ansible Minecraft CI/CD / Ansible Lint (push) Successful in 8s
Ansible Minecraft CI/CD / Syntax Check (push) Failing after 7s
Ansible Minecraft CI/CD / Deploy to Staging (push) Has been skipped
Ansible Minecraft CI/CD / Deploy to Production (push) Has been skipped

This commit is contained in:
2025-08-27 15:11:08 +02:00
parent 3e64946953
commit 8f0877cd53
105 changed files with 911 additions and 2540 deletions

View File

@@ -1,11 +0,0 @@
---
backup_base_dir: /opt/minecraft/backups
backup_daily_dir: "{{ backup_base_dir }}/daily"
backup_weekly_dir: "{{ backup_base_dir }}/weekly"
backup_monthly_dir: "{{ backup_base_dir }}/monthly"
backup_retention_daily: 7
backup_retention_weekly: 4
backup_retention_monthly: 3
backup_time_daily: "03:00"
backup_time_weekly: "04:00"
backup_time_monthly: "05:00"

View File

@@ -2,5 +2,4 @@
- name: reload cron
ansible.builtin.service:
name: cron
state: reloaded
listen: reload cron service
state: reloaded

View File

@@ -1,9 +0,0 @@
---
- name: Create backup directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
loop: "{{ backup_dirs }}"

View File

@@ -0,0 +1,12 @@
---
- name: Création de la structure des sauvegardes
ansible.builtin.file:
path: "{{ minecraft_backups_dir }}/{{ item }}"
state: directory
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
with_items:
- daily
- weekly
- monthly

View File

@@ -1,6 +0,0 @@
---
- name: Install rsync
ansible.builtin.apt:
name: rsync
state: present
when: ansible_os_family == "Debian"

View File

@@ -0,0 +1,17 @@
---
- name: Création du script de sauvegarde quotidienne
ansible.builtin.template:
src: backup-daily.sh.j2
dest: "{{ backup_script_path }}/minecraft-backup-daily.sh"
owner: root
group: root
mode: '0755'
- name: Configuration cron pour sauvegarde quotidienne
ansible.builtin.cron:
name: "Minecraft Daily Backup"
minute: "0"
hour: "2"
job: "{{ backup_script_path }}/minecraft-backup-daily.sh"
user: "{{ minecraft_user }}"
state: present

View File

@@ -1,16 +0,0 @@
---
- name: Create backup script
ansible.builtin.template:
src: backup.sh.j2
dest: "{{ minecraft_base_dir }}/backup.sh"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
- name: Create restore script
ansible.builtin.template:
src: restore.sh.j2
dest: "{{ minecraft_base_dir }}/restore.sh"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'

View File

@@ -0,0 +1,18 @@
---
- name: Création du script de sauvegarde hebdomadaire
ansible.builtin.template:
src: backup-weekly.sh.j2
dest: "{{ backup_script_path }}/minecraft-backup-weekly.sh"
owner: root
group: root
mode: '0755'
- name: Configuration cron pour sauvegarde hebdomadaire
ansible.builtin.cron:
name: "Minecraft Weekly Backup"
minute: "0"
hour: "3"
weekday: "0"
job: "{{ backup_script_path }}/minecraft-backup-weekly.sh"
user: "{{ minecraft_user }}"
state: present

View File

@@ -1,29 +0,0 @@
---
- name: Setup daily backup cron job
ansible.builtin.cron:
name: "Minecraft daily backup"
user: "{{ minecraft_user }}"
hour: "{{ backup_time_daily.split(':')[0] }}"
minute: "{{ backup_time_daily.split(':')[1] }}"
job: "{{ minecraft_base_dir }}/backup.sh daily"
notify: reload cron service
- name: Setup weekly backup cron job
ansible.builtin.cron:
name: "Minecraft weekly backup"
user: "{{ minecraft_user }}"
hour: "{{ backup_time_weekly.split(':')[0] }}"
minute: "{{ backup_time_weekly.split(':')[1] }}"
weekday: "0"
job: "{{ minecraft_base_dir }}/backup.sh weekly"
notify: reload cron service
- name: Setup monthly backup cron job
ansible.builtin.cron:
name: "Minecraft monthly backup"
user: "{{ minecraft_user }}"
hour: "{{ backup_time_monthly.split(':')[0] }}"
minute: "{{ backup_time_monthly.split(':')[1] }}"
day: "1"
job: "{{ minecraft_base_dir }}/backup.sh monthly"
notify: reload cron service

View File

@@ -0,0 +1,18 @@
---
- name: Création du script de sauvegarde mensuelle
ansible.builtin.template:
src: backup-monthly.sh.j2
dest: "{{ backup_script_path }}/minecraft-backup-monthly.sh"
owner: root
group: root
mode: '0755'
- name: Configuration cron pour sauvegarde mensuelle
ansible.builtin.cron:
name: "Minecraft Monthly Backup"
minute: "0"
hour: "4"
day: "1"
job: "{{ backup_script_path }}/minecraft-backup-monthly.sh"
user: "{{ minecraft_user }}"
state: present

View File

@@ -1,26 +0,0 @@
---
- name: Create restore script
ansible.builtin.template:
src: restore.sh.j2
dest: "{{ minecraft_base_dir }}/restore.sh"
owner: "{{ minecraft_user }}"
group: "{{ minecraft_group }}"
mode: '0755'
- name: Stop minecraft server before restore
ansible.builtin.systemd:
name: "{{ minecraft_service_name }}"
state: stopped
when: restore_backup_type is defined
- name: Execute restore
ansible.builtin.command:
cmd: "{{ minecraft_base_dir }}/restore.sh {{ restore_backup_type }} {{ restore_backup_date | default('latest') }}"
become_user: "{{ minecraft_user }}"
when: restore_backup_type is defined
- name: Start minecraft server after restore
ansible.builtin.systemd:
name: "{{ minecraft_service_name }}"
state: started
when: restore_backup_type is defined

View File

@@ -0,0 +1,8 @@
---
- name: Création du script de restauration
ansible.builtin.template:
src: restore.sh.j2
dest: "{{ backup_script_path }}/minecraft-restore.sh"
owner: root
group: root
mode: '0755'

View File

@@ -1,16 +1,16 @@
---
- name: Include create backup directories tasks
ansible.builtin.include_tasks: 01-create-backup-dirs.yml
# Tâches principales sauvegardes
- import_tasks: 01-create-backup-structure.yml
tags: [backup, structure]
- name: Include install rsync tasks
ansible.builtin.include_tasks: 02-install-rsync.yml
- import_tasks: 02-setup-daily-backup.yml
tags: [backup, daily]
- name: Include configure backup script tasks
ansible.builtin.include_tasks: 03-configure-backup-script.yml
- import_tasks: 03-setup-weekly-backup.yml
tags: [backup, weekly]
- name: Include setup cron tasks
ansible.builtin.include_tasks: 04-setup-cron.yml
- import_tasks: 04-setup-monthly-backup.yml
tags: [backup, monthly]
- name: Include restore backup tasks
ansible.builtin.include_tasks: 05-restore-backup.yml
when: restore_backup | default(false)
- import_tasks: 05-setup-restore-script.yml
tags: [backup, restore]

View File

@@ -0,0 +1,25 @@
#!/bin/bash
# Script de sauvegarde quotidienne Minecraft
set -e
BACKUP_DIR="{{ minecraft_backups_dir }}/daily"
SOURCE_DIR="{{ minecraft_server_dir }}"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="minecraft-daily-${DATE}"
RETENTION={{ backup_retention_daily }}
# Notification du début de sauvegarde
echo "$(date): Début de la sauvegarde quotidienne"
# Commande save-all via rcon si le serveur est en cours
{{ minecraft_tools_dir }}/mcrcon/mcrcon -H 127.0.0.1 -P {{ minecraft_rcon_port }} -p {{ minecraft_rcon_password | default('changeme') }} save-all || true
sleep 5
# Création de la sauvegarde
rsync {{ rsync_options }} --exclude 'logs' "${SOURCE_DIR}/" "${BACKUP_DIR}/${BACKUP_NAME}/"
# Nettoyage des anciennes sauvegardes
find "${BACKUP_DIR}" -type d -name "minecraft-daily-*" -mtime +${RETENTION} -exec rm -rf {} + 2>/dev/null || true
echo "$(date): Sauvegarde quotidienne terminée: ${BACKUP_NAME}"

View File

@@ -0,0 +1,24 @@
#!/bin/bash
# Script de sauvegarde mensuelle Minecraft
set -e
BACKUP_DIR="{{ minecraft_backups_dir }}/monthly"
SOURCE_DIR="{{ minecraft_server_dir }}"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="minecraft-monthly-${DATE}"
RETENTION={{ backup_retention_monthly }}
echo "$(date): Début de la sauvegarde mensuelle"
# Commande save-all via rcon
{{ minecraft_tools_dir }}/mcrcon/mcrcon -H 127.0.0.1 -P {{ minecraft_rcon_port }} -p {{ minecraft_rcon_password | default('changeme') }} save-all || true
sleep 10
# Création de la sauvegarde
rsync {{ rsync_options }} "${SOURCE_DIR}/" "${BACKUP_DIR}/${BACKUP_NAME}/"
# Nettoyage des anciennes sauvegardes (mois)
find "${BACKUP_DIR}" -type d -name "minecraft-monthly-*" -mtime +$((${RETENTION} * 30)) -exec rm -rf {} + 2>/dev/null || true
echo "$(date): Sauvegarde mensuelle terminée: ${BACKUP_NAME}"

View File

@@ -0,0 +1,24 @@
#!/bin/bash
# Script de sauvegarde hebdomadaire Minecraft
set -e
BACKUP_DIR="{{ minecraft_backups_dir }}/weekly"
SOURCE_DIR="{{ minecraft_server_dir }}"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="minecraft-weekly-${DATE}"
RETENTION={{ backup_retention_weekly }}
echo "$(date): Début de la sauvegarde hebdomadaire"
# Commande save-all via rcon
{{ minecraft_tools_dir }}/mcrcon/mcrcon -H 127.0.0.1 -P {{ minecraft_rcon_port }} -p {{ minecraft_rcon_password | default('changeme') }} save-all || true
sleep 5
# Création de la sauvegarde
rsync {{ rsync_options }} "${SOURCE_DIR}/" "${BACKUP_DIR}/${BACKUP_NAME}/"
# Nettoyage des anciennes sauvegardes (semaines)
find "${BACKUP_DIR}" -type d -name "minecraft-weekly-*" -mtime +$((${RETENTION} * 7)) -exec rm -rf {} + 2>/dev/null || true
echo "$(date): Sauvegarde hebdomadaire terminée: ${BACKUP_NAME}"

View File

@@ -1,69 +0,0 @@
#!/bin/bash
# {{ ansible_managed }}
BACKUP_TYPE=$1
BACKUP_BASE="{{ backup_base_dir }}"
SERVER_DIR="{{ minecraft_server_dir }}"
TOOLS_DIR="{{ minecraft_tools_dir }}"
RCON_CMD="{{ minecraft_tools_dir }}/mcrcon -H localhost -P {{ rcon_port }} -p {{ rcon_password }}"
DATE=$(date +%Y%m%d_%H%M%S)
# Function to clean old backups
clean_old_backups() {
local dir=$1
local keep=$2
ls -1t $dir/*.tar.gz 2>/dev/null | tail -n +$((keep+1)) | xargs rm -f
}
# Function to perform backup
perform_backup() {
local backup_dir=$1
local retention=$2
echo "Starting $BACKUP_TYPE backup at $(date)"
# Notify players
$RCON_CMD "say Server backup starting in 10 seconds..."
sleep 10
# Save world
$RCON_CMD "save-all"
sleep 5
# Disable auto-save
$RCON_CMD "save-off"
# Create backup
tar -czf "$backup_dir/minecraft_${BACKUP_TYPE}_${DATE}.tar.gz" \
-C "{{ minecraft_base_dir }}" \
server/ sources/ tools/ \
--exclude='*.log' \
--exclude='logs/*'
# Re-enable auto-save
$RCON_CMD "save-on"
# Clean old backups
clean_old_backups "$backup_dir" "$retention"
# Notify players
$RCON_CMD "say Server backup completed!"
echo "Backup completed at $(date)"
}
case "$BACKUP_TYPE" in
daily)
perform_backup "{{ backup_daily_dir }}" "{{ backup_retention_daily }}"
;;
weekly)
perform_backup "{{ backup_weekly_dir }}" "{{ backup_retention_weekly }}"
;;
monthly)
perform_backup "{{ backup_monthly_dir }}" "{{ backup_retention_monthly }}"
;;
*)
echo "Usage: $0 {daily|weekly|monthly}"
exit 1
;;
esac

View File

@@ -1,61 +1,53 @@
#!/bin/bash
# {{ ansible_managed }}
# Script de restauration Minecraft
BACKUP_TYPE=$1
BACKUP_DATE=$2
BACKUP_BASE="{{ backup_base_dir }}"
SERVER_DIR="{{ minecraft_server_dir }}"
set -e
# Function to find backup file
find_backup() {
local type=$1
local date=$2
local dir=""
case "$type" in
daily) dir="{{ backup_daily_dir }}" ;;
weekly) dir="{{ backup_weekly_dir }}" ;;
monthly) dir="{{ backup_monthly_dir }}" ;;
*) echo "Invalid backup type"; exit 1 ;;
esac
if [ "$date" = "latest" ]; then
ls -1t $dir/*.tar.gz 2>/dev/null | head -n 1
else
ls $dir/*${date}*.tar.gz 2>/dev/null | head -n 1
fi
}
# Main restore process
BACKUP_FILE=$(find_backup "$BACKUP_TYPE" "$BACKUP_DATE")
if [ -z "$BACKUP_FILE" ]; then
echo "No backup found for type: $BACKUP_TYPE, date: $BACKUP_DATE"
if [ $# -ne 2 ]; then
echo "Usage: $0 <type> <backup_name>"
echo "Types: daily, weekly, monthly"
echo "Exemple: $0 daily minecraft-daily-20240127_020000"
exit 1
fi
echo "Restoring from: $BACKUP_FILE"
TYPE=$1
BACKUP_NAME=$2
BACKUP_DIR="{{ minecraft_backups_dir }}/${TYPE}"
TARGET_DIR="{{ minecraft_server_dir }}"
# Create restore directory
RESTORE_DIR="{{ minecraft_base_dir }}/restore_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$RESTORE_DIR"
if [ ! -d "${BACKUP_DIR}/${BACKUP_NAME}" ]; then
echo "Erreur: Sauvegarde ${BACKUP_NAME} introuvable dans ${BACKUP_DIR}"
exit 1
fi
# Extract backup
tar -xzf "$BACKUP_FILE" -C "$RESTORE_DIR"
echo "ATTENTION: Cette opération va remplacer les données actuelles du serveur."
read -p "Voulez-vous continuer? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Restauration annulée."
exit 1
fi
# Backup current server
echo "Backing up current server state..."
tar -czf "{{ backup_base_dir }}/pre_restore_$(date +%Y%m%d_%H%M%S).tar.gz" \
-C "{{ minecraft_base_dir }}" server/
# Arrêt du serveur
echo "Arrêt du serveur Minecraft..."
systemctl stop minecraft || true
sleep 5
# Restore files
echo "Restoring server files..."
rsync -av --delete "$RESTORE_DIR/server/" "$SERVER_DIR/"
# Sauvegarde du répertoire actuel
CURRENT_BACKUP="${TARGET_DIR}.backup-$(date +%Y%m%d_%H%M%S)"
echo "Sauvegarde du répertoire actuel vers ${CURRENT_BACKUP}"
cp -r "${TARGET_DIR}" "${CURRENT_BACKUP}"
# Set permissions
chown -R {{ minecraft_user }}:{{ minecraft_group }} "$SERVER_DIR"
# Restauration
echo "Restauration de ${BACKUP_NAME}..."
rsync {{ rsync_options }} "${BACKUP_DIR}/${BACKUP_NAME}/" "${TARGET_DIR}/"
# Clean up
rm -rf "$RESTORE_DIR"
# Correction des permissions
chown -R {{ minecraft_user }}:{{ minecraft_group }} "${TARGET_DIR}"
echo "Restore completed successfully!"
# Redémarrage du serveur
echo "Redémarrage du serveur Minecraft..."
systemctl start minecraft
echo "Restauration terminée avec succès."
echo "Sauvegarde de l'ancienne version disponible dans: ${CURRENT_BACKUP}"

View File

@@ -1,11 +1,10 @@
---
backup_dirs:
- "{{ backup_base_dir }}"
- "{{ backup_daily_dir }}"
- "{{ backup_weekly_dir }}"
- "{{ backup_monthly_dir }}"
# Variables sauvegardes
backup_script_path: /usr/local/bin
minecraft_backup_source: "{{ minecraft_server_dir }}"
minecraft_backup_dest: "{{ minecraft_backups_dir }}"
backup_source_dirs:
- "{{ minecraft_server_dir }}"
- "{{ minecraft_sources_dir }}"
- "{{ minecraft_tools_dir }}"
backup_types:
- daily
- weekly
- monthly