This commit is contained in:
dabeeo
2026-04-20 15:29:44 +09:00
parent 4fbfb31e97
commit 9fa549285f
4 changed files with 224 additions and 188 deletions

View File

@@ -18,10 +18,7 @@ services:
- SPRING_PROFILES_ACTIVE=dev - SPRING_PROFILES_ACTIVE=dev
- TZ=Asia/Seoul - TZ=Asia/Seoul
volumes: volumes:
- /mnt/nfs_share/images:/app/original-images - /data/training:/data/training
- /mnt/nfs_share/model_output:/app/model-outputs
- /mnt/nfs_share/train_dataset:/app/train-dataset
- /home/kcomu/data:/home/kcomu/data
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
networks: networks:
- kamco-cds - kamco-cds

View File

@@ -18,8 +18,6 @@ services:
- SPRING_PROFILES_ACTIVE=prod - SPRING_PROFILES_ACTIVE=prod
- TZ=Asia/Seoul - TZ=Asia/Seoul
volumes: volumes:
- ./app/model_output:/app/model-outputs
- ./app/train_dataset:/app/train-dataset
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
networks: networks:
- kamco-cds - kamco-cds

View File

@@ -1,179 +1,195 @@
events { events {
worker_connections 1024; worker_connections 1024;
} }
http { http {
include /etc/nginx/mime.types; include /etc/nginx/mime.types;
default_type application/octet-stream; default_type application/octet-stream;
# 로그 설정 # 로그 설정
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" ' '$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn; error_log /var/log/nginx/error.log warn;
sendfile on; sendfile on;
keepalive_timeout 65; keepalive_timeout 65;
# 업로드 파일 크기 제한 (10GB) # 업로드 파일 크기 / 타임아웃 (10GB, 10분)
client_max_body_size 10G; client_max_body_size 10G;
client_body_timeout 600s;
# Upstream 설정
upstream api_backend { # Upstream 설정
server kamco-train-api:8080; upstream api_backend {
} server kamco-train-api:8080;
}
upstream web_backend {
server kamco-train-web:3002; upstream web_backend {
} server kamco-train-web:3002;
}
# HTTP → HTTPS 리다이렉트 서버
server { # HTTP → HTTPS 리다이렉트 서버
listen 80; server {
server_name api.train-kamco.com train-kamco.com; listen 80;
server_name api.train-kamco.com train-kamco.com;
# 모든 HTTP 요청을 HTTPS로 리다이렉트
return 301 https://$server_name$request_uri; # 모든 HTTP 요청을 HTTPS로 리다이렉트
} return 301 https://$host$request_uri;
}
# HTTPS 서버 설정
server { # HTTPS 서버 설정
listen 443 ssl http2; server {
server_name api.train-kamco.com; listen 443 ssl;
http2 on;
# SSL 인증서 설정 (사설 인증서 - 멀티 도메인) server_name api.train-kamco.com;
ssl_certificate /etc/nginx/ssl/train-kamco.com.crt;
ssl_certificate_key /etc/nginx/ssl/train-kamco.com.key; # SSL 인증서 설정 (사설 인증서 - 멀티 도메인)
ssl_certificate /etc/nginx/ssl/train-kamco.com.crt;
# SSL 프로토콜 및 암호화 설정 ssl_certificate_key /etc/nginx/ssl/train-kamco.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # SSL 프로토콜 및 암호화 설정
ssl_prefer_server_ciphers off; ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
# SSL 세션 캐시 ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m; # SSL 세션 캐시
ssl_session_cache shared:SSL:10m;
# HSTS (HTTP Strict Transport Security) ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# HSTS (HTTP Strict Transport Security)
# 보안 헤더 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always; # 보안 헤더
add_header X-XSS-Protection "1; mode=block" always; add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# 프록시 설정 add_header X-XSS-Protection "1; mode=block" always;
location / {
proxy_pass http://api_backend; # CORS 헤더
proxy_http_version 1.1; add_header Access-Control-Allow-Origin "https://train-kamco.com" always;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, PATCH, OPTIONS" always;
# 프록시 헤더 설정 add_header Access-Control-Allow-Headers "Authorization, Content-Type, Cookie, X-Requested-With" always;
proxy_set_header Host $host; add_header Access-Control-Allow-Credentials "true" always;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 프록시 설정
proxy_set_header X-Forwarded-Proto $scheme; location / {
proxy_set_header X-Forwarded-Host $server_name; # OPTIONS preflight 처리
if ($request_method = OPTIONS) {
# 인증 헤더 및 쿠키 전달 (JWT 토큰 전달 보장) return 204;
proxy_pass_request_headers on; }
proxy_set_header Cookie $http_cookie;
proxy_set_header Authorization $http_authorization; proxy_pass http://api_backend;
proxy_http_version 1.1;
# 타임아웃 설정 (대용량 파일 업로드 지원)
proxy_connect_timeout 300s; # 프록시 헤더 설정
proxy_send_timeout 300s; proxy_set_header Host $host;
proxy_read_timeout 300s; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 버퍼 설정 proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering on; proxy_set_header X-Forwarded-Host $server_name;
proxy_buffer_size 4k;
proxy_buffers 8 4k; # 인증 헤더 및 쿠키 전달 (JWT 토큰 전달 보장)
proxy_busy_buffers_size 8k; proxy_pass_request_headers on;
} proxy_set_header Cookie $http_cookie;
proxy_set_header Authorization $http_authorization;
# 헬스체크 엔드포인트
location /monitor/health { # 타임아웃 설정 (10분)
proxy_pass http://api_backend/monitor/health; proxy_connect_timeout 600s;
access_log off; proxy_send_timeout 600s;
} proxy_read_timeout 600s;
}
# 대용량 업로드: 버퍼링 없이 백엔드로 스트리밍
# HTTPS 서버 설정 - Next.js Web Application proxy_request_buffering off;
server { proxy_buffering off;
listen 443 ssl http2; }
server_name train-kamco.com;
# 헬스체크 엔드포인트
# SSL 인증서 설정 (사설 인증서 - 멀티 도메인) location /monitor/health {
ssl_certificate /etc/nginx/ssl/train-kamco.com.crt; proxy_pass http://api_backend/monitor/health;
ssl_certificate_key /etc/nginx/ssl/train-kamco.com.key; access_log off;
}
# SSL 프로토콜 및 암호화 설정 }
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; # HTTPS 서버 설정 - Next.js Web Application
ssl_prefer_server_ciphers off; server {
listen 443 ssl;
# SSL 세션 캐시 http2 on;
ssl_session_cache shared:SSL:10m; server_name train-kamco.com;
ssl_session_timeout 10m;
# SSL 인증서 설정 (사설 인증서 - 멀티 도메인)
# HSTS (HTTP Strict Transport Security) ssl_certificate /etc/nginx/ssl/train-kamco.com.crt;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; ssl_certificate_key /etc/nginx/ssl/train-kamco.com.key;
# 보안 헤더 # SSL 프로토콜 및 암호화 설정
add_header X-Frame-Options "SAMEORIGIN" always; ssl_protocols TLSv1.2 TLSv1.3;
add_header X-Content-Type-Options "nosniff" always; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
add_header X-XSS-Protection "1; mode=block" always; ssl_prefer_server_ciphers off;
# API 프록시 설정 (Web에서 API 호출 시) # SSL 세션 캐시
location /api/ { ssl_session_cache shared:SSL:10m;
proxy_pass http://api_backend/api/; ssl_session_timeout 10m;
proxy_http_version 1.1;
# HSTS (HTTP Strict Transport Security)
# 프록시 헤더 설정 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # 보안 헤더
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header X-Frame-Options "SAMEORIGIN" always;
proxy_set_header X-Forwarded-Proto $scheme; add_header X-Content-Type-Options "nosniff" always;
proxy_set_header X-Forwarded-Host $server_name; add_header X-XSS-Protection "1; mode=block" always;
# 인증 헤더 및 쿠키 전달 # API 프록시 설정 (Web에서 API 호출 시)
proxy_pass_request_headers on; location /api/ {
proxy_set_header Cookie $http_cookie; proxy_pass http://api_backend/api/;
proxy_http_version 1.1;
# 타임아웃 설정
proxy_connect_timeout 300s; # 프록시 헤더 설정
proxy_send_timeout 300s; proxy_set_header Host $host;
proxy_read_timeout 300s; proxy_set_header X-Real-IP $remote_addr;
} proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 프록시 설정 proxy_set_header X-Forwarded-Host $server_name;
location / {
proxy_pass http://web_backend; # 인증 헤더 및 쿠키 전달
proxy_http_version 1.1; proxy_pass_request_headers on;
proxy_set_header Cookie $http_cookie;
# 프록시 헤더 설정
proxy_set_header Host $host; # 타임아웃 설정 (10분)
proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 600s;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_send_timeout 600s;
proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 600s;
proxy_set_header X-Forwarded-Host $server_name;
# 대용량 업로드: 버퍼링 없이 백엔드로 스트리밍
# Next.js WebSocket 지원을 위한 Upgrade 헤더 proxy_request_buffering off;
proxy_set_header Upgrade $http_upgrade; proxy_buffering off;
proxy_set_header Connection "upgrade"; }
# 타임아웃 설정 # 프록시 설정
proxy_connect_timeout 600s; location / {
proxy_send_timeout 600s; proxy_pass http://web_backend;
proxy_read_timeout 600s; proxy_http_version 1.1;
# 버퍼 설정 # 프록시 헤더 설정
proxy_buffering on; proxy_set_header Host $host;
proxy_buffer_size 4k; proxy_set_header X-Real-IP $remote_addr;
proxy_buffers 8 4k; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_busy_buffers_size 8k; proxy_set_header X-Forwarded-Proto $scheme;
} proxy_set_header X-Forwarded-Host $server_name;
}
} # Next.js WebSocket 지원을 위한 Upgrade 헤더
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 타임아웃 설정 (10분)
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# 버퍼 설정
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
}
}
}

View File

@@ -30,20 +30,45 @@ token:
swagger: swagger:
local-port: 8080 local-port: 8080
# file:
# dataset-dir: /home/kcomu/data/request/
# dataset-tmp-dir: ${file.dataset-dir}tmp/
# pt-path: /home/kcomu/data/response/v6-cls-checkpoints/
# pt-FileName: yolov8_6th-6m.pt
# train:
# docker:
# image: kamco-cd-train:latest
# base_path: /home/kcomu/data
# request_dir: ${train.docker.base_path}/request
# response_dir: ${train.docker.base_path}/response
# symbolic_link_dir: ${train.docker.base_path}/tmp
# container_prefix: kamco-cd-train
# shm_size: 16g
# ipc_host: true
file: file:
dataset-dir: /home/kcomu/data/request/ dataset-dir: /data/training/request/
dataset-tmp-dir: ${file.dataset-dir}tmp/ dataset-tmp-dir: ${file.dataset-dir}tmp/
pt-path: /home/kcomu/data/response/v6-cls-checkpoints/ pt-path: /data/training/response/v6-cls-checkpoints/
pt-FileName: yolov8_6th-6m.pt pt-FileName: yolov8_6th-6m.pt
train: train:
docker: docker:
image: kamco-cd-train:latest image: kamco-cd-train:latest
base_path: /home/kcomu/data base_path: /data/training
request_dir: ${train.docker.base_path}/request request_dir: ${train.docker.base_path}/request
response_dir: ${train.docker.base_path}/response response_dir: ${train.docker.base_path}/response
symbolic_link_dir: ${train.docker.base_path}/tmp symbolic_link_dir: ${train.docker.base_path}/tmp
container_prefix: kamco-cd-train container_prefix: kamco-cd-train
shm_size: 16g shm_size: 16g
ipc_host: true ipc_host: true
hyper:
parameter:
gpus: 1
gpu-ids: 0
batch-size: 10