自架服務 Atuin Shell Linux 開發工具 SQLite

shell history 該有的樣子:Atuin 把每條指令連同 cwd、退出碼、耗時全收進 SQLite

bash 預設的 .bash_history 是個壞了三十年的功能——只記指令、會被覆蓋、跨機器無法同步。Atuin 用 SQLite 接管本地搜尋,再以端對端加密同步到自架伺服器,本文拆解儲存格式、加密模型與自架部署。

~/.bash_history~/.zsh_history 是 Unix 工具鏈裡少數三十年沒進步過的東西。同時開兩個終端,後關的那個會覆蓋掉先關的歷史;不記時間、不記工作目錄、不記退出碼;搜尋只能靠 Ctrl+R 一條條往回翻,跨機器同步基本上是天方夜譚。多數人選擇加上 HISTSIZE=100000shopt -s histappend 然後假裝問題解決了。

Atuin 從這個前提重寫了整個流程。本地用 SQLite 儲存,每筆紀錄帶上 cwd、執行時間、耗時、退出碼、session ID 和主機名;搜尋是 fuzzy match 加上多欄位過濾;同步是選擇性開啟的端對端加密,伺服器可以自架。整個工具用 Rust 寫,單一 binary,跨 bash、zsh、fish、nushell、xonsh、PowerShell。

預設 shell history 到底缺什麼

舉個情境:上週在某台伺服器上跑了一條長到不像話的 ffmpeg 指令解 codec 問題,這週另一台機器又碰到,但記不得參數。打開 .bash_history,看到的只是一行純文字,沒有時間、沒有目錄、沒有結果。如果中間還曾把 shell 卡死強制重開,這行甚至可能根本沒寫進檔案。

Atuin 改成事件式記錄,每條指令在開始執行時就先寫進 SQLite,執行完成後再回頭補上耗時和退出碼。資料結構大致是:

1
2
id, timestamp, duration, exit, command,
cwd, hostname, session, deleted_at

這意味著可以下這種查詢:「上個月在 prod1 主機的 /etc/nginx/ 底下執行過、退出碼非 0 的指令」。Atuin CLI 直接提供 atuin search --cwd /etc/nginx --exit 1 --before "1 month ago" 這種組合條件。

對團隊更實際的價值在於失敗指令的可追溯性。退出碼存下來之後,事後追查「那次部署到底哪一步噴錯」不必再翻 tmux 的卷軸緩衝區。

E2E 加密同步:伺服器看不到明文

Atuin 的同步協定值得單獨講。每個帳號註冊時會在客戶端生成一組對稱金鑰,這把金鑰用密碼派生的另一把金鑰加密後,存在本地的 ~/.local/share/atuin/key。所有要上傳的歷史紀錄都先以這把金鑰做 XChaCha20-Poly1305 加密,伺服器拿到的只是密文跟一個用來去重的 hash。

換句話說,自架伺服器看到的歷史紀錄全是亂碼,連伺服器管理員(也就是使用者本人)都無法從資料庫倒推內容——除非同一把金鑰還在某台機器上。這對含有密碼、token、API key 的指令歷史是必要的設計,畢竟很多人會把 secret 直接打在 command line 上。

副作用是換機器時需要做 atuin key 把現有金鑰印出來,到新機器跑 atuin login 時貼進去。忘記備份金鑰等於整份雲端歷史變垃圾資料,這點在第一次設定時就要警覺。

自架 sync 伺服器:PostgreSQL 加一支 binary

官方雲端服務免費,但要有完整控制權還是建議自架。Atuin server 需要 PostgreSQL 14 以上,本身就是一支 Rust binary 加一個薄薄的 HTTP API。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
services:
atuin:
image: ghcr.io/atuinsh/atuin:latest
restart: unless-stopped
command: server start
ports:
- "127.0.0.1:8888:8888"
environment:
ATUIN_HOST: "0.0.0.0"
ATUIN_PORT: 8888
ATUIN_OPEN_REGISTRATION: "false"
ATUIN_DB_URI: postgres://atuin:${DB_PASSWORD}@db/atuin
depends_on:
db:
condition: service_healthy

db:
image: postgres:16.3-alpine
restart: unless-stopped
environment:
POSTGRES_USER: atuin
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: atuin
volumes:
- ./pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "atuin"]
interval: 10s
retries: 5

兩個細節容易踩到。第一,ATUIN_OPEN_REGISTRATION 預設是 true,意思是任何人知道網址就能註冊帳號開始用你的 PostgreSQL。除非有意對外開放,否則第一件事就是改成 false,註冊完自己的帳號再關掉。

第二,伺服器不終結 TLS,前面一定要放反向代理。Caddy 或 Nginx 都行,把 8888 綁在 loopback、上層接 HTTPS 才是安全配置。直接把 8888 暴露在公網是常見錯誤。

客戶端設定走 ~/.config/atuin/config.toml

1
2
3
sync_address = "https://atuin.example.com"
sync_frequency = "5m"
auto_sync = true

註冊跟登入:

1
2
3
atuin register -u user -e me@example.com
atuin import auto # 從現有 shell history 一次性匯入
atuin sync

v18.13 加進來的搜尋功能

2026 年的 v18.13 是把搜尋體驗推上另一個層級的版本。最值得提的兩點:

自訂鍵位:TUI 模式的鍵位過去是寫死的,這次終於允許在 config 裡完全自訂。對習慣 Vim 風格綁定的使用者來說是大解放。

Smart sort 改善:搜尋結果的排序權重重新調校,加上「在同樣的 cwd 用過幾次」的因素。也就是說在 /var/log 底下搜 grep 時,跟在 ~/project 底下搜 grep 會看到完全不同的順序,命中率比之前高出一截。

更值得期待的是 PTY proxy 功能進入 beta。Atuin 開始能直接記錄整個 PTY session 的輸出,而不只是指令本身,未來會成為 Atuin Desktop 的可執行 runbook 基礎建設。

Atuin Desktop 與 runbook:方向轉變的訊號

2026 年 Atuin 把 Desktop 應用程式開源化,並推出重新設計的 runbook 執行引擎。Runbook 在這裡指的是一份可執行的文件——把指令、變數、輸出全部嵌進 Markdown,可以一格一格執行,狀態跨重啟保留。

這條產品線目前比較適合運維場景:用來把「機器壞掉時要跑的處置流程」寫成可重複執行的文件。Workspace 可以選擇雲端同步或純本地由 Git 管理,後者對需要納入版本控制的 SRE 團隊比較合適。

對只想要好用 shell history 的使用者來說,Desktop 是錦上添花,不必非裝不可。CLI 本身已經足夠完整。

適合自架的場景與不適合的情況

自架 Atuin 的甜蜜點是個人或小團隊在管理數台到數十台 VPS。每天在多台機器之間切換,歷史紀錄分散是真實痛點,自架可以把這份資料完全留在自己掌控的伺服器上。

不太適合的情況有兩種。一是純粹只用一台機器,那 SQLite 本地版就夠了,連帳號都不必註冊。二是組織有嚴格的合規限制要求每條指令必須有稽核軌跡——Atuin 不是為了稽核設計的,使用者隨時可以刪除自己的歷史紀錄,這是個人工具的定位,不是 SIEM。

備份策略上,PostgreSQL 那邊用 pg_dump 加異地儲存即可。但更關鍵的是金鑰備份:每個用戶端的 ~/.local/share/atuin/key 應該離線存一份,密碼管理器或實體紙本都行。伺服器資料庫掛了可以從 dump 還原,金鑰沒了就真的沒了。


shell history 看起來小,每天用 shell 工作的人卻會被它的爛設計拖累一輩子。把 Atuin 跟自架同步服務搭起來,等於把過去散落在各台機器、各個檔案的指令歷史,整合成一份可搜尋、可分析、加密留存的個人知識庫。

NCSE Network 的 VPS 採 Intel Gold CPU 與 NVMe SSD,位於臺灣是方電訊機房,跑 Atuin server 加 PostgreSQL 的資源需求極低,最小規格方案就綽綽有餘,延遲低、頻寬穩,適合作為個人開發工具鏈的長期落腳處。詳情可到 ncse.tw 查看方案。

需要穩定的雲端主機?

NCSE Network 提供企業級 VPS,7 天免費試用,臺灣是方電訊機房,99% SLA 保證。

查看 VPS 方案 →