chore: add unified docker dev stack for invyone (frontend + spring + node)

Adds backend-node.Dockerfile (Node 20-alpine + nodemon) and a single
docker-compose.invyone.yml that brings up all three services on
invyone-net with restart unless-stopped, intended for the office
Ubuntu host. Uses vexplor_dev DB for both backends and exposes
9772 (frontend) / 8083 (spring) / 8082 (node) on the host.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 22:24:20 +09:00
parent b994ac7335
commit a3872a271f
2 changed files with 151 additions and 0 deletions
+23
View File
@@ -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"]
+128
View File
@@ -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