diff --git a/.github/workflows/deploy-api-to-prod.yml b/.github/workflows/deploy-api-to-prod.yml new file mode 100644 index 0000000..06ee7d0 --- /dev/null +++ b/.github/workflows/deploy-api-to-prod.yml @@ -0,0 +1,88 @@ +name: Deploy API To Prod + +on: + pull_request: + workflow_dispatch: + push: + branches: + - main + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set Up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' + - name: Grant Execute Permission For Gradlew + run: chmod +x gradlew + - name: Make Prod1 Yml + run: | + cd ./src/main/resources + touch ./application-prod1.yml + echo "${{ secrets.PROPERTIES_PROD1 }}" > ./application-prod1.yml + shell: bash + - name: Make Prod2 Yml + run: | + cd ./src/main/resources + touch ./application-prod2.yml + echo "${{ secrets.PROPERTIES_PROD2 }}" > ./application-prod2.yml + - name: Build With Gradle + run: ./gradlew :bootJar -x test + - name: Docker Build And Push + run: | + docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }} + docker build -f docker/api.Dockerfile -t skku-api . + docker tag skku-api sinkyoungdeok/skku-api + docker push sinkyoungdeok/skku-api + - name: Deploy Prod + uses: appleboy/ssh-action@v0.1.4 + with: + key: ${{ secrets.SSH_KEY }} + host: ${{ secrets.HOST_NAME }} + username: ubuntu + port: 22 + script: | + docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }} + docker pull sinkyoungdeok/skku-api + + echo "> 구동중인 Profile 확인" + CURRENT_PROFILE=$(curl -s http://localhost/profile) + echo "> $CURRENT_PROFILE" + + echo "> profile setting" + if [ "$CURRENT_PROFILE" == "prod1" ] + then + IDLE_PROFILE=prod2 + IDLE_PORT=8082 + elif [ "$CURRENT_PROFILE" == "prod2" ] + then + IDLE_PROFILE=prod1 + IDLE_PORT=8081 + else + echo "> 일치하는 Profile이 없음." + IDLE_PROFILE=prod1 + IDLE_PORT=8081 + fi + + echo "> 배포" + if [ "$IDLE_PROFILE" == "prod1" ] + then + docker-compose build skku-api-1 + docker-compose up -d skku-api-1 + else + docker-compose build skku-api-2 + docker-compose up -d skku-api-2 + fi + + sleep 60 + + echo "> Change Nginx Proxy Port" + echo "set \$service_url http://127.0.0.1:${IDLE_PORT};" |sudo tee /etc/nginx/conf.d/service-url.inc + + + echo "> Nginx Reload" + sudo service nginx reload diff --git a/build.gradle.kts b/build.gradle.kts index 18c5132..2f7f783 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,3 +38,7 @@ tasks.withType { tasks.withType { useJUnitPlatform() } + +tasks.jar { enabled = false } + +tasks.bootJar { enabled = true } \ No newline at end of file diff --git a/config/nginx/nginx.conf b/config/nginx/nginx.conf new file mode 100644 index 0000000..bb313aa --- /dev/null +++ b/config/nginx/nginx.conf @@ -0,0 +1,27 @@ +worker_processes auto; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + + server { + listen 80; + server_name example.com; + + include /etc/nginx/default.d/*.conf; + + include /etc/nginx/conf.d/service-url.inc; + + location / { + proxy_pass $service_url; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + } + } +} diff --git a/config/nginx/service-url.inc b/config/nginx/service-url.inc new file mode 100644 index 0000000..16974db --- /dev/null +++ b/config/nginx/service-url.inc @@ -0,0 +1 @@ +set $service_url http://127.0.0.1:8081; diff --git a/docker/api.Dockerfile b/docker/api.Dockerfile new file mode 100644 index 0000000..d537934 --- /dev/null +++ b/docker/api.Dockerfile @@ -0,0 +1,4 @@ +FROM openjdk:17-jdk-slim +ARG JAR_FILE=build/libs/*SNAPSHOT.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["java","-Dspring.profiles.active=${USE_PROFILE}","-Dio.netty.tryReflectionSetAccessible=true","--add-opens","java.base/jdk.internal.misc=ALL-UNNAMED","-jar","/app.jar"] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..cc62f26 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,47 @@ +version: "3.7" +services: + skku-api-1: + depends_on: + - skku-db + image: sinkyoungdeok/skku-api + ports: + - "8081:8081" + environment: + - USE_PROFILE=prod1 + restart: always + skku-api-2: + depends_on: + - skku-db + image: sinkyoungdeok/skku-api + ports: + - "8082:8082" + environment: + - USE_PROFILE=prod2 + restart: always + skku-db: + image: mysql:8.0 + platform: linux/amd64 + ports: + - "3306:3306" + environment: + - MYSQL_DATABASE=skku + - MYSQL_ROOT_PASSWORD=skku-be + - MYSQL_USER=skku-user + - MYSQL_PASSWORD=skku-pw + - TZ=UTC + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --lower_case_table_names=1 + - --default-authentication-plugin=mysql_native_password + volumes: + - ./mysql:/var/lib/mysql + skku-redis: + image: redis:6.0.2 + command: redis-server /usr/local/etc/redis/redis.conf --port 6379 + ports: + - 6379:6379 + platform: linux/amd64 + volumes: + - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:rw + - ./redis/users.acl:/usr/local/etc/redis/users.acl:rw diff --git a/src/main/kotlin/com/restaurant/be/WebRestController.kt b/src/main/kotlin/com/restaurant/be/WebRestController.kt new file mode 100644 index 0000000..2a5672f --- /dev/null +++ b/src/main/kotlin/com/restaurant/be/WebRestController.kt @@ -0,0 +1,16 @@ +package com.restaurant.be + +import org.springframework.core.env.Environment +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +class WebRestController( + private val env: Environment, +) { + + @GetMapping("/profile") + fun getProfile(): String { + return env.activeProfiles.firstOrNull() ?: "No Active Profile" + } +} diff --git a/src/main/resources/application-prod1.yml b/src/main/resources/application-prod1.yml new file mode 100644 index 0000000..4c3a2e6 --- /dev/null +++ b/src/main/resources/application-prod1.yml @@ -0,0 +1,3 @@ +server: + port: 8081 + diff --git a/src/main/resources/application-prod2.yml b/src/main/resources/application-prod2.yml new file mode 100644 index 0000000..4a2daf5 --- /dev/null +++ b/src/main/resources/application-prod2.yml @@ -0,0 +1,2 @@ +server: + port: 8082 diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yml similarity index 81% rename from src/main/resources/application.yaml rename to src/main/resources/application.yml index 904c2e5..d883d2a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yml @@ -1,3 +1,6 @@ +server: + port: 8080 + spring: application: name: be