# πŸš€ Quant Engine Deployment Guide **생성**: 2026-06-25 **버전**: v9 Hardening Release **νŒ¨ν‚€μ§€ 크기**: 24MB **배포 λŒ€μƒ**: 178.104.200.7 (원격) λ˜λŠ” 둜컬 --- ## πŸ“¦ 배포 μ „ 체크리슀트 ### βœ… μ€€λΉ„λœ ν•­λͺ© ``` [x] Release λΉŒλ“œ μ™„λ£Œ (24MB) [x] MudBlazor UI μ™„μ„± (91/100 평가) [x] Dashboard 고도화 (KPI + μ‹œμž₯ν˜„ν™© + μ„±κ³Ό + μ•Œκ³ λ¦¬μ¦˜ + μ‹ ν˜Έ) [x] Program.cs μˆ˜μ • (AddMudServices μΆ”κ°€) [x] 배포 슀크립트 μ€€λΉ„ (deploy.sh) [x] Playwright ν…ŒμŠ€νŠΈ 톡과 [x] git 컀밋 μ™„λ£Œ ``` ### πŸ“ 배포 νŒ¨ν‚€μ§€ ``` μœ„μΉ˜: src/dotnet/QuantEngine.Web/publish/ 크기: 24MB 파일: 172개 ꡬ성: β”œβ”€β”€ DLL 파일 (10개) β”‚ β”œβ”€β”€ QuantEngine.Web.dll (60KB) β”‚ β”œβ”€β”€ QuantEngine.Core.dll (28KB) β”‚ β”œβ”€β”€ QuantEngine.Application.dll (4KB) β”‚ β”œβ”€β”€ QuantEngine.Infrastructure.dll (61KB) β”‚ β”œβ”€β”€ MudBlazor.dll (8.7MB) ✨ β”‚ β”œβ”€β”€ Npgsql.dll (1.5MB) β”‚ β”œβ”€β”€ Dapper.dll (242KB) β”‚ └── 기타 β”œβ”€β”€ 정적 μžμ‚° (wwwroot/) β”‚ β”œβ”€β”€ CSS (MudBlazor) β”‚ β”œβ”€β”€ JS (Blazor Runtime) β”‚ └── 이미지/폰트 └── μ„€μ • 파일 β”œβ”€β”€ appsettings.json β”œβ”€β”€ runtimeconfig.json └── deps.json ``` --- ## 🌐 배포 μ˜΅μ…˜ ### Option 1: 원격 배포 (ꢌμž₯) #### μ „μ œ 쑰건 ``` βœ“ SSH ν‚€: ~/.ssh/id_ed25519 βœ“ 원격 μ„œλ²„: 178.104.200.7 βœ“ μ‚¬μš©μž: kjh2064 βœ“ nginx μ„€μΉ˜ μ™„λ£Œ ``` #### μ‹€ν–‰ λͺ…λ Ή ```bash cd /c/Temp/data_feed chmod +x deploy.sh ./deploy.sh ``` #### 배포 κ³Όμ • ``` 1. SSH μ—°κ²° 확인 (10초) 2. 원격 λ°±μ—… 생성 (/var/www/quant_backup_*) 3. 파일 전솑 (rsync, 24MB ~ 1λΆ„) 4. κΆŒν•œ μ„€μ • (www-data:www-data) 5. nginx μž¬μ‹œμž‘ 6. ν—¬μŠ€ 체크 (HTTP 200 확인) ``` #### 성곡 μ‹œ 접속 ``` URL: http://178.104.200.7/quant/ ``` --- ### Option 2: 둜컬 배포 (개발/ν…ŒμŠ€νŠΈ) #### μ›Ή μ„œλΉ„μŠ€ μ‹€ν–‰ ```bash cd src/dotnet/QuantEngine.Web dotnet QuantEngine.Web.exe ``` #### 접속 ``` URL: http://localhost:5265 ``` --- ### Option 3: IIS 배포 (Windows μ „μš©) #### 1단계: ν˜ΈμŠ€νŒ… λ²ˆλ“€ μ„€μΉ˜ ``` .NET 10.0 Hosting Bundle for IIS λ‹€μš΄λ‘œλ“œ: https://dotnet.microsoft.com/download/dotnet ``` #### 2단계: IIS μ‚¬μ΄νŠΈ 생성 ``` Site Name: Quant Engine Physical Path: C:\var\www\quant\publish Protocol: HTTP Port: 80 ``` #### 3단계: μ‘μš© ν”„λ‘œκ·Έλž¨ ν’€ μ„€μ • ``` .NET λŸ°νƒ€μž„ 버전: 10.0 νŒŒμ΄ν”„λΌμΈ λͺ¨λ“œ: Integrated 관리 μ‚¬μš©μž: ApplicationPoolIdentity ``` #### 4단계: 배포 νŒ¨ν‚€μ§€ 볡사 ```powershell Copy-Item -Path "src/dotnet/QuantEngine.Web/publish/*" ` -Destination "C:\var\www\quant\publish" ` -Recurse -Force ``` #### 5단계: IIS μž¬μ‹œμž‘ ```powershell net stop IISADMIN net start IISADMIN ``` --- ## πŸ”§ 배포 ν›„ 확인 ### 1. μ›Ή μ„œλΉ„μŠ€ μƒνƒœ ```bash # HTTP μƒνƒœ 확인 curl -I http://178.104.200.7/quant/ # κΈ°λŒ€ κ²°κ³Ό: # HTTP/1.1 200 OK # Content-Type: text/html ``` ### 2. 둜그 λͺ¨λ‹ˆν„°λ§ ```bash # SSH 접속 ssh kjh2064@178.104.200.7 # nginx μ—λŸ¬ 둜그 sudo tail -f /var/log/nginx/error.log # nginx μ ‘κ·Ό 둜그 sudo tail -f /var/log/nginx/access.log # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그 (있으면) sudo journalctl -u quant-engine -f ``` ### 3. μ„±λŠ₯ ν…ŒμŠ€νŠΈ ```bash # νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œκ°„ time curl http://178.104.200.7/quant/ > /dev/null # λ™μ‹œ μ—°κ²° ν…ŒμŠ€νŠΈ (100 users) ab -n 100 -c 10 http://178.104.200.7/quant/ ``` ### 4. κΈ°λŠ₯ 검증 ``` βœ“ Dashboard νŽ˜μ΄μ§€ λ‘œλ“œ βœ“ KPI μΉ΄λ“œ ν‘œμ‹œ βœ“ μ„±κ³Ό λ©”νŠΈλ¦­ λ Œλ”λ§ βœ“ μ•Œκ³ λ¦¬μ¦˜ ν…Œμ΄λΈ” ν‘œμ‹œ βœ“ μ‹ ν˜Έ ν”Όλ“œ μ—…λ°μ΄νŠΈ βœ“ MudBlazor μŠ€νƒ€μΌ 적용 βœ“ λ°˜μ‘ν˜• λ ˆμ΄μ•„μ›ƒ (λͺ¨λ°”일/νƒœλΈ”λ¦Ώ/λ°μŠ€ν¬ν†±) ``` --- ## πŸ“Š 배포 체크리슀트 ### μ „ 배포 ``` [ ] Release λΉŒλ“œ 성곡 확인 [ ] appsettings.json λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 확인 [ ] SSH ν‚€ κΆŒν•œ 확인 (chmod 600) [ ] nginx μ„€μ • 확인 [ ] λ°©ν™”λ²½ 포트 확인 (HTTP 80, HTTPS 443) [ ] SSL μΈμ¦μ„œ 확인 (ν•„μš”μ‹œ) ``` ### 배포 쀑 ``` [ ] deploy.sh μ‹€ν–‰ [ ] 파일 전솑 μ§„ν–‰ 상황 λͺ¨λ‹ˆν„°λ§ [ ] κΆŒν•œ μ„€μ • 확인 [ ] nginx μž¬μ‹œμž‘ 확인 ``` ### 배포 ν›„ ``` [ ] μ›Ή μ„œλΉ„μŠ€ 접속 확인 [ ] HTTP μƒνƒœ 200 확인 [ ] 둜그 μ—λŸ¬ 확인 [ ] μ„±λŠ₯ λ©”νŠΈλ¦­ 확인 [ ] κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μ™„λ£Œ [ ] λͺ¨λ°”일 λ°˜μ‘ν˜• 확인 ``` --- ## ⚠️ 문제 ν•΄κ²° ### 문제 1: SSH μ—°κ²° μ‹€νŒ¨ ``` 원인: SSH ν‚€ μ—†μŒ λ˜λŠ” κΆŒν•œ 문제 ν•΄κ²°: 1. SSH ν‚€ 생성: ssh-keygen -t ed25519 2. ν‚€ κΆŒν•œ μ„€μ •: chmod 600 ~/.ssh/id_ed25519 3. μ„œλ²„ 곡개 ν‚€ 등둝: ssh-copy-id kjh2064@178.104.200.7 ``` ### 문제 2: 파일 전솑 μ‹€νŒ¨ ``` 원인: λ„€νŠΈμ›Œν¬ λŠκΉ€ λ˜λŠ” λ””μŠ€ν¬ λΆ€μ‘± ν•΄κ²°: 1. λ„€νŠΈμ›Œν¬ μƒνƒœ 확인 2. 원격 μ„œλ²„ λ””μŠ€ν¬ 확인: df -h 3. rsync μž¬μ‹œλ„: rsync -avz --delete ... ``` ### 문제 3: nginx 403 Forbidden ``` 원인: 파일 κΆŒν•œ 문제 ν•΄κ²°: sudo chown -R www-data:www-data /var/www/quant/publish sudo chmod -R 755 /var/www/quant/publish ``` ### 문제 4: λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ‹€νŒ¨ ``` 원인: PostgreSQL λ―Έμ‹€ν–‰ λ˜λŠ” 자격 증λͺ… 였λ₯˜ ν•΄κ²°: 1. PostgreSQL μƒνƒœ 확인: sudo systemctl status postgresql 2. μ—°κ²° λ¬Έμžμ—΄ 확인: appsettings.json 3. λ°©ν™”λ²½ 포트 확인: netstat -tuln | grep 5432 ``` ### 문제 5: MudBlazor μŠ€νƒ€μΌ 미적용 ``` 원인: CSS 파일 λ‘œλ“œ μ‹€νŒ¨ ν•΄κ²°: 1. nginx μ„€μ •μ—μ„œ 정적 파일 경둜 확인 2. _content/MudBlazor/ 폴더 κΆŒν•œ 확인 3. λΈŒλΌμš°μ € μΊμ‹œ μ‚­μ œ ``` --- ## πŸ”„ 배포 ν›„ 운영 ### λͺ¨λ‹ˆν„°λ§ ```bash # μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§ watch -n 5 'curl -s -o /dev/null -w "%{http_code}\n" http://178.104.200.7/quant/' # 둜그 집계 (ELK Stack ꢌμž₯) sudo tail -f /var/log/nginx/access.log | grep quant # μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ top -p $(pgrep -f "QuantEngine.Web.exe") ``` ### λ°±μ—… ```bash # 일일 λ°±μ—… (cron) 0 2 * * * /usr/local/bin/backup-quant-engine.sh # λ°±μ—… 슀크립트 #!/bin/bash BACKUP_DIR="/var/backups/quant-engine" mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/quant-$(date +%Y%m%d_%H%M%S).tar.gz /var/www/quant/publish/ find $BACKUP_DIR -name "quant-*.tar.gz" -mtime +30 -delete ``` ### 둜그 관리 ```bash # 둜그 λ‘œν…Œμ΄μ…˜ μ„€μ • (/etc/logrotate.d/quant-engine) /var/log/nginx/quant/*.log { daily rotate 7 compress delaycompress notifempty create 0640 www-data www-data sharedscripts postrotate systemctl reload nginx endscript } ``` --- ## πŸ“‹ 배포 μš”μ•½ | ν•­λͺ© | μƒνƒœ | λΉ„κ³  | |------|:----:|------| | Release λΉŒλ“œ | βœ… | 24MB, 172 파일 | | UI 완성도 | βœ… | 91/100 (우수) | | ν…ŒμŠ€νŠΈ | βœ… | Playwright 톡과 | | 배포 슀크립트 | βœ… | SSH 기반 μžλ™λ°°ν¬ | | λ¬Έμ„œ | βœ… | μ™„μ „νžˆ μž‘μ„±λ¨ | | **배포 μ€€λΉ„** | **βœ…** | **μ¦‰μ‹œ 배포 κ°€λŠ₯** | --- ## 🎯 배포 μ»€λ§¨λ“œ ### λΉ λ₯Έ 배포 (ν•œ 쀄 λͺ…λ Ή) ```bash cd /c/Temp/data_feed && ./deploy.sh ``` ### 단계별 배포 ```bash # 1. Release λΉŒλ“œ cd src/dotnet/QuantEngine.Web dotnet publish -c Release --output ./publish # 2. λ°±μ—… 생성 ssh kjh2064@178.104.200.7 \ 'sudo cp -r /var/www/quant/publish /var/www/quant_backup_$(date +%Y%m%d_%H%M%S)' # 3. 파일 전솑 rsync -avz --delete ./publish/ \ kjh2064@178.104.200.7:/var/www/quant/publish/ # 4. κΆŒν•œ μ„€μ • ssh kjh2064@178.104.200.7 \ 'sudo chown -R www-data:www-data /var/www/quant/publish && \ sudo chmod -R 755 /var/www/quant/publish' # 5. μ„œλΉ„μŠ€ μž¬μ‹œμž‘ ssh kjh2064@178.104.200.7 \ 'sudo systemctl restart nginx' # 6. μƒνƒœ 확인 curl -I http://178.104.200.7/quant/ ``` --- **배포 μ€€λΉ„ μ™„λ£Œ!** πŸš€ λ‹€μŒ μ»€λ§¨λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ 배포λ₯Ό μ‹œμž‘ν•˜μ„Έμš”: ```bash ./deploy.sh ``` **λ˜λŠ”** μˆ˜λ™ 배포: ```bash dotnet publish -c Release && rsync -avz --delete ./publish/ kjh2064@178.104.200.7:/var/www/quant/publish/ ```