Salta ai contenuti

Installa un server

Un server Kedalio sono tre container: il server, Caddy davanti per l’HTTPS e un primo host accanto. Li installi con un comando, oppure come risorsa su un server Coolify che hai già.

  • Una macchina Linux con Docker e Docker Compose v2 (docker compose). Se manca uno dei due, l’installer si ferma e lo dice.
  • Un dominio il cui DNS punta alla macchina, per esempio app.example.com. Caddy prende il certificato da Let’s Encrypt.
  • Le porte 80 e 443 (TCP, e UDP per la 443) libere. Caddy è l’unico container in ascolto verso l’esterno.
  • sudo, una volta, su una macchina con AppArmor attivo: il profilo dell’host va caricato nel kernel.

L’immagine dell’host è costruita per amd64 e arm64.

Finestra del terminale
curl -fsSL https://get.kedalio.com | sh

Fa una domanda sola:

Domain for Kedalio (its DNS must point at this machine), e.g. app.example.com:

Poi:

  1. scarica le immagini del server e dell’host;
  2. scrive la cartella dell’installazione, ~/kedalio: compose.yaml, Caddyfile, i profili seccomp e AppArmor dell’host, tutti presi dall’immagine dell’host della stessa versione, e .env con il dominio e un codice monouso per il primo host;
  3. carica il profilo AppArmor dell’host in /etc/apparmor.d, se la macchina ha AppArmor (è il sudo);
  4. avvia i tre container;
  5. stampa il link che crea il tuo account.
Kedalio is up. Make your account (the link works once, for seven days):
https://app.example.com/invite#…

Aprilo, scegli come entri (una passkey, una password con il codice di un’app di autenticazione, o tutte e due) e sei il primo account del server e il suo amministratore. L’host avviato accanto al server entra da solo appena l’account esiste. I passi successivi sono in Account e accesso.

In una CI o in uno script tutto arriva dall’ambiente: KEDALIO_DOMAIN e, se servono, KEDALIO_DIR (la cartella, di default ~/kedalio), KEDALIO_VERSION, KEDALIO_REGISTRY, KEDALIO_SERVER_IMAGE, KEDALIO_HOST_IMAGE, KEDALIO_HTTP_PORT, KEDALIO_HTTPS_PORT, KEDALIO_ENGINES (cambia le versioni dei motori che gli host installano, già fissate dal server; per esempio claude-code@2.1.0,codex@0.50.0) e KEDALIO_NO_PULL=1 per immagini già presenti sulla macchina.

Lancia di nuovo l’installer. Conserva .env (il dominio, il codice, la versione e il registry), prende i file della nuova immagine e riavvia i container. Per passare a un’altra versione dai KEDALIO_VERSION; senza, resta quella installata. Gli host poi seguono da soli la versione del server (Aggiungi un host).

L’installer aspetta due minuti il primo avvio del server. Un server che ha già il suo account non stampa nessun link:

Kedalio is up at https://app.example.com (no first-account link: the instance already has its account).

Finché non esiste un account, il server crea un link nuovo a ogni avvio e i precedenti smettono di funzionare. Lo trovi nel log del server:

Finestra del terminale
docker compose --project-directory ~/kedalio logs server | grep "first account"

deploy/coolify/compose.yaml fa girare il server e un host su un server Coolify, dalle immagini di Kedalio (le stesse che usa deploy/get.sh), senza che Coolify le ricostruisca. Davanti c’è il proxy di Coolify, quindi niente Caddy.

  1. Una volta per macchina, da root, prima del primo deploy, carica il profilo AppArmor dell’host da un clone del repository:

    Finestra del terminale
    sudo install -m 0644 apps/host/image/apparmor/kedalio-host /etc/apparmor.d/kedalio-host
    sudo apparmor_parser -r -W /etc/apparmor.d/kedalio-host
  2. Aggiungi una risorsa dal repository con il build pack Docker Compose, directory di base /, file compose deploy/coolify/compose.yaml.

  3. Dai al servizio server il suo dominio (https://app.example.com) e imposta KEDALIO_URL allo stesso indirizzo, KEDALIO_SERVER_IMAGE e KEDALIO_HOST_IMAGE alle due immagini (registry.example.com/kedalio/kedalio-server:<versione> e …/kedalio-host:<versione>). Con un tag che si sposta, come :dev, ogni deploy prende la più recente.

  4. Fai il deploy. Coolify genera una volta il codice del primo host e lo conserva. Il link del primo account è nel log del servizio server, come sopra.

Variabili facoltative: KEDALIO_HOST_NAME (il nome dell’host, local di default), KEDALIO_HOST_MEMORY (8g di default) e KEDALIO_HOST_CPUS (4), KEDALIO_ENGINES, e KEDALIO_CLIENT_IP_HEADER, l’intestazione con l’indirizzo di chi visita. Di default non c’è, e allora ogni visitatore conta come il proxy di Coolify, quindi impostala: x-forwarded-for dietro il solo proxy di Coolify, cf-connecting-ip dietro Cloudflare quando solo Cloudflare raggiunge la macchina (altrimenti chiunque può scrivere quell’intestazione).

Tutto sta nel volume del server (/data dentro il container):

  • instance.db, e un database per account in accounts/<id>/account.db;
  • kek, la chiave dell’istanza, che cifra il vault;
  • backups/, una copia di ogni database fatta prima di ogni migrazione (si tengono le cinque più recenti) e una al giorno (si tengono le sette più recenti). Le migrazioni partono da sole all’avvio.

Il backup del volume è tuo o della tua piattaforma: Kedalio non ha un comando di backup. Tieni il file kek separato dal backup dei database. Se va perso, il vault resta chiuso finché non dai il codice di recupero mostrato al tuo primo accesso.

  • https://app.example.com/health risponde con il nome e la versione del server.
  • https://app.example.com/ready dice se i database e il vault sono pronti.

La ricerca nella memoria funziona per parole e per significato. Sia l’installer sia il file per Coolify avviano accanto al server un servizio embed: llama.cpp con il modello bge-m3 (circa 600 MB, scaricato al primo avvio, circa 800 MB di memoria), su tre core con un peso di CPU basso, così il server e i run vengono prima. KEDALIO_EMBED_THREADS cambia i core. Finché non risponde, la ricerca è per parole, e lo dice.

Non ancora costruiti: un comando kedalio update, un modello per Railway e un comando per disinstallare.