你好,我是 Lee Teong Hoe。
一名base在马来西亚的全栈开发者兼 DevOps 工程师。我构建 Web 应用, 自托管一个约 140 个容器的 homelab,并运营 Hoelee Enterprise——一家面向 马来西亚中小企业的网站设计开发公司(邮箱托管只是副业,并非主业)。 这里是博客的中文部分。
最新文章
-
当数据库客户端对你撒谎:为 MariaDB 修补 Workbench 26
MySQL Workbench 26.7.0 能连上 MySQL 8.4,却在 MariaDB 上报出一个毫无意义的 TypeError。三处修补,以及为什么版本号不再能说明它是什么引擎。
-
用 IPBan 替换 RDPGuard:没人写出来的三个坑
我把付费的 RDPGuard 7.8.7 换成了开源的 IPBan 4.1.0,踩到三个没有文档的坑——其中一个卸载程序会悄悄放走 12 个正在攻击的 IP。
-
自建语音转文字服务:打字速度的五倍,而且数据不出内网
我用一台带 GPU 的电脑自建了语音转文字 API。Windows、iPhone、iPad、Android 都能语音输入——私密、不限量,速度是打字的大约 5 倍。
-
n8n v1 升级到 v2:一个日志文件里的七项废弃警告
我的自建 n8n 从 1.x 升级到 2.40.1,一次性暴露出七处静默失效——包括一个被 schema 校验拒绝的遥测事件、废弃的 webhook 变量,以及一个悄悄把 AI 沙盒关掉的数据库覆盖值。
-
我用两个 Cron 容器跑了一年的语音合成服务
一个阅读应用需要 TTS,而云服务免费版的 token 十分钟、一小时就过期。这是那套让 Azure 和 Google 语音稳定运行一年的边车模式——任何工作流里都没有存放密钥。
-
数字商品的自愈式访问控制:NocoDB、n8n 与 AList
我如何用五个工作流搭出一套权限系统,自动授予、到期失效并持续修复客户的文件访问——包括一个构建期代码共享技巧,以及一个设计上刻意不泄露任何信息的公开接口。
-
把 AI 修图工具做成 WordPress 插件:22 个版本换来的经验
从单个 HTML 文件到一个真正上线的 WordPress 插件:fal.ai 异步队列、绝不能静默失败的水印、可选的名单元件,以及五个只有在真实环境里才会出现的 bug。
-
换了不同的硬盘,同样的损坏又来了——真凶是 TRIM,不是 SSD
两周前 btrfs RAID1 阵列在看似健康的 NVMe 盘上静默损坏数据,两周后同一个全零校验和出现在完全不同的硬盘上。真凶是 Seagate IronWolf 110 上的队列化 TRIM(NCQ)——FreeBSD 早就拉黑了这个固件缺陷,Linux 却一直没有。我是怎么抓到它、以及修复方法的全过程。
-
我如何在自家 NAS 上自托管 Mem0 记忆栈(让 AI 助手有记忆)
一套私有、自托管的 AI 助手记忆层——mem0 API + LiteLLM + PostgreSQL/pgvector,跑在 Synology NAS 上。语义记忆由你掌控,而不是第三方手里。
-
我差点把这颗 SSD 送修——真正坏的是 SATA 数据线
一颗 Seagate IronWolf 110 SSD 疯狂报 WRITE FPDMA 超时、mkfs 报 'superblock magic doesn't match'、然后读写静默——教科书般的坏盘。我只换了一根 SATA 线,它就干净格式化、零报错。动手判死刑前,先这样排查。
-
SMART 显示健康,RAID 却在悄悄损坏数据
两块看起来完全健康的 NVMe 组成的 btrfs RAID1 阵列,静默地把 Windows 虚拟机喂成了全零字节。我靠校验和取证抓住它——但根因(M.2 转接卡链路故障 vs 批次缺陷)至今仍未定论,现在两块盘测试都干净。
-
Unraid 停止阵列时卡死的真相:Swapfile 锁住挂载点 — 附修复方案
Unraid 停止阵列时一直卡在卸载磁盘:btrfs RAID1 上的 8GB swapfile 通过 loop 设备锁住 /mnt/cache。根因分析、/boot/config/stop 陷阱、两个 User Scripts 彻底修复。
-
Passbolt 界面反复卡死——一个缺失的配置文件引发的三种故障模式
自托管的 Passbolt 连续几周返回 504:GPG 指纹为空卡住邮件投递,重建容器抹掉了修复,代理后面的 ssl.force 又造成无限重定向。
-
用「热浏览器会话」爬取有反爬墙的电商网站
为一位做二手手机生意的客户:爬取有反爬墙的电商商品列表——热 CDP 会话、失败即止的健康检查、分段等待渲染。
-
我如何用 FLUX.1 Kontext 打造 AI 家具合成演示
用 fal.ai FLUX.1 Kontext 把家具产品照合成到风格化房间场景——多图端点、tainted canvas 的修复,以及为什么必须关掉 prompt enhancement。
-
2026 年最佳 AI 视频生成器:免费与付费对比,以及我的 LTX-2.3 实测
对比 2026 年最好的 AI 视频生成器——免费与付费方案、真实定价、可本地运行的开源模型,以及我对 LTX-2.3 的亲手实测。
-
我用 Suno AI 做出自己的歌
自己写词、调风格提示词,用 Suno AI 做出七首原创歌曲——民谣、儿歌、动漫风心经。完整工作流 + 可直接播放的成品。
-
在多台机器之间同步一个会自我学习的 AI Agent
如何用基于 git 的 profile distribution 在两台电脑之间同步 Hermes agent 的技能、配置和定时任务——以及为什么我选择手动同步而不是用 cron。
-
从马来西亚使用中国大模型 API:真正可行的方法
从马来西亚使用中国大模型 API(GLM-5.3、DeepSeek V4):我如何用人民币付款、处理手机验证,以及哪些平台真正可用。
-
NocoDB 附件字段怎么改都不生效,和一个漏网的正则
回填 300 行数据时踩到的两个小坑:NocoDB 在附件保留 id 的情况下会无视 path 的改动,以及一个 lookahead 正则悄悄跳过了没有扩展名的 URL。
-
为什么你的无头浏览器不是万能爬虫
两个二手交易平台,两面完全不同的墙:闲鱼用「非法访问」把无头浏览器挡在门外,Carousell 却照常吐数据。教训是——在伸手拿 Playwright 之前,先搞清页面到底是怎么把数据交给你的。
-
Authentik 从 2025.8 升级到 2026.8:那些没人提醒你会坏掉的部分
一年份的 authentik 大版本升级踩坑记录:存储挂载变更、RBAC 会话清理、可信代理,以及 authorization_flow 与 authentication_flow 搞混导致 SSO 彻底瘫痪。
-
不用界面管理 CyberPanel:逆向一个没有文档的 v2 API
CyberPanel v2 砍掉了有文档的 JSON API,只留下 Angular 界面自己调用的 session + CSRF 端点。这篇文章讲清确切的认证流程,以及我怎么从页面背后挖出真正的函数。
-
加固 Tor 洋葱服务:真正重要的是什么
出于对暗网的好奇,我把个人主页和 Git 服务器镜像了过去。这篇记录哪些加固扛得住、哪些会悄悄坏掉,以及值不值得把它当成服务卖给客户。
-
如何用并行子代理在三小时内核查 20 家 VPS 服务商
一个关于编排并行 AI 子代理对 20 家主机服务商做尽职调查的案例研究——WHOIS、AUP 和口碑核查——把数小时的研究任务压缩成一份结构化、可追溯的供应商评分卡。
-
购买主机前,如何核实一家服务商的真实情况
一份可复用的核查清单,帮你把真实的主机声明和营销话术分开:对比域名年龄与「运营多年」的说法、在 AUP 里找出隐藏的禁止条款、并用第三方渠道交叉验证口碑。
-
Telegram 机器人通知为什么发不出去:IPv6、DNS 和一个折腾了一整天的 400
一次排障记录:一个跑在 Docker 里的 Telegram 监控机器人,sendPhoto 一直返回 nginx/1.30.1 的 400,但 getMe 却正常——根因是只返回 IPv6 的 DNS 应答、一个写错的 extra_hosts IP,以及一个用 join 拼接破坏了 JPEG 二进制数据的 multipart body。
-
我如何打造 DigiKedai Telegram AI 客服机器人
一个全天候解答顾客问题、并在 Telegram 和 WhatsApp 上自动开通免费试用账号的 AI 客服机器人——TypeScript、grammY、Cloudflare 隧道 webhook,以及自托管的 LiteLLM 网关。
-
我是如何托管这个博客的:Astro、Gitea Actions 与自托管 CI/CD
这篇文章完整拆解了这个网站背后的构建与部署管线——以 Git 作为 CMS、跑在 unRaid 服务器上的自托管 runner,以及最前端的 Cloudflare。
-
你好,世界 —— 关于这个博客
这个博客是做什么的:技术写作、自托管经验,以及一份我构建与学习过程的记录。