Pourquoi synchroniser son historique shell
Travailler sur plusieurs machines devrait être transparent. En pratique, la commande kubectl rollout undo deployment/api tapée sur le laptop n'est jamais dans le terminal du serveur de CI, et le docker compose exec d'il y a trois semaines est introuvable dans ~/.zsh_history parce que la rotation a écrasé les entrées anciennes.
Atuin résout les deux problèmes à la racine : il stocke chaque commande dans SQLite avec son contexte (heure, durée, code de sortie, répertoire), et il synchronise cette base entre vos machines via un serveur que vous contrôlez. La recherche s'exécute localement — aucune latence réseau au moment de rappeler une commande — et la synchronisation se fait en arrière-plan. L'interface de recherche (Ctrl+R) devient un index exhaustif de tout ce que vous avez tapé, sur n'importe quel poste, depuis le premier jour.
Bénéfices concrets d'Atuin auto-hébergé
- Retrouvez n'importe quelle commande tapée sur n'importe quelle machine en moins d'une seconde via
Ctrl+R. - Chiffrement côté client (AES-256) : le serveur ne voit jamais le contenu de votre historique.
- Contexte riche par entrée : code de sortie, durée d'exécution, répertoire courant, hostname.
- Aucune donnée envoyée à un tiers — vous hébergez, vous maîtrisez.
- Binaire Rust sans dépendances lourdes : tourne sur le VPS Start à partir de 99 DH/mois.
- Supports zsh, bash, fish, nushell et PowerShell — un seul serveur pour toute votre flotte.
- Statistiques d'usage intégrées (
atuin stats) : vos commandes les plus fréquentes, vos pics d'activité.
Prérequis
VPS : le serveur Atuin est un binaire Rust compilé avec une base SQLite embarquée. Il consomme moins de 50 Mo de RAM au repos, ce qui le rend compatible avec le VPS Start. Comptez 512 Mo de RAM disponibles pour l'ensemble (système + processus Atuin), 5 Go de stockage SSD pour la base d'historique à long terme. Un noyau Linux récent (Debian 12 ou Ubuntu 22.04+) convient parfaitement.
Docker et Docker Compose doivent être installés sur le VPS — c'est le mode de déploiement recommandé par le projet. Si votre VPS est neuf, installez Docker via le script officiel ou le template Docker du Marketplace ServOrbit.
Un nom de domaine pointant vers le VPS est recommandé (atuin.votre-domaine.com, enregistrement A) pour pouvoir générer un certificat TLS automatique. Le certificat est indispensable : le client Atuin refuse de synchroniser en clair par défaut.
Installer le serveur Atuin sur le VPS
Se connecter au VPS et créer un répertoire de travail
Connectez-vous en SSH à votre VPS :
ssh root@<ip-du-vps>Créez un répertoire dédié :
mkdir -p /opt/atuin && cd /opt/atuinRédiger le fichier docker-compose.yml
Créez le fichier de composition :
cat > docker-compose.yml << 'EOF' services: atuin: image: ghcr.io/atuinsh/atuin:v18.23.0 command: server start volumes: - ./config:/config ports: - "8888:8888" environment: ATUIN_HOST: "0.0.0.0" ATUIN_PORT: "8888" ATUIN_OPEN_REGISTRATION: "true" ATUIN_DB_URI: "sqlite:///config/history.db" restart: unless-stopped EOFCette configuration utilise SQLite (embarqué, aucune dépendance externe) et ouvre les inscriptions pour que vous puissiez créer votre compte à la première connexion.
Créer le répertoire de configuration et démarrer le conteneur
Atuin a besoin d'un répertoire de config accessible en écriture :
mkdir -p config && chown 1000:1000 configDémarrez le serveur :
docker compose up -dVérifiez que le conteneur est bien lancé :
docker compose ps # NAME STATUS PORTS # atuin Up 2 minutes 0.0.0.0:8888->8888/tcpOuvrir le port 8888 dans le pare-feu UFW
Le port 8888 doit être accessible depuis vos machines clientes. Sur Ubuntu/Debian avec UFW :
sudo ufw allow 8888/tcp sudo ufw status⚠️ Si vous oubliez cette étape, le client atuin affichera
Connection refusedouFailed to sync historyau moment de la synchronisation — c'est l'erreur la plus fréquente dans les déploiements self-hosted.Mettre un reverse proxy HTTPS devant le serveur
Le client Atuin exige HTTPS par défaut. Placez Caddy devant le serveur :
apt-get install -y caddyCréez
/etc/caddy/Caddyfile:atuin.votre-domaine.com { reverse_proxy localhost:8888 }Redémarrez Caddy (il obtient le certificat Let's Encrypt automatiquement) :
systemctl restart caddyVérifiez que le serveur répond :
curl https://atuin.votre-domaine.com # {"msg":"Atuin server v18.23.0"}Fermer les inscriptions une fois votre compte créé
Une fois vos comptes créés (voir étape suivante), désactivez les inscriptions publiques pour éviter tout compte indésirable. Éditez
docker-compose.yml:ATUIN_OPEN_REGISTRATION: "false"Redémarrez le conteneur :
docker compose up -dAlternativement, créez un fichier
/opt/atuin/config/server.tomlpour une configuration plus fine :[server] host = "0.0.0.0" port = 8888 open_registration = false [server.db] db_uri = "sqlite:///config/history.db"
Installer et configurer le client Atuin
Sur chacune de vos machines (laptop, serveur de dev, etc.), installez Atuin avec le script officiel :
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | shLe script installe le binaire dans ~/.atuin/bin et détecte votre shell.
Intégration au shell — ajoutez la ligne correspondante à votre fichier de configuration :
# Pour zsh (~/.zshrc)
eval "$(atuin init zsh)"
# Pour bash (~/.bashrc)
eval "$(atuin init bash)"
# Pour fish (~/.config/fish/config.fish)
atuin init fish | sourceRechargez votre shell : source ~/.zshrc (ou équivalent).
Enregistrer un compte sur votre serveur :
atuin register \
--server https://atuin.votre-domaine.com \
-u votre-username \
-e [email protected] \
-p votre-mot-de-passeAtuin génère une clé de chiffrement locale — elle s'affiche à l'écran. Notez-la immédiatement : elle est indispensable pour connecter d'autres machines et ne peut pas être régénérée.
Première synchronisation :
atuin sync
# Syncing history...
# History synced!Se connecter depuis une deuxième machine :
atuin login \
--server https://atuin.votre-domaine.com \
-u votre-username \
-p votre-mot-de-passe \
-k "<votre-clé-de-chiffrement>"
atuin syncSécurisation : pare-feu, inscriptions et reverse proxy
Trois réglages à vérifier après le premier déploiement :
1. open_registration: false dès que vos comptes sont créés. Laissé à true, n'importe qui connaissant l'URL peut créer un compte et utiliser votre stockage.
2. Ne jamais exposer le port 8888 directement — le trafic doit toujours transiter par le reverse proxy HTTPS. Restreignez UFW :
# Bloquer l'accès direct au port 8888 depuis l'extérieur
sudo ufw delete allow 8888/tcp
# Autoriser uniquement le reverse proxy local à le joindre (Caddy tourne en local)3. Sauvegardez la base SQLite régulièrement :
docker compose exec atuin sh -c "sqlite3 /config/history.db ".backup /config/history.backup.db""La base grossit lentement — quelques dizaines de Mo même après plusieurs années d'usage intensif.
Dépannage — erreurs courantes
Quelques erreurs rencontrées lors d'un déploiement self-hosted et leur résolution.
Connection refused au premier atuin sync
Le port 8888 n'est pas ouvert dans UFW, ou le conteneur n'est pas démarré. Vérifiez avec :
sudo ufw status | grep 8888
docker compose psSSL certificate problem: unable to get local issuer certificate
Le certificat TLS n'a pas encore été émis par Caddy. Attendez 30 à 60 secondes après le redémarrage de Caddy et relancez atuin sync. Vérifiez que le DNS de atuin.votre-domaine.com pointe bien vers l'IP du VPS.
Invalid credentials à atuin login
La clé de chiffrement est incorrecte ou tronquée. Récupérez-la depuis la machine d'origine :
atuin keyCollez la valeur complète (longue chaîne base64) après -k.
open_registration is disabled
Vous avez fermé les inscriptions avant de créer tous vos comptes. Remettez temporairement ATUIN_OPEN_REGISTRATION: "true" dans docker-compose.yml, redémarrez, créez le compte, puis repassez à false.
L'historique ne se synchronise pas après atuin sync
Vérifiez que le serveur est bien la cible configurée côté client :
cat ~/.config/atuin/config.toml | grep sync_address
# sync_address = "https://atuin.votre-domaine.com"Si la clé est absente, ajoutez-la manuellement dans ~/.config/atuin/config.toml.
Atuin vs les alternatives : quelle solution choisir
Faites défiler le tableau
| Outil | Chiffrement E2E | Sync multi-machines | Self-hosted | Recherche avancée |
|---|---|---|---|---|
| **Atuin** | Oui (AES-256, clé locale) | Oui (serveur optionnel) | Oui (Docker, SQLite) | Oui (contexte, code de sortie, durée) |
| McFly | Non | Non | N/A (local uniquement) | Oui (réseau de neurones, répertoire courant) |
| Histdb | Non | Non | N/A (local uniquement) | Partielle (SQLite local, plugin zsh) |
| zsh_history natif | Non | Non (rsync manuel possible) | N/A | Minimale (grep, fzf en option) |
Atuin, un outil qui grandit avec vous
Atuin v18.23.0 est la solution la plus complète pour un développeur qui travaille sur plusieurs machines et tient à la confidentialité de ses données. La configuration initiale prend moins de 30 minutes sur un VPS Start, et le résultat est un historique exhaustif, chiffré, consultable instantanément depuis n'importe quel terminal.
Une fois le serveur en place, vous pouvez aller plus loin : configurer la synchronisation automatique (atuin daemon), utiliser les statistiques hebdomadaires (atuin stats), ou explorer l'interface de recherche avancée avec filtrage par code de sortie ou par hostname. La commande que vous cherchez est toujours là — peu importe la machine sur laquelle vous l'avez tapée.