Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d685c2211e | |||
| a400b7cc66 | |||
| ed5cfcd275 |
+13
-3
@@ -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
|
||||
|
||||
### Ajouté
|
||||
@@ -13,7 +23,7 @@ Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) — versionnag
|
||||
|
||||
### 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é.
|
||||
|
||||
---
|
||||
@@ -22,8 +32,8 @@ Format : [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) — versionnag
|
||||
|
||||
### 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.
|
||||
- **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.
|
||||
- **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.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -128,8 +128,6 @@ class SetupController extends Controller
|
||||
|
||||
$steps = [];
|
||||
$success = true;
|
||||
$php = $this->phpBinary();
|
||||
$artisan = $php . ' ' . escapeshellarg(base_path('artisan'));
|
||||
|
||||
// 1. Écriture du .env
|
||||
try {
|
||||
@@ -140,24 +138,44 @@ class SetupController extends Controller
|
||||
$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) {
|
||||
[$ok, $out] = $this->artisanRun($artisan, 'key:generate --force');
|
||||
$steps[] = ['ok' => $ok, 'label' => 'Génération de la clé de chiffrement (APP_KEY)', 'error' => $ok ? null : $out];
|
||||
if (! $ok) $success = false;
|
||||
try {
|
||||
$appKey = 'base64:' . base64_encode(random_bytes(32));
|
||||
$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
|
||||
// et appelle putenv('DB_CONNECTION=pgsql'). Les sous-processus exec() héritent
|
||||
// cet env OS. phpdotenv en mode immutable (défaut Laravel) refuse d'écraser une
|
||||
// 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.
|
||||
// putenv() écrase l'env OS hérité au boot (pgsql + TEMP_KEY) pour que tous les
|
||||
// sous-processus futurs (config:cache interne à optimize…) reçoivent les bonnes
|
||||
// valeurs. config() + DB::purge() reconfigure le processus courant en mémoire.
|
||||
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'
|
||||
? ['driver' => 'pgsql', 'host' => $dbData['host'], 'port' => (int) $dbData['port'],
|
||||
'database' => $dbData['database'], 'username' => $dbData['username'],
|
||||
@@ -169,8 +187,8 @@ class SetupController extends Controller
|
||||
'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true];
|
||||
|
||||
config([
|
||||
'database.default' => $dbData['driver'],
|
||||
"database.connections.{$dbData['driver']}" => $connConfig,
|
||||
'database.default' => $dbData['driver'],
|
||||
"database.connections.{$dbData['driver']}" => $connConfig,
|
||||
]);
|
||||
|
||||
DB::purge($dbData['driver']);
|
||||
@@ -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) {
|
||||
$this->artisanRun($artisan, 'optimize:clear');
|
||||
$this->artisanRun($artisan, 'optimize');
|
||||
Artisan::call('optimize:clear');
|
||||
}
|
||||
|
||||
// 7. Marquage installation
|
||||
|
||||
Reference in New Issue
Block a user