Nginx SSO - erreur 500 / 404 post migration

What type of hardware are you using: VPS bought online
What YunoHost version are you running: 12.0.11
How are you able to access your server: The webadmin
SSH

Describe your issue

Salut,

J’ai tenté la migration 11-> 12 sur mon serveur principal.

J’ai le même soucis qui avait cassé le secondaire : erreur 500 puis 404 sur le portail utilisateur après reboot du serveur.

Pré-migration :

  • Système à jour
  • Switch d’un theme custom vers le theme “default”

Post-migration :

  • mise à jour du système
  • mise à jour des apps
  • Regen-conf

=> Erreur 500

  • Parsing des topics sur le forum.

Reboot

  • Regen-conf :

=> Erreur 500 sur le portail utilisateur

Remise du theme custom dans /etc/ssowat/conf.json.persistent :

=> Erreur 404 sur le portail utilisateur

Diagnostic :

  • Services running
  • Pas d’erreur remontées via le diagnostic Yunohost
  • Accès en SSH
  • Accès à la Webmin

=> Consultation des logs nginx :

serveur.noho.st-access.log :

xxx.xxx.xxx.xxx - - [24/Feb/2025:13:50:54 +0100] "GET /yunohost/sso/ HTTP/2.0" 404 146 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"
xxx.xxx.xxx.xxx - - [24/Feb/2025:13:50:54 +0100] "GET /favicon.ico HTTP/2.0" 302 138 "https://serveur.noho.st/yunohost/sso/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"
xxx.xxx.xxx.xxx - - [24/Feb/2025:13:50:54 +0100] "GET /yunohost/sso?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC9mYXZpY29uLmljbw== HTTP/2.0" 301 162 "https://serveur.noho.st/yunohost/sso/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"
xxx.xxx.xxx.xxx - - [24/Feb/2025:13:50:54 +0100] "GET /yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC9mYXZpY29uLmljbw== HTTP/2.0" 404 146 "https://serveur.noho.st/yunohost/sso/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"

serveur.noho.st-error.log :

2025/02/24 13:55:21 [error] 1292#1292: *668 "/usr/share/nginx/html/yunohost/sso/index.html" is not found (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/ HTTP/2.0", host: "serveur.noho.st"
2025/02/24 13:55:22 [error] 1292#1292: *668 "/usr/share/nginx/html/yunohost/sso/index.html" is not found (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC9mYXZpY29uLmljbw== HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"

Manifestement il manque un directory :

-bash: cd: /usr/share/nginx/html/yunohost: No such file or directory

Si je cherche cet index.html, il ne semble exister que pour la webmin :

# locate index.html | grep yunohost
/usr/share/yunohost/admin/index.html

=> Y a-t-il un moyen de re-générer le thème par défaut ?

Share relevant logs or error messages

N/A

Edit : L’erreur 404 est due à mon theme custom.

En commentant la ligne dans /etc/ssowat/conf.json.persistent j’ai bien une erreur 500.

Up

J’ai récupéré le SSO en créant le folder /usr/share/nginx/html/yunohost/sso/ et en copiant dedans le contenu du folder /usr/share/yunohost/portal

EDIT : L’usage d’un SYMLINK est peut-être plus indiqué que la copie du folder ?

J’ai cependant perdu le logo des apps (carré vide au lieu d’avoir les tuiles de diverses couleurs) et mon thème custom :

BTW la page de documentation Customize the appearance of the user portal | Yunohost Documentation semble obsolète : le setting ssowat.panel_overlay.enabled n’est plus listé.

Hmmokay je me dis que c’est peut-être la conf nginx qui n’est pas à jour,

est-ce que yunohost tools regen-conf nginx --dry-run montre des trucs modifiés manuellement ?

Salut Aleks,

J’ai supprimé le dossier /etc/yunohost/hooks.davant de faire un regen-conf, puis j’ai rétabli les hooks.

Il semble que ça soit un hook de tri geoip qui pose soucis (my bad, je l’avais oublié, hook basé sur Tuto: Bloquer les requêtes selon le pays ) :

nginx:
  applied:
    /etc/nginx/conf.d/country.conf:
      diff: @@ -0,0 +1,17 @@
+# GeoIP databases
+geoip_country /usr/share/GeoIP/GeoIP.dat;
+
+map $geoip_country_code $allowed_country {
+  default no;
+  # France
+  FR yes;
+  CH yes;
+  # Italie
+  #IT yes;
+}
+
+geo $lan-ip {
+  default no;
+  xxx.xxx.xxx.0/24 yes;
+  127.0.0.1 yes;
+}
      status: created
    /etc/nginx/conf.d/security.conf.inc:
      diff: @@ -36,4 +36,26 @@

 # Disable gzip to protect against BREACH
 # Read https://trac.nginx.org/nginx/ticket/1720 (text/html cannot be disabled!)
-gzip off;+gzip off;
+
+# allow local ip
+if ($lan-ip = yes) {
+  set $allowed_country yes;
+}
+# block the country
+#if ($allowed_country = no) {
+#  return 444;
+#}
+
+#blocage sur certaines url uniquement
+location ~* /(sso) {
+ if ($allowed_country = no) {
+  return 444;
+ }
+}
+
+
+
+#Gestion des robots
+add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive, noimageindex, notranslate";
+
      status: updated
  pending:

Et effectivement j’ai alors ce type de lignes dans les logs :

2025/03/01 19:19:08 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/assets/njfUa8RF.js" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/assets/njfUa8RF.js HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC8="
2025/03/01 19:19:08 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/assets/C6Vd-mzK.js" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/assets/C6Vd-mzK.js HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC8="
2025/03/01 19:19:19 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/applogos/dbaa0699e4c2817dafab3c884bfc273bc8b75fd8c11fb8f40828173aa8015181.png" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/applogos/dbaa0699e4c2817dafab3c884bfc273bc8b75fd8c11fb8f40828173aa8015181.png HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"
2025/03/01 19:19:19 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/applogos/b6096cee04f755063881d4e156013417af07a6aac93b06ce87229c0690486f57.png" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/applogos/b6096cee04f755063881d4e156013417af07a6aac93b06ce87229c0690486f57.png HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"
2025/03/01 19:19:19 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/applogos/2f8bb76e13974d50a77c6bbd95f4b963e4c9c0ee63cc4ad4fd01e0f17dd84cc3.png" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/applogos/2f8bb76e13974d50a77c6bbd95f4b963e4c9c0ee63cc4ad4fd01e0f17dd84cc3.png HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"
2025/03/01 19:19:19 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/applogos/952f3e47af4f4fabab9773d55b78edc2dc9b5c1cfe656c0b62a295e9f78493d7.png" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/applogos/952f3e47af4f4fabab9773d55b78edc2dc9b5c1cfe656c0b62a295e9f78493d7.png HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"
2025/03/01 19:19:19 [error] 2631208#2631208: *10 open() "/usr/share/nginx/html/yunohost/sso/assets/CC--juWV.js" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/assets/CC--juWV.js HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"
2025/03/01 19:19:21 [error] 2631209#2631209: *94 open() "/usr/share/nginx/html/yunohost/sso/assets/DFvAvYwi.js" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: serveur.noho.st, request: "GET /yunohost/sso/assets/DFvAvYwi.js HTTP/2.0", host: "serveur.noho.st", referrer: "https://serveur.noho.st/yunohost/sso/"

J’en déduis que l’IP du serveur est bannie, et qu’il faudrait la whitelister dans mon hook.

=> Sur quelle serveur yunohost va-t-il chercher ces fameux “applogos” ?

YunoHost va chercher les logos sur ton serveur, et ton serveur les récupère initialement lors des update du catalogue qui sont régulière et automatique.

Le soucis là c’est que les requêtes envoyées à nginx sont mal routées, il essaye d’aller dans /usr/share/nginx/html/yunohost/sso/ qui n’a pas de sens …

Est-ce que tu peux confirmer que tu as bien ces 3 lignes quelques part dans ta conf nginx (en particulier le snippet qui gère le sso) :

Alright.

/etc/nginx# grep -r '/usr/share/yunohost/applogos/;' *
conf.d/yunohost_admin.conf.inc:        alias /usr/share/yunohost/applogos/;
conf.d/yunohost_sso.conf.inc:        alias /usr/share/yunohost/applogos/;

Le soucis là c’est que les requêtes envoyées à nginx sont mal routées, il essaye d’aller dans /usr/share/nginx/html/yunohost/sso/ qui n’a pas de sens …

En effet, ne pas oublier la verrue que j’ai du pondre un peu plus haut pour récupérer l’accès :

J’ai récupéré le SSO en créant le folder /usr/share/nginx/html/yunohost/sso/ et en copiant dedans le contenu du folder /usr/share/yunohost/portal

Et, clairement, j’ai aggravé le soucis en faisant la copie de ce folder.
En le supprimant ainsi que mon hook, j’ai un fonctionnement normal.

Contenu du hook ( basé sur Tuto: Bloquer les requêtes selon le pays ) :

#!/bin/bash

# A placer dans /etc/yunohost/hooks.d/conf_regen/
# Voir https://forum.yunohost.org/t/tuto-bloquer-les-requetes-selon-le-pays/9947
# if not present, add package geoip-database with apt install geoip-database

##############################################
#Beware, i'm not sure this command is universal. You must test it before. If not, you can find the result with the command ip route, this one must be like 192.168.0.0/24 or similar. Then replace the variable $network_address with it.
#Attention, je ne suis pas certain que cette commande est universelle. Vous devez la tester au préalable. Si ce n'est pas le cas, vous pouvez trouver la réponse avec la commande ip route, celle-ci doit être de la forme 192.168.0.0/24 ou similaire. Remplacez alors la var>network_address=$(awk '{print $1}' <(grep src <(ip route)))
################################################
action=$1
pending_dir=$4
nginx_dir=$pending_dir/../nginx/etc/nginx
nginx_security_conf=$nginx_dir/conf.d/security.conf.inc
nginx_country_conf=$nginx_dir/conf.d/country.conf

[[ $action == "pre" ]] || exit 0
[[ -d $nginx_dir ]] || exit 0
[[ -e $nginx_security_conf ]] || exit 0

#Now we create the Nginx country conf file
echo "# GeoIP databases
geoip_country /usr/share/GeoIP/GeoIP.dat;

map \$geoip_country_code \$allowed_country {
  default no;
  # France
  FR yes;
  CH yes;
  # Italie
  #IT yes;
}

geo \$lan-ip {
  default no;
  $network_address yes;
  127.0.0.1 yes;
}" > $nginx_country_conf

#Next ,we modify Nginx security.conf.inc file
echo '

# allow local ip
if ($lan-ip = yes) {
  set $allowed_country yes;
}
# block the country
#if ($allowed_country = no) {
#  return 444;
#}

#blocage sur certaines url uniquement
location ~* /(sso) {
 if ($allowed_country = no) {
  return 444;
 }
}

' >> $nginx_security_conf

#And then, we create the cron job.
echo "#!/bin/bash

maj_geoip () {
    cd /usr/share/GeoIP
    if grep 'inet6 [23]' <(ip -6 addr);then #test if the server can be join with ipv4+ipv6 or only ipv4
        wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz -O GeoIP.dat.gz #Download IPv4+IPv6 database

    else
        wget https://mailfud.org/geoip-legacy/GeoIP.dat.gz #Download IPv4 database
    fi
    gunzip -f GeoIP.dat.gz #unzip database
}}
last=/usr/local/etc/last #it is a file to write the last date update. It is use to compare if there is a new update when the cron job is execute. If not, there's nothing to do.
if grep 'inet6 [23]' <(ip -6 addr);then
      update=\$(sed -n 's,.*<li>Maxmind : \(.*\)</li>,\1,p' <(curl -s https://www.miyuru.lk/geoiplegacy | grep 'Maxmind : ')) #Retrieve the last update of database ipv4+ipv6 date on miuru.lk
else
      update=\$(sed -n 's,.*<b>\(.*\)</b>,\1,p' <(curl -s https://mailfud.org/geoip-legacy/ | grep 'Latest update')) #retrieve the last update date on mailfud.org
fi
[[ \"\$(<\$last)\" != \"\$update\" ]] && (echo \"\$update\" > \"\$last\";maj_geoip) #Test if there is an update. If yes, write the date in /usr/local/etc/last and execute the function maj_geoip.
exit 0" > /etc/cron.weekly/Geoipupdate
chmod 500 /etc/cron.weekly/Geoipupdate # give execution right to the cron job.
##############################################################

Sans surprise, la partie qui pose soucis est celle du blocage (si commentée, comportement normale du serveur) :

#blocage sur certaines url uniquement
location ~* /(sso) {
 if ($allowed_country = no) {
  return 444;
 }
}

=> Je pense que la variable $nginx_dir n’est plus bonne avec le rework du sso.

Edit : Invocation de @metyun

Hello Kit,

Je n’ai pas tout lu mais avant d’aller plus loin, as-tu le même souci avec :

if ($allowed_country = no) {
  return 444;
}'

au lieu de :

location ~* /(sso) {
 if ($allowed_country = no) {
  return 444;
 }
}

Hey !

En virant la location ? Ça fonctionne effectivement.

J’ai cependant impérativement besoin d’une granulométrie plus fine, car mes liens gitea et mes images hébergées via Nextcloud doivent être visitables.

Je me souviens qu’on avait pas mal galéré sur cette histoire de location :confused:

Maintenant qu’on sait d’où le problème provient, je propose de fermer le topic et de repartir sur celui que tu avais dédié à GeoIP pour la suite de cette conversation.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.