资讯动态

如何用Terraform把SpotiFlyer Web版自动部署到Azure?Kotlin多平台项目的IaC完整指南

发布时间:2026/9/19 5:29:13 来源:尧图企业网站定制
如何用Terraform把SpotiFlyer Web版自动部署到AzureKotlin多平台项目的IaC完整指南【免费下载链接】SpotiFlyerKotlin Multiplatform Music Downloader, Supports Spotify / Gaana / Youtube Music / Jio Saavn / SoundCloud.项目地址: https://gitcode.com/gh_mirrors/sp/SpotiFlyerSpotiFlyer 是一款基于 Kotlin 多平台KMP开发的开源音乐下载工具支持从 Spotify、YouTube Music、Jio Saavn、SoundCloud 等平台下载歌曲、专辑和歌单。它的 Web 版Kotlin/JS React需要借助一个自托管的 CORS 代理服务才能跨域调用 Spotify API——而这个服务正是用 Terraform 在 Azure 上一键创建的。本文将带你读懂项目自带的 infra/ 目录配置并在 5 步之内完成部署。为什么 Web 版音乐下载器需要部署到 Azure先弄清楚一个问题Azure 上部署的其实是CORS 代理而不是 Web 页面本身。浏览器有同源策略限制Web 版前端直接请求 Spotify 的 API 会被拦截。项目的解决方案是运行一个开源的 cors-anywhere 服务由它中转跨域请求。你可以在源码中看到这一设计自托管代理与公共代理的切换逻辑CorsProxy.ktWeb 版构建配置Kotlin/JS 浏览器目标web-app/build.gradle.kts用 Terraform 部署这个代理的好处是声明式、可重复、免费。项目配置直接选用了 Azure 的 FreeF1套餐零成本即可跑起来。读懂 Terraform 配置infra 目录的 3 个核心文件SpotiFlyer 的 IaC 配置集中在 infra/ 目录只有 3 个文件结构非常清晰文件职责关键内容infra/main.tf定义 Azure 资源资源组、应用监控、App Serviceinfra/variables.tf声明可覆盖变量镜像仓库地址、CORS 白名单infra/outputs.tf导出部署结果服务名、默认访问域名main.tf 创建了 4 类资源建议对照 infra/main.tf 阅读资源组名为SpotiFlyer位于westeurope区域所有资源统一收纳其中main.tf 第15-18行。Application Insights应用性能监控用于追踪 Web 服务的运行状态main.tf 第20-25行。App Service PlanF1 免费套餐Linux 环境的计算套餐reserved true表示强制 Linuxmain.tf 第27-37行。App Service 本体这是最关键的部分——它并不运行代码包而是拉取 Docker 镜像运行linux_fx_version DOCKER|${var.docker_image_tag}同时开启了 HTTPS 强制、HTTP/2并配置了 CORS 允许所有来源main.tf 第39-54行。此外还注入了 Insights 的监控密钥和 CORS 白名单/限流参数main.tf 第56-67行。variables.tf 提供了 6 个可调变量其中两个敏感项仓库账号/密码由你在部署时提供其余都有默认值docker_registry/docker_image_tag指定 cors-anywhere 镜像来源variables.tf 第1-18行cors_anywhere_allow_list/cors_anywhere_rate_limit控制 CORS 白名单与速率限制docker_registry_username/docker_registry_password私有镜像仓库凭据sensitive true不会明文显示 注意main.tf 第1-9行 默认将 Terraform 状态state存储在作者私有仓库的 artifactory 后端。自行部署时建议把这段backend配置改为本地后端删除或注释该块即可默认使用本地terraform.tfstate否则初始化会提示输入对方仓库账号。一键部署步骤从零到生产环境前置准备约 3 分钟一个 Azure 账号个人免费版即可本地安装 Terraform CLI 与 Azure CLI并执行az login登录部署只需 4 条命令# 1. 获取项目源码 git clone https://gitcode.com/gh_mirrors/sp/SpotiFlyer cd SpotiFlyer/infra # 2. 初始化首次会下载 Azure 资源插件 terraform init # 3. 预览即将创建的资源确认无误再执行下一步 terraform plan -vardocker_registry_username你的镜像仓库账号 \ -vardocker_registry_password你的镜像仓库密码 # 4. 一键创建全部资源 terraform apply -auto-approve -vardocker_registry_username你的镜像仓库账号 \ -vardocker_registry_password你的镜像仓库密码如果不想每次输入密码可把变量写入terraform.tfvars文件不要提交到版本库或使用TF_VAR_docker_registry_password环境变量。整个部署过程通常 2-4 分钟完成Terraform 会实时打印各资源的Creating... → Creation complete状态。验证部署拿到访问地址并测试部署成功后outputs.tf 会输出两个结果直接在终端底部即可看到app_service_nameApp Service 名称app_service_default_hostname形如https://xxx.azurewebsites.net的默认 HTTPS 域名快速验证清单浏览器打开输出的https://...azurewebsites.net域名应能看到 cors-anywhere 代理服务的默认页面在页面中填入 SpotiFlyer Web 版的前端域名作为 CORS 白名单对应cors_anywhere_allow_list变量提交后刷新打开 SpotiFlyer Web 版粘贴一条 Spotify 歌单链接若能正常列出曲目列表说明前端 → 代理 → Spotify API的整条链路已打通。想查看运行状态可在 Azure 门户进入SpotiFlyer资源组通过 Application Insights 查看请求量与异常监控密钥已在 main.tf 第61-62行 自动注入服务配置。常见问题排查FAQQ1terraform init报错提示输入 artifactory 用户名这是状态后端配置指向了作者私有仓库。按上文建议把 main.tf 中的backend artifactory块改为本地或你自己的远程后端即可。Q2想换个 Azure 区域比如离我更近的区域修改 main.tf 第16行 的location westeurope为你的目标区域如eastasia再执行terraform apply。Q3如何更新 cors-anywhere 镜像版本修改 variables.tf 第15-18行 的docker_image_tag默认值或用-vardocker_image_tag镜像地址:标签临时覆盖重新 apply 后 App Service 会自动拉取新镜像。Q4部署完不想要了怎么清理避免残留在infra目录执行terraform destroy -auto-approveTerraform 会按依赖顺序删除全部 4 类资源做到一键撤销。Q5Web 版页面本身也部署在 Azure 吗不是。Web 版是纯静态站点Kotlin/JS 编译产物由静态托管承载Azure 上只运行 CORS 代理这一后端服务。这种静态前端 轻量后端的拆分正是 KMP 多平台架构的自然产物——同一套核心逻辑settings.gradle.kts 中的:common:*模块在 Android、桌面和 Web 端复用平台端只负责薄薄的 UI 与代理层。核心文件速查最后附上一张本次涉及的关键文件地图方便你对照源码用途文件路径Azure 资源定义infra/main.tf部署变量与敏感凭据infra/variables.tf部署结果输出infra/outputs.tfCORS 代理切换逻辑CorsProxy.ktWeb 版构建配置web-app/build.gradle.kts多平台模块总览settings.gradle.kts总结借助 SpotiFlyer 仓库自带的 3 个 Terraform 文件你无需手写任何云资源就能在 Azure 免费层上完成 CORS 代理的声明式部署——init → plan → apply三步走完Web 版音乐下载器即可完整工作。这也正是 IaC基础设施即代码的魅力环境配置像代码一样可审查、可复用、可销毁。【免费下载链接】SpotiFlyerKotlin Multiplatform Music Downloader, Supports Spotify / Gaana / Youtube Music / Jio Saavn / SoundCloud.项目地址: https://gitcode.com/gh_mirrors/sp/SpotiFlyer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价