JavaScript pour débuter

De l’histoire d’UNIX au serveur LAMP sécurisé : Linux, pas à pas.

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.