#!/bin/bash # ============================================================================= # Document Server - 환경 변수 설정 스크립트 # 대화형으로 환경 변수를 설정하고 .env 파일을 생성합니다 # ============================================================================= set -e # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # 로그 함수 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } # 보안 키 생성 함수 generate_secure_key() { openssl rand -base64 32 | tr -d "=+/" | cut -c1-32 } generate_jwt_key() { openssl rand -base64 64 | tr -d "=+/" | cut -c1-64 } generate_password() { openssl rand -base64 16 | tr -d "=+/" | cut -c1-12 } # 환경 설정 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" ENV_FILE="$PROJECT_DIR/.env.synology" cd "$PROJECT_DIR" echo "=== 🔧 Document Server 환경 변수 설정 ===" echo "" # 기존 .env 파일 확인 if [ -f "$ENV_FILE" ]; then log_warning "기존 환경 변수 파일이 있습니다: $ENV_FILE" echo "" read -p "기존 설정을 덮어쓰시겠습니까? (y/N): " -n 1 -r echo "" if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "기존 설정을 유지합니다" exit 0 fi # 기존 파일 백업 cp "$ENV_FILE" "$ENV_FILE.backup.$(date +%Y%m%d_%H%M%S)" log_info "기존 파일을 백업했습니다" fi echo "" log_info "환경 변수를 설정합니다. 엔터를 누르면 기본값/자동생성값을 사용합니다." echo "" # 1. 데이터베이스 비밀번호 echo -e "${CYAN}1. 데이터베이스 비밀번호${NC}" DEFAULT_DB_PASSWORD=$(generate_password) echo " 기본값: $DEFAULT_DB_PASSWORD (자동생성)" read -p " 입력: " DB_PASSWORD DB_PASSWORD=${DB_PASSWORD:-$DEFAULT_DB_PASSWORD} # 2. JWT 시크릿 키 echo "" echo -e "${CYAN}2. JWT 시크릿 키 (보안용)${NC}" DEFAULT_SECRET_KEY=$(generate_jwt_key) echo " 기본값: ${DEFAULT_SECRET_KEY:0:20}... (자동생성)" read -p " 입력: " SECRET_KEY SECRET_KEY=${SECRET_KEY:-$DEFAULT_SECRET_KEY} # 3. 관리자 이메일 echo "" echo -e "${CYAN}3. 관리자 이메일${NC}" DEFAULT_ADMIN_EMAIL="admin@document-server.local" echo " 기본값: $DEFAULT_ADMIN_EMAIL" read -p " 입력: " ADMIN_EMAIL ADMIN_EMAIL=${ADMIN_EMAIL:-$DEFAULT_ADMIN_EMAIL} # 4. 관리자 비밀번호 echo "" echo -e "${CYAN}4. 관리자 비밀번호${NC}" DEFAULT_ADMIN_PASSWORD=$(generate_password) echo " 기본값: $DEFAULT_ADMIN_PASSWORD (자동생성)" read -p " 입력: " ADMIN_PASSWORD ADMIN_PASSWORD=${ADMIN_PASSWORD:-$DEFAULT_ADMIN_PASSWORD} # 5. 도메인 이름 echo "" echo -e "${CYAN}5. 도메인 이름 (외부 접속용)${NC}" DEFAULT_DOMAIN="localhost" echo " 기본값: $DEFAULT_DOMAIN" echo " 예시: mydomain.com, nas.mydomain.com" read -p " 입력: " DOMAIN_NAME DOMAIN_NAME=${DOMAIN_NAME:-$DEFAULT_DOMAIN} # 6. 외부 포트 (선택사항) echo "" echo -e "${CYAN}6. 외부 포트 (기본: 24100)${NC}" DEFAULT_PORT="24100" echo " 기본값: $DEFAULT_PORT" read -p " 입력: " EXTERNAL_PORT EXTERNAL_PORT=${EXTERNAL_PORT:-$DEFAULT_PORT} # .env 파일 생성 echo "" log_info "환경 변수 파일 생성 중..." cat > "$ENV_FILE" << EOF # ============================================================================= # Document Server - Synology DS1525+ 환경 변수 # 생성일: $(date '+%Y-%m-%d %H:%M:%S') # ============================================================================= # 데이터베이스 설정 DB_PASSWORD=$DB_PASSWORD POSTGRES_PASSWORD=$DB_PASSWORD # 보안 설정 SECRET_KEY=$SECRET_KEY JWT_SECRET_KEY=$SECRET_KEY # 관리자 계정 ADMIN_EMAIL=$ADMIN_EMAIL ADMIN_PASSWORD=$ADMIN_PASSWORD # 네트워크 설정 DOMAIN_NAME=$DOMAIN_NAME EXTERNAL_PORT=$EXTERNAL_PORT # CORS 설정 (도메인에 따라 자동 설정) ALLOWED_ORIGINS=http://localhost:$EXTERNAL_PORT,http://$DOMAIN_NAME:$EXTERNAL_PORT # 성능 최적화 설정 (DS1525+ 32GB RAM) POSTGRES_SHARED_BUFFERS=8GB POSTGRES_EFFECTIVE_CACHE_SIZE=24GB POSTGRES_WORK_MEM=512MB POSTGRES_MAINTENANCE_WORK_MEM=4GB # Redis 설정 REDIS_MAXMEMORY=8gb REDIS_MAXMEMORY_POLICY=allkeys-lru # 로그 레벨 LOG_LEVEL=INFO DEBUG=false # 파일 업로드 설정 MAX_FILE_SIZE=500000000 UPLOAD_DIR=/app/uploads # 백업 설정 BACKUP_RETENTION_DAYS=30 AUTO_BACKUP_ENABLED=true # 모니터링 설정 HEALTH_CHECK_INTERVAL=30s HEALTH_CHECK_TIMEOUT=10s HEALTH_CHECK_RETRIES=3 # 스토리지 경로 (Synology 최적화) SSD_PATH=/volume3/docker/document-server HDD_PATH=/volume1/document-storage # 타임존 설정 TZ=Asia/Seoul EOF # 파일 권한 설정 (보안) chmod 600 "$ENV_FILE" log_success "환경 변수 파일이 생성되었습니다: $ENV_FILE" # 설정 요약 출력 echo "" echo "=== 📋 설정 요약 ===" echo -e "데이터베이스 비밀번호: ${CYAN}$DB_PASSWORD${NC}" echo -e "관리자 이메일: ${CYAN}$ADMIN_EMAIL${NC}" echo -e "관리자 비밀번호: ${CYAN}$ADMIN_PASSWORD${NC}" echo -e "도메인: ${CYAN}$DOMAIN_NAME${NC}" echo -e "포트: ${CYAN}$EXTERNAL_PORT${NC}" echo "" # 보안 정보 저장 SECURITY_INFO_FILE="/volume1/document-storage/backups/security-info-$(date +%Y%m%d_%H%M%S).txt" mkdir -p "$(dirname "$SECURITY_INFO_FILE")" 2>/dev/null || true cat > "$SECURITY_INFO_FILE" << EOF Document Server 보안 정보 생성일: $(date '+%Y-%m-%d %H:%M:%S') === 관리자 계정 === 이메일: $ADMIN_EMAIL 비밀번호: $ADMIN_PASSWORD === 데이터베이스 === 사용자: docuser 비밀번호: $DB_PASSWORD === 접속 정보 === 웹 인터페이스: http://$DOMAIN_NAME:$EXTERNAL_PORT API 문서: http://$DOMAIN_NAME:$((EXTERNAL_PORT + 2))/docs === 중요 안내 === - 이 파일은 안전한 곳에 보관하세요 - 비밀번호는 정기적으로 변경하세요 - 외부 접속 시 HTTPS 사용을 권장합니다 EOF chmod 600 "$SECURITY_INFO_FILE" 2>/dev/null || true log_success "보안 정보가 저장되었습니다: $SECURITY_INFO_FILE" # 다음 단계 안내 echo "" echo "=== 🚀 다음 단계 ===" echo "1. 배포 실행:" echo " ${CYAN}./scripts/deploy-synology.sh${NC}" echo "" echo "2. 상태 확인:" echo " ${CYAN}./scripts/monitor-synology.sh${NC}" echo "" echo "3. 웹 접속:" echo " ${CYAN}http://$DOMAIN_NAME:$EXTERNAL_PORT${NC}" echo "" # SSL 설정 권장사항 if [ "$DOMAIN_NAME" != "localhost" ]; then echo "=== 🔒 보안 권장사항 ===" echo "외부 도메인을 사용하시는 경우 SSL 인증서 설정을 권장합니다:" echo "" echo "1. Let's Encrypt 인증서 발급:" echo " ${CYAN}certbot certonly --webroot -w /volume2/document-storage/documents -d $DOMAIN_NAME${NC}" echo "" echo "2. Nginx SSL 설정 추가" echo "3. 방화벽에서 HTTPS(443) 포트 개방" echo "" fi log_success "환경 변수 설정이 완료되었습니다!"