- Codex CLI lưu config và session local, không sync sẵn, nhưng dễ làm thủ công với git + rclone.
- Chia config thành phần shared (instruction, MCP) và phần local (token, log) để tránh leak credential.
- Sync session lịch sử giúp resume task khi đổi máy giữa chừng, không phải kể lại context cho Codex.
- Một dev solo có thể tận dụng 3 thiết bị: laptop di động, Mac chính tại nhà, VPS chạy headless qua đêm.
- Mô hình hub-and-spoke với VPS làm trung tâm sync giúp đồng bộ realtime mà không xung đột.
Bạn từng nửa đêm code dở task quan trọng trên Mac ở nhà, sáng ra văn phòng mở laptop mà phải copy paste prompt cũ vào Codex CLI để Codex "nhớ" lại context? Vấn đề này dev nào dùng nhiều thiết bị cũng gặp. May là OpenAI Codex CLI lưu session local theo file đơn giản, nên có thể sync giữa máy mà không cần đợi feature chính thức.
Bài này hướng dẫn dựng workflow đồng bộ 3 thiết bị: laptop di động, Mac chính, và VPS headless. Mục tiêu là khi bạn chuyển máy, Codex CLI biết ngay bạn đang làm gì, prompt nào đã chạy, config nào đang active.
Cách tiếp cận này dùng git cho phần config văn bản và rclone cho phần dữ liệu lớn. Không phụ thuộc service bên ngoài (như Dropbox), tự host được hoàn toàn trên VPS riêng.
Phân biệt phần config nên sync và phần phải local
Sai lầm đầu tiên khi sync Codex CLI là cứ sync nguyên thư mục $HOME/.codex/. Trong đó có file token authentication, cache nhạy cảm, và log có thể chứa secret từ codebase. Sync nguyên cụm sẽ leak credential nếu repo git bị public hoặc rclone backup lên cloud không mã hóa.
| Loại file | Sync hay không | Lý do |
|---|---|---|
| config.toml / settings.json | Có (selective) | Cài đặt model, preference, không chứa secret |
| AGENTS.md / instruction file | Có | Văn bản, đặc thù dự án, share giữa máy |
| MCP server config | Có (URL công khai) | Nhưng phải dùng env var cho key |
| auth.json / token | Không | Mỗi máy login riêng để revoke độc lập |
| logs/ | Không | Chứa nội dung code, prompt nhạy cảm |
| history/ session | Tùy chọn | Sync nếu cùng dev, mã hóa khi chuyển qua cloud |
| cache/ | Không | Tốn dung lượng, mỗi máy tự rebuild |
Quy tắc đơn giản: phần nào trả lời được câu "đây có phải config tĩnh không?" thì sync. Phần nào có dấu vết của lần chạy (log, cache, token) thì để local.
Kiến trúc tổng thể: hub-and-spoke
Mô hình hiệu quả nhất cho 3 thiết bị là hub-and-spoke: VPS làm hub trung tâm, laptop và Mac là 2 spoke. Mọi thay đổi config từ spoke đẩy lên hub trước, sau đó spoke khác pull về. Cách này tránh conflict 2 máy cùng push thẳng vào nhau.
- VPS chạy git server bare repo (hoặc dùng tự host Gitea, hay private repo trên Github).
- VPS chạy rclone HTTP backend hoặc WebDAV cho phần binary lớn.
- Laptop + Mac: clone repo về, làm việc, commit, push lên hub.
- Khi đổi máy: pull về máy mới, restart Codex CLI là load config mới.
Lợi ích: VPS luôn online nên có thể act như hub 24/7. Khi máy local đóng nắp, các thay đổi vẫn cách 1 commit là sync được. Đặc biệt khi đi du lịch chỉ mang laptop nhẹ, bạn vẫn có toàn bộ workflow Mac ở nhà.
Bước 1: dựng git repo cho config
Đầu tiên tạo repo riêng cho Codex config trên VPS hoặc private git host. Cấu trúc đề xuất như sau:
codex-config/
├── shared/
│ ├── config.toml
│ ├── AGENTS.md
│ ├── mcp-servers.json
│ └── snippets/
│ ├── refactor-prompts.md
│ └── debug-templates.md
├── per-machine/
│ ├── laptop.env.example
│ ├── mac.env.example
│ └── vps.env.example
└── README.md
Phần shared chứa file dùng chung. Phần per-machine giữ template env nhưng KHÔNG commit file env thật chứa secret. Mỗi máy clone về, copy laptop.env.example thành laptop.env, điền secret, rồi gitignore file thật đó.
Bước 2: script symlink config về vị trí Codex CLI dùng
Codex CLI đọc config từ $HOME/.codex/ hoặc $XDG_CONFIG_HOME/codex/ (tùy phiên bản). Thay vì copy file mỗi lần update, dùng symlink để Codex luôn đọc từ repo git của bạn.
#!/usr/bin/env bash
# install-codex-config.sh
set -e
REPO_DIR="$HOME/codex-config"
CODEX_DIR="$HOME/.codex"
mkdir -p "$CODEX_DIR"
# Backup file gốc nếu chưa backup
if [ -f "$CODEX_DIR/config.toml" ] && [ ! -L "$CODEX_DIR/config.toml" ]; then
mv "$CODEX_DIR/config.toml" "$CODEX_DIR/config.toml.bak.$(date +%s)"
fi
# Symlink các file shared
ln -sfn "$REPO_DIR/shared/config.toml" "$CODEX_DIR/config.toml"
ln -sfn "$REPO_DIR/shared/AGENTS.md" "$CODEX_DIR/AGENTS.md"
ln -sfn "$REPO_DIR/shared/mcp-servers.json" "$CODEX_DIR/mcp-servers.json"
# Đảm bảo auth.json là file local (không symlink)
if [ -L "$CODEX_DIR/auth.json" ]; then
rm "$CODEX_DIR/auth.json"
echo "WARN: auth.json đang là symlink, đã gỡ. Login lại bằng: codex login"
fi
echo "Cài config thành công"
ls -la "$CODEX_DIR/"
Chạy script trên mỗi máy sau khi clone repo. Từ đó mỗi lần bạn pull update từ git, Codex CLI tự động dùng config mới mà không cần restart hay copy thủ công.
Bước 3: rclone cho phần dữ liệu lớn
Phần config trên đủ cho text. Nhưng nếu bạn muốn sync session history (có thể tới vài trăm MB sau vài tháng), git không hợp. Dùng rclone với backend của bạn (Minio tự host trên VPS, hoặc S3, hoặc WebDAV).
# Setup rclone với VPS làm WebDAV server (caddy + webdav module)
# Trên laptop hoặc Mac:
rclone config
# Tạo remote tên "codex-vps" trỏ về https://your-domain.com/webdav/codex/
# user/pass do bạn cấu hình ở VPS
# Sync history từ laptop lên VPS
rclone sync $HOME/.codex/history/ codex-vps:codex-history/
--exclude "*.tmp" --exclude "cache/**"
# Pull history về máy khác
rclone sync codex-vps:codex-history/ $HOME/.codex/history/
--exclude "*.tmp"
Lưu ý quan trọng: rclone có flag crypt để mã hóa client-side. Nếu sync qua S3 hoặc cloud bên ngoài, BẮT BUỘC bật crypt vì history có thể chứa code production hoặc prompt nhạy cảm. Trên VPS riêng tự kiểm soát thì có thể bỏ qua crypt cho đơn giản.
Bước 4: hook sync tự động sau mỗi session
Sync thủ công dễ quên. Tốt nhất là tự động trigger sau khi Codex CLI exit. Cách đơn giản dùng wrapper function trong .bashrc hoặc .zshrc.
# Trong .zshrc hoặc .bashrc
codex_sync() {
command codex "$@"
local exit_code=$?
# Background sync, không chặn shell
(
cd $HOME/codex-config && git add shared/ &&
git commit -m "auto: sync from $(hostname) $(date -u +%FT%TZ)" 2>/dev/null &&
git push origin main 2>/dev/null
rclone sync $HOME/.codex/history/ codex-vps:codex-history/
--exclude "*.tmp" 2>/dev/null
) &
return $exit_code
}
alias codex='codex_sync'
Mỗi lần bạn gõ codex và exit, sync chạy background. Lần sau mở máy khác, làm git pull và rclone sync đảo chiều là sẵn sàng. Nếu muốn auto-pull khi mở terminal, thêm git pull vào .bashrc đầu file (cẩn thận với conflict nếu đang dở thay đổi local).
Bước 5: xử lý conflict khi 2 máy cùng update
Đây là vấn đề điển hình của sync đa thiết bị. Nếu bạn vô tình edit config.toml trên cả Mac và laptop trước khi sync, lúc push sẽ conflict.
Cách đơn giản: dùng strategy "last write wins" cho phần shared. Bật git config merge.ours.driver=true cho file config nếu bạn chấp nhận overwrite. Cách an toàn hơn: tách config thành nhiều file nhỏ theo concern (model.toml, mcp.toml, prompts.toml) để conflict chỉ xảy ra ở phạm vi nhỏ.
- Tránh edit cùng file trên 2 máy trong cùng phiên.
- Pull trước khi edit, push ngay sau khi save.
- Khi conflict, mở bằng diff tool (vimdiff, code --diff) và merge thủ công - đừng auto-merge config.
- Backup VPS hub bằng snapshot 1-click để rollback nếu đẩy nhầm config phá hỏng.
Tận dụng VPS làm always-on session
Bonus của mô hình này: VPS không chỉ là hub sync, mà còn có thể chạy Codex CLI thực sự trong tmux session always-on. Khi đi du lịch chỉ mang laptop nhẹ, bạn SSH vào VPS, attach tmux, là tiếp tục task dở từ tuần trước.
# Trên VPS, tạo persistent session
tmux new -d -s codex-main 'cd $HOME/projects/main && codex'
# Attach từ bất kỳ máy nào
ssh user@your-vps -t "tmux attach -t codex-main"
# Detach mà giữ session: Ctrl+B rồi D
# Session vẫn chạy cho dù bạn đóng laptop hay mất mạng
Workflow này cực kỳ tiện cho freelancer hay tech founder hay chuyển địa điểm. Mac ở nhà tắt cũng được, VPS giữ session. Mở laptop ở quán cà phê, SSH vào, code tiếp như chưa từng rời máy.
Quản lý SSH key giữa nhiều máy
Sync workflow này yêu cầu SSH từ laptop và Mac vào VPS. Có 2 lựa chọn: dùng cùng 1 key trên cả 2 (đơn giản, dễ revoke khi mất máy) hoặc dùng key khác nhau (an toàn hơn, revoke 1 máy không ảnh hưởng máy khác).
Khuyên dùng phương án 2: mỗi máy có key riêng, đặt tên rõ (ed25519_laptop_2026, ed25519_mac_home). Trên VPS gắn cả 2 vào authorized_keys với comment đầy đủ. Khi laptop bị mất, chỉ cần xóa 1 dòng, các máy khác vẫn truy cập bình thường.
Bảo mật: secret nào ở đâu
Quan trọng nhất là không commit secret vào git, ngay cả private repo. Tốt nhất là dùng env var hoặc credential manager (1Password CLI, Bitwarden CLI, hoặc tự host Vaultwarden trên VPS).
| Loại secret | Lưu ở đâu | Truy cập từ Codex |
|---|---|---|
| OpenAI token | $HOME/.codex/auth.json (local) | Tự động |
| MCP server API key | $HOME/.codex/secrets.env | Env var, không commit |
| Database password | 1Password/Vault | Inject lúc start session |
| SSH key | $HOME/.ssh/ (local) | ssh-agent forward |
Có thể nâng cấp lên dùng SOPS để mã hóa secret trong git, decrypt lúc deploy. Nhưng cho dev solo, env var local + 1Password CLI là đủ và đỡ phiền hơn nhiều.
FAQ về sync Codex CLI đa thiết bị
Codex CLI có sync mặc định giữa máy không?
Không. Tại thời điểm viết, Codex CLI lưu config và session local trên từng máy. Khi login bằng cùng tài khoản OpenAI, quota chung nhưng không sync session, history, hay config. Bạn phải tự dựng cơ chế sync nếu muốn workflow liên tục giữa máy.
Có thể dùng cùng auth token trên nhiều máy không?
Về kỹ thuật thì có thể copy file auth.json giữa máy, nhưng KHÔNG nên. Mỗi máy nên login riêng để token có thể revoke độc lập khi mất máy. Quota vẫn chung vì tính theo tài khoản OpenAI, không theo token.
Sync session qua iCloud Drive được không?
Được nhưng có nhiều bất tiện. iCloud Drive đôi khi delay vài phút, file lock conflict khi 2 máy edit cùng lúc, và không hoạt động trên Linux (laptop chạy Ubuntu). Khuyên dùng git + rclone tự kiểm soát hơn, hoạt động đồng nhất trên cả Mac, Linux và VPS.
VPS cấu hình tối thiểu để chạy hub sync là bao nhiêu?
Rất nhẹ. 1 vCPU, 1GB RAM, 20GB SSD là đủ cho git server + rclone WebDAV phục vụ 1 dev với 2-3 máy. Nếu chạy thêm Codex CLI tmux session trên VPS thì nên 2-4 vCPU, 4-8GB RAM để Codex thoải mái dùng. Cloud VPS TND có gói khởi đầu phù hợp cho mục đích này.
Có nguy cơ leak code khi sync session qua VPS không?
Có nếu VPS của bạn không secure. Đảm bảo SSH chỉ cho key auth (không password), bật firewall chỉ mở port cần thiết, dùng HTTPS cho WebDAV/git http. Cẩn thận hơn thì mã hóa client-side bằng rclone crypt trước khi upload. Tốt nhất chạy VPS riêng không share với khách hàng hay client của bạn.
Khi conflict config, làm sao biết version nào đúng?
Git log của repo config sẽ ghi commit từ máy nào (qua hostname trong message và git user.email). Khi conflict, dùng git log --oneline để xem chuỗi commit, git show để xem nội dung từng version. Thường máy bạn dùng cuối cùng có version đúng nhất, nhưng nên xác nhận trước khi pick.
VPS làm hub sync 24/7 cho workflow đa thiết bị
Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. Đủ tài nguyên cho git server, rclone WebDAV, tmux session always-on cho Codex CLI.
Xem 8 cấu hình Cloud VPS →


