3 Commits

Author SHA1 Message Date
yann64 d685c2211e CHANGELOG : correction des entrées 1.0.2 et 1.0.3 (correctifs partiels)
Les descriptions initiales présentaient ces versions comme des corrections
définitives alors qu'elles n'adressaient qu'une partie du problème.
Mention explicite du renvoi vers 1.0.4 pour le correctif complet.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 07:20:32 +02:00
yann64 a400b7cc66 Release 1.0.4 — changelog + bump version dev 1.0.5
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 07:17:51 +02:00
yann64 ed5cfcd275 Fix wizard : suppression totale des sous-processus exec() dans install()
- APP_KEY : généré directement en PHP (random_bytes) + écrit dans .env + propagé
  via config() et putenv() → évite le bug de pattern-matching de key:generate
  (la clé en mémoire ≠ clé dans le .env réécrit par writeEnv)
- DB_* + APP_KEY : putenv() écrase l'env OS hérité au boot (pgsql/temp-key) pour
  que tout sous-processus futur hérite des bonnes valeurs
- optimize supprimé de l'installation : config:cache re-boostrappe l'app via
  bootstrap/app.php dans un contexte où l'Encrypter peut lever MissingAppKeyException ;
  optimize:clear seul suffit — Laravel reconstruit ses caches à la première requête
- key:generate converti en Artisan::call() puis remplacé par génération PHP directe

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 07:17:32 +02:00
3 changed files with 56 additions and 24 deletions
+13 -3
View File
@@ -5,6 +5,16 @@ Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) — versionnag
--- ---
## [1.0.4] — 2026-06-05
### Corrigé
- **Assistant d'installation — APP_KEY vide après installation** : `key:generate` remplace `APP_KEY=<clé_en_mémoire>` par regex dans le `.env`. Mais `writeEnv()` écrit `APP_KEY=` (vide) alors que la clé en mémoire est celle de l'auto-création (clé temporaire) — le pattern ne matche pas, la clé reste vide. Correction : la clé est générée directement en PHP (`random_bytes`), écrite dans le `.env` sans regex, puis propagée en mémoire (`config(['app.key'])`) et dans l'env OS (`putenv`).
- **Assistant d'installation — `MissingAppKeyException` lors de l'optimisation** : `optimize` appelle en interne `config:cache`, qui re-boostrappe une seconde instance de l'application depuis `bootstrap/app.php`. Ce second boot passe par tous les ServiceProviders et peut résoudre l'Encrypter avant que la clé soit accessible, levant `MissingAppKeyException` et renvoyant une erreur 500. Correction : `optimize` est supprimé de la procédure d'installation ; seul `optimize:clear` est conservé pour purger tout cache résiduel. Laravel reconstruit ses caches paresseusement à la première requête.
- **Assistant d'installation — connexion PostgreSQL forcée après login (MySQL)** : `putenv()` n'était appelé que pour les variables `DB_*` mais pas pour `APP_KEY`. Correction : tous les `putenv()` (dont `APP_KEY`) sont regroupés en un bloc cohérent, garantissant que tout sous-processus futur hérite des valeurs correctes.
---
## [1.0.3] — 2026-06-04 ## [1.0.3] — 2026-06-04
### Ajouté ### Ajouté
@@ -13,7 +23,7 @@ Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) — versionnag
### Corrigé ### Corrigé
- **Assistant d'installation — conflit pgsql/mysql (cause racine)** : lors d'un démarrage sur serveur vierge, `public/index.php` auto-crée un `.env` depuis `.env.example` (driver `pgsql`) et Laravel charge cet env via `putenv()` au niveau OS. Les sous-processus `exec()` héritent cet env ; `phpdotenv` en mode immutable refuse d'écraser une variable déjà présente dans l'env OS → le `.env` réécrit avec `DB_CONNECTION=mysql` par le wizard était ignoré par le subprocess de migration, qui tentait une connexion PostgreSQL. Correction : les migrations sont maintenant exécutées via `Artisan::call()` dans le processus courant, après reconfiguration explicite en mémoire (`config(['database.default' => ...]`) + `DB::purge()` — aucun héritage d'env parasite. - **Assistant d'installation — conflit pgsql/mysql (correctif partiel, voir 1.0.4)** : identification de la cause racine (`phpdotenv` immutable + héritage `putenv` par les sous-processus `exec()`). Les migrations sont migrées vers `Artisan::call()` avec reconfiguration en mémoire (`config()` + `DB::purge()`), mais `key:generate` et `optimize` restaient des sous-processus — corrigé complètement en 1.0.4.
- **`.htaccess`** — suppression des directives `php_flag display_errors on` ajoutées temporairement pour déboguer l'erreur 500 sur hébergement mutualisé. - **`.htaccess`** — suppression des directives `php_flag display_errors on` ajoutées temporairement pour déboguer l'erreur 500 sur hébergement mutualisé.
--- ---
@@ -22,8 +32,8 @@ Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) — versionnag
### Corrigé ### Corrigé
- **Assistant d'installation — conflit de connexion pgsql/mysql** : un fichier `bootstrap/cache/config.php` résiduel (produit par `php artisan optimize` sur le poste de développement) était lu en priorité sur le `.env` réécrit par le wizard, forçant une connexion PostgreSQL même quand MySQL était sélectionné. Un appel à `config:clear` est maintenant effectué entre l'écriture du `.env` et l'exécution des migrations. - **Assistant d'installation — conflit de connexion pgsql/mysql** *(correctif partiel, voir 1.0.3 et 1.0.4)* : ajout d'un appel à `config:clear` entre l'écriture du `.env` et l'exécution des migrations, et exclusion de `bootstrap/cache/*.php` des archives de déploiement pour ne pas embarquer un cache de configuration de développement.
- **Archives de déploiement** : `bootstrap/cache/*.php` exclu du build rsync pour éviter qu'un cache de configuration de développement ne soit embarqué dans les distributables. - **Archives de déploiement** : `bootstrap/cache/*.php` exclu du build rsync.
--- ---
+1 -1
View File
@@ -1 +1 @@
1.0.4 1.0.5
+40 -18
View File
@@ -128,8 +128,6 @@ class SetupController extends Controller
$steps = []; $steps = [];
$success = true; $success = true;
$php = $this->phpBinary();
$artisan = $php . ' ' . escapeshellarg(base_path('artisan'));
// 1. Écriture du .env // 1. Écriture du .env
try { try {
@@ -140,24 +138,44 @@ class SetupController extends Controller
$success = false; $success = false;
} }
// 2. Génération de la clé APP_KEY // 2. Génération de la clé APP_KEY — directement en PHP, sans passer par key:generate.
//
// Artisan key:generate remplace APP_KEY=<clé_en_mémoire> dans le .env grâce à un
// pattern regex. Mais writeEnv() vient d'écrire APP_KEY= (vide) alors qu'en mémoire
// la clé est celle de l'auto-création (TEMP_KEY) → le pattern ne matche pas → la
// clé reste vide dans le .env et la config:cache en hérite.
// Solution : générer la clé nous-mêmes, l'écrire directement dans le .env, et la
// propager en mémoire + env OS dès maintenant.
$appKey = null;
if ($success) { if ($success) {
[$ok, $out] = $this->artisanRun($artisan, 'key:generate --force'); try {
$steps[] = ['ok' => $ok, 'label' => 'Génération de la clé de chiffrement (APP_KEY)', 'error' => $ok ? null : $out]; $appKey = 'base64:' . base64_encode(random_bytes(32));
if (! $ok) $success = false; $envPath = base_path('.env');
$env = file_get_contents($envPath);
$env = preg_replace('/^APP_KEY=.*/m', 'APP_KEY=' . $appKey, $env);
file_put_contents($envPath, $env);
config(['app.key' => $appKey]);
$steps[] = ['ok' => true, 'label' => 'Génération de la clé de chiffrement (APP_KEY)'];
} catch (\Exception $e) {
$steps[] = ['ok' => false, 'label' => 'Génération de la clé de chiffrement (APP_KEY)', 'error' => $e->getMessage()];
$success = false;
}
} }
// 2b. Reconfiguration de la connexion BDD dans le processus courant. // 2b. Reconfiguration de la connexion BDD processus courant ET sous-processus.
// //
// Problème : public/index.php charge le .env auto-créé (pgsql) au premier boot // putenv() écrase l'env OS hérité au boot (pgsql + TEMP_KEY) pour que tous les
// et appelle putenv('DB_CONNECTION=pgsql'). Les sous-processus exec() héritent // sous-processus futurs (config:cache interne à optimize…) reçoivent les bonnes
// cet env OS. phpdotenv en mode immutable (défaut Laravel) refuse d'écraser une // valeurs. config() + DB::purge() reconfigure le processus courant en mémoire.
// variable déjà présente dans l'env → le nouveau .env (mysql) est ignoré par le
// subprocess de migration qui continue à tenter une connexion pgsql.
//
// Solution : exécuter les migrations via Artisan::call() dans le processus courant
// après avoir écrasé la config BDD en mémoire — pas de subprocess, pas d'héritage.
if ($success) { if ($success) {
putenv("APP_KEY={$appKey}");
putenv("DB_CONNECTION={$dbData['driver']}");
putenv("DB_HOST={$dbData['host']}");
putenv("DB_PORT={$dbData['port']}");
putenv("DB_DATABASE={$dbData['database']}");
putenv("DB_USERNAME={$dbData['username']}");
putenv('DB_PASSWORD=' . ($dbData['password'] ?? ''));
$connConfig = $dbData['driver'] === 'pgsql' $connConfig = $dbData['driver'] === 'pgsql'
? ['driver' => 'pgsql', 'host' => $dbData['host'], 'port' => (int) $dbData['port'], ? ['driver' => 'pgsql', 'host' => $dbData['host'], 'port' => (int) $dbData['port'],
'database' => $dbData['database'], 'username' => $dbData['username'], 'database' => $dbData['database'], 'username' => $dbData['username'],
@@ -214,10 +232,14 @@ class SetupController extends Controller
} }
} }
// 6. Optimisation des caches // 6. Nettoyage des caches
// optimize:clear supprime tout cache résiduel (config, routes, vues, events).
// On n'appelle PAS optimize : config:cache re-boostrappe l'app depuis bootstrap/app.php
// dans un contexte qui peut ne pas avoir accès à notre APP_KEY via putenv, ce qui
// provoque MissingAppKeyException. Laravel reconstruit ses caches à la première
// requête — pas besoin de les préchauffer pendant l'installation.
if ($success) { if ($success) {
$this->artisanRun($artisan, 'optimize:clear'); Artisan::call('optimize:clear');
$this->artisanRun($artisan, 'optimize');
} }
// 7. Marquage installation // 7. Marquage installation