feat: normaliser les URL production par entité
Some checks failed
Validation applicative / TypeScript, tests et build (push) Failing after 1m35s
Some checks failed
Validation applicative / TypeScript, tests et build (push) Failing after 1m35s
This commit is contained in:
@@ -22,7 +22,7 @@ nano .env
|
|||||||
### 3. Ajouter la variable APP_PUBLIC_URL
|
### 3. Ajouter la variable APP_PUBLIC_URL
|
||||||
Ajoutez cette ligne dans le fichier `.env` :
|
Ajoutez cette ligne dans le fichier `.env` :
|
||||||
```
|
```
|
||||||
APP_PUBLIC_URL=https://formations.itinova.org
|
APP_PUBLIC_URL=https://formations-itinova.santinova-soft.org
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Redémarrer l'application
|
### 4. Redémarrer l'application
|
||||||
@@ -38,7 +38,7 @@ sudo systemctl restart formation-manager-itinova
|
|||||||
1. Connectez-vous à l'interface formateur
|
1. Connectez-vous à l'interface formateur
|
||||||
2. Générez un nouveau QR code pour une séquence
|
2. Générez un nouveau QR code pour une séquence
|
||||||
3. Scannez le QR code avec votre téléphone
|
3. Scannez le QR code avec votre téléphone
|
||||||
4. Vérifiez que l'URL commence par `https://formations.itinova.org/emargement/...`
|
4. Vérifiez que l'URL commence par `https://formations-itinova.santinova-soft.org/emargement/...`
|
||||||
|
|
||||||
## Alternative : Utiliser DOMAIN_NAME
|
## Alternative : Utiliser DOMAIN_NAME
|
||||||
Si vous préférez, vous pouvez aussi utiliser :
|
Si vous préférez, vous pouvez aussi utiliser :
|
||||||
|
|||||||
@@ -170,12 +170,12 @@ Si tout se passe bien, vous verrez un message de succès indiquant que le certif
|
|||||||
Testez que votre site est accessible en HTTPS :
|
Testez que votre site est accessible en HTTPS :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -I https://formations.itinova.org
|
curl -I https://formations-itinova.santinova-soft.org
|
||||||
```
|
```
|
||||||
|
|
||||||
Vous devriez voir une réponse HTTP/2 200 OK.
|
Vous devriez voir une réponse HTTP/2 200 OK.
|
||||||
|
|
||||||
Ouvrez votre navigateur et accédez à `https://formations.itinova.org`. Vous devriez voir :
|
Ouvrez votre navigateur et accédez à `https://formations-itinova.santinova-soft.org`. Vous devriez voir :
|
||||||
- Un cadenas vert dans la barre d'adresse
|
- Un cadenas vert dans la barre d'adresse
|
||||||
- Votre application fonctionnant normalement
|
- Votre application fonctionnant normalement
|
||||||
- Aucun avertissement de sécurité
|
- Aucun avertissement de sécurité
|
||||||
|
|||||||
4
app.json
4
app.json
@@ -3,8 +3,8 @@
|
|||||||
"name": "Formation Manager",
|
"name": "Formation Manager",
|
||||||
"category": "ITINOVA",
|
"category": "ITINOVA",
|
||||||
"urls": {
|
"urls": {
|
||||||
"recette": "https://formations.recette.santinova-soft.org",
|
"recette": "https://formations-itinova.recette.santinova-soft.org",
|
||||||
"prod": "https://formations.santinova-soft.org"
|
"prod": "https://formations-itinova.santinova-soft.org"
|
||||||
},
|
},
|
||||||
"containerName": "formation-manager-itinova",
|
"containerName": "formation-manager-itinova",
|
||||||
"image": "images/formation-manager.png",
|
"image": "images/formation-manager.png",
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ export default function AdminEmailTemplates() {
|
|||||||
.replace(/\{\{formateur\}\}/g, 'Jean Martin')
|
.replace(/\{\{formateur\}\}/g, 'Jean Martin')
|
||||||
.replace(/\{\{couleurPrincipale\}\}/g, formData.couleurPrincipale)
|
.replace(/\{\{couleurPrincipale\}\}/g, formData.couleurPrincipale)
|
||||||
.replace(/\{\{couleurSecondaire\}\}/g, formData.couleurSecondaire)
|
.replace(/\{\{couleurSecondaire\}\}/g, formData.couleurSecondaire)
|
||||||
.replace(/\{\{lienReinitialisation\}\}/g, 'https://formations.itinova.org/reset-password/token123')
|
.replace(/\{\{lienReinitialisation\}\}/g, 'https://formations-itinova.santinova-soft.org/reset-password/token123')
|
||||||
.replace(/\{\{datesHTML\}\}/g, '<div class="date-item"><strong>Date 1 :</strong> lundi 15 janvier 2025</div><div class="date-item"><strong>Date 2 :</strong> mardi 16 janvier 2025</div>');
|
.replace(/\{\{datesHTML\}\}/g, '<div class="date-item"><strong>Date 1 :</strong> lundi 15 janvier 2025</div><div class="date-item"><strong>Date 2 :</strong> mardi 16 janvier 2025</div>');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ export default function AdminParametres() {
|
|||||||
<Input
|
<Input
|
||||||
id="urlPublique"
|
id="urlPublique"
|
||||||
type="url"
|
type="url"
|
||||||
placeholder="https://formations.itinova.org"
|
placeholder="https://formations-itinova.santinova-soft.org"
|
||||||
value={urlPublique}
|
value={urlPublique}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setUrlPublique(e.target.value);
|
setUrlPublique(e.target.value);
|
||||||
@@ -169,7 +169,7 @@ export default function AdminParametres() {
|
|||||||
</div>
|
</div>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
Cette URL est utilisée pour générer les QR codes d'émargement.
|
Cette URL est utilisée pour générer les QR codes d'émargement.
|
||||||
Exemple : https://formations.itinova.org (sans slash à la fin)
|
Exemple : https://formations-itinova.santinova-soft.org (sans slash à la fin)
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ services:
|
|||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
|
APP_PUBLIC_URL: https://formations-itinova.santinova-soft.org
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
PORT: 3000
|
PORT: 3000
|
||||||
TRUST_PROXY: 1
|
TRUST_PROXY: 1
|
||||||
@@ -29,7 +30,7 @@ services:
|
|||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.docker.network=web"
|
- "traefik.docker.network=web"
|
||||||
- "traefik.http.routers.formations-prod.entrypoints=websecure"
|
- "traefik.http.routers.formations-prod.entrypoints=websecure"
|
||||||
- "traefik.http.routers.formations-prod.rule=Host(`formations.santinova-soft.org`)"
|
- "traefik.http.routers.formations-prod.rule=Host(`formations.santinova-soft.org`) || Host(`formations-itinova.santinova-soft.org`)"
|
||||||
- "traefik.http.routers.formations-prod.tls=true"
|
- "traefik.http.routers.formations-prod.tls=true"
|
||||||
- "traefik.http.routers.formations-prod.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.formations-prod.tls.certresolver=letsencrypt"
|
||||||
- "traefik.http.routers.formations-prod.service=formations-prod-svc"
|
- "traefik.http.routers.formations-prod.service=formations-prod-svc"
|
||||||
|
|||||||
@@ -571,7 +571,7 @@ export type InsertLogNotification = typeof logsNotifications.$inferInsert;
|
|||||||
export const parametres = mysqlTable("parametres", {
|
export const parametres = mysqlTable("parametres", {
|
||||||
id: int("id").autoincrement().primaryKey(),
|
id: int("id").autoincrement().primaryKey(),
|
||||||
/** URL publique de l'application pour les QR codes d'émargement */
|
/** URL publique de l'application pour les QR codes d'émargement */
|
||||||
urlPublique: varchar("urlPublique", { length: 500 }).notNull().default("https://formations.itinova.org"),
|
urlPublique: varchar("urlPublique", { length: 500 }).notNull().default("https://formations-itinova.santinova-soft.org"),
|
||||||
/** Délai d'expiration des QR codes en minutes (par défaut 30 minutes) */
|
/** Délai d'expiration des QR codes en minutes (par défaut 30 minutes) */
|
||||||
delaiExpirationQR: int("delaiExpirationQR").default(30).notNull(),
|
delaiExpirationQR: int("delaiExpirationQR").default(30).notNull(),
|
||||||
/** Durée de validité des tokens d'émargement en heures (par défaut 24 heures) */
|
/** Durée de validité des tokens d'émargement en heures (par défaut 24 heures) */
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
execute_sql "Ajout de la colonne urlPublique" \
|
execute_sql "Ajout de la colonne urlPublique" \
|
||||||
"ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations.itinova.org' AFTER id;"
|
"ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations-itinova.santinova-soft.org' AFTER id;"
|
||||||
|
|
||||||
execute_sql "Ajout de la colonne delaiExpirationQR" \
|
execute_sql "Ajout de la colonne delaiExpirationQR" \
|
||||||
"ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;"
|
"ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ if [ ! -f "$ENV_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Demander l'URL publique
|
# Demander l'URL publique
|
||||||
echo "Entrez l'URL publique de votre application (ex: https://formations.itinova.org) :"
|
echo "Entrez l'URL publique de votre application (ex: https://formations-itinova.santinova-soft.org) :"
|
||||||
read PUBLIC_URL
|
read PUBLIC_URL
|
||||||
|
|
||||||
# Vérifier que l'URL commence par http:// ou https://
|
# Vérifier que l'URL commence par http:// ou https://
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ describe("modèle d’e-mail de réinitialisation", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("substitue le lien de réinitialisation dans le contenu du modèle", () => {
|
it("substitue le lien de réinitialisation dans le contenu du modèle", () => {
|
||||||
const link = "https://formations.recette.santinova-soft.org/reset-password?token=abc123";
|
const link = "https://formations-itinova.recette.santinova-soft.org/reset-password?token=abc123";
|
||||||
const result = replaceEmailVariables(
|
const result = replaceEmailVariables(
|
||||||
'<a href="{{lienReinitialisation}}">Réinitialiser</a>',
|
'<a href="{{lienReinitialisation}}">Réinitialiser</a>',
|
||||||
{ lienReinitialisation: link },
|
{ lienReinitialisation: link },
|
||||||
@@ -38,7 +38,7 @@ describe("modèle d’e-mail de réinitialisation", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { generateEmailFromTemplate } = await import("../emailTemplateGenerator");
|
const { generateEmailFromTemplate } = await import("../emailTemplateGenerator");
|
||||||
const resetLink = "https://formations.recette.santinova-soft.org/reset-password?token=abc123";
|
const resetLink = "https://formations-itinova.recette.santinova-soft.org/reset-password?token=abc123";
|
||||||
const html = await generateEmailFromTemplate(
|
const html = await generateEmailFromTemplate(
|
||||||
"reset_password",
|
"reset_password",
|
||||||
`<a href="${resetLink}">Réinitialiser</a>`,
|
`<a href="${resetLink}">Réinitialiser</a>`,
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ export async function getParametres() {
|
|||||||
if (result.length === 0) {
|
if (result.length === 0) {
|
||||||
// Créer les paramètres par défaut
|
// Créer les paramètres par défaut
|
||||||
await db.insert(parametres).values({
|
await db.insert(parametres).values({
|
||||||
urlPublique: "https://formations.itinova.org",
|
urlPublique: "https://formations-itinova.santinova-soft.org",
|
||||||
});
|
});
|
||||||
|
|
||||||
const newResult = await db.select().from(parametres).limit(1);
|
const newResult = await db.select().from(parametres).limit(1);
|
||||||
|
|||||||
2
todo.md
2
todo.md
@@ -689,7 +689,7 @@
|
|||||||
- [x] Créer la page AdminParametres
|
- [x] Créer la page AdminParametres
|
||||||
- [x] Ajouter le lien dans le menu après "Configuration SMTP"
|
- [x] Ajouter le lien dans le menu après "Configuration SMTP"
|
||||||
- [x] Modifier qrCodeGenerator pour utiliser l'URL de la BDD
|
- [x] Modifier qrCodeGenerator pour utiliser l'URL de la BDD
|
||||||
- [x] Définir l'URL par défaut : https://formations.itinova.org
|
- [x] Définir l'URL par défaut : https://formations-itinova.santinova-soft.org
|
||||||
|
|
||||||
- [x] Ajouter DashboardLayout à la page AdminParametres
|
- [x] Ajouter DashboardLayout à la page AdminParametres
|
||||||
- [x] Ajouter DashboardLayout à la page FormateurEmargement
|
- [x] Ajouter DashboardLayout à la page FormateurEmargement
|
||||||
|
|||||||
Reference in New Issue
Block a user