Installation multi-utilisateurs d’Ollama sous Linux : retour d’expérience et scripts

Contexte

En explorant les possibilités de l’IA locale avec Ollama sur Ubuntu 22.04 LTS, je me suis retrouvé confronté à deux contraintes pratiques :

  • Le besoin de basculer fréquemment entre différentes sessions utilisateurs tout en conservant l’accès à Ollama
  • La nécessité de gérer efficacement l’espace disque, les modèles d’IA étant particulièrement volumineux

Bien que ma machine actuelle ne soit pas assez puissante pour exploiter pleinement les capacités d’Ollama, j’ai souhaité mettre en place une installation « propre » qui servira de référence lors d’une future mise à niveau matérielle.

⚠️ Avertissement

Les scripts fournis ci-dessous modifient la structure des répertoires système et leurs permissions. Leur utilisation nécessite des privilèges root et peut avoir des implications sur la sécurité de votre système. Avant toute utilisation :

  • Sauvegardez vos données
  • Lisez et comprenez le fonctionnement des scripts
  • Validez leur compatibilité avec votre environnement
  • Testez d’abord dans un environnement non-critique
  • Assurez-vous de comprendre les implications en termes de sécurité

L’utilisation de ces scripts se fait sous votre entière responsabilité.

Principe de fonctionnement

L’installation repose sur trois composants clés :

  1. Une structure de répertoires sous /home/ollama
  2. Un groupe système ollama_users pour gérer les accès
  3. Un service systemd pour gérer l’exécution

Structure des répertoires

/home/ollama               -> root:root         (755)
/home/ollama/bin          -> root:root         (755)
/home/ollama/lib          -> root:root         (755)
/home/ollama/models       -> root:ollama_users (775)

Script d’installation

#!/bin/sh

# =============================================================================

# Script d'installation multi-utilisateurs d'Ollama pour Linux

# =============================================================================

#

# Original script from Ollama (https://github.com/ollama/ollama)

# Modified version to support multi-user installation

# Original work under MIT License

# Copyright (c) 2023 Ollama

#

# Permission is hereby granted, free of charge, to any person obtaining a copy

# of this software and associated documentation files (the "Software"), to deal

# in the Software without restriction, including without limitation the rights

# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

# copies of the Software, and to permit persons to whom the Software is

# furnished to do so, subject to the following conditions:

#

# The above copyright notice and this permission notice shall be included in all

# copies or substantial portions of the Software.

#

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

# SOFTWARE.

#

# =============================================================================

#

# AVERTISSEMENT :

# Ce script modifie la structure des répertoires système et leurs permissions.

# Son utilisation nécessite des privilèges root et peut avoir des implications

# sur la sécurité de votre système.

#

# AVANT L'UTILISATION :

# - Sauvegardez vos données

# - Lisez et comprenez le fonctionnement du script

# - Validez sa compatibilité avec votre environnement

# - Testez d'abord dans un environnement non-critique

#

# UTILISATION :

# ./install_ollama.sh -u "user1 user2 user3 ..."

#

# EXEMPLE :

# ./install_ollama.sh -u "john marie robert"

#

# STRUCTURE CRÉÉE :

# /home/ollama -> root:root (755)

# /home/ollama/bin -> root:root (755)

# /home/ollama/lib -> root:root (755)

# /home/ollama/models -> root:ollama_users (775)

#

# =============================================================================

set -eu

red="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 1 || :) 2>&-)"
green="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 2 || :) 2>&-)"
plain="$( (/usr/bin/tput sgr0 || :) 2>&-)"

status() { echo "${green}>>>${plain} $*" >&2; }
error() { echo "${red}ERROR:${plain} $*"; exit 1; }
warning() { echo "${red}WARNING:${plain} $\*"; }

# Fonction d'aide

show_usage() {
cat << EOF
Usage: $0 -u "user1 user2 user3 ..."
Options:
-u Liste des utilisateurs séparés par des espaces qui auront accès à Ollama
-h Affiche cette aide
Example:
$0 -u "user1 user2"

Le script va :

1. Créer un groupe ollama_users
2. Ajouter les utilisateurs spécifiés à ce groupe
3. Créer la structure de répertoires sous /home/ollama
4. Installer Ollama et configurer le service systemd
   EOF
   exit 1
   }

# Traitement des paramètres

USERS=""
while getopts "u:h" opt; do
case $opt in
        u) USERS="$OPTARG" ;;
h) show_usage ;;
?) show_usage ;;
esac
done

# Vérification des paramètres obligatoires

if [ -z "$USERS" ]; then
error "La liste des utilisateurs est obligatoire. Utilisez -u 'user1 user2 ...'"
fi

# Vérification de l'existence des utilisateurs

for USER in $USERS; do
    if ! id "$USER" >/dev/null 2>&1; then
error "L'utilisateur $USER n'existe pas sur le système"
fi
done

# Vérification du système

[ "$(uname -s)" = "Linux" ] || error 'Ce script est destiné uniquement à Linux.'

# Détection de l'architecture

ARCH=$(uname -m)
case "$ARCH" in
x86_64) ARCH="amd64" ;;
aarch64|arm64) ARCH="arm64" ;;
\*) error "Architecture non supportée: $ARCH" ;;
esac

# Vérification des droits sudo

SUDO=
if [ "$(id -u)" -ne 0 ]; then
if ! command -v sudo >/dev/null 2>&1; then
error "Ce script nécessite les droits superutilisateur. Exécutez-le en tant que root."
fi
SUDO="sudo"
fi

# Vérification des dépendances

NEEDS=""
for TOOL in curl grep sed tee; do
if ! command -v $TOOL >/dev/null 2>&1; then
        NEEDS="$NEEDS $TOOL"
    fi
done
if [ -n "$NEEDS" ]; then
error "Les outils suivants sont requis mais manquants:$NEEDS"
fi

# Définition des chemins

OLLAMA_HOME="/home/ollama"
OLLAMA_MODELS="$OLLAMA_HOME/models"
BINDIR="/usr/local/bin"

# Création du groupe ollama_users

status "Création du groupe ollama_users..."
if ! getent group ollama_users >/dev/null 2>&1; then
$SUDO groupadd ollama_users
fi

# Ajout des utilisateurs au groupe ollama_users

status "Ajout des utilisateurs au groupe ollama_users..."
for USER in $USERS; do
    status "  - Ajout de $USER au groupe ollama_users"
    $SUDO usermod -a -G ollama_users "$USER"
done

# Création de la structure minimale de répertoires

status "Création de la structure de répertoires..."
$SUDO install -d -m 755 $OLLAMA_HOME
$SUDO install -d -m 755 $OLLAMA_HOME/bin
$SUDO install -d -m 755 $OLLAMA_HOME/lib
$SUDO install -d -m 775 $OLLAMA_HOME/models

# Configuration des propriétaires et groupes

$SUDO chown root:root $OLLAMA_HOME
$SUDO chown root:root $OLLAMA_HOME/bin
$SUDO chown root:root $OLLAMA_HOME/lib
$SUDO chown root:ollama_users $OLLAMA_HOME/models

# Installation d'Ollama

status "Installation d'Ollama..."
curl --fail --show-error --location --progress-bar \
 "https://ollama.com/download/ollama-linux-${ARCH}.tgz" | \
 $SUDO tar -xzf - -C $OLLAMA_HOME

# Création du lien symbolique

$SUDO ln -sf $OLLAMA_HOME/bin/ollama $BINDIR/ollama

# Configuration du service systemd

status "Création du service systemd pour Ollama..."
cat <<EOF | $SUDO tee /etc/systemd/system/ollama.service >/dev/null
[Unit]
Description=Service Ollama
After=network-online.target

[Service]
ExecStart=$BINDIR/ollama serve
User=root
Group=root
Restart=always
RestartSec=3
Environment="PATH=$PATH"
Environment="OLLAMA_HOME=$OLLAMA_HOME"
Environment="OLLAMA_MODELS=$OLLAMA_MODELS"
WorkingDirectory=$OLLAMA_HOME

[Install]
WantedBy=default.target
EOF

# Activation et démarrage du service

if command -v systemctl >/dev/null 2>&1; then
status "Activation et démarrage du service ollama..."
$SUDO systemctl daemon-reload
$SUDO systemctl enable ollama
$SUDO systemctl start ollama
fi

status "Installation terminée !"
status "Structure des répertoires :"
status " $OLLAMA_HOME -> root:root (755)"
status " $OLLAMA_HOME/bin -> root:root (755)"
status " $OLLAMA_HOME/lib -> root:root (755)"
status " $OLLAMA_HOME/models -> root:ollama_users (775)"
status ""
status "Les utilisateurs suivants ont été ajoutés au groupe ollama_users:"
for USER in $USERS; do
status " - $USER"
done
status ""
status "L'API Ollama est disponible sur 127.0.0.1:11434"
status "IMPORTANT: Les utilisateurs doivent se déconnecter et se reconnecter"
status " pour que les changements de groupe prennent effet."

Utilisation

# Téléchargement du script
curl -A "Mozilla" -O https://fmisery.fr/scripts/ollama_multi_users_setup.sh

# Le rendre exécutable
chmod +x ollama_multi_users_setup.sh

# Installation pour deux utilisateurs
./ollama_multi_users_setup.sh -u "user1 user2"

Script de désinstallation

Pour faciliter une désinstallation propre ou une réinstallation, voici le script de désinstallation :

#!/bin/sh

# =============================================================================

# Script de désinstallation multi-utilisateurs d'Ollama pour Linux

# =============================================================================

#

# Original script from Ollama (https://github.com/ollama/ollama)

# Modified version to support multi-user uninstallation

# Original work under MIT License

# Copyright (c) 2023 Ollama

#

# Permission is hereby granted, free of charge, to any person obtaining a copy

# of this software and associated documentation files (the "Software"), to deal

# in the Software without restriction, including without limitation the rights

# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

# copies of the Software, and to permit persons to whom the Software is

# furnished to do so, subject to the following conditions:

#

# The above copyright notice and this permission notice shall be included in all

# copies or substantial portions of the Software.

#

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

# SOFTWARE.

#

# =============================================================================

#

# AVERTISSEMENT :

# Ce script supprime la structure des répertoires et fichiers liés à Ollama.

# Son utilisation nécessite des privilèges root et effectue des suppressions

# définitives de fichiers et répertoires.

#

# AVANT L'UTILISATION :

# - Assurez-vous qu'Ollama n'est pas en cours d'utilisation

# - Faites une sauvegarde de vos modèles si nécessaire

# - Lisez et comprenez le fonctionnement du script

#

# UTILISATION :

# ./uninstall_ollama.sh

#

# CE SCRIPT VA :

# 1. Arrêter et supprimer le service Ollama

# 2. Proposer de sauvegarder les modèles existants

# 3. Supprimer la structure de répertoires

# 4. Proposer de supprimer le groupe ollama_users

#

# STRUCTURE SUPPRIMÉE :

# /home/ollama (et tout son contenu)

# /usr/local/bin/ollama (lien symbolique)

# /etc/systemd/system/ollama.service

#

# =============================================================================

set -eu

red="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 1 || :) 2>&-)"
green="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 2 || :) 2>&-)"
yellow="$( (/usr/bin/tput bold || :; /usr/bin/tput setaf 3 || :) 2>&-)"
plain="$( (/usr/bin/tput sgr0 || :) 2>&-)"

status() { echo "${green}>>>${plain} $*" >&2; }
warning() { echo "${yellow}ATTENTION:${plain} $*"; }
error() { echo "${red}ERREUR:${plain} $\*"; exit 1; }

# Vérification des droits sudo

SUDO=
if [ "$(id -u)" -ne 0 ]; then
if ! command -v sudo >/dev/null 2>&1; then
error "Ce script nécessite les droits superutilisateur. Exécutez-le en tant que root."
fi
SUDO="sudo"
fi

# Fonction pour demander confirmation

confirm() {
while true; do
read -p "$1 [o/N] " response
        case "$response" in
[oO][uU][iI]|[oO]) return 0 ;;
[nN][oO][nN]|[nN]|"") return 1 ;;
\*) echo "Répondez par 'o' ou 'n'" ;;
esac
done
}

# Vérification initiale

if ! confirm "Ce script va désinstaller Ollama et supprimer ses fichiers. Continuer ?"; then
status "Désinstallation annulée."
exit 0
fi

# Arrêt du service

if [ -f "/etc/systemd/system/ollama.service" ]; then
status "Arrêt du service ollama..."
if command -v systemctl >/dev/null 2>&1; then
$SUDO systemctl stop ollama || true
$SUDO systemctl disable ollama || true
status "Suppression du service systemd..."
$SUDO rm -f /etc/systemd/system/ollama.service
$SUDO systemctl daemon-reload
fi
fi

# Suppression du lien symbolique

if [ -L "/usr/local/bin/ollama" ]; then
status "Suppression du lien symbolique..."
$SUDO rm -f /usr/local/bin/ollama
fi

# Vérification et sauvegarde des modèles

if [ -d "/home/ollama/models" ] && [ -n "$(find /home/ollama/models -type f 2>/dev/null)" ]; then
warning "Le dossier /home/ollama/models contient des fichiers."
if confirm "Voulez-vous sauvegarder les modèles avant la suppression ?"; then
BACKUP*DIR="$HOME/ollama_models_backup*$(date +%Y%m%d_%H%M%S)"
        status "Sauvegarde des modèles dans $BACKUP_DIR..."
        mkdir -p "$BACKUP_DIR"
$SUDO cp -r /home/ollama/models/* "$BACKUP_DIR/"
$SUDO chown -R "$(whoami):$(whoami)" "$BACKUP_DIR"
status "Sauvegarde terminée dans $BACKUP_DIR"
warning "N'oubliez pas de vérifier et éventuellement de nettoyer cette sauvegarde"
warning "une fois que vous n'en aurez plus besoin."
fi
fi

# Suppression des répertoires

if [ -d "/home/ollama" ]; then
if confirm "Voulez-vous supprimer le répertoire /home/ollama et tout son contenu ?"; then
status "Suppression des répertoires d'Ollama..."
$SUDO rm -rf /home/ollama
else
warning "Le répertoire /home/ollama a été conservé"
warning "Vous devrez le supprimer manuellement si nécessaire."
fi
fi

# Suppression du groupe ollama_users

if getent group ollama_users >/dev/null 2>&1; then
if confirm "Voulez-vous supprimer le groupe ollama_users ?"; then
MEMBRES=$(getent group ollama_users | cut -d: -f4)
        if [ -n "$MEMBRES" ]; then
warning "Le groupe ollama_users contient encore les membres suivants :"
echo "$MEMBRES" | tr ',' '\n' | while read -r user; do
echo " - $user"
done
fi
status "Suppression du groupe ollama_users..."
$SUDO groupdel ollama_users
else
warning "Le groupe ollama_users a été conservé"
warning "Vous devrez le supprimer manuellement si nécessaire avec :"
warning " sudo groupdel ollama_users"
fi
fi

# Récapitulatif final

status "Désinstallation terminée !"
if [ -d "${BACKUP_DIR:-}" ]; then
status "Vos modèles ont été sauvegardés dans : $BACKUP_DIR"
fi

# Instructions post-désinstallation

cat << EOF

${green}Instructions post-désinstallation :${plain}

1. Si vous avez sauvegardé des modèles, vérifiez qu'ils sont bien présents dans
   le répertoire de sauvegarde.
2. Les utilisateurs qui étaient membres du groupe ollama_users peuvent toujours
   être listés dans ce groupe jusqu'à leur prochaine connexion.
3. Si vous prévoyez de réinstaller Ollama, il est recommandé de se déconnecter
   et se reconnecter pour s'assurer que tous les changements de groupe sont
   bien pris en compte.

EOF

Utilisation

# Téléchargement du script
curl -A "Mozilla" -O https://fmisery.fr/scripts/ollama_multi_users_uninstall.sh

# Le rendre exécutable
chmod +x scripts/ollama_multi_users_uninstall.sh

# Désinstallation
./scripts/ollama_multi_users_uninstall.sh

Points importants

  1. Droits d’accès : Les utilisateurs doivent se déconnecter et se reconnecter après l’installation pour que les changements de groupe prennent effet.

  2. Modèles partagés : Tous les utilisateurs du groupe ollama_users partagent les mêmes modèles, ce qui optimise l’utilisation de l’espace disque.

  3. Sécurité : Le service s’exécute en tant que root, mais les accès sont contrôlés via le groupe ollama_users.

Conclusion

Cette configuration fournit une solution propre pour partager une installation d’Ollama entre plusieurs utilisateurs d’une même machine sous Ubuntu 22.04. Bien que la mise en place requière quelques manipulations système, le résultat offre un bon compromis entre sécurité, facilité d’utilisation et optimisation des ressources.

Pour toute question ou retour d’expérience, n’hésitez pas à laisser un commentaire ci-dessous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.