diff --git a/docker/dev/backend-node.Dockerfile b/docker/dev/backend-node.Dockerfile new file mode 100644 index 00000000..7bf31912 --- /dev/null +++ b/docker/dev/backend-node.Dockerfile @@ -0,0 +1,23 @@ +# 개발용 Node.js 백엔드 Dockerfile +# - 소스 코드는 volume mount 로 처리, nodemon 으로 자동 리로드 +# - oracledb 등 native 모듈 빌드를 위해 build base 설치 +FROM node:20-alpine + +WORKDIR /app + +# native 모듈(oracledb, bcryptjs, mssql 등) 빌드 + 헬스체크 + libaio (oracledb 런타임) +RUN apk add --no-cache python3 make g++ curl libaio libc6-compat + +# package.json / lock 만 먼저 복사해서 의존성 캐시 레이어 만들기 +COPY package*.json ./ + +# 개발 의존성 포함 설치 (nodemon, ts-node 필요) +RUN npm ci --prefer-offline --no-audit + +# 소스 코드는 volume mount 로 들어옴 + +# backend-node 기본 포트 (PORT env 로 override 가능, 기본 8080) +EXPOSE 8080 + +# nodemon 으로 ts 직접 실행 (nodemon.json 사용) +CMD ["npx", "nodemon"] diff --git a/docker/dev/docker-compose.invyone.yml b/docker/dev/docker-compose.invyone.yml new file mode 100644 index 00000000..af642329 --- /dev/null +++ b/docker/dev/docker-compose.invyone.yml @@ -0,0 +1,128 @@ +# invyone 풀세트 (frontend + backend-spring + backend-node) +# 사무실 우분투 호스팅용. restart unless-stopped 로 항상 떠있게. +# +# 외부 노출 포트: +# - frontend : 9772 +# - backend-spring : 8083 +# - backend-node : 8082 +# +# 컨테이너 내부 포트는 각 앱의 기본값 유지 (3000 / 8081 / 8080) +# 모드: dev (volume mount + 자동 리로드). 코드 변경은 syncthing 통해 동기화됨. +# +# 띄우기: +# cd ~/invyone && docker compose -f docker/dev/docker-compose.invyone.yml up -d +# +# 끄기: +# cd ~/invyone && docker compose -f docker/dev/docker-compose.invyone.yml down + +services: + # ======================== + # Spring Boot 백엔드 + # ======================== + backend-spring: + build: + context: ../../backend-spring + dockerfile: ../docker/dev/backend-spring.Dockerfile + container_name: invyone-backend-spring + ports: + - "8083:8081" + environment: + SPRING_PROFILES_ACTIVE: dev + SERVER_PORT: 8081 + # vexplor_dev DB (211.115.91.141:11134) + SPRING_DATASOURCE_URL: jdbc:postgresql://211.115.91.141:11134/vexplor_dev + SPRING_DATASOURCE_USERNAME: postgres + SPRING_DATASOURCE_PASSWORD: vexplor0909!! + JWT_SECRET: ilshin-plm-super-secret-jwt-key-2024 + JWT_EXPIRATION: "86400000" + FILE_UPLOAD_DIR: ./uploads + volumes: + - ../../backend-spring:/app + networks: + - invyone-net + restart: unless-stopped + healthcheck: + # actuator 미설치 + spring security 가 / 와 /health 모두 403 처리. + # 컨테이너 내부에서 8081 포트로 응답이 오기만 하면 (status 무관) OK 로 간주. + test: ["CMD-SHELL", "curl -sS -o /dev/null http://localhost:8081/ || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 120s + + # ======================== + # Node.js 백엔드 + # ======================== + backend-node: + build: + context: ../../backend-node + dockerfile: ../docker/dev/backend-node.Dockerfile + container_name: invyone-backend-node + ports: + - "8082:8080" + environment: + NODE_ENV: development + PORT: "8080" + HOST: "0.0.0.0" + TZ: Asia/Seoul + # vexplor_dev DB (backend-node 도 같은 DB 사용) + DATABASE_URL: postgresql://postgres:vexplor0909!!@211.115.91.141:11134/vexplor_dev + JWT_SECRET: ilshin-plm-super-secret-jwt-key-2024 + JWT_EXPIRES_IN: 24h + JWT_REFRESH_EXPIRES_IN: 7d + LOG_LEVEL: info + # 외부 DB 연결 비번 등 암호화에 사용되는 대칭 키 (dev 용) + ENCRYPTION_KEY: invyone-dev-encryption-key-change-in-prod + volumes: + # 소스 코드 마운트 (syncthing 동기화 즉시 반영) + - ../../backend-node:/app + # node_modules 는 컨테이너 내부 것 사용 (alpine 빌드된 native 모듈) + - /app/node_modules + # 업로드 파일은 호스트 디렉토리로 빠지지 않도록 컨테이너 내부 보관 + # (필요하면 named volume 으로 전환) + networks: + - invyone-net + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + + # ======================== + # Next.js 프론트엔드 + # ======================== + frontend: + build: + context: ../../frontend + dockerfile: ../docker/dev/frontend.Dockerfile + container_name: invyone-frontend + ports: + - "9772:3000" + environment: + NODE_ENV: development + # 브라우저(클라이언트)에서 API 호출용 — 호스트에서 보이는 포트 + NEXT_PUBLIC_API_URL: http://localhost:8083/api + NEXT_PUBLIC_NODE_API_URL: http://localhost:8082/api + # 서버사이드(SSR) 호출용 — 컨테이너 네트워크 내부 이름 + SERVER_API_URL: http://invyone-backend-spring:8081 + SERVER_NODE_API_URL: http://invyone-backend-node:8080 + NODE_OPTIONS: --max-old-space-size=8192 + NEXT_TELEMETRY_DISABLED: "1" + WATCHPACK_POLLING: "true" + volumes: + - ../../frontend:/app + - /app/node_modules + - /app/.next + depends_on: + - backend-spring + - backend-node + networks: + - invyone-net + restart: unless-stopped + +networks: + invyone-net: + name: invyone-net + driver: bridge