# Azure 部署

在 Microsoft Azure 上使用 AKS、Azure Database for PostgreSQL、Azure Cache for Redis 和 VM 上的 NATS 部署 Monetarie PIX。

## 前提条件

- 具有适当权限的 Azure 订阅
- Azure CLI (`az`) 已配置
- `kubectl` 已配置
- 域名 DNS 已配置

## 架构

```mermaid
graph TB
    FD[Azure Front Door] --> AKS[AKS 集群<br/>3 节点]

    subgraph VNET [虚拟网络]
        AKS --> PG[(Azure PostgreSQL<br/>灵活服务器)]
        AKS --> REDIS[(Azure Cache<br/>Redis 7)]
        AKS --> NATS[NATS VMs<br/>3 节点集群]
    end

    AKS -->|出站| BACEN[BACEN RSFN]
```

## 基础设施设置

### 资源组

```bash
az group create --name monetarie-pix --location brazilsouth
```

### AKS 集群

```bash
az aks create \
  --resource-group monetarie-pix \
  --name monetarie-pix-aks \
  --location brazilsouth \
  --node-count 3 \
  --node-vm-size Standard_D8s_v3 \
  --enable-managed-identity \
  --network-plugin azure \
  --vnet-subnet-id /subscriptions/.../subnets/aks-nodes
```

### Azure Database for PostgreSQL

```bash
az postgres flexible-server create \
  --resource-group monetarie-pix \
  --name monetarie-pix-db \
  --location brazilsouth \
  --sku-name Standard_D8s_v3 \
  --storage-size 512 \
  --version 16 \
  --admin-user monetarie_prod \
  --admin-password "SECURE_PASSWORD" \
  --vnet monetarie-vnet \
  --subnet db-subnet
```

配置：
- `max_connections`：6000
- `shared_buffers`：8 GB
- 高可用：区域冗余

### Azure Cache for Redis

```bash
az redis create \
  --resource-group monetarie-pix \
  --name monetarie-pix-redis \
  --location brazilsouth \
  --sku Premium \
  --vm-size P1 \
  --enable-non-ssl-port
```

### NATS 虚拟机

```bash
for i in 1 2 3; do
  az vm create \
    --resource-group monetarie-pix \
    --name nats-$i \
    --image Ubuntu2204 \
    --size Standard_D4s_v3 \
    --vnet-name monetarie-vnet \
    --subnet nats-subnet
done
```

## 应用部署

### 容器注册表

```bash
az acr create --resource-group monetarie-pix --name monetariepix --sku Standard

# 构建并推送
az acr build --registry monetariepix --image pix-backend:latest backend/
az acr build --registry monetariepix --image pix-frontend:latest frontend/admin/
```

### Key Vault Secrets

```bash
az keyvault create --name monetarie-pix-kv --resource-group monetarie-pix

az keyvault secret set --vault-name monetarie-pix-kv \
  --name database-url \
  --value "postgres://monetarie_prod:PASS@server.postgres.database.azure.com:5432/monetarie"
```

使用 Azure Key Vault Provider for Secrets Store CSI Driver 将密钥挂载到 pods 中。

### 部署到 AKS

```bash
kubectl create namespace pix
kubectl apply -f deploy/backend.yaml
kubectl apply -f deploy/admin-frontend.yaml

# 迁移
kubectl exec -n pix deployment/pix-backend -- bin/monetarie_pix eval "Shared.Release.migrate()"
```

## 成本估算 (Brazil South)

| 资源 | 规格 | 月费 (USD) |
|------|------|------------|
| AKS | 3x Standard_D8s_v3 | ~$900 |
| PostgreSQL 灵活服务器 | Standard_D8s_v3, 高可用 | ~$800 |
| Redis 高级版 | P1 | ~$400 |
| NATS VMs (3x) | Standard_D4s_v3 | ~$400 |
| Front Door | 标准 | ~$50 |
| **合计** | | **~$2,550** |

## 预期结果

完成此部署后：

- AKS 集群在 Brazil South 运行，具有 3 个节点
- Azure PostgreSQL 灵活服务器具有区域冗余高可用
- Azure Cache for Redis 高级版
- NATS 3 节点集群运行在 Azure VM 上
- 所有服务健康，Ingress 具有 TLS 终止
