
Mỗi lần đổi máy, bạn lại mất nửa ngày để cấu hình lại dotfiles: .bashrc, .zshrc, .gitconfig, Neovim config, i3/waybar, scripts tự động. Công việc nhỏ nhặt nhưng tất yếu — và rất dễ sai lệch giữa các máy. chezmoi giải quyết triệt để vấn đề này bằng cách biến dotfiles thành reproducible, versioned, encrypted config trên mọi máy bạn sở hữu. Không chỉ là symlink manager, chezmoi là một dotfiles engine đầy đủ.
chezmoi khác gì so với stow, dotbot, bare git repo?
| Công cụ | Ưu điểm | Nhược điểm |
|---|---|---|
| chezmoi | Encrypt secrets, per-machine overrides, apply/push/pull commands, diff trước khi apply, templating engine | Hơi nhiều concept ban đầu |
| GNU Stow | Đơn giản, symlink-based, không cần config file, zero dependency | Không encrypt, khó per-machine override, không có templating |
| dotbot | YAML config, idempotent, có plugin system | Không encrypt, ít tooling nâng cao, không có templating built-in |
| Bare git repo | Full control, hooks, native git workflow | Tự build encryption, diff, apply logic, không có helper command |
chezmoi thắng vì security-by-default: nó dùng age hoặc gpg để encrypt file nhạy cảm (SSH private key, AWS credentials, npm token, API key) trước khi commit lên git. Ai có repo cũng không thấy plaintext secrets. Ngoài ra, chezmoi có templating engine (Go template) cho phép dynamic config dựa trên OS, hostname, environment variable — ví dụ: đường dẫn khác nhau trên macOS vs Linux, git user.email khác nhau cho work vs personal.

Cài đặt và khởi tạo nhanh
Trên macOS, Linux, Windows — cài qua package manager:
brew install chezmoi # macOS
apt install chezmoi # Debian/Ubuntu
pacman -S chezmoi # Arch
choco install chezmoi # Windows
scoop install chezmoi # Windows (scoop)
Khởi tạo repo dotfiles mới:
chezmoi init
Hoặc clone repo có sẵn và apply ngay:
chezmoi init --apply [email protected]:yourname/dotfiles.git
Lệnh này tạo thư mục source ~/.local/share/chezmoi với mapping name-based:
dot_config/nvim/init.lua→~/.config/nvim/init.luadot_ssh/config→~/.ssh/configdot_zshrc→~/.zshrcprivate_dot_aws/credentials→~/.aws/credentials(file private, không world-readable)executable_dot_local/bin/script.sh→~/.local/bin/script.sh(chmod +x tự động)
Encrypt secrets với chezmoi
Tạo file chứa plaintext secret, rồi encrypt:
chezmoi add --encrypt ~/.ssh/id_ed25519
chezmoi add --encrypt ~/.aws/credentials
chezmoi add --encrypt ~/.config/nvim/lua/secrets.lua
chezmoi add --encrypt ~/.npmrc
File được lưu dưới dạng .age hoặc .gpg trong repo source. Khi chezmoi apply chạy, nó tự decrypt về đúng path với đúng permission. Không cần script custom, không có plaintext secret trong git history. Mặc định dùng age (hiện đại, nhỏ gọn) — chỉ cần cài age và tạo key pair một lần: age-keygen -o ~/.config/chezmoi/age.key.
Per-machine overrides với templating
Mỗi máy có thể có config riêng (hostname, OS, địa chỉ văn phòng khác nhau) bằng source tree và Go template:
dot_zshrc.tmpl— template chung, dùng{{ .os }},{{ .hostname }}để điều chỉnh.machine_laptop/— file override riêng cho laptop (ưu tiên cao hơn common).machine_server/— override cho VPS/server.
Ví dụ template dot_zshrc.tmpl:
{{- if eq .os "darwin" -}}
export PATH="/opt/homebrew/bin:$PATH"
{{- else -}}
export PATH="/usr/local/bin:$PATH"
{{- end -}}
{{- if eq .hostname "work-laptop" -}}
export GIT_AUTHOR_EMAIL="[email protected]"
{{- else -}}
export GIT_AUTHOR_EMAIL="[email protected]"
{{- end -}}
chezmoi merge file-level: common/ base, machine_*/ override. Dùng chezmoi diff để xem trước kết quả merge trước khi apply. Dữ liệu template có sẵn: .os, .arch, .hostname, .username, .homeDir, .chezmoi.*, và custom data từ ~/.config/chezmoi/chezmoi.toml.

Workflow đời thực hàng ngày
- Sửa config local:
nvim ~/.config/nvim/init.lua - Add và push:
chezmoi add ~/.config/nvim/init.lua && chezmoi cd && git add . && git commit -m "nvim: update lsp config" && git push - Máy khác sync:
cd ~/.local/share/chezmoi && git pull && chezmoi apply - Diff trước khi apply:
chezmoi diff - Xem source path:
chezmoi source-path ~/.config/nvim/init.lua
Bonus commands hữu ích:
chezmoi state— xem trạng thái file (modified, added, removed, encrypted).chezmoi status— tóm tắt nhanh.chezmoi edit— mở file source trong editor (tự decrypt nếu encrypted).chezmoi forget— bỏ track file nhưng giữ file trên disk.chezmoi managed— list tất cả file được manage.chezmoi unmanaged— list file trong home directory KHÔNG được manage (để cleanup).
Quản lý scripts và binaries
chezmoi không chỉ quản lý config file — nó quản lý cả scripts và binaries:
# Tạo executable script
chezmoi add --executable ~/.local/bin/backup.sh
# Tạo script với template (ví dụ: backup path khác nhau tùy máy)
chezmoi add --executable --template ~/.local/bin/sync-dotfiles.sh.tmpl
Scripts trong ~/.local/share/chezmoi/executable_* sẽ được copy với chmod +x tự động khi apply. Rất tiện cho các script setup mới máy, backup, sync, deploy.
So sánh với ansible/chef cho workstation
Ansible quản lý máy chủ (server provisioning, package install, service config), dotfiles quản lý user-level config. chezmoi không phải config management — nó là versioned dotfiles tool. Kết hợp: dùng ansible setup OS + packages, dùng chezmoi quản lý dotfiles. Nếu bạn chỉ có 1-2 máy cá nhân, chezmoi đủ — không cần overhead của Ansible.
Nếu bạn dùng NixOS hoặc Nix home-manager, chezmoi vẫn có giá trị: quản lý encrypted secrets tốt hơn (Nix không có native secret management, cần sops/age integration phức tạp), work cross-platform không cần Nix runtime. chezmoi tương thích với Nix bằng cách cho phép chezmoi apply sinh file mà home-manager quản lý thư mục cha.
Khuyến nghị bắt đầu ngay hôm nay
Bắt đầu từ hôm nay: chezmoi init, add .zshrc, .gitconfig, encrypt SSH key, push lên private repo. Mỗi lần sửa config, chezmoi add và commit. Sau 1 tháng bạn sẽ không còn mất thời gian cấu hình lại từ đầu — chỉ cần git clone + chezmoi apply.
chezmoi là tool boring but reliable — không có hype, chỉ làm đúng 1 việc và làm tốt: đồng bộ dotfiles an toàn, mã nguồn mở, hoạt động trên mọi nền tảng. Đọc thêm tại chezmoi.dev và GitHub repo.
