Skip to content

Commit

Permalink
Merge pull request #301 from tipi-tapi/error/301
Browse files Browse the repository at this point in the history
2월 29일에 일기 작성 실패 이슈 해결
  • Loading branch information
choihuk authored Feb 28, 2024
2 parents 0810ff1 + 9affb58 commit d64b6c0
Show file tree
Hide file tree
Showing 11 changed files with 167 additions and 138 deletions.
129 changes: 44 additions & 85 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@ on:
push:
branches: [ "main" ]

env:
APPLICATION_PATH: ./src/main/resources/application.yml
PROD_PATH: ./src/main/resources/application-prod.yml
OAUTH_PATH: ./src/main/resources/application-oauth.yml
AWS_PATH: ./src/main/resources/application-aws.yml
OPENAI_PATH: ./src/main/resources/application-openai.yml
R2_PATH: ./src/main/resources/application-r2.yml
KAKAO_PATH: ./src/main/resources/application-kakao.yml

jobs:
deploy:
runs-on: ubuntu-latest
Expand All @@ -21,80 +12,6 @@ jobs:
- name: checkout
uses: actions/checkout@v3

- name: application.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.APPLICATION_PATH }}
env:
encryptor.secret.key: ${{ secrets.ENCRYPTOR_SECRET_KEY }}
presigned-image.expiration.admin-diaries: ${{ secrets.PRESIGNED_IMAGE_EXPIRATION_ADMIN_DIARIES }}

- name: application-prod.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.PROD_PATH }}
env:
spring.datasource.url: ${{ secrets.RDS_URL }}
spring.datasource.username: ${{ secrets.RDS_USERNAME }}
spring.datasource.password: ${{ secrets.RDS_PASSWORD }}

- name: application-oauth.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.OAUTH_PATH }}
env:
oauth2.google.client-id: ${{ secrets.GOOGLE_CLIENT_ID }}
oauth2.google.client-secret: ${{ secrets.GOOGLE_CLIENT_SECRET }}
oauth2.google.token-url: ${{ secrets.GOOGLE_TOKEN_URL }}
oauth2.google.user-info-url: ${{ secrets.GOOGLE_USER_INFO_URL }}
oauth2.google.redirect-uri: ${{ secrets.GOOGLE_REDIRECT_URI }}
oauth2.google.delete-account-url: ${{ secrets.GOOGLE_DELETE_ACCOUNT_URL }}
oauth2.apple.ios.client-id: ${{ secrets.APPLE_IOS_CLIENT_ID }}
oauth2.apple.ios.team-id: ${{ secrets.APPLE_IOS_TEAM_ID }}
oauth2.apple.ios.key-id: ${{ secrets.APPLE_IOS_KEY_ID }}
oauth2.apple.ios.private-key: ${{ secrets.APPLE_IOS_PRIVATE_KEY }}
oauth2.apple.ios.token-url: ${{ secrets.APPLE_IOS_TOKEN_URL }}
oauth2.apple.ios.delete-account-url: ${{ secrets.APPLE_IOS_DELETE_ACCOUNT_URL }}
jwt.secret: ${{ secrets.JWT_SECRET }}

- name: application-aws.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.AWS_PATH }}
env:
cloud.aws.credentials.secret-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
cloud.aws.credentials.access-key: ${{ secrets.AWS_ACCESS_KEY_ID }}
cloud.aws.s3.bucket: ${{ secrets.AWS_S3_BUCKET }}

- name: application-openai.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.OPENAI_PATH }}
env:
openai.api.key: ${{ secrets.OPENAI_API_KEY }}
openai.dalle.url: ${{ secrets.DALLE_API_URL }}

- name: application-r2.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.R2_PATH }}
env:
r2.credentials.secret-key: ${{ secrets.R2_SECRET_ACCESS_KEY }}
r2.credentials.access-key: ${{ secrets.R2_ACCESS_KEY_ID }}
r2.bucket: ${{ secrets.R2_BUCKET_NAME }}
r2.account-id: ${{ secrets.R2_ACCOUNT_ID }}
r2.custom-domain: ${{ secrets.R2_CUSTOM_DOMAIN }}

- name: application-kakao.yml setting
uses: microsoft/variable-substitution@v1
with:
files: ${{ env.KAKAO_PATH }}
env:
kakao.api.key: ${{ secrets.KAKAO_API_KEY }}
kakao.karlo.image_generate_url: ${{ secrets.KARLO_API_URL }}
kakao.karlo.generate_image.negative_prompt: ${{ secrets.KARLO_NEGATIVE_PROMPT }}
kakao.karlo.generate_image.style.default: ${{ secrets.KARLO_DEFAULT_STYLE }}

- name: Set up JDK 11
uses: actions/setup-java@v3
with:
Expand Down Expand Up @@ -132,5 +49,47 @@ jobs:
key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
port: 22
script: |
cd SpringServer
./start.sh
set -e
cd SpringServer/deploy
rm -f .env
touch .env
add_env_var() {
echo "export $1='$2'" >> ./.env
}
add_env_var "KAKAO_API_KEY" "${{ secrets.KAKAO_API_KEY }}"
add_env_var "KARLO_API_URL" "${{ secrets.KARLO_API_URL }}"
add_env_var "KARLO_NEGATIVE_PROMPT" "${{ secrets.KARLO_NEGATIVE_PROMPT }}"
add_env_var "KARLO_DEFAULT_STYLE" "${{ secrets.KARLO_DEFAULT_STYLE }}"
add_env_var "R2_SECRET_ACCESS_KEY" "${{ secrets.R2_SECRET_ACCESS_KEY }}"
add_env_var "R2_ACCESS_KEY_ID" "${{ secrets.R2_ACCESS_KEY_ID }}"
add_env_var "R2_BUCKET_NAME" "${{ secrets.R2_BUCKET_NAME }}"
add_env_var "R2_ACCOUNT_ID" "${{ secrets.R2_ACCOUNT_ID }}"
add_env_var "R2_CUSTOM_DOMAIN" "${{ secrets.R2_CUSTOM_DOMAIN }}"
add_env_var "OPENAI_API_KEY" "${{ secrets.OPENAI_API_KEY }}"
add_env_var "DALLE_API_URL" "${{ secrets.DALLE_API_URL }}"
add_env_var "AWS_SECRET_ACCESS_KEY" "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
add_env_var "AWS_ACCESS_KEY_ID" "${{ secrets.AWS_ACCESS_KEY_ID }}"
add_env_var "AWS_S3_BUCKET" "${{ secrets.AWS_S3_BUCKET }}"
add_env_var "GOOGLE_CLIENT_ID" "${{ secrets.GOOGLE_CLIENT_ID }}"
add_env_var "GOOGLE_CLIENT_SECRET" "${{ secrets.GOOGLE_CLIENT_SECRET }}"
add_env_var "GOOGLE_TOKEN_URL" "${{ secrets.GOOGLE_TOKEN_URL }}"
add_env_var "GOOGLE_USER_INFO_URL" "${{ secrets.GOOGLE_USER_INFO_URL }}"
add_env_var "GOOGLE_REDIRECT_URI" "${{ secrets.GOOGLE_REDIRECT_URI }}"
add_env_var "GOOGLE_DELETE_ACCOUNT_URL" "${{ secrets.GOOGLE_DELETE_ACCOUNT_URL }}"
add_env_var "APPLE_IOS_CLIENT_ID" "${{ secrets.APPLE_IOS_CLIENT_ID }}"
add_env_var "APPLE_IOS_TEAM_ID" "${{ secrets.APPLE_IOS_TEAM_ID }}"
add_env_var "APPLE_IOS_KEY_ID" "${{ secrets.APPLE_IOS_KEY_ID }}"
add_env_var "APPLE_IOS_PRIVATE_KEY" "${{ secrets.APPLE_IOS_PRIVATE_KEY }}"
add_env_var "APPLE_IOS_TOKEN_URL" "${{ secrets.APPLE_IOS_TOKEN_URL }}"
add_env_var "APPLE_IOS_DELETE_ACCOUNT_URL" "${{ secrets.APPLE_IOS_DELETE_ACCOUNT_URL }}"
add_env_var "JWT_SECRET" "${{ secrets.JWT_SECRET }}"
add_env_var "ENCRYPTOR_SECRET_KEY" "${{ secrets.ENCRYPTOR_SECRET_KEY }}"
add_env_var "PRESIGNED_IMAGE_EXPIRATION_ADMIN_DIARIES" "${{ secrets.PRESIGNED_IMAGE_EXPIRATION_ADMIN_DIARIES }}"
add_env_var "RDS_URL" "${{ secrets.RDS_URL }}"
add_env_var "RDS_USERNAME" "${{ secrets.RDS_USERNAME }}"
add_env_var "RDS_PASSWORD" "${{ secrets.RDS_PASSWORD }}"
./deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class SecurityConfig {
"/oauth2/refresh",
"/oauth2/expiredJwt",
"/health/server",
"/health/profile",
"/actuator/**"
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private static void validateDate(int month, int day) {

private static int getMaxDay(int month) {
if (month == 2) {
return 28;
return 29;
}
if (Stream.of(1, 3, 5, 7, 8, 10, 12)
.anyMatch(m -> m == month)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,42 @@

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/health")
public class HealthCheckController {

private final Environment env;
private final String[] availableProfiles = {"local", "develop", "prod"};

@Operation(summary = "서버 생존 여부 체크용", description = "서버가 살아있는지 체크합니다.")
@ApiResponse(responseCode = "204", description = "서버 생존")
@RequestMapping(value = "/server", method = RequestMethod.HEAD)
public ResponseEntity<Void> verifyServerAlive() {
return ResponseEntity.noContent().build();
}

@Operation(summary = "서버 프로필 체크용", description = "서버가 어떤 프로필로 동작중인지 체크합니다.")
@ApiResponse(responseCode = "200", description = "서버 프로필 정상 반환")
@GetMapping("/profile")
public String getActiveProfile() {
String[] profiles = env.getActiveProfiles();
for (String activeProfile : availableProfiles) {
for (String profile : profiles) {
if (profile.contains(activeProfile)) {
return profile;
}
}
}
throw new IllegalStateException("프로필이 존재하지 않습니다. profiles: " + Arrays.toString(profiles));
}
}
16 changes: 15 additions & 1 deletion src/main/resources/application-actuator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,18 @@ management:
server:
tomcat:
mbeanregistry:
enabled: true
enabled: true

---
spring.config.activate.on-profile: prod1

management:
server:
port: 9292

---
spring.config.activate.on-profile: prod2

management:
server:
port: 9293
17 changes: 0 additions & 17 deletions src/main/resources/application-develop.yml

This file was deleted.

12 changes: 0 additions & 12 deletions src/main/resources/application-prod.yml

This file was deleted.

17 changes: 0 additions & 17 deletions src/main/resources/application-test.yml

This file was deleted.

80 changes: 79 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,82 @@ encryptor:
key: ${ENCRYPTOR_SECRET_KEY}
presigned-image:
expiration:
admin-diaries: ${PRESIGNED_IMAGE_EXPIRATION_ADMIN_DIARIES}
admin-diaries: ${PRESIGNED_IMAGE_EXPIRATION_ADMIN_DIARIES}

---
spring.config.activate.on-profile: local

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/draw_my_today_db?serverTimezone=UTC&characterEncoding=UTF-8
username: ${DB_USERNAME}
password: ${DB_PASSWORD}

jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
show_sql: true
dialect: org.hibernate.dialect.MySQLDialect

logging.level:
org.hibernate.SQL: debug
---
spring.config.activate.on-profile: develop

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}

jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
hibernate:
ddl-auto: validate
format_sql: true
show-sql: true

logging.level:
org.hibernate.SQL: debug

---
spring.config.activate.on-profile: prod1
server.port: 8081

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${RDS_URL}
username: ${RDS_USERNAME}
password: ${RDS_PASSWORD}

jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
hibernate:
ddl-auto: validate

---
spring.config.activate.on-profile: prod2
server.port: 8082

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${RDS_URL}
username: ${RDS_USERNAME}
password: ${RDS_PASSWORD}

jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
hibernate:
ddl-auto: validate
6 changes: 3 additions & 3 deletions src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@
</encoder>
</appender>

<springProfile name="develop">
<springProfile name="local">
<property name="LOG_PATH" value="./logs"/>
<root level="INFO">
<appender-ref ref="DEFAULT_CONSOLE"/>
</root>
</springProfile>

<springProfile name="test">
<springProfile name="develop">
<property name="LOG_PATH" value="/app/logs"/>
<appender class="ch.qos.logback.core.rolling.RollingFileAppender"
name="TEST_JSON_FILE_INFO">
Expand Down Expand Up @@ -108,7 +108,7 @@
</root>
</springProfile>

<springProfile name="prod">
<springProfile name="prod1, prod2">
<property name="LOG_PATH" value="/home/ubuntu/SpringServer/logs"/>
<appender class="ch.qos.logback.core.rolling.RollingFileAppender"
name="PROD_JSON_FILE_INFO">
Expand Down
2 changes: 1 addition & 1 deletion test.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
FROM eclipse-temurin:11-jdk-jammy
EXPOSE 8080
ENTRYPOINT ["java","-Dspring.profiles.active=test","-jar","app.jar"]
ENTRYPOINT ["java","-Dspring.profiles.active=develop","-jar","app.jar"]
WORKDIR /app
COPY /build/libs/*.jar app.jar

0 comments on commit d64b6c0

Please sign in to comment.