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, IP- 203.0.113.10, port- 22. 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_ed25519hoặc- ~/.ssh/id_rsa
- Public key: - ~/.ssh/id_ed25519.pubhoặ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_keysCá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.10Nế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_ed25519Copy 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 norồi- sudo 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 - .pubvào- authorized_keysvà quyền file thư mục chuẩn 700/600.
- Host key verification failed: thiếu - known_hostshoặc IP/port sai → dùng- ssh-keyscanđể thêm.
- Secret rỗng trong Actions: kiểm tra tên secret trùng khớp - SERVER_SSH_PRIVATE_KEYvà 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 
 
                            