258 lines
6.9 KiB
Bash
Executable File
258 lines
6.9 KiB
Bash
Executable File
#!/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 "환경 변수 설정이 완료되었습니다!"
|