# Guide Pratique : Encodage et Déploiement Sécurisé d'un Projet Laravel avec ionCube

Ce document détaille la procédure complète pour chiffrer une application PHP / Laravel avec **ionCube Encoder** avant son déploiement sur le serveur d'un client, garantissant ainsi la protection totale de votre code source et de votre propriété intellectuelle.

---

## Sommaire
1. [Principe Général](#1-principe-général)
2. [Étape 1 : Installation d'ionCube sur Vos Deux Environnements](#étape-1--installation-dioncube-sur-vos-deux-environnements)
   * [A. Sur VOTRE Machine / Serveur de Dev (Installation de l'Encoder)](#a-sur-votre-machine--serveur-de-dev-installation-de-lencoder)
   * [B. Sur le Serveur du CLIENT (Installation du Loader Gratuit)](#b-sur-le-serveur-du-client-installation-du-loader-gratuit)
3. [Étape 2 : Préparation de la Commande d'Encodage (Poste Local)](#étape-2--préparation-de-la-commande-dencodage-poste-local)
4. [Étape 3 : Ajout de Restrictions de Licence (Optionnel)](#étape-3--ajout-de-restrictions-de-licence-optionnel)
5. [Étape 4 : Transfert et Finalisation du Déploiement](#étape-4--transfert-et-finalisation-du-déploiement)
6. [Résultat Obtenu et Sécurité](#résultat-obtenu-et-sécurité)

---

## 1. Principe Général

Pour qu'une application Laravel encodée fonctionne de manière optimale chez un client, l'encodage doit cibler la logique métier tout en préservant la structure du framework :

* **Fichiers à chiffrer (Code Métier) :** `app/`, `routes/`, `config/`, `database/`, helpers persos.
* **Fichiers à copier tels quels (Non encodés) :**
  * Dossiers volumineux / dépendances : `public/`, `vendor/`, `node_modules/`.
  * Templates d'affichage : `resources/views/*.blade.php`.
  * Fichiers de structure : `artisan`, `composer.json`, `.env`, scripts `.bat` ou `.yml`.

---

## Étape 1 : Installation d'ionCube sur Vos Deux Environnements

### A. Sur VOTRE Machine / Serveur de Dev (Installation de l'Encoder)

L'**Encoder** est l'outil payant (ou en version d'évaluation) qui transforme votre code PHP lisible en fichiers chiffrés.

#### Sur Windows :
1. Téléchargez le programme d'installation ou l'archive `.zip` depuis le site officiel d'ionCube.
2. Extrayez le dossier dans un emplacement fixe (ex: `C:\Program Files (x86)\ionCube PHP Encoder 15.0.1 Evaluation`).
3. *(Optionnel - Recommandé)* Ajoutez le chemin du dossier dans la variable d'environnement `PATH` de Windows pour exécuter la commande depuis n'importe quel dossier.

#### Sur Linux (Serveur d'intégration / CI) :
1. Téléchargez et extrayez l'archive Linux :
   ```bash
   cd /tmp
   wget https://downloads.ioncube.com/encoder_downloads/ioncube_encoder_lin_x86-64.tar.gz
   tar -zxvf ioncube_encoder_lin_x86-64.tar.gz
   ```
2. Rendez l'exécutable accessible globalement :
   ```bash
   sudo cp ioncube_encoder /usr/local/bin/
   sudo chmod +x /usr/local/bin/ioncube_encoder
   ```

---

### B. Sur le Serveur du CLIENT (Installation du Loader Gratuit)

Le **Loader** est un module/extension PHP gratuit indispensable sur le serveur du client pour lire et exécuter les fichiers encodés.

1. **Connectez-vous en SSH au serveur du client et identifiez la version PHP / architecture :**
   ```bash
   php -v
   uname -m
   ```

2. **Téléchargez et extrayez l'archive ionCube Loader correspondante :**
   ```bash
   cd /tmp

   # Pour architecture x86_64 (64 bits) :
   wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
   tar -zxvf ioncube_loaders_lin_x86-64.tar.gz
   ```

3. **Trouvez le répertoire d'extensions PHP du serveur :**
   ```bash
   php -r "echo ini_get('extension_dir');"
   ```
   *(Exemple de résultat : `/usr/lib/php/20220829`)*

4. **Copiez l'extension correspondant à la version PHP du client :**
   ```bash
   # Exemple pour PHP 8.2 :
   sudo cp /tmp/ioncube/ioncube_loader_lin_8.2.so /usr/lib/php/20220829/
   ```

5. **Déclarez l'extension dans la configuration PHP (`php.ini`) :**
   
   *Sur Debian / Ubuntu (Méthode propre via module) :*
   ```bash
   echo "zend_extension = /usr/lib/php/20220829/ioncube_loader_lin_8.2.so" | sudo tee /etc/php/8.2/mods-available/00-ioncube.ini
   sudo phpenmod -v 8.2 00-ioncube
   ```

   *Ou édition directe dans `php.ini` (ajouter tout en haut) :*
   ```ini
   zend_extension = /usr/lib/php/20220829/ioncube_loader_lin_8.2.so
   ```

6. **Redémarrez le serveur Web pour valider :**
   ```bash
   sudo systemctl restart php8.2-fpm apache2 nginx
   ```

7. **Vérifiez l'activation :**
   Exécutez `php -v`. Vous devez voir la mention `with the ionCube PHP Loader vXX.X`.

---

## Étape 2 : Préparation de la Commande d'Encodage (Poste Local)

Depuis votre terminal, exécutez l'exécutable ionCube correspondant à la version PHP du serveur cible (exemple : `ioncube_encoder82.exe` pour **PHP 8.2**).

### Commande PowerShell (Windows) :
```powershell
.\ioncube_encoder82.exe `
  --copy "public/" `
  --copy "vendor/" `
  --copy "node_modules/" `
  --copy "*.json" --copy "*.env*" --copy "*.xml" --copy "*.bat" --copy "*.yml" --copy "*.blade.php" --copy "artisan" `
  --ignore-strict-warnings `
  C:\cheminersotre_projet_source `
  -o C:\cheminersotre_projet_encode
```

### Commande Bash (Linux / macOS) :
```bash
ioncube_encoder8.2   --copy "public/"   --copy "vendor/"   --copy "node_modules/"   --copy "*.json" --copy "*.env*" --copy "*.xml" --copy "*.yml" --copy "*.blade.php" --copy "artisan"   --ignore-strict-warnings   /chemin/vers/votre_projet_source   -o /chemin/vers/votre_projet_encode
```

---

## Étape 3 : Ajout de Restrictions de Licence (Optionnel)

Si vous possédez une licence **ionCube Pro** ou **Cerberus**, vous pouvez ajouter des garde-fous directement lors de la commande d'encodage pour interdire la duplication ou la revente non autorisée :

### Restreindre à un nom de domaine :
```bash
--allowed-server "client-domaine.com"
```

### Restreindre à une adresse IP serveur :
```bash
--allowed-server "192.168.1.50"
```

### Définir une date d'expiration (ex: démo ou contrat limité) :
```bash
--expire-in "365d"
```

---

## Étape 4 : Transfert et Finalisation du Déploiement

1. Transférez **uniquement** le contenu du dossier généré (`votre_projet_encode/`) sur le serveur du client via SSH, SFTP ou Rsync.
2. Créez et configurez le fichier `.env` du serveur avec les identifiants de base de données du client.
3. Appliquez les permissions requises sur les dossiers de stockage Laravel :
   ```bash
   sudo chown -R www-data:www-data /var/www/votre-projet
   sudo chmod -R 775 /var/www/votre-projet/storage /var/www/votre-projet/bootstrap/cache
   ```

---

## Résultat Obtenu et Sécurité

* **Fonctionnement transparent :** L'application fonctionne normalement pour les utilisateurs finaux via leur navigateur.
* **Protection du Code :** Si le client ou son administrateur système ouvre un fichier dans `app/Http/Controllers/`, `app/Models/` ou `routes/`, il ne trouvera qu'un bloc binaire chiffré et illisible.
* **Anti-Duplication :** Si les options de licence ont été activées (domaine, IP, date), le projet refusera de démarrer s'il est copié sur un autre serveur.
