From 3922b8fd5bb48d096fab6a631e04cf4fac617f12 Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 11 Jan 2026 15:11:24 -0500 Subject: [PATCH] Checkpoint: Correction du lien QR code pour utiliser l'URL publique MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modifications apportées : - Création de server/_core/appUrl.ts : fonction getAppBaseUrl() pour gérer l'URL de base - Modification de server/qrCodeGenerator.ts : utilise getAppBaseUrl() au lieu de localhost - Support de plusieurs variables d'environnement (APP_PUBLIC_URL, DOMAIN_NAME, SERVER_URL) - Création du guide CONFIGURATION_URL_PUBLIQUE.md avec instructions détaillées - Création du script configure-public-url.sh pour faciliter la configuration Configuration requise sur le serveur VPS : Ajouter dans le fichier .env : APP_PUBLIC_URL=https://formations.itinova.org Puis redémarrer l'application avec PM2 ou systemd. Les QR codes générés utiliseront maintenant l'URL publique configurée au lieu de localhost. --- CONFIGURATION_URL_PUBLIQUE.md | 66 +++++++++++++++++++++++++++++++++ scripts/configure-public-url.sh | 63 +++++++++++++++++++++++++++++++ server/_core/appUrl.ts | 32 ++++++++++++++++ server/qrCodeGenerator.ts | 7 +++- todo.md | 2 + 5 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 CONFIGURATION_URL_PUBLIQUE.md create mode 100755 scripts/configure-public-url.sh create mode 100644 server/_core/appUrl.ts diff --git a/CONFIGURATION_URL_PUBLIQUE.md b/CONFIGURATION_URL_PUBLIQUE.md new file mode 100644 index 0000000..3b1885c --- /dev/null +++ b/CONFIGURATION_URL_PUBLIQUE.md @@ -0,0 +1,66 @@ +# Configuration de l'URL publique pour les QR codes + +## Problème +Les QR codes générés pointent vers `http://localhost:3000` au lieu de l'URL publique de l'application. + +## Solution +Configurer la variable d'environnement `APP_PUBLIC_URL` sur le serveur VPS. + +## Étapes de configuration sur le serveur VPS + +### 1. Se connecter au serveur +```bash +ssh votre-utilisateur@votre-serveur +``` + +### 2. Éditer le fichier .env +```bash +cd /chemin/vers/formation-manager-itinova +nano .env +``` + +### 3. Ajouter la variable APP_PUBLIC_URL +Ajoutez cette ligne dans le fichier `.env` : +``` +APP_PUBLIC_URL=https://formations.itinova.org +``` + +### 4. Redémarrer l'application +```bash +# Si vous utilisez PM2 +pm2 restart formation-manager-itinova + +# Ou si vous utilisez systemd +sudo systemctl restart formation-manager-itinova +``` + +### 5. Vérifier que ça fonctionne +1. Connectez-vous à l'interface formateur +2. Générez un nouveau QR code pour une séquence +3. Scannez le QR code avec votre téléphone +4. Vérifiez que l'URL commence par `https://formations.itinova.org/emargement/...` + +## Alternative : Utiliser DOMAIN_NAME +Si vous préférez, vous pouvez aussi utiliser : +``` +DOMAIN_NAME=formations.itinova.org +``` +Le système ajoutera automatiquement le `https://` devant. + +## Vérification rapide +Pour vérifier que la variable est bien prise en compte, vous pouvez : +```bash +# Afficher les variables d'environnement de l'application +pm2 env 0 # ou le numéro de votre processus + +# Ou redémarrer et vérifier les logs +pm2 restart formation-manager-itinova +pm2 logs formation-manager-itinova +``` + +## Note importante +⚠️ **Après avoir ajouté la variable d'environnement, vous DEVEZ redémarrer l'application** pour que les changements soient pris en compte. + +## Fichiers modifiés +- `server/_core/appUrl.ts` : Nouvelle fonction pour gérer l'URL de base +- `server/qrCodeGenerator.ts` : Utilise maintenant `getAppBaseUrl()` au lieu de `localhost` diff --git a/scripts/configure-public-url.sh b/scripts/configure-public-url.sh new file mode 100755 index 0000000..abc3c35 --- /dev/null +++ b/scripts/configure-public-url.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Script de configuration de l'URL publique pour les QR codes +# Usage: ./scripts/configure-public-url.sh + +set -e + +echo "==========================================" +echo "Configuration de l'URL publique" +echo "==========================================" +echo "" + +# Chemin du fichier .env +ENV_FILE=".env" + +# Vérifier si le fichier .env existe +if [ ! -f "$ENV_FILE" ]; then + echo "Création du fichier .env..." + touch "$ENV_FILE" +fi + +# Demander l'URL publique +echo "Entrez l'URL publique de votre application (ex: https://formations.itinova.org) :" +read PUBLIC_URL + +# Vérifier que l'URL commence par http:// ou https:// +if [[ ! $PUBLIC_URL =~ ^https?:// ]]; then + echo "❌ Erreur : L'URL doit commencer par http:// ou https://" + exit 1 +fi + +# Vérifier si APP_PUBLIC_URL existe déjà dans le fichier +if grep -q "^APP_PUBLIC_URL=" "$ENV_FILE"; then + echo "La variable APP_PUBLIC_URL existe déjà dans .env" + echo "Voulez-vous la remplacer ? (o/n)" + read REPLACE + if [ "$REPLACE" = "o" ] || [ "$REPLACE" = "O" ]; then + # Remplacer la ligne existante + sed -i "s|^APP_PUBLIC_URL=.*|APP_PUBLIC_URL=$PUBLIC_URL|" "$ENV_FILE" + echo "✅ Variable APP_PUBLIC_URL mise à jour : $PUBLIC_URL" + else + echo "❌ Configuration annulée" + exit 0 + fi +else + # Ajouter la variable + echo "" >> "$ENV_FILE" + echo "# URL publique de l'application (pour les QR codes)" >> "$ENV_FILE" + echo "APP_PUBLIC_URL=$PUBLIC_URL" >> "$ENV_FILE" + echo "✅ Variable APP_PUBLIC_URL ajoutée : $PUBLIC_URL" +fi + +echo "" +echo "==========================================" +echo "Configuration terminée !" +echo "==========================================" +echo "" +echo "⚠️ IMPORTANT : Vous devez redémarrer l'application pour que les changements soient pris en compte." +echo "" +echo "Commandes de redémarrage :" +echo " - Avec PM2 : pm2 restart formation-manager-itinova" +echo " - Avec systemd : sudo systemctl restart formation-manager-itinova" +echo "" diff --git a/server/_core/appUrl.ts b/server/_core/appUrl.ts new file mode 100644 index 0000000..5bc793a --- /dev/null +++ b/server/_core/appUrl.ts @@ -0,0 +1,32 @@ +/** + * Récupère l'URL de base de l'application + * En production, utilise l'URL publique configurée + * En développement, utilise localhost + */ +export function getAppBaseUrl(): string { + // Si une URL publique est configurée, l'utiliser + if (process.env.APP_PUBLIC_URL) { + return process.env.APP_PUBLIC_URL; + } + + // En production, essayer de détecter l'URL depuis les variables d'environnement Manus + if (process.env.NODE_ENV === "production") { + // Pour les applications Manus déployées, l'URL est généralement disponible + // via les variables d'environnement du système + const port = process.env.PORT || 3000; + + // Si on est sur un serveur VPS avec un domaine configuré + if (process.env.DOMAIN_NAME) { + return `https://${process.env.DOMAIN_NAME}`; + } + + // Sinon, utiliser l'URL du serveur si disponible + if (process.env.SERVER_URL) { + return process.env.SERVER_URL; + } + } + + // Par défaut, utiliser localhost (développement) + const port = process.env.PORT || 3000; + return `http://localhost:${port}`; +} diff --git a/server/qrCodeGenerator.ts b/server/qrCodeGenerator.ts index 0c961d1..cb12551 100644 --- a/server/qrCodeGenerator.ts +++ b/server/qrCodeGenerator.ts @@ -1,5 +1,6 @@ import QRCode from "qrcode"; import { randomBytes } from "crypto"; +import { getAppBaseUrl } from "./_core/appUrl"; /** * Générer un token unique pour le QR code @@ -15,7 +16,8 @@ export function generateQRToken(): string { */ export async function generateQRCodeDataURL(token: string): Promise { // URL complète pour scanner le QR code - const url = `${process.env.VITE_APP_URL || "http://localhost:3000"}/emargement/${token}`; + const baseUrl = getAppBaseUrl(); + const url = `${baseUrl}/emargement/${token}`; try { const qrCodeDataURL = await QRCode.toDataURL(url, { @@ -42,7 +44,8 @@ export async function generateQRCodeDataURL(token: string): Promise { * @returns Un buffer PNG du QR code */ export async function generateQRCodeBuffer(token: string): Promise { - const url = `${process.env.VITE_APP_URL || "http://localhost:3000"}/emargement/${token}`; + const baseUrl = getAppBaseUrl(); + const url = `${baseUrl}/emargement/${token}`; try { const buffer = await QRCode.toBuffer(url, { diff --git a/todo.md b/todo.md index f0ddacc..f800db1 100644 --- a/todo.md +++ b/todo.md @@ -679,3 +679,5 @@ - [x] Ajouter downlevelIteration dans tsconfig.json - [x] Corriger l'utilisation de Set dans DateFormationMultiSelect.tsx - [x] Corriger l'appel à createAttestation (utiliser enregistrerAttestation) + +- [x] Corriger le lien QR code pour utiliser l'URL publique au lieu de localhost