Problème API REST Nginx 404 Synology

Bonjour à tous,

j’ai installer Dolibarr 19.0.0 => 19.0.1 => 19.0.2 sur mon Synology et jusque là tout fonctionnai très bien.
J’ai voulu essayé d’activer le service REST malheureusement lorsque j’essaye d’accéder à l’url, j’obtient une erreur 404 .

J’ai tester en PHP 8.2 et PHP 7.4, aucune différence.

  • MonURL/api/index.php/login?login=MonUserLogin&password=MonUserPassword => 404
  • MonURL/api/index.php/explorer => 404
  • MonURL/api/index.php/explorer/swagger.json?DOLAPIKEY=MonUserApiKey => 404

J’ai lut que Nginx pouvait avoir des effets en ce sens, j’ai donc modifier pour apache et j’ai toujours des 404 :confused:

Est ce qu’il y a une configuration particulière à appliquer dans le fichier de config ?

Voici ma configuration NGINX :

  listen       *:443 ssl http2;
  listen       [::]:443 ssl http2 ;


  server_name  xxxxx;

  ssl_certificate           /etc/letsencrypt/live/xxxxx/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/xxxxx/privkey.pem;
  ssl_trusted_certificate   /etc/letsencrypt/live/xxxxx/chain.pem;

  index  index.html index.htm index.php;
  access_log            /var/log/nginx/ssl-xxxxx_ssl.access.log;
  error_log             /var/log/nginx/ssl-xxxxx_ssl.error.log;


  root /var/www/users/yyyyy/xxxxx/web/;
      add_header "X-Robots-Tag" "noindex";


  location ~ \.php(/|$) {
    include /etc/nginx/fastcgi_params;
    set $path_info $fastcgi_path_info;
    add_header "X-Robots-Tag" "noindex";
    include       /etc/nginx/fastcgi.conf;

    fastcgi_pass  unix:/var/run/php8.2-fpm-yyyyy.sock;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO       $path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    try_files $fastcgi_script_name =404;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 8 16k;
    fastcgi_busy_buffers_size 32k;
    fastcgi_intercept_errors on;
  }
}

Bonsoir,

C’est toujours compliqué sur synology/webstation.
Si j’arrive à le faire marcher je ferai un tuto :smiley:

Voici la config de mon nginx :

/usr/local/etc/nginx/sites-available/499b02e8-6ddf-4281-b501-3ef87e7d55f5.w3conf

log_format log_d2d1c3e5-8507-430c-9383-d88116dc7995 'd2d1c3e5-8507-430c-9383-d88116dc7995;$time_local;$remote_addr;$request;$status;$body_bytes_sent;$http_referer';
server {

    listen      80;
    listen      [::]:80;

    listen      443 ssl;
    listen      [::]:443 ssl;

    server_name dolibarr.MONSERVEUR.synology.me ;

    if ( $host !~ "(^dolibarr.MONSERVEUR.synology.me$)" ) { return 404; }

    access_log /var/packages/WebStation/var/log/nginx_access_log log_d2d1c3e5-8507-430c-9383-d88116dc7995;
    error_log /var/packages/WebStation/var/log/nginx_error_log warn;

    include /usr/syno/etc/www/certificate/WebStation_d2d1c3e5-8507-430c-9383-d88116dc7995/cert.conf*;

    include /usr/syno/etc/security-profile/tls-profile/config/WebStation_d2d1c3e5-8507-430c-9383-d88116dc7995.conf*;

    add_header  Strict-Transport-Security max-age=15768000;
    ssl_prefer_server_ciphers   on;

    location ^~ /.well-known/acme-challenge {
        root /var/lib/letsencrypt;
        default_type text/plain;
    }

    include conf.d/.webstation.error_page.default.conf*;

    include conf.d/.webstation.error_page.default.resource.conf*;

    if ($server_port = "80") {
        return 301 https://$server_name$request_uri;
    }

    include conf.d/.service.d2d1c3e5-8507-430c-9383-d88116dc7995.b81c1b40-6294-4a77-b551-80b183471e11.conf*;

/usr/local/etc/nginx/conf.d-available/c10e3b10-4245-4eed-976c-ecbafe871e56.w3conf

    root    "/volume1/web/dolibarr/htdocs";
    index    index.php index.htm index.html;

    location ~* \.(php[345]?|phtml)$ {
        fastcgi_pass unix:/run/php-fpm/php-75195582-3881-4d74-8ed3-b25451ff0652.sock;
        fastcgi_param HOST $server_name;

        fastcgi_connect_timeout 600s;
        fastcgi_read_timeout 600s;
        fastcgi_send_timeout 600s;

        fastcgi_param SCRIPT_FILENAME $request_filename;

        fastcgi_param QUERY_STRING $query_string;

        fastcgi_param REQUEST_METHOD $request_method;

        fastcgi_param CONTENT_TYPE $content_type;

        fastcgi_param CONTENT_LENGTH $content_length;

        fastcgi_param SCRIPT_NAME $fastcgi_script_name;

        fastcgi_param REQUEST_URI $request_uri;

        fastcgi_param DOCUMENT_URI $document_uri;

        fastcgi_param DOCUMENT_ROOT $document_root;

        fastcgi_param SERVER_PROTOCOL $server_protocol;

        fastcgi_param REQUEST_SCHEME $scheme;

        fastcgi_param HTTPS $https if_not_empty;

        fastcgi_param GATEWAY_INTERFACE CGI/1.1;

        fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

        fastcgi_param REMOTE_ADDR $remote_addr;

        fastcgi_param REMOTE_PORT $remote_port;

        fastcgi_param SERVER_ADDR $server_addr;

        fastcgi_param SERVER_PORT $server_port;

        fastcgi_param SERVER_NAME $server_name;

        fastcgi_param REDIRECT_STATUS 200;

        include /usr/local/etc/nginx/conf.d/b81c1b40-6294-4a77-b551-80b183471e11/fastcgi.conf*;
    }

    include /usr/local/etc/nginx/conf.d/b81c1b40-6294-4a77-b551-80b183471e11/user.conf*;

Je viens de découvrir le fichier de log:
avec cette erreur :

2024/07/12 19:49:12 [error] 14617#14617: *292 open() "/volume1/web/dolibarr/htdocs/api/index.php/explorer/swagger.json" failed (20: Not a directory), client: xxx.xxx.xxx.xxx, server: dolibarr.MONSERVEUR.synology.me, request: "GET /api/index.php/explorer/swagger.json HTTP/2.0", host: "dolibarr.MONSERVEUR.synology.me"
2024/07/12 19:49:12 [error] 14617#14617: *292 open() "/volume1/web/dolibarr/htdocs/missing" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: dolibarr.MONSERVEUR.synology.me, request: "GET /missing HTTP/2.0", host: "dolibarr.MONSERVEUR.synology.me", referrer: "https://dolibarr.MONSERVEUR.synology.me/api/index.php/explorer/swagger.json"

est-ce que cela fonctionne quand tu utilises directement l’adresse ip du serveur?

Salut,

non, je n’y est pas accès non plus via l’adresse ip du serveur :confused:
https:// MONSERVEURIP/dolibarr/htdocs/api/index.php
Quoi que je fasse je me retrouve bloqué par une erreur 404 :frowning:

Je sèche un peu.

C’est comme si que le user web n’avait pas les droits pour le dossier api …

j’ai fait une rapide recherche de ton erreur 20: not a directory

il conseil de modifier nginx.conf et changer le disable_symlinks

Fait part de sa frustration

J’ai essayé de modifié les fichiers config, qui sont en faite régénéré à chaque reboot de nginx T.T merci synology.

J’ai fini par trouver le fichier /usr/syno/share/nginx/nginx.mustache qui régénère le fichier nginx.conf auquel j’ai ajouté la ligne :

disable_symlinks off;

lorsque je fais le redémarrage de nginx avec :

sudo systemctl restart nginx

le fichier nginx.conf est bien mis à jour avec le disable_symlinks off;
mais ca ne marche pas mieu.
Comme c’est les poupées russe au niveau des fichiers confs je n’est pas trouvé celui qui est responsable de la génération de la config spécifique de mon hôte virtuel et il y a une forte probabilité qu’a un moment un autre fichier de conf le réactive -.-'.
bref Je continue de creuser …

tu as la meme erreur dans ta log?

Toujours le même problème avec nginx …

J’ai changé d’approche, j’ai créer deux sous domaines.

https:// NGINX.MonURL/dolibarr/htdocs/api/index.php => nginx
https:// APACHE.MonURL/dolibarr/htdocs/api/index.php => Apache

sur apache j’ai eu un message plus intéressant :

1720889481	Erreur	xxx.xxx.xxx.xxx:xxxxx	AH01071: Got error 'PHP message: PHP Warning:  is_writable(): open_basedir restriction in effect. File(/volume1/web/dolibarr/documents/api/temp) is not within the allowed path(s): (/volume1/web/dolibarr/htdocs:/volume1/web/dolibarr,/volume1/web/dolibarr/documents,/volume1/web/dolibarr/documents/api/temp) in /volume1/web/dolibarr/htdocs/api/index.php on line 160'

J’ai donc corrigé en mettant dans open_basedir = /volume1/web/dolibarr/documents:/volume1/web/dolibarr/documents/api/temp

et j’arrive à afficher la page
https:// APACHE.MonURL/api/index.php/explorer/

J’ai maintenant un message d’erreur

failed to parse JSON/YAML response

J’aurai aimé faire fonctionner avec nginx mais bon si ca marche avec apache …
Je vais voir si je peux faire de requêtes avec postman.

Après deux jours d’acharnement,
J’arrive avec postman a me connecter à l’api.
Swagger ne fonctionne pas, je ne comprend pas pourquoi et c’est bien dommage…

Par contre j’arrive avec postman à récupérer mes données.
une partie du problème viens aussi du fait que j’ai créé un utilisateur api avec le droit de consulté seulement les contacts.
Un dev à eu la judicieuse idée de faire des jointures sur une table que l’on ne peut pas atteindre si on peut seulement accéder aux contacts…
A la place de ca on a une belle erreur sql :frowning:
Quand j’ai ouvert tous les droits l’erreur n’est plus présente, vive la sécurité.

Le sujet n’est pas encore tout a fais résolut.
Il faut que j’investigue sur le problème de swagger et de l’erreur sur la consultation des contacts via l’api lorsque l’on a seulement le droit de les consulter.

Question en aparté, pour faire un wiki sur l’installation de dolibarr sur un synology (DSM 7), est ce qu’il existe un wiki dolibarr ou je pourrai le publier ?
Je pense pas que le forum soit trop fait pour ca …

J’ai pas trop compris comment faire pour proposer une modif du wiki du coup je les fais sur ma page perso :
Installation de Dolibarr sur Synology