-
Notifications
You must be signed in to change notification settings - Fork 1
112 lines (94 loc) · 4.57 KB
/
deploy.yml
File metadata and controls
112 lines (94 loc) · 4.57 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy Node.js to AWS EC2
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Dependencies
run: npm install
- name: SSH to EC2 and Deploy
env:
SSH_PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }}
EXPRESS_SESSION_SECRET: ${{ secrets.EXPRESS_SESSION_SECRET }}
PASSPORT_NAVER_CLIENT_ID: ${{ secrets.PASSPORT_NAVER_CLIENT_ID }}
PASSPORT_NAVER_CLIENT_SECRET: ${{ secrets.PASSPORT_NAVER_CLIENT_SECRET }}
PASSPORT_KAKAO_CLIENT_ID: ${{ secrets.PASSPORT_KAKAO_CLIENT_ID }}
PASSPORT_KAKAO_CLIENT_SECRET: ${{ secrets.PASSPORT_KAKAO_CLIENT_SECRET }}
run: |
mkdir -p ~/.ssh
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST << 'EOF'
# 환경 변수 설정
export DATABASE_URL="${{ secrets.DATABASE_URL }}"
export MYSQL_ROOT_PASSWORD="${{ secrets.MYSQL_ROOT_PASSWORD }}"
export EXPRESS_SESSION_SECRET="${{ secrets.EXPRESS_SESSION_SECRET }}"
export PASSPORT_NAVER_CLIENT_ID="${{ secrets.PASSPORT_NAVER_CLIENT_ID }}"
export PASSPORT_NAVER_CLIENT_SECRET="${{ secrets.PASSPORT_NAVER_CLIENT_SECRET }}"
export PASSPORT_KAKAO_CLIENT_ID="${{ secrets.PASSPORT_KAKAO_CLIENT_ID }}"
export PASSPORT_KAKAO_CLIENT_SECRET="${{ secrets.PASSPORT_KAKAO_CLIENT_SECRET }}"
export AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}"
export AWS_REGION="${{ secrets.AWS_REGION }}"
export AWS_ACCESS_KEY_ID="${{ secrets.AWS_ACCESS_KEY_ID }}"
# EC2 서버에 배포된 Node.js 애플리케이션 위치로 이동
cd /home/ubuntu/Node
# .env 파일 생성 (Prisma에서 DATABASE_URL을 인식할 수 있도록)
echo "DATABASE_URL=$DATABASE_URL" > .env
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" >> .env
echo "EXPRESS_SESSION_SECRET=${{ secrets.EXPRESS_SESSION_SECRET }}" >> .env
echo "PASSPORT_NAVER_CLIENT_ID=${{ secrets.PASSPORT_NAVER_CLIENT_ID }}" >> .env
echo "PASSPORT_NAVER_CLIENT_SECRET=${{ secrets.PASSPORT_NAVER_CLIENT_SECRET }}" >> .env
echo "PASSPORT_KAKAO_CLIENT_ID=${{ secrets.PASSPORT_KAKAO_CLIENT_ID }}" >> .env
echo "PASSPORT_KAKAO_CLIENT_SECRET=${{ secrets.PASSPORT_KAKAO_CLIENT_SECRET }}" >> .env
echo "AWS_SECRET_ACCESS_KEY"="${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .env
echo "AWS_REGION"="${{ secrets.AWS_REGION }}" >> .env
echo "AWS_ACCESS_KEY_ID"="${{ secrets.AWS_ACCESS_KEY_ID }}" >> .env
# Prisma 마이그레이션
if [ -f "prisma/schema.prisma" ]; then
echo "Running Prisma migrations..."
npx prisma migrate deploy
else
echo "Prisma schema not found. Skipping migrations..."
fi
# 최신 코드 pull
git pull origin main
# 종속성 설치
npm install
# mysql 실행 확인 (안되어 있으면 시작)
if systemctl is-active --quiet mysql; then
echo "MySQL is running."
else
echo "MySQL is not running. Starting MySQL..."
sudo systemctl start mysql
fi
# elasticsearch 실행 확인 (안되어 있으면 시작)
if systemctl is-active --quiet elasticsearch; then
echo "Elasticsearch is running."
else
echo "Elasticsearch is not running. Starting Elasticsearch..."
sudo systemctl start elasticsearch
fi
# app 실행 확인 (안되어 있으면 시작) & 무중단 배포
if pm2 describe "app" > /dev/null; then
echo "App is already running, reloading it..."
pm2 reload all
else
echo "App is not running, starting it..."
pm2 start /home/ubuntu/Node/src/server.js --name "app" --env DATABASE_URL="$DATABASE_URL" --env MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD"
fi
pm2 save
EOF