<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OPENWEBUI &#8211; erwan.guillemard</title>
	<atom:link href="https://erwanguillemard.com/tag/openwebui/feed/" rel="self" type="application/rss+xml" />
	<link>https://erwanguillemard.com</link>
	<description>Blog personnel</description>
	<lastBuildDate>Sat, 25 Apr 2026 09:22:51 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://erwanguillemard.com/wp-content/uploads/2024/02/cropped-Logo-sans-baseline-32x32.png</url>
	<title>OPENWEBUI &#8211; erwan.guillemard</title>
	<link>https://erwanguillemard.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Apps &#8211; OpenWebUI</title>
		<link>https://erwanguillemard.com/apps-openwebui/</link>
		
		<dc:creator><![CDATA[Erwan Guillemard]]></dc:creator>
		<pubDate>Sat, 25 Apr 2026 09:19:00 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[OLLAMA]]></category>
		<category><![CDATA[OPENWEBUI]]></category>
		<guid isPermaLink="false">https://erwanguillemard.com/?p=3520</guid>

					<description><![CDATA[Ce billet vient en complément et suite de l&#8217;article Apps &#8211; Ollama. Ce dernier (promis juré, craché sera assez rapide) sera un billet court. Pourquoi ? Parce que tout ou une grande partie à déjà été dit dans l&#8217;article traitant d&#8217;Ollama. J&#8217;avais jugé trop indigeste de fondre les deux sujets. Donc ici, la partie théorie...]]></description>
										<content:encoded><![CDATA[
<p>Ce billet vient en complément et suite de l&rsquo;article Apps &#8211; Ollama. Ce dernier (promis juré, craché sera assez rapide) sera un billet court.</p>



<p class="has-text-align-center"><strong>Pourquoi ?</strong></p>



<p>Parce que tout ou une grande partie à déjà été dit dans l&rsquo;article traitant d&rsquo;Ollama. J&rsquo;avais jugé trop indigeste de fondre les deux sujets. Donc ici, la partie théorie sera plutôt courte et en conséquence la partie Pratique un peu plus étoffée concernant l&rsquo;implémentation et la configuration de l&rsquo;application.</p>



<p>Bref, l&rsquo;objectif de cet article sera d&rsquo;implémenter une interface graphique publiée pour faciliter l&rsquo;usage de notre solution Ollama plurimodales (LLM<sup data-fn="9b4b7116-7da7-4c05-943e-ac072573b13f" class="fn"><a href="#9b4b7116-7da7-4c05-943e-ac072573b13f" id="9b4b7116-7da7-4c05-943e-ac072573b13f-link">1</a></sup>) aux utilisateurs. J&rsquo;ai pris le parti d&rsquo;utiliser la solution OpenWebUI.</p>





<h2 class="wp-block-heading">Avant-Propos</h2>



<p>Vous l&rsquo;avez bien compris, dans l&rsquo;introduction, je n&rsquo;ai pas l&rsquo;attention de m&rsquo;éterniser 10 000 ans sur le sujet.</p>



<p>Je pars du principe que nous avons déjà déployé et configuré la solution Ollama et quelques modèles de traitement IA<sup data-fn="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4" class="fn"><a href="#f36cb89d-8ac6-4ed0-8df5-7d578d4680c4" id="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4-link">2</a></sup> sur un serveur.</p>



<p>J&rsquo;ai une nouvelle fois pris le parti de déployer l&rsquo;application sous une distribution RHEL<sup data-fn="9e902093-392b-4860-a9f8-d2c28cf28686" class="fn"><a href="#9e902093-392b-4860-a9f8-d2c28cf28686" id="9e902093-392b-4860-a9f8-d2c28cf28686-link">3</a></sup> afin d&rsquo;avoir un niveau de sécurité optimale. Toutefois et vous pourrez le constatez par la suite dans la partie théorie, je ne respecterai pas l&rsquo;architecture par faute de ressource disponible néanmoins, je recommande de suivre l&rsquo;architecture qui sera à venir.</p>



<p>Dans le cadre d&rsquo;une solution d&rsquo;IA hébergée localement se pose la question de mettre en place un tel portail dans une organisation. A cela je répondrai que cela permettra de garder un certain contrôle des requêtes, prompts, effectués par l&rsquo;ensemble des utilisateurs de l&rsquo;organisation et d&rsquo;en faciliter les usages. Dans des domaines sensibles tels que l&rsquo;industrie et production cela peut aux yeux de la direction et de la DSI<sup data-fn="4a15f514-bc25-45dc-8c12-3f5fd10c286d" class="fn"><a href="#4a15f514-bc25-45dc-8c12-3f5fd10c286d" id="4a15f514-bc25-45dc-8c12-3f5fd10c286d-link">4</a></sup> se révéler rassurant.</p>



<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li><strong>SE :</strong>
<ul class="wp-block-list">
<li>Rocky Linux 9.x et version ultérieures (pour ma part ça sera du 10.x)</li>



<li>macOS</li>



<li>Windows</li>
</ul>
</li>



<li><strong>Apps :&nbsp;</strong>
<ul class="wp-block-list">
<li>Ollama</li>
</ul>
</li>



<li><strong>Autres :</strong>
<ul class="wp-block-list">
<li>Minimum 4 CPU<sup data-fn="63b8e4f1-84bc-47ad-8afa-7dae59217921" class="fn"><a href="#63b8e4f1-84bc-47ad-8afa-7dae59217921" id="63b8e4f1-84bc-47ad-8afa-7dae59217921-link">5</a></sup></li>



<li>Minimum 4 Gio de RAM<sup data-fn="f958a01e-8b83-4fc9-a592-006e9651956c" class="fn"><a href="#f958a01e-8b83-4fc9-a592-006e9651956c" id="f958a01e-8b83-4fc9-a592-006e9651956c-link">6</a></sup></li>



<li>Stockage rapide (SSD<sup data-fn="8f6e0338-719e-4456-808e-82e0a17b70ea" class="fn"><a href="#8f6e0338-719e-4456-808e-82e0a17b70ea" id="8f6e0338-719e-4456-808e-82e0a17b70ea-link">7</a></sup>&nbsp;ou Nvme)</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Théorie</h2>



<h3 class="wp-block-heading">KesaKo OpenWebUI</h3>



<p>Je pense comme toujours qu&rsquo;il est important de se poser la traditionnelle question. Que fait l&rsquo;application que nous allons utiliser, comment elle fonctionne et qui est derrière.</p>



<h4 class="wp-block-heading">Qu&rsquo;est-ce que c&rsquo;est ?</h4>



<p>OpenWebUI, c&rsquo;est une interface web issue d&rsquo;une projet open-source (<strong>#biscotto</strong>) qui permet d&rsquo;utiliser des modèles d&rsquo;IA depuis un navigateur WEB hébergé localement. </p>



<p>Le projet est né du sud-coréen Tim Jaeryang BAEK qui prône l&rsquo;autonomie numérique face aux grands du monde de la tech. Le projet est développé en Python (version supérieur ou égale à 3.11) pour la partie BackEnd et HTML/CSS, Svelte, JS et TS pour la partie FrontEnd.</p>



<p>Personnellement, je trouve que l&rsquo;interface ressemble fortement à celle de ChatGPT. Mais son mon avis personnel hein 🙂</p>



<h4 class="wp-block-heading">A quoi ça sert ?</h4>



<p>La solution va permettre comme les outils classiques en ligne (pour ne pas dire les géants du Cloud) d&rsquo;effectuer des opérations (énumération en approche) :</p>



<ul class="wp-block-list">
<li><strong>Discuter</strong> avec des modèles d&rsquo;IA (LLM)</li>



<li><strong>Exploiter</strong> des modèles localement (LLM)</li>



<li><strong>S&rsquo;Interfacer</strong> avec des sources locales et clouds (et oui nous pouvons faire de l&rsquo;hybridation).</li>



<li><strong>Téléverser </strong>(waouh, tu n&rsquo;as pas écrit uploader !) des fichiers pour les analyser par l&rsquo;IA</li>
</ul>



<p>Nous retrouvons donc dans l&rsquo;ensemble les mêmes fonctionnalités que les outils en ligne quant à l&rsquo;usage de l&rsquo;IA 🙂 C&rsquo;est cool non ? &lt;3</p>



<h3 class="wp-block-heading">Avantages / Inconvénients</h3>



<p>L&rsquo;utilisation d&rsquo;OpenWebUI n&rsquo;est pas sans conséquences vis à vis des services qu&rsquo;il peut apporter.</p>



<p>Il suffit de regarder le constat déjà porté sur l&rsquo;utilisation d&rsquo;Ollama.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><mark style="background-color:rgba(0, 0, 0, 0);color:#3ec632" class="has-inline-color"><strong>Avantages</strong></mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color">Inconvénients</mark></td></tr><tr><td class="has-text-align-center" data-align="center">Open Source<br>Respect de la vie privée<br>Cross Compatibilité des modèles<br>Simplicité de l&rsquo;interface</td><td class="has-text-align-center" data-align="center">Installation technique<br>Modèles locaux couteux en ressources (RAM, CPU, GPU<sup data-fn="57be53ba-9128-49e7-ae7a-c337f01cf69e" class="fn"><a href="#57be53ba-9128-49e7-ae7a-c337f01cf69e" id="57be53ba-9128-49e7-ae7a-c337f01cf69e-link">8</a></sup>, Stockage)</td></tr></tbody></table></figure>



<p></p>



<p>Bon, cela je vous dirai l&rsquo;utilisateur il s&rsquo;en tamponne le coquillard. Lui que ce soit technique à mettre en place, il s&rsquo;en lustre l&rsquo;asperge. Par contre, si la réponse est lente, c&rsquo;est le <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-13-color"><strong><em><span style="text-decoration: underline;">Game Over</span></em></strong></mark>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="575" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1024x575.jpg" alt="" class="wp-image-3528" style="aspect-ratio:1.7809626179386122;width:616px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1024x575.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-300x169.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-768x431.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died-1536x863.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_003_ER_Died.jpg 1561w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Logique, pourquoi utiliser la solution locale qui met une plombe à répondre alors qu&rsquo;un bon vieux Gémini, Copilot, ChatGPT te donne la réponse en 1/4 de seconde après une petite pression sur la touche Enter du clavier ?</p>



<p>Ce qui nous ramène selon moi à l&rsquo;un des plus grands maux de la société actuelle. Nous ne savons ce que signifie attendre et être patient. Si dans les années 60 la compilation d&rsquo;un programme pouvait prendre la nuit, aujourd&rsquo;hui cela prendra quelques minutes. L&rsquo;essor des nouvelles technologies, nous apportent de par les performances et leurs mobilités l&rsquo;informations et l&rsquo;assurance de pouvoir joindre un individu ou une ressource si quand bien même nous avons du réseau. Toutefois, force est de constaté que si comme cela s&rsquo;est passé plusieurs fois au cours de l&rsquo;année 2025 et 2026 l&rsquo;un des maillons qui assure le fonctionnement tombe et nous coupe de nos ressources, nous nous retrouvons comme une poule qui a trouvé un couteau. Je pense et cela n&rsquo;est qu&rsquo;un point de vue personnel que nous devrions nous remettre en question face à cette forme de dépendance et servitude, <a href="https://www.youtube.com/watch?v=IsvfofcIE1Q&amp;list=RDIsvfofcIE1Q&amp;start_radio=1">Master &amp; Servant</a>, je dis STOP ! <strong><em>#sendkissesagain</em></strong></p>



<h3 class="wp-block-heading">Architecture &amp; Best Pratices</h3>



<p>Lors de la présentation de la solution, j&rsquo;ai introduit la possibilité d&rsquo;utiliser OpenWebUI en mode hybride. Ce qui implique donc une communication des flux sortants via les protocoles HTTP<sup data-fn="f4993b7e-0f63-4b56-886c-b4e26648314b" class="fn"><a href="#f4993b7e-0f63-4b56-886c-b4e26648314b" id="f4993b7e-0f63-4b56-886c-b4e26648314b-link">9</a></sup> et HTTPS<sup data-fn="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1" class="fn"><a href="#1d2044d0-2a6b-4f6c-9865-c8cded2e72e1" id="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1-link">10</a></sup> vers les IAs compatibles dans le cloud et autres repos propres au SE<sup data-fn="688876c0-5948-48bf-baaf-3d493e2e5c01" class="fn"><a href="#688876c0-5948-48bf-baaf-3d493e2e5c01" id="688876c0-5948-48bf-baaf-3d493e2e5c01-link">11</a></sup> et maintien de l&rsquo;application. Afin de ne pas surcharger inutilement le schéma, j&rsquo;ai totalement exclu cette partie. Néanmoins il conviendra de réaliser un filtrage strict en sortie des flux pour des raisons de sécurité. Donc de jouer avec les politiques de votre UTMs<sup data-fn="13f6c481-ca7e-4e73-875d-cf307bad64ec" class="fn"><a href="#13f6c481-ca7e-4e73-875d-cf307bad64ec" id="13f6c481-ca7e-4e73-875d-cf307bad64ec-link">12</a></sup>.</p>



<p>Bien, rentrons concrètement dans l&rsquo;architecture. La solution applicative OpenWebUI vient se placer entre le poste client et l&rsquo;application Ollama.</p>



<p>Il convient dans le respect des bonnes pratiques de dissocier OpenWebUI de Ollama puisque nous allons publier, ouvrir l&rsquo;application en interne et pourquoi pas depuis nos WANs<sup data-fn="ac43ad3e-9b07-4981-8114-d187d3cf6dbf" class="fn"><a href="#ac43ad3e-9b07-4981-8114-d187d3cf6dbf" id="ac43ad3e-9b07-4981-8114-d187d3cf6dbf-link">13</a></sup>. Cela implique de mettre OpenWebUI dans un réseau isolé (DMZ<sup data-fn="103fd0e8-cd60-41ff-b80a-9c51d9c20b76" class="fn"><a href="#103fd0e8-cd60-41ff-b80a-9c51d9c20b76" id="103fd0e8-cd60-41ff-b80a-9c51d9c20b76-link">14</a></sup>) et Ollama dans le réseau <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">T1</mark>, <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-10-color">T1&prime;</mark> par exemple.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="861" height="620" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch.jpg" alt="" class="wp-image-3526" style="aspect-ratio:1.3887129819333208;width:600px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch.jpg 861w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch-300x216.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_001_arch-768x553.jpg 768w" sizes="(max-width: 861px) 100vw, 861px" /></figure>
</div>


<p>Par défaut, dans un fonctionnement UNIX dans un déploiement hors Docker, le port de communication de l&rsquo;interface Web se fait via le protocole <strong>http </strong>sur le port <strong>8080</strong>. Il est néanmoins possible de forcer les connexions en <strong>https </strong>sur le port <strong>443 </strong>via <strong>nginx</strong> (je reviendrai plus en détail sur ce point).</p>



<p>Si nous regardons d&rsquo;un peu plus près l&rsquo;architecture de la VM<sup data-fn="2f21ddb8-be62-4029-92fc-283d894d896c" class="fn"><a href="#2f21ddb8-be62-4029-92fc-283d894d896c" id="2f21ddb8-be62-4029-92fc-283d894d896c-link">15</a></sup>, nous pouvons constater que j&rsquo;ai dédié un disque. Mais pourquoi ?</p>



<p>OpenWebUI est très très lourd. Son déploiement peut se révéler un poil pénible pour ne pas dire chiant à mourir (je reviendrai là-dessus dans la partie pratique).</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="576" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1024x576.jpg" alt="" class="wp-image-3527" style="width:612px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1024x576.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-300x169.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-768x432.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-1536x864.jpg 1536w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_002_migraine-2048x1152.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">https://unsplash.com/fr/photos/un-homme-portant-ses-mains-a-ses-oreilles-gK_ifZrZ0oc</figcaption></figure>
</div>


<p>Bref, pour pallier à ce problème, j&rsquo;ai dédié un disque d&rsquo;une capacité de 100 Gio.</p>



<p>Bien, on se lance dans la pratique ? Après on est bien aussi ici 🙂</p>



<h2 class="wp-block-heading">Pratique</h2>



<p>Oui j&rsquo;ai dit plus haut que je ne respecterai pas cette topologie. Par manque de ressource, je vais tailler à la hussarde et tout mutualiser sur une seule machine. Il faut bien faire avec les moyens que l&rsquo;on a, c&rsquo;est comme ça.</p>



<h3 class="wp-block-heading">Installation</h3>



<p>OpenWebUI propose plusieurs modes de déploiement :</p>



<ul class="wp-block-list">
<li><strong>Docker</strong> : <em>Officiellement supporté et recommandé pour la plupart des utilisateurs </em>(avec plusieurs sous-catégorie alternatives de déploiement)</li>



<li><strong>Python</strong> : <em>Orienté pour les environnements faibles en ressources et pour une installation manuelle</em>
<ul class="wp-block-list">
<li>uv</li>



<li>conda</li>



<li>venv</li>
</ul>
</li>



<li><strong>Kubernetes</strong> : <em>Idéal pour les déploiements en entreprise qui nécessite une adaptabilité et ordonnancement</em>
<ul class="wp-block-list">
<li>Helm</li>
</ul>
</li>



<li><strong>Third Party</strong></li>
</ul>



<p>Pour ma part, la seule chose qui m&rsquo;intéresse et pour laquelle je suis à peu près à l&rsquo;aise c&rsquo;est Python. Je vois déjà les puristes de la containerisation me rétorquer sauvagement « <strong>Pourquoi pas Docker ?</strong>« . Encore une fois et je suis désolé, je ne comprends pas l&rsquo;intérêt de Docker dans mon métier. Tant que je n&rsquo;aurai pas pleinement assimilé ou eu le besoin de l&rsquo;utilisé, je bloque. Attention, je ne dis pas que c&rsquo;est de la me*de hein ? Loin de moi l&rsquo;idée.</p>



<p>Donc je partirai sur Python en environnement virtuel (venv).</p>



<p>Pourquoi ce choix ? Simplement parce que RHEL utilise également Python dans une version différente et qu&rsquo;à ce jour la version 3.12 n&rsquo;est pas encore officiellement supporté par OpenWebUI&#8230; Rien que pour ça je déteste Python autant que Java. Pourquoi faire simple&#8230;</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_9a0c37-e4 kt-accordion-has-4-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane3520_ff088c-ef"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Création de l&rsquo;environnement virtuel</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Dans mon répertoire ollama, j&rsquo;ai créé un second répertoire openwebui.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-820304956fcaf1b3dcda79afd65d1736"><code><strong>$ sudo mkdir -p /mnt/ollama/openwebui
$ sudo cd /mnt/ollama/openwebui/</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="620" height="66" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0.jpg" alt="" class="wp-image-3542" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0.jpg 620w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_0-300x32.jpg 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></figure>
</div>


<p>Une fois déplacé dans le répertoire, nous créons l&rsquo;environnement virtuel <strong>venv</strong>. Original comme nom n&rsquo;est il pas ?</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-4105a54d743af1aa7d3a48ac73c39678"><code><strong>$ sudo python3 -m venv venv</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="598" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1.jpg" alt="" class="wp-image-3543" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1.jpg 598w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_1-300x22.jpg 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_720aaa-b2"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Activation de l&rsquo;environnement virtuel</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Etant toujours dans le même répertoire créé précédemment, nous allons activer notre environnement virtuel.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-acd4be5844f2b2742c95fd277e79b798"><code><strong>$ sudo source venv/bin/activate</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="640" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2.jpg" alt="" class="wp-image-3544" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2.jpg 640w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_2-300x20.jpg 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3520_0e4588-37"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Installation</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Maintenant que tout est bon, il est toujours dans notre environnement virtuel de démarrer l&rsquo;installation. Cette dernière se déroulera en 3 temps.</p>



<ul class="wp-block-list">
<li>La mise à jour de pip</li>



<li>La création d&rsquo;un répertoire temporaire pour stocker les sources de l&rsquo;installation qui sont plutôt volumineuse</li>



<li>L&rsquo;installation en faisant référence à notre répertoire temporaire</li>
</ul>



<p>Simple comme bonjour, et pourtant sachez que je me suis bien cassé la tête pour trouver l&rsquo;astuce du répertoire temporaire&#8230;</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-7b583b0aba8d3f3d221aa045c930b786"><code><strong>$ sudo pip install --upgrade pip 
$ sudo mkdir /mnt/ollama/tmp
$ sudo TMPDIR=/mnt/ollama/tmp pip install open-webui</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="928" height="274" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3.jpg" alt="" class="wp-image-3545" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3.jpg 928w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3-300x89.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_3-768x227.jpg 768w" sizes="auto, (max-width: 928px) 100vw, 928px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="492" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4.jpg" alt="" class="wp-image-3546" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4.jpg 941w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4-300x157.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_4-768x402.jpg 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p>Lors de l&rsquo;installation si comme moi vous avez des ressources limitées, aucun respect des préconisations matériels. Je vous recommande de tuer le temps pendant facile une heure et de laisser tranquille votre bécanne. Tiens, je reparle de patience, comme de par hasard 🙂</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="556" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-1024x556.jpg" alt="" class="wp-image-3539" style="aspect-ratio:1.8417715344844405;width:497px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-1024x556.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-300x163.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf-768x417.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_004_jjf.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p><strong><em>Sans hésitez, la réponse D Jean-Pierre, ça <strong><em>sera mon dernier goulot.</em></strong> </em></strong></p>



<p>Blague mise à part, 291 packages à installer avec des grosses dépendances pour certains d&rsquo;entre eux (Nvidia par exemple&#8230;). Reprenez un peu de la réponse D en attendant.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="992" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5.jpg" alt="" class="wp-image-3548" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5-284x300.jpg 284w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_005_install_5-768x811.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<p>Toujours pas terminé ? Bon ba comme on dit j&rsquo;ai nous <strong><em>« On va pas la mécher [la bouteille naturellement] »</em></strong>, terminez là et allez en chercher une nouvelle pour poursuivre la connaissance de la réponse D.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3520_08c8ee-de"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Démarrage</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Si vous n&rsquo;êtes pas tombé et que vous n&rsquo;êtes plus très sobre, c&rsquo;est bon signe. 🙂 Normalement, l&rsquo;installation est terminée.</p>



<p class="has-text-align-center has-theme-palette-5-background-color has-background"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ff0000" class="has-inline-color"><span style="text-decoration: underline;">/!\</span></mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color"></mark><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#000000" class="has-inline-color"><span style="text-decoration: underline;">Attention :</span></mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color"><strong>L&rsquo;abus des bons produits et notamment d&rsquo;alcool est dangereux pour la santé.</strong> (Que l&rsquo;on n&rsquo;aille pas dire que je fasse de la publicité ou l&rsquo;apologie de l&rsquo;alcool </mark><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#000000" class="has-inline-color">#loievin</mark></strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-theme-palette-9-color">)</mark></p>



<p>Vérifions que cela fonctionne avec la première commande.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-2e3528595d69e530cdac0d9a86abca3a"><code><strong>$ sudo open-webui --help</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="362" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1.jpg" alt="" class="wp-image-3554" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1-300x116.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_1-768x296.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p>C&rsquo;est rassurant de se dire que cela fonctionne. Pas de message d&rsquo;erreur. Il ne nous reste maintenant plus qu&rsquo;à démarrer notre service sur son interface et son port avec la commande ci-dessous.</p>



<p></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-8c3c7fab3e36412e32dd5c4d31345adf"><code><strong>$ sudo open-webui serve --host 10.227.250.11 --port 8080</strong></code></pre>



<p>Toutefois, il conviendra d&rsquo;autoriser les flux au niveau de l&rsquo;UTM local à notre serveur en amont. Pour cela, j&rsquo;explique dans la partie suivante Configuration comment ouvrir les flux http sur le port 8080/tcp.</p>



<p>Normalement, l&rsquo;ensemble des composants sont en cours de chargement et une fois l&rsquo;ensemble chargé, vous devriez avoir dans votre CLI<sup data-fn="96e1bb31-3abc-4f7d-9141-265b48fe943e" class="fn"><a href="#96e1bb31-3abc-4f7d-9141-265b48fe943e" id="96e1bb31-3abc-4f7d-9141-265b48fe943e-link">16</a></sup> la chose suivante.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="941" height="977" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2.jpg" alt="" class="wp-image-3555" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2.jpg 941w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2-289x300.jpg 289w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_006_run_2-768x797.jpg 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>
</div>


<p>Il est à noter que des notes d&rsquo;informations vont vite prendre le relai, ces derniers affichant l&rsquo;ensemble des requêtes HTTP.</p>
</div></div></div>
</div></div></div>



<p></p>



<p>Si nous sommes à ce stade c&rsquo;est que tout est bon 🙂 Avant de rentrer plus en détail de l&rsquo;outil, il est nécessaire de regarder la partie Configuration. </p>



<h3 class="wp-block-heading">Configuration</h3>



<p>Cette partie pourrait je pense être amélioré. L&rsquo;un des points les plus complexes et de mettre en place le mode service (j&rsquo;y ai passé un temps certain&#8230;). </p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_d18aa8-fa kt-accordion-has-4-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3520_2d9a52-19"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Utilisateur dédié</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Pour des raisons de sécurité, il convient de créer un utilisateur dédié pour notre application. Nous partons sur un compte de service et non un compte utilisateur.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-bf4decc473bfbe2d3dea8e1f34b337e0"><code><strong>$ sudo useradd -r -s /bin/false openwebui
$ sudo chown -R openwebui:openwebui /mnt/ollama/openwebui</strong></code></pre>



<p>Un petit changement de propriétaire et le tour est joué.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="842" height="43" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied.jpg" alt="" class="wp-image-3565" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied.jpg 842w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied-300x15.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied-768x39.jpg 768w" sizes="auto, (max-width: 842px) 100vw, 842px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane3520_82136e-4c"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>ParFeu</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Par défaut, le port qui sera utilisé pour accéder à l&rsquo;interface web d&rsquo;OpenWebUI est 8080/tcp en http.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-421e427ebffce88e0b68e3d9942078e1"><code><strong>$ sudo firewall-cmd --permanent --add-port=8080/tcp
$ sudo firewall-cmd --reload</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="779" height="111" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl.jpg" alt="" class="wp-image-3551" style="aspect-ratio:7.018908698001081;width:512px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl.jpg 779w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl-300x43.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_007_fwl-768x109.jpg 768w" sizes="auto, (max-width: 779px) 100vw, 779px" /></figure>
</div>


<p>On est d’accord que si nous souhaiterions mieux faire en termes de sécurité, il serait plus intelligent de créer la policy suivante :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-ac1dfb4f1ceaaff4aa75839b00dd9c53"><code><strong>$ sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.127.50.0/24" port port="8080" protocol="tcp" accept'
$ sudo firewall-cmd --reload</strong></code></pre>



<p>Ayant un UTM&nbsp;en amont, je me permets donc de me contenter de la première solution.</p>



<p>Un petit test de vérification depuis le poste source :</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="607" height="155" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl.jpg" alt="" class="wp-image-3552" style="width:497px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl.jpg 607w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_008_fwl-300x77.jpg 300w" sizes="auto, (max-width: 607px) 100vw, 607px" /></figure>
</div></div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_4ca822-16"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Mode Service</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Commençons par créer notre fichier de service. La difficulté que j&rsquo;ai rencontrée ici est de jouer avec l&rsquo;environnement virtuel et le service OpenWebUI à démarrer. J&rsquo;ai bien trouvé une solution de contournement à mon problème toutefois cela me laisse un gout amer car la solution ne me semble pas propre du tout.</p>



<p>C&rsquo;est je pense l&rsquo;un des points qui me frustre le plus dans le monde du libre, l&rsquo;imbrication de solution tierce et dans un sens une non-standardisation des méthodes d&rsquo;implémentations. Bien que je doive le reconnaitre c&rsquo;est ce qui fait tout son charme. Je t&rsquo;aime moi non plus. On se croirait dans Andromaque&#8230;</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-edb7a7f82c718c64f223a23096d9ca45"><code><strong>$ sudo vim /etc/systemd/system/openwebui.service</strong></code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Regardons d&rsquo;un peu plus près le contenu de ce fichier.<br><br>Nous retrouvons la description de notre service ainsi que son ordre de démarrage. OpenWebUI étant intimement lié à Ollama, il convient donc de définir ce dernier comme service requis.<br><br>Au niveau du service, nous sommes sur un type <strong>simple</strong>, le service étant exécuter par l&rsquo;utilisateur dédié <strong>openwebui</strong>. Il peut être acceptable bien que s&rsquo;est sacrément cochon d&rsquo;utiliser le compte root. Mais bon nous voulons éviter de faire étalage de notre amateurisme.<br><br><strong>WorkingDirectory</strong> représente le répertoire de travail dans lequel le programme sera exécuté.<br><strong>Environment</strong> permet de définir les variables d&rsquo;environnement.<br><br><strong>ExecStart</strong> permet d&rsquo;exécuter la commande. Dans mon cas, j&rsquo;en ai deux dont une qui est commentée (et qui ne fonctionne pas). <br><br><strong>Restart</strong> permet de définir le rédémarrage automatique dans le cas où le service viendrait à crash par exemple.<br><strong>RestartSec</strong> défini le délai de redémarrage en seconde.<br><br>Et pour finir, <strong>WantedBy</strong> pour spécifier le mode de service. Ici cela équivaut au mode normal.<br><br></td><td><strong><code>[Unit] </code><br><code>Description=Open WebUI Service</code><br><code>After=network.target ollama.service Requires=ollama.service </code><br><br><code>[Service] </code><br><code>Type=simple </code><br><code>User=openwebui</code><br><br><code>WorkingDirectory=/mnt/ollama/openwebui Environment="TMPDIR=/mnt/ollama/tmp" Environment="PATH=/mnt/ollama/openwebui/venv/bin:/usr/bin:/usr/sbin"</code><br><br><code>#ExecStart=/mnt/ollama/openwebui/venv/bin/open-webui serve --host 10.227.250.11 --port 8080 ExecStart=/bin/bash -c 'source /mnt/ollama/openwebui/venv/bin/activate &amp;&amp; open-webui serve --host 10.227.250.11 --port 8080'</code><br><br><code>Restart=always</code><br><code>RestartSec=5</code><br><br><code>[Install]</code><br><code>WantedBy=multi-user.target</code></strong></td></tr></tbody></table></figure>



<p>Comme nous venons de créer un nouveau service, il sera nécessaire de recharger l&rsquo;ensemble du systemctl pour intégrer le nouveau service à la liste des services disponible. Après, j&rsquo;ai envie de dire c&rsquo;est le schéma classique d&rsquo;activation, démarrage et vérification.</p>



<p></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-1de451f486c9405510986bb5d6a71df8"><code><strong>$ sudo systemctl daemon-reload
$ sudo systemctl enable openwebui
$ sudo systemctl start openwebui
$ sudo systemctl status openwebui</strong></code></pre>



<figure class="wp-block-table aligncenter"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td><img loading="lazy" decoding="async" width="550" height="272" class="wp-image-3561" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status-300x149.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_009_status-768x380.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td><td><img loading="lazy" decoding="async" width="550" height="122" class="wp-image-3566" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1.jpg 1896w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-300x67.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-1024x227.jpg 1024w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-768x171.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_010_dedied_1-1536x341.jpg 1536w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>
</div></div></div>
</div></div></div>



<h4 class="wp-block-heading">Nginx, HTTPS</h4>



<p>Je suis partagé quant à la rédaction de cette sous partie. Oui il est important de sécuriser l&rsquo;accès à l&rsquo;interface Web, mais j&rsquo;ai peur d&rsquo;être hors sujet et d&rsquo;alourdir l&rsquo;article. Mais d&rsquo;un autre côté, je ne veux pas non plus bâcler la chose&#8230; Encore un pu**n de choix cornélien&#8230;</p>



<p>Bref, je vais faire au plus simple et si besoin écrirai un billet sur Nginx.</p>



<div class="wp-block-kadence-accordion alignnone"><div class="kt-accordion-wrap kt-accordion-id3520_66384a-95 kt-accordion-has-4-panes kt-active-pane-0 kt-accordion-block kt-pane-header-alignment-left kt-accodion-icon-style-basic kt-accodion-icon-side-right" style="max-width:none"><div class="kt-accordion-inner-wrap" data-allow-multiple-open="false" data-start-open="none">
<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-1 kt-pane3520_8bd374-fd"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Installation</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>L&rsquo;installation et activation du service, je passe mon tour. </p>



<p></p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-0543457c0fe9e0729374dcee107be068"><code><strong>$ sudo dnf install nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="939" height="450" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg" alt="" class="wp-image-3573" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0.jpg 939w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-300x144.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_0-768x368.jpg 768w" sizes="auto, (max-width: 939px) 100vw, 939px" /></figure>
</div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="938" height="83" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg" alt="" class="wp-image-3572" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1.jpg 938w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-300x27.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_1-768x68.jpg 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></figure>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-2 kt-pane3520_228265-dc"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Certificats</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Là encore une fois je rencontre un petit problème. Je n&rsquo;ai pas de certificat public que je pourrais utiliser, ma topologie réseau ne me permet pas d&rsquo;utiliser un certificat Let&rsquo;s Encrypt et sans vouloir spoiler je n&rsquo;ai pas envie de me prendre la tête. Donc ça va finir avec un bon vieux certificat autosigné 🙂</p>



<p>La génération n&rsquo;est pas bien compliquée et si besoin, j&rsquo;ai déjà rédigé <a href="https://erwanguillemard.com/linux-certificats/">un article</a> sur le sujet.</p>



<p>Créons le répertoire qui va contenir nos éléments de sécurité :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-f4e5d319873f5128a8b950fc29a910ff"><code><strong>$ sudo mkdir -p /etc/nginx/ssl</strong></code></pre>



<p>Générons notre certificat :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-138cd2c03fe6716ce56321d41789b458"><code><strong>$ sudo openssl req req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/openwebui.key \
-out /etc/nginx/ssl/openwebui.crt</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="940" height="89" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2.jpg" alt="" class="wp-image-3574" style="aspect-ratio:10.562461026813553;width:771px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2-300x28.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_2-768x73.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="778" height="147" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3.jpg" alt="" class="wp-image-3575" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3.jpg 778w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3-300x57.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_3-768x145.jpg 768w" sizes="auto, (max-width: 778px) 100vw, 778px" /></figure>
</div>


<p></p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-3 kt-pane3520_a1b4ed-16"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Configuration</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Créons et éditons notre fichier de configuration. Je prendrai le temps d&rsquo;expliquer l&rsquo;intégralité du fichier de configuration.</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-8bf2e2ac7a6fa0624b3de515312c5c6b"><code><strong>$ sudo vim /etc/nginx/conf.d/openwebui.conf</strong></code></pre>



<pre class="wp-block-code"><code>server {
    listen 80;
    server_name 10.227.250.11;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name 10.227.250.11;

    ssl_certificate /etc/nginx/ssl/openwebui.crt;
    ssl_certificate_key /etc/nginx/ssl/openwebui.key;

    # TLS sécurisé
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;

    # sécurité headers
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # taille upload
    client_max_body_size 100M;

    # compression
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

    location / {

        proxy_pass http://10.227.250.11:8080;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket support (important OpenWebUI)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
}</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>La première section permet de réaliser la redirection du protocole HTTP vers HTTPS de manière permanente. Ainsi si je contacte l&rsquo;url http://10.227.250.11, je serais automatiquement redirigé vers https://10.227.254.11.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="211" class="wp-image-3580" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx.jpg 344w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_021_nginx-300x115.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr><tr><td>Le second bloc indique que nous écoutons sur le port 443 sur l&rsquo;interface 10.227.250.11. L&#8217;emplacement des fichiers contenant la clé privée ainsi que le certificat sont spécifiés pour activer la couche de sécurité (j&rsquo;ai l&rsquo;impression d&rsquo;enfoncer des portes ouvertes&#8230;). J&rsquo;indique qu&rsquo;elles sont les versions des protocoles TLS<sup data-fn="1a3ccfdd-7fad-428c-9f9a-15401188579d" class="fn"><a href="#1a3ccfdd-7fad-428c-9f9a-15401188579d" id="1a3ccfdd-7fad-428c-9f9a-15401188579d-link">17</a></sup> autorisées et laisse le serveur choisir le chiffrement le plus sûr.<br>Côté en-tête, j&rsquo;ai repris les suggestions de sécurité implémentée pour ITOP. Soit la restriction de mettre le site en iframe externe, de restreindre le navigateur à deviner le tye MIME qui est utilisé et surtout d&rsquo;activer la protection anti-cross-site scripting. Niveau upload, j&rsquo;ai vu large et j&rsquo;ai autorisé le téléversement de fichier de 100 Mio.<br>Côté performance, j&rsquo;ai activé la compression des flux pour optimiser un peu les performances réseaux.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="446" class="wp-image-3581" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx.jpg 651w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_022_nginx-300x243.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr><tr><td>Le troisième bloc concerne la partie Reverse Proxy.<br>Toutes les requêtes qui sont envoyées sur https://10.227.250.11 sont redirigées vers le port 8080.<br>Concernant les en-têtes il est nécessaire d&rsquo;utiliser les websockets car seront transmis l&rsquo;ip du client, le protocole utilisé et le NDD<sup data-fn="6f19f21f-54c7-433f-8a76-3c3d830f4eda" class="fn"><a href="#6f19f21f-54c7-433f-8a76-3c3d830f4eda" id="6f19f21f-54c7-433f-8a76-3c3d830f4eda-link">18</a></sup> ou l&rsquo;IP demandé.<br>Les deux lignes suivantes permettent de réaliser la jonction entre nginx et les websockets.</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="381" class="wp-image-3582" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx.jpg 530w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_023_nginx-300x208.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<p></p>



<p>Une fois la configuration faite, il est important de réaliser un petit contrôle de notre petit fichier afin de s&rsquo;assurer que ce dernier ne comporte pas d&rsquo;erreur. </p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-431bd28015d2c71adaab9e3913939a85"><code><strong>$ sudo nginx -t </strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="940" height="106" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4.jpg" alt="" class="wp-image-3578" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4.jpg 940w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4-300x34.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_4-768x87.jpg 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>
</div>


<p>Il faudra penser à recharger la configuration et hop le tour est joué.</p>
</div></div></div>



<div class="wp-block-kadence-pane kt-accordion-pane kt-accordion-pane-4 kt-pane3520_738fe8-6a"><div class="kt-accordion-header-wrap"><button class="kt-blocks-accordion-header kt-acccordion-button-label-show" type="button"><span class="kt-blocks-accordion-title-wrap"><span class="kt-blocks-accordion-title"><strong>Sécurité</strong></span></span><span class="kt-blocks-accordion-icon-trigger"></span></button></div><div class="kt-accordion-panel kt-accordion-panel-hidden"><div class="kt-accordion-panel-inner">
<p>Nous souhaitons toujours publier notre interface web en HTTPS. Donc il va falloir jouer avec nos UTMs !</p>



<p>Sur le plan interne, autorisons nos flux https :</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-71931f831671ed470001cbac0f47f7bc"><code><strong>$ sudo firewall-cmd --permanent --add-port=443/tcp
$ sudo firewall-cmd --reload</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="84" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5.jpg" alt="" class="wp-image-3576" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5.jpg 768w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_5-300x33.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p>Nous pourrions comme énoncé plus haut pour le protocole HTTP être bien plus rigoureux dans notre règle de sécurité. Mais encore une fois ayant un UTM en amont, j&rsquo;accepte le risque. Juste ne pas oublier de créer la règle sinon vous passez pour un c*n.</p>



<p>Si nous sommes joueurs, nous pouvons essayer de joindre directement notre interface web depuis notre navigateur. Normalement vous devez vous prendre dans les dents</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="606" height="230" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7.jpg" alt="" class="wp-image-3569" style="aspect-ratio:2.634850493445279;width:490px;height:auto" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7.jpg 606w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_7-300x114.jpg 300w" sizes="auto, (max-width: 606px) 100vw, 606px" /></figure>
</div>


<p>Ca vous fait la b**e hein ? Je vous rassure je me suis pris la même rouste. J&rsquo;ai oublié d&rsquo;autoriser le contexte de mon SELinux pour autoriser les services http à accéder aux réseaux 😀</p>



<pre class="wp-block-code has-theme-palette-9-color has-theme-palette-4-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-292226daa4277153a0a72abd06865dd7"><code><strong>$ sudo setsebool -P httpd_can_network_connect 1</strong></code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="731" height="23" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6.jpg" alt="" class="wp-image-3577" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6.jpg 731w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_6-300x9.jpg 300w" sizes="auto, (max-width: 731px) 100vw, 731px" /></figure>
</div>


<p>Un petit F5 et hop c&rsquo;est tout bon &lt;3</p>
</div></div></div>
</div></div></div>



<p></p>



<figure class="wp-block-table"><table class="has-fixed-layout" style="border-style:none;border-width:0px"><tbody><tr><td>Normalement avec toutes nos actions, nous devons joindre notre interface web depuis un navigateur de manière sécurisée (hormis l&rsquo;erreur liée à notre certificat autosigné).<br><br>Allez, on passe à la partie démonstration ?</td><td class="has-text-align-center" data-align="center"><img loading="lazy" decoding="async" width="550" height="355" class="wp-image-3571" style="width: 550px;" src="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8.jpg" alt="" srcset="https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8.jpg 958w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8-300x194.jpg 300w, https://erwanguillemard.com/wp-content/uploads/2026/03/AP_015_020_nginx_8-768x496.jpg 768w" sizes="auto, (max-width: 550px) 100vw, 550px" /></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Démonstration</h2>



<p>Pour le test, j&rsquo;ai décidé de changer un peu de format et de passer par des formats vidéo. Surtout que dans ce cas précis, cela évitera de mon côté de blablater. Cependant, ce n&rsquo;est pas pour autant que le travail est plus simple ou plus rapide.</p>



<p>J&rsquo;ai également pris le parti de commenter mes enregistrements et vidéos en anglais (oui même avec mon anglais aussi rouillé qu&rsquo;une vieille cantine de bidasse, si vous voulez <a href="https://www.youtube.com/watch?v=sufXl_PpKAk">trikitez mes vidéos</a> je vous laisse ce plaisir 🙂 ).</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="APPS   OpenWebUI" width="720" height="405" src="https://www.youtube.com/embed/UQW_L6yub3g?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Conclusion</h2>



<p>La combinaison des solutions OpenWebUI et Ollama fonctionne à la perfection. Si nous associons le côté multimodèle d&rsquo;Ollama et son fonctionnement hybride avec la puissance de l&rsquo;interface OpenWebUI il est alors possible de fournir une solution complète à destination des utilisateurs.</p>



<p>Toutefois, je reste profondément frustré pour l&rsquo;instant. L&rsquo;ajout de la couche OpenWebUI vient rallentir et allourdir l&rsquo;usage d&rsquo;Ollama. D&rsquo;un autre côté, est ce vraiment pertinent comme remarque à savoir que je ne réponds à aucun prérequis matériel ? C&rsquo;est là où le bât blesse encore une fois. Cela fonctionne mais à quel prix ?</p>



<p>Il est également important de prendre en compte les couts annexes et variables (comme au hasard, la consommation électrique, refroidissement&#8230;) périphériques à l&rsquo;usage de l&rsquo;IA. Nous parlons du réchauffement climatique, de limiter nos émissions de carbone et j&rsquo;en passe pour d&rsquo;un autre côté user de l&rsquo;IA à tort ou à raison. Je ne tiens pas à lancer un débat climatosceptique ou sur est-ce bien ou non d&rsquo;utiliser l&rsquo;IA.</p>



<p>Je pense simplement qu&rsquo;il y a encore beaucoup à faire pour accorder en synergie la puissance et l&rsquo;usage de l&rsquo;IA avec les convictions écologiques et environnementales. Si nous être vivant allons avoir chaud, que dire des CPUs/GPUs ? <strong><em>#tousdanslemêmebateau</em></strong> Bref, un moratoire serait nécessaire en somme. Mais je laisse ça au pisse violon que je suis.</p>



<p>Je reste convaincu de la fiabilité et viabilité de la solution dans un milieu professionnel, malheureusement, pour moi je préfère me passer de l&rsquo;interface Web. Donc en d&rsquo;autres termes, je vais rollback mon snapshot (ou restaurer mon backup au choix). Après tout, je peux toujours utiliser l&rsquo;interface CLI directement depuis une session SSH<sup data-fn="a61fa4e1-f1b4-4118-a125-8ff2b30744bb" class="fn"><a href="#a61fa4e1-f1b4-4118-a125-8ff2b30744bb" id="a61fa4e1-f1b4-4118-a125-8ff2b30744bb-link">19</a></sup> ? Oui mais pas que.</p>



<p class="has-text-align-center"><strong>Pourquoi ne pas faire une petite interface qui exploite l&rsquo;API Ollama ?</strong></p>



<p>Ah nous y voila ! Ca sent le projet long comme un jour sans pain encore en approche. Blague mis à part, peut être que cela n&rsquo;aboutira pas. Mais j&rsquo;ai envie de pousser relativement loin la solution Ollama.</p>



<p>Pour faire vraiment simple. OpenWebUI c&rsquo;est supercool mais il faut les ressources pour pouvoir l&rsquo;utiliser pleinement pour ne pas souffrir d&rsquo;une grande frustration. 🙂</p>



<p>Le mot de la fin :</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Je branche OpenWebUI sur une prise RJ45 en camembert ! Je contre avec un lama qui compile une girafe. Vous ne pouvez pas, il y a Sandrine ROUSSEAU au festival de la tête de veau.</em></p>
<cite>Erwan GUILLEMARD</cite></blockquote>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">
<li><a href="https://docs.openwebui.com/getting-started/">OpenWebUI : Quick Started</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="9b4b7116-7da7-4c05-943e-ac072573b13f"><strong>LLM : </strong>Large Language Models <a href="#9b4b7116-7da7-4c05-943e-ac072573b13f-link" aria-label="Aller à la note de bas de page 1">↩︎</a></li><li id="f36cb89d-8ac6-4ed0-8df5-7d578d4680c4"><strong>IA :</strong> Intelligence Artificielle <a href="#f36cb89d-8ac6-4ed0-8df5-7d578d4680c4-link" aria-label="Aller à la note de bas de page 2">↩︎</a></li><li id="9e902093-392b-4860-a9f8-d2c28cf28686"><strong>RHEL :</strong> RedHat Entreprise Linux <a href="#9e902093-392b-4860-a9f8-d2c28cf28686-link" aria-label="Aller à la note de bas de page 3">↩︎</a></li><li id="4a15f514-bc25-45dc-8c12-3f5fd10c286d"><strong>DSI :</strong> Direction des Services Informatiques <a href="#4a15f514-bc25-45dc-8c12-3f5fd10c286d-link" aria-label="Aller à la note de bas de page 4">↩︎</a></li><li id="63b8e4f1-84bc-47ad-8afa-7dae59217921"><strong>CPU :</strong> Central Processing Unit <a href="#63b8e4f1-84bc-47ad-8afa-7dae59217921-link" aria-label="Aller à la note de bas de page 5">↩︎</a></li><li id="f958a01e-8b83-4fc9-a592-006e9651956c"><strong>RAM :</strong> Random Access Memory <a href="#f958a01e-8b83-4fc9-a592-006e9651956c-link" aria-label="Aller à la note de bas de page 6">↩︎</a></li><li id="8f6e0338-719e-4456-808e-82e0a17b70ea"><strong>SSD :</strong> Solid State Drive <a href="#8f6e0338-719e-4456-808e-82e0a17b70ea-link" aria-label="Aller à la note de bas de page 7">↩︎</a></li><li id="57be53ba-9128-49e7-ae7a-c337f01cf69e"><strong>GPU :</strong> Graphics Processing Unit <a href="#57be53ba-9128-49e7-ae7a-c337f01cf69e-link" aria-label="Aller à la note de bas de page 8">↩︎</a></li><li id="f4993b7e-0f63-4b56-886c-b4e26648314b"><strong>HTTP :</strong> Hypertext Transfer Protocol <a href="#f4993b7e-0f63-4b56-886c-b4e26648314b-link" aria-label="Aller à la note de bas de page 9">↩︎</a></li><li id="1d2044d0-2a6b-4f6c-9865-c8cded2e72e1"><strong>HTTPS :</strong> Hypertext Transfer Protocol Secure <a href="#1d2044d0-2a6b-4f6c-9865-c8cded2e72e1-link" aria-label="Aller à la note de bas de page 10">↩︎</a></li><li id="688876c0-5948-48bf-baaf-3d493e2e5c01"><strong>SE :</strong> Système d&rsquo;Exploitation <a href="#688876c0-5948-48bf-baaf-3d493e2e5c01-link" aria-label="Aller à la note de bas de page 11">↩︎</a></li><li id="13f6c481-ca7e-4e73-875d-cf307bad64ec"><strong>UTM :</strong> Unified Threat Management <a href="#13f6c481-ca7e-4e73-875d-cf307bad64ec-link" aria-label="Aller à la note de bas de page 12">↩︎</a></li><li id="ac43ad3e-9b07-4981-8114-d187d3cf6dbf"><strong>WAN :</strong> Wide Area Network <a href="#ac43ad3e-9b07-4981-8114-d187d3cf6dbf-link" aria-label="Aller à la note de bas de page 13">↩︎</a></li><li id="103fd0e8-cd60-41ff-b80a-9c51d9c20b76"><strong>DMZ : </strong>DeMilitarized Zone <a href="#103fd0e8-cd60-41ff-b80a-9c51d9c20b76-link" aria-label="Aller à la note de bas de page 14">↩︎</a></li><li id="2f21ddb8-be62-4029-92fc-283d894d896c"><strong>VM :</strong> Virtual Machine <a href="#2f21ddb8-be62-4029-92fc-283d894d896c-link" aria-label="Aller à la note de bas de page 15">↩︎</a></li><li id="96e1bb31-3abc-4f7d-9141-265b48fe943e"><strong>CLI : </strong>Command Line Interface <a href="#96e1bb31-3abc-4f7d-9141-265b48fe943e-link" aria-label="Aller à la note de bas de page 16">↩︎</a></li><li id="1a3ccfdd-7fad-428c-9f9a-15401188579d"><strong>TLS :</strong> Transport Layer Security <a href="#1a3ccfdd-7fad-428c-9f9a-15401188579d-link" aria-label="Aller à la note de bas de page 17">↩︎</a></li><li id="6f19f21f-54c7-433f-8a76-3c3d830f4eda"><strong>NDD :</strong> Nom De Domaine <a href="#6f19f21f-54c7-433f-8a76-3c3d830f4eda-link" aria-label="Aller à la note de bas de page 18">↩︎</a></li><li id="a61fa4e1-f1b4-4118-a125-8ff2b30744bb"><strong>SSH :</strong> Secure SHell <a href="#a61fa4e1-f1b4-4118-a125-8ff2b30744bb-link" aria-label="Aller à la note de bas de page 19">↩︎</a></li></ol>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
