Skip to content

Commit e0a71f1

Browse files
committed
refactor: 인프라 재구성으로 인한 추가 리팩토링
- deploy.yml - 인프라 재구성으로 인한 배포 프로세스 수정 - application-prod.yml - DB 초기화를 위한 위한 ddl-auto 변경 - quartz 테이블 초기화를 위한 initialize-schema 변경 - InitializerConfig.java - 데이터 초기화후 초기 데이터 생성을 위한 로직 구현
1 parent fc35813 commit e0a71f1

3 files changed

Lines changed: 173 additions & 32 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 148 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,128 @@
145145
# sudo docker logs spring-boot-app
146146
# EOF
147147

148+
#name: Deploy Spring Boot APP to Amazon Linux 2023
149+
#
150+
#on:
151+
# push:
152+
# branches:
153+
# - main
154+
#
155+
#jobs:
156+
# deploy:
157+
# runs-on: ubuntu-latest
158+
#
159+
# steps:
160+
# - name: Checkout repository
161+
# uses: actions/checkout@v3
162+
#
163+
# - name: Set up JDK 21
164+
# uses: actions/setup-java@v2
165+
# with:
166+
# java-version: '21'
167+
# distribution: 'temurin'
168+
#
169+
# - name: Build Spring Boot app with Gradle
170+
# run: ./gradlew build -Dspring.profiles.active=common,prod
171+
#
172+
# - name: Build Docker image
173+
# run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest -f Dockerfile .
174+
#
175+
# - name: Docker Login
176+
# run: echo ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
177+
#
178+
# - name: Push Docker image
179+
# run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
180+
#
181+
# - name: Add SSH Key
182+
# uses: webfactory/ssh-agent@v0.5.3
183+
# with:
184+
# ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
185+
#
186+
# - name: Create Spring APP environment variables file
187+
# run: |
188+
# cat > env.list <<EOF
189+
# APP_IMAGE=${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
190+
#
191+
# PROD_DB_NAME=${{ secrets.PROD_DB_NAME }}
192+
# PROD_DB_USERNAME=${{ secrets.PROD_DB_USERNAME }}
193+
# PROD_DB_PASSWORD=${{ secrets.PROD_DB_PASSWORD }}
194+
# PROD_DB_ROOT_PASSWORD=${{ secrets.PROD_DB_ROOT_PASSWORD }}
195+
# PROD_DB_URL=jdbc:mariadb://mariadb:3306/${{ secrets.PROD_DB_NAME }}?useUnicode=true&characterEncoding=utf8mb4
196+
#
197+
# PROD_REDIS_HOST=redis
198+
# PROD_REDIS_PORT=${{ secrets.PROD_REDIS_PORT }}
199+
# PROD_REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }}
200+
#
201+
#
202+
# SPRING_CLOUD_AWS_S3_BUCKET_NAME=${{ secrets.PROD_S3_BUCKET_NAME }}
203+
# SPRING_CLOUD_AWS_S3_BUCKET_REGION=${{ secrets.PROD_S3_BUCKET_REGION }}
204+
#
205+
# SPRING_COOL_SMS_API_KEY=${{ secrets.PROD_SMS_API_KEY }}
206+
# SPRING_COOL_SMS_API_SECRET=${{ secrets.PROD_SMS_API_SECRET }}
207+
# SPRING_COOL_SMS_SENDER_NUMBER=${{ secrets.PROD_SMS_SENDER_NUMBER }}
208+
#
209+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }}
210+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }}
211+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
212+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
213+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}
214+
# SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}
215+
#
216+
# SPRING_CLOUD_AWS_CLOUD_FRONT_DOMAIN=${{ secrets.PROD_CLOUD_FRONT_DOMAIN }}
217+
# SPRING_CLOUD_AWS_CLOUD_FRONT_KEY_PAIR_ID=${{ secrets.PROD_CLOUD_FRONT_KEY_PAIR_ID }}
218+
# SPRING_CLOUD_AWS_CLOUD_FRONT_URL_EXPIRATION_MINUTES=${{ secrets.PROD_CLOUD_FRONT_URL_EXPIRATION_MINUTES }}
219+
# SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_REGION=${{ secrets.PROD_CLOUD_FRONT_SECRET_REGION }}
220+
# SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_NAME }}
221+
# SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_KEY_VALUE_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_KEY_VALUE_NAME }}
222+
#
223+
# SPRING_PROFILES_ACTIVE=common,prod
224+
# EOF
225+
#
226+
# - name: Create nginx environment variables file
227+
# run: |
228+
# cat > nginx.env.list <<EOF
229+
# NGINX_SSL_CERT_PATH=${{ secrets.NGINX_SSL_CERT_PATH }}
230+
# NGINX_SSL_KEY_PATH=${{ secrets.NGINX_SSL_KEY_PATH }}
231+
# EOF
232+
#
233+
# - name: Render nginx config
234+
# run: |
235+
# set -o allexport
236+
# source nginx.env.list
237+
# envsubst '${NGINX_SSL_CERT_PATH} ${NGINX_SSL_KEY_PATH}' < nginx.template.conf > default.conf
238+
#
239+
# - name: Transfer files to EC2
240+
# run: |
241+
# scp -o StrictHostKeyChecking=no src/main/resources/application-common.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-common.yml
242+
# scp -o StrictHostKeyChecking=no src/main/resources/application-prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-prod.yml
243+
# scp -o StrictHostKeyChecking=no env.list ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/env.list
244+
# scp -o StrictHostKeyChecking=no docker-compose.prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/docker-compose.yml
245+
# scp -o StrictHostKeyChecking=no default.conf ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/default.conf
246+
#
247+
# - name: Deploy to EC2
248+
# run: |
249+
# ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 ec2-user@${{ secrets.EC2_PUBLIC_IP }} << 'EOF'
250+
# set -e
251+
#
252+
# cd /home/ec2-user
253+
#
254+
# sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
255+
# sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
256+
#
257+
# sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml up -d --remove-orphans
258+
#
259+
# sudo mv /home/ec2-user/default.conf /etc/nginx/conf.d/default.conf
260+
# sudo nginx -t
261+
# sudo systemctl restart nginx
262+
#
263+
# sudo dnf install -y certbot python3-certbot-nginx
264+
# sudo certbot renew --nginx --quiet || true
265+
#
266+
# sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml ps
267+
# sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml logs spring-boot-app --tail=200
268+
# EOF
269+
148270
name: Deploy Spring Boot APP to Amazon Linux 2023
149271

150272
on:
@@ -185,20 +307,18 @@ jobs:
185307

186308
- name: Create Spring APP environment variables file
187309
run: |
188-
cat > env.list <<EOF
189-
APP_IMAGE=${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
190-
191-
PROD_DB_NAME=${{ secrets.PROD_DB_NAME }}
192-
PROD_DB_USERNAME=${{ secrets.PROD_DB_USERNAME }}
193-
PROD_DB_PASSWORD=${{ secrets.PROD_DB_PASSWORD }}
194-
PROD_DB_ROOT_PASSWORD=${{ secrets.PROD_DB_ROOT_PASSWORD }}
195-
PROD_DB_URL=jdbc:mariadb://mariadb:3306/${{ secrets.PROD_DB_NAME }}?useUnicode=true&characterEncoding=utf8mb4
196-
197-
PROD_REDIS_HOST=redis
198-
PROD_REDIS_PORT=${{ secrets.PROD_REDIS_PORT }}
199-
PROD_REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }}
200-
201-
310+
cat > .env <<EOF
311+
APP_IMAGE=${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
312+
PROD_DB_NAME=${{ secrets.PROD_DB_NAME }}
313+
PROD_DB_USERNAME=${{ secrets.PROD_DB_USERNAME }}
314+
PROD_DB_PASSWORD=${{ secrets.PROD_DB_PASSWORD }}
315+
PROD_DB_ROOT_PASSWORD=${{ secrets.PROD_DB_ROOT_PASSWORD }}
316+
PROD_DB_URL=jdbc:mariadb://mariadb:3306/${{ secrets.PROD_DB_NAME }}?useUnicode=true&characterEncoding=utf8mb4
317+
318+
PROD_REDIS_HOST=redis
319+
PROD_REDIS_PORT=${{ secrets.PROD_REDIS_PORT }}
320+
PROD_REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }}
321+
202322
SPRING_CLOUD_AWS_S3_BUCKET_NAME=${{ secrets.PROD_S3_BUCKET_NAME }}
203323
SPRING_CLOUD_AWS_S3_BUCKET_REGION=${{ secrets.PROD_S3_BUCKET_REGION }}
204324
@@ -212,15 +332,15 @@ jobs:
212332
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
213333
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}
214334
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}
215-
216-
SPRING_CLOUD_AWS_CLOUD_FRONT_DOMAIN=${{ secrets.PROD_CLOUD_FRONT_DOMAIN }}
217-
SPRING_CLOUD_AWS_CLOUD_FRONT_KEY_PAIR_ID=${{ secrets.PROD_CLOUD_FRONT_KEY_PAIR_ID }}
218-
SPRING_CLOUD_AWS_CLOUD_FRONT_URL_EXPIRATION_MINUTES=${{ secrets.PROD_CLOUD_FRONT_URL_EXPIRATION_MINUTES }}
219-
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_REGION=${{ secrets.PROD_CLOUD_FRONT_SECRET_REGION }}
220-
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_NAME }}
221-
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_KEY_VALUE_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_KEY_VALUE_NAME }}
222-
223-
SPRING_PROFILES_ACTIVE=common,prod
335+
336+
SPRING_CLOUD_AWS_CLOUD_FRONT_DOMAIN=${{ secrets.PROD_CLOUD_FRONT_DOMAIN }}
337+
SPRING_CLOUD_AWS_CLOUD_FRONT_KEY_PAIR_ID=${{ secrets.PROD_CLOUD_FRONT_KEY_PAIR_ID }}
338+
SPRING_CLOUD_AWS_CLOUD_FRONT_URL_EXPIRATION_MINUTES=${{ secrets.PROD_CLOUD_FRONT_URL_EXPIRATION_MINUTES }}
339+
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_REGION=${{ secrets.PROD_CLOUD_FRONT_SECRET_REGION }}
340+
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_NAME }}
341+
SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_KEY_VALUE_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_KEY_VALUE_NAME }}
342+
343+
SPRING_PROFILES_ACTIVE=common,prod
224344
EOF
225345
226346
- name: Create nginx environment variables file
@@ -240,7 +360,7 @@ jobs:
240360
run: |
241361
scp -o StrictHostKeyChecking=no src/main/resources/application-common.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-common.yml
242362
scp -o StrictHostKeyChecking=no src/main/resources/application-prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-prod.yml
243-
scp -o StrictHostKeyChecking=no env.list ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/env.list
363+
scp -o StrictHostKeyChecking=no .env ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/.env
244364
scp -o StrictHostKeyChecking=no docker-compose.prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/docker-compose.yml
245365
scp -o StrictHostKeyChecking=no default.conf ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/default.conf
246366
@@ -251,10 +371,10 @@ jobs:
251371
252372
cd /home/ec2-user
253373
254-
sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
374+
sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin <<< '${{ secrets.DOCKERHUB_ACCESS_TOKEN }}'
255375
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest
256376
257-
sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml up -d --remove-orphans
377+
sudo docker compose -f /home/ec2-user/docker-compose.yml up -d --remove-orphans
258378
259379
sudo mv /home/ec2-user/default.conf /etc/nginx/conf.d/default.conf
260380
sudo nginx -t
@@ -263,6 +383,6 @@ jobs:
263383
sudo dnf install -y certbot python3-certbot-nginx
264384
sudo certbot renew --nginx --quiet || true
265385
266-
sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml ps
267-
sudo docker compose --env-file /home/ec2-user/env.list -f /home/ec2-user/docker-compose.yml logs spring-boot-app --tail=200
386+
sudo docker compose -f /home/ec2-user/docker-compose.yml ps
387+
sudo docker compose -f /home/ec2-user/docker-compose.yml logs spring-boot-app --tail=200
268388
EOF

src/main/java/sumcoda/boardbuddy/config/InitializerConfig.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,36 @@
22

33
import jakarta.annotation.PostConstruct;
44
import lombok.RequiredArgsConstructor;
5+
import org.springframework.boot.ApplicationRunner;
6+
import org.springframework.context.annotation.Bean;
57
import org.springframework.context.annotation.Configuration;
8+
import sumcoda.boardbuddy.service.BadgeImageService;
9+
import sumcoda.boardbuddy.service.MemberService;
610

11+
import java.time.YearMonth;
712
import java.util.TimeZone;
813

914

1015
@Configuration
1116
@RequiredArgsConstructor
1217
public class InitializerConfig {
1318

19+
private final MemberService memberService;
20+
21+
private final BadgeImageService badgeImageService;
22+
23+
@Bean
24+
public ApplicationRunner initializer() {
25+
return args -> {
26+
27+
// 프로덕션 코드
28+
// ddl-auto none 으로 수정후 아래 로직 비활성화
29+
memberService.createAdminAccount();
30+
memberService.createInitTestAccounts();
31+
badgeImageService.assignBadgesToInitTestMembers(YearMonth.now().minusMonths(1));
32+
};
33+
}
34+
1435
@PostConstruct
1536
public void setTimeZone(){
1637
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));

src/main/resources/application-prod.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ spring:
1010

1111
jpa:
1212
hibernate:
13-
# ddl-auto: create
13+
ddl-auto: create
1414
# TODO : db 유지를 위해선, 이후에 none으로 고정해야 함.
15-
ddl-auto: none
15+
# ddl-auto: none
1616

1717
data:
1818
redis:
@@ -47,9 +47,9 @@ spring:
4747
quartz:
4848
job-store-type: jdbc
4949
jdbc:
50-
# initialize-schema: always
50+
initialize-schema: always
5151
# TODO : quartz 테이블을 유지하기 위해선, 이후에 never 으로 고정해야 함.
52-
initialize-schema: never
52+
# initialize-schema: never
5353

5454
server:
5555
servlet:

0 commit comments

Comments
 (0)