CASTAD-v0.1/setup-nginx-castad1.sh

197 lines
6.0 KiB
Bash
Executable File

#!/bin/bash
#
# CaStAD1 Nginx 설정 스크립트
# 도메인: castad1.ktenterprise.net
# 포트: 3001 (백엔드), 5003 (Instagram)
#
# 색상
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() { echo -e "${GREEN}[Setup]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
# root 권한 확인
if [ "$EUID" -ne 0 ]; then
error "이 스크립트는 sudo로 실행해야 합니다"
echo "사용법: sudo ./setup-nginx-castad1.sh"
exit 1
fi
log "CaStAD1 Nginx 설정을 시작합니다..."
# nginx 설정 파일 생성
NGINX_CONF="/etc/nginx/sites-available/castad1"
log "nginx 설정 파일 생성 중: $NGINX_CONF"
cat > "$NGINX_CONF" << 'EOF'
# ============================================
# CaStAD1 Nginx Configuration
# Domain: castad1.ktenterprise.net
# Port: 3001 (backend), 5003 (instagram)
# ============================================
upstream castad1_backend {
server 127.0.0.1:3001;
keepalive 64;
}
upstream castad1_instagram {
server 127.0.0.1:5003;
keepalive 32;
}
# HTTP → HTTPS 리다이렉트
server {
listen 80;
listen [::]:80;
server_name castad1.ktenterprise.net;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS 서버
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name castad1.ktenterprise.net;
# SSL 인증서
ssl_certificate /etc/letsencrypt/live/castad1.ktenterprise.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/castad1.ktenterprise.net/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
# 보안 헤더
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# 로그
access_log /var/log/nginx/castad1_access.log;
error_log /var/log/nginx/castad1_error.log;
# 파일 업로드 크기
client_max_body_size 500M;
client_body_timeout 300s;
# 정적 파일 (프론트엔드) - castad1 디렉토리
root /home/developer/castad1/dist;
index index.html;
# Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml;
# 정적 자원 캐싱
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
# API 요청
location /api/ {
proxy_pass http://castad1_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 300s;
}
# Instagram API
location /instagram/ {
proxy_pass http://castad1_instagram/;
proxy_http_version 1.1;
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_read_timeout 120s;
}
# 렌더링 요청 (긴 타임아웃)
location /render {
proxy_pass http://castad1_backend;
proxy_http_version 1.1;
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-Forwarded-Proto $scheme;
proxy_read_timeout 600s;
proxy_buffering off;
}
# 다운로드/업로드/임시 파일
location ~ ^/(downloads|temp|uploads)/ {
proxy_pass http://castad1_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# SPA 라우팅
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
log "nginx 설정 파일 생성 완료"
# 심볼릭 링크 생성
LINK_PATH="/etc/nginx/sites-enabled/castad1"
if [ -L "$LINK_PATH" ]; then
warn "심볼릭 링크가 이미 존재합니다. 재생성합니다..."
rm "$LINK_PATH"
fi
ln -s "$NGINX_CONF" "$LINK_PATH"
log "심볼릭 링크 생성 완료"
# nginx 설정 테스트
log "nginx 설정 테스트 중..."
if nginx -t; then
log "nginx 설정 테스트 통과"
else
error "nginx 설정 테스트 실패!"
exit 1
fi
# nginx 재시작
log "nginx 재시작 중..."
systemctl reload nginx
log "nginx 재시작 완료"
echo ""
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ CaStAD1 Nginx 설정 완료! ║${NC}"
echo -e "${GREEN}╠════════════════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║ 도메인: https://castad1.ktenterprise.net ║${NC}"
echo -e "${GREEN}║ 백엔드: 127.0.0.1:3001 ║${NC}"
echo -e "${GREEN}║ Instagram: 127.0.0.1:5003 ║${NC}"
echo -e "${GREEN}║ 정적파일: /home/developer/castad1/dist ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""