From 9925e895ae433cbcb2710860dad6bd32b0c6f018 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Fri, 4 Apr 2025 18:06:29 +0900 Subject: [PATCH 01/26] [Feat] integrated Docker Hub into CI pipeline --- .github/workflows/deploy.yml | 23 +++++++++++++++++++++++ Dockerfile | 3 +++ build.gradle | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 Dockerfile diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..bde4eaf --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,23 @@ +name: deploy + +on: + pull_request: + branches: [ main, develop ] + +jobs: + deploy-to-docker-hub: + needs: test + runs-on: ubuntu-latest + + steps: + - name: Build Docker image + run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . + + - name: DockerHub login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME}} + password: ${{ secrets.DOCKERHUB_PASSWORD}} + + - name: Push Docker image + run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..691a957 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM amazoncorretto:17 +COPY build/libs/app.jar app.jar +ENTRYPOINT ["java", "-jar", "/app.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 128ec84..2207567 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,18 @@ repositories { mavenCentral() } +springBoot { + mainClass = 'com.capstone.favicon.FaviconApplication' +} + +bootJar { + archiveFileName = 'app.jar' +} + +jar { + enabled = false +} + dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' From ce7f999d2ad6a837c85acdcdaa0f1c01dcb13bba Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Fri, 4 Apr 2025 18:16:28 +0900 Subject: [PATCH 02/26] [Refactor] merge files for better organization --- .../{pr-test.yml => build_and_deploy.yml} | 21 +++++++++++++++-- .github/workflows/deploy.yml | 23 ------------------- 2 files changed, 19 insertions(+), 25 deletions(-) rename .github/workflows/{pr-test.yml => build_and_deploy.yml} (50%) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/pr-test.yml b/.github/workflows/build_and_deploy.yml similarity index 50% rename from .github/workflows/pr-test.yml rename to .github/workflows/build_and_deploy.yml index cec07ce..05d4eef 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/build_and_deploy.yml @@ -1,4 +1,4 @@ -name: PR Build Test +name: PR Build Test and Deploy to DockerHub on: pull_request: @@ -27,4 +27,21 @@ jobs: - name: Build with Gradle run: | set -e - ./gradlew clean build \ No newline at end of file + ./gradlew clean build + + deploy-to-docker-hub: + needs: test + runs-on: ubuntu-latest + + steps: + - name: Build Docker image + run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . + + - name: DockerHub login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME}} + password: ${{ secrets.DOCKERHUB_PASSWORD}} + + - name: Push Docker image + run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index bde4eaf..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: deploy - -on: - pull_request: - branches: [ main, develop ] - -jobs: - deploy-to-docker-hub: - needs: test - runs-on: ubuntu-latest - - steps: - - name: Build Docker image - run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . - - - name: DockerHub login - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME}} - password: ${{ secrets.DOCKERHUB_PASSWORD}} - - - name: Push Docker image - run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon From 1af320dd22af48c108c14be788b8be40a53b6f57 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Fri, 4 Apr 2025 18:41:02 +0900 Subject: [PATCH 03/26] [Feat] add checkout code --- .github/workflows/build_and_deploy.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 05d4eef..fa24c06 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -34,6 +34,8 @@ jobs: runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 + - name: Build Docker image run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . From 71201808acf04033314ee7a6e27d48f71751a3ff Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Wed, 16 Apr 2025 17:27:22 +0900 Subject: [PATCH 04/26] [Feat] set up CI/CD pipeline on EC2 --- .github/workflows/build_and_deploy.yml | 48 +++++++++++++++- .gitignore | 1 + Dockerfile | 7 ++- build.gradle | 2 +- docker-compose.yml | 57 +++++++++++++++++++ .../capstone/favicon/aws/S3Controller.java | 9 ++- .../com/capstone/favicon/config/S3Config.java | 2 +- .../application/S3FileDownloadService.java | 2 +- .../resources/application-local.properties | 3 + .../resources/application-prod.properties | 3 + 10 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 docker-compose.yml create mode 100644 src/main/resources/application-local.properties create mode 100644 src/main/resources/application-prod.properties diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index fa24c06..0fb0928 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -1,11 +1,30 @@ name: PR Build Test and Deploy to DockerHub on: + push: + branches: [ main ] pull_request: branches: [ main, develop ] jobs: + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@4 + + - name: Set up Docker Compose + run: | + echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV + echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> $GITHUB_ENV + echo "AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}" >> $GITHUB_ENV + echo "RDS_HOSTNAME=${{ secrets.RDS_HOSTNAME }}" >> $GITHUB_ENV + echo "RDS_PASSWORD=${{ secrets.RDS_PASSWORD }}" >> $GITHUB_ENV + echo "RDS_PORT=${{ secrets.RDS_PORT }}" >> $GITHUB_ENV + echo "RDS_USERNAME=${{ secrets.RDS_USERNAME }}" >> $GITHUB_ENV + test: + needs: setup runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -27,9 +46,9 @@ jobs: - name: Build with Gradle run: | set -e - ./gradlew clean build + ./gradlew clean build -Dspring.profiles.active=local - deploy-to-docker-hub: + upload-to-docker-hub: needs: test runs-on: ubuntu-latest @@ -37,7 +56,11 @@ jobs: - uses: actions/checkout@v4 - name: Build Docker image - run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . + run: | + docker build \ + --build-arg SPRING_PROFILES_ACTIVE=local \ + -f Dockerfile \ + -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . - name: DockerHub login uses: docker/login-action@v2 @@ -47,3 +70,22 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon + + deploy-to-EC2: + needs: upload-to-docker-hub + runs-on: ubuntu-latest + + steps: + - name: Deploy to EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.EC2_HOST }} + username: favicon + key: ${{ secrets.EC2_SSH_KEY }} + script: | + export SPRING_PROFILES_ACTIVE=prod + sudo docker-compose stop + sudo docker-compose rm -f + sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/erica-favicon:latest + sudo docker-compose pull + sudo docker-compose up -d \ No newline at end of file diff --git a/.gitignore b/.gitignore index 27965e3..5031f54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Ignore security and cors configuration files /src/main/java/com/capstone/favicon/config/SecurityConfig.java /src/main/java/com/capstone/favicon/config/CorsConfig.java +/org HELP.md .gradle diff --git a/Dockerfile b/Dockerfile index 691a957..96d9439 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,8 @@ FROM amazoncorretto:17 + +ARG SPRING_PROFILES_ACTIVE=local +ENV SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE + COPY build/libs/app.jar app.jar -ENTRYPOINT ["java", "-jar", "/app.jar"] \ No newline at end of file + +ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "/app.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2207567..ea36581 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - runtimeOnly 'org.postgresql:postgresql:42.6.0' + implementation 'org.postgresql:postgresql:42.6.0' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' // lombok compileOnly 'org.projectlombok:lombok:1.18.28' diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3cb69e6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,57 @@ +services: + redis: + image: redis:latest + container_name: redis + ports: + - "6379:6379" + command: + - redis-server + networks: + - backend-network + + postgres: + image: postgres:latest + container_name: postgres + restart: always + environment: + POSTGRES_USER: favicon + POSTGRES_PASSWORD: favicon + POSTGRES_DB: favicon + POSTGRES_HOST_AUTH_METHOD: trust + ports: + - "5432:5432" + volumes: + - db-data:/var/lib/postgresql/data + networks: + - backend-network + + backend: + build: + context: . + dockerfile: Dockerfile + container_name: backend + ports: + - "8080:8080" + environment: + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_REGION=${AWS_REGION} + - AWS_S3_BUCKET=${AWS_S3_BUCKET} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - RDS_HOSTNAME=${RDS_HOSTNAME} + - RDS_PASSWORD=${RDS_PASSWORD} + - RDS_PORT=${RDS_PORT} + - RDS_USERNAME=${RDS_USERNAME} + - SPRING_REDIS_HOST=redis + - SPRING_REDIS_PORT=6379 + networks: + - backend-network + depends_on: + - postgres + - redis + +networks: + backend-network: + driver: bridge + +volumes: + db-data: \ No newline at end of file diff --git a/src/main/java/com/capstone/favicon/aws/S3Controller.java b/src/main/java/com/capstone/favicon/aws/S3Controller.java index f679340..9251d57 100644 --- a/src/main/java/com/capstone/favicon/aws/S3Controller.java +++ b/src/main/java/com/capstone/favicon/aws/S3Controller.java @@ -11,6 +11,7 @@ import com.capstone.favicon.aws.MetadataParser.DatasetMetadata; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -19,13 +20,19 @@ @RestController @RequestMapping("/s3") -@RequiredArgsConstructor public class S3Controller { private final S3Config s3Config; private final DatasetRepository datasetRepository; private final DatasetThemeRepository datasetThemeRepository; private final ResourceRepository resourceRepository; + public S3Controller(@Qualifier("s3Config") S3Config s3Config, DatasetRepository datasetRepository, DatasetThemeRepository datasetThemeRepository, ResourceRepository resourceRepository) { + this.s3Config = s3Config; + this.datasetRepository = datasetRepository; + this.datasetThemeRepository = datasetThemeRepository; + this.resourceRepository = resourceRepository; + } + @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { if (file.isEmpty() || file.getOriginalFilename() == null || file.getOriginalFilename().trim().isEmpty()) { diff --git a/src/main/java/com/capstone/favicon/config/S3Config.java b/src/main/java/com/capstone/favicon/config/S3Config.java index 08b7aea..39f78f5 100644 --- a/src/main/java/com/capstone/favicon/config/S3Config.java +++ b/src/main/java/com/capstone/favicon/config/S3Config.java @@ -25,7 +25,7 @@ public class S3Config { private String bucketName; public S3Config( - @Value("${aws.s3.region}") String region, + @Value("${AWS_REGION}") String region, @Value("${aws.s3.access-key}") String accessKey, @Value("${aws.s3.secret-key}") String secretKey) { this.region = region; diff --git a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java index 4ac221e..a073ce8 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java @@ -22,7 +22,7 @@ public class S3FileDownloadService extends S3Config { @Value("${aws.s3.bucket-name}") private String bucketName; - public S3FileDownloadService(@Value("${aws.s3.region}") String region, + public S3FileDownloadService(@Value("${AWS_REGION}") String region, @Value("${aws.s3.access-key}") String accessKey, @Value("${aws.s3.secret-key}") String secretKey) { super(region, accessKey, secretKey); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..0500d19 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,3 @@ +spring.datasource.url=jdbc:postgresql://postgres:5432/favicon +spring.datasource.username=favicon +spring.datasource.password=favicon \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties new file mode 100644 index 0000000..26ff5e1 --- /dev/null +++ b/src/main/resources/application-prod.properties @@ -0,0 +1,3 @@ +spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/favicon +spring.datasource.username=${RDS_USERNAME} +spring.datasource.password=${RDS_PASSWORD} \ No newline at end of file From 0dad17baf40c572be96cc2341c8f1c1fb75f946c Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Wed, 16 Apr 2025 17:31:50 +0900 Subject: [PATCH 05/26] [Refactor] change stage order in GitHub Actions --- .github/workflows/build_and_deploy.yml | 37 +++++++++++++------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 0fb0928..9b1e68b 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -7,24 +7,7 @@ on: branches: [ main, develop ] jobs: - setup: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@4 - - - name: Set up Docker Compose - run: | - echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV - echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> $GITHUB_ENV - echo "AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}" >> $GITHUB_ENV - echo "RDS_HOSTNAME=${{ secrets.RDS_HOSTNAME }}" >> $GITHUB_ENV - echo "RDS_PASSWORD=${{ secrets.RDS_PASSWORD }}" >> $GITHUB_ENV - echo "RDS_PORT=${{ secrets.RDS_PORT }}" >> $GITHUB_ENV - echo "RDS_USERNAME=${{ secrets.RDS_USERNAME }}" >> $GITHUB_ENV - test: - needs: setup runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -48,9 +31,25 @@ jobs: set -e ./gradlew clean build -Dspring.profiles.active=local - upload-to-docker-hub: + setup: needs: test runs-on: ubuntu-latest + steps: + - uses: actions/checkout@4 + - name: Set up Docker Compose + run: | + echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV + echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV + echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> $GITHUB_ENV + echo "AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}" >> $GITHUB_ENV + echo "RDS_HOSTNAME=${{ secrets.RDS_HOSTNAME }}" >> $GITHUB_ENV + echo "RDS_PASSWORD=${{ secrets.RDS_PASSWORD }}" >> $GITHUB_ENV + echo "RDS_PORT=${{ secrets.RDS_PORT }}" >> $GITHUB_ENV + echo "RDS_USERNAME=${{ secrets.RDS_USERNAME }}" >> $GITHUB_ENV + + upload-to-docker-hub: + needs: setup + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -86,6 +85,6 @@ jobs: export SPRING_PROFILES_ACTIVE=prod sudo docker-compose stop sudo docker-compose rm -f - sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/erica-favicon:latest + sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/erica-favicon:latest sudo docker-compose pull sudo docker-compose up -d \ No newline at end of file From 0b8b1a7868be1f4fd0d6dcf2d2daf8521c89f57f Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Mon, 28 Apr 2025 12:34:23 +0900 Subject: [PATCH 06/26] [Chore] injected variables using environment file --- .github/workflows/build_and_deploy.yml | 13 +++---------- .gitignore | 1 + 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 9b1e68b..60cdee3 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -34,18 +34,11 @@ jobs: setup: needs: test runs-on: ubuntu-latest + steps: - uses: actions/checkout@4 - - name: Set up Docker Compose - run: | - echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV - echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV - echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> $GITHUB_ENV - echo "AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}" >> $GITHUB_ENV - echo "RDS_HOSTNAME=${{ secrets.RDS_HOSTNAME }}" >> $GITHUB_ENV - echo "RDS_PASSWORD=${{ secrets.RDS_PASSWORD }}" >> $GITHUB_ENV - echo "RDS_PORT=${{ secrets.RDS_PORT }}" >> $GITHUB_ENV - echo "RDS_USERNAME=${{ secrets.RDS_USERNAME }}" >> $GITHUB_ENV + - name: Generate .env + run: echo "${{ secrets.ENV }}" > .env upload-to-docker-hub: needs: setup diff --git a/.gitignore b/.gitignore index 5031f54..251298e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /src/main/java/com/capstone/favicon/config/SecurityConfig.java /src/main/java/com/capstone/favicon/config/CorsConfig.java /org +.env HELP.md .gradle From 10f67c2aaab4c3723e219fc599ece5449c09bddb Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Mon, 28 Apr 2025 12:39:36 +0900 Subject: [PATCH 07/26] [Refactor] consolidated steps into a single step --- .github/workflows/build_and_deploy.yml | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 60cdee3..55b9ae8 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -7,7 +7,7 @@ on: branches: [ main, develop ] jobs: - test: + deployment: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -31,22 +31,9 @@ jobs: set -e ./gradlew clean build -Dspring.profiles.active=local - setup: - needs: test - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@4 - name: Generate .env run: echo "${{ secrets.ENV }}" > .env - upload-to-docker-hub: - needs: setup - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Build Docker image run: | docker build \ @@ -63,11 +50,6 @@ jobs: - name: Push Docker image run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon - deploy-to-EC2: - needs: upload-to-docker-hub - runs-on: ubuntu-latest - - steps: - name: Deploy to EC2 uses: appleboy/ssh-action@master with: From d5fb57c87c95ab7a88a23f53add12f95b7a948a7 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Mon, 28 Apr 2025 12:43:51 +0900 Subject: [PATCH 08/26] [Refacor] add Docker image tag --- .github/workflows/build_and_deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 55b9ae8..61fa64b 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -39,7 +39,7 @@ jobs: docker build \ --build-arg SPRING_PROFILES_ACTIVE=local \ -f Dockerfile \ - -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon . + -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon:latest . - name: DockerHub login uses: docker/login-action@v2 @@ -48,7 +48,7 @@ jobs: password: ${{ secrets.DOCKERHUB_PASSWORD}} - name: Push Docker image - run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon + run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon:latest - name: Deploy to EC2 uses: appleboy/ssh-action@master From 84a9479120a92371156dc1c7063a10c43047848c Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Mon, 28 Apr 2025 12:51:27 +0900 Subject: [PATCH 09/26] [Refactor] replace secrets with variables --- .github/workflows/build_and_deploy.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 61fa64b..b028b46 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -39,27 +39,27 @@ jobs: docker build \ --build-arg SPRING_PROFILES_ACTIVE=local \ -f Dockerfile \ - -t ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon:latest . + -t ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest . - name: DockerHub login uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKERHUB_USERNAME}} - password: ${{ secrets.DOCKERHUB_PASSWORD}} + username: ${{ vars.DOCKERHUB_USERNAME}} + password: ${{ vars.DOCKERHUB_PASSWORD}} - name: Push Docker image - run: docker push ${{ secrets.DOCKERHUB_USERNAME}}/erica-favicon:latest + run: docker push ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest - name: Deploy to EC2 uses: appleboy/ssh-action@master with: - host: ${{ secrets.EC2_HOST }} + host: ${{ vars.EC2_HOST }} username: favicon - key: ${{ secrets.EC2_SSH_KEY }} + key: ${{ vars.EC2_SSH_KEY }} script: | export SPRING_PROFILES_ACTIVE=prod sudo docker-compose stop sudo docker-compose rm -f - sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/erica-favicon:latest + sudo docker rmi ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest sudo docker-compose pull sudo docker-compose up -d \ No newline at end of file From 291c1e80506879586e511af654f39231612b7072 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Tue, 6 May 2025 17:57:39 +0900 Subject: [PATCH 10/26] [Fix] modifiy EC2 deployment code --- .github/workflows/build_and_deploy.yml | 9 +++-- .gitignore | 2 +- src/main/resources/application.properties | 44 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/application.properties diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index b028b46..23e38d6 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -58,8 +58,7 @@ jobs: key: ${{ vars.EC2_SSH_KEY }} script: | export SPRING_PROFILES_ACTIVE=prod - sudo docker-compose stop - sudo docker-compose rm -f - sudo docker rmi ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest - sudo docker-compose pull - sudo docker-compose up -d \ No newline at end of file + docker pull ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest + docker stop $(docker ps -a -q) + docker rmi ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest + docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/erica-favicon:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore index 251298e..3a5162a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /src/main/java/com/capstone/favicon/config/CorsConfig.java /org .env +*.pem HELP.md .gradle @@ -51,7 +52,6 @@ out/ ### ec2 ### favicon-key.pem -application.properties SecurityConfig.java requirement.txt 기상청_월별_processed.csv diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..a06969d --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,44 @@ +spring.application.name=Favicon + +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=${MAIL} +spring.mail.password=${MAIL_PW} +spring.mail.properties.mail.smtp.auth=ture +spring.mail.properties.mail.smtp.starttls.required=true + +spring.data.redis.host=redis +spring.data.redis.port=6379 + +# AWS +aws.s3.bucket-name=${AWS_S3_BUCKET} +aws.s3.region=${AWS_REGION} +aws.s3.access-key=${AWS_ACCESS_KEY_ID} +aws.s3.secret-key=${AWS_SECRET_ACCESS_KEY} + + +# DB +spring.profiles.active=local +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.datasource.driver-class-name=org.postgresql.Driver + +# tomcat UTF-8 +server.tomcat.uri-encoding=UTF-8 +server.servlet.encoding.charset=UTF-8 +server.servlet.encoding.enabled=true +server.servlet.encoding.force=true + +# api-docs +spring.api-docs.enabled=true +spring.api-docs.version=openapi_3_0 +spring.api-docs.packagesToScan=mokindang.jubging +spring.api-docs.path=/v3/api-docs + +# swagger +springdoc.default-consumes-media-type=application/json +springdoc.auto-tag-classes=true +springdoc.api-docs.groups.enabled=false +springdoc.swagger-ui.operations-sorter=method +springdoc.swagger-ui.path=/swagger-ui.html \ No newline at end of file From fda1d7a7f61a9f664185eab65947c37d11f01cc0 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Thu, 15 May 2025 00:00:24 +0900 Subject: [PATCH 11/26] [Refactor] create files listed in gitignore with echo --- .github/workflows/build_and_deploy.yml | 20 ++++++++++++++++++++ .gitignore | 3 +++ 2 files changed, 23 insertions(+) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 23e38d6..7ec3990 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -34,6 +34,26 @@ jobs: - name: Generate .env run: echo "${{ secrets.ENV }}" > .env + - name: Create config and properties files + run: | + mkdir -p ./src/main/java/com/capstone/favicon/config + cat < ./src/main/java/com/capstone/favicon/config/SecurityConfig.java + ${{ secrets.SECURITY_CONFIG }} + EOF + cat < ./src/main/java/com/capstone/favicon/config/CorsConfig.java + ${{ secrets.CORS_CONFIG }} + EOF + mkdir -p ./src/main/resources + cat < ./src/main/resources/application.properties + ${{ secrets.APP_PROPERTIES }} + EOF + cat < ./src/main/resources/application-local.properties + ${{ secrets.APP_LOCAL_PROPERTIES }} + EOF + cat < ./src/main/resources/application-prod.properties + ${{ secrets.APP_PROD_PROPERTIES }} + EOF + - name: Build Docker image run: | docker build \ diff --git a/.gitignore b/.gitignore index 3a5162a..b3aab2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Ignore security and cors configuration files /src/main/java/com/capstone/favicon/config/SecurityConfig.java /src/main/java/com/capstone/favicon/config/CorsConfig.java +/src/main/resources/application.properties +/src/main/resources/application-local.properties +/src/main/resources/application-prod.properties /org .env *.pem From bd9f81b283f85c8ee3507094f08b97b80dc31468 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Thu, 15 May 2025 00:32:12 +0900 Subject: [PATCH 12/26] [Refacor] change to use existing image instead of build --- docker-compose.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3cb69e6..c38f399 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,9 +26,7 @@ services: - backend-network backend: - build: - context: . - dockerfile: Dockerfile + image: 211i2/erica-backend:latest container_name: backend ports: - "8080:8080" From eb51d40e0fe6d2c8fb654577447b4cbbc3709e36 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 17:17:38 +0900 Subject: [PATCH 13/26] [Refactor] use git secrets --- .github/workflows/build_and_deploy.yml | 43 ++----------------- .gitignore | 5 --- .../capstone/favicon/config/CorsConfig.java | 25 +++++++++++ .../com/capstone/favicon/config/S3Config.java | 2 +- .../resources/application-prod.properties | 6 +-- src/main/resources/application.properties | 12 +++--- 6 files changed, 39 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/capstone/favicon/config/CorsConfig.java diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 7ec3990..be5b84b 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -7,7 +7,7 @@ on: branches: [ main, develop ] jobs: - deployment: + build-and-push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -31,33 +31,10 @@ jobs: set -e ./gradlew clean build -Dspring.profiles.active=local - - name: Generate .env - run: echo "${{ secrets.ENV }}" > .env - - - name: Create config and properties files - run: | - mkdir -p ./src/main/java/com/capstone/favicon/config - cat < ./src/main/java/com/capstone/favicon/config/SecurityConfig.java - ${{ secrets.SECURITY_CONFIG }} - EOF - cat < ./src/main/java/com/capstone/favicon/config/CorsConfig.java - ${{ secrets.CORS_CONFIG }} - EOF - mkdir -p ./src/main/resources - cat < ./src/main/resources/application.properties - ${{ secrets.APP_PROPERTIES }} - EOF - cat < ./src/main/resources/application-local.properties - ${{ secrets.APP_LOCAL_PROPERTIES }} - EOF - cat < ./src/main/resources/application-prod.properties - ${{ secrets.APP_PROD_PROPERTIES }} - EOF - - name: Build Docker image run: | docker build \ - --build-arg SPRING_PROFILES_ACTIVE=local \ + --build-arg SPRING_PROFILES_ACTIVE=prob \ -f Dockerfile \ -t ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest . @@ -68,17 +45,5 @@ jobs: password: ${{ vars.DOCKERHUB_PASSWORD}} - name: Push Docker image - run: docker push ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest - - - name: Deploy to EC2 - uses: appleboy/ssh-action@master - with: - host: ${{ vars.EC2_HOST }} - username: favicon - key: ${{ vars.EC2_SSH_KEY }} - script: | - export SPRING_PROFILES_ACTIVE=prod - docker pull ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest - docker stop $(docker ps -a -q) - docker rmi ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest - docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/erica-favicon:latest \ No newline at end of file + run: | + docker push ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest \ No newline at end of file diff --git a/.gitignore b/.gitignore index b3aab2e..f5e0f0b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ # Ignore security and cors configuration files -/src/main/java/com/capstone/favicon/config/SecurityConfig.java -/src/main/java/com/capstone/favicon/config/CorsConfig.java -/src/main/resources/application.properties -/src/main/resources/application-local.properties -/src/main/resources/application-prod.properties /org .env *.pem diff --git a/src/main/java/com/capstone/favicon/config/CorsConfig.java b/src/main/java/com/capstone/favicon/config/CorsConfig.java new file mode 100644 index 0000000..76357ce --- /dev/null +++ b/src/main/java/com/capstone/favicon/config/CorsConfig.java @@ -0,0 +1,25 @@ +package com.capstone.favicon.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +@Configuration +public class CorsConfig { + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowCredentials(true); + configuration.addAllowedOrigin("http://localhost:3000"); + configuration.addAllowedOrigin("http://127.0.0.1:3000"); + configuration.addAllowedHeader("*"); + configuration.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", configuration); + return new CorsFilter(source); + } + +} \ No newline at end of file diff --git a/src/main/java/com/capstone/favicon/config/S3Config.java b/src/main/java/com/capstone/favicon/config/S3Config.java index 39f78f5..08b7aea 100644 --- a/src/main/java/com/capstone/favicon/config/S3Config.java +++ b/src/main/java/com/capstone/favicon/config/S3Config.java @@ -25,7 +25,7 @@ public class S3Config { private String bucketName; public S3Config( - @Value("${AWS_REGION}") String region, + @Value("${aws.s3.region}") String region, @Value("${aws.s3.access-key}") String accessKey, @Value("${aws.s3.secret-key}") String secretKey) { this.region = region; diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 26ff5e1..894ba54 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,3 +1,3 @@ -spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/favicon -spring.datasource.username=${RDS_USERNAME} -spring.datasource.password=${RDS_PASSWORD} \ No newline at end of file +spring.datasource.url=jdbc:postgresql://${{ secrets.RDS_HOSTNAME }}:${{ secrets.RDS_PORT}}/favicon +spring.datasource.username=${{ secrets.RDS_USERNAME }} +spring.datasource.password=${{ secrets.RDS_PASSWORD }} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a06969d..52345af 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,8 +2,8 @@ spring.application.name=Favicon spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=${MAIL} -spring.mail.password=${MAIL_PW} +spring.mail.username=${{ secrets.MAIL }} +spring.mail.password=${{ secrets.MAIL_PW }} spring.mail.properties.mail.smtp.auth=ture spring.mail.properties.mail.smtp.starttls.required=true @@ -11,10 +11,10 @@ spring.data.redis.host=redis spring.data.redis.port=6379 # AWS -aws.s3.bucket-name=${AWS_S3_BUCKET} -aws.s3.region=${AWS_REGION} -aws.s3.access-key=${AWS_ACCESS_KEY_ID} -aws.s3.secret-key=${AWS_SECRET_ACCESS_KEY} +aws.s3.bucket-name=${{ secrets.AWS_S3_BUCKET }} +aws.s3.region=${{ secrets.AWS_REGION }} +aws.s3.access-key=${ secrets.{AWS_ACCESS_KEY_ID }} +aws.s3.secret-key=${{ secrets.AWS_SECRET_ACCESS_KEY }} # DB From 2df5749e69d1f0e78de0a0e620daf11dc3230a44 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 17:18:48 +0900 Subject: [PATCH 14/26] [Refactor] refactor .gitignore --- .gitignore | 1 - .../favicon/config/SecurityConfig.java | 48 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/capstone/favicon/config/SecurityConfig.java diff --git a/.gitignore b/.gitignore index f5e0f0b..1415df9 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,6 @@ out/ ### ec2 ### favicon-key.pem -SecurityConfig.java requirement.txt 기상청_월별_processed.csv 기후_감기_건강보험심사평가원.csv diff --git a/src/main/java/com/capstone/favicon/config/SecurityConfig.java b/src/main/java/com/capstone/favicon/config/SecurityConfig.java new file mode 100644 index 0000000..87528ae --- /dev/null +++ b/src/main/java/com/capstone/favicon/config/SecurityConfig.java @@ -0,0 +1,48 @@ +package com.capstone.favicon.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfig { + + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http .csrf(AbstractHttpConfigurer::disable) + .httpBasic(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .logout(AbstractHttpConfigurer::disable) + .sessionManagement( + authorize -> authorize + .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests( + authorize -> authorize + .requestMatchers( + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html", + "/users/**" + ).permitAll() + .anyRequest().authenticated() + ); + + return http.build(); + } + +} \ No newline at end of file From f271fd116a4dad10039717056c3be3ec18463bbd Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 17:31:01 +0900 Subject: [PATCH 15/26] [Refactor] fix spelling error --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 52345af..ab106fb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,7 +13,7 @@ spring.data.redis.port=6379 # AWS aws.s3.bucket-name=${{ secrets.AWS_S3_BUCKET }} aws.s3.region=${{ secrets.AWS_REGION }} -aws.s3.access-key=${ secrets.{AWS_ACCESS_KEY_ID }} +aws.s3.access-key=${{ secrets.AWS_ACCESS_KEY_ID }} aws.s3.secret-key=${{ secrets.AWS_SECRET_ACCESS_KEY }} From 967c196b0ab95fb7afcf8f05cfee2345365b4985 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 18:44:44 +0900 Subject: [PATCH 16/26] [Refactor] remove default application option --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 96d9439..5adca33 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM amazoncorretto:17 -ARG SPRING_PROFILES_ACTIVE=local +ARG SPRING_PROFILES_ACTIVE ENV SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE COPY build/libs/app.jar app.jar From a8722172ca592a231d0d930f4f5d91112130f4bc Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 19:19:38 +0900 Subject: [PATCH 17/26] [Refactor] remove default application option --- docker-compose.yml | 31 ----------------------- src/main/resources/application.properties | 1 - 2 files changed, 32 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c38f399..a5a7b62 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,47 +9,16 @@ services: networks: - backend-network - postgres: - image: postgres:latest - container_name: postgres - restart: always - environment: - POSTGRES_USER: favicon - POSTGRES_PASSWORD: favicon - POSTGRES_DB: favicon - POSTGRES_HOST_AUTH_METHOD: trust - ports: - - "5432:5432" - volumes: - - db-data:/var/lib/postgresql/data - networks: - - backend-network - backend: image: 211i2/erica-backend:latest container_name: backend ports: - "8080:8080" - environment: - - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - - AWS_REGION=${AWS_REGION} - - AWS_S3_BUCKET=${AWS_S3_BUCKET} - - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - - RDS_HOSTNAME=${RDS_HOSTNAME} - - RDS_PASSWORD=${RDS_PASSWORD} - - RDS_PORT=${RDS_PORT} - - RDS_USERNAME=${RDS_USERNAME} - - SPRING_REDIS_HOST=redis - - SPRING_REDIS_PORT=6379 networks: - backend-network depends_on: - - postgres - redis networks: backend-network: driver: bridge - -volumes: - db-data: \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ab106fb..56748e4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -18,7 +18,6 @@ aws.s3.secret-key=${{ secrets.AWS_SECRET_ACCESS_KEY }} # DB -spring.profiles.active=local spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true From a24cf2ad4dfc13e09f71734b0d345fe30146702f Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 22:39:04 +0900 Subject: [PATCH 18/26] [Refactor] change github secrets to use env file --- .../favicon/config/SecurityConfig.java | 56 +++++++++---------- .../resources/application-prod.properties | 6 +- src/main/resources/application.properties | 12 ++-- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/capstone/favicon/config/SecurityConfig.java b/src/main/java/com/capstone/favicon/config/SecurityConfig.java index 87528ae..8165375 100644 --- a/src/main/java/com/capstone/favicon/config/SecurityConfig.java +++ b/src/main/java/com/capstone/favicon/config/SecurityConfig.java @@ -1,48 +1,42 @@ package com.capstone.favicon.config; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity -@RequiredArgsConstructor public class SecurityConfig { - - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http .csrf(AbstractHttpConfigurer::disable) - .httpBasic(AbstractHttpConfigurer::disable) - .formLogin(AbstractHttpConfigurer::disable) - .logout(AbstractHttpConfigurer::disable) - .sessionManagement( - authorize -> authorize - .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .authorizeHttpRequests( - authorize -> authorize - .requestMatchers( - "/v3/api-docs/**", - "/swagger-ui/**", - "/swagger-ui.html", - "/users/**" - ).permitAll() - .anyRequest().authenticated() - ); + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf((csrfConfig) -> + csrfConfig.disable() + ) + .authorizeHttpRequests(authorize -> authorize + .requestMatchers("/users/email-check", "/users/code-check", "users/register", + "/notice/create", "/notice/list", "/notice/{noticeId}", "/notice/view/{noticeId}", "/faq/create", "faq/{faqId}", + "/data-set/filter", "/data-set/count","/data-set/ratio", "/data-set/incrementDownload/{datasetId}", "/data-set/top10", + "/data-set/theme", "/data-set/{datasetId}", "/data-set/category/{themeId}", "/data-set/filter", "/faq/list", "faq/{faqId}", + "/users/login", "/users/logout", "/users/admin-check", "/s3/upload", "/s3/delete/{resourceId}", + "/users/delete-account", "/users/session-check", "/data-set", "/request/list","/request/list/{requestId}/review", "/request/{requestId}","/request/question", + "/request/question/{questionId}", "/request/answer", "/request/answer/{answerId}","/data-set/search-sorted", "/data-set/search-sorted/{category}", + "/trend/**", + "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", "/data-set/download/{datasetId}", "/data-set/group-by-theme", "/region").permitAll() + .anyRequest().authenticated() + ) + .httpBasic(httpBasic -> httpBasic.disable()) + .formLogin(formLogin -> formLogin.disable()) + .sessionManagement(session -> session + .sessionFixation().migrateSession() + .maximumSessions(1) + ) + .addFilterBefore(new Utf8Filter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } - } \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 894ba54..15b637a 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,3 +1,3 @@ -spring.datasource.url=jdbc:postgresql://${{ secrets.RDS_HOSTNAME }}:${{ secrets.RDS_PORT}}/favicon -spring.datasource.username=${{ secrets.RDS_USERNAME }} -spring.datasource.password=${{ secrets.RDS_PASSWORD }} \ No newline at end of file +spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}}:${RDS_PORT}/favicon +spring.datasource.username=${RDS_USERNAME} +spring.datasource.password=${RDS_PASSWORD} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 56748e4..08541f3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,8 +2,8 @@ spring.application.name=Favicon spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=${{ secrets.MAIL }} -spring.mail.password=${{ secrets.MAIL_PW }} +spring.mail.username=${MAIL } +spring.mail.password=${MAIL_PW} spring.mail.properties.mail.smtp.auth=ture spring.mail.properties.mail.smtp.starttls.required=true @@ -11,10 +11,10 @@ spring.data.redis.host=redis spring.data.redis.port=6379 # AWS -aws.s3.bucket-name=${{ secrets.AWS_S3_BUCKET }} -aws.s3.region=${{ secrets.AWS_REGION }} -aws.s3.access-key=${{ secrets.AWS_ACCESS_KEY_ID }} -aws.s3.secret-key=${{ secrets.AWS_SECRET_ACCESS_KEY }} +aws.s3.bucket-name=${AWS_S3_BUCKET} +aws.s3.region=${AWS_REGION} +aws.s3.access-key=${AWS_ACCESS_KEY_ID} +aws.s3.secret-key=${AWS_SECRET_ACCESS_KEY} # DB From 349b59d1b915716452906cbe2e850c853d67c30f Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 17 May 2025 22:52:03 +0900 Subject: [PATCH 19/26] [Refactor] fix spelling error --- src/main/resources/application-prod.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 15b637a..c4bae15 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,3 +1,3 @@ -spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}}:${RDS_PORT}/favicon +spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/favicon_db spring.datasource.username=${RDS_USERNAME} spring.datasource.password=${RDS_PASSWORD} \ No newline at end of file From 9666e777a8fd1b4996af4107162e78e3151bc717 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sun, 18 May 2025 13:13:34 +0900 Subject: [PATCH 20/26] [Refactor] edit environment variables --- Dockerfile | 10 ++++------ .../application/S3FileDownloadService.java | 2 +- src/main/resources/application-local.properties | 3 --- src/main/resources/application-prod.properties | 3 --- src/main/resources/application.properties | 15 +++++++++------ 5 files changed, 14 insertions(+), 19 deletions(-) delete mode 100644 src/main/resources/application-local.properties delete mode 100644 src/main/resources/application-prod.properties diff --git a/Dockerfile b/Dockerfile index 5adca33..b2bbc88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,6 @@ FROM amazoncorretto:17 - -ARG SPRING_PROFILES_ACTIVE -ENV SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE - +RUN yum update -y && \ + yum install -y python3 && \ + yum clean all COPY build/libs/app.jar app.jar - -ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "-jar", "/app.jar"] \ No newline at end of file +ENTRYPOINT ["java", "-jar", "/app.jar"] \ No newline at end of file diff --git a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java index a073ce8..4ac221e 100644 --- a/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java +++ b/src/main/java/com/capstone/favicon/dataset/application/S3FileDownloadService.java @@ -22,7 +22,7 @@ public class S3FileDownloadService extends S3Config { @Value("${aws.s3.bucket-name}") private String bucketName; - public S3FileDownloadService(@Value("${AWS_REGION}") String region, + public S3FileDownloadService(@Value("${aws.s3.region}") String region, @Value("${aws.s3.access-key}") String accessKey, @Value("${aws.s3.secret-key}") String secretKey) { super(region, accessKey, secretKey); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties deleted file mode 100644 index 0500d19..0000000 --- a/src/main/resources/application-local.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.datasource.url=jdbc:postgresql://postgres:5432/favicon -spring.datasource.username=favicon -spring.datasource.password=favicon \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties deleted file mode 100644 index c4bae15..0000000 --- a/src/main/resources/application-prod.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/favicon_db -spring.datasource.username=${RDS_USERNAME} -spring.datasource.password=${RDS_PASSWORD} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 08541f3..75597d8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,8 +2,8 @@ spring.application.name=Favicon spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=${MAIL } -spring.mail.password=${MAIL_PW} +spring.mail.username=${SPRING_MAIL_USERNAME} +spring.mail.password=${SPRING_MAIL_PASSWORD} spring.mail.properties.mail.smtp.auth=ture spring.mail.properties.mail.smtp.starttls.required=true @@ -12,13 +12,16 @@ spring.data.redis.port=6379 # AWS aws.s3.bucket-name=${AWS_S3_BUCKET} -aws.s3.region=${AWS_REGION} -aws.s3.access-key=${AWS_ACCESS_KEY_ID} -aws.s3.secret-key=${AWS_SECRET_ACCESS_KEY} +aws.s3.region=${AWS_S3_REGION} +aws.s3.access-key=${AWS_S3_ACCESS_KEY_ID} +aws.s3.secret-key=${AWS_S3_SECRET_ACCESS_KEY} # DB -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.datasource.url=${SPRING_RDS_URL} +spring.datasource.username=${SPRING_RDS_USERNAME} +spring.datasource.password=${SPRING_RDS_PASSWORD} + spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.datasource.driver-class-name=org.postgresql.Driver From 862ee9b77768c1023e6485af93ed289582b60efe Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sun, 18 May 2025 14:00:31 +0900 Subject: [PATCH 21/26] [Refactor] edit security config --- src/main/java/com/capstone/favicon/config/SecurityConfig.java | 4 ++-- src/main/resources/application.properties | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/capstone/favicon/config/SecurityConfig.java b/src/main/java/com/capstone/favicon/config/SecurityConfig.java index 8165375..f68f294 100644 --- a/src/main/java/com/capstone/favicon/config/SecurityConfig.java +++ b/src/main/java/com/capstone/favicon/config/SecurityConfig.java @@ -25,8 +25,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/users/login", "/users/logout", "/users/admin-check", "/s3/upload", "/s3/delete/{resourceId}", "/users/delete-account", "/users/session-check", "/data-set", "/request/list","/request/list/{requestId}/review", "/request/{requestId}","/request/question", "/request/question/{questionId}", "/request/answer", "/request/answer/{answerId}","/data-set/search-sorted", "/data-set/search-sorted/{category}", - "/trend/**", - "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", "/data-set/download/{datasetId}", "/data-set/group-by-theme", "/region").permitAll() + "/trend/**", "data-set/group-by-theme", "/region", "/analysis", + "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", "/data-set/download/{datasetId}").permitAll() .anyRequest().authenticated() ) .httpBasic(httpBasic -> httpBasic.disable()) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 75597d8..a60a6a6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -22,6 +22,7 @@ spring.datasource.url=${SPRING_RDS_URL} spring.datasource.username=${SPRING_RDS_USERNAME} spring.datasource.password=${SPRING_RDS_PASSWORD} +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgresSQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.datasource.driver-class-name=org.postgresql.Driver From 1ffef68c61178dea6374735a3d9701c2deaa6f99 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 24 May 2025 14:47:14 +0900 Subject: [PATCH 22/26] [Refactor] make not to run it in pr --- .github/workflows/build_and_deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index be5b84b..90159e3 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -2,8 +2,6 @@ name: PR Build Test and Deploy to DockerHub on: push: - branches: [ main ] - pull_request: branches: [ main, develop ] jobs: From aac35124348c5e2fa353fa135bd2f718b7c09050 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 24 May 2025 15:51:49 +0900 Subject: [PATCH 23/26] [Feat] cd to ec2 --- .github/workflows/build_and_deploy.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 90159e3..538b380 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -3,6 +3,8 @@ name: PR Build Test and Deploy to DockerHub on: push: branches: [ main, develop ] + pull_request: + branches: [ main, develop ] jobs: build-and-push: @@ -44,4 +46,15 @@ jobs: - name: Push Docker image run: | - docker push ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest \ No newline at end of file + docker push ${{ vars.DOCKERHUB_USERNAME}}/erica-favicon:latest + + - name: Deploy to EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.EC2_HOST }} + username: ubuntu + key: ${{ secrets.EC2_SSH_KEY }} + script: | + docker pull ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest + docker rm -f back 2>/dev/null || true + docker run --name front -d -p 80:3000 ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest \ No newline at end of file From daddda617492fb19d1ea51349372a4806d5074c3 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 24 May 2025 15:56:01 +0900 Subject: [PATCH 24/26] refactor: modify the docker run command --- .github/workflows/build_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 538b380..9782374 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -57,4 +57,4 @@ jobs: script: | docker pull ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest docker rm -f back 2>/dev/null || true - docker run --name front -d -p 80:3000 ${{ vars.DOCKERHUB_USERNAME }}/erica-favicon:latest \ No newline at end of file + docker compose -f docker-compose.yml --env-file .env up --build -d \ No newline at end of file From 0f3c5b76258549ded044d8ed1443262ec8d76445 Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 24 May 2025 16:01:18 +0900 Subject: [PATCH 25/26] [Refactor] remove test code and typo correction --- .github/workflows/build_and_deploy.yml | 2 -- src/main/resources/application.properties | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 9782374..24a312f 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -3,8 +3,6 @@ name: PR Build Test and Deploy to DockerHub on: push: branches: [ main, develop ] - pull_request: - branches: [ main, develop ] jobs: build-and-push: diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a60a6a6..5d8ed83 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,8 +21,7 @@ aws.s3.secret-key=${AWS_S3_SECRET_ACCESS_KEY} spring.datasource.url=${SPRING_RDS_URL} spring.datasource.username=${SPRING_RDS_USERNAME} spring.datasource.password=${SPRING_RDS_PASSWORD} - -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgresSQLDialect +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.datasource.driver-class-name=org.postgresql.Driver From 0cd5542e556cc1f9bd93a7b4036aa9717514ad1b Mon Sep 17 00:00:00 2001 From: je0ng3 Date: Sat, 24 May 2025 16:23:25 +0900 Subject: [PATCH 26/26] [Refactor] make different test environments when pr or push --- .github/workflows/build_and_deploy.yml | 2 +- .github/workflows/build_test.yml | 30 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build_test.yml diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 24a312f..c0f2097 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -1,4 +1,4 @@ -name: PR Build Test and Deploy to DockerHub +name: Deploy to DockerHub & EC2 on: push: diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml new file mode 100644 index 0000000..38ccd1e --- /dev/null +++ b/.github/workflows/build_test.yml @@ -0,0 +1,30 @@ +name: PR Build TEST + +on: + pull_request: + branches: [ main, develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 + with: + cache-read-only: false + + - name: Grant Execute Permission For Gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: | + set -e + ./gradlew clean build -Dspring.profiles.active=local