diff --git a/.github/workflows/CI-CD_Pipeline.yml b/.github/workflows/CI-CD_Pipeline.yml index 510c5118..a59a7538 100644 --- a/.github/workflows/CI-CD_Pipeline.yml +++ b/.github/workflows/CI-CD_Pipeline.yml @@ -263,8 +263,7 @@ jobs: PROD_DATASOURCE_DRIVER=com.mysql.cj.jdbc.Driver PROD_DATASOURCE_USERNAME=root PROD_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} - # 추후 validate 변경 - PROD_JPA_HIBERNATE_DDL_AUTO=create + PROD_JPA_HIBERNATE_DDL_AUTO=none PROD_REDIS_HOST=redis PROD_REDIS_PORT=6379 @@ -274,7 +273,6 @@ jobs: PROD_QDRANT_PORT=6334 send_email_address=${{ secrets.SEND_EMAIL_ADDRESS }} - email_address=${{ secrets.EMAIL_ADDRESS }} send_email_password=${{ secrets.EMAIL_PASSWORD }} PROD_SENTRY_DSN=${{ secrets.SENTRY_DSN }} diff --git a/backend/src/main/java/com/ai/lawyer/global/initData/InitData.java b/backend/src/main/java/com/ai/lawyer/global/initData/InitData.java deleted file mode 100644 index 4d9392c2..00000000 --- a/backend/src/main/java/com/ai/lawyer/global/initData/InitData.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ai.lawyer.global.initData; - -import com.ai.lawyer.domain.member.entity.Member; -import com.ai.lawyer.domain.member.repositories.MemberRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Profile; -import org.springframework.core.annotation.Order; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@Component -@Order(1) -@Profile("!test") -@RequiredArgsConstructor -public class InitData implements ApplicationRunner { - - private final MemberRepository memberRepository; - private final PasswordEncoder passwordEncoder; - - @Override - @Transactional - public void run(ApplicationArguments args) { - makeAdmin(); - } - - @Transactional - void makeAdmin() { - long count = memberRepository.count(); - if (count > 0) { - log.info("InitData skipped: users count={}", count); - return; - } - - Member member = memberRepository.save( - Member.builder() - .loginId("admin@example.com") - .password(passwordEncoder.encode("1234")) - .age(30) - .gender(Member.Gender.FEMALE) - .name("admin") - .role(Member.Role.USER) - .build() - ); - - log.warn("=== Admin user created: {} ===", member.getLoginId()); - } -} \ No newline at end of file diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 1b4a1907..9fa2446d 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -133,4 +133,4 @@ custom: jwt: secretKey: ${CUSTOM_JWT_SECRET_KEY} accessToken: - expirationSeconds: ${CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS} \ No newline at end of file + expirationSeconds: ${CUSTOM_JWT_ACCESS_TOKEN_EXPIRATION_SECONDS} diff --git a/infra/.gitignore b/infra/.gitignore index 2989e5bb..6d796f56 100644 --- a/infra/.gitignore +++ b/infra/.gitignore @@ -4,4 +4,5 @@ terraform.tfstate terraform.tfstate.backup .terraform.tfstate.lock.info -secrets.tf \ No newline at end of file +secrets.tf +init/sql \ No newline at end of file diff --git a/infra/main.tf b/infra/main.tf index d5b928e8..59db81de 100644 --- a/infra/main.tf +++ b/infra/main.tf @@ -134,6 +134,47 @@ resource "aws_security_group" "sg_1" { } } +#S3 버킷 생성 +resource "aws_s3_bucket" "s3_bucket_1" { + bucket = "${var.prefix}-s3-bucket-1" + + force_destroy = true # 버킷 안에 객체가 있어도 삭제 가능 + + tags = { + Name = "${var.prefix}-s3-bucket-1" + } +} + +#S3 암호화방식 설정(SSE-S3 방식) +resource "aws_s3_bucket_server_side_encryption_configuration" "s3_encryption" { + bucket = aws_s3_bucket.s3_bucket_1.id + + rule { + apply_server_side_encryption_by_default { + sse_algorithm = "AES256" + } + } +} + +# SQL 파일을 S3에 업로드 +resource "aws_s3_object" "init_data_sql" { + bucket = aws_s3_bucket.s3_bucket_1.bucket + key = "init.sql" + source = "${path.module}/init/sql/init.sql" +} + +resource "aws_s3_object" "law_data_sql" { + bucket = aws_s3_bucket.s3_bucket_1.bucket + key = "lawData-dev.sql" + source = "${path.module}/init/sql/dev/lawData-dev.sql" +} + +resource "aws_s3_object" "precedent_data_sql" { + bucket = aws_s3_bucket.s3_bucket_1.bucket + key = "precedentData-dev.sql" + source = "${path.module}/init/sql/dev/precedentData-dev.sql" +} + # EC2 설정 시작 # EC2 역할 생성 @@ -237,15 +278,26 @@ docker run -d \ -e TZ=Asia/Seoul \ redis --requirepass ${var.password_1} + +# SQL 폴더 생성 +mkdir -p /home/ec2-user/app/init/sql/dev + +# S3에서 SQL 파일 다운로드 +aws s3 cp s3://${var.prefix}-s3-bucket-1/init.sql /home/ec2-user/app/init/sql/init.sql +aws s3 cp s3://${var.prefix}-s3-bucket-1/lawData-dev.sql /home/ec2-user/app/init/sql/dev/lawData-dev.sql +aws s3 cp s3://${var.prefix}-s3-bucket-1/precedentData-dev.sql /home/ec2-user/app/init/sql/dev/precedentData-dev.sql + # mysql 설치 docker run -d \ --name mysql \ --restart unless-stopped \ -v /dockerProjects/mysql/volumes/var/lib/mysql:/var/lib/mysql \ -v /dockerProjects/mysql/volumes/etc/mysql/conf.d:/etc/mysql/conf.d \ + -v /home/ec2-user/app/init/sql:/docker-entrypoint-initdb.d \ --network common \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=${var.password_1} \ + -e MYSQL_DATABASE=${var.app_1_db_name} \ -e TZ=Asia/Seoul \ mysql:latest @@ -258,18 +310,18 @@ done echo "MySQL이 준비됨. 초기화 스크립트 실행 중..." docker exec mysql mysql -uroot -p${var.password_1} -e " -CREATE USER 'lldjlocal'@'127.0.0.1' IDENTIFIED WITH caching_sha2_password BY '1234'; -CREATE USER 'lldjlocal'@'172.18.%.%' IDENTIFIED WITH caching_sha2_password BY '1234'; -CREATE USER 'lldj'@'%' IDENTIFIED WITH caching_sha2_password BY '${var.password_1}'; - -GRANT ALL PRIVILEGES ON *.* TO 'lldjlocal'@'127.0.0.1'; -GRANT ALL PRIVILEGES ON *.* TO 'lldjlocal'@'172.18.%.%'; -GRANT ALL PRIVILEGES ON *.* TO 'lldj'@'%'; + CREATE USER 'lldjlocal'@'127.0.0.1' IDENTIFIED WITH caching_sha2_password BY '1234'; + CREATE USER 'lldjlocal'@'172.18.%.%' IDENTIFIED WITH caching_sha2_password BY '1234'; + CREATE USER 'lldj'@'%' IDENTIFIED WITH caching_sha2_password BY '${var.password_1}'; -CREATE DATABASE \`${var.app_1_db_name}\`; + GRANT ALL PRIVILEGES ON *.* TO 'lldjlocal'@'127.0.0.1'; + GRANT ALL PRIVILEGES ON *.* TO 'lldjlocal'@'172.18.%.%'; + GRANT ALL PRIVILEGES ON *.* TO 'lldj'@'%'; -FLUSH PRIVILEGES; + FLUSH PRIVILEGES; " +docker exec -i mysql mysql -uroot -p${var.password_1} ${var.app_1_db_name} < /home/ec2-user/app/init/sql/dev/lawData-dev.sql +docker exec -i mysql mysql -uroot -p${var.password_1} ${var.app_1_db_name} < /home/ec2-user/app/init/sql/dev/precedentData-dev.sql # Qdrant 설치 docker run -d \ diff --git a/infra/variables.tf b/infra/variables.tf index 485a9c17..62411886 100644 --- a/infra/variables.tf +++ b/infra/variables.tf @@ -11,4 +11,4 @@ variable "prefix" { variable "app_1_domain" { description = "app_1 domain" default = "api.trybalaw.com" -} \ No newline at end of file +}