Format : Symptôme → Cause → Fix → Leçon.
WebSocket connection to 'wss://egw.aadw.lu/egroupware/push' failed (reconnexion toutes les 16 s).push (swoole, port 9501) + une location nginx /egroupware/push. Ce montage (FPM+nginx, fait avant l'arrivée du push) n'avait NI le service push NI la location nginx → wss://…/push → 404. (Forcer push_backend=fallback en base ne suffit pas : le client 26.x tente le WS quoi qu'il arrive.)push au docker-compose.override.yml (image: phpswoole/swoole:latest-alpine, command: ["/usr/share/egroupware/swoolepush/server.php"], volumes egw-sources:/usr/share/egroupware:ro, ./sessions, ./push-config) ; (2) ajouter la location /egroupware/push dans nginx.conf (proxy_pass http://push:9501; + headers Upgrade/Connection, modèle = /usr/share/egroupware/doc/docker/nginx.conf) ; (3) docker compose up -d + RESTART nginx (pas juste reload — sinon l'upstream push n'est pas pris) ; (4) retirer le push_backend=fallback de egw_config + docker restart egroupware. Vérif : curl du handshake WS doit donner 401 (push server demande le bearer token) au lieu de 404 → le vrai client (qui a le token de /var/lib/egroupware-push/config.inc.php) obtient 101.Legacy widget … could not handle adding a child (ET2-*), Deprecated widget.options, Had to skip a hidden popup = bruit interne eGroupware 26.x (migration et2→web-components Lit), cosmétiques, sans impact, non corrigeables → ignorer./push (la conf officielle est dans doc/docker/nginx.conf de l'image). Après modif de nginx.conf, restart nginx si l'upstream vient d'être créé.Invalid SQL: REPLACE INTO egw_cal_user (…) … Field 'cal_user_modified' doesn't have a default value (1364).STRICT_TRANS_TABLES, défaut de l'image mariadb:11.8 post-migration VPS). eGroupware fait un REPLACE qui omet cal_user_modified (datetime NOT NULL sans défaut) → le strict refuse. eGroupware ne supporte pas le mode strict.sql_mode. Permanent via le compose du service egroupware-db : command: --sql-mode=NO_ENGINE_SUBSTITUTION puis docker compose up -d egroupware-db. Immédiat (avant recreate) : SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION'; (+ docker restart egroupware si connexions FPM persistantes).sync.log./etc/config/crontab mais pas chargée dans la crontab active (crond tourne sur /tmp/cron/crontabs, volatile).crontab /etc/config/crontab + /etc/init.d/crond.sh restart. Persistance = autorun.sh sur le DOM (/dev/sdk6) + setcfg Misc Autorun TRUE. Validé : survit reboot et MAJ firmware./etc/config/crontab ne suffit pas → recharger + autorun.sh. /tmp/dom disparaît à chaque reboot (/tmp volatile) → mkdir -p avant de monter le DOM.https://localhost:9443.frontend_next) compilé avec l'override docker-compose.public.yml → NEXT_PUBLIC_API_BASE gravé sur https://aatools.aadw.lu:3443/api (mort).scripts/rebuild-frontend-dev.ps1 (→ https://localhost:9443/api) + Ctrl+F5.-f docker-compose.public.yml ; un build statique à API base absolue ne sert qu'UN host ; un restart ne suffit pas (volume persiste le build).*.bak/*.sql/*.old dans Caddy + régénérer les salts WordPress./root/).systemctl restart caddy.dig +short AAAA <nom>).:9443 : l'URL/port public est codé en dur dans 2 endroits — aadw_sogo_proxy/nginx.conf ET le template /srv/etc/apache-SOGo.conf (x-webobjects-server-url/port). Mettre les deux sur https://mail.projets.aadw.lu / 443.fonts (partiel) masque le contenu de l'image → recopier les polices de l'image vers l'hôte.sed -i : sed -i fait un rename → « Resource busy »/inode figé → éditer via conteneur jetable montant le DOSSIER + restart.Resolve-DnsName <nom> -Server <ip_resolveur>.admin.aadw.lu redirige bien vers le portail en navigation privée, mais renvoie 401 en navigateur standard (GET / 401, favicon 401).Authorization: Basic (mémorisé comme « mot de passe » du site pendant l'ère basic_auth) → Authelia tente une auth Basic, échoue → 401 (au lieu de rediriger). Vider cache/cookies ne suffit PAS (c'est un mot de passe enregistré).admin.aadw.lu dans le gestionnaire de mots de passe (chrome://password-manager/passwords + extensions Bitwarden/LastPass…).Authorization par Caddy AVANT Authelia. ⚠️ request_header -Authorization seul ne marche pas : Caddy exécute forward_auth avant request_header (ordre des directives). → envelopper dans un bloc route { } pour forcer l'ordre : route { request_header -Authorization ; import authelia ; root/file_server ou reverse_proxy }.curl -sI -u x:x https://admin.aadw.lu doit renvoyer 302 (redirect portail) et non 401.route quand l'ordre compte (ex. manipuler la requête avant forward_auth/reverse_proxy).caddy validate → Error: File to import not found: <nom>, at Caddyfile:NN.(<nom>) { … } doit être défini AVANT d'être utilisé → en pratique en haut du Caddyfile (avec (sec)). S'il est ajouté en bas (après un vhost qui fait import <nom>), Caddy croit que c'est un fichier à importer.(sec). (Le caddy validate échouant, le reload ne s'exécute pas → pas de coupure, l'ancienne conf reste active.)sqlite3 → utiliser PostgreSQL (mini conteneur alpine).