SQLPage est une application permettant de publier des bases de données sur une page Web sans se préoccuper de la mise en forme. Elle est développée et partagée par Ophir Lojkine (un grand merci à lui !!!).
Site officiel : https://sql.ophir.dev/

J'ai découvert SQLPage via ces articles très détaillés sur le site "linuxfr.org" :

C'est un outil très intéressant et puissant que je teste sur mon NAS Synology DS713+ sous DSM 7.1 (mon modèle trop ancien, qui a plus de 10 ans mais fonctionne impeccablement, ne peut pas migrer vers la version 7.2). Vous trouverez ci-dessous mon retour d'expérience.

I- Préparation du NAS Synology

A- Connexion ssh

Pour pouvoir utiliser docker-compose notamment, il est nécessaire d'établir une connexion SSH avec le NAS (sur un port différent du 22 habituel pour augmenter la sécurité de l'accès). Pour cela, on pourra se reférer à cette page :
https://kb.synology.com/fr-fr/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet

B- Installation de Docker

On va ensuite installer l'application Docker en suivant ce tuto : https://kb.synology.com/fr-fr/DSM/help/Docker/docker_desc?version=6.
Pour info, l'application "Container Manager" n'est accessible qu'avec la version DSM 7.2.

C- Création d'un dossier pour échanger les données de SQLPage avec le conteneur Docker

Par défaut, les conteneurs Docker sont isolés de l'hôte qui est le serveur NAS. Si l'on veut interagir, il faut préparer des dossiers spécifiques. On va donc se créer via "File Station" (1) des dossiers et sous-dossiers "docker" (2) -> "sqlpage1" (3) -> "configuration" (4) :
Au départ, ces dossiers sont vides mais ça n'a pas d'importance.

Remarque : Pour les NAS Synology, il faut que le dossier "Docker" (contenant les dossiers pour fonctionner avec les conteneurs) soit configuré avec le propriétaire "EVERYONE" avec droit de lecture/écriture.

II- Installation de SQLPage

SQLPage existe déjà empaqueté pour Docker : https://registry.hub.docker.com/r/lovasoa/sqlpage/. Ça va nous simplifier la vie...

A- Récupération de l'image Docker de SQLPage

On ouvre l'application Docker (1), on va dans la partie Registre (2), on recherche "sqlpage" (3), on clique sur l'image "lovasoa/sqlpage" (4) et on clique sur le bouton "Télécharger" (5) :

 Dans la fenêtre qui surgit, on laisse le paramètre à "latest" et on clique sur le bouton "Sélectionnez" pour télécharger l'image docker de SQLPage : 

Maintenant, on va installer SQLPage en allant dans le menu "Image" (2), on sélectionne l'image "lovasoa/sqlpage:latest" (3) et on clique sur le bouton "Lancer" (4) :

 

Dans la fenêtre "Réseau", on laisse l'option "bridge" sélectionnée par défaut et on appuie sur le bouton "Suivant" :

Dans la fenêtre "Paramètres généraux" qui arrive, on peut changer le nom du conteneur "lovasoa-sqlpage1"(1), on coche "Activer le redémarrage automatique"(2) et on clique sur le bouton en bas "Suivant"(3) :

 Dans la fenêtre suivante "Paramètres des ports", on modifie le port en mettant par exemple "30002" et on clique sur le bouton "Suivant" :

Dans la fenêtre "Paramètres du volume", on clique sur le bouton "Ajouter un dossier" :

Puis on sélectionne le dossier "docker" -> "sqlpage1" :

sqlpage 9

Dans cette fenêtre, on met 2 dossiers avec les paramètres suivants :
- /docker/sqlpage1 -> /var/www
- /docker/sqlpage1/configuration -> /etc/sqlpage que l'on met en lecture seule en cochant la case (Read Only ou ro en anglais).

sqlpage 10

 On arrive sur la dernière page "Résumé" et on clique sur le bouton "Effectué" :

sqlpage 11

Après quelques secondes, on constate que le nouveau conteneur est lancé :

sqlpage 12

On peut alors vérifier que le serveur SQLpage fonctionne bien en allant dans son navigateur sur la page ayant l'adresse du NAS et le port donné pour SQLPage, soit dans mon cas : http://192.168.1.xxxx:30002 et on voit cette page:
sqlpage 13

 

B- Accès extérieur à la page SQLPage

sqlpage 14

Il est possible d'accèder au site SQLPage de l'extérieur en réglant le "Reverse Proxy" du NAS Syno (et aussi la box mais je vous renvoie à cet article pour plus d'info : [Home Assistant] Accès extérieur à son NAS Syno et son Raspberry Pi 4 avec SFR Box6 en IPv6).
Pour cela, il va falloir aller dans le "Panneau de configuration"(1) du NAS, dans la partie "Portail de connexion"(2), aller sur l'onglet "Avancé"(3) et le bouton "Proxy inversé"(4).

 

 

sqlpage 15

On crée alors une nouvelle règle, en allant dans l'onglet "Général" (1). On donne un nom (2), on règle la source (3) :

  • Protocole : HTTPS
  • Nom d'hôte : le nom de domaine (j'utilise le DDNS proposé par Synology).
  • Port : 443 (qui évite d'avoir à saisir le port dans l'adresse, car c'est le port par défaut de https).
  • On coche "Activer HSTS".
  • Profil de controle d'accès : "Tout accès".

On règle la destination (4) :

  • Protocole : HTTP
  • Nom d'hôte : localhost (ça ne fonctionne pas si on met l'adresse IP en dur du NAS).
  • On indique le port sur lequel fonctionne SQLPage.

 

Il reste à régler la partie concernant l'En-tête personnalisé (1) (header) via l'onglet idoine :

sqlpage 16

 Puis on clique sur le bouton "Créer" (2) et on sélectionne "WebSocket" (3). Cela permet de compléter automatiquement, 2 nouvelles lignes et on clique sur le bouton "Sauvegarder" (4) :

sqlpage 17

 On a alors une nouvelle ligne pour cette règle permettant de se connecter de l'extérieur :

sqlpage 18

On peut tester avec son téléphone portable (en désactivant le wifi) en allant à l'adresse : https://sqlpage.nom-de-domaine.synology.me. Si tout est bien réglé, on doit voir la "mire" de SQLPage comme à la fin de la partie A ci-dessus.

REMARQUE : Si l'on ne travaille qu'avec des bases de données SQLite (comme l'application École Inclusive", ce qui est le plus simple, on peut aller directement au chapitre IX. Les chapitres intermédiaires traitent de MySQL et PostgreSQL et sont gardées là au cas où...

 

III- Installation de MySQL avec Docker

Remarque : J'ai abandonné MySQL pour PostgreSQL par la suite car je voulais utiliser l'exemple fourni pour l'authentification par SQLPage (la traduction vers MySQL n'ayant pas marché).
SQLPage fonctionne avec différents types de bases de données. J'ai donc décidé de me compliquer la vie en utilisant des bases de données MySQL via Docker 😉. Et c'est tout à fait possible même si ça demande pas mal de manipulations supplémentaires...
Source : https://mariushosting.com/how-to-install-mysql-on-your-synology-nas/ où je découvre une autre façon d'installer un conteneur Docker en passant par le Planificateur de tâches (Task Scheduler).

A- Création d'un dossier pour échanger les données avec Docker

On se crée un dossier "Docker" -> "mysql" -> "data" (comme dans le chapitre I-C au -dessus).

B- Création de la tâche pour installer MySql dans Docker

On va dans le "Panneau de configuration" (1) -> "Planificateur de tâches" (2) -> "Créer" (3) -> "Tâche planifiée" (4) -> "Script défini par l'utilisateur" (5) et on s'en crée une :

sqlpage mysql 1

Ensuite, on paramètre les 3 onglets suivants :

  • Général : on nomme la tâche comme par exemple "Install MySQL Docker", on y affecte l'utilisateur "root" et on l'active en cochant la case "Activé".
  • Programmer : on sélectionne "Exécuter à la date suivante" et "Ne pas répéter".
  • Paramètres de tâche : on coche la notification par courriel en donnant une adresse, et on complète la partie "Script défini par l'utilisateur" avec le code suivant :

sqlpage mysql 2    sqlpage mysql 3     sqlpage mysql 4

Script pour installer le conteneur MySQL (en se basant sur les PUID et PGID qui correspond à l'utilisateur et à son groupe, voir plus bas pour les obtenir) :

docker run -d --name=mysql \
-p 3306:3306 \
-p 33060:33060 \
-e PUID=1026 \
-e PGID=100 \
-e TZ=Europe/Paris \
-e MYSQL_ROOT_PASSWORD=mot-de-pass-root-mysql \
-v /volume1/docker/mysql/data:/var/lib/mysql \
--restart always \
mysql

sqlpage mysql 5

Remarque : pour obtenir le PUID et PGID, on va dans le terminal du NAS et on saisit le code : id nom_utilisateur.
Voici par exemple les PUID et PGID de l'utilisateur "Thierry" qui sont repris dans le script au-dessus.

 

On termine en appuyant sur le bouton "OK".
Le conteneur MySQL s'installe et une fois que c'est terminé, on reçoit un courriel de notification.

C- Adresse IP du conteneur MySQL

Le conteneur MySQL est accessible via l'IP 172.17.0.1:3306 en http et 172.17.0.1:33060 en https. On verra qu'on en aura besoin par la suite (voir les commandes Docker ici :[Docker] Liste de commandes utiles).

 

IV- Échec : Installation de phpmyadmin avec Docker :

Pour gérer les bases de données sous MySQL ou MariaDB, l'application phpmyadmin est était la référence. On peut donc l'installer aussi dans un conteneur Docker.
Remarque: phpmyadmin existe déjà dans DSM et sert à gérer les bases MariaDB existantes mais nous allons utiliser une version "autonome" de DSM.

Mes tentatives d'installation d'un conteneur phpmyadmin, se sont pour toutes révélées infructueuses avec cette erreur fatale :

(38)Function not implemented: AH00141: Could not initialize random number generator

Cette erreur est dû à la version de Docker packagée par Synology et qui est trop ancienne (kernel trop ancien)... GRRRR !!!

Il faut donc trouver une alternative à phpmyadmin comme MySQL Workbench (n'a pas bien fonctionner dans Docker) ou une autre.

IV bis- Installation de Adminer

L'échec précédent m'a permis de découvrir Adminer et pour lequel il existe un paquet natif (pas desoin de dockeriser) disponible pour DSM (fourni par la communauté). Adminer peut administrer à la fois des bases de données MySQL mais aussi PostgreSQL et SQLite (contrairement à pgAdmin).

sqlpage adminer 1

On lance donc son installation après avoir accepter le message d'avertissement.

Il faut d'abord indiquer les plages réseaux qui seront accessibles. Dans mon cas, il s'agit des plages 192.168.1.x et 172.17.0.x (là où est installé le conteneur MySQL) et on lance l'installation.

sqlpage adminer 2

ATTENTION : Pour lancer, l'application Adminer, il faudra renseigner l'adresse : http://ip_du_nas/adminer (l'adresse par défaut ne fonctionnera pas avec le nom de domaine à cause de l'accès en http non autorisé renvoyant une erreur 403). Il faudra faire une redirection avec le reverse proxy certainement.

Quoi qu'il en soit on a maintenant un outil pour gérer nos bases de données !!! OUF. On va pouvoir maintenant connecter SQLPage (c'est le but de toutes ces manip quand même 😁) à une base de données MySQL !!!

IV ter- Recommandée : Installation de Adminer dans un conteneur Docker

Le problème avec l'installation précédente, c'est qu'il n'est pas possible d'accéder à Adminer de l'extérieur (ou du moins, je n'ai pas trouvé comment faire...). Du coup, je suis passé par une installation de Adminer dans un conteneur Docker (on commence à y être habitué maintenant...) en mode bridge sur le port 3333. Ensuite, on utilisera la fonction de Proxy Inversé (Reverse Proxy) du NAS avec un certificat Let's Encrypt comme d'habitude.
Source : https://hub.docker.com/r/amd64/adminer/

Le problème que j'ai rencontré, c'est avec le thème graphique qui n'était pas réglable suite à l'absence du fichier adminer.css à la racine du conteneur Docker. J'ai donc copié le thème adminer.css de l'installation précédente qui se trouve dans le dossier /volume1/web_packagesp/adminer/adminer.css avec la commande suivante dans le terminal du NAS :
sudo docker cp /volume1/web_packages/adminer/adminer.css adminer1:/var/www/html

Ensuite il faut modifier le propriétaire du fichier adminer.css avec la commande pour se connecter dans le terminal du conteneur adminer :

sudo docker exec -it --user root adminer1 /bin/bash

Et en tapant cette commande : chown adminer:adminer adminer.css

Pour activer les plugins qui sont fournis dans l'image (on peut aller les voir dans le terminal du conteneur), cela dépendra su type de plugins :

  • si le plugin n'a pas de paramètres à règler, on pourra l'utiliser directement via le paramètre ADMINER_PLUGINS et donner le nom des plugins voulus sans l'extension ".php" séparés par un espace.
  • Par contre si le plugin nécessite de renseigner des paramètres, il faudra créer un fichier avec le même nom que le plugin dans le dossier /var/www/html/plugins-enabled.
    Voici le contenu du fichier /var/www/html/plugins-enabled/login-password-less.php :

<?php

require_once('plugins/login-password-less.php');

/** Set allowed password

* @param string result of password_hash

*/

return new AdminerLoginPasswordLess(

$password_hash = ???

);

 

 

V - Création d'une base de données MySQL pour SQLPage

On se connecte à Adminer via l'adresse http://ip_du_nas/adminer en indiquant l'adresse du conteneur MySQL 172.17.0.1 et en tant que root :

sqlpage adminer 3

On va créer la base de données "sqlpage1" :

sqlpage adminer 4

sqlpage adminer 7

Après avoir appuyé sur le bouton "Enregistrer", on se crée un utilisateur "sqlpage" via le menu "Privilèges" :

sqlpage adminer 8

On renseigne le nom de l'utilisateur "sqlpage", on remplace "localhost" par "%" dans la colonne "Serveur" et on clique sur le bouton "Modifier" :
sqlpage adminer 9

 Là, on saisit un mot de passe pour l'utilisateur "sqlpage" et on lui accorde des droits "All privileges" et on clique sur le bouton "Enregistrer" en bas de page :

sqlpage adminer 10

On arrive alors sur une page nous indiquant le nouvel utilisateur "sqlpage" pour la base "sqlpage1" :

sqlpage adminer 11 

VI - Paramétrage de SQLPage pour utiliser la base de données MySQL

Maintenant, il reste à indiquer à SQLPage sur quelle base de données il va travailler. Cela va se faire grâce à un fichier "sqlpage.json" à placer dans le dossier "docker" -> "sqlpage1" -> "configuration" -> "sqlpage.json" :

sqlpage adminer 12

Voici le contenu du fichier "sqlpage.json" :

{
"database_url": "mysql://sqlpage:Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser..0.1:3306/sqlpage1"
}

Remarque : il faudra indiquer le mot de passe à l'aide de la syntaxe "pourcentage" pour les caractères spéciaux en s'aidant de cette page : https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding

Pour une base de données PostgreSQL (de la forme "postgre://utilisateur:mot_de_passe_utilisateur@IP_serveur_Postgre:5432/nom_base_de_données")

{
"database_url": "postgre://postgres:Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser..0.2:5432/nom_base_de_données"
}

 

VII - Installation de PostgreSQL et PGAdmin sur le NAS

On peut se reférer à ces 2 articles traitant de ces installations :

Pour la documentation concernant PostgreSQL, voir cette adresse : https://www.postgresql.org/docs/current/

 

VIII - Test d'utilisation de SQLPage avec la base de données MySQL

On peut utiliser l'exemple donné ici : https://github.com/lovasoa/SQLpage/tree/main/examples/simple-website-example. Il va être cependant nécessaire de l'adapter à mon cas...

On rapatrie d'abord les 5 fichiers .sql  dans le dossier docker -> sqlpage1 :

sqlpage 19

 On rapatrie aussi le dossier "migrations" dans le dossier docker -> sqlpage1 -> configuration :

sqlpage 20

 Ce dossier contient le fichier "0001_create_users_table.sql" :

sqlpage 21

 Voici le contenu du fichier "0001_create_users_table.sql" :

CREATE TABLE users (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
username TEXT NOT NULL
);

ATTENTION : il a fallu modifier "AUTOINCREMENT" par "AUTO_INCREMENT" pour ne pas avoir un message d'erreur !!!

On relance le conteneur docker de SQLPage et on obtient une belle page de test :

sqlpage 22

 

IX- Utilisation de Filezilla pour éditer les différents fichiers à distance

Pour cela, il faut permettre l'accès SFTP en redirigeant le port SSH dans la box (voir cet article où j'explique comment le faire sur une SFR Box : [Home Assistant] Accès extérieur à son NAS Syno et son Raspberry Pi 4 avec SFR Box6 en IPv6).

 

X- Utilisation des composants fournis dans SQLPage

Selon le type de bases de données, les requêtes ne s'écrivent pas de la même manière : il y a des diiférences selon si l'on travaille avec SQLite, MySQL ou PostgreSQL. Il fauda donc traduire les requêtes dans le langage de votre base de données, si nécessaire. Pour cela, vous pouvez utiliser ChatGPT par exemple : https://chat.openai.com. Pour info, ça n'a pas été tellement concluant lorsque j'ai voulu traduire l'exemple pour l'authentification de Postgre vers MySQL...

Astuce : pour récupérer rapidement les dossiers d'exemples fournis dans Github, on peut utiliser le site https://download-directory.github.io en fournissant le lien du dossier voulu. On gagne énormément de temps !!!

Pour avoir une page d'authentification avec une base de données Postgres : https://github.com/lovasoa/SQLpage/tree/main/examples/user-authentication.

 

XI- Installation pour test de "École inclusive"

Comme indiqué au début, c'est suite à un article paru sur le site https://linuxfr.org que j'ai découvert SQLPage à travers l'application "École inclusive". Du coup, comme son auteur DSMejantel, que je remercie pour le partage, a mis ses sources en ligne, il est possible de tester en réel son application et ainsi mieux appréhender son fonctionnement.
Sources :  https://forge.apps.education.fr/dsoulie/Ecole_inclusive.

Il s'agit d'un base de données Sqlite, ce qui est une première pour moi (après MySQL et PostgreSQL, la boucle est bouclée 😀). Du coup, il a été nécessaire d'affecter les bons droits d'accès aux dossiers Docker. Pour les NAS Synology, il faut que le dossier "Docker" (contenant les dossiers pour fonctionner avec les conteneurs) soit configuré avec le propriétaire "EVERYONE" avec droit de lecture/écriture de façon récursive pour les sous-dossiers et fichiers (source : https://kb.synology.com/fr-fr/DSM/tutorial/Docker_container_cant_access_the_folder_or_file).
Une fois, ce réglage effectué, on dépose les fichiers sources dans le dossier Docker avec 2 variantes adaptées à mon NAS :

  • le dossier "Configuration" qui contient le dossier "sqlpage" de la source avec les dossiers "migrations", "templates" et le fichier "sqlpage.json" (voir plus haut lors du paramétrage du conteneur Docker) : ce dossier contient le dossier "/etc/sqlpage" du conteneur et est en lecture seule.
  • le dossier "sqlpage" qui est vide au départ mais dans lequel sera stockée la base de données SQLite "sqlpage.db".

sqlpage sqlite 1

Une fois toutes ces manipulations faites, on lance le conteneur Sqlpage et l'application en ligne devrait être accessible ! En cas d'erreur, le conteneur s'arrêtera juste après son lancement.
Il ne reste plus qu'à tester... Le compte administrateur est "admin" avec comme mot de passe "admin" mais devra être modifier à la première connexion.
 

Conclusion

Maintenant que le test est largement concluant, il ne reste plus qu'à investir SQLPage pour arriver à proposer des applications en ligne s'appuyant sur des bases de données. En s'appuyant sur l'application "École Inclusive", on a là une bonne base d'étude. À creuser...