火山引擎GitHub CI + 对象存储 + CDN静态资源网站部署总结

火山引擎GitHub CI + 对象存储 + CDN静态资源网站部署总结

哇 第一次接触带CDN的网站部署,好好玩。

Github Actions

在项目的主目录中新建一个.github/workflows/deploy.yml文件
大概长这样:

name: Deploy to Volcengine TOS on:# 触发条件push:branches:- main # 或者是你的主分支名称jobs:# 在什么机器上跑+环境变量build-and-deploy:runs-on: ubuntu-latest env:# Build-time env for Vite (optional)VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}# Volcengine TOS (S3-compatible) deploy configTOS_BUCKET: ${{ secrets.TOS_BUCKET }}TOS_REGION: ${{ secrets.TOS_REGION }}TOS_ENDPOINT: ${{ secrets.TOS_ENDPOINT }}# CredentialsAWS_ACCESS_KEY_ID: ${{ secrets.VOLC_AK }}AWS_SECRET_ACCESS_KEY: ${{ secrets.VOLC_SK }}AWS_EC2_METADATA_DISABLED:"true"steps:-name: Checkout code uses: actions/checkout@v4 -name: Set up Node.js uses: actions/setup-node@v4 with:node-version:"20"cache:"npm"-name: Install dependencies run: npm ci -name: Build project run: npm run build env:VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}# 如果有生产环境 API 地址-name: Sanity check build output contains API base # 防止把 localhost 打进生产run:| echo "Check if build still contains localhost:" grep -R "127.0.0.1:8080" -n dist/ && exit 1 || echo "OK: localhost not found"-name: Upload Vite build output (dist/) to TOS run:| aws s3 sync dist/ "s3://${TOS_BUCKET}/" \ --endpoint-url "$TOS_ENDPOINT" \ --region "$TOS_REGION" \ --delete # --delete 会删除远程桶中本地不存在的文件,确保完全同步-name: Configure Static Website Hosting run:| aws s3 website "s3://${TOS_BUCKET}/" \ --index-document index.html \ --error-document index.html \ --endpoint-url "$TOS_ENDPOINT" \ --region "$TOS_REGION" \# 说明:# 配置 TOS 桶为静态网站托管模式# index-document: index.html (默认首页)# error-document: index.html (SPA 应用路由所需的 fallback)

SPA(Single Page Application)
浏览器只加载一次 index.html,之后所有页面切换都在前端完成。同一个 index.html + 不同 JS 渲染结果得到不同的页面。

文件里的环境变量在github secrets里配。VOLC_AK是火山引擎的api access key,VOLC_SK是secret access key。

这里写的触发条件是push到main分支就自动执行steps里的那些步骤。

创建一个桶(bucket)做对象存储。

对象存储(object storage)有点像网盘。传统数据库有records、table结构,对象存储存的对象由key(名字)、data(内容)和metadata构成。这些对象被放在桶里,可以通过http访问。上述配置文件中的endpoint是S3 兼容 Endpoint,是给 AWS S3 CLI / SDK 用的(啊啊啊这里我没有很懂,先写着);还有一个Bucket 域名,是给浏览器、CDN回源访问用的。Endpoint 只知道“你要用 TOS”,Bucket 域名 才知道“你要的是哪个桶”

CDN

老天鹅啊终于讲到了内容分发网络(Content Deliverty Network, CDN)。

在这里插入图片描述


(图片来自火山引擎)

原来CDN的作用是把对源站的HTTP请求的响应提前缓存到离用户比较近的边缘节点,如果请求找不到缓存再打到源站。所以需要一个回源host,就是缓存没有资源从源站请求资源时要去哪里。

这里有一个很好玩的bug。我最开始在github secrets里面把后端的base api写成本地的了,改过来之后还不能直接rerun job,因为直接rerun还是会读旧的环境变量。然后我提交了一个空commit (加上--allow-empty)来触发workflow。(也有可能不是这个问题,因为后面还有bug orz)。
结果还是没有更新,这个时候curl是通的,但是浏览器console还是现实之前的本地api。

这个时候对比curl的包和浏览器拿到的包

% curl -s http://admin.muyulab.com/index.html |grep -Eo '/assets/index-[^"]+\.js' /assets/index-CaFYC_R-.js 

我才知道原来浏览器console可以直接执行命令,而不是只能在代码里console.log orz

> [...document.scripts].map(s => s.src).filter(Boolean) > [ "http://admin.muyulab.com/assets/index-C0Ov5svQ.js" ] 

发现他俩抓的包不是一个。清浏览器storage也没用。

原来是要清CDN的缓存…火山引擎的内容分发网络页面下有一个刷新预热,可以在那里操作。

在yaml里面配置 --cache-control "no-cache, max-age=0"是规定源站的表现,即不管谁来取(CDN/直连/curl)都没有缓存。
而在CDN控制台配置缓存配置的是CDN的缓存。

老天鹅呀第一次搞带对象存储和CDN的部署,好多概念都不懂,没想到写这篇这么艰难orz 边写边查,涉及到的小点我全没见过orz 呜呜呜呜呜累了。

Read more

【毕业设计】基于python的深度学习音乐推荐系统(源码+文档+远程调试,全bao定制等)

【毕业设计】基于python的深度学习音乐推荐系统(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码+LW+部署文档+全bao+远程调试+代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、python、爬虫、数据可视化、大数据、物联网、机器学习等设计与开发。 主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 特色服务内容:答辩必过班 (全程一对一技术交流,帮助大家顺利完成答辩,

By Ne0inhk
【2024版】超详细Python+Pycharm安装保姆级教程,Python环境配置和使用指南,看完这一篇就够了

【2024版】超详细Python+Pycharm安装保姆级教程,Python环境配置和使用指南,看完这一篇就够了

本文将从 Python解释器安装到Pycharm专业版安装和破姐插件等使用都进行了详细介绍,希望能够帮助到大家。 目录 * Python 3.12.6解释器安装 * PyCharm 2024.2.1开发工具安装 * PyCharm 中运行代码 * PyCharm加入破姐插件 * PyCharm基本设置及汉化 一、下载装 Python 1、进入Python官网首页,下载最新的Python版本 Download Python | Python.org 选择更新到3.12.6,下载64位的版本 👉大礼包🎁:python安装包/pycharm教程免费分享(安全链接,放心点击)👈 2、下载完成后,进行安装 1.双击Python-3.12.6-amd64.exe 2.选择Customize installation自定义安装路径,记得勾选下方两个选项 * Install now 默认安装和默认安装路径(

By Ne0inhk

python迭代器和生成器

1.迭代器 1.1 可迭代对象         可迭代对象指的是 实现了__iter__方法的对象,可以被for循环遍历的容器,比如一个列表,自定义的链表等。使用 iter() 方法获取它的迭代对象(可以理解为链表的指针) 1.2 迭代器         迭代器是指实现了 __iter__ 和 __next__方法对象,__iter__返回它本身,确保每个单独的节点都是可以被迭代的,满足链表可以从第n个元素开始访问的需求;__next__返回它的下一个节点,如果已经遍历完毕则抛出StopIteration异常。 # 实现了__iter__方法,是一个可迭代对象,可以理解为是一个整的链表,但此时还不能单独访问其中的元素 class Node: def __init__(self, data): self.data = data self.next: Node | None

By Ne0inhk
初始Python篇(8)—— 异常

初始Python篇(8)—— 异常

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-ZEEKLOG博客 所属专栏: Python 目录 异常介绍 异常的处理 try-except  try-except-else  try-except-else-finally 异常的抛出  常见的异常类型   异常介绍 在学习异常之前,先了解bug的概念。简单理解就是程序运行不起来或者运行起来之后,输出的结果不符合我们的预期。有了bug肯定是要去解决的。而解决bug就离不开异常的处理。 如果是程序运行出错,有两种情况:1、程序本身就存在问题;2、对于存在输入型程序来说,可能是用户的输入导致程序报错。 第一种情况,就需要我们自己去排查,看是哪里出现了语法错误。 第二种情况,就需要用到我们今天学习的异常处理。 如果是程序运行之后,结果不符合我们的预期,这就需要用到调试工具了。 异常的处理 try-except  Python中对于异常的处理是通过 try-except 语句来捕获异常的。 语法: try: ... // 可能出现异常的代码 except 异常

By Ne0inhk