JavaScript pour débuter
De l’histoire d’UNIX au serveur LAMP sécurisé : Linux, pas à pas.
- Distributions
- Sécurisation
- Serveur LAMP
Histoire et Origine de Linux
Découvrez l'histoire fascinante du système d'exploitation libre qui révolutionna l'informatique.
📚 L'Histoire de Linux
Chronologie :
🗓️ 1991 - Les débuts :
Linus Torvalds, étudiant finlandais de 21 ans, crée le noyau Linux pour son ordinateur personnel. Premier message sur Usenet en août 1991.
🚀 1992-1994 - Croissance :
Adoption de la licence GPL. Première distribution (SLS), puis Debian (1993) et Red Hat (1994). Linux 1.0 sort en mars 1994.
🌍 1995-2000 - Expansion :
SUSE, Ubuntu naissent. Linux entre dans l'entreprise. Support des processeurs multi-cœurs et architecture 64-bit.
Philosophie Unix/Linux :
html
Principes fondamentaux :
• Tout est fichier
• Programmes spécialisés et combinables
• Interface textuelle prioritaire
• Configuration par fichiers texte
• Multi-utilisateur et multi-tâches
• Sécurité par permissions
• Stabilité et performance
Distributions Linux Populaires
Chaque distribution a ses spécificités. Découvrez les principales familles et leurs usages.
🌀 Debian
Type : Distribution mère
Gestionnaire : APT (dpkg)
Cycle : ~2-3 ans
Usage : Serveurs, stable
Points forts :
- Très stable et sécurisée
- Grande communauté
- 50,000+ paquets
- Multi-architectures
📦 Télécharger ISO
🎯 Ubuntu
Type : Basée sur Debian
Gestionnaire : APT (Snap)
Cycle : 6 mois (LTS: 2 ans)
Usage : Desktop, serveurs
Points forts :
- Interface utilisateur moderne
- Installation facile
- Support commercial
- Large communauté
🏢 RHEL/CentOS
Type : Enterprise
Gestionnaire : YUM/DNF (RPM)
Cycle : 10 ans support
Usage : Entreprise, serveurs
Points forts :
- Support entreprise long
- Sécurité renforcée (SELinux)
- Certification
- Stabilité maximale
🎯 Focus : Debian - La Distribution Universelle
Pourquoi choisir Debian ?
🎯 Stabilité légendaire :
Tests rigoureux, mises à jour sûres, parfait pour serveurs de production.
🗳️ Gouvernance démocratique :
Projet communautaire, décisions transparentes, pas d'intérêts commerciaux.
🌍 Multi-architecture :
Support x86, ARM, PowerPC, MIPS... Compatible avec presque tout matériel.
Téléchargement Debian :
html
Debian 12 "Bookworm"
Stable
<a href="https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.2.0-amd64-netinst.iso" target="_blank" class="flex items-center justify-between bg-debian-red/20 hover:bg-debian-red/30 p-3 rounded-lg border border-debian-red/30 transition-colors">
NetInstall (380MB)
Installation réseau minimale
<svg class="w-5 h-5 text-debian-red" fill="currentColor" viewbox="0 0 20 20">
<path d="M3 17a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm3.293-7.707a1 1 0 011.414 0L9 10.586V3a1 1 0 112 0v7.586l1.293-1.293a1 1 0 111.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z"></path>
</svg>
</a>
<a href="https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-12.2.0-amd64-DVD-1.iso" target="_blank" class="flex items-center justify-between bg-linux-blue/20 hover:bg-linux-blue/30 p-3 rounded-lg border border-linux-blue/30 transition-colors">
DVD Complete (3.7GB)
Installation complète offline
<svg class="w-5 h-5 text-linux-blue" fill="currentColor" viewbox="0 0 20 20">
<path d="M3 17a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm3.293-7.707a1 1 0 011.414 0L9 10.586V3a1 1 0 112 0v7.586l1.293-1.293a1 1 0 111.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z"></path>
</svg>
</a>
💡 Conseil : Utilisez NetInstall pour une installation minimale et rapide
Installation Linux avec VirtualBox
Guide étape par étape pour installer Debian dans une machine virtuelle.
⚙️ Prérequis et Préparation
Configuration Système Recommandée :
💾 RAM : 8GB minimum (4GB pour la VM)
💿 Stockage : 20GB libres minimum
⚡ Processeur : Support virtualisation (VT-x/AMD-V)
🌐 Réseau : Connexion internet pour NetInstall
Installation VirtualBox :
html
# Windows / macOS :
1. Télécharger sur virtualbox.org
2. Exécuter l'installeur
3. Installer Extension Pack
# Ubuntu/Debian :
sudo apt update
sudo apt install virtualbox
sudo apt install virtualbox-ext-pack
🚀 Installation Step-by-Step
1
Créer la Machine Virtuelle
- Ouvrir VirtualBox → "Nouveau"
- Nom : "Debian-Server"
- Type : Linux
- Version : Debian (64-bit)
- RAM : 2048 MB minimum
- Disque : Créer nouveau disque virtuel
- Taille : 20 GB (allocation dynamique)
html
Configuration recommandée :
💾 RAM : 2-4GB
💿 Disque : 20-50GB
🖥️ Vidéo : 128MB
🌐 Réseau : NAT
2
Configuration Avancée
Avant de démarrer, optimisez votre VM :
html
Système :
• Activer PAE/NX
• Processeur : 2 CPU
• Activer VT-x/AMD-V
Affichage :
• Mémoire vidéo : 128 MB
• Activer accélération 3D
3
Installation Debian
Démarrez la VM avec l'ISO Debian :
html
🚀 Démarrage :
• Choisir "Graphical install"
• Langue : French
• Pays : France
• Clavier : French
🌐 Réseau :
• Nom de machine : debian-server
• Domaine : (laisser vide)
👤 Utilisateurs :
• Mot de passe root
• Créer utilisateur normal
4
Partitionnement
Configuration recommandée pour serveur :
html
Simple (débutant) :
• / (root) : Tout l'espace
• swap : 2x RAM
Avancé (serveur) :
• / (root) : 10GB
• /var : 5GB (logs)
• /home : 5GB
• swap : 2GB
Sécurisation du Serveur Linux
Scripts et configurations pour sécuriser votre serveur dès l'installation.
🔒 Script de Sécurisation Automatique
html
#!/bin/bash
# Script de sécurisation serveur Debian/Ubuntu
# Auteur: DevWeb Academy
# Usage: sudo ./secure_server.sh
echo "🔒 Démarrage de la sécurisation du serveur..."
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Fonction d'affichage
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Vérification des privilèges root
if [ "$EUID" -ne 0 ]; then
print_error "Ce script doit être exécuté avec sudo"
exit 1
fi
# 1. MISE À JOUR DU SYSTÈME
print_status "Mise à jour du système..."
apt update && apt upgrade -y
apt autoremove -y
# 2. INSTALLATION DES OUTILS ESSENTIELS
print_status "Installation des outils de sécurité..."
apt install -y ufw fail2ban curl wget htop iotop unzip zip
# 3. CONFIGURATION SSH
print_status "Configuration SSH sécurisée..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# Configuration SSH sécurisée
cat > /etc/ssh/sshd_config.d/99-custom-security.conf << EOF
# Configuration SSH sécurisée
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
Protocol 2
X11Forwarding no
AllowUsers $(logname)
EOF
# 4. CONFIGURATION UFW FIREWALL
print_status "Configuration du firewall UFW..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw --force enable
# 5. CONFIGURATION FAIL2BAN
print_status "Configuration Fail2Ban..."
cat > /etc/fail2ban/jail.local << EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
ignoreip = 127.0.0.1/8 192.168.0.0/16
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[apache-auth]
enabled = true
filter = apache-auth
logpath = /var/log/apache2/*error.log
maxretry = 6
[apache-noscript]
enabled = true
filter = apache-noscript
logpath = /var/log/apache2/*access.log
maxretry = 6
EOF
# 6. SÉCURISATION SYSTÈME
print_status "Sécurisation système..."
# Désactiver les services inutiles
systemctl disable bluetooth 2>/dev/null || true
systemctl disable cups 2>/dev/null || true
# Paramètres réseau sécurisés
cat >> /etc/sysctl.conf << EOF
# Sécurité réseau
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
EOF
sysctl -p
# 7. MISE EN PLACE DES MISES À JOUR AUTOMATIQUES
print_status "Configuration des mises à jour automatiques..."
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
# 8. CONFIGURATION LOGROTATE
cat > /etc/logrotate.d/security-logs << EOF
/var/log/auth.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 644 root root
}
EOF
# 9. GÉNÉRATION CLÉS SSH (si nécessaire)
USER_HOME="/home/$(logname)"
if [ ! -f "$USER_HOME/.ssh/id_rsa" ]; then
print_status "Génération des clés SSH..."
sudo -u $(logname) ssh-keygen -t rsa -b 4096 -f "$USER_HOME/.ssh/id_rsa" -N ""
sudo -u $(logname) cp "$USER_HOME/.ssh/id_rsa.pub" "$USER_HOME/.ssh/authorized_keys"
chmod 700 "$USER_HOME/.ssh"
chmod 600 "$USER_HOME/.ssh/authorized_keys"
chown -R $(logname):$(logname) "$USER_HOME/.ssh"
fi
# 10. REDÉMARRAGE DES SERVICES
print_status "Redémarrage des services..."
systemctl restart ssh
systemctl restart fail2ban
systemctl enable fail2ban
# RÉSUMÉ
echo -e "\n${GREEN}🎉 Sécurisation terminée !${NC}"
echo -e "${YELLOW}Configuration appliquée :${NC}"
echo "• SSH sur port 2222 (au lieu de 22)"
echo "• Authentification par clé uniquement"
echo "• Firewall UFW activé"
echo "• Fail2Ban configuré"
echo "• Mises à jour automatiques"
echo -e "\n${RED}⚠️ IMPORTANT :${NC}"
echo "• SSH port changé vers 2222"
echo "• Connexion root désactivée"
echo "• Sauvegardez votre clé privée SSH avant de redémarrer !"
echo -e "\nClé publique : $USER_HOME/.ssh/id_rsa.pub"
echo "Commande de connexion SSH : ssh -p 2222 $(logname)@$(hostname -I | awk '{print $1}')"
Instructions d'utilisation :
1. Télécharger le script : wget https://example.com/secure_server.sh
2. Rendre exécutable : chmod +x secure_server.sh
3. Exécuter : sudo ./secure_server.sh
📊 Script de Surveillance Système
html
#!/bin/bash
# Script de monitoring et rapport système
# Usage: ./system_report.sh
echo "📊 Rapport de santé du système - $(date)"
echo "========================================="
# Informations système
echo -e "\n🖥️ INFORMATIONS SYSTÈME"
echo "Hostname: $(hostname)"
echo "OS: $(lsb_release -d | cut -f2)"
echo "Kernel: $(uname -r)"
echo "Uptime: $(uptime -p)"
# Utilisation CPU
echo -e "\n⚡ UTILISATION CPU"
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "CPU Usage: ${CPU_USAGE}%"
echo "Load Average: $(uptime | awk -F'load average:' '{print $2}')"
# Utilisation mémoire
echo -e "\n💾 UTILISATION MÉMOIRE"
free -h | grep -E "Mem|Swap"
# Utilisation disque
echo -e "\n💿 UTILISATION DISQUE"
df -h | grep -E "^/dev|^tmpfs" | awk '{ print $6 " - " $5 " utilisé (" $4 " libre)" }'
# Services critiques
echo -e "\n🔄 SERVICES CRITIQUES"
for service in ssh apache2 mysql fail2ban ufw; do
if systemctl is-active --quiet $service; then
echo "✅ $service: ACTIF"
else
echo "❌ $service: INACTIF"
fi
done
# Connexions réseau
echo -e "\n🌐 CONNEXIONS RÉSEAU"
echo "Connexions SSH actives:"
netstat -tn | grep :22 | grep ESTABLISHED | wc -l
# Dernières connexions
echo -e "\n👥 DERNIÈRES CONNEXIONS"
last -n 5
# Mises à jour disponibles
echo -e "\n📦 MISES À JOUR"
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
echo "Mises à jour disponibles: $(($UPDATES - 1))"
# Statistiques fail2ban
echo -e "\n🛡️ STATISTIQUES SÉCURITÉ"
if command -v fail2ban-client &> /dev/null; then
echo "Fail2Ban:"
fail2ban-client status 2>/dev/null | grep "Number of jail" || echo "Service non disponible"
fi
echo -e "\n========================================="
echo "📊 Rapport terminé - $(date)"
Installation Serveur LAMP
Script automatisé pour installer et configurer Apache, MySQL/MariaDB et PHP.
🚀 Installation LAMP Automatisée
html
#!/bin/bash
# Installation LAMP Stack (Linux, Apache, MySQL/MariaDB, PHP)
# Compatible : Debian 11/12, Ubuntu 20.04/22.04
# Usage: sudo ./install_lamp.sh
# Configuration
PHP_VERSION="8.2"
MYSQL_ROOT_PASSWORD="$(openssl rand -base64 32)"
DOMAIN="localhost"
# Couleurs
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
print_status() { echo -e "${GREEN}[INFO]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
echo "🚀 Installation LAMP Stack"
echo "=========================="
# Vérification privilèges
if [ "$EUID" -ne 0 ]; then
print_error "Exécutez avec sudo"
exit 1
fi
# 1. MISE À JOUR SYSTÈME
print_status "Mise à jour du système..."
apt update && apt upgrade -y
# 2. INSTALLATION APACHE
print_status "Installation Apache2..."
apt install -y apache2 apache2-utils
# Configuration Apache
systemctl enable apache2
systemctl start apache2
# Sécurisation Apache
cat > /etc/apache2/conf-available/security-custom.conf << EOF
# Sécurisation Apache
ServerTokens Prod
ServerSignature Off
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
EOF
a2enconf security-custom
a2enmod rewrite ssl headers
# 3. INSTALLATION MARIADB
print_status "Installation MariaDB..."
apt install -y mariadb-server mariadb-client
systemctl enable mariadb
systemctl start mariadb
# Configuration sécurisée MariaDB
print_status "Configuration sécurisée MariaDB..."
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'"
mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "DELETE FROM mysql.user WHERE User=''"
mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"
mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "DROP DATABASE IF EXISTS test"
mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "FLUSH PRIVILEGES"
# 4. INSTALLATION PHP
print_status "Installation PHP ${PHP_VERSION}..."
# Dépôts PHP pour Debian/Ubuntu
apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2
curl -sSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update
# Installation PHP et modules
apt install -y php${PHP_VERSION} \
php${PHP_VERSION}-fpm \
php${PHP_VERSION}-mysql \
php${PHP_VERSION}-mbstring \
php${PHP_VERSION}-xml \
php${PHP_VERSION}-gd \
php${PHP_VERSION}-curl \
php${PHP_VERSION}-zip \
php${PHP_VERSION}-intl \
php${PHP_VERSION}-bcmath \
libapache2-mod-php${PHP_VERSION}
# Configuration PHP sécurisée
print_status "Configuration PHP..."
sed -i 's/expose_php = On/expose_php = Off/' /etc/php/${PHP_VERSION}/apache2/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 64M/' /etc/php/${PHP_VERSION}/apache2/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 64M/' /etc/php/${PHP_VERSION}/apache2/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 300/' /etc/php/${PHP_VERSION}/apache2/php.ini
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /etc/php/${PHP_VERSION}/apache2/php.ini
# 5. CONFIGURATION VIRTUAL HOST
print_status "Configuration Virtual Host..."
cat > /etc/apache2/sites-available/${DOMAIN}.conf << EOF
<VirtualHost *:80>
ServerName ${DOMAIN}
DocumentRoot /var/www/${DOMAIN}
<Directory /var/www/${DOMAIN}>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
# Création dossier web
mkdir -p /var/www/${DOMAIN}
chown -R www-data:www-data /var/www/${DOMAIN}
# Page de test PHP
cat > /var/www/${DOMAIN}/index.php << EOF
<!DOCTYPE html>
<html>
<head>
<title>LAMP Server - Test Page</title>
<style>
/* body { font-family: Arial, sans-serif; margin: 40px; background: #f4f4f4; }
.container { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
.success { color: #27ae60; } .info { color: #3498db; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { padding: 10px; border-bottom: 1px solid #ddd; text-align: left; }
th { background-color: #f8f9fa; } */
</style>
</head>
<body>
<div class="container">
<h1>🚀 LAMP Server</h1>
<p class="success">✅ Apache, MySQL et PHP sont opérationnels !</p>
<h2>Informations Système</h2>
<table>
<tr><th>Paramètre</th><th>Valeur</th></tr>
<tr><td>Server Software</td><td><?php echo \$_SERVER['SERVER_SOFTWARE']; ?></td></tr>
<tr><td>PHP Version</td><td class="info"><?php echo phpversion(); ?></td></tr>
<tr><td>Document Root</td><td><?php echo \$_SERVER['DOCUMENT_ROOT']; ?></td></tr>
<tr><td>Server Name</td><td><?php echo \$_SERVER['SERVER_NAME']; ?></td></tr>
<tr><td>Current Time</td><td><?php echo date('Y-m-d H:i:s'); ?></td></tr>
</table>
<?php
// Test connexion MySQL
try {
\$pdo = new PDO('mysql:host=localhost', 'root', '${MYSQL_ROOT_PASSWORD}');
echo '<p class="success">✅ Connexion MySQL : OK</p>';
} catch(PDOException \$e) {
echo '<p style="color: red;">❌ Connexion MySQL : Erreur</p>';
}
?>
<h2>Extensions PHP Chargées</h2>
<p><?php echo implode(', ', get_loaded_extensions()); ?></p>
</div>
</body>
</html>
EOF
# Activation site
a2ensite ${DOMAIN}
a2dissite 000-default
systemctl reload apache2
# 6. INSTALLATION OUTILS COMPLÉMENTAIRES
print_status "Installation outils complémentaires..."
apt install -y phpmyadmin composer certbot python3-certbot-apache
# 7. OPTIMISATION ET SÉCURITÉ
print_status "Optimisations finales..."
# Logrotate pour Apache
cat > /etc/logrotate.d/apache2-custom << EOF
/var/log/apache2/*.log {
weekly
rotate 8
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
systemctl reload apache2
endscript
}
EOF
# Script d'informations
cat > /usr/local/bin/lamp-info << EOF
#!/bin/bash
echo "🚀 LAMP Stack Information"
echo "========================"
echo "Apache: \$(apache2 -v | head -n1)"
echo "MySQL: \$(mysql --version)"
echo "PHP: \$(php -v | head -n1)"
echo ""
echo "📊 Services Status:"
systemctl is-active apache2 && echo "✅ Apache: RUNNING" || echo "❌ Apache: STOPPED"
systemctl is-active mariadb && echo "✅ MariaDB: RUNNING" || echo "❌ MariaDB: STOPPED"
echo ""
echo "🌐 Web: http://\$(hostname -I | awk '{print \$1}')"
echo "🔐 MySQL root password: Voir /root/.mysql_credentials"
EOF
chmod +x /usr/local/bin/lamp-info
# Sauvegarde credentials MySQL
cat > /root/.mysql_credentials << EOF
MySQL Root Password: ${MYSQL_ROOT_PASSWORD}
Generated: $(date)
Command: mysql -u root -p
EOF
chmod 600 /root/.mysql_credentials
# RÉSUMÉ FINAL
echo -e "\n${GREEN}🎉 Installation LAMP terminée !${NC}"
echo "================================="
echo -e "${GREEN}✅ Apache 2${NC} - Port 80/443"
echo -e "${GREEN}✅ MariaDB${NC} - Port 3306"
echo -e "${GREEN}✅ PHP ${PHP_VERSION}${NC} - Modules installés"
echo -e "${GREEN}✅ PHPMyAdmin${NC} - /phpmyadmin"
echo ""
echo "🌐 Site web : http://$(hostname -I | awk '{print $1}')"
echo "🔐 MySQL root : Voir /root/.mysql_credentials"
echo "📊 Infos système : lamp-info"
echo ""
echo "Next steps:"
echo "• Configurer SSL/TLS : certbot --apache"
echo "• Sauvegarder les credentials MySQL"
echo "• Configurer votre application web"
Après installation :
• Accédez à votre serveur via l'IP affichée
• Configurez SSL avec certbot --apache
• Créez vos bases de données et utilisateurs
• Uploadez vos applications web dans /var/www/
Système de Backup Rotatif
Système automatisé de sauvegarde avec rotation et notifications.
💾 Script de Backup Complet
html
#!/bin/bash
# Système de sauvegarde automatisé avec rotation
# Sauvegarde : Web, Bases de données, Configuration
# Author: DevWeb Academy
# CONFIGURATION
BACKUP_DIR="/backup"
WEB_DIR="/var/www"
CONFIG_DIRS="/etc/apache2 /etc/php /etc/mysql /etc/ssh"
MYSQL_USER="root"
MYSQL_PASSWORD="$(cat /root/.mysql_credentials | grep Password | cut -d: -f2 | tr -d ' ')"
RETENTION_DAYS=7
REMOTE_BACKUP="false" # true pour backup distant
REMOTE_HOST="backup-server.example.com"
REMOTE_USER="backup"
EMAIL_NOTIFICATIONS="true"
ADMIN_EMAIL="admin@example.com"
# Variables internes
DATE="$(date +%Y-%m-%d_%H-%M-%S)"
BACKUP_NAME="backup_${DATE}"
LOG_FILE="${BACKUP_DIR}/logs/backup_${DATE}.log"
TEMP_DIR="${BACKUP_DIR}/temp"
# Couleurs
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
# Fonctions utilitaires
log_message() {
local level=$1; shift
local message="$*"
echo "$(date '+%Y-%m-%d %H:%M:%S') [${level}] ${message}" | tee -a "${LOG_FILE}"
}
print_status() { log_message "INFO" "$1"; echo -e "${GREEN}[INFO]${NC} $1"; }
print_warning() { log_message "WARNING" "$1"; echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { log_message "ERROR" "$1"; echo -e "${RED}[ERROR]${NC} $1"; }
send_notification() {
if [ "${EMAIL_NOTIFICATIONS}" = "true" ] && command -v mail &> /dev/null; then
echo "$2" | mail -s "$1" "${ADMIN_EMAIL}"
fi
}
check_space() {
local required_space=$1
local available_space=$(df -BG "${BACKUP_DIR}" | awk 'NR==2{print $4}' | sed 's/G//')
if [ "${available_space}" -lt "${required_space}" ]; then
print_error "Espace insuffisant. Requis: ${required_space}G, Disponible: ${available_space}G"
return 1
fi
return 0
}
echo "💾 Démarrage sauvegarde système - ${DATE}"
print_status "Initialisation du système de backup..."
# Création des dossiers nécessaires
mkdir -p "${BACKUP_DIR}/"{daily,weekly,monthly,logs,temp}
mkdir -p "${TEMP_DIR}/${BACKUP_NAME}"
# Vérification espace disque (5GB minimum)
if ! check_space 5; then
send_notification "BACKUP FAILED - Espace insuffisant" "Le backup a échoué car l'espace disque est insuffisant."
exit 1
fi
# 1. SAUVEGARDE DES SITES WEB
print_status "Sauvegarde des sites web..."
if [ -d "${WEB_DIR}" ]; then
tar -czf "${TEMP_DIR}/${BACKUP_NAME}/websites.tar.gz" -C "$(dirname ${WEB_DIR})" "$(basename ${WEB_DIR})" 2>> "${LOG_FILE}"
if [ $? -eq 0 ]; then
print_status "✅ Sites web sauvegardés"
else
print_error "❌ Erreur sauvegarde sites web"
fi
else
print_warning "Dossier web non trouvé: ${WEB_DIR}"
fi
# 2. SAUVEGARDE BASES DE DONNÉES
print_status "Sauvegarde des bases de données..."
if command -v mysql &> /dev/null && [ -n "${MYSQL_PASSWORD}" ]; then
# Liste des bases de données
DATABASES=$(mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" -e "SHOW DATABASES;" | grep -vE "^(Database|information_schema|performance_schema|mysql|sys)$")
mkdir -p "${TEMP_DIR}/${BACKUP_NAME}/databases"
for db in $DATABASES; do
print_status "Sauvegarde base de données: ${db}"
mysqldump -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --routines --triggers "${db}" | gzip > "${TEMP_DIR}/${BACKUP_NAME}/databases/${db}.sql.gz"
if [ "${PIPESTATUS[0]}" -eq 0 ]; then
print_status "✅ ${db} sauvegardée"
else
print_error "❌ Erreur sauvegarde ${db}"
fi
done
else
print_warning "MySQL non disponible ou mot de passe manquant"
fi
# 3. SAUVEGARDE CONFIGURATIONS
print_status "Sauvegarde des configurations..."
mkdir -p "${TEMP_DIR}/${BACKUP_NAME}/config"
for config_dir in $CONFIG_DIRS; do
if [ -d "${config_dir}" ]; then
dir_name="$(basename ${config_dir})"
tar -czf "${TEMP_DIR}/${BACKUP_NAME}/config/${dir_name}.tar.gz" -C "$(dirname ${config_dir})" "${dir_name}" 2>> "${LOG_FILE}"
print_status "✅ Configuration ${dir_name} sauvegardée"
fi
done
# Sauvegarde crontab
crontab -l > "${TEMP_DIR}/${BACKUP_NAME}/config/crontab.txt" 2>/dev/null || true
# 4. CRÉATION ARCHIVE FINALE
print_status "Création de l'archive finale..."
tar -czf "${BACKUP_DIR}/daily/${BACKUP_NAME}.tar.gz" -C "${TEMP_DIR}" "${BACKUP_NAME}"
if [ $? -eq 0 ]; then
BACKUP_SIZE=$(du -h "${BACKUP_DIR}/daily/${BACKUP_NAME}.tar.gz" | cut -f1)
print_status "✅ Archive créée: ${BACKUP_SIZE}"
# Nettoyage dossier temporaire
rm -rf "${TEMP_DIR}/${BACKUP_NAME}"
else
print_error "❌ Erreur création archive finale"
exit 1
fi
# 5. SYNCHRONISATION DISTANTE (si activée)
if [ "${REMOTE_BACKUP}" = "true" ]; then
print_status "Synchronisation vers serveur distant..."
rsync -avz --progress "${BACKUP_DIR}/daily/${BACKUP_NAME}.tar.gz" "${REMOTE_USER}@${REMOTE_HOST}:~/backups/"
if [ $? -eq 0 ]; then
print_status "✅ Synchronisation distante réussie"
else
print_error "❌ Erreur synchronisation distante"
fi
fi
# 6. ROTATION DES SAUVEGARDES
print_status "Rotation des sauvegardes..."
# Suppression sauvegardes anciennes (> RETENTION_DAYS)
find "${BACKUP_DIR}/daily" -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
find "${BACKUP_DIR}/logs" -name "*.log" -mtime +30 -delete
# Sauvegarde hebdomadaire (dimanche)
if [ "$(date +%u)" -eq 7 ]; then
cp "${BACKUP_DIR}/daily/${BACKUP_NAME}.tar.gz" "${BACKUP_DIR}/weekly/"
print_status "📅 Sauvegarde hebdomadaire créée"
# Garder 4 sauvegardes hebdomadaires
ls -t "${BACKUP_DIR}/weekly/"*.tar.gz | tail -n +5 | xargs -r rm
fi
# Sauvegarde mensuelle (1er du mois)
if [ "$(date +%d)" -eq 1 ]; then
cp "${BACKUP_DIR}/daily/${BACKUP_NAME}.tar.gz" "${BACKUP_DIR}/monthly/"
print_status "📅 Sauvegarde mensuelle créée"
# Garder 12 sauvegardes mensuelles
ls -t "${BACKUP_DIR}/monthly/"*.tar.gz | tail -n +13 | xargs -r rm
fi
# 7. RAPPORT FINAL
END_TIME="$(date)"
DAILY_COUNT=$(ls -1 "${BACKUP_DIR}/daily/"*.tar.gz 2>/dev/null | wc -l)
WEEKLY_COUNT=$(ls -1 "${BACKUP_DIR}/weekly/"*.tar.gz 2>/dev/null | wc -l)
MONTHLY_COUNT=$(ls -1 "${BACKUP_DIR}/monthly/"*.tar.gz 2>/dev/null | wc -l)
REPORT="
🎉 SAUVEGARDE TERMINÉE AVEC SUCCÈS
📊 Résumé:
• Archive: ${BACKUP_NAME}.tar.gz (${BACKUP_SIZE})
• Durée: $(date -d "${END_TIME}" +%H:%M:%S)
• Stockage: ${BACKUP_DIR}
📈 Statistiques:
• Sauvegardes quotidiennes: ${DAILY_COUNT}
• Sauvegardes hebdomadaires: ${WEEKLY_COUNT}
• Sauvegardes mensuelles: ${MONTHLY_COUNT}
💾 Contenu sauvegardé:
• Sites web (/var/www)
• Bases de données MySQL
• Configurations système
• Tâches cron
🔄 Prochaine sauvegarde: $(date -d 'tomorrow' '+%Y-%m-%d %H:%M:%S')
"
echo -e "${REPORT}"
log_message "INFO" "Sauvegarde terminée avec succès"
# Notification email
send_notification "✅ Backup réussi - $(hostname)" "${REPORT}"
echo "📋 Log détaillé: ${LOG_FILE}"
exit 0
Installation et Configuration :
1. sudo mkdir -p /backup && sudo chmod 755 /backup
2. sudo cp backup_system.sh /usr/local/bin/ && sudo chmod +x /usr/local/bin/backup_system.sh
3. sudo crontab -e puis ajouter : 0 2 * * * /usr/local/bin/backup_system.sh
🔄 Script de Restauration
html
#!/bin/bash
# Script de restauration des sauvegardes
# Usage: sudo ./restore_backup.sh [backup_file] [options]
BACKUP_DIR="/backup"
RESTORE_DIR="/tmp/restore"
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
print_status() { echo -e "${GREEN}[INFO]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }
show_usage() {
echo "Usage: $0 [backup_file] [options]"
echo "Options:"
echo " --web-only Restaurer uniquement les sites web"
echo " --db-only Restaurer uniquement les bases de données"
echo " --config-only Restaurer uniquement les configurations"
echo " --list Lister les sauvegardes disponibles"
exit 1
}
list_backups() {
echo "📋 Sauvegardes disponibles:"
echo "========================="
echo "📅 QUOTIDIENNES:"
ls -la "${BACKUP_DIR}/daily/"*.tar.gz 2>/dev/null || echo "Aucune sauvegarde quotidienne"
echo -e "\n📅 HEBDOMADAIRES:"
ls -la "${BACKUP_DIR}/weekly/"*.tar.gz 2>/dev/null || echo "Aucune sauvegarde hebdomadaire"
echo -e "\n📅 MENSUELLES:"
ls -la "${BACKUP_DIR}/monthly/"*.tar.gz 2>/dev/null || echo "Aucune sauvegarde mensuelle"
}
restore_backup() {
local backup_file="$1"
local restore_type="$2"
if [ ! -f "$backup_file" ]; then
print_error "Fichier de sauvegarde non trouvé: $backup_file"
return 1
fi
print_status "Extraction de la sauvegarde..."
mkdir -p "$RESTORE_DIR"
tar -xzf "$backup_file" -C "$RESTORE_DIR"
BACKUP_NAME=$(basename "$backup_file" .tar.gz)
case "$restore_type" in
"web")
print_status "Restauration des sites web..."
if [ -f "$RESTORE_DIR/$BACKUP_NAME/websites.tar.gz" ]; then
tar -xzf "$RESTORE_DIR/$BACKUP_NAME/websites.tar.gz" -C /
print_status "✅ Sites web restaurés"
fi
;;
"db")
print_status "Restauration des bases de données..."
if [ -d "$RESTORE_DIR/$BACKUP_NAME/databases" ]; then
for db_file in "$RESTORE_DIR/$BACKUP_NAME/databases/"*.sql.gz; do
db_name="$(basename "$db_file" .sql.gz)"
zcat "$db_file" | mysql -u root -p"$MYSQL_PASSWORD" "$db_name"
print_status "✅ Base $db_name restaurée"
done
fi
;;
"config")
print_status "Restauration des configurations..."
if [ -d "$RESTORE_DIR/$BACKUP_NAME/config" ]; then
tar -xzf "$RESTORE_DIR/$BACKUP_NAME/config/"*.tar.gz -C /
print_status "✅ Configurations restaurées"
fi
;;
*)
print_status "Restauration complète..."
restore_backup "$1" "web"
restore_backup "$1" "db"
restore_backup "$1" "config"
;;
esac
# Nettoyage
rm -rf "$RESTORE_DIR"
}
# Script principal
case "$1" in
"--list")
list_backups
;;
"")
show_usage
;;
*)
BACKUP_FILE="$1"
RESTORE_TYPE="full"
case "$2" in
"--web-only") RESTORE_TYPE="web" ;;
"--db-only") RESTORE_TYPE="db" ;;
"--config-only") RESTORE_TYPE="config" ;;
esac
restore_backup "$BACKUP_FILE" "$RESTORE_TYPE"
;;
esac
Linux maîtrisé
Ressources et Liens Utiles
📚 Documentation Officielle :
• Manuel Debian
• Documentation Apache
• MariaDB Knowledge Base
• Manuel PHP
🛠️ Outils Essentiels :
• Htop - Moniteur système interactif
• Fail2Ban - Protection contre les intrusions
• UFW - Firewall simplifié
• Certbot - Certificats SSL gratuits
🌐 Communautés :
• Forum Debian France
• Stack Overflow - Questions techniques
• Reddit r/debian
• IRC #debian-fr sur OFTC
📥 Téléchargements Directs :
Scripts de ce guide :
• script_securisation.sh
• install_lamp.sh
• backup_system.sh
• restore_backup.sh
Images ISO :
• Debian 12 NetInstall
• Debian 12 DVD Complete
• Ubuntu 22.04 LTS
Linux maîtrisé
Meilleures Pratiques Linux
✅ SÉCURITÉ À FAIRE :
• Mises à jour régulières du système
• Authentification par clés SSH uniquement
• Firewall correctement configuré
• Fail2Ban pour bloquer les attaques
• Sauvegardes automatiques et testées
• Surveillance des logs système
• Principe du moindre privilège
❌ ERREURS À ÉVITER :
• Utiliser root pour les tâches quotidiennes
• SSH avec mot de passe sur internet
• Désactiver le firewall "temporairement"
• Ignorer les mises à jour de sécurité
• Permissions 777 sur les fichiers
• Pas de sauvegarde ou sauvegarde non testée
• Installer des paquets de sources non officielles
Linux Maîtrisé !
Vous maîtrisez maintenant Linux de A à Z : installation, sécurisation, serveur web LAMP, et système de sauvegarde automatisé. Passez au niveau professionnel !
🎯 Compétences acquises :
Installation Linux • VirtualBox • Sécurisation Serveur • LAMP Stack • Apache • MySQL/MariaDB • PHP • Backup Rotatif • Administration Système
Linux maîtrisé
Distributions, installation, sécurisation, LAMP et sauvegardes : vous avez de quoi tenir un serveur.