[VoiceRAG] Azure | 使用`azd`部署应用 | Dockerfile
第6章:Azure部署
在之前的旅程中,我们构建了一个强大的AI语音助手
从第1章:知识库配置(集成向量化)创建智能知识库开始,到第2章:RAG工具集为AI配备检索与引用工具,再通过第3章:RTMiddleTier(实时中间层)协调实时对话。前端方面,第4章:浏览器音频处理实现了浏览器音频能力,第5章:前端实时通信(useRealTime钩子)建立了前后端实时通信。
现在,这个应用已经完成,最后关键一步是:如何将它从本地计算机发布到云端,让全球用户可靠访问?
这就是使用Azure开发者CLI(azd
)进行Azure部署的意义。
问题:应用上云困难重重
想象你建造了一座梦幻房屋(你的应用),配有图书馆、智能助手和最新科技。但目前它只是后院的设计图和材料堆。要让它成为可参观的真实住宅,你需要:
- 土地(云资源):购买土地(Azure服务如服务器、数据库、AI服务)
- 施工队:需要专业人员打地基、砌墙、布线、安装智能设备
- 搬迁部署:将家具(代码)搬入房屋并启动所有设备
- 运维保障:确保可靠运行且易于更新
手动完成这些步骤极其复杂且易出错。你需要逐个创建数十个Azure服务,正确配置它们,再费力将代码部署到正确位置——这简直是噩梦
解决方案:Azure开发者CLI(azd
)——总建筑师
Azure开发者CLI(azd
)如同你的Azure总建筑师。它根据项目蓝图(azure.yaml
、基础设施即代码文件和Dockerfile),自动配置所需Azure资源、部署代码,并将整个应用运行在云端。无需手动操作数十个步骤,azd
能:
- 打包代码
- 创建所有必需的Azure服务(如Azure容器应用、Azure AI搜索、Azure OpenAI)
- 启动前后端代码
只需几条命令,
azd
就能将复杂应用部署到Azure。
使用azd
部署应用
让我们一步步使用azd
部署aisearch-openai-rag-audio
项目到Azure。
步骤1:登录Azure
首先,azd
需要知道你的身份和要使用的Azure订阅。
azd auth login
说明:此命令将打开浏览器,提示你登录Azure账户。登录后,azd
便获得创建资源的权限。
步骤2:创建azd
环境
azd
环境帮助组织部署,例如开发、测试或生产环境。
azd env new
说明:此命令要求命名环境(如myvoiceragapp
)。该名称通常用作Azure资源名称的一部分,确保唯一性。同时会在本地创建.azure/<env-name>
文件夹存储环境特定设置。
步骤3:配置资源并部署应用(azd up
)
这个神奇的命令完成了大部分繁重工作。azd up
结合了两个主要操作:资源调配(创建Azure资源)和部署(上传代码)。
azd up
说明:
azd
读取项目蓝图(azure.yaml
、infra
文件夹)- 要求选择Azure区域(以及Azure OpenAI的特定可用区域)
- 创建所有必需的Azure服务:
- Azure容器应用:运行后端(Python)和前端(React)代码
- Azure AI搜索:智能知识库(第1章)
- Azure OpenAI:生成嵌入和AI响应(第1章、第2章、第3章)
- Azure Blob存储:存储源文档(第1章)
- 其他支持资源如Log Analytics
- 调配完成后,构建应用的Docker镜像(
Dockerfile
)并部署到Azure容器应用 - 最后运行"后调配"脚本,通过上传文档和触发索引器完成知识库配置(集成向量化)
- 完成后,输出部署应用的URL!
步骤4:清理(如需)
如需删除azd
创建的所有Azure资源以避免持续费用,可运行:
azd down
说明:此命令安全删除与azd
环境关联的所有Azure资源,是管理云支出的关键步骤。
底层原理:总建筑师工具包
让我们看看azd
如何知道该构建什么以及如何部署。它依赖于项目中的几个关键文件:
1. 总体规划:azure.yaml
此文件是azd
的主要蓝图,告诉azd
应用的各个部分(称为"服务")及其部署方式。
# azure.yaml
name: aisearch-openai-rag-audio
services:backend:project: ./applanguage: pyhost: containerappdocker:remoteBuild: true
hooks:postprovision:windows:shell: pwshrun: ./scripts/write_env.ps1; ./scripts/setup_intvect.ps1interactive: trueposix:shell: shrun: ./scripts/write_env.sh; ./scripts/setup_intvect.sh
说明:
name
:项目名称services
:定义应用的不同逻辑部分。这里有一个backend
服务project: ./app
:服务代码位置(app
文件夹)language: py
:标识为Python项目host: containerapp
:指定部署到Azure容器应用docker: remoteBuild: true
:在云端而非本地构建Docker镜像
hooks: postprovision
:azd
在创建Azure资源后运行的脚本./scripts/write_env.sh
:从新建的Azure资源收集连接详情(如端点和API密钥),写入后端的.env
文件./scripts/setup_intvect.sh
:使用这些环境变量运行知识库配置(集成向量化)流程(通过app/backend/setup_intvect.py
),在Azure AI搜索中准备文档
2. 打包指令:app/Dockerfile
Dockerfile
包含将应用打包为标准容器镜像的指令。该镜像可在任何地方(包括Azure容器应用)一致运行。
# app/Dockerfile(简化)
# 阶段1:构建前端(React应用)
FROM node:20-slim AS build-stage
COPY frontend ./
WORKDIR /frontend
RUN npm install
RUN npm run build# 阶段2:用Python后端服务构建好的应用
FROM python:3.12-slim AS production-stage
WORKDIR /app
COPY --from=build-stage /frontend/dist /app/static # 复制构建好的前端
COPY ./backend/ /app # 复制后端Python代码
RUN python -m pip install -r requirements.txt # 安装Python依赖
CMD ["python3", "-m", "gunicorn", "app:create_app", "-b", "0.0.0.0:8000", "--worker-class", "aiohttp.GunicornWebWorker"]
说明:此Dockerfile
采用两阶段构建:
- 使用Node.js镜像构建React前端
- 使用Python镜像,复制构建好的前端文件和后端代码,安装Python依赖,最后设置运行Python后端服务器的命令。这个组合镜像包含前后端代码,可在单个容器中运行。
3. 自动化部署流程:.github/workflows/azure-dev.yml
虽然azd up
适合本地开发,但你通常希望代码变更时自动部署。这由GitHub Actions工作流处理。
# .github/workflows/azure-dev.yml(简化)
name: 使用azd部署到Azureon:push:branches:- main # 推送变更到'main'分支时触发此工作流jobs:build:runs-on: ubuntu-latestenv: # azd的重要环境变量AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}# ... 其他AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID等 ...steps:- name: 检出代码uses: actions/checkout@v4- name: 安装azduses: Azure/setup-azd@v2- name: 使用Azure联合凭证登录run: azd auth login --client-id "$Env:AZURE_CLIENT_ID" --federated-credential-provider "github" --tenant-id "$Env:AZURE_TENANT_ID"shell: pwsh- name: 调配基础设施run: azd provision --no-prompt- name: 部署应用run: azd deploy --no-prompt
说明:
on: push: branches: - main
:当代码推送到main
分支时触发此工作流steps
:GitHub Actions执行的命令- 检出代码
- 安装
azd
- 使用联合凭证安全登录Azure(无需在GitHub中直接存储密钥)
azd provision --no-prompt
:创建或更新Azure资源。--no-prompt
使其适合自动化工作流azd deploy --no-prompt
:构建Docker镜像(使用Dockerfile
)并推送到Azure容器应用
azd
的完整部署流程
以下是运行azd up
或触发GitHub工作流时的序列:
总结
在这最后一章中,我们了解了Azure开发者CLI(azd
)如何作为总建筑师,自动化将整个aisearch-openai-rag-audio
应用部署到Azure的复杂流程。
以azure.yaml
为蓝图,Dockerfile
为打包工具,以及强大的azd
命令(手动或通过GitHub Actions),可以无缝调配所有必要的云资源,并轻松部署前后端代码。
使得实时AI语音助手能够可靠运行,并被全球用户访问。
至此,我们已经涵盖了aisearch-openai-rag-audio
项目的所有核心概念,从建立智能知识库到实时音频通信,再到自动化云部署。对这个尖端应用有了全面的理解~
END ★,°:.☆( ̄▽ ̄)/.°★ 。