# Guide de Migration Cron Laravel vers Root

## Problème résolu

-   ✅ Migration du cron Laravel de l'utilisateur `laravel` vers `root`
-   ✅ Configuration des permissions appropriées pour les dossiers cache
-   ✅ Élimination du besoin de `chmod 777` sur les dossiers cache
-   ✅ Correction automatique des permissions toutes les heures

## Scripts créés

### 1. `migrate-cron-to-root.sh`

Script principal pour migrer le cron vers root :

```bash
sudo ./migrate-cron-to-root.sh
```

**Fonctionnalités :**

-   Supprime l'ancien cron de l'utilisateur `laravel`
-   Configure un nouveau cron pour `root` qui exécute Laravel avec `sudo -u www-data`
-   Ajoute une correction automatique des permissions toutes les heures
-   Vérifie le tag `ServerName` de l'instance EC2

### 2. `fix-cache-permissions.sh`

Script de correction automatique des permissions :

```bash
sudo ./fix-cache-permissions.sh
```

**Fonctionnalités :**

-   Corrige les permissions des dossiers de cache : `storage/framework/*`, `bootstrap/cache`, etc.
-   Applique les permissions `775` avec setgid pour hériter du groupe `www-data`
-   Nettoie automatiquement les anciens fichiers cache si trop volumineux
-   Log détaillé avec timestamps

### 3. `test-laravel-permissions.sh`

Script de validation des permissions :

```bash
./test-laravel-permissions.sh
```

**Tests effectués :**

-   Création de fichiers par `www-data`
-   Écriture par PHP
-   Vérification des permissions des dossiers critiques
-   Test des commandes Artisan cache

## Configuration Cron Finale

**Ancien cron (utilisateur `laravel`) :**

```bash
* * * * * cd /var/www/html && php artisan schedule:run >> /var/log/laravel-cron.log 2>&1
```

**Nouveau cron (utilisateur `root`) :**

```bash
# Laravel schedule runner avec utilisateur www-data pour la compatibilité
* * * * * cd /var/www/html && sudo -u www-data php artisan schedule:run >> /var/log/laravel-cron.log 2>&1

# Rotation des logs toutes les semaines (dimanche à 2h)
0 2 * * 0 cd /var/www/html && echo "$(tail -1000 /var/log/laravel-cron.log)" > /var/log/laravel-cron.log && chown www-data:www-data /var/log/laravel-cron.log

# Correction des permissions des cache toutes les heures
0 * * * * /var/www/html/fix-cache-permissions.sh >> /var/log/laravel-permissions.log 2>&1
```

## Permissions Optimales

### Dossiers de cache avec setgid (2775)

```
drwxrwsr-x  www-data www-data  storage/framework/cache
drwxrwsr-x  www-data www-data  storage/framework/sessions
drwxrwsr-x  www-data www-data  storage/framework/views
drwxrwsr-x  www-data www-data  bootstrap/cache
```

**Avantages du setgid (s) :**

-   Tous les nouveaux fichiers héritent automatiquement du groupe `www-data`
-   Plus besoin de `chmod 777`
-   Sécurité renforcée avec permissions minimales

### Fichiers cache (664)

```
-rw-rw-r--  www-data www-data  fichiers de cache
```

## Déploiement sur Production

### Étape 1: Sur le serveur prod_1

```bash
# 1. Télécharger les nouveaux scripts
cd /var/www/html
git pull origin main  # ou votre branche

# 2. Rendre les scripts exécutables
chmod +x migrate-cron-to-root.sh
chmod +x fix-cache-permissions.sh
chmod +x test-laravel-permissions.sh

# 3. Exécuter la migration
sudo ./migrate-cron-to-root.sh

# 4. Tester les permissions
./test-laravel-permissions.sh

# 5. Vérifier que le cron fonctionne
sudo crontab -l
tail -f /var/log/laravel-cron.log
```

### Étape 2: Monitoring

```bash
# Logs Laravel
tail -f /var/log/laravel-cron.log

# Logs de correction des permissions
tail -f /var/log/laravel-permissions.log

# Vérifier les tâches planifiées Laravel
sudo -u www-data php artisan schedule:list
```

## Avantages de cette solution

1. **Sécurité renforcée** : Plus besoin de permissions `777`
2. **Correction automatique** : Les permissions sont corrigées toutes les heures
3. **Compatibilité** : Laravel tourne toujours sous `www-data` pour la compatibilité
4. **Monitoring** : Logs séparés pour le debug
5. **Maintenance automatique** : Rotation des logs et nettoyage du cache

## Commandes utiles

```bash
# Vérifier le cron actuel
sudo crontab -l

# Vérifier les permissions
ls -la storage/framework/

# Tester manuellement Laravel
sudo -u www-data php artisan schedule:run --verbose

# Corriger manuellement les permissions
sudo ./fix-cache-permissions.sh

# Tester les permissions
./test-laravel-permissions.sh
```

## Rollback (si nécessaire)

Pour revenir à l'ancienne configuration :

```bash
# Supprimer le cron root
sudo crontab -r

# Recréer l'utilisateur laravel si supprimé
sudo useradd -r -s /bin/bash -d /var/www/html -G www-data laravel

# Remettre l'ancien cron
sudo crontab -u laravel -e
# Ajouter : * * * * * cd /var/www/html && php artisan schedule:run >> /var/log/laravel-cron.log 2>&1
```
