如何通过CI/CD向私有生产Azure DB for PostgreSQL执行数据库迁移?
方案一:用Azure App Service远程执行迁移命令
既然生产环境的App Service本身就能访问内网数据库,完全可以把迁移命令放到App Service里执行。在GitHub Action部署完代码后,通过Azure CLI远程触发App Service的命令:
az webapp run-command invoke --name <你的App Service名称> --resource-group <资源组名称> --command "npx prisma migrate deploy" --slot <生产槽位>
这种方式不用额外加资源,成本低,而且迁移命令直接在可信的App Service环境里跑,安全性有保障。
方案二:部署Azure DevOps自托管代理
在VNet内部署一个自托管代理(可以用低成本的Azure VM或者Container Instance),这个代理天生能访问内网数据库。然后把CI/CD里的迁移步骤指定到这个代理上执行——GitHub Action支持自托管代理,只需要在Workflow里加一行runs-on: self-hosted就行。相比自己搭VM做桥接,自托管代理是Azure原生的运维方案,运维成本低,攻击面也更小。
方案三:借助Azure Private Link + GitHub Actions的VNet集成
给数据库配置Azure Private Link,然后开启GitHub Actions的Azure Virtual Network Integration预览功能,让CI/CD的执行环境直接接入VNet。这样GitHub Action就能直接访问内网数据库,不用任何中间节点,安全性拉满,适合长期稳定的生产环境。
方案四:在应用启动时自动执行迁移
修改NodeJS应用的启动逻辑,在应用启动前通过环境变量判断是否需要执行Prisma迁移(比如只在生产部署时触发)。每次部署新版本后,应用启动会自动跑迁移,完全利用App Service的内网访问能力,不需要额外的CI/CD步骤。注意要加迁移锁,避免多个实例同时执行导致冲突,Prisma本身自带迁移锁机制,直接用就行。
内容的提问来源于stack exchange,提问作者Coffee To Code

