用 GitHub Actions + Cloudflare Tunnel 实现博客自动部署到 NAS
博客部署在家里的 NAS 上,每次写完文章都要手动 SSH 进去 git pull 再重启容器,麻烦。折腾了一下午,终于用 GitHub Actions + Cloudflare Tunnel 实现了 push 即部署。记录一下踩过的坑。
环境说明
博客:Hexo 7.x + Butterfly 主题,跑在 NAS 的 Docker 容器里
NAS:群晖,没有公网 IP,通过 Cloudflare Tunnel 穿透,SSH 地址为 ssh.baiwei.site
目标:push 到 GitHub master 分支后,自动 SSH 进 NAS 执行 git pull + 重启容器
最终 Workflow先放结论,完整可用的 .github/workflows/deploy.yml:
12345678910111213141516171819202122232425262728293031323334353637383940414243name: Deploy to NASon: push: branches: - masterjobs: deploy: ...
空气炸锅蜜汁烤鸡腿
一、食材与腌料(2–3 个鸡腿)主料
鸡腿上半部分(带皮) × 2–3 个
腌料(黄金比例)
生抽 1.5 勺
老抽 0.5 勺(上色用,可选)
料酒 1 勺
蜂蜜 1 勺(腌制阶段只放一半)
蚝油 1 勺
蒜末 3 瓣
黑胡椒 适量
五香粉 / 孜然粉 少许(可选)
食用油 1 小勺(帮助上色、防粘)
⚠️ 蜂蜜不宜多,也不要全程高温直接刷,否则容易糊、发苦。
二、前处理(关键)
鸡腿去腥 冷水冲洗 → 厨房纸擦干
划刀(非常重要)
肉厚处划 2–3 刀,不要划破皮
有利于入味 & 熟得均匀
腌制
除“剩余半勺蜂蜜”外全部混合
抓匀后密封冷藏 至少 2 小时
最佳:过夜(8–12 小时)
三、空气炸锅烤制流程(核心)Step 1:预热
180℃ 预热 5 分钟
Step 2:第一阶段(定型 + 出油)
鸡腿 皮朝下
180℃ 12 分钟
目的:出油、定型,防止后面糊皮
Step 3:翻面 + 刷蜜汁
翻面(皮朝上)
用剩余蜂蜜 + 1 勺腌料调匀,轻刷一层
170℃ 8 分钟
Step 4:脆皮收尾(可选)
观察颜色
若不够脆:200℃ ...
2026马拉松计划
🏃♂️ 我的马拉松:2025 总结与 2026 进阶宣言一、 2025:从“跑起来”到“跑下去”自 8 月份开始跑步以来,这 5 个月不仅是体重的减少,更是意志的重塑。以下是我的年度数据:
总跑量: 647.1 km(相当于从上海跑到了武汉)
总耗时: 72h 8m
总活动: 86 次
海拔爬升: 1,313 m
📊 进阶里程碑:数据背后的进化
日期
距离
耗时
平均配速
平均心率
状态点评
11.10
4.63 km
34:10
7:23
147 bpm
筑基阶段,还在与呼吸感作斗争。
12.23
7.51 km
41:28
5:31
158 bpm
速度突破,E跑向M跑的跨越,心率控制稳健。
12.28
25.26 km
2:31:17
5:59
153 bpm
首个半马+里程碑。长距离抗疲劳能力初现。
数据洞察: 从 11 月到 12 月,我在平均心率仅上升 6 bpm 的情况下,配速提升了近 2 分钟/公里。这得益于持续的低心率跑和科学的饮食控制。
二、 2026:从“完赛者”到“竞技者”2026 年将是我从跑步爱好者向马拉松运 ...
日本自由行攻略
📅 行程概览(2月26日 - 3月4日)
日期
城市
核心主题
住宿安排
2.26 (周四)
大阪
16:00 落地、道顿堀/心斋桥首餐
大阪(大国町/难波)
2.27 (周五)
大阪
环球影城 (USJ)、马里奥乐园
大阪(大国町/难波)
2.28 (周六)
大阪
J联赛:大阪钢巴主场、万博纪念公园
大阪(大国町/难波)
3.01 (周日)
奈良/京都
喂梅花鹿、伏见稻荷大社→清水寺→二三年坂→锦市场→鸭川
大阪(大国町/难波)
3.02 (周一)
京都/移动
四天王寺→难波八坂→黑门市场→梅田蓝天大厦→大巴、22:00 夜行巴士
夜行巴士(车上)
3.03 (周二)
东京
抵达新宿、涩谷/皇居、购物启动
东京(新宿或浅草)
3.04 (周三)
东京
跑鞋/调料疯狂扫货、22:00 回国
归途
📊 费用汇总表
类别
预估金额
实际花费
备注
往返机票+机场专线
723+839+200=1762
710+896+230
机票、 ...
在群晖NAS上使用Docker搭建Hexo自动化发布系统
在群晖 NAS 上使用 Docker 搭建 Hexo 自动化发布系统本文将记录如何利用群晖 NAS,通过 Docker 容器化技术搭建一个高效的 Hexo 博客系统。该系统支持 Git 自动触发更新、PM2 进程守护、Host 网络模式以及 Cloudflare Tunnel 内网穿透。
🚀 系统架构
容器化环境:Node.js 18 + Git + Webhook + PM2。
网络模式:Host 模式(共享宿主机 IP,方便访问本地代理)。
自动化流:本地 Push $\rightarrow$ GitHub Webhook $\rightarrow$ NAS Webhook 监听 $\rightarrow$ 自动执行 deploy.sh $\rightarrow$ PM2 重启 Hexo。
外部访问:Cloudflare Tunnel 提供域名访问及 SSL 加密。
🛠️ 环境准备1. 宿主机 Git 安装在群晖“套件中心”搜索并安装 Git Server。安装后在终端验证:
Bash
1git --version
2. 目录初始化在 NAS 上克隆你的博客仓库:
Bas ...
数据结构之二叉树
一、二叉树二叉树(binary_tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表相似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。
123456class TreeNode: """二叉树""" def __init__(self, val: int): self.val: int = val self.left: TreeNode | None = None self.right: TreeNode | None = None
1、二叉树常用术语
根节点(root node):位于二叉树顶层的节点,没有父节点。
叶节点(leaf node):没有子节点的节点,其两个指针均指向 None 。
边(edge):连接两个节点的线段,即节点引用(指针)。
节点所在的层(level):从顶至底递增,根节点所在层为 1 。
节点的度(degree):节点的子节点的数量。在二叉树中,度的取值范围是 ...
数据结构之哈希表
一、哈希表哈希表(hash table),又称散列表,它通过建立键key与值value之间的映射,实现高效的元素查询。
元素查询效率对比
数组
链表
哈希表
查找元素
O(n)
O(n)
O(1)
添加元素
O(1)
O(1)
O(1)
删除元素
O(n)
O(n)
O(1)
观察发现,在哈希表中进行增删查改的时间复杂度都是 O(1) ,非常高效。
1、哈希表常用操作哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等,示例代码如下:
1234567891011121314151617# 初始化哈希表hmap: dict = {}# 添加元素hmap[1] = "小明"hmap[2] = "小红"hmap[3] = "小绿"# 查询元素name: str = hmap[1]# 删除元素hmap.pop(2)# 遍历哈希表for k, v in hmap.items(): print(f'{k} = {v}' ...
数据结构之栈与队列
一、栈栈(stack)是一种遵循先入后出逻辑的线性数据结构。
1、栈的常用操作
方法
描述
时间复杂度
push()
元素入栈(添加至栈顶)
O(1)
pop()
栈顶元素出栈
O(1)
peek()
访问栈顶元素
O(1)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192# 初始化栈# Python 没有内置的栈类,可以把 list 当作栈来使用stack: list[int] = []# 入栈stack.append(1)stack.append(2)stack.append(3)# 访问栈顶元素peek: int = stack[-1]# 出栈pop: int = stack.pop()# 获取栈的长度size: int = len(stack)# 判断是否为空 ...
数据结构之数组与链表
数组和链表1、数组数组(array)是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的索引(index)。
1.1 初始化数组12arr: list[int] = [0] * 10 # 初始化长度为10的数组,nums: list[int] = [1, 2, 3, 4, 5]
1.2 访问元素索引本质上是内存地址的偏移量,因此数组的访问操作是非常高效的。
123456789def random_access(nums: list[int]) -> int: """ 随机访问数组元素 :param nums: 数组 :return: 数组元素 """ random_index = random.randint(0, len(nums) - 1) random_num = nums[random_index] return random_num
1.3 插入元素123456def insert(nums: list[int] ...
面试总结-数据结构篇
一、复杂度分析
算法效率评估
时间效率和空间效率是衡量算法优劣的两个主要评价指标。
我们可以通过实际测试来评估算法效率,但难以消除测试环境的影响,且会耗费大量计算资源。
复杂度分析可以消除实际测试的弊端,分析结果适用于所有运行平台,并且能够揭示算法在不同数据规模下的效率。
时间复杂度
时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。
最差时间复杂度使用大O符号表示,对应函数渐进上界,反应当n趋向正无穷时,操作数量T(n)的增长级别。
推算时间复杂度分为两步,首先统计操作数量,然后判断渐进上界。
常见时间复杂度从低到高排列有O(1),O(log n),O(n),O(n log n),O(n²),O(2𝑛),O(n!)等。
某些算法的时间复杂度非固定,而是与输入数据的分布有关。时间复杂度分为最差、最佳、平均时间复杂度,最佳时间复杂度几乎不用,因为输入数据一般需要满足严格条件才能达到最佳情况。
平均时间复杂度反应算法在随机数据输入下的运行效率,最接近实际应用中的算法性能。 ...






