Yêu cầu trước khi bắt đầu
Máy cá nhân và VPS đều có OpenSSH.
Quyền truy cập GitHub repo.
Biết thông tin VPS: IP, user SSH, port.
Ví dụ trong bài dùng user
deploy
, IP203.0.113.10
, port22
. Bạn thay bằng thông tin thật của bạn.
Bước 1: Tạo SSH key trên máy cá nhân
Chạy lệnh sau và thay email của bạn cho phần comment (khuyên dùng ed25519 hiện đại, nhẹ, an toàn):
ssh-keygen -t ed25519 -C "you@example.com"
Nếu cần RSA cho hệ thống cũ:
ssh-keygen -t rsa -b 4096 -C "you@example.com"
Mặc định key nằm ở:
Private key:
~/.ssh/id_ed25519
hoặc~/.ssh/id_rsa
Public key:
~/.ssh/id_ed25519.pub
hoặc~/.ssh/id_rsa.pub
Xem nội dung public key:
cat ~/.ssh/id_ed25519.pub
📝 Không chia sẻ private key (ví dụ: id_ed25519
, id_rsa
) cho bất kỳ ai. Chỉ public key (.pub) mới được phép công khai.
Bước 2: Thêm public key vào VPS
Cách 1: Dán tay vào authorized_keys
(lần đầu có thể đăng nhập bằng mật khẩu):
ssh deploy@203.0.113.10 -p 22
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys # dán toàn bộ nội dung file .pub vào đây
chmod 600 ~/.ssh/authorized_keys
Cách 2: Dùng ssh-copy-id
(tiện và nhanh):
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 deploy@203.0.113.10
🔒 Phân quyền đúng là bắt buộc: ~/.ssh
= 700, authorized_keys
= 600. Sai quyền là SSH sẽ phật ý ngay 😅
Bước 3: Kiểm tra đăng nhập không mật khẩu
Từ máy cá nhân:
ssh -i ~/.ssh/id_ed25519 -p 22 deploy@203.0.113.10
Nếu vào được mà không hỏi mật khẩu → thành công.
Bước 4: Thêm private key vào GitHub Secrets cho CI/CD
Trên máy cá nhân, lấy nội dung private key:
cat ~/.ssh/id_ed25519
Copy toàn bộ output gồm cả dòng -----BEGIN ...
và -----END ...
.
Trên GitHub repo:
Vào repo → Settings → Secrets and variables → Actions
New repository secret
Name:
SERVER_SSH_PRIVATE_KEY
Paste nội dung private key vào Value → Save
🚨 Không commit private key vào repo. Private key chỉ lưu trong GitHub Secrets.
Gợi ý workflow GitHub Actions
Ví dụ job deploy đơn giản sử dụng secret để thiết lập SSH và chạy lệnh từ xa.
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Thiết lập SSH key
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: $ secrets.SERVER_SSH_PRIVATE_KEY
- name: Known hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan -p 22 203.0.113.10 >> ~/.ssh/known_hosts
- name: Deploy script (ví dụ)
run: |
ssh -p 22 deploy@203.0.113.10 "bash -lc 'cd /var/www/app && git pull && npm ci && npm run build && pm2 restart app'"
Tùy stack của bạn mà thay npm ci
, pm2
, hay php artisan
cho phù hợp.
Tăng cường bảo mật (rất nên làm)
Tắt đăng nhập bằng mật khẩu, chỉ cho phép key: sửa
/etc/ssh/sshd_config
→PasswordAuthentication no
rồisudo systemctl restart sshd
.Tạo user deploy riêng, quyền tối thiểu cần thiết. Hạn chế
sudo
.Dùng tường lửa (UFW) chỉ mở port SSH và các dịch vụ cần thiết.
Cân nhắc đổi port SSH, bật Fail2ban.
Lỗi thường gặp và cách xử lý nhanh
Permission denied (publickey): kiểm tra đã thêm đúng
.pub
vàoauthorized_keys
và quyền file thư mục chuẩn 700/600.Host key verification failed: thiếu
known_hosts
hoặc IP/port sai → dùngssh-keyscan
để thêm.Secret rỗng trong Actions: kiểm tra tên secret trùng khớp
SERVER_SSH_PRIVATE_KEY
và repo đúng.
Tổng kết
Tạo SSH key → thêm public key vào VPS → test SSH → đưa private key vào GitHub Secrets → dùng trong Actions để deploy tự động.
Làm đúng từ đầu là deploy nhàn, đỡ đau tim mỗi lần push code 🚀
Tài liệu tham khảo nên đọc thêm
Learn Microsoft: Secure Shell (SSH) key management
GitHub Docs: Encrypted secrets
OpenSSH: Manual pages