Skip to content

Commit d76d45b

Browse files
authored
Merge pull request #384 from JNU-econovation/feat/#383
[BE/feat] AI 서버 분리로 인한 MariaDB 서버 구축 및 EC2 사양 변경
2 parents 29c32ff + 9808bc9 commit d76d45b

File tree

10 files changed

+296
-8
lines changed

10 files changed

+296
-8
lines changed

.github/workflows/prodWorkflow.yml

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
name: testAndDeploy
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- release
7+
- main
8+
types:
9+
- closed
10+
11+
defaults:
12+
run:
13+
working-directory: ./BE/exceed
14+
15+
jobs:
16+
build:
17+
runs-on: ubuntu-22.04
18+
permissions:
19+
contents: read
20+
pull-requests: write
21+
22+
steps:
23+
- uses: actions/checkout@v3
24+
- name: Set up JDK 17
25+
uses: actions/setup-java@v3
26+
with:
27+
java-version: '17'
28+
distribution: 'temurin'
29+
30+
- name: Grant execute permission for gradlew
31+
run: chmod +x gradlew
32+
33+
- name: Cache Gradle
34+
uses: actions/cache@v3
35+
with:
36+
path: |
37+
~/.gradle/caches
38+
~/.gradle/wrapper
39+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
40+
restore-keys: |
41+
${{ runner.os }}-gradle-
42+
43+
- name: Build with Gradle Wrapper
44+
run: ./gradlew build
45+
46+
- name: Jacoco Report to PR
47+
id: jacoco
48+
uses: madrapps/[email protected]
49+
with:
50+
paths: ${{ github.workspace }}/**/build/reports/jacoco/test/jacocoTestReport.xml
51+
token: ${{ secrets.GITHUB_TOKEN }}
52+
53+
- name: Send docker-compose.yml
54+
uses: appleboy/scp-action@master
55+
with:
56+
host: ${{ secrets.SSH_HOST }}
57+
username: ${{ secrets.SSH_USERNAME }}
58+
key: ${{ secrets.SSH_KEY }}
59+
source: ./BE/exceed/docker-compose-prod.yml
60+
target: /home/ubuntu/backend-deploy
61+
62+
- name: Send resources-develop-environment
63+
uses: appleboy/scp-action@master
64+
with:
65+
host: ${{ secrets.SSH_HOST }}
66+
username: ${{ secrets.SSH_USERNAME }}
67+
key: ${{ secrets.SSH_KEY }}
68+
source: ./BE/exceed/resources/gaebaljip-prod-environment
69+
target: /home/ubuntu/backend-deploy
70+
71+
- name: Create .env.prod file
72+
run: |
73+
echo "${{ secrets.ENV_PROD_VARS }}" > .env.prod
74+
75+
- name: Send env file
76+
uses: appleboy/scp-action@master
77+
with:
78+
host: ${{ secrets.SSH_HOST }}
79+
username: ${{ secrets.SSH_USERNAME }}
80+
key: ${{ secrets.SSH_KEY }}
81+
source: ./BE/exceed/.env.prod
82+
target: /home/ubuntu/backend-deploy
83+
84+
- name: Docker Image Build
85+
run: docker build -f Dockerfile-prod -t ${{ secrets.DOCKER_HUB_USER_NAME }}/gaebaljip-prod:latest .
86+
87+
- name: Docker Hub Login
88+
uses: docker/login-action@v2
89+
with:
90+
username: ${{ secrets.DOCKER_HUB_USER_NAME }}
91+
password: ${{ secrets.DOCKER_HUB_TOKEN }}
92+
93+
- name: docker Hub Push
94+
run: docker push ${{ secrets.DOCKER_HUB_USER_NAME }}/gaebaljip-prod:latest
95+
96+
- name: SSH Deploy
97+
uses: appleboy/[email protected]
98+
with:
99+
host: ${{ secrets.SSH_HOST }}
100+
username: ${{ secrets.SSH_USERNAME }}
101+
key: ${{ secrets.SSH_KEY }}
102+
script: |
103+
cd backend-deploy/BE/exceed
104+
sudo docker-compose down
105+
sudo docker pull ${{ secrets.DOCKER_HUB_USER_NAME }}/gaebaljip-prod:latest
106+
sudo docker-compose up --build -d
107+
sudo docker image prune -a -f
108+
109+

BE/exceed/.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ src/main/resources/static/docs/api-doc.html
4545

4646
### env
4747
.env
48-
env-dev
49-
48+
.env.prod
5049

5150
### jmh
5251

BE/exceed/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ COPY ./food_data.csv ./food_data.csv
1515
EXPOSE 8080
1616

1717
# CMD 명령어에서 CSV 파일의 위치를 절대 경로로 지정
18-
CMD ["java", "-jar", "-Dspring.profiles.active=dev", "eatceed.jar", "./food_data.csv"]
18+
CMD ["java", "-jar", "-Dspring.profiles.active=dev", "eatceed.jar", "./food_data.csv"]

BE/exceed/Dockerfile-prod

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
FROM openjdk:17-oracle
2+
3+
ENV TZ=Asia/Seoul
4+
5+
# 앱을 위한 작업 디렉토리 설정
6+
WORKDIR /app
7+
8+
# JAR 파일 복사
9+
ARG JAR_FILE="./build/libs/*.jar"
10+
COPY ${JAR_FILE} eatceed.jar
11+
12+
# CSV 파일 복사
13+
COPY ./food_data.csv ./food_data.csv
14+
15+
EXPOSE 8080
16+
17+
# CMD 명령어에서 CSV 파일의 위치를 절대 경로로 지정
18+
CMD ["java", "-jar", "-Dspring.profiles.active=prod", "eatceed.jar", "./food_data.csv"]

BE/exceed/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ plugins {
1616
}
1717

1818
group = 'com.gaebaljip'
19-
version = '0.0.1-SNAPSHOT'
19+
version = '1.0.0'
2020

2121
java {
2222
sourceCompatibility = '17'

BE/exceed/docker-compose-prod.yml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
version: '3'
2+
services:
3+
eatceed-redis:
4+
image: redis:alpine
5+
container_name: gaebaljip-redis
6+
command: redis-server --port 6379
7+
expose:
8+
- "6379"
9+
networks:
10+
- gaebaljip-network
11+
12+
eatceed-backend:
13+
image: hwangdaesun/gaebaljip-prod:latest
14+
container_name: gaebaljip-spring
15+
ports:
16+
- 8080:8080
17+
depends_on:
18+
- eatceed-redis
19+
environment:
20+
- RDS_DATABASE_ENDPOINT=${RDS_DATABASE_ENDPOINT}
21+
- RDS_PORT=${RDS_PORT}
22+
- RDS_DB_NAME=${RDS_DB_NAME}
23+
- RDS_DATABASE_USERNAME=${RDS_DATABASE_USERNAME}
24+
- RDS_DATABASE_PASSWORD=${RDS_DATABASE_PASSWORD}
25+
- S3_BUCKET_NAME=${S3_BUCKET_NAME}
26+
- CLOUD_AWS_ACCESS_KEY=${CLOUD_AWS_ACCESS_KEY}
27+
- CLOUD_AWS_SECRET_KEY=${CLOUD_AWS_SECRET_KEY}
28+
- JWT_SECRET=${JWT_SECRET}
29+
- SES_MAIL_ADDRESS=${SES_MAIL_ADDRESS}
30+
- ENCRYPTION_SPEC=${ENCRYPTION_SPEC}
31+
- ENCRYPTION_SECRET=${ENCRYPTION_SECRET}
32+
- ENCRYPTION_ALGORITHM=${ENCRYPTION_ALGORITHM}
33+
- SPRING_REDIS_HOST=gaebaljip-redis
34+
- SPRING_REDIS_PORT=6379
35+
networks:
36+
- gaebaljip-network
37+
restart: "always"
38+
39+
grafana:
40+
image: grafana/grafana:latest
41+
container_name: grafana
42+
restart: "always"
43+
ports:
44+
- "3000:3000"
45+
volumes:
46+
- grafana-data:/var/lib/grafana
47+
- ./resources/gaebaljip-prod-environment/grafana/provisioning/:/etc/grafana/provisioning/
48+
environment:
49+
- GF_SERVER_ROOT_URL=localhost:3000
50+
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
51+
depends_on:
52+
- prometheus
53+
networks:
54+
- gaebaljip-network
55+
56+
prometheus:
57+
image: prom/prometheus:latest
58+
container_name: prometheus
59+
restart: "always"
60+
ports:
61+
- "9090:9090"
62+
volumes:
63+
- ./resources/gaebaljip-prod-environment/prometheus/config:/etc/prometheus/
64+
- prometheus-data:/prometheus
65+
command:
66+
- '--config.file=/etc/prometheus/prometheus.yml'
67+
- '--storage.tsdb.path=/prometheus'
68+
networks:
69+
- gaebaljip-network
70+
71+
volumes:
72+
grafana-data:
73+
prometheus-data:
74+
75+
networks:
76+
gaebaljip-network:
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
global:
2+
scrape_interval: 15s
3+
evaluation_interval: 15s
4+
alerting:
5+
alertmanagers:
6+
- static_configs:
7+
- targets:
8+
# - alertmanager:9093
9+
rule_files:
10+
scrape_configs:
11+
- job_name: "prometheus"
12+
static_configs:
13+
- targets: ["localhost:9090"]
14+
#추가
15+
- job_name: "spring-actuator"
16+
metrics_path: '/actuator/prometheus'
17+
scrape_interval: 1s
18+
static_configs:
19+
- targets: ['3.37.117.77:8080']

BE/exceed/src/main/java/com/gaebaljip/exceed/common/data/MariaDBAutoComplete.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.boot.ApplicationArguments;
88
import org.springframework.boot.ApplicationRunner;
99
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
10+
import org.springframework.context.annotation.Profile;
1011
import org.springframework.stereotype.Component;
1112

1213
import com.gaebaljip.exceed.adapter.out.jpa.food.FoodEntity;
@@ -22,6 +23,7 @@
2223
@Log4j2
2324
@RequiredArgsConstructor
2425
@ConditionalOnExpression("${ableAutoComplete:true}")
26+
@Profile("!prod")
2527
public class MariaDBAutoComplete implements ApplicationRunner {
2628

2729
private final FoodPort foodPort;

BE/exceed/src/main/resources/application-prod.yml

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ spring:
44
driver-class-name: org.mariadb.jdbc.Driver
55
username: ${RDS_DATABASE_USERNAME}
66
password: ${RDS_DATABASE_PASSWORD}
7+
redis:
8+
host: ${SPRING_REDIS_HOST}
9+
port: ${SPRING_REDIS_PORT}
710
jpa:
811
hibernate:
912
naming:
1013
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
1114
dialect: org.hibernate.dialect.MariaDBDialect
12-
ddl-auto: none
13-
show-sql: true
14-
defer-datasource-initialization: true
15+
ddl-auto: validate
16+
properties:
17+
hibernate:
18+
show_sql: true
19+
format_sql: true
20+
use_sql_comments: true
1521
cloud:
1622
aws:
1723
credentials:
@@ -32,12 +38,71 @@ encryption:
3238
jwt:
3339
secret: ${JWT_SECRET}
3440

41+
exceed:
42+
url : https://eatceed.net
43+
44+
springdoc:
45+
api-docs:
46+
path: /api-docs # API 문서 생성 경로
47+
groups:
48+
enabled: true
49+
swagger-ui:
50+
path: /index.html # Swagger-ui 경로
51+
enabled: true
52+
groups-order: asc
53+
tags-sorter: alpha
54+
operations-sorter: alpha
55+
display-request-duration: true
56+
doc-expansion: none
57+
cache:
58+
disabled: true
59+
override-with-generic-response: false
60+
model-and-view-allowed: true
61+
default-consumes-media-type: application/json
62+
default-produces-media-type: application/json
63+
3564
ableAutoComplete: true
3665

66+
management:
67+
endpoints:
68+
web:
69+
exposure:
70+
include: "*"
71+
exclude: "env, beans"
72+
3773
logging:
3874
level:
3975
org:
4076
hibernate:
4177
type:
4278
descriptor:
43-
sql: trace
79+
sql: trace
80+
81+
org:
82+
quartz:
83+
scheduler:
84+
instanceName: gaebaljip
85+
instanceId: AUTO
86+
rmi:
87+
export: false
88+
proxy: false
89+
threadPool:
90+
class: org.quartz.simpl.SimpleThreadPool
91+
threadCount: 5
92+
context:
93+
key:
94+
QuartzTopic: QuartzPorperties
95+
jobStore:
96+
class: org.quartz.impl.jdbcjobstore.JobStoreTX
97+
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
98+
tablePrefix: QRTZ_
99+
isClustered: true
100+
dataSource: gaebaljip
101+
dataSource:
102+
gaebaljip:
103+
provider: hikaricp
104+
driver: org.mariadb.jdbc.Driver
105+
URL: jdbc:mariadb://${RDS_DATABASE_ENDPOINT}:${RDS_PORT}/${RDS_DB_NAME}?serverTimezone=Asia/Seoul
106+
user: ${RDS_DATABASE_USERNAME}
107+
password: ${RDS_DATABASE_PASSWORD}
108+
maxConnections: 30

0 commit comments

Comments
 (0)