# πŸš€ 개발-배포 톡합 κ°€μ΄λ“œ (Mac β†’ DS1525+ 32GB) ## πŸ“‹ κ°œμš” Macμ—μ„œ κ°œλ°œν•˜κ³  Synology DS1525+ (32GB RAM, 480GB SSD)에 λ°°ν¬ν•˜λŠ” μ™„μ „ν•œ 개발-배포 νŒŒμ΄ν”„λΌμΈ κ°€μ΄λ“œμž…λ‹ˆλ‹€. --- ## πŸ”§ ν•˜λ“œμ›¨μ–΄ 사양 ### 개발 ν™˜κ²½: Mac - **MacBook Pro/Mac Mini** (M1/M2 λ˜λŠ” Intel) - **λ©”λͺ¨λ¦¬**: 16GB 이상 ꢌμž₯ - **μ €μž₯곡간**: 100GB 이상 μ—¬μœ  곡간 ### 배포 ν™˜κ²½: Synology DS1525+ - **CPU**: AMD Ryzen R1600 (4μ½”μ–΄ 2.6GHz) - **λ©”λͺ¨λ¦¬**: 32GB RAM (λŒ€μš©λŸ‰!) - **μ €μž₯μž₯치**: μ‹œλ†€λ‘œμ§€ μ •ν’ˆ 2.5" SSD 480GB - **λ„€νŠΈμ›Œν¬**: κΈ°κ°€λΉ„νŠΈ 이더넷 x4 - **OS**: DSM 7.0+ --- ## 🐳 Docker 기반 개발-배포 μ „λž΅ ### μ•„ν‚€ν…μ²˜ ν˜Έν™˜μ„± ν•΄κ²° ``` Mac (개발) DS1525+ (배포) β”œβ”€β”€ M1/M2: arm64 β†’ β”œβ”€β”€ AMD Ryzen: amd64 β”œβ”€β”€ Intel: amd64 β†’ └── Linux μ»¨ν…Œμ΄λ„ˆ └── Docker Desktop └── Container Manager ``` **핡심 ν•΄κ²°μ±…: λ©€ν‹° μ•„ν‚€ν…μ²˜ λΉŒλ“œ** - Macμ—μ„œ 개발: `arm64` λ˜λŠ” `amd64` - DS1525+μ—μ„œ μ‹€ν–‰: `amd64` 보μž₯ - 크둜슀 ν”Œλž«νΌ λΉŒλ“œλ‘œ ν˜Έν™˜μ„± 문제 μ™„μ „ ν•΄κ²° --- ## πŸ› οΈ 1단계: Mac 개발 ν™˜κ²½ μ„€μ • ### Docker Desktop μ„€μΉ˜ 및 μ΅œμ ν™” ```bash # Homebrew둜 Docker Desktop μ„€μΉ˜ brew install --cask docker # Docker Desktop λ¦¬μ†ŒμŠ€ μ„€μ • (GUI) # Memory: 8GB (16GB Mac κΈ°μ€€) # CPUs: 4 cores # Swap: 2GB # Disk: 100GB ``` ### Docker Buildx μ„€μ • (λ©€ν‹° μ•„ν‚€ν…μ²˜ λΉŒλ“œμš©) ```bash # λ©€ν‹° ν”Œλž«νΌ λΉŒλ” 생성 docker buildx create --name multiarch --driver docker-container --use docker buildx inspect --bootstrap # 지원 ν”Œλž«νΌ 확인 docker buildx ls ``` ### ν”„λ‘œμ νŠΈ ꡬ쑰 μ„€μ • ``` project/ β”œβ”€β”€ docker/ β”‚ β”œβ”€β”€ Dockerfile.dev # Mac 개발용 β”‚ β”œβ”€β”€ Dockerfile.prod # DS1525+ 배포용 β”‚ β”œβ”€β”€ docker-compose.dev.yml # 둜컬 개발 β”‚ └── docker-compose.prod.yml# DS1525+ 배포 β”œβ”€β”€ scripts/ β”‚ β”œβ”€β”€ dev-start.sh # 개발 μ‹œμž‘ β”‚ β”œβ”€β”€ build-deploy.sh # λΉŒλ“œ & 배포 β”‚ └── rollback.sh # λ‘€λ°± β”œβ”€β”€ src/ β”‚ β”œβ”€β”€ backend/ β”‚ └── frontend/ β”œβ”€β”€ config/ β”‚ β”œβ”€β”€ nginx/ β”‚ β”œβ”€β”€ postgres/ β”‚ └── monitoring/ └── environments/ β”œβ”€β”€ .env.development └── .env.production ``` --- ## πŸ—οΈ 2단계: 개발용 Docker μ„€μ • ### 개발용 Dockerfile ```dockerfile # docker/Dockerfile.dev FROM --platform=linux/amd64 python:3.11-slim # 개발 도ꡬ μ„€μΉ˜ RUN apt-get update && apt-get install -y \ gcc g++ curl vim git \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Python 개발 μ˜μ‘΄μ„± COPY requirements.dev.txt . RUN pip install --no-cache-dir -r requirements.dev.txt # ν™˜κ²½ μ„€μ • ENV PYTHONPATH=/app ENV PYTHONUNBUFFERED=1 ENV RELOAD=true EXPOSE 8000 5678 # Hot Reload 개발 μ„œλ²„ CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] ``` ### 개발용 Docker Compose ```yaml # docker/docker-compose.dev.yml version: '3.8' services: app: build: context: .. dockerfile: docker/Dockerfile.dev platform: linux/amd64 # DS1525+ ν˜Έν™˜μ„± 보μž₯ container_name: app-dev environment: - DEBUG=true - DATABASE_URL=postgresql://dev_user:dev_pass@postgres:5432/app_dev - REDIS_URL=redis://redis:6379/0 volumes: - ../src:/app/src:cached # Mac μ„±λŠ₯ μ΅œμ ν™” - ../config:/app/config:cached ports: - "8000:8000" - "5678:5678" # 디버깅 포트 depends_on: - postgres - redis networks: - dev-network postgres: image: postgres:15-alpine platform: linux/amd64 container_name: postgres-dev environment: POSTGRES_DB: app_dev POSTGRES_USER: dev_user POSTGRES_PASSWORD: dev_pass volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" networks: - dev-network redis: image: redis:7-alpine platform: linux/amd64 container_name: redis-dev volumes: - redis_data:/data ports: - "6379:6379" networks: - dev-network networks: dev-network: driver: bridge volumes: postgres_data: redis_data: ``` ### 개발 μ‹œμž‘ 슀크립트 ```bash #!/bin/bash # scripts/dev-start.sh echo "πŸš€ 개발 ν™˜κ²½ μ‹œμž‘" # 개발 μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ docker-compose -f docker/docker-compose.dev.yml up -d # μ„œλΉ„μŠ€ μ€€λΉ„ λŒ€κΈ° echo "⏳ μ„œλΉ„μŠ€ μ‹œμž‘ λŒ€κΈ°..." sleep 15 # ν—¬μŠ€μ²΄ν¬ if curl -f http://localhost:8000/health > /dev/null 2>&1; then echo "βœ… 개발 ν™˜κ²½ μ€€λΉ„ μ™„λ£Œ!" echo "🌐 μ• ν”Œλ¦¬μΌ€μ΄μ…˜: http://localhost:8000" echo "πŸ—„οΈ λ°μ΄ν„°λ² μ΄μŠ€: localhost:5432" echo "πŸ”΄ Redis: localhost:6379" else echo "❌ μ„œλΉ„μŠ€ μ‹œμž‘ μ‹€νŒ¨" docker-compose -f docker/docker-compose.dev.yml logs fi ``` --- ## 🏭 3단계: DS1525+ 배포 ν™˜κ²½ μ„€μ • ### DS1525+ 32GB μ΅œμ ν™” ꡬ성 ``` 총 λ©”λͺ¨λ¦¬: 32GB ν• λ‹Ή κ³„νš β”œβ”€β”€ DSM μ‹œμŠ€ν…œ: 2GB β”œβ”€β”€ PostgreSQL: 4GB (κ³ μ„±λŠ₯ DB) β”œβ”€β”€ Elasticsearch: 8GB (λŒ€μš©λŸ‰ 검색) β”œβ”€β”€ Redis: 2GB (λŒ€μš©λŸ‰ μΊμ‹œ) β”œβ”€β”€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜: 4GB (λ©€ν‹° μ›Œμ»€) β”œβ”€β”€ λͺ¨λ‹ˆν„°λ§: 2GB (Prometheus + Grafana) β”œβ”€β”€ μ‹œμŠ€ν…œ μΊμ‹œ: 8GB └── μ—¬μœ  곡간: 2GB ``` ### 배포용 Dockerfile (μ΅œμ ν™”) ```dockerfile # docker/Dockerfile.prod FROM --platform=$BUILDPLATFORM python:3.11-slim AS builder ARG TARGETPLATFORM ARG BUILDPLATFORM WORKDIR /app # μ‹œμŠ€ν…œ νŒ¨ν‚€μ§€ μ„€μΉ˜ RUN apt-get update && apt-get install -y \ gcc g++ curl \ && rm -rf /var/lib/apt/lists/* # Python μ˜μ‘΄μ„± μ„€μΉ˜ COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # ν”„λ‘œλ•μ…˜ 이미지 FROM python:3.11-slim AS production WORKDIR /app # λΉŒλ“œλœ νŒ¨ν‚€μ§€ 볡사 COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ 볡사 COPY src/ ./src/ COPY config/ ./config/ # ν—¬μŠ€μ²΄ν¬ μΆ”κ°€ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 EXPOSE 8000 CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"] ``` ### DS1525+ 배포용 Docker Compose ```yaml # docker/docker-compose.prod.yml version: '3.8' services: app: build: context: .. dockerfile: docker/Dockerfile.prod platforms: - linux/amd64 container_name: app-prod environment: - DATABASE_URL=postgresql://app_user:${DB_PASSWORD}@postgres:5432/app_prod - REDIS_URL=redis://redis:6379/0 - WORKERS=4 volumes: - /volume1/docker/app/logs:/app/logs ports: - "8000:8000" networks: - prod-network depends_on: - postgres - redis restart: unless-stopped deploy: resources: limits: memory: 4G cpus: '2.0' postgres: image: postgres:15-alpine platform: linux/amd64 container_name: postgres-prod environment: POSTGRES_DB: app_prod POSTGRES_USER: app_user POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - /volume1/docker/app/data/postgres:/var/lib/postgresql/data - ../config/postgresql.conf:/etc/postgresql/postgresql.conf ports: - "5432:5432" networks: - prod-network restart: unless-stopped deploy: resources: limits: memory: 4G cpus: '2.0' command: postgres -c config_file=/etc/postgresql/postgresql.conf redis: image: redis:7-alpine platform: linux/amd64 container_name: redis-prod command: redis-server --maxmemory 2gb --maxmemory-policy allkeys-lru volumes: - /volume1/docker/app/data/redis:/data ports: - "6379:6379" networks: - prod-network restart: unless-stopped deploy: resources: limits: memory: 2G cpus: '1.0' elasticsearch: image: elasticsearch:8.11.0 platform: linux/amd64 container_name: elasticsearch-prod environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms4g -Xmx8g" - xpack.security.enabled=false volumes: - /volume1/docker/app/data/elasticsearch:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - prod-network restart: unless-stopped deploy: resources: limits: memory: 10G cpus: '2.0' nginx: image: nginx:alpine platform: linux/amd64 container_name: nginx-prod volumes: - ../config/nginx/nginx.conf:/etc/nginx/nginx.conf - /volume1/docker/app/logs:/var/log/nginx ports: - "80:80" - "443:443" networks: - prod-network depends_on: - app restart: unless-stopped # λͺ¨λ‹ˆν„°λ§ prometheus: image: prom/prometheus:latest platform: linux/amd64 container_name: prometheus volumes: - ../config/prometheus.yml:/etc/prometheus/prometheus.yml - /volume1/docker/app/data/prometheus:/prometheus ports: - "9090:9090" networks: - prod-network restart: unless-stopped deploy: resources: limits: memory: 1G grafana: image: grafana/grafana:latest platform: linux/amd64 container_name: grafana environment: - GF_SECURITY_ADMIN_PASSWORD=admin123 volumes: - /volume1/docker/app/data/grafana:/var/lib/grafana ports: - "3000:3000" networks: - prod-network restart: unless-stopped deploy: resources: limits: memory: 1G networks: prod-network: driver: bridge volumes: postgres_data: redis_data: elasticsearch_data: ``` --- ## πŸš€ 4단계: μžλ™ν™” λΉŒλ“œ & 배포 ### 톡합 λΉŒλ“œ-배포 슀크립트 ```bash #!/bin/bash # scripts/build-deploy.sh set -e # μ„€μ • PROJECT_NAME="app" NAS_HOST="192.168.1.100" NAS_USER="admin" VERSION=$(git describe --tags --always --dirty) echo "πŸš€ λΉŒλ“œ & 배포 μ‹œμž‘: $PROJECT_NAME v$VERSION" # 1. 둜컬 ν…ŒμŠ€νŠΈ echo "πŸ§ͺ 둜컬 ν…ŒμŠ€νŠΈ μ‹€ν–‰..." docker-compose -f docker/docker-compose.dev.yml up -d sleep 30 if curl -f http://localhost:8000/health > /dev/null 2>&1; then echo "βœ… 둜컬 ν…ŒμŠ€νŠΈ 톡과" docker-compose -f docker/docker-compose.dev.yml down else echo "❌ 둜컬 ν…ŒμŠ€νŠΈ μ‹€νŒ¨" docker-compose -f docker/docker-compose.dev.yml logs exit 1 fi # 2. λ©€ν‹° μ•„ν‚€ν…μ²˜ λΉŒλ“œ (DS1525+ ν˜Έν™˜) echo "πŸ”¨ DS1525+ ν˜Έν™˜ 이미지 λΉŒλ“œ..." docker buildx build \ --platform linux/amd64 \ --tag $PROJECT_NAME:$VERSION \ --tag $PROJECT_NAME:latest \ --file docker/Dockerfile.prod \ --load \ . # 3. DS1525+둜 이미지 전솑 echo "πŸ“€ DS1525+둜 이미지 전솑..." docker save $PROJECT_NAME:latest | ssh $NAS_USER@$NAS_HOST "docker load" # 4. ν™˜κ²½λ³€μˆ˜ 동기화 echo "βš™οΈ ν™˜κ²½λ³€μˆ˜ 동기화..." scp environments/.env.production $NAS_USER@$NAS_HOST:/volume1/docker/$PROJECT_NAME/.env # 5. DS1525+μ—μ„œ 배포 μ‹€ν–‰ echo "🚒 DS1525+ 배포 μ‹€ν–‰..." ssh $NAS_USER@$NAS_HOST << EOF cd /volume1/docker/$PROJECT_NAME # κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆ λ°±μ—… (둀백용) if docker-compose -f docker-compose.prod.yml ps | grep -q "Up"; then echo "πŸ“¦ 둀백용 λ°±μ—… 생성..." docker-compose -f docker-compose.prod.yml config > docker-compose.backup.yml docker images --format "{{.Repository}}:{{.Tag}}" | grep $PROJECT_NAME | head -1 > last_image.txt fi # μƒˆ 버전 배포 docker-compose -f docker-compose.prod.yml down docker-compose -f docker-compose.prod.yml up -d # 이미지 정리 docker image prune -f EOF # 6. 배포 ν›„ ν—¬μŠ€μ²΄ν¬ echo "πŸ₯ 배포 ν›„ ν—¬μŠ€μ²΄ν¬..." sleep 60 for i in {1..10}; do if curl -f http://$NAS_HOST:8000/health > /dev/null 2>&1; then echo "βœ… 배포 성곡 및 ν—¬μŠ€μ²΄ν¬ 톡과" break fi if [ $i -eq 10 ]; then echo "❌ ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ - λ‘€λ°± ν•„μš”" exit 1 fi echo "⏳ ν—¬μŠ€μ²΄ν¬ μž¬μ‹œλ„ ($i/10)..." sleep 10 done # 7. 배포 μ™„λ£Œ 정보 echo "" echo "πŸŽ‰ 배포 μ™„λ£Œ!" echo "πŸ“Š 배포 정보:" echo " - ν”„λ‘œμ νŠΈ: $PROJECT_NAME" echo " - 버전: $VERSION" echo " - λŒ€μƒ: DS1525+ (32GB RAM, 480GB SSD)" echo " - 배포 μ‹œκ°„: $(date)" echo "" echo "πŸ”— 접속 링크:" echo " - μ• ν”Œλ¦¬μΌ€μ΄μ…˜: http://$NAS_HOST" echo " - λͺ¨λ‹ˆν„°λ§: http://$NAS_HOST:3000 (admin/admin123)" echo " - Prometheus: http://$NAS_HOST:9090" ``` ### λ‘€λ°± 슀크립트 ```bash #!/bin/bash # scripts/rollback.sh set -e NAS_HOST="192.168.1.100" NAS_USER="admin" PROJECT_NAME="app" echo "πŸ”„ λ‘€λ°± μ‹œμž‘..." ssh $NAS_USER@$NAS_HOST << EOF cd /volume1/docker/$PROJECT_NAME # λ°±μ—… 파일 확인 if [[ ! -f "docker-compose.backup.yml" ]] || [[ ! -f "last_image.txt" ]]; then echo "❌ λ°±μ—… νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€" exit 1 fi # ν˜„μž¬ μ»¨ν…Œμ΄λ„ˆ 쀑지 docker-compose -f docker-compose.prod.yml down # 이전 μ„€μ •μœΌλ‘œ 볡원 cp docker-compose.backup.yml docker-compose.prod.yml # μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ docker-compose -f docker-compose.prod.yml up -d echo "βœ… λ‘€λ°± μ™„λ£Œ" EOF # ν—¬μŠ€μ²΄ν¬ sleep 30 if curl -f http://$NAS_HOST:8000/health > /dev/null 2>&1; then echo "βœ… λ‘€λ°± 성곡 및 ν—¬μŠ€μ²΄ν¬ 톡과" else echo "❌ λ‘€λ°± ν›„ ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨" exit 1 fi ``` --- ## πŸ“Š 5단계: DS1525+ μ„±λŠ₯ μ΅œμ ν™” ### PostgreSQL μ΅œμ ν™” (32GB ν™œμš©) ```ini # config/postgresql.conf # DS1525+ 32GB RAM μ΅œμ ν™” # λ©”λͺ¨λ¦¬ μ„€μ • shared_buffers = 2GB # 32GB의 6.25% effective_cache_size = 16GB # 32GB의 50% maintenance_work_mem = 512MB work_mem = 64MB # AMD Ryzen 4μ½”μ–΄ ν™œμš© max_worker_processes = 4 max_parallel_workers = 4 max_parallel_workers_per_gather = 2 # SSD μ΅œμ ν™” random_page_cost = 1.1 effective_io_concurrency = 200 # μ—°κ²° 및 체크포인트 max_connections = 200 checkpoint_completion_target = 0.9 checkpoint_timeout = 15min max_wal_size = 4GB ``` ### Nginx μ„€μ • (κ³ μ„±λŠ₯) ```nginx # config/nginx/nginx.conf worker_processes 4; # AMD Ryzen 4μ½”μ–΄ events { worker_connections 2048; use epoll; multi_accept on; } http { upstream app { server app:8000; keepalive 32; } server { listen 80; server_name _; client_max_body_size 100M; # 정적 파일 캐싱 location /static/ { expires 1y; add_header Cache-Control "public, immutable"; } # API ν”„λ‘μ‹œ location / { proxy_pass http://app; 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_http_version 1.1; proxy_set_header Connection ""; } } } ``` --- ## πŸ”§ 6단계: 개발 μ›Œν¬ν”Œλ‘œμš° ### 일일 개발 루틴 ```bash # 개발 μ‹œμž‘ ./scripts/dev-start.sh # μ½”λ“œ λ³€κ²½ ν›„ ν…ŒμŠ€νŠΈ docker-compose -f docker/docker-compose.dev.yml logs -f app # 개발 μ™„λ£Œ ν›„ 배포 git add . git commit -m "feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€" git push origin main # 배포 μ‹€ν–‰ ./scripts/build-deploy.sh # 개발 ν™˜κ²½ 정리 docker-compose -f docker/docker-compose.dev.yml down ``` ### λΈŒλžœμΉ˜λ³„ 배포 μ „λž΅ ```bash # develop 브랜치 β†’ μŠ€ν…Œμ΄μ§• μžλ™ 배포 git checkout develop git merge feature/new-feature git push origin develop # main 브랜치 β†’ ν”„λ‘œλ•μ…˜ 배포 git checkout main git merge develop git tag v1.2.0 git push origin main --tags ./scripts/build-deploy.sh ``` --- ## πŸ“ˆ 7단계: λͺ¨λ‹ˆν„°λ§ 및 μœ μ§€λ³΄μˆ˜ ### λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ ```bash # DS1525+ λ¦¬μ†ŒμŠ€ 확인 ssh admin@nas.local << 'EOF' echo "πŸ’Ύ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰:" free -h echo "🐳 Docker μ»¨ν…Œμ΄λ„ˆ μƒνƒœ:" docker stats --no-stream echo "πŸ’Ώ λ””μŠ€ν¬ μ‚¬μš©λŸ‰:" df -h /volume1 echo "πŸ”₯ CPU μ‚¬μš©λ₯ :" top -bn1 | grep "Cpu(s)" EOF ``` ### μžλ™ λ°±μ—… (480GB SSD μ΅œμ ν™”) ```bash #!/bin/bash # scripts/backup.sh BACKUP_DIR="/volume1/backup/app" DATE=$(date +%Y%m%d_%H%M%S) # λ°±μ—… 디렉토리 생성 mkdir -p $BACKUP_DIR/{database,volumes,configs} echo "πŸ’Ύ λ°±μ—… μ‹œμž‘: $DATE" # 1. λ°μ΄ν„°λ² μ΄μŠ€ λ°±μ—… (μ••μΆ•) docker exec postgres-prod pg_dump -U app_user app_prod | gzip > $BACKUP_DIR/database/postgres_$DATE.sql.gz # 2. μ€‘μš” λ³Όλ₯¨λ§Œ λ°±μ—… (μš©λŸ‰ κ³ λ €) docker run --rm \ -v app_postgres_data:/source:ro \ -v $BACKUP_DIR/volumes:/backup \ alpine tar czf /backup/postgres_$DATE.tar.gz -C /source . # 3. μ„€μ • 파일 λ°±μ—… tar czf $BACKUP_DIR/configs/configs_$DATE.tar.gz \ /volume1/docker/app/docker-compose.prod.yml \ /volume1/docker/app/.env \ /volume1/docker/app/config/ # 4. 였래된 λ°±μ—… 정리 (SSD 수λͺ… κ³ λ €) find $BACKUP_DIR -name "*.gz" -mtime +7 -delete find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete echo "βœ… λ°±μ—… μ™„λ£Œ: $DATE" ``` --- ## 🎯 μ„±λŠ₯ 벀치마크 (DS1525+ 32GB) ### μ˜ˆμƒ μ„±λŠ₯ μ§€ν‘œ ``` πŸš€ DS1525+ 32GB μ„±λŠ₯ (μ΅œμ ν™” ν›„) β”œβ”€β”€ λ™μ‹œ μ‚¬μš©μž: 200λͺ… β”œβ”€β”€ 응닡 μ‹œκ°„: 50-100ms β”œβ”€β”€ μ²˜λ¦¬λŸ‰: 2,000 req/sec β”œβ”€β”€ λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯ : 70-80% β”œβ”€β”€ CPU μ‚¬μš©λ₯ : 30-50% └── λ””μŠ€ν¬ I/O: SSD μ΅œμ ν™” ``` ### λ¦¬μ†ŒμŠ€ ν• λ‹Ή ν˜„ν™© ``` 총 32GB λ©”λͺ¨λ¦¬ ν™œμš©: β”œβ”€β”€ PostgreSQL: 4GB (12.5%) β”œβ”€β”€ Elasticsearch: 8GB (25%) β”œβ”€β”€ Redis: 2GB (6.25%) β”œβ”€β”€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜: 4GB (12.5%) β”œβ”€β”€ λͺ¨λ‹ˆν„°λ§: 2GB (6.25%) β”œβ”€β”€ μ‹œμŠ€ν…œ μΊμ‹œ: 8GB (25%) β”œβ”€β”€ DSM: 2GB (6.25%) └── μ—¬μœ : 2GB (6.25%) ``` --- ## 🚨 문제 ν•΄κ²° κ°€μ΄λ“œ ### 일반적인 λ¬Έμ œλ“€ #### 1. μ•„ν‚€ν…μ²˜ ν˜Έν™˜μ„± 였λ₯˜ ```bash # 였λ₯˜: exec format error # ν•΄κ²°: ν”Œλž«νΌ λͺ…μ‹œμ  μ§€μ • docker run --platform linux/amd64 your-image # λ˜λŠ” Dockerfileμ—μ„œ FROM --platform=linux/amd64 python:3.11-slim ``` #### 2. λ©”λͺ¨λ¦¬ λΆ€μ‘± (32GBμ—μ„œλŠ” λ“œλ¬Όμ§€λ§Œ) ```bash # λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 확인 docker stats # Elasticsearch λ©”λͺ¨λ¦¬ 쀄이기 (ν•„μš”μ‹œ) ES_JAVA_OPTS="-Xms2g -Xmx4g" ``` #### 3. λ””μŠ€ν¬ 곡간 λΆ€μ‘± (480GB SSD) ```bash # Docker 정리 docker system prune -a # 둜그 정리 find /volume1/docker/app/logs -name "*.log" -mtime +3 -delete # λ°±μ—… 정리 find /volume1/backup -mtime +30 -delete ``` --- ## πŸ“‹ 배포 체크리슀트 ### 배포 μ „ 확인사항 ```bash βœ… 체크리슀트 - [ ] 둜컬 ν…ŒμŠ€νŠΈ 톡과 - [ ] λ©€ν‹° μ•„ν‚€ν…μ²˜ λΉŒλ“œ 성곡 - [ ] ν™˜κ²½λ³€μˆ˜ μ„€μ • μ™„λ£Œ - [ ] λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ€€λΉ„ - [ ] ν—¬μŠ€μ²΄ν¬ μ—”λ“œν¬μΈνŠΈ κ΅¬ν˜„ - [ ] λ°±μ—… κ³„νš 수립 - [ ] λ‘€λ°± κ³„νš μ€€λΉ„ - [ ] λͺ¨λ‹ˆν„°λ§ μ„€μ • 확인 ``` ### 배포 ν›„ 확인사항 ```bash βœ… 배포 ν›„ 체크 - [ ] μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정상 λ™μž‘ - [ ] λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 확인 - [ ] μΊμ‹œ λ™μž‘ 확인 - [ ] 검색 κΈ°λŠ₯ 확인 - [ ] λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ 확인 - [ ] 둜그 μˆ˜μ§‘ 확인 - [ ] λ°±μ—… μžλ™ν™” 확인 ``` --- ## πŸŽ‰ κ²°λ‘  ### DS1525+ 32GB의 압도적 μž₯점 - βœ… **μΆ©λΆ„ν•œ μ„±λŠ₯**: 32GB RAM으둜 λͺ¨λ“  μ„œλΉ„μŠ€ μ—¬μœ λ‘­κ²Œ 운영 - βœ… **24μ‹œκ°„ μ•ˆμ •μ„±**: μ „λ ₯ 효율적, μ €μ†ŒμŒ 운영 - βœ… **μ™„μ „ μžλ™ν™”**: κ°œλ°œλΆ€ν„° λ°°ν¬κΉŒμ§€ 슀크립트 기반 - βœ… **ν™•μž₯ κ°€λŠ₯**: ν–₯ν›„ μ„œλΉ„μŠ€ ν™•μž₯ μ‹œμ—λ„ μ—¬μœ λ‘œμ›€ - βœ… **λΉ„μš© 효율**: ν΄λΌμš°λ“œ λŒ€λΉ„ μ›”λ“±ν•œ λΉ„μš© μ ˆμ•½ ### 개발-배포 νŒŒμ΄ν”„λΌμΈ μ™„μ„± ``` Mac 개발 (Hot Reload) ↓ λ©€ν‹° μ•„ν‚€ν…μ²˜ λΉŒλ“œ ↓ DS1525+ μžλ™ 배포 ↓ μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ ↓ μžλ™ λ°±μ—… ``` **이제 κ°œλ°œμ—λ§Œ μ§‘μ€‘ν•˜κ³  λ°°ν¬λŠ” μŠ€ν¬λ¦½νŠΈκ°€ μ•Œμ•„μ„œ!** πŸš€