避坑指南:为什么我的 Docker 镜像在 Docker Hub 上没有多架构(Multi-Arch)支持?
避坑指南:为什么我的 Docker 镜像在 Docker Hub 上没有多架构(Multi-Arch)支持?问题现象在 Mac (Apple Silicon / M1/M2/M3) 上编译并推送 Docker 镜像时: 12docker push docker.io/damingerdai/rammal:v0.0.1-alpha.0 发现 Docker Hub 页面上的 Tag 只显示 linux/arm64,并没有预期的 linux/amd64 与 linux/arm64 共存。重新针对 amd64 推送后,原有的 arm64 镜像反而被覆盖掉了。 原因分析1. 默认构建引擎(Driver)的局限运行 docker buildx ls 会发现,默认使用的是 default 实例,其驱动为 docker 引擎: 123NAME/NODE DRIVER/ENDPOINTdefault* docker 原生 docker 驱动使用的是 Docker Engine 本地的镜像存储(Image Store)。 本地存储设计初衷是...
在 Docker 构建 Rust 项目时注入 Git 版本信息
在 Docker 构建 Rust 项目时注入 Git 版本信息在开发 Rust 服务时,我们经常希望程序能够输出自身的构建信息,例如: 当前版本对应的 Git commit; Git 分支; 最近的 tag 或 git describe 结果; commit 的提交时间; Rust 编译器和 Cargo 版本; 程序的构建时间。 这些信息对于排查线上问题很有帮助。看到某个容器正在运行时,我们可以快速确认它究竟由哪一次提交构建,而不必仅依赖容易被重复使用的 Docker tag。 本文记录我在 Rust 项目中使用 vergen-git2 生成构建信息,并在 Docker 构建阶段通过 build arguments 注入 Git 元数据的过程。 一、为什么 Docker 构建时可能读取不到 Git 信息在本地直接执行: 1cargo build --release 构建脚本通常可以沿着当前目录找到 .git,因此 vergen-git2 能直接读取 commit、branch 和 tag 等信息。 但是 Docker 构建并不一定能看到 .git。常见原因包括: .doc...
内网 GitOps 实践:FluxCD 与 Gitea (HTTP) 集成与 初始化 指南
FluxCD 在内网纯 HTTP 环境下与 Gitea 集成并完成初始化(Bootstrap)过程的技术总结 1. 环境背景与技术痛点 基础设施:部署于内网的 Gitea 实例(通过 HTTP 协议暴露服务,地址格式为 http://<IP>:<PORT>)。 网络限制:内网环境未配置 TLS/SSL 证书,不支持 HTTPS 通信。 核心拦截点: 协议强校验:新版 Flux CLI 的 flux bootstrap gitea 在调用 Gitea API 时默认强制使用 HTTPS,抛出 http: server gave HTTP response to HTTPS client 错误。 Go-Git 明文传输保护:Flux 底层依赖的 Go-Git 库出于安全限制,禁止在未加密的明文 HTTP 链接中直接发送 Basic Auth 凭证(Token/密码),抛出 basic auth cannot be sent over HTTP 错误。 2. 核心解决方案(参考 Discussion #4972)根据 FluxCD ...
寻找轻量级 S3 替代方案:极简分布式对象存储 Garage 搭建与全线打通指南
寻找轻量级 S3 替代方案:极简分布式对象存储 Garage 搭建与全线打通指南在自建基础设施、HomeLab 或微型云环境时,MinIO 通常是大家首选的 S3 兼容对象存储。然而,MinIO于2026 年 2 月 12 日宣布不再维护,2026 年 4 月 25 日正式归档为只读状态 最近关注到一篇优秀的技术分享 Garage: The Minimalist Distributed Object Store — Your Lightweight S3 Alternative,文中极力推荐了 Garage。这是一个用 Rust 编写的轻量级、去中心化分布式对象存储,专为不规则、低带宽的多节点网络设计,单个节点跑起来甚至只需要几十兆内存,可以说是将“极简主义”贯彻到了极致。 本文将基于最新的 Garage v2.3.0,详细记录如何通过 Docker Compose 快速搭建单节点集群,并分享在部署以及后续使用 SDK 进行客户端测试时遇到的四大核心深坑与避坑姿势。 1. 环境准备与架构设计根据极简主义的设计原则,我们采用 Docker Compose 进行微服务化部署. 核心...
Docker 把我宿主机网络"吃"了:一次 172.18 网段冲突的完整复盘
Docker 把我宿主机网络”吃”了:一次 172.18 网段冲突的完整复盘 摘要:本文记录了一起由 Docker 自定义网络自动分配网段引发的宿主机网络故障。现象是宿主机无法访问内网某台服务器,报错 From 172.18.0.1 Destination Host Unreachable。最终定位到是 docker-compose 中的 pg-network 抢占了 172.18.0.0/16,并给出了不丢数据、不卸载 Docker 的最终解决方案。 一、问题现象某台物理服务器(宿主机 A),需要访问内网另一台服务器(目标机器 B)。 执行 ping 命令: 1ping 172.18.1.10 返回结果: 1From 172.18.0.1 icmp_seq=1 Destination Host Unreachable 令人困惑的点: ✅ 目标机器在线(其他机器可正常访问) ✅ 交换机、VLAN 配置近期未变更 ✅ 防火墙策略已排查,无异常 更诡异的是: ❌ 停止 docker.service 后问题依旧 ❌ 停止 docker.socket 后问题依旧 仿佛 D...
Docker + acme.sh 搭建 Tailscale 自建 DERP 中继节点完整记录
Docker + acme.sh 搭建 Tailscale 自建 DERP 中继节点完整记录1. 方案架构为了实现证书自动申请、续期与 DERP 服务无缝衔接,采用 Docker Compose 进行单机编排。acme-sh 容器负责通过 Cloudflare DNS 验证申请 Let’s Encrypt 证书并导出为 DERP 所需的格式;derper 容器挂载相同的证书目录并运行中继服务。 1234567891011121314[Cloudflare DNS-01 验证] │ ▼ ┌─────────── derp-acme (容器) ───────────┐ │ 使用 CF_Token 申请证书,并将其安装转换为 │ │ derp.example.com.crt / .key │ └───────────────────┬────────────────────┘ │ (共享挂载 ./certs) ▼ ┌────────── tailscale-...
Go + Next.js 实现 2FA (TOTP) 的踩坑记录与架构复盘
Go + Next.js 实现 2FA (TOTP) 的踩坑记录与架构复盘最近给手头的项目加上了基于 TOTP(基于时间的一次性密码)的双因子认证(2FA)流程。整体思路是传统的双阶段认证(Two-Stage): 第一步先验密码,对上了且开启了 2FA,后端不发正式 Token,而是塞给前端一个只有 3 ~ 5 分钟寿命的 challengeToken。 前端监听到这个状态,通过 Next.js 的 URL 参数(比如 /login?step=2fa)做深链接导航,直接切到 2FA 验证页,用 input-otp 组件让用户填 6 位动态码,最后去后端换取真正的登录凭证。 本来以为一套流程跑下来挺顺畅,但利用AI对着提交的 Git Diff 仔细过了一遍安全性后,发现里面其实藏了不少逻辑漏洞和优化空间。趁着还没线上翻车,把这次的数据库改动和后续的重构 TODO 记录下来(感激AI的review)。 数据库表结构变更这次 2FA 的底层支持直接做在了原有的 users 表上,通过变更 DDL 增加了三个字段: 12345ALTER TABLE usersADD COLUMN t...
🚀 零公网 IP 实现内网穿透:Tailscale 安装与多端互联异地访问指南
🚀 零公网 IP 实现内网穿透:Tailscale 安装与多端互联异地访问指南📡 什么是 Tailscale?在日常折腾 HomeLab、NAS 或者远程办公时,我们经常需要在外网访问家里的设备。传统的方案要么需要运营商提供公网 IP(配合 DDNS),要么需要使用带有中心服务器的内网穿透工具(如 Frp、Nps),但这两种方案要么门槛高,要么受限于中心服务器的带宽。 Tailscale 是一种基于 Mesh(网状)拓扑结构的虚拟私人网络(VPN)工具。它能让你分散在各地的设备(手机、电脑、服务器、路由器)无视复杂的网络环境(如大内网、双重路由、NAT 限制),安全地连接在同一个虚拟局域网内。 Tailscale 的核心优势: 去中心化(P2P 连接):虽然有控制服务器协调连接,但设备之间的数据传输是端到端(Peer-to-Peer)的。一旦打洞成功,流量直接在两台设备间传输,速度取决于你的宽带上限,不限速。 无感接入:设备加入网络后,会获得一个固定的内网 IP(100.x.x.x 网段),无论你身处何地,直接访问这个 IP 就能连接设备。 极其简单的配置:无需折腾复杂的证书...
在 Next.js 16 (Turbopack) 中集成 RDKit.js 渲染 SMILES 的工程实践与踩坑指南
在 Next.js 16 (Turbopack) 中集成 RDKit.js 渲染 SMILES 的工程实践与踩坑指南前言在生物制药数字化(AIDD、LIMS 等系统)的前端开发中,SMILES(简化分子线性输入规范)是表示分子结构最常用的文本格式。为了在前端实现“输入文本,实时预览 2D 分子结构”,我们需要引入化学信息学界的工业级开源工具包:RDKit.js。 由于 RDKit.js 底层依赖重型的 WebAssembly (Wasm) 编译产物,当它遇到 Next.js 16 默认的 Turbopack 构建流以及 SSR(服务端预渲染) 架构时,会引发一系列经典的打包与运行时崩溃。 本文将完整记录基于 Next.js 16 + Bun + TypeScript 栈集成 RDKit.js 的踩坑心路历程,并分享最终的离线化解决方案。 一、 初次尝试与经典的 “fs” 编译炸弹按照常规的前端模块化思维,我们首先会通过 Bun 安装依赖: 1bun add @rdkit/rdkit 然后在一个标准的 Client Component 中尝试动态加载: 12// 尝试通过全局或动...
🚀 玩转 Homelab:使用 Helm 在 K3s 中部署 Gitea,并接入外部 PostgreSQL
🚀 玩转 Homelab:使用 Helm 在 K3s 中部署 Gitea,并接入外部 PostgreSQL在自己的内网(Homelab)环境里,拥有一个轻量、好用、全加密(HTTPS)的代码托管系统是每个开发者的梦想。今天这篇博客就带大家复盘,如何利用 K3s、Traefik 网关以及外部自建的 PostgreSQL 数据库,一步步搭建属于自己的 Gitea。 我们将摒弃复杂的理论,用最纯粹的实战步骤,带你避开内网部署中的那些“隐藏大坑”。 🏗️ 整体架构一览为了让整个系统足够轻量且好维护,我们采用了以下设计方案: flowchart TB subgraph Client ["开发者环境 (Client)"] Browser["浏览器 (HTTPS)"] GitCli["Git 客户端 (SSH)"] end subgraph K3S ["K3s 集群边界 (K3s Cluster)"] direction TB subgraph Net ["网络与路由 (Ingres...
