惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
博客园_首页
美团技术团队
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
J
Java Code Geeks
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
雷峰网
雷峰网
爱范儿
爱范儿

ddadaal.me

fork subgen实现纯本地AI视频字幕生成和翻译 - ddadaal.me 把nanobot关进Docker后,如何同时保留浏览器可视化与自动化 - ddadaal.me 可划分显存 != 统一内存:AI Max+ 395 64G AI推理性能 2025年总结 - ddadaal.me 14寸16核32线程:搭载AMD AI Max+ 395的HP战99 Ultra使用感受 Node是并发性能的绊脚石吗?测试Express服务器的基准并发能力 - ddadaal.me 用大模型总结文章:效果很好,但是玄学 - ddadaal.me 2024年总结 - ddadaal.me 在西雅图,给生活换个环境 - ddadaal.me 从调库到翻源代码:给wakapi增加SQL Server支持 - ddadaal.me 增加自制博客点击量统计 - ddadaal.me 博客集成AI文章总结功能 - ddadaal.me 2023年总结 - ddadaal.me 博客的发展2:重写,重生 - ddadaal.me 2022年总结 - ddadaal.me 2021年总结 - ddadaal.me 我的第一个真实项目:总结和经验 - ddadaal.me 一次生产环境的文件丢失事故:复盘和教训 - ddadaal.me react-typed-i18n: 使用Template Literal Types实现强类型的i18n - ddadaal.me wslg初体验:最佳Linux发行版? - ddadaal.me 借助Docker,把VPN当作HTTP代理来用 - ddadaal.me 2020年总结 - ddadaal.me 美好的回忆和未知的未来:写在研究生开学前 - ddadaal.me 使用X11 Forwarding在WSL 2中运行GUI程序 - ddadaal.me 在小手机已经消失的时代,我选择了Galaxy S20 - ddadaal.me 使用PowerShell脚本让UWP应用使用localhost上的系统代理 - ddadaal.me 安装Arch Linux并使用N卡玩Steam游戏 - ddadaal.me 可靠性、辅助功能和多屏协同:我对智能手表的体验和看法 - ddadaal.me 从VSCode到Vim到……两个都用? - ddadaal.me 2019年总结 - ddadaal.me
博客的发展3:将博客迁移至Azure并添加访问指标采集 - ddadaa...
2026-09-12 · via ddadaal.me

时隔三年的又一次博客更新

自从上一次将博客重写为一个静态网站后已经运行3年了。

这套架构非常简单:所有网站代码以及文章源码全部都在仓库里。要更新网站,直接改代码或者写文章,推送到github上,CI构建网站,把构建好的静态文件推到另一个发布为github pages的仓库ddadaal/ddadaal.me.github.io里,更新后的网站就可以访问了。

为什么要折腾了?

添加访问指标采集

由于之前是纯静态网站,完全没有办法记录动态的信息。之前的博客的评论数据都是存放在ddadaal/ddadaal.me.github.io的Issues里的。

在前AI时代,我也部署过一个简单的访问量采集服务,当时还写了个文章增加自制博客点击量统计。这篇文章单独写了一个Node.js服务,本博客中加了一些JS钩子。现在看来,把逻辑分在两个项目里还是太麻烦了。

而在现在AI时代,写一个完整的指标采集服务也是个非常简单的工作,于是一不做二不休,一口气把完整的指标采集都给实现了。

由于访问指标采集会涉及到隐私相关的信息,这里列出目前会采集的信息,并且,由于博客代码纯开源,后续有任何改动,都可以在代码中看出来:

  • 文章ID、访问总数、最后访问数据
  • 每次访问的事件 ID、时间、文章路径
  • 访客标识
  • 来源页面
  • 推广来源
  • IP 哈希
  • 浏览器、操作系统、设备类型
  • 是否机器人、状态码和耗时字段

以GDPR的标准来说,其中有的数据已经涉及到个人信息,如可以关联多次访问的IP哈希。但以后有问题再说吧。

利用Azure资源

微软一直在给微软员工发150刀每年的Azure订阅。我从2019年第一次在微软实习开始就开始领,并且竟然直到现在这个订阅还生效(感谢微软爸爸),我一直没有充分利用好这些资源。

这次趁着想要添加指标采集的功夫,就直接把整个网站+数据库全部搬迁到Azure。

当前Azure架构

访问 -> [AKS] -> [Azure SQL Server]

整个网站代码本身放在AKS上:

  • AKS本身使用最低级的托管等级,免费
  • Node pool使用最便宜的Standard_D2as_v5虚拟机(2C8G),并打开Auto scale,允许1-5个节点自动伸缩。正常运行情况下用量其实挺小的:
❯ kubectl top nodes
NAME                                CPU(cores)   CPU(%)   MEMORY(bytes)   MEMORY(%)   
aks-agentpool-27587481-vmss000000   229m         12%      3669Mi          63%  
  • 使用Gateway API暴露网站服务到公网
  • 使用cert-manager自动签发TLS证书

数据存放在Azure SQL Server中:

  • Azure SQL Server提供免费额度(官方文档),10W核心计算时间+32G的数据,对于一个只记录访问数据的服务来说完全够用了
  • Azure SQL Server本身是个SQL Server,用标准的SQL Server库就可以连接
  • 之前给wakapi做SQL Server适配的时候也熟悉了一些SQL Server,所以运维托管SQL Server也挺简单的

IP和流量对于国外的云来说几乎免费。这样下来,花钱的大头也就是Node pool的虚拟机,通过计算器估算一个月70/80刀,150刀勉强够用。

这样一套下来,我完全没有任何运维压力。数据库、AKS、扩缩容、TLS证书全部不需要手动管,平时的运维也直接用标准的Kubernetes工具链即可,不太需要熟悉其他技术。

CI/CD

之前的CI/CD很简单:推送代码 -> 构建静态HTML/JS/CSS -> 推送到github pages仓库 -> github pages部署。

现在由于变成了一个完整的网站项目,所以CI/CD也需要较大的改动。推送代码后,GitHub Actions需要:

  1. 构建镜像
  2. 推送到ACR
  3. 登录AKS
  4. 触发deployment更新

整个过程中完全没有密码参与:

  • GitHub Actions通过OIDC联邦身份认证关联到一个Azure identity,可以直接以这个identity的身份登录Azure
    • 这个Identity可以Push到ACR(AcrPush role),可以获取AKS的kubeconfig(Azure Kubernetes Service Cluster User Role)
    • 所以整个CI/CD过程只需要标准的az CLI命令就可以全部完成。
  • AKS和ACR通过Managed Identity认证,直接可以从ACR拉取镜像

后续

后续还打算将我用App Service和VM部署的一些服务全部搬迁到AKS上,减少额外开销的同时进一步统一运维流程。

另外,现在博客项目使用Next.js实现的,做起来确实比较简单,但是构建的镜像太大了(300M),推送还挺耗时间的。有了AI后,后续可考虑把博客逻辑改成go写,前端改成vite+react纯前端,最后构建一个十几M的纯go二进制。

在做这个过程中的时候,我又遇到了前两年工作的时候几乎天天接触的Azure的各种概念。这些概念纯学起来非常抽象,真正用起来才直到用处在哪儿。最近工作也接触了一些国产云,感觉国产云在这些管理和开发者友好的功能上还是有一定差距的。