Aller au contenu

Derrière un proxy, sans Internet

Derrière un proxy d'entreprise

L'installeur et Lyra ne lisent aucune variable qui leur soit propre pour le réseau : ils respectent celles que les outils sous-jacents lisent déjà.

Variable Lue par Effet
HTTP_PROXY, HTTPS_PROXY, NO_PROXY curl, pip/uv, requests, le script d'installation d'Ollama tout le trafic sortant passe par le proxy
PIP_INDEX_URL (ou UV_INDEX_URL) pip / uv miroir PyPI interne pour le venv
HF_ENDPOINT huggingface_hub (modèles Whisper, MiniLM) et le téléchargement des voix Piper miroir Hugging Face interne
OLLAMA_HOST le client ollama et Lyra (get_ollama_base_url, prime sur llm.base_url de config.yaml) Ollama distant, machine sans GPU, Codespace. Précédence : OLLAMA_HOST > llm.base_url > http://localhost:11434. --ollama-host écrit les deux (config.yaml et un unique export OLLAMA_HOST= dans ~/.bashrc, remplacé s'il existait déjà) ; un OLLAMA_HOST déjà exporté dans le shell courant l'emporte jusqu'à la prochaine session

Trois endroits ne voyaient pas ces variables ; ils sont traités (installer/core/proxyenv.py, lyra/utils/netenv.py) :

  • sudo remet l'environnement à zéro : sudo dnf install / sudo apt-get install partaient sans proxy. Toute commande sudo de l'installeur reçoit --preserve-env=<variables définies>. Si ta politique sudoers l'interdit (utilisateur sans droit SETENV), ajoute Defaults env_keep += "HTTP_PROXY HTTPS_PROXY NO_PROXY http_proxy https_proxy no_proxy" via visudo.
  • le service ollama (systemd) n'hérite pas du shell, or c'est lui qui télécharge lors d'un ollama pull. Avec un proxy défini, l'installeur écrit /etc/systemd/system/ollama.service.d/proxy.conf (Environment=HTTPS_PROXY...), recharge systemd et redémarre le service s'il tournait.
  • Lyra elle-même : avec HTTP_PROXY seul, httpx et requests enverraient aussi au proxy les appels à l'Ollama local, à l'API tracking (127.0.0.1:8765) et aux serveurs MCP locaux. Le client et le démon ajoutent localhost,127.0.0.1,::1 à NO_PROXY au démarrage (seulement si un proxy est défini) ; les MCP lancés par le démon en héritent.

Les mots de passe éventuels dans l'URL du proxy sont masqués dans les messages de l'installeur.

Exemple :

export HTTPS_PROXY=http://proxy.interne:3128 NO_PROXY=localhost,127.0.0.1,.interne
export PIP_INDEX_URL=https://nexus.interne/repository/pypi/simple
export HF_ENDPOINT=https://hf-mirror.interne
export OLLAMA_HOST=gpu-box.interne:11434
python3 installer/install.py

Machine sans Internet : bundle hors ligne

Limite actuelle : le bundle est une commande séparée, pas encore proposée par l'installeur, et il n'a pas été rejoué de bout en bout sur une VM sans réseau (suivi : issue #25).

installer/bundle.py met dans une seule archive (environ 3 Go) tout ce que l'installeur télécharge : modèles Ollama, MiniLM (RAG) et Whisper (micro), binaire et voix Piper, wheels Python du venv. Chaque fichier est contrôlé par sha256 avant toute copie : une archive altérée ou tronquée est refusée en entier.

# machine connectée, depuis le dépôt (le venv fournit huggingface_hub)
.venv/bin/python -m installer.bundle create --out lyra-bundle.tar
#   --parts ollama,hf,piper,wheels   --whisper base|small|...|aucun

# machine sans réseau (python3 du système suffit)
python3 -m installer.bundle install lyra-bundle.tar --lyra-dir ~/lyra
LYRA_OFFLINE=1   # ensuite : interdit tout téléchargement de modèle
  • Les modèles Ollama sont téléchargés par un serveur Ollama privé et temporaire (OLLAMA_MODELS pointé vers le bundle) : ni sudo ni lecture du dossier du service. À l'installation, la copie vers /usr/share/ollama/.ollama/models passe par sudo si ce dossier n'est pas inscriptible.
  • Les wheels sont celles de la plateforme de la machine qui crée le bundle (même architecture et même version de Python attendues).
  • Hors bundle : les paquets système (portaudio, git, nodejs...) et le binaire Ollama, à installer depuis le média de la distribution ; les serveurs MCP.
  • Au démarrage, Lyra charge les modèles Hugging Face depuis le cache local sans interroger huggingface.co (lyra/utils/hf_local.py) ; le réseau ne sert que si le modèle manque, et jamais avec LYRA_OFFLINE=1 ou HF_HUB_OFFLINE=1.