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
1404 lines
44 KiB
Markdown
1404 lines
44 KiB
Markdown
# 🎮 Ansible Minecraft Spigot Server
|
|
|
|
[](https://www.ansible.com/)
|
|
[](https://www.minecraft.net/)
|
|
[](https://openjdk.java.net/)
|
|
[](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](#-vue-densemble)
|
|
- [✨ Fonctionnalités](#-fonctionnalités)
|
|
- [🏗️ Architecture](#-architecture)
|
|
- [🚀 Installation rapide](#-installation-rapide)
|
|
- [⚙️ Configuration](#-configuration)
|
|
- [🎛️ Utilisation](#-utilisation)
|
|
- [🔒 Sécurité](#-sécurité)
|
|
- [💾 Sauvegardes](#-sauvegardes)
|
|
- [🔄 Mises à jour](#-mises-à-jour)
|
|
- [🎮 Administration](#-administration)
|
|
- [📊 Monitoring](#-monitoring)
|
|
- [🧪 Tests](#-tests)
|
|
- [🔧 Dépannage](#-dépannage)
|
|
- [🤝 Contribution](#-contribution)
|
|
|
|
## 🎯 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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**
|
|
|
|
```yaml
|
|
# 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)**
|
|
|
|
```bash
|
|
# 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**
|
|
|
|
```yaml
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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é
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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` :
|
|
|
|
```yaml
|
|
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
|
|
|
|
```bash
|
|
# 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 :
|
|
|
|
```properties
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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é
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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
|
|
|
|
```yaml
|
|
# 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 :
|
|
|
|
```properties
|
|
# 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 :
|
|
|
|
```ini
|
|
[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é
|
|
|
|
```bash
|
|
#!/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
|
|
|
|
```bash
|
|
#!/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
|
|
|
|
```bash
|
|
#!/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
|
|
|
|
- **[Spigot Wiki](https://www.spigotmc.org/wiki/)** - Documentation complète Spigot
|
|
- **[Ansible Documentation](https://docs.ansible.com/)** - Documentation officielle Ansible
|
|
- **[Java Performance Guide](https://docs.oracle.com/en/java/javase/17/gctuning/)** - Optimisation JVM
|
|
- **[Ubuntu Server Guide](https://ubuntu.com/server/docs)** - Guide serveur Ubuntu
|
|
- **[Debian Administrator's Handbook](https://debian-handbook.info/)** - Guide administrateur Debian
|
|
|
|
### Outils utiles
|
|
|
|
- **[MCRCON](https://github.com/Tiiffi/mcrcon)** - Client RCON pour Minecraft
|
|
- **[NBT Explorer](https://github.com/jaquadro/NBTExplorer)** - Éditeur de fichiers NBT Minecraft
|
|
- **[Minecraft Server Status](https://mcstatus.io/)** - Vérification statut serveur
|
|
- **[UUID Lookup](https://mcuuid.net/)** - Recherche UUID joueurs Minecraft
|
|
- **[Ansible Lint](https://ansible.readthedocs.io/projects/lint/)** - Linting playbooks Ansible
|
|
|
|
### Communauté et support
|
|
|
|
- **[SpigotMC Forums](https://www.spigotmc.org/)** - Communauté Spigot
|
|
- **[r/admincraft](https://reddit.com/r/admincraft)** - Reddit administration serveurs Minecraft
|
|
- **[Ansible Community](https://forum.ansible.com/)** - Forum communauté Ansible
|
|
- **[Stack Overflow](https://stackoverflow.com/questions/tagged/ansible+minecraft)** - Questions techniques
|
|
|
|
### Monitoring et métriques
|
|
|
|
- **[Prometheus](https://prometheus.io/)** - Système de monitoring
|
|
- **[Grafana](https://grafana.com/)** - Visualisation de métriques
|
|
- **[minecraft-prometheus-exporter](https://github.com/sladkoff/minecraft-prometheus-exporter)** - Métriques Minecraft
|
|
- **[Node Exporter](https://github.com/prometheus/node_exporter)** - Métriques système
|
|
|
|
## 📄 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* |