Synology 볼륨 구성 수정: SSD=volume3, HDD=volume1로 경로 변경
This commit is contained in:
223
QUICK-START.md
Normal file
223
QUICK-START.md
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
# 🚀 빠른 시작 가이드
|
||||||
|
|
||||||
|
Document Server를 Synology DS1525+에 배포하는 가장 간단한 방법입니다.
|
||||||
|
|
||||||
|
## 📋 준비사항
|
||||||
|
|
||||||
|
- Synology DS1525+ (32GB RAM, SSD 캐시 활성화)
|
||||||
|
- Docker 패키지 설치 (Package Center에서 설치)
|
||||||
|
- SSH 접속 가능
|
||||||
|
- Git 설치 (선택사항)
|
||||||
|
|
||||||
|
## 🎯 한 번에 배포하기
|
||||||
|
|
||||||
|
### 방법 1: Git 클론 (권장) ⭐
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. NAS에 SSH 접속
|
||||||
|
ssh admin@your-nas-ip
|
||||||
|
|
||||||
|
# 2. 프로젝트 클론
|
||||||
|
cd /volume1/docker/
|
||||||
|
git clone https://git.hyungi.net/hyungi/document-server.git
|
||||||
|
cd document-server
|
||||||
|
|
||||||
|
# 3. 자동 배포 (환경 설정 + 배포)
|
||||||
|
./scripts/deploy-synology.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 방법 2: 파일 업로드
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 로컬에서 NAS로 파일 전송
|
||||||
|
scp -r ./document-server admin@your-nas-ip:/volume1/docker/
|
||||||
|
|
||||||
|
# 2. NAS에 SSH 접속
|
||||||
|
ssh admin@your-nas-ip
|
||||||
|
cd /volume1/docker/document-server
|
||||||
|
|
||||||
|
# 3. 자동 배포
|
||||||
|
./scripts/deploy-synology.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ 환경 설정 (자동)
|
||||||
|
|
||||||
|
배포 스크립트 실행 시 자동으로 환경 설정이 시작됩니다:
|
||||||
|
|
||||||
|
```
|
||||||
|
=== 🔧 Document Server 환경 변수 설정 ===
|
||||||
|
|
||||||
|
1. 데이터베이스 비밀번호
|
||||||
|
기본값: AbC123XyZ (자동생성)
|
||||||
|
입력: [엔터 = 기본값 사용]
|
||||||
|
|
||||||
|
2. JWT 시크릿 키 (보안용)
|
||||||
|
기본값: kL9mN2pQ... (자동생성)
|
||||||
|
입력: [엔터 = 기본값 사용]
|
||||||
|
|
||||||
|
3. 관리자 이메일
|
||||||
|
기본값: admin@document-server.local
|
||||||
|
입력: admin@mydomain.com
|
||||||
|
|
||||||
|
4. 관리자 비밀번호
|
||||||
|
기본값: MyPass123 (자동생성)
|
||||||
|
입력: [엔터 = 기본값 사용]
|
||||||
|
|
||||||
|
5. 도메인 이름 (외부 접속용)
|
||||||
|
기본값: localhost
|
||||||
|
입력: nas.mydomain.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**💡 팁**: 대부분 엔터만 눌러도 안전한 기본값이 자동 설정됩니다!
|
||||||
|
|
||||||
|
## 🎉 배포 완료 후
|
||||||
|
|
||||||
|
### 접속 확인
|
||||||
|
```
|
||||||
|
🌐 웹 인터페이스: http://your-nas-ip:24100
|
||||||
|
📧 관리자 이메일: admin@document-server.local
|
||||||
|
🔑 관리자 비밀번호: (설정 시 표시된 비밀번호)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 주요 기능 테스트
|
||||||
|
1. **할일관리**: `http://your-nas-ip:24100/todos.html`
|
||||||
|
2. **메모 트리**: `http://your-nas-ip:24100/memo-tree.html`
|
||||||
|
3. **노트북**: `http://your-nas-ip:24100/notebooks.html`
|
||||||
|
4. **문서 업로드**: 메인 페이지에서 HTML 파일 드래그&드롭
|
||||||
|
|
||||||
|
## 🔄 업데이트 방법
|
||||||
|
|
||||||
|
### Git 사용 (권장)
|
||||||
|
```bash
|
||||||
|
# NAS에 SSH 접속
|
||||||
|
ssh admin@your-nas-ip
|
||||||
|
cd /volume1/docker/document-server
|
||||||
|
|
||||||
|
# 자동 업데이트 (백업 + 업데이트 + 헬스체크)
|
||||||
|
./scripts/update-synology.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 수동 업데이트
|
||||||
|
```bash
|
||||||
|
# 1. 코드 업데이트
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# 2. 컨테이너 재시작
|
||||||
|
docker-compose -f docker-compose.synology-optimized.yml restart
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 모니터링
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 시스템 상태 확인
|
||||||
|
./scripts/monitor-synology.sh
|
||||||
|
|
||||||
|
# 실시간 모니터링 (5초 간격)
|
||||||
|
watch -n 5 './scripts/monitor-synology.sh'
|
||||||
|
|
||||||
|
# 로그 확인
|
||||||
|
docker-compose -f docker-compose.synology-optimized.yml logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚨 문제 해결
|
||||||
|
|
||||||
|
### 포트 충돌
|
||||||
|
```bash
|
||||||
|
# 포트 사용 확인
|
||||||
|
netstat -tuln | grep -E "(24100|24101|24102|24103)"
|
||||||
|
|
||||||
|
# 다른 포트 사용 시 .env.synology 파일 수정
|
||||||
|
nano .env.synology
|
||||||
|
# EXTERNAL_PORT=24200 (예시)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 권한 문제
|
||||||
|
```bash
|
||||||
|
# 디렉토리 권한 수정
|
||||||
|
sudo chown -R 1000:1000 /volume1/docker/document-server/
|
||||||
|
sudo chown -R 1000:1000 /volume2/document-storage/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 서비스 재시작
|
||||||
|
```bash
|
||||||
|
# 전체 재시작
|
||||||
|
docker-compose -f docker-compose.synology-optimized.yml restart
|
||||||
|
|
||||||
|
# 특정 서비스만 재시작
|
||||||
|
docker-compose -f docker-compose.synology-optimized.yml restart backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 롤백 (업데이트 실패 시)
|
||||||
|
```bash
|
||||||
|
# 이전 버전으로 롤백
|
||||||
|
./scripts/update-synology.sh rollback
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💾 백업
|
||||||
|
|
||||||
|
### 자동 백업 설정
|
||||||
|
```bash
|
||||||
|
# Synology 작업 스케줄러에서 설정
|
||||||
|
# 제어판 > 작업 스케줄러 > 생성 > 사용자 정의 스크립트
|
||||||
|
|
||||||
|
# 매일 새벽 2시 백업
|
||||||
|
0 2 * * * /volume1/docker/document-server/backup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 수동 백업
|
||||||
|
```bash
|
||||||
|
# 즉시 백업 실행
|
||||||
|
/volume1/docker/document-server/backup.sh
|
||||||
|
|
||||||
|
# 백업 파일 확인
|
||||||
|
ls -la /volume2/document-storage/backups/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔒 보안 설정
|
||||||
|
|
||||||
|
### 방화벽 (권장)
|
||||||
|
```bash
|
||||||
|
# Synology 제어판 > 보안 > 방화벽
|
||||||
|
# 규칙 추가: 포트 24100 허용
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSL 인증서 (외부 접속 시)
|
||||||
|
```bash
|
||||||
|
# Let's Encrypt 인증서 발급
|
||||||
|
certbot certonly --webroot -w /volume2/document-storage/documents -d your-domain.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📞 도움말
|
||||||
|
|
||||||
|
### 로그 수집 (문제 보고 시)
|
||||||
|
```bash
|
||||||
|
# 시스템 리포트 생성
|
||||||
|
./scripts/monitor-synology.sh > system-report.txt
|
||||||
|
|
||||||
|
# 로그 파일 위치
|
||||||
|
/volume1/docker/document-server/logs/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 유용한 명령어
|
||||||
|
```bash
|
||||||
|
# Docker 상태 확인
|
||||||
|
docker ps
|
||||||
|
docker stats
|
||||||
|
|
||||||
|
# 디스크 사용량 확인
|
||||||
|
df -h /volume1 /volume2
|
||||||
|
|
||||||
|
# 메모리 사용량 확인
|
||||||
|
free -h
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 요약
|
||||||
|
|
||||||
|
1. **배포**: `./scripts/deploy-synology.sh` (한 번만)
|
||||||
|
2. **업데이트**: `./scripts/update-synology.sh` (필요시)
|
||||||
|
3. **모니터링**: `./scripts/monitor-synology.sh` (상태 확인)
|
||||||
|
4. **접속**: `http://your-nas-ip:24100`
|
||||||
|
|
||||||
|
**🎉 이제 Document Server를 사용할 준비가 완료되었습니다!**
|
||||||
@@ -13,8 +13,8 @@ services:
|
|||||||
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C"
|
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C"
|
||||||
volumes:
|
volumes:
|
||||||
# SSD: 데이터베이스 (성능 최우선)
|
# SSD: 데이터베이스 (성능 최우선)
|
||||||
- /volume1/docker/document-server/database:/var/lib/postgresql/data
|
- /volume3/docker/document-server/database:/var/lib/postgresql/data
|
||||||
- /volume1/docker/document-server/config/postgresql.synology.conf:/etc/postgresql/postgresql.conf:ro
|
- /volume3/docker/document-server/config/postgresql.synology.conf:/etc/postgresql/postgresql.conf:ro
|
||||||
- ./database/init:/docker-entrypoint-initdb.d:ro
|
- ./database/init:/docker-entrypoint-initdb.d:ro
|
||||||
ports:
|
ports:
|
||||||
- "24101:5432"
|
- "24101:5432"
|
||||||
@@ -53,7 +53,7 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
# SSD: Redis 데이터 (빠른 캐시)
|
# SSD: Redis 데이터 (빠른 캐시)
|
||||||
- /volume1/docker/document-server/redis:/data
|
- /volume3/docker/document-server/redis:/data
|
||||||
ports:
|
ports:
|
||||||
- "24103:6379"
|
- "24103:6379"
|
||||||
command: >
|
command: >
|
||||||
@@ -100,15 +100,15 @@ services:
|
|||||||
- MAX_FILE_SIZE=500000000
|
- MAX_FILE_SIZE=500000000
|
||||||
volumes:
|
volumes:
|
||||||
# SSD: 애플리케이션 로그 및 설정 (빠른 액세스)
|
# SSD: 애플리케이션 로그 및 설정 (빠른 액세스)
|
||||||
- /volume1/docker/document-server/logs:/app/logs
|
- /volume3/docker/document-server/logs:/app/logs
|
||||||
- /volume1/docker/document-server/config:/app/config
|
- /volume3/docker/document-server/config:/app/config
|
||||||
- /volume1/docker/document-server/cache:/app/cache
|
- /volume3/docker/document-server/cache:/app/cache
|
||||||
|
|
||||||
# HDD: 대용량 파일 저장소 (비용 효율적)
|
# HDD: 대용량 파일 저장소 (비용 효율적)
|
||||||
- /volume2/document-storage/uploads:/app/uploads
|
- /volume1/document-storage/uploads:/app/uploads
|
||||||
- /volume2/document-storage/documents:/app/documents
|
- /volume1/document-storage/documents:/app/documents
|
||||||
- /volume2/document-storage/thumbnails:/app/thumbnails
|
- /volume1/document-storage/thumbnails:/app/thumbnails
|
||||||
- /volume2/document-storage/backups:/app/backups
|
- /volume1/document-storage/backups:/app/backups
|
||||||
ports:
|
ports:
|
||||||
- "24102:8000"
|
- "24102:8000"
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -139,16 +139,16 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
# SSD: Nginx 설정, 로그, 캐시 (성능 최적화)
|
# SSD: Nginx 설정, 로그, 캐시 (성능 최적화)
|
||||||
- /volume1/docker/document-server/nginx/conf.d:/etc/nginx/conf.d
|
- /volume3/docker/document-server/nginx/conf.d:/etc/nginx/conf.d
|
||||||
- /volume1/docker/document-server/nginx/cache:/var/cache/nginx
|
- /volume3/docker/document-server/nginx/cache:/var/cache/nginx
|
||||||
- /volume1/docker/document-server/logs/nginx:/var/log/nginx
|
- /volume3/docker/document-server/logs/nginx:/var/log/nginx
|
||||||
|
|
||||||
# SSD: 프론트엔드 정적 파일 (빠른 서빙)
|
# SSD: 프론트엔드 정적 파일 (빠른 서빙)
|
||||||
- ./frontend:/usr/share/nginx/html:ro
|
- ./frontend:/usr/share/nginx/html:ro
|
||||||
|
|
||||||
# HDD: 대용량 문서 파일 (읽기 전용)
|
# HDD: 대용량 문서 파일 (읽기 전용)
|
||||||
- /volume2/document-storage/uploads:/usr/share/nginx/html/uploads:ro
|
- /volume1/document-storage/uploads:/usr/share/nginx/html/uploads:ro
|
||||||
- /volume2/document-storage/documents:/usr/share/nginx/html/documents:ro
|
- /volume1/document-storage/documents:/usr/share/nginx/html/documents:ro
|
||||||
ports:
|
ports:
|
||||||
- "24100:80"
|
- "24100:80"
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|||||||
@@ -41,12 +41,24 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||||
COMPOSE_FILE="docker-compose.synology-optimized.yml"
|
COMPOSE_FILE="docker-compose.synology-optimized.yml"
|
||||||
|
|
||||||
# 기본 환경 변수
|
# 환경 변수 설정 확인
|
||||||
export DB_PASSWORD="${DB_PASSWORD:-$(openssl rand -base64 32)}"
|
ENV_FILE="$PROJECT_DIR/.env.synology"
|
||||||
export SECRET_KEY="${SECRET_KEY:-$(openssl rand -base64 64)}"
|
|
||||||
export ADMIN_EMAIL="${ADMIN_EMAIL:-admin@document-server.local}"
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
export ADMIN_PASSWORD="${ADMIN_PASSWORD:-$(openssl rand -base64 16)}"
|
log_info "환경 변수 파일이 없습니다. 설정을 시작합니다..."
|
||||||
export DOMAIN_NAME="${DOMAIN_NAME:-localhost}"
|
"$SCRIPT_DIR/setup-env.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 환경 변수 로드
|
||||||
|
if [ -f "$ENV_FILE" ]; then
|
||||||
|
log_info "환경 변수 파일을 로드합니다: $ENV_FILE"
|
||||||
|
set -a # 자동으로 export
|
||||||
|
source "$ENV_FILE"
|
||||||
|
set +a
|
||||||
|
else
|
||||||
|
log_error "환경 변수 파일을 찾을 수 없습니다"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
log_info "🚀 Synology DS1525+ 최적화 배포 시작"
|
log_info "🚀 Synology DS1525+ 최적화 배포 시작"
|
||||||
log_info "📁 프로젝트 디렉토리: $PROJECT_DIR"
|
log_info "📁 프로젝트 디렉토리: $PROJECT_DIR"
|
||||||
@@ -76,25 +88,25 @@ log_success "시스템 요구사항 확인 완료"
|
|||||||
# 2. 디렉토리 구조 생성
|
# 2. 디렉토리 구조 생성
|
||||||
log_info "📂 디렉토리 구조 생성 중..."
|
log_info "📂 디렉토리 구조 생성 중..."
|
||||||
|
|
||||||
# SSD 디렉토리 (성능 최우선)
|
# SSD 디렉토리 (성능 최우선) - Volume3
|
||||||
SSD_DIRS=(
|
SSD_DIRS=(
|
||||||
"/volume1/docker/document-server/database"
|
"/volume3/docker/document-server/database"
|
||||||
"/volume1/docker/document-server/redis"
|
"/volume3/docker/document-server/redis"
|
||||||
"/volume1/docker/document-server/logs"
|
"/volume3/docker/document-server/logs"
|
||||||
"/volume1/docker/document-server/logs/nginx"
|
"/volume3/docker/document-server/logs/nginx"
|
||||||
"/volume1/docker/document-server/config"
|
"/volume3/docker/document-server/config"
|
||||||
"/volume1/docker/document-server/nginx/conf.d"
|
"/volume3/docker/document-server/nginx/conf.d"
|
||||||
"/volume1/docker/document-server/nginx/cache"
|
"/volume3/docker/document-server/nginx/cache"
|
||||||
"/volume1/docker/document-server/cache"
|
"/volume3/docker/document-server/cache"
|
||||||
)
|
)
|
||||||
|
|
||||||
# HDD 디렉토리 (대용량 저장)
|
# HDD 디렉토리 (대용량 저장) - Volume1
|
||||||
HDD_DIRS=(
|
HDD_DIRS=(
|
||||||
"/volume2/document-storage/uploads"
|
"/volume1/document-storage/uploads"
|
||||||
"/volume2/document-storage/documents"
|
"/volume1/document-storage/documents"
|
||||||
"/volume2/document-storage/thumbnails"
|
"/volume1/document-storage/thumbnails"
|
||||||
"/volume2/document-storage/backups"
|
"/volume1/document-storage/backups"
|
||||||
"/volume2/document-storage/archives"
|
"/volume1/document-storage/archives"
|
||||||
)
|
)
|
||||||
|
|
||||||
# SSD 디렉토리 생성
|
# SSD 디렉토리 생성
|
||||||
@@ -114,8 +126,8 @@ for dir in "${HDD_DIRS[@]}"; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# 권한 설정
|
# 권한 설정
|
||||||
sudo chown -R 1000:1000 /volume1/docker/document-server/
|
sudo chown -R 1000:1000 /volume3/docker/document-server/
|
||||||
sudo chown -R 1000:1000 /volume2/document-storage/
|
sudo chown -R 1000:1000 /volume1/document-storage/
|
||||||
|
|
||||||
log_success "디렉토리 구조 생성 완료"
|
log_success "디렉토리 구조 생성 완료"
|
||||||
|
|
||||||
@@ -123,7 +135,7 @@ log_success "디렉토리 구조 생성 완료"
|
|||||||
log_info "⚙️ 설정 파일 생성 중..."
|
log_info "⚙️ 설정 파일 생성 중..."
|
||||||
|
|
||||||
# PostgreSQL 설정 (32GB RAM 최적화)
|
# PostgreSQL 설정 (32GB RAM 최적화)
|
||||||
cat > /volume1/docker/document-server/config/postgresql.synology.conf << 'EOF'
|
cat > /volume3/docker/document-server/config/postgresql.synology.conf << 'EOF'
|
||||||
# PostgreSQL 설정 - Synology DS1525+ 32GB RAM 최적화
|
# PostgreSQL 설정 - Synology DS1525+ 32GB RAM 최적화
|
||||||
|
|
||||||
# 메모리 설정 (32GB RAM 기준)
|
# 메모리 설정 (32GB RAM 기준)
|
||||||
@@ -168,7 +180,7 @@ autovacuum_naptime = 30s
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Nginx 설정 (SSD 캐시 최적화)
|
# Nginx 설정 (SSD 캐시 최적화)
|
||||||
cat > /volume1/docker/document-server/nginx/conf.d/default.conf << 'EOF'
|
cat > /volume3/docker/document-server/nginx/conf.d/default.conf << 'EOF'
|
||||||
# Nginx 설정 - SSD 캐시 최적화
|
# Nginx 설정 - SSD 캐시 최적화
|
||||||
|
|
||||||
# 업스트림 백엔드
|
# 업스트림 백엔드
|
||||||
|
|||||||
257
scripts/setup-env.sh
Executable file
257
scripts/setup-env.sh
Executable file
@@ -0,0 +1,257 @@
|
|||||||
|
#!/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 "환경 변수 설정이 완료되었습니다!"
|
||||||
303
scripts/update-synology.sh
Executable file
303
scripts/update-synology.sh
Executable file
@@ -0,0 +1,303 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Document Server - Synology 업데이트 스크립트
|
||||||
|
# Git을 통한 무중단 업데이트 및 롤백 지원
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 색상 정의
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 환경 설정
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||||
|
COMPOSE_FILE="docker-compose.synology-optimized.yml"
|
||||||
|
BACKUP_DIR="/volume2/document-storage/backups"
|
||||||
|
UPDATE_LOG="/volume1/docker/document-server/logs/update.log"
|
||||||
|
|
||||||
|
# 업데이트 모드 설정
|
||||||
|
UPDATE_MODE="${1:-safe}" # safe, force, rollback
|
||||||
|
|
||||||
|
log_info "🔄 Document Server 업데이트 시작 (모드: $UPDATE_MODE)"
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - 업데이트 시작: $UPDATE_MODE" >> "$UPDATE_LOG"
|
||||||
|
|
||||||
|
cd "$PROJECT_DIR"
|
||||||
|
|
||||||
|
# 현재 상태 확인
|
||||||
|
log_info "📊 현재 상태 확인 중..."
|
||||||
|
|
||||||
|
# Git 상태 확인
|
||||||
|
if [ ! -d ".git" ]; then
|
||||||
|
log_error "Git 저장소가 아닙니다. Git 클론으로 설치해주세요."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 현재 커밋 해시 저장 (롤백용)
|
||||||
|
CURRENT_COMMIT=$(git rev-parse HEAD)
|
||||||
|
CURRENT_BRANCH=$(git branch --show-current)
|
||||||
|
echo "이전 커밋: $CURRENT_COMMIT" >> "$UPDATE_LOG"
|
||||||
|
|
||||||
|
log_info "현재 브랜치: $CURRENT_BRANCH"
|
||||||
|
log_info "현재 커밋: ${CURRENT_COMMIT:0:8}"
|
||||||
|
|
||||||
|
# 컨테이너 상태 확인
|
||||||
|
if docker-compose -f "$COMPOSE_FILE" ps -q | grep -q .; then
|
||||||
|
CONTAINERS_RUNNING=true
|
||||||
|
log_info "컨테이너가 실행 중입니다"
|
||||||
|
else
|
||||||
|
CONTAINERS_RUNNING=false
|
||||||
|
log_warning "컨테이너가 실행 중이지 않습니다"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 롤백 모드
|
||||||
|
if [ "$UPDATE_MODE" = "rollback" ]; then
|
||||||
|
log_warning "🔙 롤백 모드 실행"
|
||||||
|
|
||||||
|
# 마지막 성공한 커밋으로 롤백
|
||||||
|
LAST_SUCCESS=$(tail -n 20 "$UPDATE_LOG" | grep "업데이트 성공" | tail -n 1 | awk '{print $6}')
|
||||||
|
|
||||||
|
if [ -z "$LAST_SUCCESS" ]; then
|
||||||
|
log_error "롤백할 커밋을 찾을 수 없습니다"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "롤백 대상 커밋: $LAST_SUCCESS"
|
||||||
|
|
||||||
|
# 롤백 실행
|
||||||
|
git reset --hard "$LAST_SUCCESS"
|
||||||
|
|
||||||
|
# 컨테이너 재시작
|
||||||
|
if [ "$CONTAINERS_RUNNING" = true ]; then
|
||||||
|
log_info "컨테이너 재시작 중..."
|
||||||
|
docker-compose -f "$COMPOSE_FILE" down
|
||||||
|
docker-compose -f "$COMPOSE_FILE" up -d --build
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "롤백 완료: $LAST_SUCCESS"
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - 롤백 완료: $LAST_SUCCESS" >> "$UPDATE_LOG"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 업데이트 가능 여부 확인
|
||||||
|
log_info "🔍 업데이트 확인 중..."
|
||||||
|
|
||||||
|
# 원격 저장소에서 최신 정보 가져오기
|
||||||
|
git fetch origin
|
||||||
|
|
||||||
|
# 업데이트 가능한 커밋 수 확인
|
||||||
|
COMMITS_BEHIND=$(git rev-list --count HEAD..origin/$CURRENT_BRANCH)
|
||||||
|
|
||||||
|
if [ "$COMMITS_BEHIND" -eq 0 ]; then
|
||||||
|
log_success "이미 최신 버전입니다"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "업데이트 가능한 커밋: $COMMITS_BEHIND개"
|
||||||
|
|
||||||
|
# 변경사항 미리보기
|
||||||
|
log_info "📝 변경사항 미리보기:"
|
||||||
|
git log --oneline HEAD..origin/$CURRENT_BRANCH | head -10
|
||||||
|
|
||||||
|
# Safe 모드에서 사용자 확인
|
||||||
|
if [ "$UPDATE_MODE" = "safe" ]; then
|
||||||
|
echo ""
|
||||||
|
read -p "업데이트를 진행하시겠습니까? (y/N): " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
log_info "업데이트가 취소되었습니다"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 백업 생성
|
||||||
|
log_info "💾 백업 생성 중..."
|
||||||
|
|
||||||
|
BACKUP_TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||||
|
BACKUP_NAME="pre_update_${BACKUP_TIMESTAMP}"
|
||||||
|
|
||||||
|
# 데이터베이스 백업
|
||||||
|
if [ "$CONTAINERS_RUNNING" = true ]; then
|
||||||
|
docker-compose -f "$COMPOSE_FILE" exec -T database pg_dump -U docuser document_db > "$BACKUP_DIR/db_${BACKUP_NAME}.sql"
|
||||||
|
log_success "데이터베이스 백업 완료"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 설정 파일 백업
|
||||||
|
tar -czf "$BACKUP_DIR/config_${BACKUP_NAME}.tar.gz" \
|
||||||
|
/volume1/docker/document-server/config/ \
|
||||||
|
.env.synology 2>/dev/null || true
|
||||||
|
|
||||||
|
log_success "설정 파일 백업 완료"
|
||||||
|
|
||||||
|
# Git 업데이트 실행
|
||||||
|
log_info "📥 코드 업데이트 중..."
|
||||||
|
|
||||||
|
# 로컬 변경사항 임시 저장 (있는 경우)
|
||||||
|
if ! git diff --quiet; then
|
||||||
|
log_warning "로컬 변경사항을 임시 저장합니다"
|
||||||
|
git stash push -m "Auto-stash before update $BACKUP_TIMESTAMP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 업데이트 실행
|
||||||
|
git pull origin "$CURRENT_BRANCH"
|
||||||
|
|
||||||
|
NEW_COMMIT=$(git rev-parse HEAD)
|
||||||
|
log_success "코드 업데이트 완료: ${NEW_COMMIT:0:8}"
|
||||||
|
|
||||||
|
# Docker 이미지 업데이트 확인
|
||||||
|
log_info "🐳 Docker 이미지 업데이트 확인 중..."
|
||||||
|
|
||||||
|
# Dockerfile이나 requirements.txt 변경 확인
|
||||||
|
NEED_REBUILD=false
|
||||||
|
|
||||||
|
if git diff --name-only "$CURRENT_COMMIT" "$NEW_COMMIT" | grep -E "(Dockerfile|requirements.txt|pyproject.toml|package.json)" > /dev/null; then
|
||||||
|
NEED_REBUILD=true
|
||||||
|
log_info "의존성 변경 감지 - 이미지 재빌드 필요"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 컨테이너 업데이트
|
||||||
|
if [ "$CONTAINERS_RUNNING" = true ]; then
|
||||||
|
log_info "🔄 서비스 업데이트 중..."
|
||||||
|
|
||||||
|
if [ "$NEED_REBUILD" = true ]; then
|
||||||
|
log_info "이미지 재빌드 중..."
|
||||||
|
|
||||||
|
# 무중단 업데이트를 위한 단계별 재시작
|
||||||
|
docker-compose -f "$COMPOSE_FILE" build --no-cache backend
|
||||||
|
docker-compose -f "$COMPOSE_FILE" up -d --no-deps backend
|
||||||
|
|
||||||
|
# 헬스체크 대기
|
||||||
|
log_info "백엔드 헬스체크 대기 중..."
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# Nginx 업데이트 (필요시)
|
||||||
|
if git diff --name-only "$CURRENT_COMMIT" "$NEW_COMMIT" | grep -E "(nginx|frontend)" > /dev/null; then
|
||||||
|
docker-compose -f "$COMPOSE_FILE" build --no-cache nginx
|
||||||
|
docker-compose -f "$COMPOSE_FILE" up -d --no-deps nginx
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_info "설정 파일만 업데이트 - 재시작 중..."
|
||||||
|
docker-compose -f "$COMPOSE_FILE" restart backend nginx
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 서비스 상태 확인
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
# 헬스체크
|
||||||
|
HEALTH_CHECK_FAILED=false
|
||||||
|
|
||||||
|
# 백엔드 헬스체크
|
||||||
|
if ! curl -f http://localhost:24102/health > /dev/null 2>&1; then
|
||||||
|
log_error "백엔드 헬스체크 실패"
|
||||||
|
HEALTH_CHECK_FAILED=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 프론트엔드 헬스체크
|
||||||
|
if ! curl -f http://localhost:24100/ > /dev/null 2>&1; then
|
||||||
|
log_error "프론트엔드 헬스체크 실패"
|
||||||
|
HEALTH_CHECK_FAILED=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 헬스체크 실패 시 롤백
|
||||||
|
if [ "$HEALTH_CHECK_FAILED" = true ]; then
|
||||||
|
log_error "헬스체크 실패 - 자동 롤백 실행"
|
||||||
|
|
||||||
|
# 이전 커밋으로 롤백
|
||||||
|
git reset --hard "$CURRENT_COMMIT"
|
||||||
|
|
||||||
|
# 컨테이너 롤백
|
||||||
|
docker-compose -f "$COMPOSE_FILE" down
|
||||||
|
docker-compose -f "$COMPOSE_FILE" up -d --build
|
||||||
|
|
||||||
|
log_error "업데이트 실패 - 이전 버전으로 롤백됨"
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - 업데이트 실패 (롤백): $NEW_COMMIT -> $CURRENT_COMMIT" >> "$UPDATE_LOG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "서비스 업데이트 완료"
|
||||||
|
else
|
||||||
|
log_info "컨테이너가 실행 중이지 않아 서비스 업데이트를 건너뜁니다"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 데이터베이스 마이그레이션 확인
|
||||||
|
log_info "🗄️ 데이터베이스 마이그레이션 확인 중..."
|
||||||
|
|
||||||
|
if git diff --name-only "$CURRENT_COMMIT" "$NEW_COMMIT" | grep -E "(migrations|models)" > /dev/null; then
|
||||||
|
log_warning "데이터베이스 스키마 변경 감지"
|
||||||
|
|
||||||
|
if [ "$CONTAINERS_RUNNING" = true ]; then
|
||||||
|
log_info "마이그레이션 실행 중..."
|
||||||
|
docker-compose -f "$COMPOSE_FILE" exec -T backend python -m alembic upgrade head || true
|
||||||
|
log_success "마이그레이션 완료"
|
||||||
|
else
|
||||||
|
log_warning "컨테이너가 실행 중이지 않아 마이그레이션을 건너뜁니다"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 업데이트 완료
|
||||||
|
log_success "🎉 업데이트 완료!"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 업데이트 정보 ==="
|
||||||
|
echo "이전 커밋: ${CURRENT_COMMIT:0:8}"
|
||||||
|
echo "새 커밋: ${NEW_COMMIT:0:8}"
|
||||||
|
echo "업데이트된 커밋 수: $COMMITS_BEHIND"
|
||||||
|
echo "백업 위치: $BACKUP_DIR/*_${BACKUP_NAME}.*"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 변경사항 요약
|
||||||
|
echo "=== 주요 변경사항 ==="
|
||||||
|
git log --oneline "$CURRENT_COMMIT".."$NEW_COMMIT" | head -5
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 서비스 상태 ==="
|
||||||
|
if [ "$CONTAINERS_RUNNING" = true ]; then
|
||||||
|
docker-compose -f "$COMPOSE_FILE" ps
|
||||||
|
echo ""
|
||||||
|
echo "🌐 웹 인터페이스: http://localhost:24100"
|
||||||
|
echo "🔧 API 문서: http://localhost:24102/docs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 성공 로그 기록
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - 업데이트 성공: $CURRENT_COMMIT -> $NEW_COMMIT" >> "$UPDATE_LOG"
|
||||||
|
|
||||||
|
# 정리 작업
|
||||||
|
log_info "🧹 정리 작업 중..."
|
||||||
|
|
||||||
|
# 오래된 백업 파일 정리 (30일 이상)
|
||||||
|
find "$BACKUP_DIR" -name "pre_update_*" -mtime +30 -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
# Docker 이미지 정리
|
||||||
|
docker system prune -f > /dev/null 2>&1 || true
|
||||||
|
|
||||||
|
log_success "업데이트 프로세스 완료"
|
||||||
|
|
||||||
|
# 모니터링 실행 제안
|
||||||
|
echo ""
|
||||||
|
echo "💡 업데이트 후 시스템 상태를 확인하려면:"
|
||||||
|
echo " ./scripts/monitor-synology.sh"
|
||||||
|
echo ""
|
||||||
|
echo "🔙 문제가 있으면 롤백하려면:"
|
||||||
|
echo " ./scripts/update-synology.sh rollback"
|
||||||
Reference in New Issue
Block a user