-
Notifications
You must be signed in to change notification settings - Fork 0
136 lines (116 loc) · 4.37 KB
/
deploy.yml
File metadata and controls
136 lines (116 loc) · 4.37 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
name: Deploy to EC2
on:
push:
branches:
- main
- develop
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Convert to lowercase
id: string
run: |
echo "IMAGE_NAME_LOWER=$(echo ${{ env.IMAGE_NAME }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GHCR_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ steps.string.outputs.IMAGE_NAME_LOWER }}:${{ github.ref_name }}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Convert to lowercase
id: string
run: |
echo "IMAGE_NAME_LOWER=$(echo ${{ env.IMAGE_NAME }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Set environment variables
id: vars
run: |
if [ "${{ github.ref_name }}" = "main" ]; then
echo "port=8000" >> $GITHUB_OUTPUT
echo "container_name=itzip-ai-prod" >> $GITHUB_OUTPUT
echo "env_file=/home/ubuntu/itzip-ai/.env" >> $GITHUB_OUTPUT
echo "data_path=/home/ubuntu/itzip-ai" >> $GITHUB_OUTPUT
else
echo "port=8001" >> $GITHUB_OUTPUT
echo "container_name=itzip-ai-dev" >> $GITHUB_OUTPUT
echo "env_file=/home/ubuntu/itzip-ai-dev/.env" >> $GITHUB_OUTPUT
echo "data_path=/home/ubuntu/itzip-ai-dev" >> $GITHUB_OUTPUT
fi
- name: Deploy to EC2
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# Set environment variables
if [ "${{ github.ref_name }}" = "main" ]; then
DOMAIN="ai.ariogi.kr"
PORT=8000
CONTAINER_NAME="itzip-ai-prod"
DATA_PATH="/home/ubuntu/itzip-ai"
ENV_FILE="/home/ubuntu/itzip-ai/.env"
else
DOMAIN="ai.dev.ariogi.kr"
PORT=8001
CONTAINER_NAME="itzip-ai-dev"
DATA_PATH="/home/ubuntu/itzip-ai-dev"
ENV_FILE="/home/ubuntu/itzip-ai-dev/.env"
fi
# Docker login
echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
# Run nginx setup script (로컬에 저장된 스크립트 실행)
/home/ubuntu/scripts/nginx_setup.sh "$DOMAIN" "$PORT"
# Pull new image
docker pull ${{ env.REGISTRY }}/${{ steps.string.outputs.IMAGE_NAME_LOWER }}:${{ github.ref_name }}
# Stop and remove old container
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true
# Create directories if not exist
mkdir -p $DATA_PATH/{credentials,logs,data,temp}
# Run new container
docker run -d \
--name $CONTAINER_NAME \
--restart unless-stopped \
-p $PORT:8000 \
-v $DATA_PATH/credentials:/app/credentials:ro \
-v $DATA_PATH/logs:/app/logs \
-v $DATA_PATH/data:/app/data \
-v $DATA_PATH/temp:/app/temp \
--env-file $ENV_FILE \
${{ env.REGISTRY }}/${{ steps.string.outputs.IMAGE_NAME_LOWER }}:${{ github.ref_name }}
# Health check
for i in {1..180}; do
if curl -f http://localhost:$PORT/api/health 2>/dev/null; then
echo "Service is healthy! ($DOMAIN)"
break
fi
if [ $i -eq 180 ]; then
echo "Health check failed!"
docker logs $CONTAINER_NAME --tail 20
exit 1
fi
sleep 2
done
# Cleanup
docker image prune -f
echo "🎉 Deployment completed: $DOMAIN → localhost:$PORT"