Réalisations

Etude de cas SQL

Relativement.com : un site culturel administrable, optimise et securise

Relativement.com est un bon exemple de projet fullstack pragmatique : une interface publique claire, une administration de contenus, une base SQL et un vrai travail sur les images pour garder un site rapide malgre un volume media important.

Identite visuelle de la Cie Relativement

Structure technique

Le projet repose sur un backend Node.js avec Express et TypeScript, connecte a une base MySQL via les paquets mysql et mysql2. Cette base relationnelle convient bien aux contenus qui ont des relations stables : utilisateurs, pages, spectacles, images, textes et donnees d'administration.

Cote interface, le projet utilise React et un kit de blocs reutilisable autour de Tiptap. Cette approche evite de figer chaque page dans du HTML statique : les contenus peuvent etre composes avec des blocs texte/image tout en gardant une structure maintenable.

SEO et logique WebP

Le point sensible d'un site culturel est souvent le poids des images. Ici, un script dedie analyse les sources non-WebP, cree les versions WebP manquantes avec Sharp, limite les dimensions et archive les fichiers source. C'est une logique saine pour le SEO : pages plus legeres, chargement plus rapide et meilleure experience mobile.

Le script reste prudent : il peut tourner en dry-run, signaler les WebP manquants, puis appliquer la conversion seulement quand la verification est faite. Cette methode reduit le risque de casser des medias deja publies.

Ameliorations SEO

Le travail SEO a surtout consiste a rendre un site riche en medias plus leger et plus maintenable : conversion WebP, limitation des dimensions, archivage des sources lourdes, verification des chemins images et conservation d'une structure de contenu claire.

Le resultat attendu est simple : moins de poids sur les pages, une meilleure experience mobile, des images mieux servies et des contenus administrables qui restent lisibles pour les visiteurs comme pour les moteurs.

Securite backend

L'authentification locale s'appuie sur bcryptjs avec un cout de hashage de 12. Les mots de passe ne sont donc pas stockes en clair. Le backend verifie aussi la robustesse minimale des nouveaux mots de passe : longueur, majuscule, minuscule, chiffre et caractere special.

La logique d'acces s'inscrit dans une approche simple et robuste : hashage serveur, tokens d'action pour la reinitialisation, configuration via variables d'environnement et separation des services SQL.

Exemples de code

Ces extraits viennent du depot GitHub du projet. Ils montrent les choix importants sans exposer de secret : les identifiants restent lus depuis la configuration serveur.

Hashage bcrypt avant stockage

function hashPassword(password: string): Promise<string> {
  return new Promise((resolve, reject) => {
    bcrypt.hash(password, 12, (err, hash) => err ? reject(err) : resolve(hash));
  });
}

Pool MySQL configure cote backend

var pool = mysql.createPool({
  connectionLimit: 10,
  host: config.sql.url,
  user: config.sql.login,
  password: config.sql.password,
  database: config.sql.dbname,
  port: config.sql.port
});

Ce que ce projet montre

Voir le site Relativement.com Profil GitHub Voir la fiche portfolio