编辑
2023-09-08
环境部署
00

该文章已加密,点击 阅读全文 并输入密码后方可查看。

编辑
2026-01-11
工具
00

Ghostty 终端模拟器在 macOS 上的安装与配置实践

背景

在日常开发工作中,终端模拟器的性能直接影响开发体验。传统的 iTerm2 虽然功能丰富,但在处理大量输出时偶有卡顿;Alacritty 虽然性能出色,但 macOS 集成度不够理想。Ghostty 作为 Mitchell Hashimoto(HashiCorp 创始人)用 Zig 语言开发的新一代终端模拟器,在性能和原生体验之间取得了较好的平衡。

技术特性

Ghostty 的核心优势:

  • GPU 加速渲染:基于 Metal API,渲染性能优于传统终端
  • 低资源占用:Zig 编译的原生二进制,启动速度快,内存占用低
  • 原生 macOS 集成:完整支持系统级特性,包括窗口管理、通知等
  • 完整的终端协议支持:兼容 xterm-256color,支持 true color
  • 现代化特性:ligatures、emoji、Unicode 全面支持

安装步骤

前置条件

确认系统已安装 Homebrew:

bash
which brew
编辑
2025-12-21
工具
00

告别手动配置:用 SDKMAN! 重塑你的 Java 开发环境

写这篇文章的起因很简单——我受够了在 .bashrc 里维护一堆 JAVA_HOME_8JAVA_HOME_11 的日子。每次接手一个老项目要切 Java 8,改完配置还得 source 一下,偶尔忘了重开终端,构建失败查半天才发现是版本没切过来。

如果你也经历过这些,这篇文章应该能帮到你。


我之前的配置长这样

先看看我原来的 .zshrc(macOS)是怎么管理多版本 JDK 的:

bash
# JDK Config - 手动管理的噩梦 JAVA_HOME_8=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home JAVA_HOME_11=/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home JAVA_HOME_17=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home export JAVA_HOME=$JAVA_HOME_8 alias jdk8="export JAVA_HOME=$JAVA_HOME_8 && java -version" alias jdk11="export JAVA_HOME=$JAVA_HOME_11 && java -version" alias jdk17="export JAVA_HOME=$JAVA_HOME_17 && java -version" CLASS_PATH="$JAVA_HOME/lib" PATH="$PATH:$JAVA_HOME/bin"

问题很明显:

  1. 路径硬编码——换台机器又得重新配
  2. 版本升级麻烦——17.0.1 升 17.0.2 要改路径
  3. alias 污染——项目多了 jdk8、jdk11、jdk17、jdk21... 一堆别名
  4. 新人上手难——入职新人还得手动下载、配置、踩坑一遍

后来我切换到 SDKMAN!,上面这些问题基本都解决了。

编辑
2025-11-18
Docker
00

一、管理台有没有“完全不改代码”的同域名多后端降级功能?

以现在用的 Nginx Proxy Manager 2.11.3 为例,Web 管理界面只提供:

  • 每个 Proxy Host 配置 一个 “Forward Hostname / IP + Port”
  • 一个 “Custom Nginx Configuration” 文本框(本质是 Nginx 片段)
  • Streams/Redirection/404 等基础能力

没有界面化的:

  • 多个 upstream 服务器组配置
  • 主/备后端、健康检查、权重等负载均衡选项
  • 同一 Proxy Host 下点击就能加“第二个后端”的 UI

所以,要在 同一个域名 上做“主服务 + 降级服务容灾”,只能用两类办法:

  1. 像我们现在这样
    • 用容器里 /data/nginx/custom/http_top.conf 定义 upstream(一次性手工)
    • 在 Proxy Host 的 Advanced 里用 proxy_pass http://my_backend_servers; 引用
  2. 或者把 Failover 做在 NPM 之外
    • 上游用云厂商负载均衡 / DNS 失败切换
    • NPM 只接一个已经做好的虚拟 IP 或域名

换句话说:目前没有“纯点点点、不写配置片段”的图形化降级方案,你现在这套就是标准的高级用法。


二、实现办法

主题:基于 Nginx Proxy Manager 的 Docker 容器做同域名多服务降级容灾
目标:同一个域名指向两个后端服务,主服务不可用时自动切换到降级服务(Failover),无需人工干预。

1. 场景与目标

  • 域名:example.com
  • 主服务(正常业务):主服务 A,例如 124.xxx.xxx.120:13210
  • 降级服务(简化版/静态服务):降级服务 B,例如 43.xxx.xxx.126:8001
  • 入口:Nginx Proxy Manager(Docker 容器)
  • 要求:
    • 日常所有流量走主服务 A
    • A 宕机、超时或连续失败时,自动切到 B
    • 对客户端保持域名不变
编辑
2025-11-16
环境部署
00

从零到上线:用 frp + Nginx Proxy Manager 将家中 Windows 笔记本的 Docker 服务安全暴露到公网(v0.65.0,TOML 版)

面向场景:你在家里的 Windows 笔记本(Surface Laptop 2)上运行若干 Docker 服务(例如端口 3210、5432、8181),家中宽带在 大内网/NAT 后,没有公网 IP;你已有一台有公网 IP 的 云服务器,并已部署 Nginx Proxy Manager(NPM)。目标是通过 frp 建立安全隧道,让手机在 5G 外网也能访问这些服务。

NAT:网络地址转换,将大量私网地址通过少量公网地址上网,导致内网设备无法被公网主动访问。


一、架构与原理

  • 家里笔记本安装并以“服务”方式运行 frpc(客户端),主动连接云服务器的 frps(服务端),形成一条加密的 隧道
  • 外部请求访问云服务器(IP 或域名),由 Nginx Proxy Manager 反代到 frps 暴露的端口,再回源到家中笔记本对应的本地端口。
  • 该方案绕过运营商 NAT 限制,稳定且安全。
text
手机/外网 → 域名(Nginx Proxy Manager, 云) → 127.0.0.1:远程端口(frps) ↓ frp 隧道 家中 Windows: 本地端口 (Docker 服务)

隧道:指通过中间节点转发建立的端到端连接通道,常用于穿透 内网防火墙


二、版本与目录约定(重要)

  • frp 版本:v0.65.0(从该版本开始官方主推配置文件为 TOML,不再使用 INI)。
  • 云服务器(Linux)frp 安装目录:/root/frp/frp_0.65.0_linux_amd64
  • 本地 Windows 目录示例:D:\frp_0.65.0_windows_amd64
  • Windows 端以“系统服务”方式运行 frpc,避免关闭窗口导致进程退出。

TOML:一种人类友好的配置文件格式,键值以 key = "value" 表示,层级清晰、类型明确。