Files
Ansible-Minecraft-Server/README.md
hcornet 7a2ccb537b
Some checks failed
Ansible Minecraft CI/CD Pipeline / Ansible Lint Check (push) Successful in 58s
Ansible Minecraft CI/CD Pipeline / Project Structure Validation (push) Failing after 3s
Ansible Minecraft CI/CD Pipeline / Security Scan (push) Successful in 4s
Ansible Minecraft CI/CD Pipeline / Deploy to Staging (push) Has been skipped
Ansible Minecraft CI/CD Pipeline / Deploy to Production (push) Has been skipped
Ansible Minecraft CI/CD Pipeline / Backup System Check (push) Has been skipped
test other version
2025-08-26 21:59:21 +02:00

44 KiB

🎮 Ansible Minecraft Spigot Server

Ansible Minecraft Java License

Déploiement automatisé et professionnel d'un serveur Minecraft Spigot avec sécurité avancée, sauvegardes automatiques et mise à jour continue via Ansible.

📋 Table des matières

🎯 Vue d'ensemble

Ce projet Ansible automatise complètement l'installation, la configuration et la maintenance d'un serveur Minecraft Spigot version 1.21.6 sur des serveurs Linux (Debian/Ubuntu).

Pourquoi ce projet ?

  • Déploiement zero-touch en moins de 30 minutes
  • Sécurité niveau production avec durcissement complet
  • Haute disponibilité avec sauvegardes automatiques
  • Mises à jour sans interruption de Spigot
  • CI/CD intégré avec tests automatiques
  • Architecture évolutive et modulaire

Fonctionnalités

🛡️ Sécurité

  • Durcissement SSH : Authentification par clés, port personnalisé, configuration sécurisée
  • Pare-feu UFW : Règles minimales, ports spécifiques
  • Fail2ban : Protection anti-bruteforce
  • Utilisateur dédié : Isolation des processus Minecraft
  • Mises à jour automatiques : Patches de sécurité système

🎮 Minecraft

  • Spigot 1.21.6 : Compilation automatique avec BuildTools
  • Java 17 : Installation et configuration optimisée
  • MCRCON : Administration à distance du serveur
  • Service systemd : Démarrage/arrêt propre, redémarrage automatique
  • Gestion des opérateurs : Configuration automatisée des admins
  • Support plugins : Répertoire et gestion dédiés

💾 Sauvegardes

  • Sauvegardes multiples : Quotidiennes (7j), hebdomadaires (4s), mensuelles (6m)
  • Rsync optimisé : Sauvegardes incrémentielles rapides
  • Scripts de restauration : Remise en état automatisée
  • Arrêt sécurisé : Notification joueurs avant sauvegarde

🔄 Maintenance

  • Mises à jour Spigot : Téléchargement, compilation et basculement automatique
  • Rotation des logs : Gestion intelligente de l'espace disque
  • Monitoring : Vérification de santé du serveur
  • Rollback : Retour version précédente en cas d'échec

🏗️ Architecture

📁 Structure du projet
├── 📁 .gitea/workflows/          # CI/CD Pipeline
├── 📁 inventories/               # Inventaires serveurs
│   ├── 📁 production/           # Environnement de production
│   └── 📁 staging/              # Environnement de test
├── 📁 roles/                    # Rôles Ansible modulaires
│   ├── 📁 01-server_hardening/   # Sécurisation serveur Linux
│   ├── 📁 02-installation-java/  # Installation Java OpenJDK
│   ├── 📁 03-installation-minecraft/ # Installation Spigot complet
│   ├── 📁 04-backups/           # Système de sauvegarde
│   └── 📁 05-update/            # Mises à jour automatiques
├── 📁 playbooks/                # Playbooks d'orchestration
├── 📄 requirements.yml          # Collections Ansible
├── 📄 secrets.example           # Template variables sensibles
└── 📄 README.md                 # Cette documentation

🎯 Rôles détaillés

Rôle Description Fonctionnalités
01-server_hardening Sécurisation serveur SSH, UFW, Fail2ban, Updates, Clés admin
02-installation-java Installation Java Détection, Installation OpenJDK 17, Validation
03-installation-minecraft Installation Minecraft Spigot, MCRCON, Service, Configuration, Logs
04-backups Système sauvegarde Scripts automatiques, Restauration, Rétention
05-update Mises à jour SSH, Système, Spigot, Basculement sécurisé

🚀 Installation rapide

Prérequis

  • Système local : Ansible 4.0+, Python 3.8+, Git
  • Serveur cible : Ubuntu 20.04+/Debian 10+, 4GB RAM minimum, 20GB disque
  • Réseau : SSH accès root/sudo, ports 22 et 25565 accessibles
  • Utilisateur : Compte ansible avec droits sudo configuré

1. Clonage et préparation

# Cloner le repository
git clone https://gitea.tips-of-mine.com/Tips-Of-Mine/Ansible-Minecraft-Serveur.git
cd Ansible-Minecraft-Serveur

# Installer les collections Ansible requises
ansible-galaxy collection install -r requirements.yml

# Vérifier l'installation
ansible --version

2. Configuration rapide

# Copier et éditer les secrets
cp secrets.example secrets
vim secrets

# Configurer l'inventaire de production
vim inventories/production/hosts.yml
vim inventories/production/group_vars/all.yml

3. Premier déploiement

# Test de connectivité
ansible all -i inventories/production/hosts.yml -m ping

# Déploiement complet (environ 20-30 minutes)
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml

# Vérification du statut final
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "systemctl status minecraft"

⚙️ Configuration

🔧 Variables principales

inventories/production/group_vars/all.yml

# Configuration Minecraft
minecraft_version: "1.21.6"          # Version Spigot à installer
minecraft_memory_min: "2G"           # RAM minimum allouée
minecraft_memory_max: "4G"           # RAM maximum allouée
max_players: 20                      # Nombre max de joueurs
server_motd: "Mon serveur Ansible"   # Message d'accueil

# Configuration sécurité
ssh_port: 22                         # Port SSH (changer pour sécurité)
fail2ban_enabled: true               # Protection anti-bruteforce
firewall_enabled: true              # Activation pare-feu UFW

# Configuration sauvegardes
backup_retention_days: 7             # Rétention sauvegardes quotidiennes
backup_retention_weeks: 4            # Rétention sauvegardes hebdomadaires
backup_retention_months: 6           # Rétention sauvegardes mensuelles

🗝️ Gestion des secrets

secrets (à créer)

# Variables sensibles - NE PAS COMMITER !
export RCON_PASSWORD="motdepasse_ultra_securise"
export MINECRAFT_VERSION="1.21.6"

# Utilisateurs administrateurs
export ADMIN_USERS='[
  {
    "name": "admin1", 
    "key": "ssh-rsa AAAAB3NzaC1yc2E...", 
    "comment": "Administrateur 1"
  }
]'

# Opérateurs Minecraft  
export MINECRAFT_OPS='[
  {
    "name": "JoueurAdmin",
    "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "level": 4
  }
]'

🏠 Configuration inventaire

inventories/production/hosts.yml

all:
  children:
    minecraft_servers:
      hosts:
        minecraft-prod-01:
          ansible_host: 192.168.1.100
          ansible_user: ansible
          ansible_ssh_private_key_file: ~/.ssh/minecraft_rsa
        minecraft-prod-02:
          ansible_host: 192.168.1.101
          ansible_user: ansible
          ansible_ssh_private_key_file: ~/.ssh/minecraft_rsa

🎛️ Utilisation

Déploiements modulaires

# Déploiement complet
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml

# Sécurisation seulement
ansible-playbook playbooks/hardening.yml -i inventories/production/hosts.yml

# Installation Java seulement  
ansible-playbook playbooks/install-java.yml -i inventories/production/hosts.yml

# Installation Minecraft seulement
ansible-playbook playbooks/install-minecraft.yml -i inventories/production/hosts.yml

# Configuration sauvegardes seulement
ansible-playbook playbooks/setup-backups.yml -i inventories/production/hosts.yml

# Mises à jour seulement
ansible-playbook playbooks/update-system.yml -i inventories/production/hosts.yml

Déploiement avec tags

# Seulement la partie sécurité
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --tags security,hardening

# Seulement Minecraft sans les sauvegardes  
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --tags minecraft,installation

# Seulement les mises à jour
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --tags update,maintenance

Mode vérification

# Vérifier ce qui sera modifié (dry-run)
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --check --diff

# Test de syntaxe
ansible-playbook --syntax-check playbooks/site.yml -i inventories/production/hosts.yml

🔒 Sécurité

Configuration SSH sécurisée

Le rôle 01-server_hardening applique automatiquement :

  • Authentification par clés uniquement (mots de passe désactivés)
  • Connexion root désactivée
  • Port SSH configurable (défaut 22, recommandé : changer)
  • Tentatives limitées : 3 essais maximum
  • Timeout automatique : 5 minutes d'inactivité

Pare-feu intelligent

# Règles UFW appliquées automatiquement
Port 22/tcp    → SSH (port configuré)
Port 25565/tcp → Minecraft
Tout le reste  → BLOQUÉ par défaut

Protection Fail2ban

Configuration automatique pour :

  • SSH : Ban après 3 tentatives échouées (10 minutes)
  • Logs : Surveillance active des tentatives d'intrusion
  • Whitelist : IPs administrateurs protégées

Utilisateur dédié

# Isolation complète des processus
Utilisateur : minecraft
Groupe     : minecraft  
Home       : /opt/minecraft
Shell      : /bin/bash (limité)
Sudo       : NON (sécurité)

💾 Sauvegardes

Types de sauvegardes automatiques

Type Fréquence Rétention Horaire Script
Quotidienne Tous les jours 7 jours 02:00 backup-daily.sh
Hebdomadaire Dimanche 4 semaines 03:00 backup-weekly.sh
Mensuelle 1er du mois 6 mois 04:00 backup-monthly.sh

Contenu sauvegardé

  • 📁 Monde Minecraft : /opt/minecraft/server/world*
  • 📁 Configuration : server.properties, ops.json, etc.
  • 📁 Plugins : /opt/minecraft/server/plugins/
  • 📁 Logs : /opt/minecraft/logs/

Processus de sauvegarde

  1. Notification : Message aux joueurs (30s avant)
  2. Arrêt propre : Commande /stop via MCRCON
  3. Sauvegarde : Rsync optimisé vers /opt/minecraft/backups/
  4. Compression : Archive tar.gz datée
  5. Redémarrage : Serveur Minecraft
  6. Nettoyage : Suppression sauvegardes expirées
  7. Log : Enregistrement résultat

Restauration manuelle

# Se connecter au serveur
ssh ansible@votre-serveur

# Lister les sauvegardes disponibles
ls -la /opt/minecraft/backups/daily/
ls -la /opt/minecraft/backups/weekly/
ls -la /opt/minecraft/backups/monthly/

# Restaurer une sauvegarde (exemple quotidienne)
sudo -u minecraft /opt/minecraft/tools/restore-backup.sh daily daily_backup_20241225_120000.tar.gz

# Le script demande confirmation et effectue :
# 1. Arrêt du serveur Minecraft
# 2. Sauvegarde des données actuelles  
# 3. Extraction et restauration
# 4. Redémarrage du serveur

Sauvegarde manuelle d'urgence

# Depuis Ansible
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "/opt/minecraft/tools/backup-daily.sh"

# Depuis le serveur directement
sudo -u minecraft /opt/minecraft/tools/backup-daily.sh

🔄 Mises à jour

Mise à jour automatique Spigot

Le système vérifie automatiquement les nouvelles versions et effectue la mise à jour sans interruption :

  1. Détection : Comparaison version actuelle vs configurée
  2. Téléchargement : BuildTools dans répertoire séparé
  3. Compilation : Nouvelle version en parallèle
  4. Tests : Validation de la compilation
  5. Sauvegarde : Version actuelle préservée
  6. Basculement : Remplacement atomique
  7. Vérification : Contrôle de fonctionnement

Mise à jour manuelle

# Mettre à jour vers version spécifique
ansible-playbook playbooks/update-system.yml \
  -i inventories/production/hosts.yml \
  -e "minecraft_version=1.21.7"

# Forcer mise à jour complète
ansible-playbook playbooks/update-system.yml \
  -i inventories/production/hosts.yml \
  -e "force_update=true"

# Mise à jour système seulement
ansible-playbook playbooks/update-system.yml \
  -i inventories/production/hosts.yml \
  --tags system

Rollback en cas de problème

# Automatique si la nouvelle version ne démarre pas
# Sinon, rollback manuel :

ssh ansible@votre-serveur
sudo systemctl stop minecraft

# Restaurer version précédente  
sudo -u minecraft mv /opt/minecraft/server /opt/minecraft/server.failed
sudo -u minecraft mv /opt/minecraft/server.old /opt/minecraft/server

sudo systemctl start minecraft

🎮 Administration

MCRCON - Administration à distance

# Installation automatique dans /usr/local/bin/mcrcon
# Configuration automatique du RCON sur port 25575

# Connexion depuis le serveur
mcrcon -H localhost -P 25575 -p "votre_mot_de_passe_rcon"

# Commandes courantes une fois connecté
/list                          # Joueurs en ligne
/whitelist add NomJoueur       # Ajouter à la liste blanche  
/whitelist remove NomJoueur    # Retirer de la liste blanche
/op NomJoueur                  # Donner droits administrateur
/deop NomJoueur               # Retirer droits administrateur
/kick NomJoueur Raison        # Expulser un joueur
/ban NomJoueur Raison         # Bannir un joueur
/pardon NomJoueur             # Débannir un joueur
/say Message à tous           # Message serveur
/tell NomJoueur Message       # Message privé
/save-all                     # Forcer sauvegarde
/reload                       # Recharger configuration
/stop                         # Arrêter serveur

Gestion des opérateurs

Configuration dans inventories/production/group_vars/all.yml :

minecraft_ops:
  - name: "JoueurAdmin1"
    uuid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"  # UUID Minecraft
    level: 4                                      # Niveau admin (1-4)
    bypass_player_limit: false                   # Ignore limite joueurs
  - name: "JoueurAdmin2" 
    uuid: "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
    level: 4
    bypass_player_limit: true

Note

: Obtenez l'UUID d'un joueur sur https://mcuuid.net/

Gestion des plugins

# Répertoire plugins : /opt/minecraft/server/plugins/

# Installer un plugin
wget -O /tmp/plugin.jar "https://url-du-plugin.jar"
sudo -u minecraft cp /tmp/plugin.jar /opt/minecraft/server/plugins/
sudo systemctl restart minecraft

# Script de gestion (auto-créé)
sudo -u minecraft /opt/minecraft/tools/manage-plugins.sh

# Lister plugins actifs via MCRCON
mcrcon -H localhost -P 25575 -p "mot_de_passe" "plugins"

Configuration serveur

Fichier /opt/minecraft/server/server.properties généré automatiquement :

# Configuration générée par Ansible
server-port=25565
max-players=20
motd=Serveur Minecraft Ansible  
gamemode=survival
difficulty=normal
pvp=true
white-list=false
enable-rcon=true
rcon.port=25575

📊 Monitoring

Vérifications automatiques

# Statut général du serveur
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "systemctl status minecraft"

# Utilisation mémoire
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "free -h"

# Espace disque
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "df -h /opt/minecraft"

# Joueurs connectés
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "mcrcon -H localhost -P 25575 -p 'password' 'list'"

# Logs récents
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "tail -20 /opt/minecraft/server/logs/latest.log"

Logs importants

Log Localisation Description
Minecraft /opt/minecraft/server/logs/ Logs du serveur de jeu
Système /var/log/syslog Logs système général
SSH /var/log/auth.log Tentatives connexion SSH
Fail2ban /var/log/fail2ban.log Bannissements automatiques
Sauvegardes /opt/minecraft/logs/backup-*.log Résultats sauvegardes
UFW /var/log/ufw.log Trafic réseau bloqué

Commandes de diagnostic

# Connexion au serveur
ssh ansible@votre-serveur

# Vérifier processus Minecraft
ps aux | grep minecraft
systemctl status minecraft

# Tester connectivité Minecraft  
telnet localhost 25565

# Vérifier RCON
mcrcon -H localhost -P 25575 -p "password" "version"

# Analyser performances
top -u minecraft
htop -u minecraft

# Vérifier espace disque mondes
du -sh /opt/minecraft/server/world*

# Taille des sauvegardes
du -sh /opt/minecraft/backups/*

🧪 Tests

Tests automatiques (CI/CD)

Le pipeline Gitea effectue automatiquement :

  • Lint YAML : Validation syntaxe fichiers
  • Ansible-lint : Validation playbooks
  • Structure : Vérification organisation fichiers
  • Sécurité : Scan secrets potentiels
  • Connectivité : Test ping serveurs
  • Déploiement : Test staging automatique

Tests manuels

# Test connectivité inventaire
ansible all -i inventories/production/hosts.yml -m ping

# Validation syntaxe playbook
ansible-playbook --syntax-check playbooks/site.yml -i inventories/production/hosts.yml

# Test déploiement sans modification (dry-run)
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --check

# Test déploiement avec différences affichées
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --check --diff

# Test rôle spécifique
ansible-playbook playbooks/site.yml -i inventories/staging/hosts.yml --tags minecraft --check

Tests de performance

# Test charge serveur
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "stress --cpu 4 --timeout 30s"

# Test mémoire disponible  
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "free -m | grep Available"

# Test vitesse disque
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "dd if=/dev/zero of=/tmp/testfile bs=1M count=100 conv=fdatasync"

# Test réseau Minecraft
ansible minecraft_servers -i inventories/production/hosts.yml -m shell -a "nc -zv localhost 25565"

🔧 Dépannage

Problèmes courants

🚫 Serveur Minecraft ne démarre pas

# 1. Vérifier les logs
journalctl -u minecraft -f
tail -100 /opt/minecraft/server/logs/latest.log

# 2. Vérifier Java
sudo -u minecraft java -version

# 3. Vérifier mémoire disponible
free -h

# 4. Tester démarrage manuel
sudo -u minecraft -s
cd /opt/minecraft/server
java -Xms2G -Xmx4G -jar spigot.jar nogui

# 5. Vérifier permissions
ls -la /opt/minecraft/server/
chown -R minecraft:minecraft /opt/minecraft/

🔌 Problème de connectivité

# 1. Vérifier service actif
systemctl status minecraft

# 2. Vérifier port ouvert
netstat -tlnp | grep :25565
ss -tlnp | grep :25565  

# 3. Tester depuis serveur
telnet localhost 25565

# 4. Vérifier pare-feu
ufw status verbose
iptables -L -n

# 5. Tester RCON
mcrcon -H localhost -P 25575 -p "password" "version"

💾 Problème de sauvegarde

# 1. Vérifier espace disque
df -h /opt/minecraft

# 2. Vérifier permissions sauvegardes
ls -la /opt/minecraft/backups/
chown -R minecraft:minecraft /opt/minecraft/backups/

# 3. Tester script sauvegarde
sudo -u minecraft /opt/minecraft/tools/backup-daily.sh

# 4. Vérifier cron jobs
crontab -u minecraft -l
systemctl status cron

# 5. Analyser logs sauvegardes
tail -50 /opt/minecraft/logs/backup-daily.log

🔐 Problème SSH/Ansible

# 1. Test connexion SSH directe
ssh -v ansible@votre-serveur

# 2. Vérifier clé SSH
ssh-add -l
ls -la ~/.ssh/

# 3. Tester Ansible basique
ansible all -i inventories/production/hosts.yml -m ping -vvv

# 4. Vérifier configuration SSH serveur
sudo sshd -T | grep -E "(Port|PermitRoot|PasswordAuth)"

# 5. Analyser logs SSH
tail -50 /var/log/auth.log

🔄 Problème de mise à jour

# 1. Vérifier compilation en cours
ps aux | grep BuildTools
ps aux | grep java

# 2. Vérifier espace disque pour compilation
df -h /opt/minecraft/sources

# 3. Analyser logs compilation Spigot
tail -100 /opt/minecraft/sources/BuildTools.log.txt

# 4. Vérifier version actuelle
cat /opt/minecraft/server/.version
/usr/local/bin/mcrcon -H localhost -P 25575 -p "password" "version"

# 5. Rollback manuel si nécessaire
sudo systemctl stop minecraft
sudo -u minecraft mv /opt/minecraft/server.old /opt/minecraft/server
sudo systemctl start minecraft

Messages d'erreur fréquents

Erreur Cause probable Solution
Connection refused Service arrêté ou port fermé Vérifier systemctl status minecraft
Out of memory RAM insuffisante Réduire -Xmx ou ajouter RAM serveur
Permission denied Problème permissions fichiers chown -R minecraft:minecraft /opt/minecraft
EULA not accepted EULA non accepté Vérifier /opt/minecraft/server/eula.txt
Port already in use Port 25565 occupé netstat -tlnp | grep 25565
Failed to bind to port Permissions réseau Vérifier pare-feu et ports

Commandes de récupération d'urgence

# Redémarrage complet services
sudo systemctl restart minecraft
sudo systemctl restart ssh
sudo systemctl restart fail2ban
sudo systemctl restart ufw

# Nettoyage et récupération espace
sudo -u minecraft find /opt/minecraft/backups -name "*.tar.gz" -mtime +30 -delete
sudo -u minecraft find /opt/minecraft/server/logs -name "*.gz" -mtime +7 -delete

# Reset permissions complètes
sudo chown -R minecraft:minecraft /opt/minecraft/
sudo chmod -R 755 /opt/minecraft/
sudo chmod 644 /opt/minecraft/server/*.properties
sudo chmod 755 /opt/minecraft/tools/*.sh

# Vérification intégrité complète
ansible-playbook playbooks/site.yml -i inventories/production/hosts.yml --tags hardening --check

🤝 Contribution

Comment contribuer

  1. Fork du projet sur Gitea
  2. Clone votre fork localement
  3. Branche pour votre fonctionnalité : git checkout -b feature/ma-fonctionnalite
  4. Développement avec tests sur staging
  5. Commit avec messages clairs
  6. Push vers votre fork
  7. Pull Request vers la branche develop

Standards de développement

  • Ansible-lint : Pas de violations
  • YAML-lint : Syntaxe respectée
  • Tests : Fonctionnement sur staging vérifié
  • Documentation : README et commentaires à jour
  • Sécurité : Pas de secrets en dur
  • Idempotence : Playbooks réexécutables sans effet de bord

Règles de commit

# Format des messages
type(scope): description

# Types acceptés
feat: nouvelle fonctionnalité
fix: correction bug  
docs: documentation
style: formatage code
refactor: refactoring
test: ajout tests
chore: maintenance

# Exemples
feat(minecraft): add plugin auto-update
fix(backup): correct retention policy
docs(readme): update installation steps

Tests requis avant PR

# Validation locale complète
yamllint .
ansible-lint playbooks/
ansible-playbook --syntax-check playbooks/site.yml -i inventories/staging/hosts.yml

# Test déploiement staging
ansible-playbook playbooks/site.yml -i inventories/staging/hosts.yml --check --diff
ansible-playbook playbooks/site.yml -i inventories/staging/hosts.yml

# Validation fonctionnelle
ansible minecraft_servers -i inventories/staging/hosts.yml -m shell -a "systemctl status minecraft"
mcrcon -H staging-server -P 25575 -p "password" "version"

📖 Documentation avancée

Variables complètes par rôle

🛡️ Rôle 01-server_hardening

# SSH Configuration
ssh_port: 22                          # Port SSH (recommandé: changer)
ssh_permit_root_login: false          # Connexion root autorisée
ssh_password_authentication: false    # Authentification par mot de passe  
ssh_max_auth_tries: 3                # Tentatives de connexion max
ssh_client_alive_interval: 300        # Timeout inactivité (secondes)

# Firewall UFW
firewall_enabled: true                # Activation pare-feu
firewall_allowed_ports:               # Ports autorisés
  - "{{ ssh_port }}/tcp"
  - "25565/tcp"

# Fail2ban
fail2ban_enabled: true                # Protection anti-bruteforce
fail2ban_jail_ssh_maxretry: 3        # Tentatives avant ban
fail2ban_jail_ssh_bantime: 600       # Durée ban (secondes)

# Utilisateurs administrateurs
admin_users:
  - name: "admin1"
    key: "ssh-rsa AAAAB3NzaC1yc2E..."
    comment: "Administrateur principal"

Rôle 02-installation-java

# Configuration Java
java_version: "17"                    # Version OpenJDK à installer
java_package: "openjdk-17-jdk"       # Package système
java_home: "/usr/lib/jvm/java-17-openjdk-amd64"  # Répertoire d'installation
required_java_version: "17"          # Version minimum requise pour Spigot

🎮 Rôle 03-installation-minecraft

# Utilisateurs et répertoires
minecraft_user: minecraft             # Utilisateur système dédié
minecraft_group: minecraft            # Groupe système dédié
minecraft_base_dir: /opt/minecraft    # Répertoire racine
minecraft_server_dir: /opt/minecraft/server     # Serveur Spigot
minecraft_tools_dir: /opt/minecraft/tools       # Outils (MCRCON, scripts)
minecraft_plugins_dir: /opt/minecraft/server/plugins  # Plugins

# Configuration serveur
minecraft_version: "1.21.6"          # Version Spigot
minecraft_memory_min: "2G"           # RAM minimum JVM
minecraft_memory_max: "4G"           # RAM maximum JVM
minecraft_port: 25565                 # Port serveur
minecraft_eula: true                  # Acceptation EULA automatique

# Propriétés serveur
server_name: "Minecraft Server"       # Nom serveur
server_motd: "Un serveur Minecraft"   # Message d'accueil
max_players: 20                       # Joueurs maximum simultanés
difficulty: "normal"                  # Difficulté (peaceful/easy/normal/hard)
gamemode: "survival"                  # Mode de jeu par défaut
pvp_enabled: true                     # PvP activé

# MCRCON (administration à distance)
mcrcon_version: "0.7.2"              # Version MCRCON
rcon_enabled: true                    # RCON activé
rcon_port: 25575                      # Port RCON
rcon_password: "changeme"             # Mot de passe RCON (À CHANGER!)

# Opérateurs Minecraft
minecraft_ops:
  - name: "JoueurAdmin"
    uuid: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    level: 4                          # Niveau admin (1-4)
    bypass_player_limit: false       # Ignore limite joueurs

💾 Rôle 04-backups

# Configuration sauvegardes
backup_base_dir: /opt/minecraft/backups          # Répertoire sauvegardes
backup_daily_dir: /opt/minecraft/backups/daily   # Sauvegardes quotidiennes
backup_weekly_dir: /opt/minecraft/backups/weekly # Sauvegardes hebdomadaires
backup_monthly_dir: /opt/minecraft/backups/monthly # Sauvegardes mensuelles

# Rétention (en jours)
backup_retention_days: 7              # Quotidiennes: 7 jours
backup_retention_weeks: 4             # Hebdomadaires: 4 semaines (28 jours)
backup_retention_months: 6            # Mensuelles: 6 mois (180 jours)

# Planification cron
backup_daily_time: "02:00"            # Heure sauvegarde quotidienne
backup_weekly_time: "03:00"           # Heure sauvegarde hebdomadaire  
backup_weekly_day: "0"                # Jour semaine (0=dimanche)
backup_monthly_time: "04:00"          # Heure sauvegarde mensuelle
backup_monthly_day: "1"               # Jour mois (1=premier du mois)

# Options rsync
rsync_options: "-avz --delete"        # Options synchronisation

# Répertoires à sauvegarder
backup_sources:
  - "/opt/minecraft/server"           # Serveur complet
  - "/opt/minecraft/logs"             # Logs

🔄 Rôle 05-update

# Configuration mises à jour
update_check_ssh_keys: true          # Vérifier nouvelles clés SSH
update_check_system: true            # Vérifier mises à jour système  
update_check_spigot: true            # Vérifier nouvelles versions Spigot

# Fichiers et répertoires mise à jour Spigot
spigot_current_version_file: /opt/minecraft/server/.version    # Fichier version actuelle
spigot_new_version_dir: /opt/minecraft/new_version             # Répertoire nouvelle version
spigot_backup_dir: /opt/minecraft/version_backups              # Sauvegardes versions

# Système
system_update_auto: false            # Mise à jour système automatique
system_reboot_required_check: true   # Vérifier si reboot nécessaire

Exemples d'inventaires avancés

Production multi-serveurs

# inventories/production/hosts.yml
all:
  children:
    minecraft_servers:
      children:
        minecraft_primary:
          hosts:
            mc-prod-01:
              ansible_host: 10.0.1.10
              minecraft_memory_max: "8G"
              max_players: 50
              server_motd: "Serveur Principal"
        minecraft_secondary:
          hosts:
            mc-prod-02:
              ansible_host: 10.0.1.11
              minecraft_memory_max: "4G" 
              max_players: 25
              server_motd: "Serveur Secondaire"
            mc-prod-03:
              ansible_host: 10.0.1.12
              minecraft_memory_max: "4G"
              max_players: 25
              server_motd: "Serveur Test"
      vars:
        ansible_user: ansible
        ansible_ssh_private_key_file: ~/.ssh/minecraft_prod_rsa
        environment: production

Variables par groupe d'inventaire

# inventories/production/group_vars/minecraft_primary.yml
minecraft_memory_min: "4G"
minecraft_memory_max: "8G"
max_players: 50
backup_retention_days: 30
backup_retention_weeks: 12
backup_retention_months: 12

# inventories/production/group_vars/minecraft_secondary.yml  
minecraft_memory_min: "2G"
minecraft_memory_max: "4G"
max_players: 25
backup_retention_days: 14
backup_retention_weeks: 8
backup_retention_months: 6

Personnalisation avancée

Configuration server.properties complète

Le template roles/03-installation-minecraft/templates/server.properties.j2 peut être étendu :

# Génération et ressources  
generate-structures={{ generate_structures | default(true) | ternary('true', 'false') }}
generator-settings={{ generator_settings | default('') }}
level-seed={{ level_seed | default('') }}
level-type={{ level_type | default('minecraft:normal') }}

# Performance
view-distance={{ view_distance | default(10) }}
simulation-distance={{ simulation_distance | default(10) }}
max-tick-time={{ max_tick_time | default(60000) }}
network-compression-threshold={{ network_compression_threshold | default(256) }}

# Fonctionnalités
allow-flight={{ allow_flight | default(false) | ternary('true', 'false') }}
allow-nether={{ allow_nether | default(true) | ternary('true', 'false') }}
enable-command-block={{ enable_command_block | default(false) | ternary('true', 'false') }}
spawn-protection={{ spawn_protection | default(16) }}

# Entités et mobs
spawn-animals={{ spawn_animals | default(true) | ternary('true', 'false') }}
spawn-monsters={{ spawn_monsters | default(true) | ternary('true', 'false') }}
spawn-npcs={{ spawn_npcs | default(true) | ternary('true', 'false') }}
max-entity-cramming={{ max_entity_cramming | default(24) }}
entity-broadcast-range-percentage={{ entity_broadcast_range_percentage | default(100) }}

Service systemd personnalisé

Template roles/03-installation-minecraft/templates/minecraft.service.j2 étendu :

[Unit]
Description=Minecraft Spigot Server {{ minecraft_version }}
Documentation=https://www.spigotmc.org/
After=network.target
Wants=network.target

[Service]
Type=notify
User={{ minecraft_user }}
Group={{ minecraft_group }}
WorkingDirectory={{ minecraft_server_dir }}

# Configuration JVM optimisée
Environment="JAVA_OPTS=-Xms{{ minecraft_memory_min }} -Xmx{{ minecraft_memory_max }}"
Environment="SPIGOT_OPTS=--noconsole"

# Commandes
ExecStartPre=/bin/bash -c 'if [ ! -f {{ minecraft_server_dir }}/spigot.jar ]; then echo "Spigot JAR not found"; exit 1; fi'
ExecStart=/usr/bin/java $JAVA_OPTS -jar spigot.jar $SPIGOT_OPTS
ExecStop=/usr/local/bin/mcrcon -H 127.0.0.1 -P {{ rcon_port }} -p {{ rcon_password }} stop
ExecReload=/usr/local/bin/mcrcon -H 127.0.0.1 -P {{ rcon_port }} -p {{ rcon_password }} reload

# Gestion processus
TimeoutStartSec=600
TimeoutStopSec=600  
TimeoutReloadSec=60
Restart=on-failure
RestartSec=30
KillMode=mixed
KillSignal=SIGTERM

# Sécurité
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths={{ minecraft_base_dir }}
NoNewPrivileges=true

# Limites ressources  
LimitNOFILE=65536
LimitAS={{ (minecraft_memory_max | regex_replace('G', '') | int * 1.5 * 1024 * 1024 * 1024) | int }}

[Install]
WantedBy=multi-user.target

🔧 Outils et scripts utiles

Script de monitoring personnalisé

#!/bin/bash
# Créer dans /opt/minecraft/tools/monitor.sh

echo "=== MONITORING SERVEUR MINECRAFT ==="
echo "Date: $(date)"
echo ""

# Statut service
echo "📊 SERVICE STATUS:"
systemctl is-active minecraft && echo "✅ Service: ACTIVE" || echo "❌ Service: INACTIVE"
systemctl is-enabled minecraft && echo "✅ Autostart: ENABLED" || echo "❌ Autostart: DISABLED"

# Processus
echo ""
echo "🔄 PROCESSES:"
ps aux | grep -E "(java.*spigot|PID)" | grep -v grep

# Mémoire
echo ""
echo "💾 MEMORY USAGE:"
free -h
echo ""
echo "Java Heap Usage:"
jstat -gc $(pgrep -f spigot) | tail -1

# Réseau
echo ""
echo "🌐 NETWORK:"
netstat -tlnp | grep -E "(25565|25575)"

# Joueurs connectés
echo ""
echo "👥 PLAYERS:"
/usr/local/bin/mcrcon -H localhost -P 25575 -p "${RCON_PASSWORD}" "list" 2>/dev/null || echo "❌ Cannot connect to RCON"

# Espace disque
echo ""
echo "💿 DISK USAGE:"
df -h /opt/minecraft | tail -1
echo ""
echo "World sizes:"
du -sh /opt/minecraft/server/world* 2>/dev/null

# Sauvegardes récentes
echo ""
echo "💾 RECENT BACKUPS:"
ls -lth /opt/minecraft/backups/daily/ | head -6

# Logs récents
echo ""
echo "📋 RECENT ERRORS:"
tail -100 /opt/minecraft/server/logs/latest.log | grep -i error | tail -5

Script d'optimisation automatique

#!/bin/bash  
# Créer dans /opt/minecraft/tools/optimize.sh

echo "🚀 OPTIMISATION SERVEUR MINECRAFT"

# Nettoyage logs anciens
echo "🧹 Nettoyage logs..."
find /opt/minecraft/server/logs -name "*.gz" -mtime +7 -delete
find /opt/minecraft/logs -name "*.log" -mtime +30 -delete

# Optimisation base données monde
echo "🗃️ Optimisation monde..."
if systemctl is-active --quiet minecraft; then
    /usr/local/bin/mcrcon -H localhost -P 25575 -p "${RCON_PASSWORD}" "save-all"
    sleep 5
    /usr/local/bin/mcrcon -H localhost -P 25575 -p "${RCON_PASSWORD}" "save-off"
    
    # Compaction fichiers région (si NBT-tools installé)
    if command -v nbt &> /dev/null; then
        find /opt/minecraft/server/world*/region -name "*.mca" -exec nbt optimize {} \;
    fi
    
    /usr/local/bin/mcrcon -H localhost -P 25575 -p "${RCON_PASSWORD}" "save-on"
fi

# Nettoyage cache système
echo "🧽 Cache système..."
sync && echo 3 > /proc/sys/vm/drop_caches

# Défragmentation si nécessaire (ext4)
FRAGMENTATION=$(e4defrag -c /opt/minecraft/server/world 2>/dev/null | grep -o '[0-9.]*%' | head -1)
if [[ ${FRAGMENTATION%\%} -gt 30 ]]; then
    echo "📦 Défragmentation nécessaire (${FRAGMENTATION})"
    # e4defrag /opt/minecraft/server/world
fi

echo "✅ Optimisation terminée"

Script de diagnostic complet

#!/bin/bash
# Créer dans /opt/minecraft/tools/diagnostic.sh

OUTPUT_FILE="/tmp/minecraft_diagnostic_$(date +%Y%m%d_%H%M%S).txt"

{
echo "🔍 DIAGNOSTIC COMPLET SERVEUR MINECRAFT"
echo "======================================"
echo "Date: $(date)"
echo "Hostname: $(hostname)"
echo "Uptime: $(uptime)"
echo ""

echo "🖥️ SYSTÈME"
echo "----------"
echo "OS: $(lsb_release -d | cut -f2)"
echo "Kernel: $(uname -r)"
echo "Architecture: $(uname -m)"
echo "CPU: $(nproc) cores - $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
echo "RAM Total: $(free -h | awk 'NR==2{print $2}')"
echo "RAM Used: $(free -h | awk 'NR==2{print $3}')"
echo "Load Average: $(cat /proc/loadavg)"
echo ""

echo "☕ JAVA"
echo "------"
/usr/bin/java -version 2>&1
echo "JAVA_HOME: $JAVA_HOME"
echo ""

echo "🎮 MINECRAFT"
echo "-----------"
echo "Status: $(systemctl is-active minecraft)"
echo "Enabled: $(systemctl is-enabled minecraft)"
echo "Version file: $(cat /opt/minecraft/server/.version 2>/dev/null || echo 'Not found')"
echo "Process:"
ps aux | grep -E "java.*spigot" | grep -v grep
echo ""
echo "Configuration:"
grep -E "(server-port|max-players|difficulty|gamemode)" /opt/minecraft/server/server.properties 2>/dev/null
echo ""

echo "🌐 RÉSEAU"
echo "--------"
echo "Ports ouverts:"
netstat -tlnp | grep -E "(25565|25575)"
echo ""
echo "Firewall status:"
ufw status 2>/dev/null || echo "UFW not available"
echo ""

echo "💾 STOCKAGE"
echo "----------"
df -h /opt/minecraft
echo ""
echo "Tailles répertoires:"
du -sh /opt/minecraft/server/world* 2>/dev/null
du -sh /opt/minecraft/backups/* 2>/dev/null
echo ""

echo "📋 LOGS RÉCENTS"
echo "--------------"
echo "Erreurs récentes (dernières 24h):"
find /opt/minecraft/server/logs -name "*.log" -mtime -1 -exec grep -i "error\|exception\|fatal" {} \; | tail -10
echo ""
echo "Messages système Minecraft:"
journalctl -u minecraft --since "1 hour ago" --no-pager | tail -10
echo ""

echo "👥 JOUEURS"
echo "---------"
if systemctl is-active --quiet minecraft; then
    /usr/local/bin/mcrcon -H localhost -P 25575 -p "${RCON_PASSWORD}" "list" 2>/dev/null || echo "RCON non accessible"
else
    echo "Serveur arrêté"
fi
echo ""

echo "🔒 SÉCURITÉ"
echo "----------"
echo "Fail2ban status:"
systemctl is-active fail2ban 2>/dev/null || echo "Fail2ban not running"
echo ""
echo "SSH tentatives récentes:"
grep "Failed password" /var/log/auth.log 2>/dev/null | tail -5 || echo "No failed attempts"
echo ""

echo "💾 SAUVEGARDES"
echo "-------------"
echo "Dernières sauvegardes:"
ls -lt /opt/minecraft/backups/daily/*.tar.gz 2>/dev/null | head -3 || echo "Aucune sauvegarde quotidienne"
echo ""
echo "Espace utilisé sauvegardes:"
du -sh /opt/minecraft/backups/* 2>/dev/null
echo ""

echo "🔧 MAINTENANCE"
echo "-------------"
echo "Dernière mise à jour système:"
stat -c %y /var/log/dpkg.log 2>/dev/null | head -1 || echo "Information non disponible"
echo ""
echo "Packages à mettre à jour:"
apt list --upgradable 2>/dev/null | wc -l || echo "APT non disponible"

} > "$OUTPUT_FILE"

echo "📊 Diagnostic complet généré: $OUTPUT_FILE"
echo "📤 Pour envoyer le diagnostic:"
echo "   cat $OUTPUT_FILE | pastebinit  # ou autre service"
echo "   scp $OUTPUT_FILE admin@monitoring-server:/tmp/"

📚 Resources et références

Documentation officielle

Outils utiles

Communauté et support

Monitoring et métriques

📄 Changelog et versions

Version 1.0.0 (2024-12-25)

Nouvelles fonctionnalités

  • Installation automatisée complète de Spigot 1.21.6
  • Système de durcissement sécuritaire multicouche
  • Sauvegardes automatiques multiples (quotidien/hebdomadaire/mensuel)
  • Système de mise à jour continue sans interruption
  • CI/CD pipeline intégré avec Gitea
  • Support multi-environnement (staging/production)

🛡️ Sécurité

  • Configuration SSH durcie (clés uniquement, fail2ban)
  • Pare-feu UFW avec règles minimales
  • Utilisateur système dédié avec isolation
  • Gestion automatisée des clés SSH administrateurs
  • Mises à jour sécuritaires automatiques

🎮 Minecraft

  • Compilation automatique Spigot avec BuildTools
  • MCRCON intégré pour administration à distance
  • Service systemd optimisé avec restart automatique
  • Gestion des opérateurs et configuration serveur
  • Support plugins avec répertoire dédié
  • Rotation automatique des logs

💾 Sauvegarde et restauration

  • Scripts rsync optimisés avec compression
  • Rétention configurable par type de sauvegarde
  • Scripts de restauration automatisés
  • Sauvegarde des configurations et mondes

🔄 Maintenance

  • Détection automatique nouvelles versions Spigot
  • Compilation et tests en environnement séparé
  • Basculement atomique avec rollback automatique
  • Mise à jour clés SSH et système

📖 Documentation

  • README complet avec exemples pratiques
  • Guide de dépannage détaillé
  • Scripts d'administration et monitoring
  • Templates de configuration avancés

Roadmap futures versions

Version 1.1.0 (Planifiée)

  • Support BungeeCord multi-serveurs
  • Monitoring Prometheus/Grafana intégré
  • Gestion automatique plugins populaires
  • Support Docker/containerisation
  • Alerting Discord/Slack

Version 1.2.0 (Planifiée)

  • Support MySQL/PostgreSQL externe
  • Load balancer intégré
  • Clustering multi-serveurs
  • API REST pour administration
  • Interface web d'administration

🏁 Conclusion

Ce projet Ansible fournit une solution complète, sécurisée et production-ready pour déployer et maintenir des serveurs Minecraft Spigot à grande échelle.

🎯 Ce que vous obtenez

  • Déploiement en 30 minutes au lieu de plusieurs heures manuelles
  • 🛡️ Sécurité niveau entreprise avec durcissement complet
  • 🔄 Maintenance automatisée avec mises à jour sans interruption
  • 💾 Sauvegardes fiables avec restauration rapide
  • 📊 Monitoring intégré pour supervision proactive
  • 📖 Documentation exhaustive pour équipe technique

🚀 Prêt pour la production

Ce playbook a été conçu selon les meilleures pratiques DevOps et est immédiatement utilisable en production pour des serveurs supportant des centaines de joueurs simultanés.

🎮 Votre infrastructure Minecraft sera opérationnelle, sécurisée et maintenable dès aujourd'hui !


Développé avec ❤️ pour la communauté Minecraft