Questions et réponses
- Répond uniquement à partir du wiki Redmine et du dossier partagé, sans connaissance extérieure.
- Cite ses sources : chaque pastille [n] renvoie à l'extrait utilisé, avec un lien vers la page du wiki ou la page du PDF.
- Dit clairement quand la documentation ne contient rien sur le sujet, sans interroger l'IA.
- Affiche la réponse au fil de l'eau ; on peut l'interrompre, la copier ou la régénérer.
- Comprend les relances courtes (« et sous Linux ? ») en tenant compte de la question précédente.
- Deux moteurs au choix en un clic : IA locale (Ollama, sur le réseau H3Campus) et IA avancée (Claude ou API compatible OpenAI).
- Garde l'historique des conversations dans le navigateur, propose des exemples de questions.
Recherche et indexation
- Recherche hybride : plein texte insensible aux accents et recherche par le sens (embeddings), fusionnées.
- Indexe le wiki d'un ou plusieurs projets Redmine et un dossier de PDF,
.md et .txt.
- Mise à jour incrémentale : seules les pages et fichiers modifiés sont relus ; réindexation automatique programmable.
- Masque les mots de passe et jetons trouvés dans la documentation dès l'indexation.
Administration
- Réglages en onglets : sources, modèles d'IA (avec test de connexion), indexation, journal des questions, comptes.
- Gestion des comptes et des rôles depuis l'interface ou en ligne de commande.
- Thème clair et sombre, interface utilisable sur téléphone.
Premiers pas
- Connectez-vous avec l'identifiant et le mot de passe provisoire fournis par l'administrateur.
- À la première connexion, scannez le QR code avec une application d'authentification (Microsoft Authenticator, Google Authenticator, Bitwarden, FreeOTP…) et saisissez le code affiché.
- Notez vos 8 codes de secours dans un endroit sûr, puis cliquez sur J'ai noté mes codes.
- Choisissez votre mot de passe définitif (12 caractères minimum).
- Posez votre question dans la zone de saisie : Entrée pour envoyer, Maj+Entrée pour aller à la ligne.
- Cliquez sur une pastille [n] ou sur le bouton Sources pour lire l'extrait et ouvrir la page d'origine.
Au quotidien
- IA locale / IA avancée, en haut de l'écran : choisit le moteur de la prochaine réponse.
- Nouvelle conversation repart de zéro ; les conversations précédentes restent dans la barre latérale.
- Sous chaque réponse : copier, ou régénérer. Pendant la réponse, le bouton d'envoi devient un bouton d'arrêt.
- Le cadenas à côté de votre nom ouvre Mon compte (changement de mot de passe). Se déconnecter efface l'historique de ce navigateur.
En cas de souci
| Situation | Que faire |
| « Je ne trouve aucune information… » | Reformulez avec les mots employés dans le wiki (nom du serveur, du logiciel). Si le sujet n'est pas documenté, il faut écrire la page. |
| La réponse tarde | L'IA locale tourne sur processeur : comptez quelques secondes avant le premier mot, davantage au premier appel (chargement du modèle). |
| Code de double authentification refusé | Vérifiez que l'heure du téléphone est exacte ; un code ne sert qu'une fois. |
| Téléphone perdu | Saisissez un code de secours à la place du code à 6 chiffres. Sans code de secours, un administrateur peut réinitialiser votre double authentification. |
| « Compte verrouillé » | Après 5 échecs, le compte est bloqué 15 minutes. Patientez ou demandez à un administrateur de le débloquer. |
Administrateurs : la première indexation se lance dans Réglages › Indexation › Mettre à jour l'index.
Pour l'utiliser
- Un navigateur récent et un compte HTag, avec une application d'authentification sur téléphone.
Serveur
- Debian 13 minimum : HTag a besoin de SQLite 3.43 ou plus récent (Debian 12 n'a que la 3.40 ; le script d'installation refuse de continuer).
- Python 3 avec
venv ; dépendances installées par deploy/install.sh depuis requirements.lock.
- Un serveur Ollama pour l'IA locale et la recherche par le sens (modèle d'embeddings
bge-m3).
- Une clé d'API Redmine ayant accès aux wikis à indexer.
- Facultatif : une clé d'API Anthropic ou d'un fournisseur compatible OpenAI pour l'IA avancée ; un partage SMB/NFS monté en lecture seule pour les PDF.
- Un seul processus : l'index vectoriel, les caches et le planificateur sont en mémoire.
Réseau
| Port | Sens | Rôle |
| 8077/TCP | entrant | Interface web. À n'ouvrir qu'au reverse proxy (Traefik), sinon le SSO peut être contourné. |
| 443/TCP | sortant | API Redmine ; Ollama s'il est publié en HTTPS ; API de l'IA avancée si elle est utilisée. |
| 11434/TCP | sortant | Ollama, s'il est joint directement sur le réseau local. |
Authentification
- Mots de passe hachés avec scrypt (N = 215, r = 8, p = 1, sel aléatoire de 16 octets), comparés en temps constant.
- Mot de passe de 12 caractères minimum, sans l'identifiant, au moins 6 caractères différents ; mot de passe provisoire à changer obligatoirement.
- Double authentification TOTP obligatoire (RFC 6238 : 6 chiffres, 30 s, tolérance ±30 s), codes non rejouables ; 8 codes de secours à usage unique.
- Verrouillage du compte 15 minutes après 5 échecs ; au plus 20 tentatives de connexion par adresse IP toutes les 5 minutes.
Sessions
- Sessions côté serveur de 12 h ; jeton aléatoire de 256 bits, seule son empreinte SHA-256 est stockée.
- Cookies
HttpOnly et SameSite=Strict, plus Secure derrière HTTPS.
- Changer de mot de passe ferme les autres sessions.
Navigateur et contenu
- Politique de sécurité du contenu (CSP) stricte,
X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: same-origin.
- Réponses de l'IA nettoyées par DOMPurify ; les images externes en sont retirées.
- Mots de passe et jetons du wiki remplacés par
[masqué] à l'indexation.
- Seuls les PDF indexés et situés dans le dossier partagé configuré peuvent être ouverts.
- Réglages, indexation, journal et comptes réservés aux administrateurs, contrôlés par le serveur.
Serveur
- Service systemd sous un compte dédié
htag, sans élévation de privilèges, système en lecture seule sauf /var/lib/htag.
Les clés d'API sont enregistrées dans la base SQLite du serveur ; elles ne sont jamais renvoyées en clair à l'interface.
- Pas d'invention volontaire. HTag a pour consigne de ne répondre qu'à partir des extraits cités. Une IA peut toutefois se tromper : vérifiez dans la source.
- IA locale : rien ne sort du réseau. Questions et extraits restent entre le serveur HTag et le serveur Ollama de H3Campus.
- IA avancée : envoi limité. Seuls votre question, les derniers échanges de la conversation et les extraits retenus sont envoyés au fournisseur choisi.
- Aucune télémétrie. Le serveur ne contacte que Redmine, Ollama et, si elle est utilisée, l'API de l'IA avancée. Le navigateur charge seulement les polices depuis Google Fonts.
- Les mots de passe de la documentation ne sont pas transmis. Ils sont masqués avant d'être stockés, donc ni envoyés à l'IA ni affichés.
- Votre historique reste chez vous. Il est gardé dans votre navigateur et effacé quand vous vous déconnectez. Le serveur garde en revanche un journal des questions (texte de la question, identifiant, date, moteur, nombre de sources, durée), consultable par les administrateurs, mais pas les réponses.
| Choix | Pourquoi |
| SQLite (FTS5 + vecteurs en mémoire) | Un seul fichier, aucun serveur de base à maintenir ; quelques millisecondes par recherche pour des milliers d'extraits, sans base vectorielle dédiée. |
| Recherche hybride, fusion par rang réciproque | Le plein texte trouve les noms exacts (serveurs, commandes), les embeddings trouvent les reformulations ; si Ollama ne répond pas, le plein texte suffit. |
| FastAPI, flux SSE | La réponse s'affiche mot à mot, ce qui compte avec une IA sur processeur. |
| Interface sans framework ni compilation | HTML, CSS et JavaScript simples ; marked et DOMPurify fournis localement, sans CDN. |
| Ollama, modèles sans phase de réflexion | IA hébergée chez H3Campus ; la réflexion est désactivée pour une réponse plus rapide. |
| 2FA intégrée (TOTP) | Fonctionne avec n'importe quelle application d'authentification, sans service externe. |
| Historique dans le navigateur | Le serveur ne conserve pas les conversations. |
- Auteur : tuxgyver
- Pour : service informatique H3Campus
- Copyright : ©
Application développée avec l'assistance de l'IA sous la direction et supervision de Johnny.