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:
66
CONFIGURATION_URL_PUBLIQUE.md
Normal file
66
CONFIGURATION_URL_PUBLIQUE.md
Normal 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
63
scripts/configure-public-url.sh
Executable 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
32
server/_core/appUrl.ts
Normal 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}`;
|
||||||
|
}
|
||||||
@@ -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, {
|
||||||
|
|||||||
2
todo.md
2
todo.md
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user