<?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>IA Archives | Clever Cloud</title>
	<atom:link href="https://stagingv6.cleverapps.io/fr/blog/tag/ia/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>From Code to Product</description>
	<lastBuildDate>Tue, 28 Nov 2023 16:26:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/03/cropped-cropped-favicon-32x32.png</url>
	<title>IA Archives | Clever Cloud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Déployez llama, mistral, openchat ou votre propre modèle sur Clever Cloud</title>
		<link>https://stagingv6.cleverapps.io/fr/blog/engineering-fr/2023/11/27/deployez-llama-mistral-openchat-ou-votre-propre-modele-sur-clever-cloud/</link>
		
		<dc:creator><![CDATA[David Legrand]]></dc:creator>
		<pubDate>Mon, 27 Nov 2023 09:22:00 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[IA]]></category>
		<guid isPermaLink="false">https://stagingv6.cleverapps.io/?p=11187</guid>

					<description><![CDATA[<p><img width="900" height="355" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Bannière de blog pour illustrer le déploiement d&#039;IA sur Clever Cloud" decoding="async" fetchpriority="high" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc.png 900w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc-300x118.png 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc-768x303.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></p><!-- wp:paragraph -->
<p><strong>Si l'IA fait parler d'elle ces derniers temps, c'est notamment au travers des larges modèles de langages (LLMs)  qui nécessitent une puissance de calcul conséquente pour leur entrainement ou leur exécution. Ainsi, il est courant de voir les développeurs y recourir à travers des API clés en main, comme nous l'avions fait <a href="https://stagingv6.cleverapps.io/fr/blog/fonctionnalites/2023/10/11/deployez-un-chatgpt-personnalise-base-sur-php/">dans un précédent article</a>. Mais cela change grâce à des modèles et outils plus ouverts et efficaces, que vous pouvez très facilement déployer sur Clever Cloud.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>En effet, si notre plateforme a été pensée pour certains usages, nous avons toujours accordé une grande importance à sa flexibilité et à la liberté laissée à nos clients. Ils peuvent ainsi aisément l'exploiter pour attaquer de nouveaux marchés, avec très peu de travail d'adaptation.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour le vérifier, nous avons récemment tenté de déployer des modèles d'IA open source tels que ceux dérivés de LLaMA et Mistral. Ils ont pour particularité d'exister dans des versions allégées, ne nécessitant pas forcément de GPU pour fonctionner. Ainsi, il est possible de les héberger comme de simples applications Clever Cloud, tant qu'assez de mémoire leur est attribuée.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Let's ollama (avec une interface web) !</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour cela, nous avons choisi d'utiliser <a href="https://github.com/jmorganca/ollama" target="_blank" rel="noreferrer noopener">ollama</a>, un projet sous licence MIT qui permet de télécharger des modèles disponibles depuis <a href="https://ollama.ai/library">un registre</a> ou même <a href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md" target="_blank" rel="noreferrer noopener">les vôtres</a>. Il prend la forme d'un serveur qui communique via une API, très simple à héberger sur nos infrastructures.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://api.clever-cloud.com/v2/session/signup">Créer un compte Clever Cloud</a>&nbsp;(et obtenir 20 euros de crédits)</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pour commencer, vous devrez disposer d'un compte Clever Cloud. Vous pouvez créer l'application et suivre les étapes suivantes en utilisant notre interface web,<a href="https://console.clever-cloud.com"> la Console</a>, mais aussi à travers notre CLI open source : <a href="https://github.com/CleverCloud/clever-tools" target="_blank" rel="noreferrer noopener">Clever Tools</a>. C'est ce que nous ferons ci-dessous. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Nous partirons ainsi du principe que vous disposez d’une machine avec&nbsp;<a href="https://git-scm.com/book/fr/v2/D%C3%A9marrage-rapide-Installation-de-Git" target="_blank" rel="noreferrer noopener">git</a>&nbsp;et&nbsp;<a href="https://nodejs.org/en/learn/getting-started/how-to-install-nodejs" target="_blank" rel="noreferrer noopener">Node.js</a>&nbsp;dans une version récente. Si vous n’avez pas encore installé les Clever Tools sur votre système, tapez (avec les droits administrateur de votre système ou&nbsp;<code>sudo</code>&nbsp;si nécessaire) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">npm i -g clever-tools
clever login</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois connecté, vous pourrez vérifier que tout s’est bien passé avec la commande suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever profile</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ensuite, nous créons une application Clever Cloud avec Node.js. Elle installera ollama pour télécharger et exécuter nos modèles, en lui ajoutant avec une interface web (<a href="https://github.com/ivanfioravanti/chatbot-ollama" target="_blank" rel="noreferrer noopener">chatbot-ollama</a>, également sous licence MIT) qui nous permettra d'interroger le serveur depuis n'importe quel navigateur, exécuté depuis un ordinateur ou même un simple smartphone.  </p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"wide","id":11239,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image alignwide size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/11/sans-titre-1-scaled.webp" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/11/sans-titre-1-scaled.webp" alt="Chatbot Ollama" class="wp-image-11239" title="Chatbot Ollama"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Cette solution a également l'intérêt de stocker les conversations localement, dans le navigateur. Elle ne nécessite donc pas de base de données, mais propose une fonction d'import/export. On peut également choisir entre différents modèles, régler certains de leurs paramètres, configurer des instructions système, différents prompts, etc.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">mkdir myollama && cd myollama
git init
curl -L https://github.com/ivanfioravanti/chatbot-ollama/archive/refs/heads/main.tar.gz | tar -xz --strip-components=1

clever create -t node myollama && clever scale --flavor L
clever env set CC_POST_BUILD_HOOK "npx next telemetry disable && npm run build"
clever env set CC_PRE_BUILD_HOOK "./ollama_setup.sh"
clever env set CC_PRE_RUN_HOOK "./ollama_start.sh"

echo "orca-mini" > models.list
echo "mistral" >> models.list
echo "codellama" >> models.list</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le code ci-dessus créé l'application. Nous y ajoutons un fichier qui contiendra la liste des modèles à récupérer lors de son initialisation. Nous optons pour une instance L, la taille minimale pour charger de tels modèles en mémoire. On déclare ensuite plusieurs variables d'environnement pour lancer des scripts afin d'installer ollama, démarrer le serveur et désactiver la télémétrie du framework Next.js, utilisé pour construire l'interface web après l'installation des dépendances.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ajoutons quelques scripts</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Notre application est presque prête. Il nous reste en effet à créer deux fichiers, exécutables :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">touch ollama_setup.sh && chmod +x ollama_setup.sh
touch ollama_start.sh && chmod +x ollama_start.sh</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p><code>ollama_setup.sh</code> télécharge le binaire d'ollama puis les modèles de notre liste. Ouvrez-le avec l'éditeur de votre choix et placez-y le contenu suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">#!/bin/bash

# We define the folder (in $PATH), where the ollama binary will be placed
BIN_DIR=${HOME}/.local/bin
mkdir -p ${BIN_DIR} 

ollama_start() {
    echo "Downloading and launching ollama..."
    curl -Ls https://ollama.ai/download/ollama-linux-amd64 -o ${BIN_DIR}/ollama
    chmod +x ${BIN_DIR}/ollama
    ollama serve &> /dev/null &
    echo -e "Finished: \033[32m✔\033[0m\n"
}

get_models() {
    MODELS_FILE="models.list"
    MODELS_DEFAULT="orca-mini"

    # We check if the models file exists
    if [ ! -f ${MODELS_FILE} ]; then
        echo "File ${MODELS_FILE} not found, ${MODELS_DEFAULT} used by default."
        echo ${MODELS_DEFAULT} > ${MODELS_FILE}
    fi

    # Loop through each line and pull model
    while IFS= read -r line; do
        echo "Pulling ${line} model..."
        ollama pull "${line}" > /dev/null 2>&1
        echo -e "Finished: \033[32m✔\033[0m\n"

    done < ${MODELS_FILE}
}

# We start ollama, and wait for it to respond
ollama_start
if [ $? -ne 0 ]; then
    echo -e "\nError during ollama setup."
    exit 1
fi

count=0
MAX_TIME=10

while ! pgrep -x "ollama" > /dev/null; do
    if [ ${count} -lt ${MAX_TIME} ]; then
        sleep 1
        count=$((count+1))
    else
        echo "Application 'ollama' did not launch within 10 seconds."
        exit 1
    fi
done

get_models
if [ $? -ne 0 ]; then
    echo -e "\nError during models downloading."
    exit 1
fi
</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce code peut paraître un peu long, mais c'est notamment parce que nous l'avons rendu modulaire, en n'écrivant dans les logs que les étapes réussies ou les éventuelles erreurs.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>ollama_start.sh</code> détecte si le serveur ollama est déjà présent avant de démarrer l'interface web. Si ce n'est pas le cas, on le lance en tâche de fond (nous verrons plus bas pourquoi). </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Ouvrez-le avec l'éditeur de votre choix et placez-y le contenu suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">if ! pgrep -f "ollama" > /dev/null; then
    # If 'ollama' is not running, start it in the background
    ollama serve &
    echo "Application 'ollama' started."
else
    # If 'ollama' is already running
    echo "'ollama' application is already running."
fi
</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois ces deux fichiers créés, on peut déployer notre application : </p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git add . && git commit -m "Init application"
clever deploy
clever domain</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous verrez alors le domaine pour accéder à votre application (que vous pouvez personnaliser).</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Cache et (re)démarrage rapide</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Utiliser Clever Cloud, ce n'est pas simplement déployer facilement une telle application, disposer de logs et de monitoring, pouvoir changer instantanément son scaling horizontal et/ou vertical. C'est aussi pouvoir en faire une image prête à redéployer très rapidement.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>En effet, toute application que nous hébergeons est stockée sous la forme d'une archive constituée juste avant l'installation des dépendances. Elle peut ainsi être arrêtée et de rédémarrée sous cette forme, ce qui nous permet de ne pas retélécharger les modèles à chaque fois. Pour cela, il suffit d'indiquer les dossiers à ajouter à l'archive :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_OVERRIDE_BUILDCACHE "/:../.ollama/:../.local/bin/"
clever restart --without-cache --follow</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>L'application redémarrera, mais prendra cette fois les l'interface web construite, ollama et les modèles dans son cache, les étapes <code>CC_PRE_BUILD_HOOK</code> et <code>CC_PRE_BUILD_HOOK</code> n'étant pas exécutées. C'est notamment pour cela que nous devons nous assurer que l'on démarre bien le serveur ollama avec <code>CC_PRE_RUN_HOOK</code>, mais que l'on vérifie que cela n'a pas déjà été fait lors d'un démarrage classique; où il est utilisé pour télécharger les modèles avant de les exécuter.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Dès que cette étape est terminée, vous pouvez arrêter l'application et la redémarrer lorsque vous voulez, cela sera désormais bien plus rapide. Et vous ne serez facturé que le temps de son usage, à la seconde. Si vous voulez modifier la liste des modèles à utiliser, faites le dans le fichier prévu à cet effet, un <em>git push</em> suffira à reconstituer le nouveau cache.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash"># Stop/Restart the application
clever stop
clever restart

# After a modification in models.list, git push to recreate the cache
git add models.list && git commit -m "New models" 
clever deploy</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous retrouverez le fichiers nécessaires à ce projet dans <a href="https://github.com/CleverCloud/ollama-chat-deploy" target="_blank" rel="noreferrer noopener">ce dépôt GitHub</a>, avec les variables d'environnement prêtes à importer (<code>clever env import &lt; .env</code>). </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Et si jamais vous voulez aller plus loin en déployant d'autres modèles et outils pour vos applications, qui nécessitent plus de puissance et/ou du GPU, <a href="https://stagingv6.cleverapps.io/fr/contact/">faites-le nous savoir</a> !</p>
<!-- /wp:paragraph -->]]></description>
										<content:encoded><![CDATA[<p><img width="900" height="355" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Bannière de blog pour illustrer le déploiement d&#039;IA sur Clever Cloud" decoding="async" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc.png 900w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc-300x118.png 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/11/deploiementiasurcc-768x303.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></p><!-- wp:paragraph -->
<p><strong>Si l'IA fait parler d'elle ces derniers temps, c'est notamment au travers des larges modèles de langages (LLMs)  qui nécessitent une puissance de calcul conséquente pour leur entrainement ou leur exécution. Ainsi, il est courant de voir les développeurs y recourir à travers des API clés en main, comme nous l'avions fait <a href="https://stagingv6.cleverapps.io/fr/blog/fonctionnalites/2023/10/11/deployez-un-chatgpt-personnalise-base-sur-php/">dans un précédent article</a>. Mais cela change grâce à des modèles et outils plus ouverts et efficaces, que vous pouvez très facilement déployer sur Clever Cloud.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>En effet, si notre plateforme a été pensée pour certains usages, nous avons toujours accordé une grande importance à sa flexibilité et à la liberté laissée à nos clients. Ils peuvent ainsi aisément l'exploiter pour attaquer de nouveaux marchés, avec très peu de travail d'adaptation.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour le vérifier, nous avons récemment tenté de déployer des modèles d'IA open source tels que ceux dérivés de LLaMA et Mistral. Ils ont pour particularité d'exister dans des versions allégées, ne nécessitant pas forcément de GPU pour fonctionner. Ainsi, il est possible de les héberger comme de simples applications Clever Cloud, tant qu'assez de mémoire leur est attribuée.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Let's ollama (avec une interface web) !</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour cela, nous avons choisi d'utiliser <a href="https://github.com/jmorganca/ollama" target="_blank" rel="noreferrer noopener">ollama</a>, un projet sous licence MIT qui permet de télécharger des modèles disponibles depuis <a href="https://ollama.ai/library">un registre</a> ou même <a href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md" target="_blank" rel="noreferrer noopener">les vôtres</a>. Il prend la forme d'un serveur qui communique via une API, très simple à héberger sur nos infrastructures.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://api.clever-cloud.com/v2/session/signup">Créer un compte Clever Cloud</a>&nbsp;(et obtenir 20 euros de crédits)</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pour commencer, vous devrez disposer d'un compte Clever Cloud. Vous pouvez créer l'application et suivre les étapes suivantes en utilisant notre interface web,<a href="https://console.clever-cloud.com"> la Console</a>, mais aussi à travers notre CLI open source : <a href="https://github.com/CleverCloud/clever-tools" target="_blank" rel="noreferrer noopener">Clever Tools</a>. C'est ce que nous ferons ci-dessous. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Nous partirons ainsi du principe que vous disposez d’une machine avec&nbsp;<a href="https://git-scm.com/book/fr/v2/D%C3%A9marrage-rapide-Installation-de-Git" target="_blank" rel="noreferrer noopener">git</a>&nbsp;et&nbsp;<a href="https://nodejs.org/en/learn/getting-started/how-to-install-nodejs" target="_blank" rel="noreferrer noopener">Node.js</a>&nbsp;dans une version récente. Si vous n’avez pas encore installé les Clever Tools sur votre système, tapez (avec les droits administrateur de votre système ou&nbsp;<code>sudo</code>&nbsp;si nécessaire) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">npm i -g clever-tools
clever login</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois connecté, vous pourrez vérifier que tout s’est bien passé avec la commande suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever profile</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ensuite, nous créons une application Clever Cloud avec Node.js. Elle installera ollama pour télécharger et exécuter nos modèles, en lui ajoutant avec une interface web (<a href="https://github.com/ivanfioravanti/chatbot-ollama" target="_blank" rel="noreferrer noopener">chatbot-ollama</a>, également sous licence MIT) qui nous permettra d'interroger le serveur depuis n'importe quel navigateur, exécuté depuis un ordinateur ou même un simple smartphone.  </p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"wide","id":11239,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image alignwide size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/11/sans-titre-1-scaled.webp" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/11/sans-titre-1-scaled.webp" alt="Chatbot Ollama" class="wp-image-11239" title="Chatbot Ollama"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Cette solution a également l'intérêt de stocker les conversations localement, dans le navigateur. Elle ne nécessite donc pas de base de données, mais propose une fonction d'import/export. On peut également choisir entre différents modèles, régler certains de leurs paramètres, configurer des instructions système, différents prompts, etc.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">mkdir myollama && cd myollama
git init
curl -L https://github.com/ivanfioravanti/chatbot-ollama/archive/refs/heads/main.tar.gz | tar -xz --strip-components=1

clever create -t node myollama && clever scale --flavor L
clever env set CC_POST_BUILD_HOOK "npx next telemetry disable && npm run build"
clever env set CC_PRE_BUILD_HOOK "./ollama_setup.sh"
clever env set CC_PRE_RUN_HOOK "./ollama_start.sh"

echo "orca-mini" > models.list
echo "mistral" >> models.list
echo "codellama" >> models.list</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le code ci-dessus créé l'application. Nous y ajoutons un fichier qui contiendra la liste des modèles à récupérer lors de son initialisation. Nous optons pour une instance L, la taille minimale pour charger de tels modèles en mémoire. On déclare ensuite plusieurs variables d'environnement pour lancer des scripts afin d'installer ollama, démarrer le serveur et désactiver la télémétrie du framework Next.js, utilisé pour construire l'interface web après l'installation des dépendances.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ajoutons quelques scripts</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Notre application est presque prête. Il nous reste en effet à créer deux fichiers, exécutables :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">touch ollama_setup.sh && chmod +x ollama_setup.sh
touch ollama_start.sh && chmod +x ollama_start.sh</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p><code>ollama_setup.sh</code> télécharge le binaire d'ollama puis les modèles de notre liste. Ouvrez-le avec l'éditeur de votre choix et placez-y le contenu suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">#!/bin/bash

# We define the folder (in $PATH), where the ollama binary will be placed
BIN_DIR=${HOME}/.local/bin
mkdir -p ${BIN_DIR} 

ollama_start() {
    echo "Downloading and launching ollama..."
    curl -Ls https://ollama.ai/download/ollama-linux-amd64 -o ${BIN_DIR}/ollama
    chmod +x ${BIN_DIR}/ollama
    ollama serve &> /dev/null &
    echo -e "Finished: \033[32m✔\033[0m\n"
}

get_models() {
    MODELS_FILE="models.list"
    MODELS_DEFAULT="orca-mini"

    # We check if the models file exists
    if [ ! -f ${MODELS_FILE} ]; then
        echo "File ${MODELS_FILE} not found, ${MODELS_DEFAULT} used by default."
        echo ${MODELS_DEFAULT} > ${MODELS_FILE}
    fi

    # Loop through each line and pull model
    while IFS= read -r line; do
        echo "Pulling ${line} model..."
        ollama pull "${line}" > /dev/null 2>&1
        echo -e "Finished: \033[32m✔\033[0m\n"

    done < ${MODELS_FILE}
}

# We start ollama, and wait for it to respond
ollama_start
if [ $? -ne 0 ]; then
    echo -e "\nError during ollama setup."
    exit 1
fi

count=0
MAX_TIME=10

while ! pgrep -x "ollama" > /dev/null; do
    if [ ${count} -lt ${MAX_TIME} ]; then
        sleep 1
        count=$((count+1))
    else
        echo "Application 'ollama' did not launch within 10 seconds."
        exit 1
    fi
done

get_models
if [ $? -ne 0 ]; then
    echo -e "\nError during models downloading."
    exit 1
fi
</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce code peut paraître un peu long, mais c'est notamment parce que nous l'avons rendu modulaire, en n'écrivant dans les logs que les étapes réussies ou les éventuelles erreurs.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>ollama_start.sh</code> détecte si le serveur ollama est déjà présent avant de démarrer l'interface web. Si ce n'est pas le cas, on le lance en tâche de fond (nous verrons plus bas pourquoi). </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Ouvrez-le avec l'éditeur de votre choix et placez-y le contenu suivant :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">if ! pgrep -f "ollama" > /dev/null; then
    # If 'ollama' is not running, start it in the background
    ollama serve &
    echo "Application 'ollama' started."
else
    # If 'ollama' is already running
    echo "'ollama' application is already running."
fi
</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois ces deux fichiers créés, on peut déployer notre application : </p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git add . && git commit -m "Init application"
clever deploy
clever domain</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous verrez alors le domaine pour accéder à votre application (que vous pouvez personnaliser).</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Cache et (re)démarrage rapide</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Utiliser Clever Cloud, ce n'est pas simplement déployer facilement une telle application, disposer de logs et de monitoring, pouvoir changer instantanément son scaling horizontal et/ou vertical. C'est aussi pouvoir en faire une image prête à redéployer très rapidement.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>En effet, toute application que nous hébergeons est stockée sous la forme d'une archive constituée juste avant l'installation des dépendances. Elle peut ainsi être arrêtée et de rédémarrée sous cette forme, ce qui nous permet de ne pas retélécharger les modèles à chaque fois. Pour cela, il suffit d'indiquer les dossiers à ajouter à l'archive :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_OVERRIDE_BUILDCACHE "/:../.ollama/:../.local/bin/"
clever restart --without-cache --follow</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>L'application redémarrera, mais prendra cette fois les l'interface web construite, ollama et les modèles dans son cache, les étapes <code>CC_PRE_BUILD_HOOK</code> et <code>CC_PRE_BUILD_HOOK</code> n'étant pas exécutées. C'est notamment pour cela que nous devons nous assurer que l'on démarre bien le serveur ollama avec <code>CC_PRE_RUN_HOOK</code>, mais que l'on vérifie que cela n'a pas déjà été fait lors d'un démarrage classique; où il est utilisé pour télécharger les modèles avant de les exécuter.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Dès que cette étape est terminée, vous pouvez arrêter l'application et la redémarrer lorsque vous voulez, cela sera désormais bien plus rapide. Et vous ne serez facturé que le temps de son usage, à la seconde. Si vous voulez modifier la liste des modèles à utiliser, faites le dans le fichier prévu à cet effet, un <em>git push</em> suffira à reconstituer le nouveau cache.</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash"># Stop/Restart the application
clever stop
clever restart

# After a modification in models.list, git push to recreate the cache
git add models.list && git commit -m "New models" 
clever deploy</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous retrouverez le fichiers nécessaires à ce projet dans <a href="https://github.com/CleverCloud/ollama-chat-deploy" target="_blank" rel="noreferrer noopener">ce dépôt GitHub</a>, avec les variables d'environnement prêtes à importer (<code>clever env import &lt; .env</code>). </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Et si jamais vous voulez aller plus loin en déployant d'autres modèles et outils pour vos applications, qui nécessitent plus de puissance et/ou du GPU, <a href="https://stagingv6.cleverapps.io/fr/contact/">faites-le nous savoir</a> !</p>
<!-- /wp:paragraph -->]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Déployez un ChatGPT personnalisé basé sur PHP</title>
		<link>https://stagingv6.cleverapps.io/fr/blog/fonctionnalites/2023/10/11/deployez-un-chatgpt-personnalise-base-sur-php/</link>
		
		<dc:creator><![CDATA[David Legrand]]></dc:creator>
		<pubDate>Wed, 11 Oct 2023 07:21:04 +0000</pubDate>
				<category><![CDATA[Fonctionnalités]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://stagingv6.cleverapps.io/?p=10554</guid>

					<description><![CDATA[<p><img width="573" height="266" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/10/1.svg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="bannière déployez un chatgpt PHP" decoding="async" loading="lazy" /></p><!-- wp:paragraph -->
<p><strong>Depuis l'année dernière, OpenAI est sur le devant de la scène avec ses larges modèles de langage (LLM), notamment GPT-3.5 et GPT-4, accessibles via son service ChatGPT. Mais ils sont également proposés sous la forme d'une API, que vous pouvez utiliser dans vos applications. Voici un exemple de la manière d'en profiter sur Clever Cloud.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Nous nous baserons sur le projet open source <a href="https://github.com/unconv/chat-wtf" target="_blank" rel="noreferrer noopener">chat-wtf</a>, créé par Unconventional Coding qui a détaillé les différentes étapes de sa conception dans <a href="https://www.youtube.com/watch?v=0FUz4CtalhY" target="_blank" rel="noreferrer noopener">une série de vidéos</a>. Il se repose principalement <a href="https://stagingv6.cleverapps.io/fr/product/applications-php/">sur le langage PHP</a> et un stockage des données via des sessions, SQLite ou <a href="https://stagingv6.cleverapps.io/fr/product/mysql-a-traduire-en-fr/">MySQL</a>, au choix de l'utilisateur. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Un ChatGPT open source, utilisable à la demande</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Il nécessite d'utiliser  <a href="https://platform.openai.com/overview" target="_blank" rel="noreferrer noopener">l'API d'OpenAI</a>, mais vous pouvez lui préférer des modèles compatibles si vous êtes plus aventureux. Le fichier de paramètres permet également de préciser un «&nbsp;message système&nbsp;». Ainsi, vous pouvez fournir à l'IA des informations sur vous ou vos attentes, qu'elle devra prendre en compte dans ses réponses.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Cette application PHP n'a pas été développée d'une manière spécifique pour Clever Cloud, mais vous pouvez l'héberger dans nos infrastructures en quelques minutes, la configurer selon vos besoins, l'arrêter et le démarrer à la demande. On vous explique comment faire.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://api.clever-cloud.com/v2/session/signup">Créer un compte Clever Cloud</a>&nbsp;(et obtenir 20 euros de crédits)</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pour commencer, vous devrez disposer d'un compte Clever Cloud, ainsi que d'une clé d'API OpenAI. Vous pouvez créer l'application et suivre ce guide en utilisant notre interface web,<a href="https://console.clever-cloud.com"> la Console</a>, mais aussi à travers notre CLI open source : <a href="https://github.com/CleverCloud/clever-tools" target="_blank" rel="noreferrer noopener">Clever Tools</a>. C'est ce que nous ferons ci-dessous. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Récupération du code et configuration</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Nous partirons ainsi du principe que vous disposez d’une machine avec&nbsp;<a href="https://git-scm.com/book/fr/v2/D%C3%A9marrage-rapide-Installation-de-Git" target="_blank" rel="noreferrer noopener">git</a>&nbsp;et&nbsp;<a href="https://nodejs.dev/fr/learn/how-to-install-nodejs/" target="_blank" rel="noreferrer noopener">Node.js</a>&nbsp;dans une version récente. Si vous n’avez pas encore installé les Clever Tools sur votre système, tapez (avec les droits administrateur de votre système ou&nbsp;<code>sudo</code>&nbsp;si nécessaire) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">npm i -g clever-tools
clever login</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois connecté, vous pourrez vérifier que tout s’est bien passé avec la commande suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever profile</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ensuite, vous pourrez créer un <em>fork</em> de chat-wtf pouvant être déployé sur Clever Cloud depuis votre compte GitHub. Dans cet exemple, nous allons cloner le dépôt localement et y créer une application Clever Cloud. Un remote nécessaire à son déploiement sera automatiquement ajouté :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git clone https://github.com/unconv/chat-wtf.git && cd chat-wtf
clever create -t php chat-wtf</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ainsi, vous disposez d'une copie locale de la dernière version de l'application chat-wtf, que vous pouvez configurer selon votre besoin. Renommez le fichier <code>settings.sample.php</code> en <code>settings.php</code>. Nous allons opérer des modifications mineures pour commencer. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Placez-y le contenu suivant afin d'utiliser des variables d'environnement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-php">&#x3C;?php
return [
    &#x22;api_key&#x22; =&#x3E; getenv("OPENAI_API_KEY"),
    &#x22;system_message&#x22; =&#x3E; getenv("SYSTEM_MESSAGE"),
    &#x22;model&#x22; =&#x3E; &#x22;gpt-3.5-turbo&#x22;,
    &#x22;base_uri&#x22; =&#x3E; &#x22;&#x22;,
    &#x22;storage_type&#x22; =&#x3E; &#x22;session&#x22;,
];</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Éditez le fichier <code>.gitignore</code> afin d'en retirer <code>settings.php</code> pour qu'il puisse être déployé avec votre application. Celle-ci étant configurée, il ne reste plus qu'à indiquer les variables d'environnement nécessaires à son bon fonctionnement, puis à la déployer. Notez que PHP 8.x est requis. Nous utiliserons la branche 8.2 :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_PHP_VERSION "8.2"
clever env set OPENAI_API_KEY "Votre clé d'API OpenAI"
clever env set SYSTEM_MESSAGE "Votre message système"
git add . && git commit -m "First deploy"
clever deploy && clever open</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois les variables d'environnement ajoutées, nous effectuons un simple <em>Git Push</em>. L'application est alors déployée sur Clever Cloud, une archive est créée afin de faciliter son redéploiement, puis elle est ouverte dans votre navigateur si tout s'est bien passé :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":10576,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image aligncenter size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/10/image-2.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/10/image-2.png" alt="Chat WTF on Clever Cloud" class="wp-image-10576"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Comme pour toute application hébergée au sein de notre service, vous pouvez lui attribuer simplement un domaine qui bénéficiera de notre load balancer <a href="https://www.sozu.io/" target="_blank" rel="noreferrer noopener">Sōzu</a> et d'un certificat Let's Encrypt, connaître son statut et son activité, l'arrêter ou la redémarrer. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Vous disposez dans <a href="https://console.clever-cloud.com">la Console</a> de métriques et d'un accès à un dashboard Grafana afin de suivre son état. Vous pouvez également adapter la taille de l' instance ou activer l'auto-scalabiilté pour répondre à différents niveaux de charge :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever console

clever domain
clever domain add domain.tld

clever status
clever activity

clever scale --min-instances 1 --max-instances 4 --min-flavor pico --max-flavor M
clever scale --instances 1 --flavor pico

clever restart
clever stop</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ajoutons une base de données à notre instance chat-wtf</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Comme indiqué précédemment, ce projet peut stocker ses données au sein de sessions PHP, mais également via SQLite ou MySQL. Dans cet exemple, nous opterons pour la dernière solution afin de vous montrer comment procéder, là aussi de manière très simple.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Tout d'abord créons une base de données (BDD) MySQL au sein de votre compte Clever Cloud en la liant directement à votre application. Par défaut il s'agit d'une instance DEV, partagée et gratuite, mais vous pouvez demander <a href="https://stagingv6.cleverapps.io/fr/tarification/">un plan</a> de taille supérieure si vous le désirez :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever addon create mysql-addon chat-wtf-mysql --link chat-wtf</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce « lien » permet d'injecter directement les paramètres de connexion dans l'application via des variables d'environnement. Elles sont visibles dans la Console ou via les Clever Tools :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ainsi, il suffit de modifier le fichier <code>settings.php</code> comme suit pour l'utiliser :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-php">    &#x22;storage_type&#x22; =&#x3E; &#x22;sql&#x22;,
    &#x22;db&#x22; =&#x3E; [
        &#x22;dsn&#x22; =&#x3E; &#x22;mysql:host=&#x22; . getenv(&#x27;MYSQL_ADDON_HOST&#x27;) . &#x22;;
                    port=&#x22; . getenv(&#x27;MYSQL_ADDON_PORT&#x27;) . &#x22;;
                    dbname=&#x22; . getenv(&#x27;MYSQL_ADDON_DB&#x27;),
        &#x22;username&#x22; =&#x3E; getenv(&#x27;MYSQL_ADDON_USER&#x27;),
        &#x22;password&#x22; =&#x3E; getenv(&#x27;MYSQL_ADDON_PASSWORD&#x27;),
    ],</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Rendez-vous ensuite dans le <em>dashboard</em> de cette base MySQL, accessible via la Console. Vous y trouverez un lien vers son interface PHPMyAdmin. En cliquant sur le nom de la base de données dans le menu de gauche vous trouverez la fonction d'import. Elle vous permettra d'initier la structure de la BDD en y important le fichier <code>mysql.sql</code> qui se trouve dans le dossier <code>db</code> du dépôt. Indiquez son emplacement, cliquez sur « Importer ». Ce sera fait :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":10570,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/10/image.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/10/image.png" alt="MySQL Import" class="wp-image-10570"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Vous pouvez également le faire via un script Shell qui vérifie si la base de données est vide, et importe les données par défaut si nécessaire. Créez un fichier nommé <code>init.sh</code> contenant ce code :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">SSE="SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$MYSQL_ADDON_DB';"
PARAMS="-u $MYSQL_ADDON_USER -h $MYSQL_ADDON_HOST -P $MYSQL_ADDON_PORT -D $MYSQL_ADDON_DB"

TABLE_COUNT=$(MYSQL_PWD=$MYSQL_ADDON_PASSWORD mysql $PARAMS -sse"$SSE")

if [ "$TABLE_COUNT" -eq 0 ]; then
  echo "Database is empty, we fill it with the default data."
  MYSQL_PWD=$MYSQL_ADDON_PASSWORD mysql $PARAMS < db/mysql.sql 
  
else
  echo "Database contains $TABLE_COUNT tables."
fi

rm init.sh</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous devrez le lancer lors du déploiement de l'application :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_PRE_BUILD_HOOK "bash init.sh"</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous n'avez alors plus qu'à redéployer votre application qui utilisera désormais la base de données MySQL pour stocker ses données plutôt que les sessions PHP :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git add settings.php && git commit -m "Add MySQL support"
clever deploy && clever open</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Si jamais cela ne fonctionne pas, regardez les erreurs dans les logs de votre instance dans la Console ou via :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever logs</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Envie d'en savoir plus ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour découvrir plus en détails l'hébergement d'applications PHP sur Clever Cloud ou nos services de <a href="https://stagingv6.cleverapps.io/fr/product/">bases de données managées</a> ? Venez nous rencontrer au PHP Forum qui se tient du 12 au 13 octobre à Disneyland Paris. Nous serons également présents à Devoxx Maroc et à Volcamp :</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://stagingv6.cleverapps.io/fr/blog/entreprise/2023/09/26/cest-la-rentree-des-evenements-pour-clever-cloud/">C'est la rentrée des évènements pour Clever Cloud</a></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->]]></description>
										<content:encoded><![CDATA[<p><img width="573" height="266" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/10/1.svg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="bannière déployez un chatgpt PHP" decoding="async" loading="lazy" /></p><!-- wp:paragraph -->
<p><strong>Depuis l'année dernière, OpenAI est sur le devant de la scène avec ses larges modèles de langage (LLM), notamment GPT-3.5 et GPT-4, accessibles via son service ChatGPT. Mais ils sont également proposés sous la forme d'une API, que vous pouvez utiliser dans vos applications. Voici un exemple de la manière d'en profiter sur Clever Cloud.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Nous nous baserons sur le projet open source <a href="https://github.com/unconv/chat-wtf" target="_blank" rel="noreferrer noopener">chat-wtf</a>, créé par Unconventional Coding qui a détaillé les différentes étapes de sa conception dans <a href="https://www.youtube.com/watch?v=0FUz4CtalhY" target="_blank" rel="noreferrer noopener">une série de vidéos</a>. Il se repose principalement <a href="https://stagingv6.cleverapps.io/fr/product/applications-php/">sur le langage PHP</a> et un stockage des données via des sessions, SQLite ou <a href="https://stagingv6.cleverapps.io/fr/product/mysql-a-traduire-en-fr/">MySQL</a>, au choix de l'utilisateur. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Un ChatGPT open source, utilisable à la demande</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Il nécessite d'utiliser  <a href="https://platform.openai.com/overview" target="_blank" rel="noreferrer noopener">l'API d'OpenAI</a>, mais vous pouvez lui préférer des modèles compatibles si vous êtes plus aventureux. Le fichier de paramètres permet également de préciser un «&nbsp;message système&nbsp;». Ainsi, vous pouvez fournir à l'IA des informations sur vous ou vos attentes, qu'elle devra prendre en compte dans ses réponses.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Cette application PHP n'a pas été développée d'une manière spécifique pour Clever Cloud, mais vous pouvez l'héberger dans nos infrastructures en quelques minutes, la configurer selon vos besoins, l'arrêter et le démarrer à la demande. On vous explique comment faire.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://api.clever-cloud.com/v2/session/signup">Créer un compte Clever Cloud</a>&nbsp;(et obtenir 20 euros de crédits)</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Pour commencer, vous devrez disposer d'un compte Clever Cloud, ainsi que d'une clé d'API OpenAI. Vous pouvez créer l'application et suivre ce guide en utilisant notre interface web,<a href="https://console.clever-cloud.com"> la Console</a>, mais aussi à travers notre CLI open source : <a href="https://github.com/CleverCloud/clever-tools" target="_blank" rel="noreferrer noopener">Clever Tools</a>. C'est ce que nous ferons ci-dessous. </p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Récupération du code et configuration</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Nous partirons ainsi du principe que vous disposez d’une machine avec&nbsp;<a href="https://git-scm.com/book/fr/v2/D%C3%A9marrage-rapide-Installation-de-Git" target="_blank" rel="noreferrer noopener">git</a>&nbsp;et&nbsp;<a href="https://nodejs.dev/fr/learn/how-to-install-nodejs/" target="_blank" rel="noreferrer noopener">Node.js</a>&nbsp;dans une version récente. Si vous n’avez pas encore installé les Clever Tools sur votre système, tapez (avec les droits administrateur de votre système ou&nbsp;<code>sudo</code>&nbsp;si nécessaire) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">npm i -g clever-tools
clever login</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois connecté, vous pourrez vérifier que tout s’est bien passé avec la commande suivante :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever profile</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ensuite, vous pourrez créer un <em>fork</em> de chat-wtf pouvant être déployé sur Clever Cloud depuis votre compte GitHub. Dans cet exemple, nous allons cloner le dépôt localement et y créer une application Clever Cloud. Un remote nécessaire à son déploiement sera automatiquement ajouté :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git clone https://github.com/unconv/chat-wtf.git && cd chat-wtf
clever create -t php chat-wtf</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ainsi, vous disposez d'une copie locale de la dernière version de l'application chat-wtf, que vous pouvez configurer selon votre besoin. Renommez le fichier <code>settings.sample.php</code> en <code>settings.php</code>. Nous allons opérer des modifications mineures pour commencer. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Placez-y le contenu suivant afin d'utiliser des variables d'environnement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-php">&#x3C;?php
return [
    &#x22;api_key&#x22; =&#x3E; getenv("OPENAI_API_KEY"),
    &#x22;system_message&#x22; =&#x3E; getenv("SYSTEM_MESSAGE"),
    &#x22;model&#x22; =&#x3E; &#x22;gpt-3.5-turbo&#x22;,
    &#x22;base_uri&#x22; =&#x3E; &#x22;&#x22;,
    &#x22;storage_type&#x22; =&#x3E; &#x22;session&#x22;,
];</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Éditez le fichier <code>.gitignore</code> afin d'en retirer <code>settings.php</code> pour qu'il puisse être déployé avec votre application. Celle-ci étant configurée, il ne reste plus qu'à indiquer les variables d'environnement nécessaires à son bon fonctionnement, puis à la déployer. Notez que PHP 8.x est requis. Nous utiliserons la branche 8.2 :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_PHP_VERSION "8.2"
clever env set OPENAI_API_KEY "Votre clé d'API OpenAI"
clever env set SYSTEM_MESSAGE "Votre message système"
git add . && git commit -m "First deploy"
clever deploy && clever open</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Une fois les variables d'environnement ajoutées, nous effectuons un simple <em>Git Push</em>. L'application est alors déployée sur Clever Cloud, une archive est créée afin de faciliter son redéploiement, puis elle est ouverte dans votre navigateur si tout s'est bien passé :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":10576,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image aligncenter size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/10/image-2.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/10/image-2.png" alt="Chat WTF on Clever Cloud" class="wp-image-10576"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Comme pour toute application hébergée au sein de notre service, vous pouvez lui attribuer simplement un domaine qui bénéficiera de notre load balancer <a href="https://www.sozu.io/" target="_blank" rel="noreferrer noopener">Sōzu</a> et d'un certificat Let's Encrypt, connaître son statut et son activité, l'arrêter ou la redémarrer. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Vous disposez dans <a href="https://console.clever-cloud.com">la Console</a> de métriques et d'un accès à un dashboard Grafana afin de suivre son état. Vous pouvez également adapter la taille de l' instance ou activer l'auto-scalabiilté pour répondre à différents niveaux de charge :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever console

clever domain
clever domain add domain.tld

clever status
clever activity

clever scale --min-instances 1 --max-instances 4 --min-flavor pico --max-flavor M
clever scale --instances 1 --flavor pico

clever restart
clever stop</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ajoutons une base de données à notre instance chat-wtf</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Comme indiqué précédemment, ce projet peut stocker ses données au sein de sessions PHP, mais également via SQLite ou MySQL. Dans cet exemple, nous opterons pour la dernière solution afin de vous montrer comment procéder, là aussi de manière très simple.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Tout d'abord créons une base de données (BDD) MySQL au sein de votre compte Clever Cloud en la liant directement à votre application. Par défaut il s'agit d'une instance DEV, partagée et gratuite, mais vous pouvez demander <a href="https://stagingv6.cleverapps.io/fr/tarification/">un plan</a> de taille supérieure si vous le désirez :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever addon create mysql-addon chat-wtf-mysql --link chat-wtf</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce « lien » permet d'injecter directement les paramètres de connexion dans l'application via des variables d'environnement. Elles sont visibles dans la Console ou via les Clever Tools :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ainsi, il suffit de modifier le fichier <code>settings.php</code> comme suit pour l'utiliser :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-php">    &#x22;storage_type&#x22; =&#x3E; &#x22;sql&#x22;,
    &#x22;db&#x22; =&#x3E; [
        &#x22;dsn&#x22; =&#x3E; &#x22;mysql:host=&#x22; . getenv(&#x27;MYSQL_ADDON_HOST&#x27;) . &#x22;;
                    port=&#x22; . getenv(&#x27;MYSQL_ADDON_PORT&#x27;) . &#x22;;
                    dbname=&#x22; . getenv(&#x27;MYSQL_ADDON_DB&#x27;),
        &#x22;username&#x22; =&#x3E; getenv(&#x27;MYSQL_ADDON_USER&#x27;),
        &#x22;password&#x22; =&#x3E; getenv(&#x27;MYSQL_ADDON_PASSWORD&#x27;),
    ],</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Rendez-vous ensuite dans le <em>dashboard</em> de cette base MySQL, accessible via la Console. Vous y trouverez un lien vers son interface PHPMyAdmin. En cliquant sur le nom de la base de données dans le menu de gauche vous trouverez la fonction d'import. Elle vous permettra d'initier la structure de la BDD en y important le fichier <code>mysql.sql</code> qui se trouve dans le dossier <code>db</code> du dépôt. Indiquez son emplacement, cliquez sur « Importer ». Ce sera fait :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":10570,"sizeSlug":"full","linkDestination":"media"} -->
<figure class="wp-block-image size-full"><a href="https://cdn.clever-cloud.com/uploads/2023/10/image.png" target="_blank" rel="noreferrer noopener"><img src="https://cdn.clever-cloud.com/uploads/2023/10/image.png" alt="MySQL Import" class="wp-image-10570"/></a></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Vous pouvez également le faire via un script Shell qui vérifie si la base de données est vide, et importe les données par défaut si nécessaire. Créez un fichier nommé <code>init.sh</code> contenant ce code :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">SSE="SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$MYSQL_ADDON_DB';"
PARAMS="-u $MYSQL_ADDON_USER -h $MYSQL_ADDON_HOST -P $MYSQL_ADDON_PORT -D $MYSQL_ADDON_DB"

TABLE_COUNT=$(MYSQL_PWD=$MYSQL_ADDON_PASSWORD mysql $PARAMS -sse"$SSE")

if [ "$TABLE_COUNT" -eq 0 ]; then
  echo "Database is empty, we fill it with the default data."
  MYSQL_PWD=$MYSQL_ADDON_PASSWORD mysql $PARAMS < db/mysql.sql 
  
else
  echo "Database contains $TABLE_COUNT tables."
fi

rm init.sh</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous devrez le lancer lors du déploiement de l'application :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever env set CC_PRE_BUILD_HOOK "bash init.sh"</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Vous n'avez alors plus qu'à redéployer votre application qui utilisera désormais la base de données MySQL pour stocker ses données plutôt que les sessions PHP :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">git add settings.php && git commit -m "Add MySQL support"
clever deploy && clever open</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Si jamais cela ne fonctionne pas, regardez les erreurs dans les logs de votre instance dans la Console ou via :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="language-bash">clever logs</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Envie d'en savoir plus ?</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pour découvrir plus en détails l'hébergement d'applications PHP sur Clever Cloud ou nos services de <a href="https://stagingv6.cleverapps.io/fr/product/">bases de données managées</a> ? Venez nous rencontrer au PHP Forum qui se tient du 12 au 13 octobre à Disneyland Paris. Nous serons également présents à Devoxx Maroc et à Volcamp :</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li><a href="https://stagingv6.cleverapps.io/fr/blog/entreprise/2023/09/26/cest-la-rentree-des-evenements-pour-clever-cloud/">C'est la rentrée des évènements pour Clever Cloud</a></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
