Por qué sincronizar el historial de la terminal
Trabajar en varias máquinas debería ser transparente. En la práctica, el comando kubectl rollout undo deployment/api escrito en el portátil nunca está en el terminal del servidor de CI, y el docker compose exec de hace tres semanas ha desaparecido porque la rotación del historial sobrescribió las entradas antiguas.
Atuin resuelve ambos problemas desde la raíz: almacena cada comando en SQLite con su contexto (hora, duración, código de salida, directorio actual) y sincroniza esa base de datos entre tus máquinas a través de un servidor que tú controlas. La búsqueda se ejecuta localmente — sin latencia de red al recuperar un comando — y la sincronización ocurre en segundo plano. La interfaz de búsqueda (Ctrl+R) se convierte en un índice exhaustivo de todo lo que has escrito, en cualquier máquina, desde el primer día.
Beneficios concretos de Atuin autoalojado
- Encuentra cualquier comando escrito en cualquier máquina en menos de un segundo mediante
Ctrl+R. - Cifrado del lado del cliente (AES-256): el servidor nunca ve el contenido de tu historial.
- Contexto detallado por entrada: código de salida, duración de ejecución, directorio actual, nombre del host.
- Ningún dato enviado a terceros — tú alojas, tú controlas.
- Binario Rust sin dependencias pesadas: funciona en el VPS Start desde 99 DH/mes.
- Soporte para zsh, bash, fish, nushell y PowerShell — un solo servidor para toda tu flota.
- Estadísticas de uso integradas (
atuin stats): tus comandos más frecuentes, tus picos de actividad.
Requisitos previos
VPS: el servidor Atuin es un binario Rust compilado con una base de datos SQLite integrada. Consume menos de 50 MB de RAM en reposo, lo que lo hace compatible con el VPS Start. Reserva 512 MB de RAM disponible para el conjunto completo (sistema operativo + proceso Atuin) y 5 GB de almacenamiento SSD para el historial a largo plazo. Un kernel Linux reciente (Debian 12 o Ubuntu 22.04+) funciona perfectamente.
Docker y Docker Compose deben estar instalados en el VPS — es el método de despliegue recomendado por el proyecto. Si tu VPS es nuevo, instala Docker mediante el script oficial o la plantilla Docker del Marketplace de ServOrbit.
Un nombre de dominio apuntando al VPS es recomendable (atuin.your-domain.com, registro A) para generar un certificado TLS automático. El certificado es imprescindible: el cliente Atuin rechaza sincronizar en texto claro por defecto.
Instalar el servidor Atuin en el VPS
Conectarse al VPS y crear un directorio de trabajo
Conéctate por SSH a tu VPS:
ssh root@<ip-del-vps>Crea un directorio dedicado:
mkdir -p /opt/atuin && cd /opt/atuinEscribir el archivo docker-compose.yml
Crea el archivo de composición:
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 EOFEsta configuración usa SQLite (integrado, sin dependencias externas) y abre el registro para que puedas crear tu cuenta en la primera conexión.
Crear el directorio de configuración e iniciar el contenedor
Atuin necesita un directorio de configuración con permisos de escritura:
mkdir -p config && chown 1000:1000 configInicia el servidor:
docker compose up -dVerifica que el contenedor está en funcionamiento:
docker compose ps # NAME STATUS PORTS # atuin Up 2 minutes 0.0.0.0:8888->8888/tcpAbrir el puerto 8888 en el firewall UFW
El puerto 8888 debe ser accesible desde tus máquinas cliente. En Ubuntu/Debian con UFW:
sudo ufw allow 8888/tcp sudo ufw status⚠️ Si omites este paso, el cliente atuin mostrará
Connection refusedoFailed to sync historyal sincronizar — el error más frecuente en los despliegues autoalojados.Colocar un proxy inverso HTTPS delante del servidor
El cliente Atuin requiere HTTPS por defecto. Coloca Caddy delante:
apt-get install -y caddyCrea
/etc/caddy/Caddyfile:atuin.your-domain.com { reverse_proxy localhost:8888 }Reinicia Caddy (obtiene el certificado Let's Encrypt automáticamente):
systemctl restart caddyVerifica que el servidor responde:
curl https://atuin.your-domain.com # {"msg":"Atuin server v18.23.0"}Cerrar el registro una vez creada tu cuenta
Una vez creadas tus cuentas (ver el paso siguiente), desactiva el registro público para evitar cuentas no deseadas. Edita
docker-compose.yml:ATUIN_OPEN_REGISTRATION: "false"Reinicia el contenedor:
docker compose up -dOpcionalmente, crea
/opt/atuin/config/server.tomlpara un control más fino:[server] host = "0.0.0.0" port = 8888 open_registration = false [server.db] db_uri = "sqlite:///config/history.db"
Instalar y configurar el cliente Atuin
En cada una de tus máquinas (portátil, servidor de desarrollo, etc.), instala Atuin usando el script oficial:
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | shEl script instala el binario en ~/.atuin/bin y detecta tu shell.
Integración en el shell — añade la línea correspondiente a tu archivo de configuración:
# Para zsh (~/.zshrc)
eval "$(atuin init zsh)"
# Para bash (~/.bashrc)
eval "$(atuin init bash)"
# Para fish (~/.config/fish/config.fish)
atuin init fish | sourceRecarga tu shell: source ~/.zshrc (o equivalente).
Registrar una cuenta en tu servidor:
atuin register \
--server https://atuin.your-domain.com \
-u tu-usuario \
-e [email protected] \
-p tu-contraseñaAtuin genera una clave de cifrado local — aparece en pantalla. Anótala inmediatamente: la necesitarás para conectar otras máquinas y no puede regenerarse.
Primera sincronización:
atuin sync
# Syncing history...
# History synced!Iniciar sesión desde una segunda máquina:
atuin login \
--server https://atuin.your-domain.com \
-u tu-usuario \
-p tu-contraseña \
-k "<tu-clave-de-cifrado>"
atuin syncSeguridad: firewall, registro y proxy inverso
Tres configuraciones a verificar tras el despliegue inicial:
1. open_registration: false en cuanto crees tus cuentas. Si lo dejas en true, cualquiera que conozca la URL puede crear una cuenta y usar tu almacenamiento.
2. Nunca expongas el puerto 8888 directamente — el tráfico siempre debe pasar por el proxy inverso HTTPS. Restringe UFW:
# Bloquear el acceso externo directo al puerto 8888
sudo ufw delete allow 8888/tcp
# El proxy inverso local (Caddy) se conecta internamente3. Haz copias de seguridad de la base de datos SQLite regularmente:
docker compose exec atuin sh -c "sqlite3 /config/history.db \".backup /config/history.backup.db\""La base de datos crece lentamente — pocas decenas de MB incluso después de años de uso intensivo.
Resolución de problemas — errores comunes
Algunos errores frecuentes en un despliegue autoalojado y cómo resolverlos.
Connection refused en el primer atuin sync
El puerto 8888 no está abierto en UFW, o el contenedor no está en marcha. Comprueba con:
sudo ufw status | grep 8888
docker compose psSSL certificate problem: unable to get local issuer certificate
Caddy aún no ha emitido el certificado TLS. Espera 30–60 segundos tras reiniciar Caddy y vuelve a ejecutar atuin sync. Asegúrate de que el DNS de atuin.your-domain.com apunta a la IP del VPS.
Invalid credentials en atuin login
La clave de cifrado es incorrecta o está truncada. Recupérala desde la máquina original:
atuin keyPega el valor completo (larga cadena en base64) después de -k.
open_registration is disabled
Cerraste el registro antes de crear todas tus cuentas. Establece temporalmente ATUIN_OPEN_REGISTRATION: "true" en docker-compose.yml, reinicia, crea la cuenta y vuelve a false.
El historial no se sincroniza tras atuin sync
Verifica que el servidor sea el destino configurado en el cliente:
cat ~/.config/atuin/config.toml | grep sync_address
# sync_address = "https://atuin.your-domain.com"Si falta la clave, añádela manualmente en ~/.config/atuin/config.toml.
Atuin frente a las alternativas: qué herramienta elegir
Desplace la tabla
| Herramienta | Cifrado E2E | Sincronización multimáquina | Autoalojamiento | Búsqueda avanzada |
|---|---|---|---|---|
| **Atuin** | Sí (AES-256, clave local) | Sí (servidor opcional) | Sí (Docker, SQLite) | Sí (contexto, código de salida, duración) |
| McFly | No | No | N/A (solo local) | Sí (red neuronal, directorio actual) |
| Histdb | No | No | N/A (solo local) | Parcial (SQLite local, plugin zsh) |
| zsh_history nativo | No | No (rsync manual posible) | N/A | Mínima (grep, fzf opcional) |
Atuin, una herramienta que crece contigo
Atuin v18.23.0 es la solución más completa para un desarrollador que trabaja en varias máquinas y se preocupa por la privacidad de sus datos. La configuración inicial lleva menos de 30 minutos en un VPS Start, y el resultado es un historial exhaustivo, cifrado y consultable al instante desde cualquier terminal.
Una vez el servidor en marcha, puedes ir más lejos: configurar la sincronización automática (atuin daemon), usar las estadísticas semanales (atuin stats), o explorar la interfaz de búsqueda avanzada con filtrado por código de salida o nombre de host. El comando que buscas siempre está ahí — independientemente de en qué máquina lo hayas escrito.