A quick guide to auto-deploy your Node/Next.js app on a Google Cloud VM using SSH and GitHub Actions.
# Generate SSH key
ssh-keygen -t rsa -b 4096 -f github_deploy_key
# Add public key to VM metadata or ~/.ssh/authorized_keys
# (Ensure username matches your SSH user)
# Connect to VM
ssh -i github_deploy_key your_user@your_vm_ip
sudo apt update && sudo apt install nginx -y
sudo vi /etc/nginx/sites-available/myapp
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
name: π Deploy to GCP VM
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v4
with:
node-version: 20
- run: |
npm ci
npm run build
- name: π Deploy
env:
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
echo "$SSH_PRIVATE_KEY" > key.pem
chmod 600 key.pem
ssh -o StrictHostKeyChecking=no -i key.pem ${{ secrets.SERVER_USER }}@$SSH_HOST << 'EOF'
cd ~/dinka
git pull origin main
npm ci
npm run build
pm2 restart next-js1
EOF
rm -f key.pem