**Motivations:** - Ollama and AnythingLLM moved from 192.168.1.164 to the ia LAN host. **Root causes:** - Upstreams still targeted 192.168.1.164. **Correctifs:** - Set upstream servers to 192.168.1.173:11434 and :3001. **Evolutions:** - Docs aligned with ia role IP; note to edit site conf if IP changes. **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
147 lines
6.4 KiB
Markdown
147 lines
6.4 KiB
Markdown
# ia.enso.4nkweb.com — Nginx sur le proxy (192.168.1.100)
|
||
|
||
Reverse TLS vers l’hôte LAN **`192.168.1.173`** (rôle *ia* ; 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.173: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](../../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 :
|
||
|
||
```bash
|
||
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.com` aux chemins du fichier site (voir section TLS).
|
||
- **`sudo` non interactif** pour `nginx` et `systemctl 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.
|
||
|
||
```bash
|
||
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_upgrade` n’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 { }` :
|
||
|
||
```nginx
|
||
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`
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
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 `Bearer ` dans le champ ; Cursor envoie `Authorization: Bearer <clé>`).
|
||
|
||
---
|
||
|
||
## Pare-feu backend
|
||
|
||
Sur l’hôte IA (`192.168.1.173` dans la conf actuelle), 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
|
||
|
||
1. Mettre à jour la ligne `"Bearer …"` dans `/etc/nginx/conf.d/ia-enso-http-maps.conf` (ou le fichier `map` manuel équivalent).
|
||
2. `sudo nginx -t && sudo systemctl reload nginx`.
|
||
3. 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 l’hôte IA ; 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. |
|