16 KiB
Notes de session EduBox - 17 juin 2026
✅ Ce qui fonctionne
- Agent EduBox v0.2.7 déployé avec binaires Linux/Mac/Windows.
- Connexion WordPress via URL publique fonctionne (wp-admin inclus).
- Proxy Next.js gère correctement les POST (duplex: half), les cookies, les headers X-Forwarded.
- Certificats TLS on-demand Caddy fonctionnent pour les sous-domaines d'instances.
- Reset d'instance corrige : le serveur envoie maintenant le
ComposeConfigcomplet. PUBLIC_DOMAINinclut le sous-domaine de l'instance (<id>.<domain>).
⚠️ Problème en cours : PrestaShop
L'installation automatique de PrestaShop 8.1 se termine avec succès, mais l'accès via l'URL publique ou localhost provoque des redirections incorrectes :
curl -I http://localhost:8080retourne302 Location: http://cmqiiso9g0001mfap4wv7a690.alfrednobel.edudeploy.com/curl -I https://cmqiiso9g0001mfap4wv7a690.alfrednobel.edudeploy.com/retourne302vers la même URL (boucle infinie).curl -I https://cmqiiso9g0001mfap4wv7a690.alfrednobel.edudeploy.com/index.phpretourne200 OK.
Hypothèses / pistes
- PrestaShop stocke le domaine shop en base (
ps_configuration:PS_SHOP_DOMAIN,PS_SHOP_DOMAIN_SSL).- Avec
PS_ENABLE_SSL=1, il est configuré avec l'URL publique en HTTPS. - Quand on accède via
localhost, il redirige vers l'URL publique.
- Avec
- L'accès à
/redirige vers l'URL canonique, ce qui crée une boucle via le proxy. - Il faudrait un équivalent PrestaShop du mu-plugin WordPress pour forcer le domaine à la volée selon
HTTP_HOST.
Template PrestaShop actuel (seed.ts)
DB_SERVER: db
DB_PORT: 3306
DB_NAME: prestashop
DB_USER: prestashop
DB_PASSWD: prestashop
DB_PREFIX: ps_
PS_DOMAIN: {PUBLIC_DOMAIN}
PS_SHOP_NAME: PrestaShop 8.1 vierge
PS_INSTALL_AUTO: "1"
PS_INSTALL_DB: "0"
PS_ENABLE_SSL: "1"
PS_LANGUAGE: fr
PS_COUNTRY: fr
ADMIN_MAIL: admin@edubox.local
ADMIN_PASSWD: EduboxPrestashop2024!
PS_FOLDER_ADMIN: admin
PS_FOLDER_INSTALL: install
PS_DEV_MODE: "1"
🚀 Prochaines étapes suggérées
- Option rapide : accepter que l'accès étudiant se fasse via l'URL publique. Vérifier que
https://<id>.alfrednobel.edudeploy.com/index.phpfonctionne et que la boutique est utilisable. - Option propre : développer un module/override PrestaShop qui :
- Détecte
HTTP_HOST/X-Forwarded-Host. - Met à jour
PS_SHOP_DOMAINetPS_SHOP_DOMAIN_SSLdynamiquement. - Permet l'accès via localhost ET via l'URL publique.
- Détecte
- Alternative : installer PrestaShop avec
PS_DOMAIN=localhost:8080et laisser le proxy réécrire les URLs (mais c'est complexe).
📁 Instance de test actuelle
- ID :
cmqiiso9g0001mfap4wv7a690 - Type : PrestaShop 8.1 vierge
- Port : 8080
- Nœud : OMEGA-GAMER (PC étudiant de Yacine)
📝 Commits récents
5c4c9f3fix(server/api): envoi du ComposeConfig lors d'un reset d'instance2d57857fix(server/api): PUBLIC_DOMAIN inclut le sous-domaine de l'instance2b31ec7fix(seed): PrestaShop installé avec SSL et sans dynamic domain
🔧 Commandes utiles pour reprendre
Sur le serveur :
cd /opt/edubox
docker logs edubox-server --tail 50
docker exec edubox-server sh -c "cd /app && npx prisma db seed"
Sur le PC étudiant (PowerShell) :
podman ps --format "table {{.Names}}`t{{.Status}}`t{{.Ports}}"
podman logs -f cmqiiso9g0001mfap4wv7a690-app-1
🔧 Correctif PrestaShop - 18 juin 2026
Principe
Un override Configuration.php est monté dans /var/www/html/override/classes/Configuration.php.
Il surcharge Configuration::get() pour retourner dynamiquement :
PS_SHOP_DOMAIN/PS_SHOP_DOMAIN_SSL= host de la requête (localhost:8080 ou sous-domaine public)PS_SSL_ENABLED= 0 quand la requête n'est pas HTTPS, pour éviter les redirections infinies en local
L'override truste aussi les headers X-Forwarded-Proto, X-Forwarded-Host et X-Forwarded-Port envoyés par le proxy Next.js.
Fichiers modifiés
agent/psplugins/Configuration.php(nouveau)agent/prestashop.go(nouveau : écriture de l'override)agent/docker.go(substitution du placeholder{PS_OVERRIDES_DIR})agent/build.sh(version 0.2.8)server/prisma/seed.ts(montage du volume pour les templates PrestaShop)server/app/dashboard/download/page.tsx(version Windows 0.2.8)
Déploiement effectué
- Image serveur rebuildée et redémarrée (
docker compose up -d --build server) - Seed relancé :
docker exec edubox-server sh -c "cd /app && npx prisma db seed" - Binaire agent Windows v0.2.8 généré :
agent/edubox-agent-v0.2.8.exeet copié dansserver/public/
Prochaines actions manuelles
Sur le PC étudiant (OMEYA-GAMER) :
- Arrêter l'agent v0.2.7 en cours.
- Télécharger le nouvel agent v0.2.8 (dashboard → Téléchargements ou URL
/edubox-agent-v0.2.8.exe). - Lancer le nouvel agent.
- Depuis le dashboard, réinitialiser l'instance
cmqiiso9g0001mfap4wv7a690(le reset recrée les volumes et applique l'override dès l'installation). - Tester :
curl -I http://localhost:8080→200 OKcurl -I https://cmqiiso9g0001mfap4wv7a690.alfrednobel.edudeploy.com/→200 OK
Problème découvert lors du test
La nouvelle instance PrestaShop (cmqjtdige0001gtw95e7cyr3p) s'ouvrait bien en URL publique, mais localhost:8089 redirigeait toujours vers le domaine public.
Cause : l'image PrestaShop embarque un class_index.php pré-généré qui ne connaît pas notre override override/classes/Configuration.php. L'autoloader utilise donc la classe Configuration originale, et Configuration::get('PS_SHOP_DOMAIN_SSL') retourne la valeur figée en base.
Solution : vider les caches app/cache/* et var/cache/* après le démarrage du conteneur.
Fichiers ajoutés/modifiés (suite)
agent/prestashop.go: ajout declearPrestaShopCache()pour effacer les caches après chaquestart/resetd'une instance PrestaShopagent/websocket.go: appel declearPrestaShopCache()quandmsg.Type == "prestashop"- Rebuild du binaire Windows v0.2.8 avec ce fix
Action requise maintenant
Sur le PC étudiant :
- Télécharger à nouveau l'agent v0.2.8 (le fichier a été regénéré avec le nettoyage de cache).
- Lancer le nouvel agent.
- Supprimer/réinitialiser l'instance PrestaShop en cours pour forcer une installation fraîche avec l'agent corrigé.
- Tester :
Les deux doivent retourner
curl -I http://localhost:<PORT> curl -I https://<id>.alfrednobel.edudeploy.com/200 OK.
Problème suivant : l'override n'est toujours pas chargé
Même après suppression des caches, Configuration::get('PS_SHOP_DOMAIN_SSL') retourne le domaine public. L'override override/classes/Configuration.php est bien présent, mais PrestaShop 8 utilise l'autoloader namespacé PrestaShop\Autoload\PrestashopAutoload. L'appel à l'ancien PrestaShopAutoload::generateIndex() ne met pas à jour l'index actif.
Solution : appeler PrestaShop\Autoload\PrestashopAutoload::getInstance()->generateIndex() depuis l'agent après le démarrage d'une instance PrestaShop.
Fichiers ajoutés/modifiés (suite)
agent/prestashop.go:clearPrestaShopCache()supprime les caches et régénère l'index via l'autoloader namespacéagent/websocket.go: appel declearPrestaShopCache()pour les instances PrestaShop- Rebuild du binaire Windows v0.2.8
Action requise maintenant
Sur le PC étudiant :
- Télécharger à nouveau l'agent v0.2.8 (regénéré avec le fix d'index).
- Lancer le nouvel agent.
- Supprimer/réinitialiser l'instance PrestaShop pour qu'elle soit recréée avec l'agent corrigé.
- Tester :
curl -I http://localhost:<PORT> curl -I https://<id>.alfrednobel.edudeploy.com/
Test immédiat sur l'instance actuelle
Sans réinstaller, on peut forcer la régénération de l'index dans le conteneur :
podman exec cmqjtdige0001gtw95e7cyr3p-app-1 php -r "require '/var/www/html/config/config.inc.php'; PrestaShop\Autoload\PrestashopAutoload::getInstance()->generateIndex();"
Puis vérifier :
podman exec cmqjtdige0001gtw95e7cyr3p-app-1 php -r "require '/var/www/html/config/config.inc.php'; echo Configuration::get('PS_SHOP_DOMAIN_SSL').PHP_EOL;"
Le résultat doit être localhost:8089 au lieu du domaine public.
Commits à faire
feat(agent): override PrestaShop dynamique pour HTTP_HOSTfix(agent): régénère l'index PrestaShop pour charger l'overridefix(server/seed): monte l'override PrestaShop dans les templateschore(agent): bump v0.2.8
✅ Fix final - 18 juin 2026
Problème réel identifié
curl -I https://<id>.alfrednobel.edudeploy.com/ retournait 200 (HEAD n'est pas redirigé), mais un GET dans le navigateur provoquait une boucle ERR_TOO_MANY_REDIRECTS.
Cause : PrestaShop reçoit les requêtes publiques en HTTP via le proxy Next.js (upstream = http://<tailscale-ip>:<port>). Il ne truste pas le header X-Forwarded-Proto: https, donc Tools::usingSecureMode() retourne false. La redirection canonique/compare la requête http://domaine/ avec l'URL canonique https://domaine/, ce qui crée une boucle HTTPS ↔ HTTP.
Solution retenue
Monter une configuration Apache dans le conteneur PrestaShop qui définit HTTPS=on quand X-Forwarded-Proto vaut https :
SetEnvIf X-Forwarded-Proto https HTTPS=on
SetEnvIf X-Forwarded-Proto https SERVER_PORT=443
Fichiers modifiés
agent/apache/proxy.conf(nouveau)agent/prestashop.go(nouveau : écrit la config Apache dans le dossier données de l'agent)agent/docker.go: substitution du placeholder{PS_APACHE_CONF_DIR}server/prisma/seed.ts: les templates PrestaShop montentproxy.confdans/etc/apache2/conf-enabled/edubox-proxy.confagent/build.sh: version 0.2.8server/app/dashboard/download/page.tsx: version Windows 0.2.8
Déploiement effectué
- Image serveur rebuildée et redémarrée
- Seed relancé
- Binaire agent Windows v0.2.8 regénéré et copié dans
server/public/
Action requise sur le PC étudiant
- Télécharger l'agent v0.2.8 propre :
Invoke-WebRequest -Uri "https://alfrednobel.edudeploy.com/edubox-agent-v0.2.8.exe" -OutFile "edubox-agent.exe" - Arrêter l'agent précédent et lancer celui-ci.
- Supprimer ou réinitialiser l'instance PrestaShop depuis le dashboard pour qu'elle soit recréée avec la config Apache montée.
- Tester dans le navigateur :
https://<id>.alfrednobel.edudeploy.com/doit s'ouvrir sansERR_TOO_MANY_REDIRECTS
État final
- Accès étudiant/professeur via l'URL publique.
localhost:<PORT>redirige toujours vers l'URL publique (comportement PrestaShop normal), mais ce n'est pas bloquant.- Linux/Mac seront ajoutés plus tard quand Windows sera stable.
Commits à faire
fix(agent): ajoute la conf Apache PrestaShop pour trust X-Forwarded-Protofix(server/seed): monte la conf Apache dans les templates PrestaShopchore(agent): bump v0.2.8
✅ Fix final - 18 juin 2026 (v2)
Analyse
- J'ai lu le code source de PrestaShop 8.1 directement dans l'image Docker (
/var/www/html/classes/Tools.php). Tools::usingSecureMode()truste bienHTTP_X_FORWARDED_PROTO: https.- J'ai testé localement avec notre config Apache montée : PHP reçoit bien
X-Forwarded-ProtoetHTTPS=on. - Conclusion : la boucle ne vient pas d'un défaut de PrestaShop sur la détection HTTPS en lui-même. Elle vient du fait que, dans la vraie chaîne proxy, PrestaShop est installé avec
PS_ENABLE_SSL=1, ce qui fige le protocole canonique enhttps://. La moindre incohérence entre ce qui est reçu (HTTP interne) et ce qui est attendu (HTTPS canonique) déclenche une redirection canonique, et le navigateur retombe sur la même URL → boucle infinie. - PrestaShop 9 (branche
develop) a exactement la même logiqueusingSecureMode(), donc le même problème se produirait avec le même setup.
Solution retenue
Ne plus se battre avec les headers : on installe PrestaShop avec PS_ENABLE_SSL: "0". Le conteneur vit en HTTP interne, le proxy public reste en HTTPS, et le proxy Next.js réécrit les liens http://<public-domain> en https://<public-domain>.
C'est le même principe que WordPress (HTTP interne + réécriture publique), sans avoir besoin d'override/module PrestaShop.
Fichiers modifiés
server/prisma/seed.ts:PS_ENABLE_SSL: "0"pour les templates PrestaShop.- Suppression du montage inutile
{PS_APACHE_CONF_DIR}/proxy.conf.
server/app/api/proxy/[[...path]]/route.ts:- Ajout de
http://${cleanHost}dans la réécriture des headers. - Ajout de
http://${cleanHost}et//${cleanHost}dans la réécriture du body.
- Ajout de
Déploiement effectué
- Image serveur rebuildée et redémarrée.
- Seed relancé (
npx prisma db seed).
Action requise sur le PC étudiant
- L'agent v0.2.8 actuel peut être conservé (aucune modification agent nécessaire).
- Depuis le dashboard, supprimer ou réinitialiser l'instance PrestaShop en cours. Cela force une réinstallation fraîche avec
PS_ENABLE_SSL=0et sans le montage Apache. - Tester dans le navigateur :
https://<id>.alfrednobel.edudeploy.com/doit s'ouvrir sansERR_TOO_MANY_REDIRECTS.- L'accès
localhost:<PORT>redirigera probablement vers l'URL publique (comportement PrestaShop normal quandPS_DOMAINest le domaine public), mais ce n'est pas bloquant.
Commits à faire
fix(server/seed): installe PrestaShop avec SSL désactivéfix(server/proxy): réécrit les liens http://<public-domain> en httpschore(notes): documente le fix final PrestaShop
❌ Fix final - 18 juin 2026 (v2) : échec
Test utilisateur
Après déploiement du serveur et réinitialisation de l'instance PrestaShop, l'URL publique retourne toujours ERR_TOO_MANY_REDIRECTS.
L'utilisateur (Yacine) demande d'arrêter de tâtonner et de consigner l'échec proprement.
Hypothèses sur la cause persistante
Le fix PS_ENABLE_SSL=0 + réécriture proxy aurait dû fonctionner si PrestaShop générait des liens http://<public-domain> et que le proxy les réécrivait. Le fait que la boucle persiste suggère l'une de ces causes :
- Cache navigateur : le client a conservé une redirection 301/302 en cache, donnant l'impression que la boucle continue alors que le serveur a corrigé.
- PrestaShop génère quand même des redirections :
- Même avec
PS_ENABLE_SSL=0, PrestaShop peut rediriger/vers l'URL canonique (ex.index.php↔/). - Le
.htaccessgénéré par PrestaShop contient des règles de rewrite versindex.phpqui peuvent interagir avec le proxy.
- Même avec
- Le proxy ne réécrit pas le header
Location: le headerLocationpeut contenir une URL que le patternhttp://${cleanHost}ne capture pas (port explicite:80, encodage, ou//<domain>). - La réinstallation n'a pas réellement pris le nouveau
ComposeConfig: l'instance existante a peut-être conservé des données/volumes, ou l'agent n'a pas reçu le nouveau template. - Caddy redirige HTTP → HTTPS en amont : si PrestaShop renvoie un
Location: http://<public-domain>/, Caddy le re-rewrites enhttps://, mais PrestaShop continue d'émettre la redirectionhttp://→ boucle.
Ce qu'il faudrait vérifier calmement (plus tard)
- Vider le cache navigateur / tester en navigation privée.
- Vérifier dans le conteneur que
PS_ENABLE_SSLvaut bien0en base :podman exec <id>-app-1 mysql -h db -u root -prootpassword prestashop -e "SELECT name, value FROM ps_configuration WHERE name LIKE 'PS_SSL%';" - Vérifier le contenu du
.htaccessgénéré et chercher une règleRewriteRule ... [R]. - Faire un
curl -v -L --max-redirs 5 https://<id>.alfrednobel.edudeploy.com/pour voir la chaîne exacte desLocation.
Décision
On met PrestaShop de côté pour l'instant. WordPress fonctionne. On reprendra PrestaShop avec une investigation plus approfondie et méthodique quand l'utilisateur sera disponible.
Commits à faire (quand on reprendra)
- À déterminer après investigation.