Dotfileschezmoi: Quản lý cấu hình dotfiles đa máy tự động

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.

Workflow diagram chezmoi: từ local machine encrypt đến git repo rồi apply ra dotfiles

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.lua
  • dot_ssh/config~/.ssh/config
  • dot_zshrc~/.zshrc
  • private_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 treeGo 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.

Cấu trúc thư mục chezmoi: common, machine_laptop, machine_server, file .age encrypted

Workflow đời thực hàng ngày

  1. Sửa config local: nvim ~/.config/nvim/init.lua
  2. Add và push: chezmoi add ~/.config/nvim/init.lua && chezmoi cd && git add . && git commit -m "nvim: update lsp config" && git push
  3. Máy khác sync: cd ~/.local/share/chezmoi && git pull && chezmoi apply
  4. Diff trước khi apply: chezmoi diff
  5. 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.devGitHub repo.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

YubiKey cơ bản: Thiết lập khóa bảo mật phần cứng cho tài khoản

YubiKey là gì? YubiKey là khóa bảo mật phần cứng (hardware security key) được sản xuất bởi Yubico, dùng để xác thực hai yếu tố (2FA) và xác thực đa…

Xem thêm

Linux CLI hiện đại: fzf, ripgrep, jq, bat, eza

Linux CLI hiện đại thay đổi cách bạn làm việc Linux CLI đang phát triển mạnh mẽ với hàng loạt công cụ mới thay thế trực tiếp những tiện ích…

Xem thêm

Chống lừa đảo mạo danh cảnh sát: dấu hiệu nhận biết và phòng tránh

Tội phạm mạo danh cảnh sát đang gia tăng nhanh tại Việt Nam, đặc biệt qua điện thoại và mạng xã hội. Hiểu dấu hiệu nhận biết và biện pháp…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất