From 3f76f80fd4e881e9818a39bb0adb1054fefddfc6 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Mon, 22 Sep 2025 12:48:55 +0900 Subject: [PATCH 01/11] =?UTF-8?q?fix=20:=20react=20native=20webview?= =?UTF-8?q?=EC=97=90=EC=84=9C=20google=20oauth=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EC=9D=B4=20=EC=B0=A8=EB=8B=A8=EB=90=9C=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=EB=A5=BC=20UserAgent=20=EC=9A=B0=ED=9A=8C=EB=A1=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-native/src/screens/interviews/interviewMain.tsx | 1 + apps/kokomen-native/src/screens/my/dashboard.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/kokomen-native/src/screens/interviews/interviewMain.tsx b/apps/kokomen-native/src/screens/interviews/interviewMain.tsx index 3968ac03..b5a09902 100644 --- a/apps/kokomen-native/src/screens/interviews/interviewMain.tsx +++ b/apps/kokomen-native/src/screens/interviews/interviewMain.tsx @@ -111,6 +111,7 @@ export default function InterviewMainScreen() { source={{ uri: `${process.env.EXPO_PUBLIC_CLIENT_URL}/interviews`, }} + userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" javaScriptEnabled={true} originWhitelist={["*"]} injectedJavaScriptBeforeContentLoaded={runFirst} diff --git a/apps/kokomen-native/src/screens/my/dashboard.tsx b/apps/kokomen-native/src/screens/my/dashboard.tsx index 38842977..39a8f849 100644 --- a/apps/kokomen-native/src/screens/my/dashboard.tsx +++ b/apps/kokomen-native/src/screens/my/dashboard.tsx @@ -27,6 +27,7 @@ export default function DashboardScreen() { Date: Mon, 22 Sep 2025 12:49:22 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20Claude=20PR=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EC=9B=8C=ED=81=AC=ED=94=8C=EB=A1=9C=EC=9A=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EC=BD=94=EB=93=9C=20=ED=92=88=EC=A7=88,=20?= =?UTF-8?q?=EB=B3=B4=EC=95=88,=20=EC=84=B1=EB=8A=A5=20=EA=B2=80=ED=86=A0?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=9E=90=EB=8F=99=ED=99=94=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-review.yml | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/workflows/pr-review.yml diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml new file mode 100644 index 00000000..dce09461 --- /dev/null +++ b/.github/workflows/pr-review.yml @@ -0,0 +1,40 @@ +name: Claude PR Review +on: + pull_request: + types: [opened, synchronize] + branches: [development] + +jobs: + review: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + id-token: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: anthropics/claude-code-action@v1 + with: + github_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + prompt: | + REPO: ${{ github.repository }} + PR NUMBER: ${{ github.event.pull_request.number }} + + Please review this pull request with a focus on: + - Code quality and best practices + - Potential bugs or issues + - Security implications + - Performance considerations + + NOTE: The PR branch is already checked out in the current working directory. + NOTE: write your review in Korean. + + Use `gh pr comment` for top-level feedback. + Use `mcp__github_inline_comment__create_inline_comment` to highlight specific code issues. + Only post GitHub comments - don't submit review text as messages. + + claude_args: | + --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)" From 7727cf927088beb61f108c6b7b152f3630243605 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:20:08 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix=20:=20cors=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20=EC=9B=B9=EB=B7=B0=20=EC=B6=94=EA=B0=80=EC=99=80=20?= =?UTF-8?q?api/v3=20Prefix=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-server/src/main.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/kokomen-server/src/main.ts b/apps/kokomen-server/src/main.ts index 208deb7f..1be8db2f 100644 --- a/apps/kokomen-server/src/main.ts +++ b/apps/kokomen-server/src/main.ts @@ -4,12 +4,17 @@ import { AppModule } from "./app.module"; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.setGlobalPrefix("api/v3"); + app.enableCors({ origin: [ "http://localhost:3000", "http://localhost:3001", "http://local.kokomen.kr:3000", - "https://dev.kokomen.kr" + "https://dev.kokomen.kr", + "https://kokomen.kr", + "https://webview.kokomen.kr", + "https://webview-dev.kokomen.kr" ], credentials: true, methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], From 7064e83fd0c300a202b512e95498cf37c867d345 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:20:22 +0900 Subject: [PATCH 04/11] =?UTF-8?q?fix=20:=20=ED=8F=AC=ED=8A=B8=20=EB=B0=8F?= =?UTF-8?q?=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-server/src/app.module.ts | 19 ++++++++++++------- apps/kokomen-server/src/redis/redis.module.ts | 13 +++++++------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/apps/kokomen-server/src/app.module.ts b/apps/kokomen-server/src/app.module.ts index 5c4359e6..2e381437 100644 --- a/apps/kokomen-server/src/app.module.ts +++ b/apps/kokomen-server/src/app.module.ts @@ -17,23 +17,28 @@ import { RootQuestionModule } from "src/interview/modules/rootQuestion"; imports: [ ConfigModule.forRoot({ isGlobal: true, - envFilePath: [`env.${process.env.NODE_ENV || "development"}.`, ".env"], + envFilePath: [`env.${process.env.NODE_ENV || "development"}`, ".env"], load: [appConfig] }), TypeOrmModule.forRoot({ type: "mysql", - host: process.env.DB_HOST, - port: process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 3306, - username: process.env.DB_USERNAME, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, + host: process.env.DATABASE_HOST, + port: process.env.DATABASE_PORT + ? parseInt(process.env.DATABASE_PORT, 10) + : 3306, + username: process.env.DATABASE_USERNAME, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_DATABASE, entities: [__dirname + "/**/domains/*.{ts,js}"] }), TypeOrmModule.forFeature([Member]), GraphQLModule.forRoot({ driver: ApolloDriver, graphiql: process.env.NODE_ENV === "development", - autoSchemaFile: true + autoSchemaFile: true, + path: "api/v3/graphql", + sortSchema: true, + introspection: true }), RedisModule, CategoryModule, diff --git a/apps/kokomen-server/src/redis/redis.module.ts b/apps/kokomen-server/src/redis/redis.module.ts index d6fc8630..8fd91d69 100644 --- a/apps/kokomen-server/src/redis/redis.module.ts +++ b/apps/kokomen-server/src/redis/redis.module.ts @@ -1,6 +1,5 @@ // src/redis/redis.module.ts import { Module, Global } from "@nestjs/common"; -import { ConfigService } from "@nestjs/config"; import Redis from "ioredis"; @Global() @@ -8,11 +7,13 @@ import Redis from "ioredis"; providers: [ { provide: "REDIS_CLIENT", - useFactory: (configService: ConfigService): Redis => { + useFactory: (): Redis => { const redis = new Redis({ - host: configService.get("REDIS_HOST", "127.0.0.1"), - port: configService.get("REDIS_PORT", 6379), - password: configService.get("REDIS_PASSWORD", ""), + host: process.env.REDIS_HOST, + port: process.env.REDIS_PORT + ? parseInt(process.env.REDIS_PORT, 10) + : 6379, + password: process.env.REDIS_PASSWORD || "", enableReadyCheck: false, lazyConnect: false, @@ -45,7 +46,7 @@ import Redis from "ioredis"; return redis; }, - inject: [ConfigService] + inject: [] } ], exports: ["REDIS_CLIENT"] From 2dd3e2c83419c1cff3a86b18727e85ee466bbc2c Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:20:51 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat=20:=20dev,=20prod=20Nginx=20?= =?UTF-8?q?=EB=A6=AC=EB=B2=84=EC=8A=A4=20=ED=94=84=EB=A1=9D=EC=8B=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-server/nginx/dev/nginx.conf | 40 ++++++++++++++++++++++ apps/kokomen-server/nginx/prod/nginx.conf | 41 +++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 apps/kokomen-server/nginx/dev/nginx.conf create mode 100644 apps/kokomen-server/nginx/prod/nginx.conf diff --git a/apps/kokomen-server/nginx/dev/nginx.conf b/apps/kokomen-server/nginx/dev/nginx.conf new file mode 100644 index 00000000..1e297243 --- /dev/null +++ b/apps/kokomen-server/nginx/dev/nginx.conf @@ -0,0 +1,40 @@ +worker_processes auto; + +events { + worker_connections 1024; +} + + +http { + charset utf-8; + + log_format main '$request_id $remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" "$request_time" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$ssl_protocol/$ssl_cipher" "$content_length" "$request_length"'; + access_log /var/log/nginx/access.log main; + + upstream kokomen-graphql-api-dev { + server kokomen-nest-server-dev:3000; + } + + server { + listen 80; + + set_real_ip_from 10.0.0.0/16; + set_real_ip_from 43.203.50.14; + real_ip_header X-Forwarded-For; + real_ip_recursive on; + + server_name api-dev.kokomen.kr localhost; + server_tokens off; + + location /api/v3 { + proxy_pass http://kokomen-graphql-api-dev; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-RequestID $request_id; + } + } +} diff --git a/apps/kokomen-server/nginx/prod/nginx.conf b/apps/kokomen-server/nginx/prod/nginx.conf new file mode 100644 index 00000000..7a29c54a --- /dev/null +++ b/apps/kokomen-server/nginx/prod/nginx.conf @@ -0,0 +1,41 @@ +worker_processes auto; + +events { + worker_connections 1024; +} + + +http { + charset utf-8; + + log_format main '$request_id $remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" "$request_time" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '"$ssl_protocol/$ssl_cipher" "$content_length" "$request_length"'; + access_log /var/log/nginx/access.log main; + + upstream kokomen-graphql-api-prod { + server kokomen-nest-server-prod:3000; + } + + server { + listen 80; + + set_real_ip_from 10.0.0.0/16; + set_real_ip_from 43.203.50.14; + real_ip_header X-Forwarded-For; + real_ip_recursive on; + + server_name api-dev.kokomen.kr localhost; + server_tokens off; + + location /api/v3 { + proxy_pass http://kokomen-graphql-api-prod; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-RequestID $request_id; + + } + } +} From 439d4eeea19e7327970cb5c9d1ebd239443651b8 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:22:05 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat=20:=20docker=20compose=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20Local,=20dev,=20prod=20=EA=B5=AC=EB=B6=84=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-server/compose.dev.yml | 28 --------------- compose.server.dev.yaml | 36 +++++++++++++++++++ compose.server.local.yaml | 54 +++++++++++++++++++++++++++++ compose.server.prod.yaml | 36 +++++++++++++++++++ 4 files changed, 126 insertions(+), 28 deletions(-) delete mode 100644 apps/kokomen-server/compose.dev.yml create mode 100644 compose.server.dev.yaml create mode 100644 compose.server.local.yaml create mode 100644 compose.server.prod.yaml diff --git a/apps/kokomen-server/compose.dev.yml b/apps/kokomen-server/compose.dev.yml deleted file mode 100644 index d8ac0388..00000000 --- a/apps/kokomen-server/compose.dev.yml +++ /dev/null @@ -1,28 +0,0 @@ -services: - kokomen-nest-server: - build: - context: . - dockerfile: Dockerfile - container_name: kokomen-nest-server - environment: - - NODE_ENV=development - networks: - - dev-kokomen-net - depends_on: - - kokomen-local-redis - nginx: - image: nginx:alpine - container_name: kokomen-nginx - ports: - - "80:80" - - "443:443" - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf:ro - networks: - - dev-kokomen-net - depends_on: - - kokomen-nest-server - -networks: - dev-kokomen-net: - driver: bridge diff --git a/compose.server.dev.yaml b/compose.server.dev.yaml new file mode 100644 index 00000000..0f9d6dd0 --- /dev/null +++ b/compose.server.dev.yaml @@ -0,0 +1,36 @@ +services: + kokomen-nest-server-dev: + build: + context: . + dockerfile: ./apps/kokomen-server/Dockerfile + environment: + TZ: Asia/Seoul + NODE_ENV: development + DATABASE_HOST: ${DATABASE_HOST_DEV} + DATABASE_PORT: 3306 + DATABASE_USERNAME: ${DATABASE_USERNAME_DEV} + DATABASE_PASSWORD: ${DATABASE_PASSWORD_DEV} + DATABASE_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD_DEV} + DATABASE_DATABASE: kokomen-dev + REDIS_HOST: ${REDIS_HOST_DEV} + REDIS_PORT: 6379 + PORT: 3000 + container_name: kokomen-nest-server-dev + restart: on-failure:3 + ports: + - "3000:3000" + - "3001:3001" + + nginx: + image: nginx:alpine + container_name: kokomen-nest-nginx-dev + ports: + - "80:80" + - "443:443" + volumes: + - ./apps/kokomen-server/nginx/dev/nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - kokomen-nest-server-dev + restart: unless-stopped + environment: + TZ: Asia/Seoul diff --git a/compose.server.local.yaml b/compose.server.local.yaml new file mode 100644 index 00000000..5d02e0fa --- /dev/null +++ b/compose.server.local.yaml @@ -0,0 +1,54 @@ +services: + kokomen-nest-server-dev: + build: + context: . + dockerfile: ./apps/kokomen-server/Dockerfile + args: + TZ: Asia/Seoul + NODE_ENV: development + DATABASE_HOST: kokomen-interview-local-mysql + DATABASE_PORT: 3306 + DATABASE_USERNAME: kokomen + DATABASE_PASSWORD: kokomen + DATABASE_ROOT_PASSWORD: root + DATABASE_DATABASE: kokomen-local + REDIS_HOST: kokomen-local-redis + REDIS_PORT: 6379 + PORT: 3000 + container_name: kokomen-nest-server-dev + restart: on-failure:3 + ports: + - "3000:3000" + - "3001:3001" + environment: + NODE_ENV: development + DATABASE_HOST: kokomen-interview-local-mysql + DATABASE_PORT: 3306 + DATABASE_USERNAME: root + DATABASE_PASSWORD: root + DATABASE_DATABASE: kokomen-local + REDIS_HOST: kokomen-local-redis + REDIS_PORT: 6379 + PORT: 3000 + networks: + - kokomen-network + + nginx: + image: nginx:alpine + container_name: kokomen-nest-nginx-dev + ports: + - "80:80" + - "443:443" + volumes: + - ./apps/kokomen-server/nginx/dev/nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - kokomen-nest-server-dev + restart: unless-stopped + environment: + TZ: Asia/Seoul + networks: + - kokomen-network +networks: + kokomen-network: + external: true + name: local-kokomen-net diff --git a/compose.server.prod.yaml b/compose.server.prod.yaml new file mode 100644 index 00000000..ff46de53 --- /dev/null +++ b/compose.server.prod.yaml @@ -0,0 +1,36 @@ +services: + kokomen-nest-server-dev: + build: + context: . + dockerfile: ./apps/kokomen-server/Dockerfile + container_name: kokomen-nest-server-dev + ports: + - "3000:3000" + - "3001:3001" + environment: + TZ: Asia/Seoul + NODE_ENV: development + DATABASE_HOST: ${DATABASE_HOST_PROD} + DATABASE_PORT: 3306 + DATABASE_USERNAME: ${DATABASE_USERNAME_PROD} + DATABASE_PASSWORD: ${DATABASE_PASSWORD_PROD} + DATABASE_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD_PROD} + DATABASE_DATABASE: kokomen + REDIS_HOST: ${REDIS_HOST_PROD} + REDIS_PORT: 6379 + PORT: 3000 + restart: on-failure:3 + + nginx: + image: nginx:alpine + container_name: kokomen-nest-nginx-dev + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx/dev/nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - kokomen-nest-server-dev + restart: unless-stopped + environment: + TZ: Asia/Seoul From b3ceafb6a3a33bb538dc9105435c246005162f27 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:22:21 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat=20:=20=EC=84=9C=EB=B2=84=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EB=B0=8F=20=EC=8B=A4=ED=96=89=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20script=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 1f8e7e57..d0565f07 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,12 @@ "typescript": "^5.8.3" }, "scripts": { + "client": "yarn workspace @kokomen/client", "client:dev": "yarn workspace @kokomen/client dev", "client:test": "yarn workspace @kokomen/client test", "server:dev": "yarn workspace @kokomen/server dev", + "server:build": "yarn workspace @kokomen/server build", + "server:start": "yarn workspace @kokomen/server start", "webview:dev": "yarn workspace @kokomen/webview dev", "webview:build": "yarn workspace @kokomen/webview build", "webview:test": "yarn workspace @kokomen/webview test", From b8e6d555347331858a0033f683e883726120d0ec Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:22:38 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat=20:=20nest=20dev,=20prod=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20cd=20actions=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy-nest-dev.yml | 32 ++++++++++++++++++++++++++ .github/workflows/deploy-nest-prod.yml | 32 ++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 .github/workflows/deploy-nest-dev.yml create mode 100644 .github/workflows/deploy-nest-prod.yml diff --git a/.github/workflows/deploy-nest-dev.yml b/.github/workflows/deploy-nest-dev.yml new file mode 100644 index 00000000..59bcaa6a --- /dev/null +++ b/.github/workflows/deploy-nest-dev.yml @@ -0,0 +1,32 @@ +name: Deployment Nestjs server (Dev) + +on: + push: + branches: [development] + +jobs: + build-and-deploy: + name: Build and Deploy to EC2 + runs-on: [self-hosted, nest-dev] + + steps: + - name: Checkout source code + uses: actions/checkout@v3 + - name: install dependencies + run: | + corepack enable + yarn install + + - name: Run Docker Compose + env: + DATABASE_HOST_DEV: ${{ secrets.DATABASE_HOST_DEV }} + DATABASE_USERNAME_DEV: ${{ secrets.DATABASE_USERNAME_DEV }} + DATABASE_PASSWORD_DEV: ${{ secrets.DATABASE_PASSWORD_DEV }} + DATABASE_ROOT_PASSWORD_DEV: ${{ secrets.DATABASE_ROOT_PASSWORD_DEV }} + REDIS_HOST_DEV: ${{ secrets.REDIS_HOST_DEV }} + + run: | + yarn types:build + docker system prune -f + docker compose -f ./compose.server.dev.yaml down || true + docker compose -f ./compose.server.dev.yaml up -d --build diff --git a/.github/workflows/deploy-nest-prod.yml b/.github/workflows/deploy-nest-prod.yml new file mode 100644 index 00000000..b709def4 --- /dev/null +++ b/.github/workflows/deploy-nest-prod.yml @@ -0,0 +1,32 @@ +name: Deployment Nestjs server (Prod) + +on: + push: + branches: [main] + +jobs: + build-and-deploy: + name: Build and Deploy to EC2 + runs-on: [self-hosted, nest-prod] + + steps: + - name: Checkout source code + uses: actions/checkout@v3 + - name: install dependencies + run: | + corepack enable + yarn install + + - name: Run Docker Compose + env: + DATABASE_HOST_PROD: ${{ secrets.DATABASE_HOST_PROD }} + DATABASE_USERNAME_PROD: ${{ secrets.DATABASE_USERNAME_PROD }} + DATABASE_PASSWORD_PROD: ${{ secrets.DATABASE_PASSWORD_PROD }} + DATABASE_ROOT_PASSWORD_PROD: ${{ secrets.DATABASE_ROOT_PASSWORD_PROD }} + REDIS_HOST_PROD: ${{ secrets.REDIS_HOST_PROD }} + + run: | + yarn types:build + docker system prune -f + docker compose -f ./compose.server.prod.yaml down || true + docker compose -f ./compose.server.prod.yaml up -d --build From 0a17e753ac10e061856f2d0ea92fa5bb8b3a36ff Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:22:50 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat=20:=20=EC=84=9C=EB=B2=84=20dockerfil?= =?UTF-8?q?e=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/kokomen-server/Dockerfile | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/kokomen-server/Dockerfile diff --git a/apps/kokomen-server/Dockerfile b/apps/kokomen-server/Dockerfile new file mode 100644 index 00000000..8939324f --- /dev/null +++ b/apps/kokomen-server/Dockerfile @@ -0,0 +1,16 @@ +FROM node:22-alpine + +WORKDIR /app + +RUN corepack enable + +COPY . . + +RUN yarn install + +WORKDIR /app/apps/kokomen-server + +RUN yarn types:build + +WORKDIR /app +CMD ["yarn", "server:start"] \ No newline at end of file From d31101c03373abace7eead3988744032d3fd3506 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:34:15 +0900 Subject: [PATCH 10/11] =?UTF-8?q?fix=20:=20anthropic=20api=20key=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml index dce09461..a40ed176 100644 --- a/.github/workflows/pr-review.yml +++ b/.github/workflows/pr-review.yml @@ -18,7 +18,7 @@ jobs: - uses: anthropics/claude-code-action@v1 with: - github_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} prompt: | REPO: ${{ github.repository }} PR NUMBER: ${{ github.event.pull_request.number }} From f1b5493e15a78170c3bbffa44afb8915f7b3f8c2 Mon Sep 17 00:00:00 2001 From: Minhyung Cho Date: Thu, 25 Sep 2025 17:43:39 +0900 Subject: [PATCH 11/11] fix : typo issue fixed --- .github/workflows/pr-review.yml | 1 + compose.server.prod.yaml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml index a40ed176..5e0073e9 100644 --- a/.github/workflows/pr-review.yml +++ b/.github/workflows/pr-review.yml @@ -19,6 +19,7 @@ jobs: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + track_progress: true prompt: | REPO: ${{ github.repository }} PR NUMBER: ${{ github.event.pull_request.number }} diff --git a/compose.server.prod.yaml b/compose.server.prod.yaml index ff46de53..cd6c61a7 100644 --- a/compose.server.prod.yaml +++ b/compose.server.prod.yaml @@ -1,5 +1,5 @@ services: - kokomen-nest-server-dev: + kokomen-nest-server-prod: build: context: . dockerfile: ./apps/kokomen-server/Dockerfile @@ -28,7 +28,7 @@ services: - "80:80" - "443:443" volumes: - - ./nginx/dev/nginx.conf:/etc/nginx/nginx.conf:ro + - ./apps/kokomen-server/nginx/prod/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - kokomen-nest-server-dev restart: unless-stopped