Checkpoint: Correction du lien QR code pour utiliser l'URL publique

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.
This commit is contained in:
Manus
2026-01-11 15:11:24 -05:00
parent 3981d719e3
commit 3922b8fd5b
5 changed files with 168 additions and 2 deletions

View File

@@ -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`

63
scripts/configure-public-url.sh Executable file
View File

@@ -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 ""

32
server/_core/appUrl.ts Normal file
View File

@@ -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}`;
}

View File

@@ -1,5 +1,6 @@
import QRCode from "qrcode"; import QRCode from "qrcode";
import { randomBytes } from "crypto"; import { randomBytes } from "crypto";
import { getAppBaseUrl } from "./_core/appUrl";
/** /**
* Générer un token unique pour le QR code * 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<string> { export async function generateQRCodeDataURL(token: string): Promise<string> {
// URL complète pour scanner le QR code // 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 { try {
const qrCodeDataURL = await QRCode.toDataURL(url, { const qrCodeDataURL = await QRCode.toDataURL(url, {
@@ -42,7 +44,8 @@ export async function generateQRCodeDataURL(token: string): Promise<string> {
* @returns Un buffer PNG du QR code * @returns Un buffer PNG du QR code
*/ */
export async function generateQRCodeBuffer(token: string): Promise<Buffer> { export async function generateQRCodeBuffer(token: string): Promise<Buffer> {
const url = `${process.env.VITE_APP_URL || "http://localhost:3000"}/emargement/${token}`; const baseUrl = getAppBaseUrl();
const url = `${baseUrl}/emargement/${token}`;
try { try {
const buffer = await QRCode.toBuffer(url, { const buffer = await QRCode.toBuffer(url, {

View File

@@ -679,3 +679,5 @@
- [x] Ajouter downlevelIteration dans tsconfig.json - [x] Ajouter downlevelIteration dans tsconfig.json
- [x] Corriger l'utilisation de Set dans DateFormationMultiSelect.tsx - [x] Corriger l'utilisation de Set dans DateFormationMultiSelect.tsx
- [x] Corriger l'appel à createAttestation (utiliser enregistrerAttestation) - [x] Corriger l'appel à createAttestation (utiliser enregistrerAttestation)
- [x] Corriger le lien QR code pour utiliser l'URL publique au lieu de localhost