-
Notifications
You must be signed in to change notification settings - Fork 0
153 lines (132 loc) · 5.75 KB
/
Copy pathdeploy-to-dev-ec2-docker.yml
File metadata and controls
153 lines (132 loc) · 5.75 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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
name: Deploy Dev (Docker Compose via GHCR)
on:
push:
branches: [ develop ]
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
environment: dev
steps:
- name: 🧾 Checkout
uses: actions/checkout@v4
- name: 🔡 Normalize image repo (lowercase)
id: normalize
run: echo "image_repo=ghcr.io/${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT"
- name: 🧱 Setup Buildx
uses: docker/setup-buildx-action@v3
- name: 🔐 Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ secrets.GHCR_USERNAME }}
password: ${{ secrets.GHCR_TOKEN }}
- name: 🏷️ Meta (tags/labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ steps.normalize.outputs.image_repo }}
tags: |
type=raw,value=dev-latest
type=sha,format=long,prefix=dev-
- name: 🏗️ Build & Push Image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=registry,ref=${{ steps.normalize.outputs.image_repo }}:buildcache
cache-to: type=registry,ref=${{ steps.normalize.outputs.image_repo }}:buildcache,mode=max
- name: 📤 Copy compose files to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
source: "deploy/docker-compose.yml,deploy/docker-compose.dev.yml,deploy/postgres-ko/Dockerfile"
target: ~/saerok/
strip_components: 1
- name: 🚀 Deploy on EC2 (pull & up)
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
script: |
set -euo pipefail
cd ~/saerok
# 0) Docker & Compose 확인
docker --version
docker compose version
# 1) GHCR 로그인 (app 이미지 pull 용)
echo "${{ secrets.GHCR_TOKEN }}" | docker login ghcr.io -u "${{ secrets.GHCR_USERNAME }}" --password-stdin
# 2) /run/saerok env 파일 생성
sudo install -d -m 0700 -o "$(id -un)" -g "$(id -gn)" /run/saerok
ENV_FILE="/run/saerok/env.dev"
umask 177
: > "$ENV_FILE"
cleanup() { shred -u "$ENV_FILE" || rm -f "$ENV_FILE"; }
trap cleanup EXIT
add_kv() { printf '%s\n' "$1=$2" >> "$ENV_FILE"; }
add_kv SPRING_PROFILES_ACTIVE "dev"
add_kv DB_URL "${{ secrets.DB_URL }}"
add_kv DB_USERNAME "${{ secrets.DB_USERNAME }}"
add_kv DB_PASSWORD "${{ secrets.DB_PASSWORD }}"
add_kv APPLE_CLIENT_ID "${{ secrets.APPLE_CLIENT_ID }}"
add_kv APPLE_TEAM_ID "${{ secrets.APPLE_TEAM_ID }}"
add_kv APPLE_KEY_ID "${{ secrets.APPLE_KEY_ID }}"
add_kv APPLE_PRIVATE_KEY "${{ secrets.APPLE_PRIVATE_KEY }}"
add_kv FIREBASE_ADMIN_KEY "${{ secrets.FIREBASE_ADMIN_KEY }}"
add_kv JWT_SECRET "${{ secrets.JWT_SECRET }}"
add_kv IAM_ACCESS_KEY "${{ secrets.IAM_ACCESS_KEY }}"
add_kv IAM_SECRET_KEY "${{ secrets.IAM_SECRET_KEY }}"
add_kv UPLOAD_IMAGE_BUCKET_NAME "${{ vars.UPLOAD_IMAGE_BUCKET_NAME }}"
add_kv UPLOAD_IMAGE_DOMAIN "${{ vars.UPLOAD_IMAGE_DOMAIN }}"
add_kv DEX_IMAGE_BUCKET_NAME "${{ vars.DEX_IMAGE_BUCKET_NAME }}"
add_kv DEX_IMAGE_DOMAIN "${{ vars.DEX_IMAGE_DOMAIN }}"
add_kv KAKAO_ADMIN_KEY "${{ secrets.KAKAO_ADMIN_KEY }}"
add_kv KAKAO_CLIENT_ID "${{ secrets.KAKAO_CLIENT_ID }}"
add_kv KAKAO_REDIRECT_URI "${{ secrets.KAKAO_REDIRECT_URI }}"
add_kv KAKAO_REDIRECT_URI_ADMIN "${{ secrets.KAKAO_REDIRECT_URI_ADMIN }}"
add_kv KAKAO_CLIENT_SECRET "${{ secrets.KAKAO_CLIENT_SECRET }}"
add_kv KAKAO_APP_ID "${{ secrets.KAKAO_APP_ID }}"
add_kv KMS_KEY_ID "${{ secrets.KMS_KEY_ID }}"
# 3) 커스텀 PostGIS + ko_KR UTF-8 이미지 빌드 (BuildKit 끄고, buildx 안 씀)
DOCKER_BUILDKIT=0 docker build -t saerok-postgres:ko ./postgres-ko
# 4) app 이미지만 pull
docker compose \
--env-file "$ENV_FILE" \
-p saerok \
-f docker-compose.yml \
-f docker-compose.dev.yml \
pull --quiet app
# 5) compose up (postgres는 로컬 saerok-postgres:ko 이미지 사용)
docker compose \
--env-file "$ENV_FILE" \
-p saerok \
-f docker-compose.yml \
-f docker-compose.dev.yml \
up -d --force-recreate --quiet-pull
# 6) 상태 확인
docker compose -p saerok -f docker-compose.yml -f docker-compose.dev.yml ps
docker logs --tail=120 saerok-dev || true
# 7) Healthcheck
echo "Waiting for health endpoint..."
for i in {1..30}; do
if curl -fsS http://localhost:8080/health > /dev/null; then
echo "✅ Healthcheck passed"
docker image prune -af --filter "until=24h" || true
docker builder prune -af --filter "until=24h" || true
exit 0
fi
echo "⏳ Waiting ($i/30)..."
sleep 5
done
echo "❌ Healthcheck failed after retries"
docker logs --tail=200 saerok-dev || true
exit 1