Files
QuantEngineByItz/tools/deploy_quantengine.sh
kjh2064 96cc7fcf71
Quant Engine CI/CD Pipeline / validate-core (push) Failing after 9s
Quant Engine CI/CD Pipeline / validate-ui-and-storage (push) Has been skipped
Deploy to Production / Build & Deploy to Production (push) Has been cancelled
ci: Gitea Actions CI/CD 파이프라인 근본적 개선 (신뢰성/속도/관찰성)
## 개선 사항

### 1. 신뢰성 향상 (Reliability)
- 타임아웃 확대: 15분 → 30분 (네트워크 지연/재시도 대응)
- 자동 롤백 구현: 헬스체크 3회 실패 시 이전 버전으로 자동 복구
  * 배포 중단 없이 즉시 이전 버전 복구
  * Telegram 알림 포함

### 2. 검증 강화 (Verification)
- 데이터베이스 연결성 검증 추가
- 서비스 재시작 후 상태 확인 강화
- Favicon 검증을 선택적/경고로 변경 (실제 기능 검증 우선)

### 3. 관찰성 개선 (Observability)
- 배포 스크립트 개선:
  * 배포 이력을 /home/kjh2064/.config/quantengine_deploy_history.log에 기록
  * 타임스탬프, 커밋, 이전 버전 정보 저장
  * 배포 성공/실패 상태 추적

### 4. 롤백 정보 보존
- 각 배포 시점의 이전 버전 정보 기록
- 빠른 수동 롤백 가능성 제공

## 아키텍처 원칙
- **한 번 빌드, 여러 번 배포**: 빌드 아티팩트 안정성
- **자동 실패 대응**: 수동 개입 최소화
- **명확한 성공 기준**: 헬스체크 3회 기준 (네트워크 지연 고려)
- **배포 추적성**: 언제, 어떤 버전을 배포했는지 기록

## 다음 단계 (Phase 2-3)
- 빌드/배포 분리 (별도 워크플로우)
- Gitea Releases로 빌드 아티팩트 발행
- E2E 로그인 테스트 추가
- 배포 이력 데이터베이스 기록

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-11 18:12:32 +09:00

92 lines
2.6 KiB
Bash

#!/usr/bin/env bash
# Quant Engine CI-only hot deploy script
# Features:
# - Shadow copy deployment (zero downtime)
# - Automatic rollback information
# - Deployment history tracking
set -euo pipefail
if [ "${CI_DEPLOY:-0}" != "1" ]; then
echo "ERROR: CI-only deployment policy. Use the Gitea workflow to deploy."
exit 1
fi
DEPLOY_BASE="/home/kjh2064/deployments"
ACTIVE_LINK="/home/kjh2064/quantengine_active"
DEPLOY_HISTORY="/home/kjh2064/.config/quantengine_deploy_history.log"
TMP_ARCHIVE="/home/kjh2064/tmp/quantengine.tar.gz"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
TARGET_DIR="${DEPLOY_BASE}/quantengine_${TIMESTAMP}"
echo "========================================="
echo "Starting Shadow Copy Hot Deploy [${TIMESTAMP}]"
echo "========================================="
mkdir -p "${DEPLOY_BASE}"
mkdir -p "${TARGET_DIR}"
mkdir -p "$(dirname "${DEPLOY_HISTORY}")"
if [ -f "${TMP_ARCHIVE}" ]; then
echo "Extracting build artifact to ${TARGET_DIR}..."
tar -xzf "${TMP_ARCHIVE}" -C "${TARGET_DIR}"
rm -f "${TMP_ARCHIVE}"
else
echo "ERROR: Deployment archive not found at ${TMP_ARCHIVE}"
exit 1
fi
# Save previous deployment for rollback
if [ -L "${ACTIVE_LINK}" ]; then
PREV_VERSION=$(readlink -f "${ACTIVE_LINK}")
PREV_TIMESTAMP=$(basename "${PREV_VERSION}")
else
PREV_VERSION="none"
PREV_TIMESTAMP="none"
fi
echo "Previous deployment: ${PREV_VERSION}"
echo "Swapping symbolic link dynamically..."
ln -sfn "${TARGET_DIR}" "${ACTIVE_LINK}"
echo "Restarting Systemd service..."
sudo systemctl restart quantengine
# Wait for service stabilization
sleep 3
# Verify service is running
if ! systemctl is-active --quiet quantengine; then
echo "ERROR: Service failed to start after deployment"
echo "Rolling back to previous version: ${PREV_VERSION}"
ln -sfn "${PREV_VERSION}" "${ACTIVE_LINK}"
sudo systemctl restart quantengine
exit 1
fi
echo "Recording deployment history..."
{
echo "TIMESTAMP=${TIMESTAMP}"
echo "COMMIT=${GIT_COMMIT:-unknown}"
echo "DEPLOY_PATH=${TARGET_DIR}"
echo "PREV_VERSION=${PREV_TIMESTAMP}"
echo "STATUS=success"
echo "DEPLOYED_AT=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
echo "---"
} >> "${DEPLOY_HISTORY}"
echo "Cleaning up obsolete deployments..."
cd "${DEPLOY_BASE}"
ls -dt quantengine_* | tail -n +6 | while read -r old_dir; do
echo "Removing old release: ${old_dir}"
rm -rf "${old_dir}"
done
echo "========================================="
echo "Deployment successfully completed!"
echo "Active Version: $(readlink -f ${ACTIVE_LINK})"
echo "Previous Version (Rollback target): ${PREV_VERSION}"
echo "========================================="