> ## Documentation Index
> Fetch the complete documentation index at: https://docs.casebender.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Azure에 배포하기

> Microsoft Azure에 CaseBender 배포하기

## 개요

이 가이드는 사전 구축된 Docker 이미지를 사용하여 Azure Container Apps 및 관리형 서비스로 Azure에 CaseBender를 배포하는 과정을 안내합니다.

## 사전 요구 사항

1. [Azure 계정](https://azure.microsoft.com/)
2. [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) 설치
3. [Docker](https://docs.docker.com/get-docker/) 설치

## 1단계: 초기 설정

### Azure CLI 설치 및 구성

<CodeGroup>
  ```bash macOS theme={null}
  # Homebrew 사용
  brew install azure-cli

  # Azure 로그인

  az login

  # ACR용 Docker 구성

  az acr login --name casebenderacr

  ```

  ```bash Linux theme={null}
  # Azure CLI 설치
  curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

  # Azure 로그인
  az login

  # ACR용 Docker 구성
  az acr login --name casebenderacr
  ```

  ```powershell Windows theme={null}
  # winget 사용
  winget install -e --id Microsoft.AzureCLI

  # Azure 로그인
  az login

  # ACR용 Docker 구성
  az acr login --name casebenderacr
  ```
</CodeGroup>

### 프로젝트 초기화

```bash theme={null}
# 변수 설정
RESOURCE_GROUP="casebender-rg"
LOCATION="eastus"

# 리소스 그룹 생성
az group create --name $RESOURCE_GROUP --location $LOCATION

# 필요한 서비스 활성화
az provider register --namespace Microsoft.ContainerRegistry
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.Storage
```

## 2단계: Azure 인프라 설정

### 스토리지 계정 생성

```bash theme={null}
# 스토리지 계정 생성
az storage account create \
  --name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --sku Standard_LRS \
  --encryption-services blob

# Blob 컨테이너 생성
az storage container create \
  --name casebender \
  --account-name casebenderstorage \
  --auth-mode key \
  --public-access off

# 스토리지 계정 키 가져오기
STORAGE_KEY=$(az storage account keys list \
  --account-name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --query '[0].value' -o tsv)

# 스토리지 접근용 관리형 ID 생성
az identity create \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP

# 관리형 ID 가져오기
IDENTITY_ID=$(az identity show \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP \
  --query id -o tsv)

# Storage Blob Data Contributor 역할 할당
az role assignment create \
  --assignee-object-id $(az identity show --name casebender-storage-identity --resource-group $RESOURCE_GROUP --query principalId -o tsv) \
  --role "Storage Blob Data Contributor" \
  --scope $(az storage account show --name casebenderstorage --resource-group $RESOURCE_GROUP --query id -o tsv)
```

### Azure Database for PostgreSQL 설정

```bash theme={null}
# PostgreSQL 서버 생성
az postgres flexible-server create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --admin-user superadmin \
  --admin-password <your-secure-password> \
  --sku-name Standard_B2s \
  --storage-size 32 \
  --version 14

# 데이터베이스 생성
az postgres flexible-server db create \
  --resource-group $RESOURCE_GROUP \
  --server-name casebender-db \
  --database-name casebender
```

### Azure Cache for Redis 설정

```bash theme={null}
# Redis 캐시 생성
az redis create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-redis \
  --sku Basic \
  --vm-size c0 \
  --location $LOCATION
```

## 3단계: 컨테이너 레지스트리 생성 및 구성

```bash theme={null}
# Azure Container Registry 생성
az acr create \
  --resource-group $RESOURCE_GROUP \
  --name casebenderacr \
  --sku Standard \
  --admin-enabled true

# 레지스트리 자격 증명 가져오기
ACR_USERNAME=$(az acr credential show --name casebenderacr --query username -o tsv)
ACR_PASSWORD=$(az acr credential show --name casebenderacr --query "passwords[0].value" -o tsv)

# CaseBender 이미지 가져오기
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# ACR용 이미지 태그 지정
docker tag casebender/casebender:latest casebenderacr.azurecr.io/casebender/app:latest
docker tag casebender/workflow-processor:latest casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker tag casebender/misp-processor:latest casebenderacr.azurecr.io/casebender/misp-processor:latest

# ACR에 이미지 푸시
docker push casebenderacr.azurecr.io/casebender/app:latest
docker push casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker push casebenderacr.azurecr.io/casebender/misp-processor:latest
```

## 4단계: 서비스 배포

### Container Apps 환경 생성

```bash theme={null}
# Container Apps 환경 생성
az containerapp env create \
  --name casebender-env \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

# 메인 애플리케이션 생성
az containerapp create \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/app:latest \
  --target-port 3000 \
  --ingress external \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --user-assigned-identity $IDENTITY_ID \
  --env-vars \
    AUTH_SECRET=<your-auth-secret> \
    AUTH_SALT=<your-auth-salt> \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>" \
    AZURE_STORAGE_ACCOUNT="casebenderstorage" \
    AZURE_STORAGE_CONTAINER="casebender" \
    AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=casebenderstorage;AccountKey=${STORAGE_KEY};EndpointSuffix=core.windows.net"

# 워크플로우 프로세서 생성
az containerapp create \
  --name workflow-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/workflow-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"

# MISP 프로세서 생성
az containerapp create \
  --name misp-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/misp-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"
```

## 5단계: Azure Front Door 설정

```bash theme={null}
# Front Door 프로필 생성
az afd profile create \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --sku Standard_AzureFrontDoor

# 엔드포인트 생성
az afd endpoint create \
  --endpoint-name casebender \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP

# 오리진 그룹 생성
az afd origin-group create \
  --origin-group-name casebender-origin-group \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --probe-path "/" \
  --probe-protocol Http \
  --probe-request-type GET

# 오리진 추가
az afd origin create \
  --origin-group-name casebender-origin-group \
  --origin-name casebender-origin \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --host-name <your-container-app-url> \
  --origin-host-header <your-container-app-url> \
  --priority 1 \
  --weight 1000 \
  --enabled-state Enabled
```

## 6단계: 사용자 정의 도메인 구성 (선택 사항)

```bash theme={null}
# Front Door에 사용자 정의 도메인 추가
az afd custom-domain create \
  --custom-domain-name casebender-domain \
  --host-name your-domain.com \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --minimum-tls-version TLS12

# HTTPS 활성화
az afd custom-domain enable-https \
  --custom-domain-name casebender-domain \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP
```

## 모니터링 및 유지 관리

### Application Insights 설정

```bash theme={null}
# Application Insights 생성
az monitor app-insights component create \
  --app casebender-insights \
  --location $LOCATION \
  --resource-group $RESOURCE_GROUP \
  --application-type web

# 계측 키 가져오기
az monitor app-insights component show \
  --app casebender-insights \
  --resource-group $RESOURCE_GROUP \
  --query instrumentationKey \
  --output tsv
```

### 경고 구성

```bash theme={null}
# 작업 그룹 생성
az monitor action-group create \
  --name casebender-alerts \
  --resource-group $RESOURCE_GROUP \
  --action email admin email@yourdomain.com

# 경고 규칙 생성
az monitor metrics alert create \
  --name "high-cpu-usage" \
  --resource-group $RESOURCE_GROUP \
  --scopes <container-app-resource-id> \
  --condition "avg CPU > 80" \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action <action-group-id>
```

### 로그 보기

```bash theme={null}
# 컨테이너 앱 로그 보기
az containerapp logs show \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --follow
```

## 확장 구성

```bash theme={null}
# 확장 규칙 구성
az containerapp update \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --min-replicas 1 \
  --max-replicas 10 \
  --scale-rule-name http-rule \
  --scale-rule-type http \
  --scale-rule-http-concurrency 50
```

## 백업 및 재해 복구

### 데이터베이스 백업 구성

```bash theme={null}
# 자동 백업 활성화
az postgres flexible-server update \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --backup-retention 7
```

### 지리적 복제 구성

```bash theme={null}
# 보조 지역 리소스 생성
az postgres flexible-server replica create \
  --name casebender-db-secondary \
  --source-server casebender-db \
  --resource-group $RESOURCE_GROUP \
  --location westus
```

## 보안 모범 사례

1. 모든 서비스에 Azure Defender 활성화
2. Azure Private Link 구현
3. 관리형 ID 사용
4. 정기적인 보안 평가
5. 진단 로깅 활성화

## 비용 최적화

1. Container Apps에 소비 계획 사용
2. 자동 확장 규칙 구현
3. 적절한 서비스 계층 선택
4. 사용 패턴 모니터링
5. Azure Reserved Instances 사용

## 다음 단계

* Azure DevOps로 CI/CD 설정
* 종합적인 모니터링 구현
* 재해 복구 구성
* 보안 규정 준수 검토
