Auto-héberger Iva, assistant IA Telegram sur un VPS
Déployez Iva v0.3.13 sur un petit VPS sans port entrant ni domaine. Configurez systemd user et sauvegardez sa mémoire en fichiers Markdown lisibles dans Obsidian.
Ce que vous allez déployer
Iva est un assistant IA Telegram auto-hébergé. C’est l’un des rares assistants que vous pouvez déployer sans ouvrir de port entrant ni lui associer un domaine. Aucun certificat n’est nécessaire non plus, car aucun service n’écoute sur le serveur pour Internet. Le service établit une connexion sortante vers Telegram, la maintient ouverte et lit vos messages dans la réponse. Tout le reste découle de cette connexion sortante.
Iva est distribué sous licence MIT et écrit en Node. Sa mémoire se trouve dans un dossier contenant de simples fichiers Markdown qu’Obsidian peut ouvrir directement. Les notes qu’il conserve à votre sujet restent donc lisibles sans l’application. Ce guide utilise la release v0.3.13, publiée le 6 August 2026.
La plupart des logiciels auto-hébergés commencent par un enregistrement DNS (domain name system) et un certificat Let’s Encrypt délivré avec Certbot. Iva ignore complètement cette couche. Un petit VPS derrière un pare-feu qui n’autorise que SSH constitue donc un déploiement complet.
Pourquoi Iva n’a besoin d’aucun port ouvert
iva-telegram-poll.service est un bridge en long polling. Il appelle l’API getUpdates de Telegram et attend la réponse. Chaque connexion est donc initiée par votre serveur. Telegram ne se connecte jamais en retour. Vous n’avez donc aucun reverse proxy à configurer ni aucun renouvellement de certificat à ne pas oublier.
L’agent écoute bien sur le port 127.0.0.1, mais uniquement sur 8723. La documentation du projet est claire : n’exposez pas le port 8723. Si vous placez un reverse proxy devant l’agent, il doit continuer à exiger le bearer token. Vérifiez l’adresse d’écoute après l’installation.
sudo ss -tlnp | grep 8723L’adresse doit être 127.0.0.1:8723. Une adresse wildcard telle que 0.0.0.0:8723 rend les routes HTTP de l’agent accessibles depuis Internet. Vous devez corriger ce point avant d’envoyer des données privées au bot.
Le firewall reste donc fermé. Autorisez SSH avant de l’activer, car ufw enable sans règle SSH ferme la session dans laquelle vous saisissez les commandes.
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw statusCe que fait réellement l’installateur en une ligne
La page d’accueil du projet vous fournit une commande qui redirige un script GitHub vers bash. Lisez d’abord le script, car il fait bien plus qu’installer un seul programme.
curl -fsSL https://raw.githubusercontent.com/smixs/iva/main/install.sh -o iva-install.sh
less iva-install.sh- Il installe les paquets système avec le gestionnaire de paquets détecté :
git,gh,python3,ffmpeg,pandocetpoppler-utils. - Il crée un fichier swap de 2 GB à l’emplacement
/swapfilelorsque la machine dispose de moins de 1.5 GB de RAM et d’aucun swap, car le build est interrompu sans celui-ci. - Il installe nvm, puis Node 24, qui est la version minimale requise par Iva.
- Il installe
uv, le gestionnaire de paquets Python, dans~/.local/bin. - Il clone le dépôt dans
~/ivaet exécutenpm ci. - Il installe deux paquets npm globaux,
agent-browser, qui télécharge ensuite Chromium, et@googleworkspace/cli. - Il exécute l’assistant de configuration, build le projet et crée le vault.
- Il écrit une commande
ivadans~/.local/binet installe les unités systemd utilisateur.
Cela représente beaucoup de logiciels pour une seule ligne. Cela explique aussi l’instruction du README qui demande d’installer le projet avec un utilisateur ordinaire et non avec root : l’outil shell de l’agent s’exécute ensuite avec les privilèges dont disposait l’installateur. Le script appelle sudo uniquement pour installer les paquets et créer le fichier swap, via un helper qui exécute directement les commandes lorsque vous êtes déjà root.
Créez un utilisateur dédié avant l’installation
Attribuez à Iva son propre compte. L’agent exécute des commandes shell sur l’hôte via child_process de Node, sans conteneur ni sandbox. Le compte utilisé pour l’exécution constitue donc la frontière de sécurité.
sudo adduser --disabled-password --gecos "" iva
sudo usermod -aG sudo iva
sudo install -d -m 700 -o iva -g iva /home/iva/.ssh
sudo cp ~/.ssh/authorized_keys /home/iva/.ssh/authorized_keys
sudo chown iva:iva /home/iva/.ssh/authorized_keys
sudo chmod 600 /home/iva/.ssh/authorized_keys
sudo loginctl enable-linger ivaenable-linger est nécessaire parce qu’Iva s’exécute sous forme d’unités systemd user. Sans linger, systemd arrête les services de cet utilisateur dès que sa dernière session se termine. L’assistant s’arrêterait donc lorsque vous fermez la connexion SSH. La même règle s’applique à tout service ou timer que vous créez vous-même sous systemd.
Le compte a besoin de sudo uniquement pendant que l’installateur ajoute les paquets. Retirez cette permission lorsque l’installation est terminée.
sudo deluser iva sudoConnectez-vous directement avec cet utilisateur via SSH. Un shell ouvert avec sudo -iu iva ne définit ni DBUS_SESSION_BUS_ADDRESS ni XDG_RUNTIME_DIR. Chaque commande systemctl --user échoue donc avec Failed to connect to bus. Cette séparation suit le même principe que l’exécution des services avec des utilisateurs disposant de privilèges minimaux.
Installer une version figée au lieu de la transmettre à bash
L’installateur a une propriété utile. Avant de cloner quoi que ce soit, il vérifie que le répertoire qui contient le script contient déjà un package.json avec "eve". Si c’est le cas, il construit cette copie de travail et ignore le clonage. Vous pouvez donc choisir vous-même la version.
git clone --branch v0.3.13 https://github.com/smixs/iva.git ~/iva
cd ~/iva
git log -1 --oneline
bash install.shVous savez maintenant quel code s’exécute. Ce n’est pas le cas lorsque le script clone main dans l’état où celui-ci se trouve à ce moment-là. Iva a publié cinq versions entre le 4 et le 6 août 2026. main ce matin et main cet après-midi ne désignent donc pas le même programme.
L’extraction d’un tag place git dans l’état HEAD détaché. Cela fonctionne correctement, mais vous devez en connaître la limite : iva update fait avancer la copie de travail vers la branche de mise à jour. La version figée constitue donc un point de départ connu, et non un gel permanent. iva version affiche la version du paquet et le commit git. Vous pouvez ainsi toujours savoir où vous en êtes.
Pour passer volontairement à une version ultérieure, listez les tags, définissez IVA_TAG sur celui que vous avez choisi, puis relancez l’installateur depuis la copie de travail.
cd ~/iva
git fetch --tags
git tag --list 'v*' | sort -V | tail -5
IVA_TAG=v0.3.13
git checkout "$IVA_TAG"
bash install.sh --skip-setup
iva restart--skip-setup empêche l’assistant de s’exécuter à nouveau sur un .env qui fonctionne déjà.
Les cinq étapes de l’assistant et les clés demandées
- Fournisseur du modèle et modèle.
MODEL_PROVIDERaccepteopencode,ollama,openrouteroucodex. L’assistant valide la clé en direct et liste les modèles inclus dans votre forfait. - Voix et recherche. Une clé Deepgram transcrit les notes vocales. Une clé de recherche web (Tavily, Exa, Parallel ou Brave) est facultative.
- Jeton du bot Telegram fourni par @BotFather, vérifié auprès du point de terminaison
getMe. - Contrôle d’accès. Envoyez un message à votre bot. L’assistant récupère votre ID utilisateur numérique dans
getUpdates. - Paramètres système. Fuseau horaire IANA, répertoire du coffre et port local, 8723 par défaut.
Deux de ces éléments sont des dépendances que la présentation « une seule commande » masque. Iva ne fournit aucun modèle. Elle a donc besoin d’un forfait de modèle payant ou d’une clé API avant de pouvoir répondre. Elle ne transcrit pas non plus les fichiers audio elle-même. Les notes vocales nécessitent donc un service distinct. Le modèle nova-3 de Deepgram, avec DEEPGRAM_LANGUAGE=multi, détecte la langue. Les nouveaux comptes Deepgram reçoivent des crédits de démarrage qui couvrent plusieurs mois d’utilisation personnelle. Le texte fonctionne avec la seule clé du modèle. Seule la voix dépend de Deepgram.
Vérifiez ce que l’assistant a écrit.
grep -E '^(MODEL_PROVIDER|TELEGRAM_ALLOWED_USER_IDS|ASSISTANT_VAULT_DIR|IVA_PORT)=' ~/iva/.env
ls -l ~/iva/.envls doit afficher -rw-------, avec le mode 0600, car ce fichier contient toutes les clés que vous venez de saisir. TELEGRAM_ALLOWED_USER_IDS doit contenir votre ID numérique. La liste d’autorisation applique une logique de refus par défaut. Une valeur vide signifie qu’Iva ne répond à personne.
Le modèle est lu une seule fois, au démarrage du processus. Modifier MODEL_PROVIDER ou un nom de modèle dans .env ne change rien tant que vous n’exécutez pas iva restart. Avec openrouter, le nom du modèle est un slug du fournisseur tel que anthropic/claude-sonnet-4.5, et non un simple nom. Avec codex, il n’y a aucune clé API : iva login se connecte à un abonnement ChatGPT existant.
Quel est le coût mensuel d’Iva
The data behind this chart
[
{
"plan": "Small VPS, always on",
"usd_per_month": 5
},
{
"plan": "OpenCode Go model plan",
"usd_per_month": 5
},
{
"plan": "Ollama Cloud model plan",
"usd_per_month": 20
},
{
"plan": "Deepgram voice, starter credits",
"usd_per_month": 0
},
{
"plan": "Tavily web search, free tier",
"usd_per_month": 0
},
{
"plan": "Cheapest complete setup",
"usd_per_month": 10
}
]Voici les tarifs catalogue publiés en août 2026, et non des mesures. Un petit VPS à 5 dollars US, plus l’offre OpenCode Go à 5 dollars, constitue la configuration complète la moins chère, à environ 10 dollars par mois. Ollama Cloud est l’autre option à tarif fixe, à 20 dollars. Ses modèles de pointe sont facturés en supplément selon l’utilisation. La voix coûte 0 pendant la durée des crédits de démarrage Deepgram.
OpenRouter n’apparaît pas dans ce tableau, car la facturation se fait à l’usage. Votre facture suit donc votre consommation. C’est l’option à surveiller : un assistant qui utilise une fenêtre de contexte de 131072 tokens à chaque tour peut rapidement coûter plus cher qu’une offre à tarif fixe. Définissez la variable de fenêtre de contexte sur la taille réelle du modèle. Une valeur trop élevée ne fait que gaspiller des tokens.
Les deux services et les deux timers
iva.serviceexécute l’agent lui-même.iva-telegram-poll.serviceexécute le bridge de long polling qui communique avec Telegram.iva-memory-doctor.timerse déclenche à 05:00 et exécute la maintenance nocturne du vault.iva-update-check.timerse déclenche à 10:00 et vérifie si une version plus récente existe.iva-telegram-userbot.servicen’existe que si vous avez configuré le proxy Telethon facultatif.
iva status
systemctl --user status iva.service iva-telegram-poll.service
systemctl --user list-timers
iva logs polliva status affiche l’état des deux services et des deux timers de supervision. systemctl --user list-timers affiche la prochaine exécution de chaque timer. Cela permet de vérifier que le memory doctor s’exécutera bien cette nuit. Les deux services doivent rester à l’état active (running). Si l’un d’eux redémarre en boucle, journalctl --user -u iva.service -n 100 en indique la raison.
Cette séparation est importante pour le dépannage. Le bridge peut être actif et effectuer le polling alors que l’agent est arrêté. Telegram accepte alors votre message, mais aucune réponse n’est envoyée. iva logs poll surveille le bridge et iva logs surveille l’agent. Les deux journaux indiquent donc quelle partie est défaillante.
Emplacement du coffre Obsidian et sauvegarde
ASSISTANT_VAULT_DIR utilise par défaut vault dans le répertoire d’installation. La mémoire se trouve donc dans ~/iva/vault. Il s’agit de son propre dépôt git, séparé du code. Vous pouvez ainsi mettre à jour Iva sans modifier vos notes.
vault/CORE.mdcontient les faits durables et les préférences permanentes, dans une limite de 1200 caractères. Son contenu est inclus dans chaque system prompt.vault/daily/YYYY-MM-DD.mdcontient la transcription du jour, traitée en ajout uniquement.vault/cards/contient les cartes typées pour les contacts, les projets, les décisions, les idées et les notes.vault/summaries/daily/,weekly/,monthly/etyearly/contiennent les synthèses.vault/attachments/contient les fichiers classés par date, etvault/.graph/contient le graphe des liens.vault/schema.jsondéfinit les types de cartes et les règles de vieillissement.
Les synthèses sont générées selon un calendrier interne au processus. L’exécution quotidienne de 04:00 transforme la transcription de la veille en cartes et en résumé, puis réécrit CORE.md. Les exécutions hebdomadaire, mensuelle et annuelle compressent ensuite ces données à leur tour. À 05:00, le memory doctor exécute un traitement déterministe sans faire intervenir de modèle : il applique le schéma, reconstruit le graphe des liens, régénère l’index, puis effectue un commit et un push.
Ce push constitue votre sauvegarde. C’est l’étape souvent oubliée. Si le coffre ne possède aucun git remote, le doctor tente de créer un dépôt GitHub privé via gh. Cette opération nécessite une GitHub CLI authentifiée.
gh auth login
systemctl --user start iva-memory-doctor.service
cd ~/iva/vault && git log --oneline -3Un commit daté du jour indique que le traitement a été exécuté et que le coffre a été commité. Les avertissements gh not available dans le journal indiquent le contraire : le coffre est bien maintenu, mais il ne quitte jamais le serveur. Un VPS hors service emporte donc votre mémoire avec lui.
Conservez également une copie que vous contrôlez.
tar czf ~/iva-vault-backup.tgz -C ~/iva vaultCopiez ce fichier hors du serveur avec scp, puis supprimez-le du serveur. Pour lire la mémoire dans Obsidian, indiquez à Obsidian un clone du dépôt du coffre. Les Wikilinks et les backlinks fonctionnent sans modification, tout comme la vue graphique. Vous pouvez modifier manuellement les cartes et CORE.md sans risque. Ne modifiez pas MOC.md ni .graph/, car l’exécution nocturne régénère ces deux éléments.
Traitez le coffre comme un journal de votre vie
Ce répertoire constitue un relevé daté de ce que vous avez dit, des personnes rencontrées et des décisions prises, sur une machine que vous louez. Deux conséquences en découlent.
L’auto-hébergement déplace le stockage, pas le traitement. Chaque échange est envoyé à votre fournisseur de modèle, et chaque note vocale est envoyée à Deepgram. Le coffre vous appartient. Les requêtes ne sont pas privées vis-à-vis des entreprises qui les traitent. Exécuter vous-même la couche de mémoire, comme avec un serveur de mémoire Mem0 sur votre propre VPS, suit le même modèle : le stockage est local, mais l’appel au modèle sort toujours de votre infrastructure. Si un sujet est trop sensible pour être confié à un tiers, ne l’incluez pas dans le chat.
La portée de ce compte couvre tout le coffre. Les outils d’Iva s’exécutent directement sur l’hôte via fs et child_process de Node, sans Docker ni sandbox. Un échange détourné dispose donc des accès du compte de service. C’est pourquoi ce compte ne conserve aucun sudo après l’installation, et pourquoi l’allowlist mérite plus d’attention qu’il n’y paraît : c’est elle qui détermine quels messages deviennent des commandes sur votre serveur. Si vous voulez utiliser l’assistant depuis votre téléphone sans rien exposer, c’est le même modèle que celui utilisé pour accéder à un agent Hermes auto-hébergé depuis votre téléphone, le client de chat remplissant le rôle qu’aurait autrement un endpoint public.
Ce qui peut échouer et le message affiché
Build interrompu, code de sortie 137. Le tueur de processus en cas de manque de mémoire du kernel a interrompu le build. L’installateur ajoute du swap uniquement si la RAM est inférieure à 1.5 GB et qu’aucun swap n’existe. Ajoutez donc le swap vous-même, puis relancez l’installateur.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -hFailed to connect to bus. Chaque commande systemctl --user affiche ce message lorsque le shell ne dispose d’aucun bus de session utilisateur, ce que fournit sudo -iu iva. Ouvrez une session SSH normale avec cet utilisateur, ou exportez XDG_RUNTIME_DIR=/run/user/$(id -u iva) avant d’exécuter la commande.
Le bot ne vous répond pas. TELEGRAM_ALLOWED_USER_IDS est vide et l’allowlist applique un refus par défaut. Envoyez un message au bot : il répond avec votre identifiant numérique, et rien d’autre. Ajoutez cet identifiant dans .env, puis exécutez iva restart.
Le bot devient silencieux juste après iva config. L’assistant peut déplacer IVA_PORT sans mettre à jour ASSISTANT_HOST. Le bridge se connecte alors à un port qui ne répond pas. Comparez les deux lignes, puis redémarrez.
grep -E '^(IVA_PORT|ASSISTANT_HOST)=' ~/iva/.env
iva restartUne note vocale ne reçoit aucune réponse. L’API Bot de Telegram refuse les téléchargements de fichiers de plus de 20 MB. Le bridge ne reçoit donc jamais les fichiers audio longs et ne peut rien envoyer à Deepgram. Découpez le fichier avant de l’envoyer.
ffmpeg -i long.ogg -f segment -segment_time 600 -c copy part-%02d.oggUn tour reste bloqué et ne reçoit jamais de réponse. L’état bloqué du workflow survit à un redémarrage et se remet dans la file d’attente. Un simple redémarrage ne suffit donc pas à le supprimer. iva reset place cet état en quarantaine et redémarre les deux services. /new dans la conversation démarre une nouvelle conversation.
Chromium échoue sur Ubuntu 24.04. Ubuntu 24.04 bloque les user namespaces non privilégiés via AppArmor. Le sandbox de Chromium ne peut donc pas démarrer et agent-browser échoue. L’installateur contourne ce problème en écrivant "--no-sandbox" dans ~/.agent-browser/config.json. Gardez ce point à l’esprit. Cette configuration réduit l’isolation du navigateur. C’est une raison supplémentaire pour que le compte ne possède rien d’autre qu’Iva.
FAQ
Ai-je besoin d’un domaine ou d’un port ouvert pour auto-héberger Iva ?
Non. Iva communique avec Telegram par interrogation longue : iva-telegram-poll.service appelle getUpdates et attend, de sorte que toutes les connexions sortent de votre serveur. Aucune connexion ne doit atteindre le serveur depuis l’extérieur. Vous n’avez donc besoin ni d’un enregistrement DNS ni d’un certificat. Le port HTTP de l’agent, 8723, est lié à 127.0.0.1, et la documentation du projet indique de ne pas l’exposer. La configuration correcte consiste à autoriser SSH et rien d’autre dans le pare-feu.
Combien coûte l’exécution d’Iva chaque mois ?
Aux tarifs catalogue publiés en août 2026, un petit VPS à 5 dollars, auquel s’ajoute l’offre au forfait la moins chère à 5 dollars, revient à environ 10 dollars américains par mois. Ollama Cloud coûte à la place 20 dollars et facture les frontier models en supplément. Les crédits de l’offre Deepgram starter couvrent initialement la voix, et les offres de web search incluent des quotas gratuits. OpenRouter est facturé à l’usage et n’a donc pas de montant mensuel fixe.
Où Iva stocke-t-il mes données et comment les sauvegarder ?
Par défaut, dans ~/iva/vault, défini par ASSISTANT_VAULT_DIR. Il s’agit d’un dépôt git privé distinct contenant des fichiers markdown en texte brut : CORE.md, daily/YYYY-MM-DD.md, cards/ et summaries/. Le memory doctor de 05:00 crée un commit et le pousse, ce qui n’est utile que si le dépôt possède un remote. Exécutez donc gh auth login ou ajoutez votre propre remote pendant l’installation. Conservez également une copie hors ligne avec tar czf ~/iva-vault-backup.tgz -C ~/iva vault et transférez ce fichier hors du serveur.
Mes données restent-elles privées si j’auto-héberge Iva ?
Le stockage vous appartient. Le traitement, non. Le vault reste sur votre disque jusqu’à ce que vous le poussiez, et .env possède le mode 0600 et appartient à l’utilisateur du service. Les appels aux modèles et la transcription vocale utilisent des cloud APIs. Ces messages transitent donc par votre fournisseur de modèles et par Deepgram. Iva est distribué sous licence MIT. Vous pouvez donc lire précisément ce qu’il envoie et le modifier. La liste d’autorisation Telegram applique une politique fail closed : un TELEGRAM_ALLOWED_USER_IDS vide bloque tout le monde, y compris vous.
Quels fournisseurs de modèles Iva prend-il en charge ?
MODEL_PROVIDER accepte opencode (OpenCode Go), ollama (Ollama Cloud), openrouter et codex. OpenRouter utilise un vendor slug tel que anthropic/claude-sonnet-4.5 et propose le plus vaste choix de modèles. codex se connecte à un abonnement ChatGPT existant avec iva login et n’utilise aucune API key. Définissez le fournisseur et la context window correspondante à la taille réelle du modèle, puis exécutez iva restart, car le modèle n’est lu qu’une seule fois au démarrage du processus.