Utiliser une API perso avec / à côté de yunohost

Hello !!

J’ai une question un peu particulière.

J’ai une instance yuno sur un RPI 3B que j’utilise de manière perso notamment pour nexcloud. (je reçois bientôt un RPI4 pour remplacer celui-ci, dès que yuno 4 est dispo)
Mais je suis aussi dev web et en ce moment je créé une app avec une API REST. Pour cela j’ai besoin d’un serveur avec une BDD, de PHP (en 7.3 et 7.4) et un nom de domaine.

Bref je me demande dans quelle mesure je peux faire tourner cette API avec / sur / à côté de Yunohost. Faut-il bosser directement sur debian ? sur Yuno ? Faire une app Yuno pour faire ça …
Sachant que comme je suis en phase de test encore j’ai besoin d’aller souvent modifier ma BDD avec phpmyadmin et que je push des corrections / nouveauté du code de mon API toutes les 2 mins :crazy_face:

Voilà je soumet ces interrogations à vos conseils avisés ! Et d’avance merci !

Baud

Salut,

la réponse est oui … pour faire une analogie cheloue, Yunohost c’est un appart déjà meublé et ta question c’est “est-ce que je peux rajouter une chaise dans un coin”, donc oui.

Après, tout dépends de ce que tu fais exactement et de comment ton app fonctionne … Dans l’absolu, pas besoin de packager ton app pour Yunohost (c’est surtout si t’as envie de pouvoir redéployer ton app facilement ou permettre à d’autres gens de le faire simplement).

Par contre c’est probablement + simple si tu fais ça sur un serveur de dev / test au début.

3 Likes

Hello Aleks !!

Merci beaucoup pour ta réponse !
Alors non a priori je compte pas redéployer mon app parce que c’est pour utilisation hyper spécifique donc à peu près personne n’utilisera ça, et en plus il faut le client pour que ça fonctionne.
(C’est une application de suivi de chantier pour les architectes)
En fait pour l’instant je bosse en local sur ma machine en lançant un serveur PHP (un peu à la manière de WAMP LAMP et XAMP).
Mais là je voudrais passer en phase de test à un peu plus grande échelle avec plusieurs utilisateurs et des données accessible depuis n’importe quel client. D’où le serveur.

Mais pour l’instant pour pas me payer un vrai serveur je voudrais utiliser mon yuno. (Et puis j’ai qu’une seule connexion internet dispo donc je suis obligé de tout mettre sur le même serveur il me semble).

Mais du coup si je comprend bien il faut quand même que je fasse fonctionner mon API avec Yuno, je peux pas la faire tourner sur debian à côté de yuno et indépendamment.

Après mon API est bâtie avec le framework PHP Slim. C’est un système REST assez simple type MVC avec un router un controlleur et du business object qui fait les requêtes sur la BDD en SQL. Et après c’est parsé en renvoyer en JSON via AJAX.

Voilà voilà !

Mais j’avoue que je sais pas du tout mais alors pas du tout par où commencer pour implémenter ça sur yuno. (vu que je sais pas vraiment comment fonctionne yuno par rapport à debian et tout ça )

up ?

@Aleks ?

J’ai vu qu’il y avait une appli Custom Webapp faut-il que je cherche de ce côté là ? (mais elle n’est pls maintenu.

Après il y la solution qui consiste à utiliser docker, mais je ne sais pas dans quelle mesure docker est utilisable dans Yuno.

J’avoue que je suis un peu perdu dans toutes ces questions …

Si ton API est fournie par un “simple” site PHP alors oui, la custom webapp est là pour ça. Bien quelle ne soit plus maintenue, je l’ai testée le mois dernier et elle fonctionne bien. De toute façon c’est plus ou moins une coquille vide, si tu as un souci tu pourras modifier le fichier nginx qui lui correspond pour corriger le tir.

Si tu pars sur Docker, de mon expérience ça peut tout à fait fonctionner sur Yunohost. Tu as juste besoin d’ajouter une app Redirect pour faire un proxy vers le port web de ton conteneur.

Oui c’est un “simple” site PHP qui gère une base de données …
Ok je note pour Docker !!

Merci ! Je vais essayer tout ça et je reviens vers vous si ça marche pas :wink:

Hello @TitusPiJean !

Effectivement j’ai balancé mon code de manière un peu bourrin dans le répertoir www et j’ai le droit à une jolie page 403 Forbidden.
Je me demande où donc est ce fichier ngnix ? Et qu’est ce que je dois modififer dedans.

Ensuite normalement je lance une commande php -S localhost:8085 -t public/ pour lancer mon server/service php en local. Je me demande donc si il faut aussi lancer le service dans cette custom webapp et si oui comment ? (l’intérêt de cette commande est de définir le dossier root comme étant celui qui se nomme public)

Voilà voilà j’espère que c’est assez clair :wink:

Edit : Il serait peut-être judicieux que je build mon app plutôt que de rester avec la version dev déjà … Mais je pense que les questions restent sensiblement les mêmes

Edit : J’ai aussi trouvé cette doc pour la configuration de nginx : https://www.slimframework.com/docs/v4/start/web-servers.html#nginx-configuration

A mon humble avis, je pense qu’on pourra éviter de passer par la commande que tu cites. Si c’est une API, il n’y a pas vraiment de raison qu’elle grogne si le nom du répertoire de base change, mais on verra plus tard. Vérifions déjà tous les fichiers et répertoires.

Peux-tu partager les retours des commandes suivantes ? Remplace $TonDomaine par… ton domaine. ^^

# Contenu de my webapp, et vérifer chmod et chown
ls -la /var/www/my_webapp/*
# Regardons pourquoi tu as reçu une erreur 403
# D'abord recharge la page pour générer l'erreur
tail -n 30 /var/log/nginx/$TonDomaine-error.log

Le fichier de configuration nginx se trouve là: /etc/nginx/conf.d/$TonDomaine.d/my_webapp.conf Pour l’instant de changeons rien dedans.

@TitusPiJean Merci beaucoup pour ton aide !

alors le contenue de ls :

-rw-r--r-- 1 my_webapp my_webapp   80 Jul `Texte préformaté`21 00:28 /var/www/my_webapp/db_access.txt
/var/www/my_webapp/www:
total 152
drwxr-xr-x  6 my_webapp my_webapp   4096 Jul 21 12:06 .
drwxr-xr-x  3 root      root        4096 Jul 21 00:28 ..
-rw-r--r--  1 my_webapp my_webapp    637 Jul 21 00:38 composer.json
-rw-r--r--  1 my_webapp my_webapp 104025 Jul 21 00:38 composer.lock
drwxr-xr-x  2 my_webapp my_webapp   4096 Jul 21 00:38 config
-rw-r--r--  1 my_webapp my_webapp     32 Jul 21 00:38 .env
-rw-r--r--  1 my_webapp my_webapp     25 Jul 21 00:38 .gitignore
-rw-r--r--  1 my_webapp my_webapp    117 Jul 21 00:38 .htaccess
-rw-r--r--  1 my_webapp my_webapp   1066 Jul 21 00:38 LICENSE
drwxr-xr-x  2 my_webapp my_webapp   4096 Jul 21 00:38 public
-rw-r--r--  1 my_webapp my_webapp    787 Jul 21 00:38 README.md
drwxr-xr-x  7 my_webapp my_webapp   4096 Jul 21 00:38 src
drwxr-xr-x 28 my_webapp my_webapp   4096 Jul 21 00:38 vendor

Ensuite impossible de lancer la commande tail j’ai systématiquement :

tail: cannot open '/var/log/nginx/https://labaudesrv.duckdns.org/pvapp-error.log' for reading: No such file or directory

et ce quelque soit la combinaison que je test.

Ce qui est sur c’est que le point d’entrée de mon API, le index.php est placé dans mon dossier public

Et en fait il n’y a rien a builder du tout haha, il faut juste indiqué à composer qu’on passe en prod, mais ça supprime juste les dépendances de dev et ça optimise l’autoloader. On est pas sur Nodejs :crazy_face:

EDIT :
Je suis aller creuser un peu dans ce dossier log/nginx et en fait j’ai fini par comprendre pourquoi la commande fonctionnait pas et à l’exécuter. Voici le résulta :

2020/07/21 12:08:08 [error] 15992#15992: *3658 directory index of "/var/www/my_webapp/www/" is forbidden, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/yunohost/sso/"
2020/07/21 12:08:08 [error] 15992#15992: *3658 lua entry thread aborted: runtime error: /usr/share/ssowat/access.lua:276: Interrupted system call
stack traceback:
coroutine 0:
	[C]: in function '(for generator)'
	/usr/share/ssowat/access.lua:276: in function 'scandir'
	/usr/share/ssowat/access.lua:303: in function 'serveYnhpanel'
	/usr/share/ssowat/access.lua:331: in function </usr/share/ssowat/access.lua:1>, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /ynhtheme/custom_overlay.css HTTP/2.0", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/pvapp/"
2020/07/21 12:08:10 [error] 15992#15992: *3658 directory index of "/var/www/my_webapp/www/" is forbidden, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/yunohost/sso/"
2020/07/21 12:08:11 [error] 15992#15992: *3658 lua entry thread aborted: runtime error: /usr/share/ssowat/access.lua:276: Interrupted system call
stack traceback:
coroutine 0:
	[C]: in function '(for generator)'
	/usr/share/ssowat/access.lua:276: in function 'scandir'
	/usr/share/ssowat/access.lua:303: in function 'serveYnhpanel'
	/usr/share/ssowat/access.lua:331: in function </usr/share/ssowat/access.lua:1>, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /ynhtheme/custom_overlay.css HTTP/2.0", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/pvapp/"
2020/07/21 12:10:57 [error] 15992#15992: *3658 directory index of "/var/www/my_webapp/www/" is forbidden, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/yunohost/sso/"

Tente de modifier ton fichier /etc/nginx/conf.d/$TonDomaine.d/my_webapp.conf, ligne 5, comme suit:

    alias /var/www/my_webapp/www/public/;

Puis recharge nginx avec sudo service nginx reload.

:crossed_fingers:

modif: un slash à la fin du chemin vers public

Merci bcp !

Alors effectivement j’ai plus d’erreur, mais j’ai une page blanche à la place … L’API ne se lance donc pas … (ou je n’y ai pas accès)

J’ai relancé la commande tail :

2020/07/22 14:21:32 [error] 25450#25450: *7749 FastCGI sent in stderr: "PHP message: PHP Warning:  Class 'Cake\Chronos\Chronos' not found in /var/www/my_webapp/www/vendor/cakephp/chronos/src/carbon_compat.php on line 19
PHP message: PHP Parse error:  syntax error, unexpected '?' in /var/www/my_webapp/www/vendor/cakephp/chronos/src/Chronos.php on line 177" while reading response header from upstream, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm-my_webapp.sock:", host: "labaudesrv.duckdns.org"
2020/07/22 14:21:42 [error] 25450#25450: *7749 FastCGI sent in stderr: "PHP message: PHP Warning:  Class 'Cake\Chronos\Chronos' not found in /var/www/my_webapp/www/vendor/cakephp/chronos/src/carbon_compat.php on line 19
PHP message: PHP Parse error:  syntax error, unexpected '?' in /var/www/my_webapp/www/vendor/cakephp/chronos/src/Chronos.php on line 177" while reading response header from upstream, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm-my_webapp.sock:", host: "labaudesrv.duckdns.org"
2020/07/22 14:21:59 [error] 25450#25450: *7749 FastCGI sent in stderr: "PHP message: PHP Warning:  Class 'Cake\Chronos\Chronos' not found in /var/www/my_webapp/www/vendor/cakephp/chronos/src/carbon_compat.php on line 19
PHP message: PHP Parse error:  syntax error, unexpected '?' in /var/www/my_webapp/www/vendor/cakephp/chronos/src/Chronos.php on line 177" while reading response header from upstream, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm-my_webapp.sock:", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/yunohost/sso/"
2020/07/22 14:35:28 [error] 25450#25450: *7813 FastCGI sent in stderr: "PHP message: PHP Warning:  Class 'Cake\Chronos\Chronos' not found in /var/www/my_webapp/www/vendor/cakephp/chronos/src/carbon_compat.php on line 19
PHP message: PHP Parse error:  syntax error, unexpected '?' in /var/www/my_webapp/www/vendor/cakephp/chronos/src/Chronos.php on line 177" while reading response header from upstream, client: 88.120.120.131, server: labaudesrv.duckdns.org, request: "GET /pvapp/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/php/php7.0-fpm-my_webapp.sock:", host: "labaudesrv.duckdns.org", referrer: "https://labaudesrv.duckdns.org/yunohost/sso/"

Peut-être quelque-chose qui peut jouer, j’ai dev en php 7.3 puis en 7.4 alors que là php tourne en 7.0. Et j’avoue que j’ai peu prêté attention aux problèmes de compatibilité…

Ah, c’est étrange, moi la webapp a automatiquement mis PHP en version 7.3
Tentons de le migrer, mais je te garantis pas qu’il cesse de se plaindre de ce ? inattendu.

Peux-tu vérifier que tu as PHP7.4 d’installé ?

Ensuite :

mv /etc/php/7.0/fpm/pool.d/my_webapp.conf /etc/php/7.4/fpm/pool.d/my_webapp.conf
sudo service php7.0-fpm reload
sudo service php7.4-fpm reload

Tu pourras aussi modifier les références à PHP7.0 dans /etc/yunohost/apps/my_webapp/settings.yml, après confirmation que tout ça ait été corrigé.

Merci beaucoup !!

Alors oui php7.4 est bien installé. J’ai exécuté les commandes et à partir de là ça à renvoyé quelque chose.

J’ai quand même modifié la ref dans le fichier yml.

Bon cependant les requêtes auprès de mon API ne fonctionne pas. J’ai systématiquement un CORS preflight did not succeed dans ma console du client web.

Et avec Postman j’ai ça :
image

Au vu des tests que j’ai essayé, les deux problèmes ne sont pas liés.
Dans un premier temps j’ai bien un problème sur le CORS (et postman n’as pas ces problèmes)
Et donc dans un second temps j’ai un problème pour m’identifier. Mais je voudrais pas m’identifier je voudrais que l’API soit librement accessible puisqu’elle implémente déjà un système de compte et de token.

Je vais répondre d’abord sur ce point, demain il faudra que je me renseigne sur le premier.

Je pense qu’il te suffit de donner aux visiteurs la permission my_webapp.main pour ne plus être demandé de te connecter.

Quant à ça, il faudra, je pense, ajouter quelques lignes au fichier comme montré sur ce site.

Par contre il me semble qu’il ne faut pas utiliser les commandes add_header mais plutôt more_set_headers.

add_header 'Access-Control-Allow-Origin' '*';

deviendrait

more_set_headers 'Access-Control-Allow-Origin: *';

et etc. pour le reste des commandes. A modifier selon tes besoins, je ne sais pas quels types de requêtes ton API est censée accepter.

Merci !!

Je pense qu’il te suffit de donner aux visiteurs la permission my_webapp.main pour ne plus être demandé de te connecter.

Comment je fais pour donner cette autorisation ? :see_no_evil: :see_no_evil: :see_no_evil: Désolé j’y connais vraiment rien au déploiement d’app et tout ça (encore). Et y’a pas beaucoup de doc …

Pour ce qui est de CORS, je pense que le problème vient de la config de mon API. Cependant, ça fait longtemps que j’essaie de la corriger et je n’y arrives pas, bien que j’ai suivie à la lettre la doc du framwork PHP que j’utilise … Donc si tu as une idée, je suis assez intéressé… Je pense notamment à bypass avec ngnix directement (comme on peut le faire avec apache il me semble).

Pas de souci ! C’est dans ton panneau d’administration. Ouvre la page Utilisateurs, et clique sur le bouton “Gérer les groupes et les autorisations”.

Ensuite dans la section Visiteurs clique sur “+ Ajouter une permission” et sélectionne “my_webapp”.

Par contre si ça y est déjà… alors là je vois pas où est le souci.

Ha oui si c’est ça, j’ai vérifié et elle y est déjà …

Je vais essayé de débloquer CORS, peut-être que ça regèlera le problème d’autorisation, et sinon je supprimerai l’autorisation et la remettrai et le cas échéant je reviens vers toi :wink:

Mille merci en tous cas !

1 Like