Repository navigation
128 lines (102 loc) · 3.73 KB
/
Copy pathpython-publish.yml
File metadata and controls
128 lines (102 loc) · 3.73 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
name: Python CI with FastAPI & Docker Deploy
on:
#pull_request:
#types:
#- closed
#branches:
#- main
push:
branches: [ "main" ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Cache pip packages
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: make .env file
run: |
echo "${{ secrets.ENV_FILE }}" | base64 --decode > .env
chmod 600 .env
- name: make prompts.txt file
run: |
echo "${{ secrets.PROMPTS_FILE }}" > prompts.txt
chmod 600 prompts.txt
echo "${{ secrets.PROMPTS_FILE_ENG }}" > prompts_eng.txt
chmod 600 prompts_eng.txt
- name: Generate Dockerfile
run: |
cat > Dockerfile <<'DOCKERFILE'
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y \
gcc \
g++ \
libpq-dev \
libgl1 \
libglib2.0-0 \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
DOCKERFILE
- name: Build Docker image
run: |
docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/ai-app:latest --platform linux/amd64 .
- name: Docker Hub login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Push image to Docker Hub
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/ai-app:latest
- name: Deploy to EC2
run: |
IMAGE="${{ secrets.DOCKERHUB_USERNAME }}/ai-app:latest"
CONTAINER_NAME="ai_app"
REMOTE_ENV_PATH="/home/${{ secrets.EC2_USERNAME }}/.env"
echo "${{ secrets.EC2_PRIVATE_KEY }}" > deploy_key.pem
chmod 600 deploy_key.pem
# .env 업로드
echo "${{ secrets.ENV_FILE }}" | base64 --decode > .env
scp -i deploy_key.pem -o StrictHostKeyChecking=no .env \
${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:${REMOTE_ENV_PATH}
# SSH로 실행 (heredoc 안에서는 로컬 변수를 안전하게 전달)
ssh -i deploy_key.pem -o StrictHostKeyChecking=no \
${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} "IMAGE=$IMAGE CONTAINER_NAME=$CONTAINER_NAME ENV_PATH=$REMOTE_ENV_PATH bash -s" <<'SSH_EOF'
# 기존 컨테이너 삭제
if sudo docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
sudo docker rm -f ${CONTAINER_NAME} || true
fi
# 최신 이미지 pull
sudo docker pull ${IMAGE}
# 컨테이너 실행
sudo docker run -d \
--name ${CONTAINER_NAME} \
-p 8000:8000 \
--env-file ${ENV_PATH} \
--restart unless-stopped \
${IMAGE}
# 불필요한 이미지 정리
sudo docker image prune -a -f
SSH_EOF