diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml new file mode 100644 index 0000000..df08433 --- /dev/null +++ b/.github/workflows/deploy-dev.yml @@ -0,0 +1,74 @@ +name: CD - DEV + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Build and Push Docker Image + run: | + docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/gdgoc-be-app-dev:latest . + docker push ${{ secrets.DOCKER_HUB_USERNAME }}/gdgoc-be-app-dev:latest + + - name: move files to Root + run: | + cp gdgoc/docker-compose-dev.yml ./docker-compose-dev.yml + cp gdgoc/deploy.dev.sh ./deploy.dev.sh + cp gdgoc/appspec.dev.yml ./appspec.yml + + - name: Create Deployment Package + run: | + echo "DOCKER_HUB_USERNAME=${{ secrets.DOCKER_HUB_USERNAME }}" > .env + echo "DB_HOST=${{ secrets.DB_HOST }}" >> .env + echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env + echo "DB_NAME_DEV=${{ secrets.DB_NAME_DEV }}" >> .env + echo "DB_USERNAME=${{ secrets.DB_USERNAME }}" >> .env + echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env + echo "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}" >> .env + echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}" >> .env + echo "GOOGLE_REDIRECT_URI=${{ secrets.GOOGLE_REDIRECT_URI }}" >> .env + echo "GOOGLE_ISSUER=${{secrets.GOOGLE_ISSUER}}" >> .env + echo "SELF_ISSUER=${{secrets.SELF_ISSUER}}" >> .env + echo "SECRET_KEY=${{secrets.SECRET_KEY}}" >> .env + echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> .env + echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .env + echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> .env + echo "AWS_RESOURCE_BUCKET=${{secrets.AWS_RESOURCE_BUCKET}}" >> .env + echo "AWS_TEST_RESOURCE_BUCKET=${{secrets.AWS_TEST_RESOURCE_BUCKET}}" >> .env + echo "GMAIL=${{secrets.GMAIL}}" >> .env + echo "GMAIL_PASSWORD=${{secrets.GMAIL_PASSWORD}}" >> .env + echo "DOZZLE_USERNAME=${{ secrets.DOZZLE_USERNAME }}" >> .env + echo "DOZZLE_PASSWORD=${{ secrets.DOZZLE_PASSWORD }}" >> .env + + zip -r deploy.zip .env docker-compose-dev.yml deploy.dev.sh appspec.yml + + - name: Configure AWS credentials + run: | + aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }} + aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws configure set region ${{ secrets.AWS_REGION }} + + - name: Upload Deployment Package to S3 + run: | + aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_BUCKET }}/deploy-dev.zip + + - name: Deploy to AWS CodeDeploy + run: | + aws deploy create-deployment \ + --application-name ${{ secrets.AWS_CODEDEPLOY_APP }} \ + --deployment-group-name ${{ secrets.AWS_CODEDEPLOY_GROUP_DEV }} \ + --s3-location bucket=${{ secrets.AWS_S3_BUCKET }},bundleType=zip,key=deploy-dev.zip diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy-prod.yml similarity index 84% rename from .github/workflows/deploy.yml rename to .github/workflows/deploy-prod.yml index 8173d5b..7a1e538 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy-prod.yml @@ -1,4 +1,4 @@ -name: Deploy to EC2 via Docker Hub and CodeDeploy +name: CD - PROD on: push: @@ -11,10 +11,10 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Log in to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} @@ -26,9 +26,9 @@ jobs: - name: move files to Root run: | - cp gdgoc/docker-compose.yml ./docker-compose.yml - cp gdgoc/deploy.sh ./deploy.sh - cp gdgoc/appspec.yml ./appspec.yml + cp gdgoc/docker-compose-prod.yml ./docker-compose-prod.yml + cp gdgoc/deploy.prod.sh ./deploy.prod.sh + cp gdgoc/appspec.prod.yml ./appspec.yml - name: Create Deployment Package run: | @@ -51,8 +51,10 @@ jobs: echo "AWS_TEST_RESOURCE_BUCKET=${{secrets.AWS_TEST_RESOURCE_BUCKET}}" >> .env echo "GMAIL=${{secrets.GMAIL}}" >> .env echo "GMAIL_PASSWORD=${{secrets.GMAIL_PASSWORD}}" >> .env + echo "DOZZLE_USERNAME=${{ secrets.DOZZLE_USERNAME }}" >> .env + echo "DOZZLE_PASSWORD=${{ secrets.DOZZLE_PASSWORD }}" >> .env - zip -r deploy.zip .env docker-compose.yml deploy.sh appspec.yml + zip -r deploy.zip .env docker-compose-prod.yml deploy.prod.sh appspec.yml - name: Configure AWS credentials run: | diff --git a/gdgoc/appspec.dev.yml b/gdgoc/appspec.dev.yml new file mode 100644 index 0000000..e12a7a4 --- /dev/null +++ b/gdgoc/appspec.dev.yml @@ -0,0 +1,11 @@ +version: 0.0 +os: linux +files: + - source: / + destination: /home/ubuntu/gdgoc-be-app-dev + +hooks: + AfterInstall: + - location: deploy.dev.sh + timeout: 300 + runas: root diff --git a/gdgoc/appspec.yml b/gdgoc/appspec.prod.yml similarity index 82% rename from gdgoc/appspec.yml rename to gdgoc/appspec.prod.yml index 472b7b4..f372750 100644 --- a/gdgoc/appspec.yml +++ b/gdgoc/appspec.prod.yml @@ -6,6 +6,6 @@ files: hooks: AfterInstall: - - location: deploy.sh + - location: deploy.prod.sh timeout: 300 runas: root diff --git a/gdgoc/deploy.dev.sh b/gdgoc/deploy.dev.sh new file mode 100644 index 0000000..d6e6099 --- /dev/null +++ b/gdgoc/deploy.dev.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# shellcheck disable=SC2164 +cd /home/ubuntu/gdgoc-be-app-dev + +# Docker & Docker Compose가 설치되어 있는지 확인 +if ! [ -x "$(command -v docker)" ]; then + echo "Docker가 설치되어 있지 않습니다. 설치 중..." + sudo apt update + sudo apt install -y docker.io + sudo systemctl start docker + sudo systemctl enable docker + echo "Docker 설치 완료" +fi + +if ! [ -x "$(command -v docker-compose)" ]; then + echo "Docker Compose가 설치되어 있지 않습니다. 설치 중..." + sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + echo "Docker Compose 설치 완료" +fi + +# 기존 컨테이너 중지 및 삭제 +docker-compose -f docker-compose-dev.yml down + +# 사용되지 않는 컨테이너, 이미지, 네트워크, 볼륨 정리 +docker system prune -af + +# 불필요한 Docker 볼륨도 정리 (옵션) +docker volume prune -f + +# 최신 이미지 가져오기 +# shellcheck disable=SC2046 +export $(grep -v '^#' .env | xargs) +# shellcheck disable=SC2086 +docker pull ${DOCKER_HUB_USERNAME}/gdgoc-be-app-dev:latest + +# 컨테이너 실행 +docker-compose -f docker-compose-dev.yml --env-file .env up -d \ No newline at end of file diff --git a/gdgoc/deploy.sh b/gdgoc/deploy.prod.sh similarity index 84% rename from gdgoc/deploy.sh rename to gdgoc/deploy.prod.sh index 9d25475..3f492dd 100644 --- a/gdgoc/deploy.sh +++ b/gdgoc/deploy.prod.sh @@ -1,4 +1,5 @@ #!/bin/bash +# shellcheck disable=SC2164 cd /home/ubuntu/gdgoc-be-app # Docker & Docker Compose가 설치되어 있는지 확인 @@ -19,7 +20,7 @@ if ! [ -x "$(command -v docker-compose)" ]; then fi # 기존 컨테이너 중지 및 삭제 -docker-compose down +docker-compose -f docker-compose-prod.yml down # 사용되지 않는 컨테이너, 이미지, 네트워크, 볼륨 정리 docker system prune -af @@ -28,8 +29,10 @@ docker system prune -af docker volume prune -f # 최신 이미지 가져오기 +# shellcheck disable=SC2046 export $(grep -v '^#' .env | xargs) +# shellcheck disable=SC2086 docker pull ${DOCKER_HUB_USERNAME}/gdgoc-be-app:latest # 컨테이너 실행 -docker-compose --env-file .env up -d \ No newline at end of file +docker-compose -f docker-compose-prod.yml --env-file .env up -d \ No newline at end of file diff --git a/gdgoc/docker-compose-dev.yml b/gdgoc/docker-compose-dev.yml new file mode 100644 index 0000000..a1af226 --- /dev/null +++ b/gdgoc/docker-compose-dev.yml @@ -0,0 +1,32 @@ +version: "3.8" + +services: + app: + image: "${DOCKER_HUB_USERNAME}/gdgoc-be-app-dev:latest" + container_name: gdgoc-be-app-dev + restart: always + ports: + - "8080:8080" + environment: + SPRING_PROFILES_ACTIVE: dev + SPRING_DATASOURCE_URL: "jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME_DEV}" + SPRING_DATASOURCE_USERNAME: "${DB_USERNAME}" + SPRING_DATASOURCE_PASSWORD: "${DB_PASSWORD}" + volumes: + - /home/ubuntu/gdgoc-be-app-dev/.env:/app/.env + env_file: + - .env + + dozzle: + container_name: dozzle + image: amir20/dozzle:v5.4.0 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + ports: + - 9999:8080 + environment: + DOZZLE_USERNAME: "${DOZZLE_USERNAME}" + DOZZLE_PASSWORD: "${DOZZLE_PASSWORD}" + restart: always + env_file: + - .env diff --git a/gdgoc/docker-compose.yml b/gdgoc/docker-compose-prod.yml similarity index 61% rename from gdgoc/docker-compose.yml rename to gdgoc/docker-compose-prod.yml index 5373d6e..4b06ce0 100644 --- a/gdgoc/docker-compose.yml +++ b/gdgoc/docker-compose-prod.yml @@ -16,3 +16,17 @@ services: - /home/ubuntu/gdgoc-be-app/.env:/app/.env env_file: - .env + + dozzle: + container_name: dozzle + image: amir20/dozzle:v5.4.0 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + ports: + - 9999:8080 + environment: + DOZZLE_USERNAME: "${DOZZLE_USERNAME}" + DOZZLE_PASSWORD: "${DOZZLE_PASSWORD}" + restart: always + env_file: + - .env \ No newline at end of file diff --git a/gdgoc/src/main/resources/application-dev.yml b/gdgoc/src/main/resources/application-dev.yml new file mode 100644 index 0000000..004cf0f --- /dev/null +++ b/gdgoc/src/main/resources/application-dev.yml @@ -0,0 +1,68 @@ +server: + forward-headers-strategy: framework + +spring: + jackson: + time-zone: Asia/Seoul + datasource: + url: ${SPRING_DATASOURCE_URL} + username: ${SPRING_DATASOURCE_USERNAME} + password: ${SPRING_DATASOURCE_PASSWORD} + driver-class-name: org.postgresql.Driver + servlet: + multipart: + max-file-size: 10MB + max-request-size: 12MB + jpa: + database: postgresql + hibernate: + ddl-auto: none + properties: + hibernate: + default_batch_fetch_size: 100 + time_zone: Asia/Seoul + show-sql: false + database-platform: org.hibernate.dialect.PostgreSQLDialect + flyway: + enabled: true + baseline-on-migrate: false + clean-disabled: true + validate-migration-naming: true + locations: classpath:db/migration + mail: + host: smtp.gmail.com + port: 587 + username: ${GMAIL} + password: ${GMAIL_PASSWORD} + properties: + mail: + smtp: + auth: true + starttls: + enable: true + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.type: off + + +google: + client-id: ${GOOGLE_CLIENT_ID} + client-secret: ${GOOGLE_CLIENT_SECRET} + redirect-uri: ${GOOGLE_REDIRECT_URI} + +jwt: + googleIssuer: ${GOOGLE_ISSUER} + selfIssuer: ${SELF_ISSUER} + secretKey: ${SECRET_KEY} + +cloud: + aws: + credentials: + access-key: ${AWS_ACCESS_KEY_ID} + secret-key: ${AWS_SECRET_ACCESS_KEY} + region: + static: ${AWS_REGION} + s3: + bucket: ${WS_TEST_RESOURCE_BUCKET} diff --git a/gdgoc/src/main/resources/application-prod.yml b/gdgoc/src/main/resources/application-prod.yml index a4ff42a..e7f0381 100644 --- a/gdgoc/src/main/resources/application-prod.yml +++ b/gdgoc/src/main/resources/application-prod.yml @@ -25,7 +25,7 @@ spring: database-platform: org.hibernate.dialect.PostgreSQLDialect flyway: enabled: true - baseline-on-migrate: true # 변경 확인 후 제거 예정 + baseline-on-migrate: false clean-disabled: true validate-migration-naming: true locations: classpath:db/migration