使用 Headscale 和 Tailscale 搭建虚拟私有网络
为了能够远程访问主机(包括那些位于 NAT 之后的主机),可以通过搭建虚拟私有网络(也就是VPN),将这些主机连接起来。传统的 VPN 软件大构件的是Hub-and-spoke网络,所有主机(客户端)的流量经过中心VPN网关(服务器端)进行中转。那么服务器的性能和带宽,就限制了 VPN 的使用体验。而比较现代的方式,是通过网格网络(Mesh Network),构建点对点的网络。尽管此时也会有一个中心的服务器,但通常只扮演是注册中心、控制中心的角色。主机节点之间的网络传输,通过直接建立的网络,而不是通过第三方节点中转。目前此类产品的代表有 Nebula、Tailscale 等。Tailscale 在其官方网站对 Tailscale 和 Nebula 进行了比较。本文介绍如何使用 Headscale 搭建一个基础版的网格VPN。
使用 CoreDNS 搭建本地的 DNS 服务器
使用 OpenTofu 替代 Terraform
Terraform 是世界上首屈一指的实现基础设施即代码(infrastructure-as-code,即 IaC)的软件工具。Terraform 通过不同云厂商的 Provider,可管理绝大多数的云服务资源。Terraform 最初由 Hashicorp 公司开发, 2024年 IBM 收购了 Hashicop。
Terraform 最开始以 Mozilla 公共许可 v2.0 (MPL 2.0) 发布。但是在 2023年8月10日开始,Hashcorp将旗下所有产品的许可证变更为 Business Source License (BSL 或者 BUSL,商业源代码许可证) v1.1,Terraform 也包括在内。之后,Linux 基金会宣布推出 OpenTofu,它是一个 Terraform 的开源替代方案,并且分叉自 Terraform,采用的是 MPL-2.0。随后一些大厂也有一些跟进动作,比如在新闻报道中提到:“Oracle将Terraform替换为开源分支OpenTofu,用于其Oracle E-Business Suite (EBS) Cloud Manager”。
构建和托管静态网站
对于简单的内容呈现站点,比如着陆页、博客等,可以将站点提前转换为静态页面,通过HTTP服务器对外呈现内容。这样的好处是易于部署、对服务器资源要求很低,同时对SEO更友好。在市面上,已经有很多围绕静态站点的工具。对于最终用户而言,最好的体验就是:在编写了文本内容(比如以Markdown编写的文章)后,就会自动化地构建,再自动化地部署到服务器,然后即可通过浏览器访问。附加的基础能力,还包括版本控制等。
使用 Go 渲染模板
使用 DNS 验证获取 Let's Encrypt 的 SSL 证书
Let's Encrypt 是一个非盈利的证书颁发机构,为互联网站点提供免费的 SSL 证书。通常,可以通过 HTTP 认证(HTTP Validation)获取 Let's Encrypt 的证书。比如 Caddy 服务器就内置了自动获取 Let's Encrypt 或者 ZeroSSL 证书的特性。但这种 HTTP 认证的方式,需要域名指向一个可以被互联网公网访问的 HTTP 服务器,并开放 HTTP端口(80) 和 HTTPS 端口(443)。这在某些情况下可能并不适用。幸运的是,还可以通过 DNS 认证(DNS Validation)获取 SSL 证书。当然在获取(以及续期)的过程中,需要修改域名的 DNS 的记录,以便证明对域名的所有权。
创建自签名的 SSL 证书
SSL 证书是一种数字证书,用于在客户端和服务器之间建立安全的加密连接,确保数据在传输过程中不被窃取或篡改。在互联网上,通常由权威的证书颁发机构(CA)给用户颁发证书。通常可以利用云服务厂商提供的证书管理服务获取证书(可能是付费的),也可以向 Let's Encrypt 这个免费、自动化且开放的证书颁发机构申请证书。除此之外,对于内部应用,还可以自行创建证书。本文介绍创建自签名的SSL证书的方式。
从 DockerHub 上的 Docker 镜像中提取文件
docker-image-extract
是一个 Shell 脚本,可用于从位于 DockerHub 上的 Docker 镜像中提取文件。比如在本机没有安装 Docker,但期望提取 Docker 镜像中的某个文件时,就可以使用这个小工具。对于有多平台的镜像,还可以指定镜像的平台。
在使用最小镜像的 Armbian 系统中配置无线网络
在网页中根据 iframe 的内容自动调节其高度
<iframe>
(Inline Frame 的缩写)是 HTML 中的内联框架元素。它可以在一个 HTML 文档中嵌入另一个独立的 HTML 文档。因此常常用于在网页中嵌入外部内容。但是,由于在渲染父网页时,浏览器并不知道嵌入其中的iframe的高度,因此默认情况下,无法根据 iframe 的内容自动调节其高度。实际中,可以通过多种方法,利用 Javascript实现。本文介绍使用 postMessage
来实现。