Installation de SOFTIC Intranet
This content is not available in English yet; it is shown in Français.
A. Poste de développement (Visual Studio 2022)
Prérequis : SDK .NET 8, SQL Server 2022 local (authentification Windows), flux NuGet local DevExpress 24.1.
- Extraire le zip à la racine
C:\DevFki\DevOps\Softic.Intranet. Vérification :C:\DevFki\DevOps\Softic.Intranet\Softic.Intranet.slnexiste (et non...\Softic.Intranet\Softic.Intranet\Softic.Intranet.sln: piège du bouton « Extraire tout »). - Flux DevExpress : ouvrir
nuget.configà la racine et vérifier le chemin du flux local (par défautC:\Program Files\DevExpress 24.1\Components\System\Components\packages). Les projets demandentDevExpress.Blazor 24.1.*: jamais une version supérieure. - Ouvrir
Softic.Intranet.sln, définir Softic.Intranet.Web comme projet de démarrage. - Première migration — Outils → Gestionnaire de package NuGet → Console du Gestionnaire de package :
(La migration n'est pas livrée dans le zip : elle doit être générée par votre version des outils EF Core. Inutile de lancerAdd-Migration Lot1_Initial -Project Softic.Intranet.Data -StartupProject Softic.Intranet.WebUpdate-Database: l'application applique les migrations au démarrage.) - F5. Au premier démarrage : création de
Softic_Intranet, migration, amorçage (2 sociétés, directions, 4 rôles, comptes de démonstration, catalogue des applications SOFTIC). - Se connecter :
feki/Softic@2026(administrateur des deux sociétés) ouadmin(super-administrateur).
Tester le temps réel en deux minutes : ouvrir deux navigateurs (feki et saber), affecter une tâche de l'un à l'autre,
déplacer une carte du kanban, publier une actualité : tout bouge en face sans recharger.
Tests : menu Test → Exécuter tous les tests (17 tests, SQLite en mémoire, aucun SQL Server requis).
B. Serveur de production (Windows Server, IIS)
Prérequis : IIS avec le protocole WebSocket, Hosting Bundle ASP.NET Core 8, SQL Server, win-acme.
1. Créer le site (une seule fois, PowerShell en administrateur)
cd C:\DevFki\DevOps\Softic.Intranet\deploy
.\New-SofticIntranetSite.ps1 -HostName intranet.softic.io -InitialPassword "Un-Mot-De-Passe-Initial-1"
Le script crée C:\sites\SofticIntranet (site) et C:\sites\SofticIntranet_Data (clés de chiffrement),
le pool (sans code managé, toujours démarré, recyclage à 03:30), le site, la base, le login SQL du pool,
et écrit appsettings.Production.json. Ajouter -DemoData pour charger le jeu de démonstration.
2. Certificat
Lancer win-acme sur le site SofticIntranet comme pour les autres sites (magasin WebHosting).
3. Publier puis mettre en ligne
Dans Visual Studio : clic droit sur Softic.Intranet.Web → Publier → Dossier-SofticIntranet
(ou .\deploy\Publish-SofticIntranet.ps1, qui lance aussi les tests). Puis, sur le serveur :
.\Update-SofticIntranet.ps1
.\Check-SofticIntranet.ps1
4. Première connexion
Compte admin + mot de passe initial. Le changement de mot de passe est imposé à la première connexion
(sauf si l'instance a été créée avec -DemoData). Ensuite :
Administration → Paramètres (adresse publique de l'intranet), Sociétés, Utilisateurs,
Applications et SSO (voir INTEGRATION-PRODUITS.md).
À sauvegarder
| Quoi | Où | Pourquoi |
|---|---|---|
Base Softic_Intranet |
SQL Server | toutes les données |
Dossier keys |
C:\sites\SofticIntranet_Data\keys |
déchiffre les secrets SSO et signe les cookies |
Dossier files (lot 2) |
C:\sites\SofticIntranet_Data\files |
pièces jointes de la messagerie et fichiers des espaces d'équipe — à sauvegarder en même temps que la base (la base ne contient que les fiches) |
appsettings.Production.json |
C:\sites\SofticIntranet |
configuration de l'instance |
Les clés sont protégées par DPAPI au niveau de la machine. Après un changement de serveur, les secrets SSO des applications sont à ressaisir (Administration → Applications et SSO) ; les utilisateurs mobiles se reconnectent.
Réunions en ligne et fichiers (lot 2)
Administration → Paramètres → Réunions en ligne
| Paramètre | Valeur |
|---|---|
| Adresse du serveur de réunions | https://wmeeting.softic.us (valeur amorcée) |
| Gabarit de l'adresse d'une salle | {baseUrl}/{room} convient à un serveur WMeet ; jokers disponibles : {name}, {email}, {subject} |
| Jeton WMeet : app_id / app_secret / audience | à renseigner seulement si le serveur WMeet exige un jeton (token / JWT activé dans Prosody) : ce sont les valeurs app_id et app_secret de sa configuration. Chaque lien « Rejoindre » est alors signé au nom de la personne |
Essai : dans la messagerie, bouton Réunion puis Rejoindre — un nouvel onglet s'ouvre sur la salle. Si WMeet répond « authentification requise », le secret ou l'audience ne correspondent pas à ceux du serveur.
Administration → Paramètres → Fichiers : taille maximale (25 Mo par défaut) et extensions interdites.
Depuis le navigateur, le dépôt passe par la liaison temps réel : seule cette limite compte. Pour l'API mobile, IIS
refuse par défaut un corps de plus de 28,6 Mo ; pour aller au-delà, ajouter dans le web.config publié :
<system.webServer>
<security><requestFiltering><requestLimits maxAllowedContentLength="104857600" /></requestFiltering></security>
</system.webServer>
Softic IA (lot 3)
L'IA est livrée éteinte : aucun coût tant que vous ne l'activez pas. Avec le compte admin (super-administrateur) :
| Étape | Où | Quoi |
|---|---|---|
| 1. Accès sortant | pare-feu du serveur | autoriser HTTPS (443) sortant vers l'adresse du fournisseur (api.anthropic.com par défaut) |
| 2. Clé | Administration → Paramètres → Softic IA | Clé d'API du fournisseur (stockée chiffrée, jamais réaffichée) |
| 3. Conditions de vente | même écran | Marge de revente (30 % par défaut), Devise de facturation (USD, EUR, TND…) et Taux de change (1 USD = … unités) |
| 4. Garde-fous | même écran | budget mensuel par société, plafond par utilisateur, seuil de confirmation, longueur maximale d'une réponse |
| 5. Tarifs | Administration → Softic IA → Modèles et tarifs | vérifier les prix (\(par million de jetons) sur la grille officielle du fournisseur : tout le calcul en dépend. Valeurs amorcées relevées le 19/09/2026 : Rapide 1 / 5\), Standard 2 / 10 $, Expert 5 / 25 $ (livré inactif) |
| 6. Activer | Paramètres → Softic IA | Activer Softic IA — le bouton ✨ apparaît dans la barre de titre à la prochaine connexion |
| 7. Par société | Softic IA → Sociétés et budgets | activer / désactiver une société, marge particulière, budgets |
Droits : ai.use (utiliser l'IA) est donné à la mise à niveau à tous les rôles sauf « Invité » ; admin.ai (suivre la
consommation de sa société, régler ses budgets) aux rôles qui ont déjà admin.settings. Ils se retirent dans
Administration → Rôles ; la mise à niveau ne les redonne pas.
Facturation : Relevé CSV sur la période choisie (une ligne par appel, prix de vente ; les colonnes de coût et de marge n'existent que dans l'export de SOFTIC). Changer la marge, le taux ou un tarif n'a d'effet que sur les appels suivants.
Dépannage
| Symptôme | Piste |
|---|---|
| Erreur 500.30 / 500.31 | Hosting Bundle .NET 8 absent ou installé avant IIS → le réparer |
| « Reconnexion… » permanent | protocole WebSocket non activé dans IIS, ou proxy qui le bloque |
| Page blanche après mise à jour | vider le cache du navigateur (Ctrl+F5) |
| Le site ne démarre pas | Observateur d'événements → source IIS AspNetCore Module V2 ; migration manquante ou chaîne de connexion |
| Icônes absentes | wwwroot\lib\bootstrap-icons manquant dans la publication |
| Visual Studio : « L'accès au chemin d'accès …\obj\… est refusé » à la génération | bin / obj créés par une compilation en administrateur : fermer Visual Studio, lancer .\deploy\Clean-SofticIntranet.ps1 dans PowerShell administrateur, rouvrir Visual Studio normalement (détail dans PROCEDURE-MISE-A-JOUR.md) |
| Dépôt de fichier refusé « accès refusé » dans le journal | le compte du pool IIS doit pouvoir écrire dans C:\sites\SofticIntranet_Data (droit posé par New-SofticIntranetSite.ps1) |
| « Rejoindre » ouvre une page « Réunion indisponible » | réunions désactivées ou adresse du serveur vide : Administration → Paramètres → Réunions en ligne |
Réunions dans l'intranet (lot 4B-1)
Les réunions natives ne demandent aucun serveur de réunion : audio, vidéo et partage d'écran vont de navigateur à navigateur. Trois réglages dans Administration → Paramètres → Réunions :
- Réunions dans l'intranet (sans serveur) : activé. Participants par salle : 6 (8 avec de bonnes connexions).
- Serveurs STUN :
stun:stun.l.google.com:19302par défaut (découverte de l'adresse publique ; un STUN propre, par exemple celui du serveur WMeet, évite de dépendre de Google). - Serveurs TURN : indispensables dès que deux participants sont sur des réseaux d'entreprise différents (SOFTIC ↔ EPPM, télétravail) —
le relais prend le trafic quand le pare-feu interdit la liaison directe. Le serveur WMeet en a un (coturn, installé avec WMeet) :
sur ce serveur,
/etc/turnserver.confdonnestatic-auth-secret=…et le port (443 TCP en général, 3478 UDP) ; reportezturns:<hôte>:443?transport=tcp, turn:<hôte>:3478?transport=udpet le secret dans TURN : secret partagé. Sans WMeet : un petit serveur Linux avec coturn (apt install coturn,use-auth-secret,static-auth-secret=<secret>, ports 3478/443 ouverts), ou un relais loué ; le VPS Windows n'est pas le bon endroit pour coturn. - Grande salle : l'adresse WMeet (Réunions → adresse, celle de WMeet) sert désormais aux réunions au-delà de la capacité native,
encadrée dans l'onglet de l'intranet — l'utilisateur ne voit jamais l'application WMeet. Le serveur WMeet doit accepter d'être encadré
par l'intranet (pas d'en-tête
X-Frame-Options: DENYni deframe-ancestorsqui l'exclut) ; « - » dans l'adresse coupe la grande salle.
Côté navigateur : https obligatoire (WebRTC refuse le micro et la caméra sur http), Chrome/Edge/Firefox/Safari récents ; à la première réunion le navigateur demande l'autorisation du micro et de la caméra.
Recette : deux postes sur deux réseaux différents → Annuaire → fiche d'un collègue → Appel vidéo : l'autre poste sonne dans l'intranet, accepte, les deux se voient ; partage d'écran ; un troisième rejoint par le lien copié. Sans réponse en 45 s (Durée de la sonnerie), l'appelé reçoit « Appel manqué » dans la cloche.
Téléphone dans l'intranet (lot 4B-2)
Le combiné du navigateur parle SIP sur WebSocket sécurisé au standard de l'entreprise (bibliothèque JsSIP, MIT, embarquée dans
wwwroot/lib/jssip). L'intranet ne porte ni la signalisation ni la voix : il fournit à chaque navigateur le poste de l'utilisateur et
les serveurs STUN/TURN des réunions, et tient le journal des appels (table CallLogs, alimentée aussi par les appels internes).
- Le standard doit accepter des clients WebRTC / SIP sur WebSocket (wss) avec un certificat valide. Asterisk et FreePBX : transport
wss(port 8089,/ws), poste PJSIP avecwebrtc=yes, codecs opus/ulaw/alaw,dtls_auto_generate_cert. Wazo, FusionPBX, Kamailio : même principe. 3CX, Yeastar, Grandstream réservent souvent leur WebSocket à leur propre client : à confirmer avec l'éditeur avant de compter dessus. Pare-feu : le port wss ouvert vers les postes, et le RTP du standard vers Internet (ou un TURN). - Administration → Paramètres → Téléphonie : Téléphone dans l'intranet (livré éteint), Adresse WebSocket du standard
(
wss://standard.societe.tn:8089/ws), Domaine SIP (vide = hôte de l'adresse), durée d'enregistrement, Préfixe de sortie (ajouté aux numéros extérieurs composés depuis l'annuaire). - Chaque utilisateur : Profil → Téléphone (poste SIP) : poste, identifiant si différent, mot de passe (chiffré, jamais réaffiché), puis rechargement de la page : le combiné apparaît en bas à droite avec un point vert (enregistré), orange (connexion), rouge (échec, détail au survol). Clavier, appel, appel entrant avec sonnerie, sourdine, attente, touches DTMF, journal.
- Annuaire : le numéro d'un collègue devient un bouton d'appel.
Recette : deux postes enregistrés sur le standard, appel de l'un vers l'autre depuis l'intranet, puis vers un numéro extérieur ; le journal des appels du combiné montre l'issue et la durée.
Courrier (lot 4A)
Paquet NuGet. Softic.Intranet.Engine référence MailKit 4.18.0 (nuget.org, licence MIT). Le flux local de DevExpress ne le
contient pas : à la première ouverture, Visual Studio doit pouvoir joindre nuget.org (Outils → Gestionnaire de package NuGet →
Paramètres → Sources de package : nuget.org cochée). Sur un poste sans Internet, copier mailkit.4.18.0.nupkg et
mimekit.4.18.0.nupkg (et bouncycastle.cryptography, leur dépendance) dans le dossier du flux local.
1. Déclarer les serveurs — Administration → Serveurs de messagerie (droit admin.mail).
| Gabarit | À saisir |
|---|---|
| HCL Domino | hôte IMAP et SMTP du serveur Domino. Côté Domino : tâches imap et smtp chargées (load imap, load smtp ou ServerTasks= du notes.ini), ports TLS ouverts (993 et 587 ou 465), mot de passe Internet renseigné dans la fiche Personne de chaque utilisateur, base courrier activée pour IMAP (load convert -e mail\*.nsf si nécessaire). Certificat interne : cocher Accepter un certificat non reconnu |
| Exchange / autre | hôtes et ports IMAP/SMTP ; Auto choisit la sécurité d'après le port |
| Gmail | pré-rempli ; chaque utilisateur saisit un mot de passe d'application Google |
| Microsoft 365 | voir ci-dessous |
HCL Traveler / Exchange ActiveSync — la voie d'Outlook. Quand les postes Outlook se connectent par un compte « Exchange ActiveSync » (c'est le cas d'un Domino équipé de HCL Traveler : profil HTMO), l'intranet fait de même :
- Administration → Serveurs de messagerie → HCL Traveler (ActiveSync) : dans Serveur, ce qu'on donne à Outlook (
lac2.eppm.com.tn; une adresse collée avechttps://est nettoyée). Enregistrer et tester la connexion cherche le point d'entrée (/Microsoft-Server-ActiveSync, sinon/traveler/Microsoft-Server-ActiveSync) ; « trouvé, il exige une authentification » est la réponse normale de Traveler. - Chaque utilisateur : Courrier → Boîtes aux lettres → Relier une boîte → ce serveur, son adresse et son mot de passe habituels (ceux d'Outlook). La connexion est essayée avant l'enregistrement (authentification + liste des dossiers).
- Paramètres → Courrier : jours de courrier synchronisés (14 par défaut, comme le curseur « Courrier à conserver » d'Outlook) et plafond de messages gardés par dossier. La copie de travail vit en mémoire : rien du courrier n'est écrit dans la base de l'intranet.
- Expéditeur des notifications : possible par ce même serveur, au nom d'un compte de service (adresse, identifiant, mot de passe).
À savoir : chaque boîte reliée apparaît dans la console de Traveler comme un appareil « SOFTIC… ». Si le serveur exige l'approbation des appareils, ou n'admet que des types connus, l'administrateur de la messagerie doit l'approuver une fois (l'intranet affiche alors « Le serveur bloque cet appareil ») ; les champs Type d'appareil et Agent utilisateur de la fiche permettent de s'annoncer autrement. ActiveSync est un protocole de Microsoft dont l'usage dans un produit commercial peut relever d'une licence : point à faire valider avant diffusion à des clients. Non couvert pour l'instant par cette voie : l'agenda (prévu au lot 4C) et la recherche côté serveur (la recherche porte sur la période synchronisée).
Réception et envoi sont indépendants. Dans la fiche d'un serveur IMAP/SMTP, chaque protocole a sa case (Réception utilisée,
Envoi utilisé) : décoché, il est ignoré (enregistré sans hôte, jamais contacté, jamais testé). Les adresses collées sont
nettoyées : https://lac2.eppm.com.tn/ devient lac2.eppm.com.tn, hote:587 renseigne aussi le port.
Cas d'un HCL Domino sans IMAP (seule la tâche SMTP est ouverte, comme sur
lac2.eppm.com.tn) — gabarit HCL Domino (envoi seul) : hôte SMTP, puis Détecter le port et la sécurité (essaie 587, 465 et 25 ; dit pour chacun s'il répond, s'il chiffre et s'il accepte l'authentification ; retient le premier qui répond), Enregistrer, Tester la connexion. Identifiant = adresse Internet ou nom abrégé, mot de passe = mot de passe Internet de la fiche Personne ; l'authentification n'est tentée que si le serveur l'annonce (un relais interne n'en veut pas). Ce serveur peut être l'expéditeur des notifications, et les utilisateurs y relient une boîte en envoi seul (le module Courrier propose alors « Nouveau message », sans dossiers). Lire le courrier Domino dans l'intranet demande une voie de réception : la tâcheimapde Domino, ou le connecteur Domino par HTTPS prévu au lot 4C.
Quand Outlook se connecte en « Exchange ActiveSync » (profil HTMO : HCL Traveler for Microsoft Outlook — c'est le cas d'EPPM sur
lac2.eppm.com.tn) : les postes ne passent ni par IMAP ni par SMTP, mais par HCL Traveler en HTTPS. Le port 25 du même serveur n'est alors que la porte de réception du domaine : la détection le signale (« répond sans chiffrement ni authentification »), et un essai d'envoi y est coupé ou refusé (« Le serveur a répondu, puis a coupé la connexion… »). Le dialogue SMTP de l'essai, affiché sous le verdict, montre à quelle commande — à transmettre tel quel à l'administrateur de la messagerie. Trois issues :Relevé du 21/09/2026 sur
lac2.eppm.com.tn: 443 = port du web (HTTPS, celui d'ActiveSync) — il ne parle pas SMTP ; 25 =mx2-relais, HCL Domino 12.0.1 HF102, sans STARTTLS ni AUTH, qui répond554 Mail from …@eppm.com.tn rejected for policy reasons: vu de l'extérieur, un expéditeur de son propre domaine est une usurpation ; il refuserait ensuite tout destinataire hors de ses domaines (pas de relais). Sous le verdict de l'essai, la lecture du dialogue dit cela en clair ; le champ Destinataire du courriel d'essai permet d'essayer vers une adresse du domaine.
Besoin Issue Courriels de notification les envoyer par un expéditeur qui n'est pas ce Domino (Microsoft 365 ou SMTP de SOFTIC, par exemple intranet@softic.io) : les boîtes@eppm.com.tnles reçoivent comme tout courrier venu d'Internet. Ou faire autoriser par l'administrateur Domino le relais depuis l'adresse IP de l'intranetLire et envoyer le courrier Domino dans l'intranet, dès maintenant faire ouvrir, pour la seule adresse IP de l'intranet, IMAP (993) et la soumission SMTP authentifiée (587) : le connecteur livré fonctionne tel quel Idem, sans rien changer côté Domino connecteur HCL Traveler (Exchange ActiveSync), même serveur et mêmes identifiants qu'Outlook : lot 4C (voir la feuille de route)
Domaines servis (softic.io, eppm.com.tn) : le serveur est proposé d'office aux utilisateurs dont l'adresse porte ce domaine.
Tester la connexion vérifie que les serveurs répondent (ou, pour Microsoft 365, que l'application est reconnue).
Microsoft 365 a maintenant son guide complet, avec script d'inscription :
docs/MICROSOFT-365.md(deploy/Register-Microsoft365App.ps1).
2. Microsoft 365 — inscription de l'application (portail Entra ID → Inscriptions d'applications → Nouvelle inscription) :
- Comptes de cet annuaire uniquement ; URI de redirection Web :
https://<intranet>/mail/oauth/callback(la fiche du serveur l'affiche). - Certificats et secrets → nouveau secret client → le coller dans la fiche (il est stocké chiffré).
- API autorisées → Microsoft Graph → déléguées :
Mail.ReadWrite,Mail.Send,Calendars.ReadWrite,User.Read,offline_access. - Pour l'expéditeur des notifications : permission d'application
Mail.Send+ Accorder le consentement de l'administrateur. Pour la limiter à une seule boîte : stratégie d'accès aux applications d'Exchange Online (New-ApplicationAccessPolicy). - Reporter dans la fiche : locataire (
societe.onmicrosoft.comou son identifiant), identifiant d'application, secret.
3. Expéditeur des notifications — dans la fiche d'UN serveur : Envoyer les notifications par ce serveur, adresse et nom d'expédition ; en SMTP, identifiant et mot de passe (vides = relais interne sans authentification). Envoyer un courriel d'essai l'envoie à votre propre adresse. Puis Paramètres → Courrier → Notifications par courriel : activer. Livré éteint.
4. Côté utilisateur — Courrier → Boîtes aux lettres → Relier une boîte : IMAP/SMTP = adresse et mot de passe (la connexion est essayée avant l'enregistrement) ; Microsoft 365 = Se connecter avec Microsoft. Préférences des courriels de notification : Profil.