Morphic è un motore di risposte basato su intelligenza artificiale che puoi eseguire sul tuo server. Combina la ricerca sul web tramite SearXNG con modelli linguistici locali o cloud, generando risposte con fonti citate.

In questa guida vedremo come installare Morphic con Docker Compose, configurare un modello AI tramite Ollama e impostare SearXNG per eseguire ricerche in italiano. L’installazione Docker è quella consigliata dal progetto: il file Compose avvia automaticamente Morphic, PostgreSQL, Redis e SearXNG.

Morphic è pensato per chi vuole un’alternativa self-hosted ai motori di ricerca con AI integrata: puoi scegliere se usare un modello locale tramite Ollama oppure collegare un provider esterno, mantenendo il controllo sull’infrastruttura.

Cos’è Morphic

Morphic è un’applicazione open source che unisce ricerca web, modelli linguistici e un’interfaccia generativa. A differenza di un semplice motore di ricerca, non si limita a mostrare una lista di link: elabora la domanda, consulta le sorgenti selezionate e restituisce una risposta con riferimenti.

Il progetto supporta modelli locali tramite Ollama e provider cloud come OpenAI, Anthropic Claude, Google Gemini e servizi compatibili con l’API OpenAI. Puoi anche combinare più provider in base alle esigenze: ad esempio, un modello locale per le richieste quotidiane e un modello cloud solo quando serve maggiore capacità.

Funzioni principali

  • Risposte AI con citazioni delle fonti;
  • Ricerca web basata su SearXNG;
  • Supporto per modelli locali tramite Ollama;
  • Supporto per OpenAI, Anthropic Claude, Google Gemini e altri provider;
  • Interfaccia generativa che mostra il processo di ricerca;
  • Selezione dei modelli direttamente dall’interfaccia;
  • Cronologia delle conversazioni.

L’installazione Docker ufficiale include Morphic, PostgreSQL, Redis e SearXNG. Non è quindi necessario installare SearXNG separatamente.

Morphic è davvero privato?

Morphic può essere eseguito interamente sul proprio hardware, ma il livello di privacy dipende dalla configurazione scelta. La ricerca web passa attraverso SearXNG, mentre l’elaborazione del linguaggio dipende dal modello configurato.

Configurazione Dove vengono elaborati i dati Considerazioni
Ollama locale Sul tuo server o PC È la configurazione più adatta per mantenere l’elaborazione del testo in locale
Server compatibile OpenAI locale Sul tuo server o PC Richiede un endpoint raggiungibile dal container e un modello correttamente caricato
OpenAI, Claude, Gemini o Groq Sul provider cloud scelto La richiesta e il contesto vengono inviati al provider; verifica le relative condizioni e impostazioni di privacy
SearXNG incluso Sul tuo server, con interrogazione dei motori scelti I motori interrogati ricevono comunque le richieste secondo le loro politiche

Per un utilizzo orientato alla privacy, la combinazione più coerente è Morphic con SearXNG e un modello locale tramite Ollama. Se invece usi un provider cloud, non presentare l’istanza come completamente privata: il self-hosting riguarda l’applicazione e la ricerca, non necessariamente l’inferenza del modello.

Requisiti

Per seguire il tutorial servono:

  • Un server Debian, Ubuntu, Arch Linux o un’altra distribuzione GNU/Linux;
  • Docker Engine e Docker Compose Plugin;
  • Git;
  • Un utente con permessi sudo;
  • Risorse sufficienti per il modello AI scelto;
  • Una chiave API se utilizzi un provider cloud;
  • Facoltativamente, Ollama installato sul server o su un altro host della rete locale;
  • Facoltativamente, un dominio e un reverse proxy HTTPS per esporre l’istanza.

Se devi installare Docker, puoi seguire la nostra guida all’installazione di Docker e Docker Compose su Raspberry Pi e Linux. Per preparare il sistema operativo, consulta la guida all’installazione di Debian Server.

Creare la cartella di Morphic

Creiamo una cartella dedicata all’applicazione in /opt. Al suo interno cloneremo il repository ufficiale e conserveremo la configurazione personalizzata.

sudo mkdir -p /opt/morphic
sudo chown -R $USER:$USER /opt/morphic
cd /opt/morphic

Clonare Morphic

Scarica il repository ufficiale direttamente nella cartella appena creata:

git clone https://github.com/miurla/morphic.git .

Il repository include il file Docker Compose necessario per avviare Morphic insieme a PostgreSQL, Redis e SearXNG.

Modifica il Docker Compose

Morphic viene eseguito in un container Docker, mentre Ollama è installato direttamente sul server e gestito tramite systemd. All’interno del container, localhost identifica il container stesso e non il server: per questo Morphic non può raggiungere Ollama con http://localhost:11434.

Per consentire la comunicazione tra il container e Ollama, aggiungi host.docker.internal al servizio morphic nel file Docker Compose. Docker lo risolverà con l’indirizzo del server sulla rete Docker.

nano docker-compose.yaml

Individua il servizio morphic e sostituisci questa riga:

image: ghcr.io/${GITHUB_REPOSITORY:-your-username/morphic}:latest

con:

image: ghcr.io/miurla/morphic:latest
extra_hosts:
  - "host.docker.internal:host-gateway"

La prima riga usa l’immagine ufficiale di Morphic; extra_hosts consente al container di raggiungere l’host tramite host.docker.internal.

Se non intendi modificare il codice sorgente di Morphic, rimuovi anche tutta la sezione build: dal servizio morphic (riportata di seguito):

build:
  context: .
  dockerfile: Dockerfile
  cache_from:
    - morphic:builder
    - morphic:latest

In questo modo Docker Compose utilizzerà soltanto l’immagine ufficiale. La sezione iniziale del servizio perciò diventa:

name: morphic-stack
services:
  morphic:
    image: ghcr.io/miurla/morphic:latest
    extra_hosts:
      - "host.docker.internal:host-gateway"
    command: npx next start -H 0.0.0.0
    env_file: .env.local

Questa modifica consente al container Morphic di raggiungere Ollama tramite l’indirizzo http://host.docker.internal:11434.

Configurare Morphic con Ollama e SearXNG

Apri il file di configurazione:

cp .env.local.example .env.local
nano .env.local

Per usare soltanto Ollama e la ricerca SearXNG inclusa in Docker Compose, apri il file .env.local e commenta le variabili relative a OpenAI, database e Tavily. Modifica invece OLLAMA_BASE_URL con l’indirizzo necessario per raggiungere Ollama installato sul server.

# OPENAI_API_KEY=[YOUR_OPENAI_API_KEY]

OLLAMA_BASE_URL=http://host.docker.internal:11434

# DATABASE_URL=[YOUR_DATABASE_URL]

# TAVILY_API_KEY=[YOUR_TAVILY_API_KEY]

ENABLE_AUTH=false
ANONYMOUS_USER_ID=anonymous-user

SEARCH_API=searxng
SEARXNG_API_URL=http://searxng:8080

Le variabili ENABLE_AUTH=false e ANONYMOUS_USER_ID=anonymous-user possono restare invariate: sono già configurate per un utilizzo personale senza autenticazione.

Siccome Ollama è installato sull’host e gestito tramite systemd, usa http://host.docker.internal:11434. Dentro il container Morphic, localhost identifica il container stesso, non il server Linux.

Salva con Ctrl+O, premi Invio e chiudi Nano con Ctrl+X.

Configurare SearXNG in italiano

Il Docker Compose di Morphic include SearXNG. La configurazione è contenuta nel file searxng-settings.yml, presente nella radice del repository.

nano searxng-settings.yml

Individua la sezione search: e modificala come segue:

search:
  default_lang: "it"
  default_locale: "it"
  formats:
    - json

L’impostazione default_lang: "it" imposta l’italiano come lingua predefinita delle ricerche. L’impostazione default_locale: "it" riguarda invece la lingua dell’interfaccia SearXNG. Il formato json è necessario perché Morphic interroga SearXNG tramite la sua API.

Salva con Ctrl+O, premi Invio e chiudi Nano con Ctrl+X.

Avviare Morphic

Dalla cartella del repository, avvia i servizi:

docker compose up -d

Docker scaricherà le immagini e avvierà Morphic, PostgreSQL, Redis e SearXNG in background. Verifica lo stato:

docker compose ps

Dovresti vedere i container di Morphic, PostgreSQL, Redis e SearXNG in esecuzione.

Per controllare i log:

docker compose logs -f

Premi Ctrl+C per interrompere la visualizzazione dei log. I container continueranno a funzionare in background.

Limitare l’accesso a Morphic

Il Docker Compose di Morphic espone l’applicazione sulla porta 3000. Per sicurezza, limita l’accesso solo al server locale modificando la sezione ports del servizio morphic:

ports:
  - "127.0.0.1:3000:3000"

In questo modo Morphic sarà raggiungibile soltanto dal server stesso, all’indirizzo:

http://localhost:3000

Non sarà invece raggiungibile da altri dispositivi della rete locale né da Internet. Questa configurazione è consigliata quando l’applicazione viene pubblicata tramite un reverse proxy locale, ad esempio Nginx, Caddy, Traefik o Nginx Proxy Manager.

Se usi un reverse proxy sullo stesso server, configuralo per inoltrare le richieste a:

http://127.0.0.1:3000

Se devi accedere temporaneamente da un altro dispositivo della rete locale, puoi usare:

ports:
  - "3000:3000"

In quel caso l’indirizzo sarà:

http://IP_DEL_SERVER:3000

Usa questa configurazione solo per una prova rapida e torna poi a 127.0.0.1:3000:3000. Non esporre direttamente la porta 3000 su Internet: se serve l’accesso remoto, usa un reverse proxy con HTTPS e autenticazione.

Dopo aver modificato il file Compose, applica le modifiche:

docker compose up -d --force-recreate

Prima configurazione di Morphic

Apri nel browser l’indirizzo dell’istanza:

http://IP_DEL_SERVER:3000

Se hai mantenuto il binding su 127.0.0.1, l’indirizzo non sarà raggiungibile dalla rete locale: completa prima il reverse proxy oppure usa un tunnel SSH temporaneo per la configurazione iniziale.

Al primo avvio, Morphic mostra l’interfaccia di ricerca. Dalla barra in alto puoi selezionare il modello da utilizzare e avviare una ricerca.

Morphic - Dashboard
Morphic – Dashboard

L’interfaccia di Morphic è in inglese e non offre attualmente una localizzazione italiana completa. È però possibile eseguire ricerche in italiano e ottenere risposte in italiano utilizzando un modello capace di gestire questa lingua.

Modalità Quick e Adaptive

Morphic offre due modalità di ricerca che determinano quanti passaggi può eseguire il modello prima di formulare la risposta.

  • Quick: modalità rapida, adatta a domande dirette. Il modello esegue un numero limitato di passaggi, interroga SearXNG, legge le fonti necessarie e genera la risposta.
  • Adaptive: modalità più flessibile. Il modello valuta la complessità della domanda e decide se approfondire la ricerca, consultare altre fonti o passare direttamente alla risposta.

Per domande semplici, come “Qual è la capitale dell’Italia?”, la modalità Quick è in genere sufficiente. Per ricerche comparative, tecniche o multi-step, come “Quali sono le differenze tra Docker e Podman e quale conviene per un home server?”, la modalità Adaptive può produrre risultati più completi.

La modalità Adaptive richiede più richieste al modello e più tempo. Con modelli locali, specialmente su hardware con risorse limitate, Quick è spesso la scelta più reattiva; Adaptive è utile quando la qualità e la profondità della ricerca sono prioritarie.

Configurare un modello locale con Ollama

Questa procedura riguarda Ollama installato direttamente su Linux e gestito tramite systemd. Se Ollama viene eseguito in Docker, configura invece la comunicazione tra i container.

Consentire l’accesso dal container di Morphic

Per impostazione predefinita, Ollama ascolta su 127.0.0.1:11434. Se Morphic viene eseguito in un container Docker con rete bridge, il suo indirizzo localhost identifica il container stesso, non il server Linux.

Per consentire le connessioni provenienti dal container, crea un override del servizio:

sudo systemctl edit ollama.service

Il comando apre l’editor per creare o modificare il drop-in /etc/systemd/system/ollama.service.d/override.conf, senza modificare il file originale del servizio. Nella parte superiore dell’editor, prima del commento che avverte che le modifiche successive verranno scartate, inserisci le seguenti righe:

[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_CONTEXT_LENGTH=8192"
Environment="OLLAMA_KEEP_ALIVE=10m"

Salva e chiudi l’editor. Non devi creare o modificare manualmente il file principale ollama.service: systemd salva la personalizzazione in un file separato.

Ricarica la configurazione e riavvia Ollama:

sudo systemctl daemon-reload
sudo systemctl restart ollama

Verifica l’indirizzo di ascolto:

ss -ltnp | grep ':11434'

Il valore 0.0.0.0 indica che Ollama ascolta su tutte le interfacce IPv4. Proteggi quindi la porta 11434 con il firewall e non esporre l’API Ollama direttamente su Internet.

Scegliere un modello adatto all’italiano

Per ottenere query e risposte in italiano e consentire a Morphic di ragionare prima di agire, usa un modello con capacità di thinking o reasoning. Per iniziare, prova:

ollama pull qwen3:4b
ollama pull phi4-mini

qwen3:4b è la scelta consigliata: offre un buon equilibrio tra qualità, italiano, capacità di usare i tool e modalità di thinking. phi4-mini è una valida alternativa, con buon supporto al function calling e capacità di ragionamento.

Se il modello non utilizza la ricerca o restituisce risultati scarsi, prova qwen3:4b. Se invece la risposta è troppo lenta, valuta un modello thinking più piccolo, mantenendo però il supporto ai tool.

Non usare modelli senza thinking: Morphic richiede un modello in grado di generare un ragionamento strutturato e, con modelli non compatibili, la ricerca può restituire un errore invece di una risposta.

Configurare un provider cloud

Se preferisci usare un provider esterno, modifica il file .env.local di Morphic e aggiungi le variabili del provider scelto: OpenAI, Anthropic Claude, Google Gemini o un altro provider supportato.

  1. Ottieni una chiave API dal provider scelto;
  2. Apri il file .env.local nella cartella di Morphic;
  3. Aggiungi la variabile corrispondente al provider;
  4. Inserisci la chiave API;
  5. Riavvia i container Morphic;
  6. Seleziona il modello nel selettore dell’interfaccia;
  7. Esegui una domanda di prova.

Esempi di variabili:

OPENAI_API_KEY=la-tua-chiave-openai
ANTHROPIC_API_KEY=la-tua-chiave-anthropic
GOOGLE_GENERATIVE_AI_API_KEY=la-tua-chiave-google

Dopo aver modificato il file, riavvia Morphic:

docker compose up -d --force-recreate

Non inserire chiavi API in un’istanza esposta pubblicamente senza HTTPS e senza controlli di accesso. Mantieni il file .env.local fuori dal controllo di versione e non condividerlo.

Eseguire la prima ricerca in italiano

Dopo aver configurato il modello, inserisci una domanda semplice, ad esempio:

Quali sono le principali differenze tra Docker e Podman?

Morphic interrogherà SearXNG, raccoglierà i risultati e genererà una risposta con le fonti citate. Grazie a default_lang: "it", SearXNG orienterà le ricerche verso l’italiano.

Morphic - Esempio di utilizzo
Morphic – Esempio di utilizzo

Controlla sempre i link proposti: la risposta AI è un punto di partenza, non un sostituto della verifica delle fonti.

Esporre Morphic con Nginx e HTTPS

Per accedere a Morphic da più dispositivi o da fuori casa, esponi l’applicazione tramite un dominio con HTTPS. Il reverse proxy riceve le richieste sulla porta 443 e le inoltra al container locale sulla porta 3000.

Ecco un esempio minimo per Nginx. Sostituisci morphic.example.com con il tuo dominio.

server {
    listen 80;
    listen [::]:80;
    server_name morphic.example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name morphic.example.com;

    ssl_certificate /etc/letsencrypt/live/morphic.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/morphic.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        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;

        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
}

Dopo aver configurato il certificato e il virtual host, verifica la sintassi e ricarica Nginx:

sudo nginx -t
sudo systemctl reload nginx

Apri quindi:

https://morphic.example.com

Aggiornare Morphic

Poiché Morphic viene installato clonando il repository, per aggiornarlo scarica le nuove modifiche e ricrea i container:

cd /opt/morphic
git pull
docker compose pull
docker compose up -d

Prima di aggiornare, verifica le note di rilascio e le modifiche al file .env.local.example: potrebbero essere state introdotte nuove variabili di configurazione.

Verifica infine lo stato e i log:

docker compose ps
docker compose logs --tail=100

Comandi utili

Arrestare Morphic

cd /opt/morphic
docker compose down

Avviare Morphic

cd /opt/morphic
docker compose up -d

Riavviare i container

cd /opt/morphic
docker compose restart

Visualizzare i log

cd /opt/morphic
docker compose logs -f

Conclusioni

Morphic è una soluzione interessante per chi vuole un motore di risposte AI self-hosted, con ricerca web tramite SearXNG e risposte con fonti citate. L’installazione Docker ufficiale semplifica notevolmente l’installazione, perché include già SearXNG, PostgreSQL e Redis.

La scelta più coerente con un approccio orientato alla privacy è usare Morphic con Ollama e un modello locale. Se invece colleghi un provider cloud, valuta attentamente quali dati invii e quali condizioni si applicano al servizio scelto.

Per ricerche in italiano, imposta default_lang: "it" nella configurazione di SearXNG e utilizza un modello multilingue con thinking e supporto ai tool, come Qwen 3 o Phi-4-mini. L’interfaccia di Morphic resta in inglese, ma query e risposte possono funzionare in italiano.

Per codice sorgente, documentazione, aggiornamenti e segnalazioni, consulta la repository GitHub ufficiale di Morphic.

Domande frequenti

Morphic è gratuito?

Morphic è open source e può essere eseguito gratuitamente sul proprio server. Se utilizzi un provider cloud per il modello AI, però, potresti dover pagare l’uso dell’API o disporre di un credito sul servizio scelto.

Morphic include SearXNG?

Sì. Il Docker Compose ufficiale include SearXNG insieme a Morphic, PostgreSQL e Redis, quindi non è necessario installare SearXNG separatamente.

Posso usare un modello locale?

Sì. Morphic supporta Ollama e server compatibili con l’API OpenAI. Per mantenere l’elaborazione locale, configura Ollama sul tuo server o su un host della rete locale.

Le ricerche funzionano in italiano?

Sì. Impostando default_lang: "it" nella configurazione di SearXNG, le ricerche vengono orientate verso l’italiano. Per ottenere query e risposte in italiano, utilizza inoltre un modello multilingue con thinking e supporto ai tool, come Qwen 3 o Phi-4-mini.

L’interfaccia è in italiano?

No. Morphic non offre attualmente una localizzazione italiana completa dell’interfaccia. I menu e i messaggi dell’applicazione restano in inglese, ma le ricerche e le risposte possono essere in italiano.

Devo esporre Morphic su Internet?

No. Puoi usarlo in rete locale oppure accedervi tramite VPN o rete privata. Se lo esponi su Internet, usa HTTPS e un reverse proxy.

È meglio Morphic o SearXNG?

SearXNG è un metamotore: aggrega risultati di ricerca senza generare risposte AI. Morphic aggiunge un livello di intelligenza artificiale, generando risposte con citazioni. Sono strumenti complementari: Morphic usa SearXNG come motore di ricerca.

Perché Morphic restituisce un errore con alcuni modelli?

Morphic richiede un modello con thinking e supporto ai tool. Modelli senza thinking possono causare errori durante la ricerca. Usa ad esempio qwen3:4b o phi4-mini.

Per verificare la causa dell’errore, controlla i log del servizio Morphic:

docker compose logs -f morphic

Questo comando mostra e segue in tempo reale soltanto i log di Morphic.

Come risolvo l’errore di contesto troppo piccolo?

Se Ollama restituisce un errore del tipo request exceeds the available context size, aumenta la finestra di contesto a 8192 token o più:

sudo systemctl edit ollama.service
[Service]
...
Environment="OLLAMA_CONTEXT_LENGTH=8192"
sudo systemctl daemon-reload
sudo systemctl restart ollama

Verifica con ollama ps che la colonna CONTEXT mostri 8192.

Rispondi