73b561ed33
- edubox-tools.patch : getShopDomain/Ssl conservent les ports non standards - edubox-configuration.patch : PS_SHOP_DOMAIN, _PS_BASE_URL_, PS_SSL_ENABLED… résolus dynamiquement - edubox-shop-getbaseurl.patch : Shop::getBaseURL() utilise le host de la requête - edubox-shopurl.patch : getMainShopDomain conserve les ports non standards - edubox-clear-cache-init.sh : vidage des caches à chaque démarrage - seed.ts : passage au tag 9-edubox-9 - README mis à jour avec les nouveaux patches
100 lines
5.5 KiB
Markdown
100 lines
5.5 KiB
Markdown
# EduBox PrestaShop 9 Image
|
||
|
||
Image Docker patchée basée sur `prestashop/prestashop:9`, conçue pour fonctionner
|
||
avec le reverse proxy dynamique d'EduBox.
|
||
|
||
## Pourquoi une image patchée ?
|
||
|
||
PrestaShop 9 (Apache 2.4 + PHP 8.5) a plusieurs problèmes majeurs derrière EduBox :
|
||
|
||
1. Les headers `X-Forwarded-*` sont corrompus par Apache/PHP : `$_SERVER` les
|
||
reçoit sous forme d'arrays au lieu de strings. On contourne ce bug via
|
||
`getenv()` dans `config/defines_custom.inc.php`.
|
||
2. PrestaShop utilise partout le domaine stocké en base (`ps_shop_url`) et la
|
||
configuration `PS_SSL_ENABLED`. Derrière EduBox, le domaine public change à
|
||
chaque instance (`<id>.alfrednobel.edudeploy.com`) et toutes les requêtes
|
||
publiques arrivent en HTTPS. Les patches forcent l'utilisation de l'hôte et
|
||
du protocole de la requête courante.
|
||
3. Les agents étudiants peuvent être hors ligne. Le pack de langue français est
|
||
donc embarqué dans l'image pour éviter tout téléchargement pendant
|
||
l'installation.
|
||
|
||
## Build local
|
||
|
||
```bash
|
||
cd /opt/edubox/prestashop-image
|
||
docker build -t edubox-prestashop:9 .
|
||
```
|
||
|
||
## Push sur le registry Gitea
|
||
|
||
```bash
|
||
docker tag edubox-prestashop:9 \
|
||
151.80.60.98:3001/yacine/edubox/edubox-prestashop:9-edubox-9
|
||
docker push \
|
||
151.80.60.98:3001/yacine/edubox/edubox-prestashop:9-edubox-9
|
||
```
|
||
|
||
## Patches appliqués
|
||
|
||
| Patch | Fichier modifié | Objectif |
|
||
|-------|-----------------|----------|
|
||
| `edubox-tools.patch` | `classes/Tools.php` | `getShopDomain()` / `getShopDomainSsl()` utilisent `getHttpHost()` dynamiquement en conservant les ports non standards (ex. `localhost:8088`) ; `.htaccess` généré sans condition `HTTP_HOST` (images/catégories). |
|
||
| `edubox-link.patch` | `classes/Link.php` | `getBaseLink()` et `getAdminBaseLink()` utilisent `usingSecureMode()` et `getHttpHost()`. |
|
||
| `edubox-frontcontroller.patch` | `classes/controller/FrontController.php` | Désactive `sslRedirection()` pour éviter les boucles HTTP/HTTPS. |
|
||
| `edubox-shop.patch` | `classes/shop/Shop.php` | `Shop::initialize()` utilise le shop par défaut sans redirection forcée. |
|
||
| `edubox-shopurl.patch` | `classes/shop/ShopUrl.php` | `getMainShopDomain()` / `getMainShopDomainSSL()` retournent le domaine de la requête en conservant les ports non standards. |
|
||
| `edubox-shop-getbaseurl.patch` | `classes/shop/Shop.php` | `Shop::getBaseURL()` utilise le host/port de la requête courante. |
|
||
| `edubox-shopcontext.patch` | `src/Core/Context/ShopContext.php` | `getBaseURL()` du BO est reconstruit à partir de la requête courante. |
|
||
| `edubox-configuration.patch` | `classes/Configuration.php` | `PS_SHOP_DOMAIN`, `PS_SHOP_DOMAIN_SSL`, `PS_SSL_ENABLED`, `_PS_BASE_URL_`, `_PS_BASE_URL_SSL_` sont résolus dynamiquement depuis la requête, pas depuis le cache DB. |
|
||
| `edubox-asseturl.patch` | `src/Adapter/Assets/AssetUrlGeneratorTrait.php` | Les assets CCC utilisent le protocole de la requête, pas `PS_SSL_ENABLED`. |
|
||
| `edubox-install.patch` | `src/PrestaShopBundle/Install/Install.php` | `finalize()` respecte `PS_FOLDER_ADMIN` (évite le bug overlayfs `admin` → `admin-edubox`). |
|
||
| `edubox-install-language.patch` | `src/PrestaShopBundle/Install/Install.php` | Évite le téléchargement du pack legacy `fr.gzip` quand le pack Symfony est embarqué. |
|
||
| `edubox-language.patch` | `classes/Language.php` | Utilise `_PS_TRANSLATIONS_DIR_` au runtime pour le cache langue ; évite le téléchargement réseau si le pack est présent. |
|
||
| `edubox-dashboard-warning.patch` | `controllers/admin/AdminDashboardController.php` | Désactive le bandeau d’avertissement "domaine différent de SEO & URL". |
|
||
| `edubox-docker-run.patch` | `/tmp/docker_run.sh` | Supprime un `install.lock` résiduel si une installation précédente a échoué. |
|
||
|
||
## Fichiers injectés
|
||
|
||
- `proxy.conf` : Apache truste `X-Forwarded-Proto: https` pour positionner
|
||
`HTTPS=on` dans l'environnement PHP. Active aussi `AllowOverride All` pour
|
||
que le `.htaccess` de PrestaShop fonctionne.
|
||
- `config/defines_custom.inc.php` : normalise `HTTP_X_FORWARDED_HOST`,
|
||
`HTTP_X_FORWARDED_PROTO` et `HTTP_HOST` corrompus ; définit
|
||
`PS_TRUSTED_PROXIES` pour Symfony.
|
||
- `translations-symfony-fr-FR.zip` → copié sous `sf-fr-FR.zip` dans
|
||
`/var/www/html/translations/` : pack de langue Symfony français embarqué
|
||
( PrestaShop attend le préfixe `sf-` ).
|
||
- `edubox-clear-cache-init.sh` → `/tmp/init-scripts/edubox-clear-cache.sh` :
|
||
vidage des caches Smarty/Symfony et des assets CCC à chaque démarrage du
|
||
conteneur, afin que les changements de domaine/port soient pris en compte.
|
||
|
||
## Utilisation dans EduBox
|
||
|
||
Le template PrestaShop 9 dans `server/prisma/seed.ts` utilise cette image :
|
||
|
||
```yaml
|
||
app:
|
||
image: 151.80.60.98:3001/yacine/edubox/edubox-prestashop:9-edubox-8
|
||
```
|
||
|
||
## Mise à jour vers une nouvelle version de PrestaShop
|
||
|
||
Si PrestaShop sort une version `9.x.y` :
|
||
|
||
1. Modifier le `FROM` du Dockerfile : `FROM prestashop/prestashop:9.x.y`
|
||
2. Relancer le build. Les patches qui échouent doivent être adaptés aux
|
||
nouvelles lignes/code de PrestaShop.
|
||
3. Re-tagger et pousser : `9.x.y-edubox-1`.
|
||
4. Mettre à jour `server/prisma/seed.ts` avec le nouveau tag.
|
||
|
||
## Déploiement sur les agents
|
||
|
||
L'image doit être accessible depuis chaque agent étudiant. Deux options :
|
||
|
||
1. **Registry privé** (recommandé) : tagger et pousser l'image sur un registry
|
||
(Docker Hub, registry Gitea, GHCR, etc.) puis mettre à jour
|
||
`server/prisma/seed.ts` avec le nom complet.
|
||
2. **Build manuel sur chaque agent** : copier ce dossier sur l'agent et lancer
|
||
`docker build` avant le premier déploiement.
|