Les environnements de développement
Le développement a été réalisé avec le studio VScode.
Installations préliminaires requises:
node (npm), installé parnvm.yarn(plutôt quenpm) gère les dépendances envers les modules externes.webpackest utilisé pour le packaging mais est installé directement dans les applications.
L’application Web est basée sur Vue.js (vuejs.org) avec la surcouche Quasar (quasar.dev).
- HTML et SASS (et non CSS),
- Javascript.
piniagère les stores.
Les services sont du pur Node.js (Javascript), ainsi que l’utilitaire upload.
Le dépôt des applications est assuré sur github.com.
Développement de l’application Web
Il s’effectue depuis le projet asocial-app.
L’installation de quasar-cli a une logique difficile à interpréter. Ci-dessous le processus sous Ubuntu 24.04 et yarn 4.4.1 :
- hors projet:
npm i -g quasar-cli -
puis, une première fois dans le projet:
npm install // puis enlever package.json.lock yarn install // ultérieurement on peut utiliser: yarn install
Le mélange à éviter npm/yarn est apparu temporairement nécessaire. Les commandes directes quasar ... ne fonctionnent pas malgré l’installation globale (il faut yarn quasar ... devant).
Problèmes de build des binaires
Concerne a minima better-sqlite3 qui a besoin d’être buildé.
yarn le fait, MAIS il faut avoir installé build-tools:
npm install build-tools -g
Lancement du serveur de test:
yarn quasar dev -m pwa // oui yarn ...
Build et test de la build:
yarn quasar build -m pwa
# OU
npm run build:pwa
# https://github.com/http-party/http-server
# Installation: npm install -g http-server
npx http-server dist/pwa -p 8080 --cors -S --cert ../asocial-srv/keys/fullchain.pem --key ../asocial-srv/keys/privkey.pem
# Plus simplement
npx http-server dist/pwa -p 8080 --cors
L’application est une PWA (Progressive Web App) avec gestion d’un service_worker.
En pratique on déploie directement l’application buildée dans
github.io.
Principaux modules requis
core-js: vue3animate.cssmsgpack: sérialisation / désérialisation d’objets Javascript.axios: accès HTTP.dexie: accès aux bases IDB.emoji-mart-vue-fast: saisie d’emojis.file-saver: sauvegarde d’un fichier dans le browser.mime2ext: conversion de type MIME n code d’extensions de fichier.vue-showdowngithub-markdown-css: transformation d’un MD en HTML.vue-advanced-cropper: gestion locale d’une image (resize / crop).pako: compression / décompression GZIP de binaires.simple-keyboard: keyboard utilisable à la souris pour la saisie des phrases secrètes.webcam-eaysy: gestion de la webcam.js-sha256: hash SHA256 synchrone.vue vue-i18n vue-router pinia: modules devuequasar
Lire le détail dans package.json
Remarques pour i18n. Dans src/boot/i18.js
- ajouter
legacy: false,sinon choix-langue ne s’initialise pas bien. - importer
configStorepour récupérer la valeur initiale de la locale.
Fichier quasar.config.js
Les personnalisations majeures sont:
build.extendWebpack (cfg): règles pour le chargement des.md .txt .svgdevServer: la configuration minimale (choix du port) pour le test.
Configuration de VScode pour le debug
Elle se fait dans launch.json.
-
Depuis VScode »> Run »> Open configurations
{ "version": "0.2.0", "configurations": [ { "type": "chrome", "request": "launch", "name": "Quasar App: chrome", "url": "http://localhost:8081?demo", "webRoot": "${workspaceFolder}/src", "sourceMapPathOverrides": { "webpack://asocial/./src/*": "${webRoot}/*" } } ] }
Le serveur de test (qui fait un build local) se lance par: yarn quasar dev -m pwa
Voir le détail dans le document applicationWeb.md
Développement des services
Le développement des services OP, PUBSUB, OP+PUBSUB et des tools (export-db …) se fait dans le même projet asocial-srv.
Les services sont à la base des serveurs HTTP même quand ils sont déployés en cloud functions. L’outil tools est de facto une application locale nodejs.
Principaux modules requis
@aws-sdk...: 5 modules implémentant l’interface AWS S3.@google-cloud...: 3 modules requis pour accès à Firestore, storage et d’interfaçage du logging Winston.@open-wc/webpack-import-meta-loader: Webpack loader for supporting import.meta in webpack.msgpack: sérialisation / désérialisation d’objets Javascript.js-sha256: hash SHA256 synchrone. Invoqué depuis LE module commun à l’applicationWeb (qui ne dépend pas de nodejs) et les services.express: serveur HTTP.better-sqlite3: accès à la base SQLite.node-args: pour lire les arguments de la ligne de commande pour tools.node-fetch: pour le service OP quand il doit soumettre des requêtes à PUBSUB.web-push: envoi de notifications aux browsers des sessions Web.winston: gestionnaire de logs.
Serveur de test
Depuis l’environnement de développement on peut lancer:
node src/server.js: service OP ou OP+PUBSUB selon la configuration desrc/config.mjsnode src/pubsub.js: service PUBSUB (seul).node src/tools.mjs ...: outils de tools.node src/gensecret.mjs: cryptage du fichier confidentielkeys.jsonensrc/secret.mjs
Selon la configuration src/config.js il faut mettre en place des folders / fichiers pour supporter la base de données et l’espace de stockage.
En cas de test en HTTPS, les deux fichiers fullchain.pem privkey.pem doivent être présents dans le folder keys.
Base de données SQLite
L’outil DB Browser for SQLite est utilisé pour déclarer le schéma (voir le visualiser / modifier) et parcourir les données.
Le folder sqlite contient :
schema.sql: le schéma de la base qui peut être traité par DB Browser for SQLite.delete.sql: reset des données d’une base.testa.db3testb.db3: deux bases de données courantes de test.test1a.bk: backup #1 de la base SQLitea.- les scripts de backup / restore en shell
.shet powershell.ps1:bkp.sh bkp.ps1 rst.sh rst.ps1- argument 1: numéro de la sauvegarde,
- argument 2: lettre de la base.
Le mode WAL de SQLite
Ce mode implique que deux fichiers test.db3-shm et test.db3-wal existent après exécution d’un test et sont requis.
La commende ./bk1.sh 2 a (extension .ps1 en Windows) effectue dans sqlite un backup de la base courante a dans le fichier test2a.bk. On peut ainsi avoir plusieurs backups de base pris à des instants différents. Ce fichier est propre et a intégré les transactions en cours dans le WAL.
La commande ./rst.sh 2 a restaure le backup test2a.bk sur la base courante a et à ce moment il n’y a ni -wal ni -shm. A la limite le fichier testa.db3 pourrait, à cet instant, être stocké et diffusé, pour autant que la base ne soit pas ouverte par ailleurs par exemple par DB Browser.
Storage fs (file-system)
Le folder déclaré à la configuration (fstoragea fstorageb …) doit exister.
Storage gc (Google Cloud)
Il est géré par l’émulateur (voir ci-après) et n’a pas à être déclaré ailleurs.
- les backups exportés de l’émulateur sont stockés dans
emulators/bk. keys.jsondoit contenir l’entréeservice_account.
Storage s3 (AWS S3)
En test installer minio (https://min.io/).
- son fichier de configuration est
minio.json. - sa base de fichiers est localisée à l’installation de
minio(typiquement~minio/). - son token est déclaré dans
keys.jsondanss3_config.
Développement Firestore
Il y a une dualité entre Firebase et GCP (Google Cloud Platform):
firestore, storage, functionssont effectivement hébergés sur GCP.- la console Firebase propose une vue et des fonctions plus simples d’accès mais moins complètes.
- il faut donc parfois retourner à la console GCP pour certaines opérations.
Consoles:
https://console.cloud.google.com/
https://console.firebase.google.com/
Lancer les commandes firebase depuis ./emulators
Quelques fichiers de configuration y sont installés:
.firebaserc
-
évite de spécifier le code projet sur chaque commande.
{ "projects": { "default": "asocial-test1" } }
firebase.json
-
indique à emulator où se trouvent ses fichiers et fixe le port de l’émulator de Firestore à sa valeur qui n’est PAS celle par défaut.
{ "firestore": { "rules": "firestore.rules", "indexes": "firestore.indexes.json" }, "emulators": { "singleProjectMode": true, "firestore": { "port": "8085" }, "ui": { "enabled": true, "port": 4000 } }, "storage": { "rules": "storage.rules" } }
firestore-debug.log
- un log.
Les trois fichiers de configurations importants sont:
firestore.indexes.jsonfirestore.rulesstorages.rules
CLI Firebase
https://firebase.google.com/docs/cli
Installation ou mise à jour de l’installation
npm install -g firebase-tools
Authentification
firebase login
MAIS ça ne suffit pas toujours, il faut parfois se ré-authentifier:
firebase login --reauth
Delete ALL collections
Aide: firebase firestore:delete -
firebase firestore:delete --all-collections -r -f
ATTENTION: ça purge la base de production sans trop demander de confirmation.
Déploiement des index et rules
Les fichiers sont:
emulators/firestore.indexes.json-
emulators/firestore.rules# Déploiement (import) firebase deploy --only firestore:indexes Export des index dans firestore.indexes.json firebase firestore:indexes > firestore.indexes.EXP.json
Pour emulators/storage.rules, intervenir directement dans la console firebase (pas trouvé comment le déployer).
Emulator
Dans src/config.mjs remplir la section env:
env: {
// On utilise env pour EMULATOR
STORAGE_EMULATOR_HOST: 'http://127.0.0.1:9199', // 'http://' est REQUIS
FIRESTORE_EMULATOR_HOST: 'localhost:8085'
},
Le port par défaut de FIRESTORE_EMULATOR_HOST étant 8080 il se télescope avec celui par défaut du serveur (en particulier pour déploiement GAE): lui affecter 8085.
Remarques:
- Pour storage:
- le nom de variable a changé au cours du temps. C’est bien STORAGE_…
- il faut
http://devant le host sinon il tente https.
- Le port par défaut de
FIRESTORE_EMULATOR_HOSTétant8080il se télescope avec celui par défaut du serveur (en particulier pour déploiement GAE): lui affecter8085. - En cas de message
cannot determine the project_id ...export GOOGLE_CLOUD_PROJECT="asocial-test1"
Commandes usuelles:
# depuis ./emulators
# Lancement avec mémoire vide:
firebase emulators:start --project asocial-test1
# Lancement avec chargée depuis un import:
firebase emulators:start --import=./bk/t1
# Le terminal reste ouvert. Arrêt par CTRL-C (la mémoire est perdue)
En cours d’exécution, on peut faire un export depuis un autre terminal:
firebase emulators:export ./bk/t2 -f
Consoles Web sur les données:
http://127.0.0.1:4000/firestore
http://127.0.0.1:4000/storage
Storage S3 : par min.io
min.io est une application serveur qui offre un service de Storage selon le protocole S3 de AWS.
Son usage local permet de tester un accès par l’API AWS-S3, sachant qu’il existe plusieurs fournisseurs proposant ce service (pas seulement AWS).
Un objet de configuration, nommé par exemple S3_config a la syntaxe suivante dans keys.json:
"s3_config" : {
"credentials": {
"accessKeyId": "access-asocial",
"secretAccessKey": "secret-asocial"
},
"endpoint": "http://localhost:9000",
"region": "us-east-1",
"forcePathStyle": true,
"signatureVersion": "v4"
}
Les clés access et secret sont données par le fournisseur d’accès choisi.
Installation locale de min.io
https://min.io/docs/minio/linux/index.html
https://min.io/docs/minio/windows/index.html
Après download / install, se placer dans le répertoire choisi (ici D:\minio) et lancer le server :
./minio server start
Il s’affiche l’URL de la console et l’URL de l’API (celle du endpoint ci-avant). Ouvrir la console:
- Ouvrir
Access-Keyet créer les clés. Il est possible de donner un string en clair comme ci-dessus. - Ouvrir
Bucketset créer un bucketasocial.
On peut browser le contenu d’un bucket depuis la console.
Création / gestion d’un Google account
Suivre les instructions de Google.
Création d’un service_account Google
https://cloud.google.com/iam/docs/service-accounts-create
https://cloud.google.com/iam/docs/keys-create-delete#creating
Accéder au(x) service_account depuis la console
menu hamburger >> IAM & Admin >> Service Accounts- il y a 4 onglets. C’est l’onglet
KEYSqui permet d’en générer un. - Bouton
ADD KEYet choisirCreate New Key - choisir le format JSON : ceci download le fichier.
- le sauvegarder en lieu sûr, il est impossible de le récupérer à nouveau.
- on pourra seulement détruire cette clé,
-
en récréer une nouvelle comme décrit ci-dessus.
"service_account" : { "type": "service_account", "project_id": "asocial-test1", "private_key_id": "...", "private_key": "-----BEGIN PRIVATE KEY-----\n ... -----END PRIVATE KEY-----\n", "client_email": "asocial-test1@appspot.gserviceaccount.com", "client_id": "...", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/asocial-test1%40appspot.gserviceaccount.com", "universe_domain": "googleapis.com" }
In fine, le texte de ce json est intégré dans keys.json.
gcloud CLI - CLI Google Cloud
https://cloud.google.com/sdk/docs/install
Remarque ancienne: NE PAS utiliser ADC
Auth gcloud ADC: mais c’est “temporaire”
- gcloud auth application-default login
Revoke ADC:
- gcloud auth application-default revoke
OU : ça marche aussi, différence avec au-dessus ? ca dure encore moins longtemps !!!!
-
gcloud auth application-default login –impersonate-service-account daniel.sportes@gmail.com
Linux, macOS: $HOME/.config/gcloud/application_default_credentials.json
Windows: %APPDATA%\gcloud\application_default_credentials.json