Vì sao nên dùng SSH key thay vì HTTPS?
Không phải gõ PAT hay mật khẩu mỗi lần.
Bảo mật hơn vì key được quản lý trên máy chủ, có thể thu hồi nhanh trên GitHub.
Hợp với workflow CI/CD dùng release branch, auto deploy.
Chuẩn bị
Shared hosting có SSH Access bật. Thường bật trong cPanel mục “SSH Access” hoặc “Terminal”. Nếu chưa có, mở ticket cho nhà cung cấp hosting.
Đã cài
git
trên máy chủ. Nhiều shared hosting có sẵn; nếu không thấy, hỏi nhà cung cấp.
1) Kiểm tra SSH key đang có
ls -l ~/.ssh/id_rsa.pub
Nếu không thấy file, chuyển bước 2 để tạo mới.
2) Tạo SSH key mới (RSA 4096)
ssh-keygen -t rsa -b 4096 -C "youremail@example.com"
# Nhấn Enter liên tục để nhận đường dẫn mặc định (~/.ssh/id_rsa). Có thể đặt passphrase nếu muốn.
Mẹo: Shared hosting đôi khi không cho ghi ở nơi lạ. Cứ để mặc định ~/.ssh/
cho chắc.
3) Nạp key vào ssh-agent
Bật agent và thêm private key:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
Nếu gặp lỗi agent, xem phần “Lỗi thường gặp”.
4) Thêm public key vào GitHub
Copy nội dung public key:
cat ~/.ssh/id_rsa.pub
Vào GitHub Settings → SSH and GPG keys → New SSH key → dán nội dung và lưu. Tham khảo trang cài đặt tại GitHub SSH and GPG keys settings (https://github.com/settings/keys).
5) Test kết nối với GitHub qua SSH
ssh -T git@github.com
Thông báo mẫu nếu OK:
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.
6) Clone dự án về thư mục public_html (hoặc thư mục app)
Vào thư mục bạn muốn chứa code. Nếu là deploy trực tiếp:
cd ~/public_html
# Cẩn trọng: lệnh sau xóa sạch thư mục hiện tại (kể cả file ẩn). Chỉ chạy khi bạn thật sự muốn sạch sẽ.
rm -rf .[^.]* * .*
# Clone branch release của repo về thư mục hiện tại (dấu chấm ở cuối)
git clone -b release git@github.com:<user/repo>.git .
# Clone từ nhánh mặc định
git clone git@github.com:<user/repo>.git .
Cập nhật về bản mới nhất:
# Nếu có file .env muốn giữ lại giữa các lần pull
git stash push -m "Save .env" .env
git pull origin release
git stash pop || true
Giải thích nhanh:
-b release
: chỉ định branchrelease
thay vìmain
.Dấu
.
cuối lệnhclone
để đổ code vào thư mục hiện tại, không tạo thư mục con.Dùng
stash
để tạm cất.env
trước khi pull, sau đópop
khôi phục lại.
Checklist triển khai nhanh
[ ] SSH access hoạt động, vào được Terminal của hosting
[ ] Có
~/.ssh/id_rsa
và~/.ssh/id_rsa.pub
[ ] Đã
ssh-add ~/.ssh/id_rsa
[ ] Đã thêm public key vào GitHub → SSH keys
[ ]
ssh -T git@github.com
trả về “successfully authenticated”[ ] Clone/pull đúng branch
release
Lỗi thường gặp và cách xử lý
1) Permission denied (publickey)
Chưa thêm public key vào GitHub hoặc thêm sai tài khoản GitHub.
Chưa nạp key vào agent: chạy lại
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa
.Quyền thư mục
~/.ssh
chưa chuẩn:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
2) Could not open a connection to your authentication agent
Khởi động lại agent rồi add key:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
3) Repo private nhưng vẫn hỏi username/password
URL đang là HTTPS. Đổi remote sang SSH:
git remote set-url origin git@github.com:owner/repo.git
4) Host key verification failed
Lần đầu kết nối, Git cần fingerprint của GitHub. Chạy thử:
ssh -T git@github.com
Nếu bị chặn, thử xóa known_hosts dòng liên quan GitHub rồi kết nối lại:
sed -i.bak '/github.com/d' ~/.ssh/known_hosts
ssh -T git@github.com
5) Không thấy ssh-agent sau khi logout
Nhiều shared hosting reset phiên SSH. Bạn cần
ssh-add
lại sau mỗi phiên hoặc cấu hình script khởi động.bash_profile
để tự nạp key. Tham khảo OpenSSH docs tại Learn Microsoft (http://learn.microsoft.com/).
Mẹo nhỏ để sống khỏe với shared hosting
Tạo một thư mục
~/repos/yourapp
để clone repo gốc, rồi rsync copy sangpublic_html
khi build xong. Tránh lỡ tay xóa nhầm file public.Dùng
.gitignore
cẩn thận với.env
,storage
, hoặc thư mục upload.Nếu có CI/CD, cân nhắc build assets hoặc composer install trên máy riêng rồi upload các artifact cần thiết.
Kết luận
SSH key giống như chiếc thẻ từ mở cửa. Cài đúng, nạp đúng, GitHub nhận ra bạn ngay và cho clone mượt mà. Từ đây, deploy trên shared hosting chỉ còn là vài dòng lệnh quen tay.