**Motivations:** - Ollama and AnythingLLM run on 192.168.1.164, not 192.168.1.173. **Root causes:** - Previous commit pointed upstreams at the ia host IP by mistake. **Correctifs:** - Upstreams back to 192.168.1.164:11434 and :3001; docs aligned. **Evolutions:** - N/A. **Pages affectées:** - deploy/nginx/sites/ia.enso.4nkweb.com.conf - deploy/nginx/README-ia-enso.md - docs/features/ia-enso-nginx-proxy-ollama-anythingllm.md - docs/infrastructure.md - docs/services.md
6.4 KiB
ia.enso.4nkweb.com — Nginx sur le proxy (192.168.1.100)
Reverse TLS vers l’hôte LAN 192.168.1.164 (Ollama + AnythingLLM ; ajuster dans sites/ia.enso.4nkweb.com.conf si l’IP change) :
| Chemin public | Backend | Port | Protection |
|---|---|---|---|
/ollama/ |
Ollama API | 11434 |
Bearer vérifié par nginx ; en-tête Authorization retiré avant Ollama |
/anythingllm/ |
AnythingLLM | 3001 |
Auth application AnythingLLM (pas le Bearer Ollama) |
Contexte Cursor : une URL en IP privée (ex. http://192.168.1.164:11434) peut être refusée par Cursor (ssrf_blocked). Un nom public HTTPS vers le proxy évite ce blocage si le DNS résolu depuis Internet n’est pas une IP RFC1918.
Fichiers dans le dépôt : sites/ia.enso.4nkweb.com.conf, http-maps/*.example, deploy-ia-enso-to-proxy.sh. Détails d’architecture : docs/features/ia-enso-nginx-proxy-ollama-anythingllm.md.
Déploiement recommandé : script SSH
Depuis la racine du dépôt smart_ide, sur une machine avec accès SSH au bastion puis au proxy :
export IA_ENSO_OLLAMA_BEARER_TOKEN='secret-long-ascii-sans-guillemets-ni-backslash'
# optionnel si accès LAN direct au proxy, sans bastion :
# export DEPLOY_SSH_PROXY_HOST=
./deploy/nginx/deploy-ia-enso-to-proxy.sh
Si IA_ENSO_OLLAMA_BEARER_TOKEN est absent, le script génère un token hex (affichage unique) à conserver pour Cursor.
Prérequis sur le proxy
http { include /etc/nginx/conf.d/*.conf; ... }dans/etc/nginx/nginx.conf(sinon le script échoue avec un message explicite).- Certificats Let’s Encrypt pour
ia.enso.4nkweb.comaux chemins du fichier site (voir section TLS). sudonon interactif pournginxetsystemctl reload nginx.
Fichiers installés par le script
| Chemin sur le proxy | Rôle |
|---|---|
/etc/nginx/conf.d/ia-enso-http-maps.conf |
map Bearer ($ia_enso_ollama_authorized) et, si besoin, map WebSocket ($connection_upgrade) |
/etc/nginx/sites-available/ia.enso.4nkweb.com.conf |
server HTTP→HTTPS + HTTPS |
Lien sites-enabled/ia.enso.4nkweb.com.conf |
Activation du vhost |
Si nginx -t échoue à cause d’un doublon map $http_upgrade $connection_upgrade déjà présent ailleurs, le script retente avec Bearer seul dans ia-enso-http-maps.conf.
Variables d’environnement du script
| Variable | Défaut | Rôle |
|---|---|---|
IA_ENSO_OLLAMA_BEARER_TOKEN |
généré | Secret pour Authorization: Bearer … |
IA_ENSO_SSH_KEY |
~/.ssh/id_ed25519 |
Clé privée SSH |
IA_ENSO_PROXY_USER |
ncantu |
Utilisateur SSH sur le proxy |
IA_ENSO_PROXY_HOST |
192.168.1.100 |
Cible SSH (IP ou hostname LAN) |
DEPLOY_SSH_PROXY_HOST |
4nk.myftp.biz |
Bastion ProxyJump ; vide = SSH direct |
DEPLOY_SSH_PROXY_USER |
idem proxy | Utilisateur sur le bastion |
Bibliothèque utilisée : ia_dev/deploy/_lib/ssh.sh (BatchMode=yes).
Déploiement manuel (sans script)
1. DNS et TLS
Le DNS doit résoudre ia.enso.4nkweb.com vers l’entrée publique qui atteint ce proxy.
sudo certbot certonly --webroot -w /var/www/certbot -d ia.enso.4nkweb.com
Adapter dans sites/ia.enso.4nkweb.com.conf les directives ssl_certificate / ssl_certificate_key si le répertoire live/ diffère.
2. Maps HTTP ($ia_enso_ollama_authorized, WebSocket)
Option A — un seul fichier sous conf.d (équivalent au script)
Créer /etc/nginx/conf.d/ia-enso-http-maps.conf en reprenant le contenu généré par le script ou en combinant :
http-maps/websocket-connection.map.conf.example(uniquement si$connection_upgraden’existe pas déjà dans l’instance),- et un
map $http_authorization $ia_enso_ollama_authorized { ... "Bearer <secret>" 1; }.
Option B — fichiers séparés sous /etc/nginx/http-maps/
Copier les .example sans suffixe, éditer le secret Bearer, puis dans http { } :
include /etc/nginx/http-maps/websocket-connection.map.conf;
include /etc/nginx/http-maps/ia-enso-ollama-bearer.map.conf;
Ne pas commiter un fichier contenant le secret réel.
3. Fichier server
sudo cp deploy/nginx/sites/ia.enso.4nkweb.com.conf /etc/nginx/sites-available/ia.enso.4nkweb.com.conf
sudo ln -sf /etc/nginx/sites-available/ia.enso.4nkweb.com.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Vérifications
API Ollama via le proxy
curl -sS -o /dev/null -w "%{http_code}\n" \
-H "Authorization: Bearer <secret>" \
https://ia.enso.4nkweb.com/ollama/v1/models
Attendu : 200 avec le bon secret ; 401 sans en-tête ou secret incorrect.
AnythingLLM
Navigateur : https://ia.enso.4nkweb.com/anythingllm/ (redirection vers /anythingllm/). Connexion avec les identifiants AnythingLLM.
Si les assets statiques échouent, vérifier la doc upstream (sous-chemin, en-têtes X-Forwarded-*).
Cursor
- URL de base OpenAI :
https://ia.enso.4nkweb.com/ollama/v1 - Clé API : identique au secret Bearer (sans préfixe
Bearerdans le champ ; Cursor envoieAuthorization: Bearer <clé>).
Pare-feu backend
Sur 192.168.1.164, n’autoriser 11434 et 3001 TCP que depuis 192.168.1.100 (proxy) si un pare-feu hôte est actif.
Rotation du secret Bearer
- Mettre à jour la ligne
"Bearer …"dans/etc/nginx/conf.d/ia-enso-http-maps.conf(ou le fichiermapmanuel équivalent). sudo nginx -t && sudo systemctl reload nginx.- Mettre à jour la clé API dans Cursor (et tout autre client).
Dépannage
| Symptôme | Piste |
|---|---|
nginx -t erreur sur connection_upgrade |
Doublon de map $http_upgrade $connection_upgrade : retirer l’un des blocs ou n’installer que le map Bearer. |
401 sur /ollama/ |
Secret différent entre client et map ; en-tête Authorization absent ou mal formé (Bearer + secret exact). |
502 / timeout |
Ollama ou AnythingLLM arrêtés sur .164 ; pare-feu ; mauvais IP/upstream dans le fichier site. |
| Erreur SSL | Certificat absent ou chemins ssl_certificate incorrects pour ia.enso.4nkweb.com. |
Cursor ssrf_blocked |
L’hôte utilisé résout encore vers une IP privée côté infrastructure Cursor ; vérifier DNS public / NAT. |