Git Action 极速搭建

  1. 生成对应的密钥
    ssh-keygen -t rsa -b 4096 -f ~/.ssh/your_custom_filename
    私钥放到EC2_SSH_PRIVATE_KEY

  2. 项目中生成对应的.github/workflows/deploy.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
name: Deploy to EC2

on:
push:
branches: [ main ]

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: 📥 Checkout code
uses: actions/checkout@v4

- name: 🟢 Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'

- name: 📦 Install dependencies
run: npm ci

- name: ⚙️ Build app
run: npm run build

- name: 📦 Prepare deployment package
run: |
mkdir -p deploy-package
cp -r .next public next.config.js package.json package-lock.json deploy-package/
# 如果有 .env 文件也复制(确保它在 Git 中)
if [ -f .env ]; then
cp .env deploy-package/
echo "✅ .env included in deployment"
else
echo "⚠️ No .env file found (make sure it's committed or handled separately)"
fi
# 调试:显示部署包内容
echo "=== Deployment package contents ==="
ls -la deploy-package/

- name: 🔑 Setup SSH key
run: |
mkdir -p ~/.ssh
echo "$EC2_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan "$EC2_HOST" >> ~/.ssh/known_hosts
env:
EC2_SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
EC2_HOST: ${{ secrets.EC2_HOST }}

- name: 📁 Create app directory on EC2
run: ssh deployer@${{ secrets.EC2_HOST }} "mkdir -p /home/deployer/app/ArtChais-Web"

- name: 🚀 Sync files to EC2
run: |
rsync -avz --delete \
deploy-package/ \
deployer@${{ secrets.EC2_HOST }}:/home/deployer/app/ArtChais-Web/
env:
EC2_HOST: ${{ secrets.EC2_HOST }}

- name: 🔄 Restart app on EC2
run: |
ssh deployer@${{ secrets.EC2_HOST }} << 'EOF'
export PATH="$HOME/.npm-global/bin:$PATH"
cd /home/deployer/app/ArtChais-Web
npm ci --omit=dev
pm2 delete artchais-web 2>/dev/null || true
pm2 start "npm start" \
--name "artchais-web" \
--output "/home/deployer/app/ArtChais-Web/out.log" \
--error "/home/deployer/app/ArtChais-Web/error.log" \
--log-date-format "YYYY-MM-DD HH:mm:ss"

pm2 save
EOF

  1. ec2公钥配置

  2. PM2管理 进程