This article is translated from Chinese to English by ChatGPT. There might be errors.

My private home network originally used Zerotier, but I found the connection to be unstable. Even when both of my nodes had public IPs, they sometimes failed to connect. Later I switched to WireGuard, which turned out to be very stable. Recently, however, I bought several new VPS instances and a friend’s home network also joined mine. The number of nodes increased, security rules became more complex, and maintaining WireGuard started to feel overwhelming. So I finally decided to deploy Headscale and migrate to a Tailscale-based network.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

I recently bought a small J1900 mini PC to give to a friend as a soft router. As usual, I tried to install Proxmox on it, but ran into an issue I’d never seen before: when the progress bar reached 100%, it threw this error: failed to prepare EFI boot using Grub on '/dev/sda2': unable to install the EFI boot loader on '/dev/sda'. I then spent the whole afternoon wrestling with it before finally fixing the problem.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

Ran into yet another pitfall. This time it happened when I tried to migrate my original Proxmox VM ImmortalWrt (a build of OpenWrt) into Docker while keeping the IP address unchanged. This ImmortalWrt instance is running my WireGuard service. The migration itself went smoothly. After starting the Docker container, ping worked fine, and my phone could connect to WireGuard. Only one always-on 24/7 node stubbornly refused to connect: no handshake, WireGuard showed 0 KB received, not a single packet came in.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

The subtitle of this post could be “My Hacky Docker Networking Setup”. It mainly describes the pitfalls I ran into when configuring Docker to bridge to the host network.

Docker’s bridge network is an internal network; all communication with the outside world has to go through L3 routing and NAT, which is inconvenient for some applications. If you want to bridge to the host network, the simplest approach is to use macvlan. However, macvlan has the drawback that it cannot communicate with the host, so it’s not a perfect solution.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

I’ve been using Kotlin Coroutine in projects for more than a year. Although I’ve only used some very basic features, I still ran into plenty of pitfalls. This post records them as notes.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

After a recent NAS upgrade, I ended up with two spare 10 TB drives that I didn’t add to the array. I initially planned to use them for an additional ZFS backup, but later found out that zrepl doesn’t support multiple destinations, so I dropped the idea. Since I had just finished setting up WebVirtCloud, I figured I’d try running a black Synology (XPEnology), passthrough the two disks, and get another toy to play with.

Continue reading

This article is translated from Chinese to English by ChatGPT. There might be errors.

In the past two days I’ve been digging into how Kotlin coroutines work under the hood. I’ve read a lot of materials, and went from feeling completely lost to now having some rough intuition. This post records my current understanding of Kotlin coroutines.

Continue reading

Author's picture

Alex King

Observing without evaluating is the highest form of human intelligence

Human

Shanghai