Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Init instance ai #18

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
56 changes: 56 additions & 0 deletions external-ai-services/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Documentation des Services d'IA Externes

Ce répertoire contient tous les documents relatifs à l'infrastructure externe de l'intelligence artificielle (IA) utilisée par notre application. Cela inclut des scripts, des configurations et des informations utiles pour déployer et gérer le serveur IA.

## Solution

Pour l'utilisation de VApp, nous avons opté pour un serveur externe exécutant Ollama ([https://github.com/ollama/ollama](#)). Cette solution offre une grande liberté dans le choix des modèles et propose déjà une large gamme de modèles avec diverses méthodes d'optimisation. L'accès via une API assure également une flexibilité certaine en cas d'intégration plus large à l'avenir. Pour plus d’informations, consultez la racine du dépôt ([ajouter lien](#)).

Nous avons externalisé cette ressource via des serveurs externes. Le répertoire ci-dessous propose une solution simple, automatisée et répliquable pour démarrer une instance.

## Structure du Répertoire

- **setup-default/** : Setup basique avec le support d'un systeme de token d'authentication
- `setup.sh` : Script principal pour installer et configurer l'environnement Nginx et Ollama.
- **setup-openwebui/** : Setup avec le support de openwebui
- `setup.sh` : Script principal pour installer et configurer l'environnement Nginx, Ollama et Open WebUI. **(work in progress)**
- **setup-no-nginx/** : Setup sans nginx et sans token d'authentication
- `setup.sh` : Script principal pour installer et configurer l'environnement Ollama.
- `cloud-init.yaml` : Script principal pour installer et configurer automatiquement une instance. **(work in progress)**

## Étapes de Configuration

### Installation avec cloud-init

```bash
wget https://raw.githubusercontent.com/your-repo/path/cloud-init.yaml -O /tmp/cloud-init.yaml
```

### Installation en directe

Vous pouvez installer le script via la commande suivante avec une configuration **avec token d'authentication**.

```bash
export BEARER_TOKEN="YOUR_TOKEN"
echo $BEARER_TOKEN
chmod +x /path/to/setup.sh
sudo bash -c "export BEARER_TOKEN=$BEARER_TOKEN; /path/to/setup.sh"
```

___

Vous pouvez installer le script via la commande suivante avec une configuration **sans token d'authentication**.

```bash
chmod +x /path/to/setup.sh
sudo bash -c "/path/to/setup.sh"
```

## Simple test

<p>Pour vous assurer que tout fonctionne correctement, vous pouvez réaliser les tests suivants</p>

```bash
curl -X POST http://YOUR_INSTANCE_IP/api/generate -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_TOKEN" -d '{"model": "llama3.2:1b", "prompt": "Why is the sky blue?", "stream": false}'
```

12 changes: 12 additions & 0 deletions external-ai-services/cloud-init.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#cloud-config

users:
- name: ubuntu
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... user1@example.com
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQB... user2@example.com
runcmd:
- export BEARER_TOKEN="YOUR_BEARER_TOKEN"
- echo $BEARER_TOKEN
- export HOME=/root
- curl -fsSL https://raw.githubusercontent.com/betagouv/VApp/refs/heads/init-instance-ai/external-ai-services/setup-default/setup.sh | sh
3 changes: 3 additions & 0 deletions external-ai-services/setup-default/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Work in progress

l'installation par défaut pour l'usage de LLM par VApp
84 changes: 84 additions & 0 deletions external-ai-services/setup-default/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/bin/bash

# Mettre à jour les paquets et mettre à niveau le système
sudo apt update && sudo apt upgrade -y

# Installer CUDA Toolkit pour NVIDIA
sudo apt install nvidia-cuda-toolkit -y

# Télécharger et installer ollama
curl -fsSL https://ollama.com/install.sh | sh

sudo tee /etc/systemd/system/ollama.service > /dev/null <<EOL
[Unit]
Description=Ollama AI Service
After=network.target

[Service]
ExecStart=/usr/local/bin/ollama serve
Restart=always
User=root

[Install]
WantedBy=multi-user.target
EOL

sleep 5
# Activer et démarrer le service Ollama
sudo systemctl daemon-reload
sudo systemctl enable ollama.service
sudo systemctl start ollama.service

sleep 5

# Installer un modèle dans Ollama
ollama pull llama3.2:1b

# Vérification des logs pour Ollama en cas d'erreur, uniquement pour les instalations sans clou-init
sudo journalctl -u ollama.service --no-pager -n 20

# Installer Nginx
sudo apt update && sudo apt install nginx -y

# Configurer Nginx
IP=$(hostname -I | awk '{print $1}')
TOKEN=$BEARER_TOKEN

cat <<EOL | sudo tee /etc/nginx/sites-available/ollama
upstream ollama {
server localhost:11434;
}

server {
listen 80;
server_name ${IP};

location / {
# Check if the Authorization header is present and has the correct Bearer token / API Key
set \$token "Bearer $TOKEN";
if (\$http_authorization != \$token) {
return 401 "Unauthorized";
}

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;

# Configuration des timeouts pour les requêtes
proxy_read_timeout 300s;
proxy_send_timeout 300s;

# Forward request to the actual web service
proxy_pass http://ollama;
}
}
EOL

# Activer la configuration Nginx
sudo ln -s /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/

# Redémarrer Nginx pour appliquer les changements
sudo systemctl restart nginx

echo "Setup completed successfully!"
3 changes: 3 additions & 0 deletions external-ai-services/setup-no-token/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Pourquoi une version sans token

certaine application utilisant Ollama (tel que openwebui), ne peuvent pas communiquer avec ollama si ollama nécessite un bearer token. Cette version du setup permet de simplifier l'installation et l'usage de ollama pour ce cas précis.
77 changes: 77 additions & 0 deletions external-ai-services/setup-no-token/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/bin/bash

# Mettre à jour les paquets et mettre à niveau le système sans interaction
sudo DEBIAN_FRONTEND=noninteractive apt update && sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y

# Installer CUDA Toolkit pour NVIDIA sans interaction
sudo DEBIAN_FRONTEND=noninteractive apt install nvidia-cuda-toolkit -y

# Télécharger et installer Ollama
curl -fsSL https://ollama.com/install.sh | sh

sudo tee /etc/systemd/system/ollama.service > /dev/null <<EOL
[Unit]
Description=Ollama AI Service
After=network.target

[Service]
ExecStart=/usr/local/bin/ollama serve
Restart=always
User=root

[Install]
WantedBy=multi-user.target
EOL

sleep 5
# Activer et démarrer le service Ollama
sudo systemctl daemon-reload
sudo systemctl enable ollama.service
sudo systemctl start ollama.service

sleep 5

# Installer un modèle dans Ollama
ollama pull llama3.2:1b

# Vérification des logs pour Ollama en cas d'erreur, uniquement pour les installations sans cloud-init
sudo journalctl -u ollama.service --no-pager -n 20

# Installer Nginx sans interaction
sudo DEBIAN_FRONTEND=noninteractive apt update && sudo DEBIAN_FRONTEND=noninteractive apt install nginx -y

# Configurer Nginx
IP=$(hostname -I | awk '{print $1}')

cat <<EOL | sudo tee /etc/nginx/sites-available/ollama
upstream ollama {
server localhost:11434;
}

server {
listen 80;
server_name ${IP};

location / {
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;

# Configuration des timeouts pour les requêtes
proxy_read_timeout 300s;
proxy_send_timeout 300s;

# Forward request to the actual Ollama service
proxy_pass http://ollama;
}
}
EOL

# Activer la configuration Nginx
sudo ln -s /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/

# Redémarrer Nginx pour appliquer les changements
sudo systemctl restart nginx

echo "Setup completed successfully!"
7 changes: 7 additions & 0 deletions external-ai-services/setup-openwebui/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Installation avec OpenWebUI

Pour des raisons de sécurité, je préfère garder Ollama accessible via une API avec un Bearer token.
Cela étant dit, il n'existe à ma connaissance aucune méthode pour connecter OpenWebUI à Ollama si l'instance requiert un token.
La solution immédiate que j'ai trouvée est d'installer OpenWebUI directement sur l'instance.

**Attention** Il faut créer les identifants admins à la creation du serveur
78 changes: 78 additions & 0 deletions external-ai-services/setup-openwebui/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/bin/bash

# Mettre à jour les paquets et mettre à niveau le système
sudo apt update && sudo apt upgrade -y

# Installer Docker
sudo apt install docker.io -y

# Installer NVIDIA container toolkit pour Docker (si ce n'est pas déjà fait)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

# Installer Ollama via Docker
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama


# Installer OpenWebUI via Docker avec un compte admin par défaut
docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:cuda

# Attendre quelques secondes pour s'assurer que les conteneurs démarrent
sleep 5

# Installer Nginx
sudo apt update && sudo apt install nginx -y

# Configurer Nginx pour rediriger vers Ollama et OpenWebUI
IP=$(hostname -I | awk '{print $1}')
TOKEN=$BEARER_TOKEN

cat <<EOL | sudo tee /etc/nginx/sites-available/ollama_openwebui
upstream ollama {
server localhost:11434;
}

upstream openwebui {
server localhost:3000;
}

server {
listen 80;
server_name ${IP};

location /ollama/ {
# Check if the Authorization header is present and has the correct Bearer token / API Key
set \$token "Bearer $TOKEN";
if (\$http_authorization != \$token) {
return 401 "Unauthorized";
}

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;

# Forward request to the actual Ollama service
proxy_pass http://ollama;
}

location /openwebui/ {
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;

# Forward request to the actual OpenWebUI service
proxy_pass http://openwebui;
}
}
EOL

# Activer la configuration Nginx
sudo ln -s /etc/nginx/sites-available/ollama_openwebui /etc/nginx/sites-enabled/

# Redémarrer Nginx pour appliquer les changements
sudo systemctl restart nginx
Loading