# 🎯 Exercice : Améliorer le serveur Nginx avec Ansible

## 📋 Objectif de l'exercice

Tu vas améliorer ton projet Ansible actuel en ajoutant 3 fonctionnalités importantes :
1. ✅ **HTTPS** (sécuriser le site avec un certificat SSL)
2. ✅ **Authentification** (protéger l'accès avec login/password)
3. ✅ **Déployer des pages web** (mettre ton propre site HTML)

---

## 🚀 Partie 1 : Configurer HTTPS avec Let's Encrypt

### 🤔 C'est quoi HTTPS ?
- HTTP = ton site est accessible mais **pas sécurisé** (pas de cadenas 🔓)
- HTTPS = ton site est **sécurisé** avec un certificat SSL (cadenas vert 🔒)
- Les données sont **chiffrées** entre le navigateur et le serveur

### 📝 Ce que tu dois faire :

#### Étape 1.1 : Installer Certbot
Certbot = outil gratuit pour obtenir un certificat SSL

**Ajoute cette tâche dans `playbook.yml`** (après l'installation de Nginx) :
```yaml
- name: Installer Certbot pour Let's Encrypt
  apt:
    name:
      - certbot
      - python3-certbot-nginx
    state: present
```

**💡 Explication** :
- `certbot` = l'outil principal
- `python3-certbot-nginx` = plugin pour configurer automatiquement Nginx

#### Étape 1.2 : Générer le certificat SSL
**Ajoute cette tâche** :
```yaml
- name: Obtenir un certificat SSL avec Certbot
  command: certbot --nginx -d defder.fr --non-interactive --agree-tos --email ton-email@exemple.com
  args:
    creates: /etc/letsencrypt/live/defder.fr/fullchain.pem
```

**💡 Explication** :
- `--nginx` = configure automatiquement Nginx
- `-d defder.fr` = ton nom de domaine
- `--non-interactive` = pas de questions (automatique)
- `--agree-tos` = accepte les conditions
- `--email` = **REMPLACE par ton vrai email !**
- `creates: ...` = ne refait pas si le certificat existe déjà

#### Étape 1.3 : Renouvellement automatique
Les certificats expirent tous les 90 jours. Il faut les renouveler automatiquement.

**Ajoute cette tâche** :
```yaml
- name: Configurer le renouvellement automatique du certificat
  cron:
    name: "Renouveler certificat SSL"
    minute: "0"
    hour: "3"
    job: "certbot renew --quiet"
```

**💡 Explication** :
- Vérifie chaque jour à 3h du matin si le certificat doit être renouvelé
- `--quiet` = ne fait pas de bruit dans les logs

#### ✅ Vérification Partie 1
Lance ton playbook : `./run.sh`

Ensuite, teste dans ton navigateur : `https://defder.fr`
- Tu dois voir le **cadenas vert 🔒**
- Le site est maintenant sécurisé !

---

## 🔐 Partie 2 : Ajouter une authentification

### 🤔 C'est quoi l'authentification ?
Une popup qui demande **login + password** avant d'accéder au site.
Utile pour protéger un site privé, un backoffice, etc.

### 📝 Ce que tu dois faire :

#### Étape 2.1 : Installer les outils nécessaires
**Ajoute cette tâche** :
```yaml
- name: Installer apache2-utils pour htpasswd
  apt:
    name: apache2-utils
    state: present
```

**💡 Explication** :
- `htpasswd` = outil pour créer des fichiers de mots de passe

#### Étape 2.2 : Créer un utilisateur avec mot de passe
**Ajoute cette tâche** :
```yaml
- name: Créer un fichier de mots de passe
  htpasswd:
    path: /etc/nginx/.htpasswd
    name: admin
    password: "MonMotDePasse123"
    owner: root
    group: www-data
    mode: '0640'
```

**💡 Explication** :
- Crée un fichier `/etc/nginx/.htpasswd`
- Utilisateur : `admin`
- Mot de passe : `MonMotDePasse123` (**CHANGE-LE !**)
- `mode: '0640'` = permissions sécurisées

#### Étape 2.3 : Créer un fichier de configuration Nginx
Tu vas créer un fichier de config personnalisé pour Nginx.

**D'abord, crée un dossier `templates/` dans ton projet** :
```
iaac/
├── templates/
│   └── nginx-auth.conf.j2
├── playbook.yml
├── inventory.yml
...
```

**Crée le fichier `templates/nginx-auth.conf.j2`** avec ce contenu :
```nginx
server {
    listen 80;
    server_name defder.fr;
    
    # Redirection HTTP vers HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name defder.fr;
    
    # Certificats SSL (générés par Certbot)
    ssl_certificate /etc/letsencrypt/live/defder.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/defder.fr/privkey.pem;
    
    # Dossier racine du site
    root /var/www/html;
    index index.html;
    
    # AUTHENTIFICATION
    auth_basic "Zone protégée - Connexion requise";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    location / {
        try_files $uri $uri/ =404;
    }
}
```

**💡 Explication** :
- Redirige automatiquement HTTP → HTTPS
- Active l'authentification avec `auth_basic`
- Pointe vers le fichier de mots de passe

#### Étape 2.4 : Déployer la configuration
**Ajoute cette tâche dans `playbook.yml`** :
```yaml
- name: Déployer la configuration Nginx avec authentification
  template:
    src: templates/nginx-auth.conf.j2
    dest: /etc/nginx/sites-available/defder
  notify: Recharger Nginx

- name: Activer le site
  file:
    src: /etc/nginx/sites-available/defder
    dest: /etc/nginx/sites-enabled/defder
    state: link

- name: Désactiver le site par défaut
  file:
    path: /etc/nginx/sites-enabled/default
    state: absent
  notify: Recharger Nginx
```

#### Étape 2.5 : Ajouter un handler pour recharger Nginx
**À la fin de `playbook.yml`**, ajoute :
```yaml
  handlers:
    - name: Recharger Nginx
      systemd:
        name: nginx
        state: reloaded
```

**💡 Explication** :
- Un handler = une action qui se déclenche quand un fichier change
- Recharge Nginx quand la config est modifiée

#### ✅ Vérification Partie 2
Lance ton playbook : `./run.sh`

Visite `https://defder.fr` → Une popup apparaît !
- Login : `admin`
- Password : `MonMotDePasse123` (ou celui que tu as choisi)

---

## 🎨 Partie 3 : Déployer des pages web personnalisées

### 🤔 C'est quoi déployer des pages ?
Remplacer la page par défaut de Nginx par **ton propre site HTML**.

### 📝 Ce que tu dois faire :

#### Étape 3.1 : Créer un dossier pour ton site
**Dans ton projet, crée un dossier `files/`** :
```
iaac/
├── files/
│   ├── index.html
│   └── style.css
├── templates/
├── playbook.yml
...
```

#### Étape 3.2 : Créer une page HTML
**Crée `files/index.html`** :
```html
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon site déployé avec Ansible</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>🚀 Bienvenue sur mon serveur !</h1>
        <p>Ce site a été déployé automatiquement avec Ansible.</p>
        <ul>
            <li>✅ Serveur : Nginx</li>
            <li>✅ Sécurité : HTTPS activé</li>
            <li>✅ Protection : Authentification activée</li>
            <li>✅ Automatisation : 100% IaaC</li>
        </ul>
        <p class="footer">Déployé le {{ ansible_date_time.date }} 🎉</p>
    </div>
</body>
</html>
```

#### Étape 3.3 : Créer un fichier CSS
**Crée `files/style.css`** :
```css
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: Arial, sans-serif;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}

.container {
    background: white;
    padding: 3rem;
    border-radius: 15px;
    box-shadow: 0 10px 40px rgba(0,0,0,0.3);
    max-width: 600px;
    text-align: center;
}

h1 {
    color: #667eea;
    margin-bottom: 1rem;
    font-size: 2.5rem;
}

p {
    color: #333;
    margin-bottom: 1rem;
    font-size: 1.1rem;
}

ul {
    list-style: none;
    margin: 2rem 0;
}

ul li {
    background: #f0f0f0;
    padding: 0.8rem;
    margin: 0.5rem 0;
    border-radius: 8px;
    font-size: 1rem;
}

.footer {
    margin-top: 2rem;
    font-style: italic;
    color: #667eea;
}
```

#### Étape 3.4 : Déployer les fichiers sur le serveur
**Ajoute ces tâches dans `playbook.yml`** (avant le handler) :
```yaml
- name: Créer le dossier du site web
  file:
    path: /var/www/html
    state: directory
    owner: www-data
    group: www-data
    mode: '0755'

- name: Déployer la page HTML
  template:
    src: files/index.html
    dest: /var/www/html/index.html
    owner: www-data
    group: www-data
    mode: '0644'

- name: Déployer le fichier CSS
  copy:
    src: files/style.css
    dest: /var/www/html/style.css
    owner: www-data
    group: www-data
    mode: '0644'
```

**💡 Explication** :
- `template:` pour index.html = permet d'utiliser des variables Ansible (comme la date)
- `copy:` pour style.css = copie simple du fichier
- `owner: www-data` = donne les bons droits à Nginx

#### ✅ Vérification Partie 3
Lance ton playbook : `./run.sh`

Visite `https://defder.fr` :
- Entre login/password
- Tu vois **ton site personnalisé** ! 🎉

---

## 🎓 Résumé de ce que tu as appris

| Fonctionnalité | Module Ansible | Utilité |
|---------------|----------------|---------|
| **HTTPS** | `command` (certbot) | Sécuriser le site |
| **Authentification** | `htpasswd` | Protéger l'accès |
| **Configuration Nginx** | `template` | Personnaliser le serveur |
| **Déploiement de fichiers** | `copy` / `template` | Mettre en ligne ton site |
| **Handlers** | `handlers` | Recharger Nginx automatiquement |

---

## 🚀 Pour aller plus loin (Bonus)

### Idées d'améliorations :
1. **Plusieurs utilisateurs** : Ajoute plusieurs logins dans htpasswd
2. **Variables** : Mets le nom de domaine, email, etc. dans un fichier `vars.yml`
3. **Rôles Ansible** : Organise ton code en rôles (nginx, ssl, web)
4. **CI/CD** : Automatise le déploiement avec GitHub Actions
5. **Monitoring** : Ajoute un outil pour surveiller le serveur

---

## 📚 Ressources utiles

- **Documentation Ansible** : https://docs.ansible.com
- **Certbot** : https://certbot.eff.org
- **Nginx** : https://nginx.org/en/docs/

---

## ✅ Checklist finale

- [ ] HTTPS fonctionne (cadenas vert)
- [ ] Authentification demande login/password
- [ ] Page personnalisée affichée
- [ ] Certificat SSL se renouvelle automatiquement
- [ ] Code versionné sur Git
- [ ] Playbook s'exécute sans erreur

**Bravo ! Tu as créé une infrastructure complète et sécurisée avec Ansible ! 🎉**
