欢迎来到我的博客

一个记录技术实践与思考的个人空间 🚀。了解更多

关注 🐧 Linux、🐳 Docker、🏠 自托管、☕ Java、🐹 Go、📨 消息队列、🗄️ 数据库 与后端技术。

持续整理服务部署、问题排查、架构设计与性能优化中的经验沉淀,

有些文章是为了解决问题,有些则是记录技术世界里那些值得分享的折腾时刻✍️。

置顶[开源] Nginx管理面板-NxPanel

这是一个轻量的 Nginx/OpenResty 管理面板,主要用来管理站点、反向代理、SSL、日志、文件和一些常用的 Nginx 配置。 开源地址 https://github.com/luoye663/nxpanel ...

2026年6月23日 · 2 分钟 · 浅忆

置顶基于 虚拟线程 构建高性能 Kafka → HTTP 转发服务

在物联网场景中,如果需要将设备数据转发到第三方平台,为了不影响IOT平台性能,通常将设备数据通过 Kafka 进行高速传输,但很多第三方平台只提供 HTTP 接口。如何在两者之间搭建一座"高性能、不丢消息"的桥梁? ps: 本文的目的是记录一个项目设计过程,便于日后复盘,但暂不提供实际压测指标(如吞吐量、延迟、资源消耗) ...

2026年5月21日 · 21 分钟 · 浅忆

置顶E5 自动订阅程序[已开源]

Office E5 自动订阅程序 ...

2020年3月2日 · 2 分钟 · 浅忆

置顶记一次小模型微调/蒸馏学习(Qwen3-0.6B 从收货地址中提取结构化信息)

无意间,看见阿里云提供了针对 Qwen3-0.6B 的蒸馏教程,本文章本质上是跟着阿里云提供的教程学习微调过程,官方教程地址。 借用下阿里云教程的介绍: 大参数模型效果好,但成本高、响应慢。为了在保障效果的同时提升推理速度、降低成本,可首先借助大参数模型完成目标任务的数据生成,并使用这些数据微调小参数模型,使其在特定任务中达到接近大参数模型的表现,这一过程也被称为模型蒸馏。 本方案将以从一句话中提取结构化信息(如收件人、地址、电话)为例,演示如何通过模型蒸馏,让 Qwen3-0.6B 模型在此任务上达到大参数模型的表现。 ...

2026年3月1日 · 10 分钟 · 浅忆

Android使用Bitwarden出现[通行密钥登录出现由于资源链接缺失,通行密钥操作失败]

解决方法 问题在于使用通行密钥会访问 digitalassetlinks.googleapis.com ,由于众所周知的原因访问不了,所以针对该域名特殊处理即可。 排查 在 设置-关于-Flight Recorder 开启日志记录,然后重复操作一次,即可看到错误日志,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 Bitwarden Android - Password Manager Log Start Time: 2026-08-16 15:05:00:874 Log Duration: 1h App Version: 2026.7.1 (21803) Build: release/standard SDK Version: 🦀 3.0.0-7926-a9b0e184 CI Build Info: 🧱 commit: bitwarden/android/release/2026.7-rc59@abb9ddedcca453d07c2b5f27599774590b556aa1 💻 build source: bitwarden/android/actions/runs/30475765167/attempts/1 Device: <!-- 敏感信息脱敏 --> 🌩 Server: Vaultwarden 2025.12.0 Fingerprint: <!-- 敏感信息脱敏 --> 2026-08-16 15:05:00:876 – DEBUG – na8 – RootNavScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.VaultUnlockedNavbarRoute in com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VaultUnlockedGraphRoute 2026-08-16 15:05:00:876 – DEBUG – na8 – RootNavScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.VaultUnlockedNavbarRoute in com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VaultUnlockedGraphRoute 2026-08-16 15:05:00:910 – DEBUG – na8 – VaultUnlockedNavBarScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.settings.about.SettingsAboutRoute.Standard in com.x8bit.bitwarden.ui.platform.feature.settings.SettingsGraphRoute 2026-08-16 15:05:05:918 – DEBUG – AppStateManagerImpl$AppForegroundObserver – App is backgrounded 2026-08-16 15:05:15:926 – DEBUG – BitwardenCredentialProviderService – Get credential request received. 2026-08-16 15:05:16:024 – DEBUG – zp – Credentials retrieved. 2026-08-16 15:05:17:899 – DEBUG – AppStateManagerImpl$AppForegroundObserver – App is foregrounded 2026-08-16 15:05:17:942 – DEBUG – na8 – MainActivity destination changed: com.x8bit.bitwarden.ui.platform.feature.overlaynav.OverlayNavRoute 2026-08-16 15:05:17:945 – DEBUG – na8 – OverlayNavScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.rootnav.RootNavigationRoute 2026-08-16 15:05:17:958 – DEBUG – na8 – RootNavScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.splash.SplashRoute 2026-08-16 15:05:17:969 – DEBUG – na8 – RootNavScreen destination changed: com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.VaultUnlockedNavbarRoute in com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VaultUnlockedGraphRoute 2026-08-16 15:05:17:969 – DEBUG – na8 – RootNavScreen destination changed: nkb/{encodedData} in com.x8bit.bitwarden.ui.platform.feature.vaultunlocked.VaultUnlockedGraphRoute 2026-08-16 15:05:18:029 – DEBUG – BitwardenNetworkClient – --> GET https://digitalassetlinks.googleapis.com/v1/assetlinks:check?source.web.site=https%3A%2F%2Fx.com&target.androidApp.packageName=com.twitter.android&target.androidApp.certificate.sha256Fingerprint=0F%3AD9%3AA0%3ACF%3AB0%3A7B%3A65%3A95%3A09%3A97%3AB4%3AEA%3AEB%3ADC%3A53%3A93%3A13%3A92%3A39%3A1A%3AA4%3A06%3A53%3A8A%3A3B%3A04%3A07%3A3B%3AC2%3ACE%3A2F%3AE9&relation=delegate_permission%2Fcommon.handle_all_urls 2026-08-16 15:05:31:801 – DEBUG – BitwardenNetworkClient – <-- HTTP FAILED: java.net.SocketTimeoutException: failed to connect to digitalassetlinks.googleapis.com/2001:4860:4841:400:: (port 443) from /2409:8a4c:1437:2610:a383:6e84:e065:bedb (port 45046) after 10000ms. https://digitalassetlinks.googleapis.com/v1/assetlinks:check?source.web.site=https%3A%2F%2Fx.com&target.androidApp.packageName=com.twitter.android&target.androidApp.certificate.sha256Fingerprint=0F%3AD9%3AA0%3ACF%3AB0%3A7B%3A65%3A95%3A09%3A97%3AB4%3AEA%3AEB%3ADC%3A53%3A93%3A13%3A92%3A39%3A1A%3AA4%3A06%3A53%3A8A%3A3B%3A04%3A07%3A3B%3AC2%3ACE%3A2F%3AE9&relation=delegate_permission%2Fcommon.handle_all_urls (13770ms) 2026-08-16 15:05:31:803 – ERROR – y17 – Failed to validate origin for calling app 2026-08-16 15:05:31:802 – WARNING – NetworkResultCall – Network Error: https://digitalassetlinks.googleapis.com/v1/assetlinks:check java.net.SocketTimeoutException: failed to connect to digitalassetlinks.googleapis.com/2001:4860:4841:400:: (port 443) from /2409:8a4c:1437:2610:a383:6e84:e065:bedb (port 45046) after 10000ms at libcore.io.IoBridge.connectErrno(IoBridge.java:235) at libcore.io.IoBridge.connect(IoBridge.java:179) at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) at java.net.Socket.connect(Socket.java:646) at j42.i(r8-map-id-81236816c7d695090efc20c3e1e0abc52588eeba88d7fb10b6fa8a6e53f07ad6:77) at j42.d(r8-map-id-81236816c7d695090efc20c3e1e0abc52588eeba88d7fb10b6fa8a6e53f07ad6:38) at ok3.a(r8-map-id-81236816c7d695090efc20c3e1e0abc52588eeba88d7fb10b6fa8a6e53f07ad6:3) at va.a(r8-map-id-81236816c7d695090efc20c3e1e0abc52588eeba88d7fb10b6fa8a6e53f07ad6:67) at va.run(r8-map-id-81236816c7d695090efc20c3e1e0abc52588eeba88d7fb10b6fa8a6e53f07ad6:204) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012)

2026年8月16日 · 2 分钟 · 浅忆

高通 410 随身 Wi-Fi 折腾记录:Debian、Vohive 与 Wi-Fi Calling

最近一直看到讨论说 giffgaff 正在封号,我的号倒是没收到封禁短信,可能是用了2年的原因?为了避免真封号的时候忙手忙脚的,故找了下方案: 利用 wifi calling 功能, 模拟在 英国 境内。 利用 esime,携号转网转到其他运营商,但也存在相同的问题,那就是不允许长期在 英国 以外的地方长期漫游,而且,邮寄sim卡也是很麻烦,so…… ...

2026年8月1日 · 1 分钟 · 浅忆

[开源] 基于 mosdns 实现局域网 DNS 分流管理 Web UI

最近心血来潮,想搞 mosdns 可视化页面,所以,利用 opencode+gpt5.6 进行了vibe coding本项目,基于 mosdns 插件扩展出来的 web ui。 ...

2026年7月21日 · 1 分钟 · 浅忆

用 registry:3 做私有镜像仓库和 Docker Hub 缓存

之前发版docker镜像一直是手工,未引入自动部署。 1 2 3 4 5 本地 build 镜像 docker save 成 tar FTP 上传到服务器 服务器 docker load 重启容器 能用,但每次都很烦。镜像稍微大一点,上传和 load 都慢,也没有一个清楚的版本记录。所以根据以上步骤整理出来的需求如下: CI 能把业务镜像推上去 生产机器能拉下来 最好还能缓存一下 Docker Hub 的基础镜像 这种场景用 registry:3 就够了。 前提 由于 registry:3 限制,一个 registry cache 只能代理一个上游,所以私有镜像仓库和 Docker Hub 缓存分开运行。 比如: 1 2 registry.example.com # 存自己的业务镜像 mirror.example.com # 缓存(加速) Docker Hub 镜像 私有 Registry 先建目录: 1 2 mkdir -p /opt/registry/{data,auth} cd /opt/registry 生成登录账号: 1 2 docker run --rm --entrypoint htpasswd httpd:2 \ -Bbn woodpecker 'your-password' > auth/htpasswd docker-compose.yml: ...

2026年7月1日 · 2 分钟 · 浅忆

Windows 上 Git SSH 私钥要不要设置密码?

最近我重新整理了一下自己电脑上的 Git SSH 配置,顺手也想清楚了一个以前一直有点纠结的问题: 私钥到底要不要设置密码? 不设密码,git pull、git push 都很顺手; 设了密码,VSCode 或 IDEA 里又经常弹窗让输入,挺烦。 ...

2026年5月20日 · 1 分钟 · 浅忆

使用 GitHub + Woodpecker 实现 Hugo 自动部署

这篇文章和使用 GitHub Actions 不同的是: 代码托管在 GitHub 私有仓库 CI/CD 在自己服务器执行 不想使用 GitHub Actions 分钟数 比 Jenkins / GitLab 更轻量 另一篇文章 : GitHub Actions + Hugo 构建 + rsync/SSH 部署到服务器 ...

2026年5月19日 · 3 分钟 · 浅忆