作者: 启鑫

  • 将 Windows Server 标准版切换至数据中心版

    在 Windows Server 的使用过程中,根据业务发展和IT需求的变化,您可能需要从标准版升级到功能更全面的数据中心版。Windows Server 提供了便捷的版本转换机制,允许您在现有系统上直接升级,无需耗时的重新安装。

    1. 确认当前系统版本

    运行以下命令确定 Windows Server Standard 是否为当前版本名称

    DISM /online /Get-CurrentEdition

    如果命令输出显示类似 ServerStandard 的信息,则表明您的系统当前为 Windows Server 标准版。

    2. 确定验证 Windows Server Datacenter 是有效的转换选项:

    通过运行以下命令,您可以查看可供升级的目标版本列表:

    DISM /online /Get-TargetEditions

    3. 切换至数据中心版

    DISM /online /Set-Edition:ServerDatacenter /ProductKey:<product key> /AcceptEula
  • 使用远程服务器加速 Immich 的机器学习推理

    为了显著提升 Immich 在执行照片和视频分析等任务时的机器学习推理性能,可以将 Immich 的机器学习容器部署在具备更强硬件性能(例如配备高性能 GPU 或专用 AI 加速卡的服务器)的远程服务器上。这种方式可以将计算密集型的推理工作负载从运行 Immich Server 的主服务器卸载,从而释放主服务器的资源并加快推理速度。

    1. 确保版本一致性

    重要提示:

    1. Immich 服务器(即运行 Immich Web、API 和 Microservices 的主服务器)的版本必须与您计划在远程服务器上部署的机器学习服务容器的版本完全一致。
    2. 如果这两个组件的版本不匹配,极有可能导致各种不可预期的错误、功能异常,甚至推理任务的彻底失败。为了确保系统的稳定性和功能的正常运行,请务必仔细核对并保持版本同步。

    2. 在远程系统上部署机器学习容器

    在您选定的远程服务器上,创建一个名为 docker-compose.yml 的文件。该文件将定义并配置 Immich 机器学习服务的 Docker 容器。请根据您的远程服务器的硬件配置以及您希望使用的加速后端选择合适的配置:

    name: immich_remote_ml
    
    services:
      immich-machine-learning:
        container_name: immich_machine_learning
        # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
        # Example tag: ${IMMICH_VERSION:-release}-cuda
        image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
        # extends:
        #   file: hwaccel.ml.yml
        #   service: # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
        volumes:
          - model-cache:/cache
        restart: always
        ports:
          - 3003:3003
    
    volumes:
      model-cache:

    3. 启动容器

    在远程服务器上执行以下命令启动服务:

    docker compose up -d

    4. 配置 Immich 使用远程推理服务

    在 Immich Web 界面中:

    • 进入 系统设置
    • 打开 系统管理 > 设置 > 机器学习设置
    • 将远程服务器的机器学习服务 URL 填入(例如:http://<远程服务器IP>:3003)

    完成以上配置后,Immich Server 在需要进行机器学习推理时,例如人脸识别、物体识别、场景分类等,将会自动将这些请求发送到您配置的远程机器学习服务。这将利用远程服务器更强大的计算资源来加速推理过程,从而提升 Immich 的整体性能和用户体验。您可以通过观察 Immich 的任务队列和远程服务器的资源使用情况来验证远程推理是否正常工作。

  • 使用Docker部署开源 RSS 阅读器 Miniflux

    Miniflux 是一款注重简洁与高效的开源 RSS 阅读器,用户可自行部署。它支持多种订阅格式,提供纯粹的阅读体验,具备文章过滤、标签管理、阅读状态跟踪等实用功能。作为自托管方案,Miniflux 无广告和追踪,让用户专注于内容本身。

    1. 前提条件

    在开始部署之前,请确保你的系统已经安装了 Docker 和 Docker Compose。如果尚未安装,请参考 Docker 官方文档进行安装。

    2. 使用 Docker Compose 部署 Miniflux

    通过 Docker Compose,你可以轻松地定义和管理 Miniflux 及其依赖的服务。

    2.1 创建 Docker Compose 配置文件

    首先,在你希望存放配置文件的目录下创建一个名为 docker-compose.yml 的文件,并将以下内容粘贴到文件中:

    services:
      miniflux:
        image: miniflux/miniflux:latest
        ports:
          - "80:8080"
        depends_on:
          db:
            condition: service_healthy
        environment:
          - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
          - RUN_MIGRATIONS=1
          - CREATE_ADMIN=1
          - ADMIN_USERNAME=admin
          - ADMIN_PASSWORD=qixinlee.com
        healthcheck:
          test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
      db:
        image: postgres:17-alpine
        environment:
          - POSTGRES_USER=miniflux
          - POSTGRES_PASSWORD=secret
          - POSTGRES_DB=miniflux
        volumes:
          - miniflux-db:/var/lib/postgresql/data
        healthcheck:
          test: ["CMD", "pg_isready", "-U", "miniflux"]
          interval: 10s
          start_period: 30s
    volumes:
      miniflux-db:

    2.2 启动 Miniflux 服务

    打开你的终端,导航到包含 docker-compose.yml 文件的目录,然后执行以下命令来启动 Miniflux 及其依赖的 PostgreSQL 数据库服务:

    docker compose up -d

    这条命令会在后台启动定义在 docker-compose.yml 文件中的服务。

    2.3 访问 Miniflux Web 界面

    当部署完成后,你可以通过你的 Web 浏览器访问 http://localhost(如果 Docker 运行在本地)或者相应的服务器 IP 地址。

    首次登录时,你需要使用在 docker-compose.yml 文件中配置的管理员账户信息:

    • 用户名 (Username): admin
    • 密码 (Password): qixinlee.com

    登录后,你就可以开始添加你的 RSS 订阅源,享受简洁高效的阅读体验了。

    2.4 停止 Miniflux 服务

    如果你需要停止正在运行的 Miniflux 服务,可以在相同的终端窗口或导航到相同的目录后运行以下命令:

    docker compose down

    这条命令会停止并移除由 docker-compose up 命令创建的容器和服务。

  • SNI 漏洞如何影响你的加密通信

    SNI 阻断提醒我们:即使是 HTTPS 加密的通信,在握手时也会“说漏嘴”。
    在你构建下一代应用、工具或服务时,别忘了这点:安全不是默认的,隐私需要自己争取。

    一、SNI 是什么?

    SNI,全称 Server Name Indication(服务器名称指示),是 TLS(传输层安全协议)的一个扩展。

    在传统 HTTP 中,请求目标的域名信息包含在明文请求头中。而在 HTTPS 中,请求的内容虽然会被加密,但在 TLS 握手开始时,客户端仍需要告诉服务器自己要访问哪个域名,以便服务器返回正确的证书。这部分信息就是通过 SNI 字段传输的。

    重点:SNI 字段是明文的,它暴露了你想访问的域名,即便其他通信内容都是加密的。

    举个例子:
    当你访问 https://example.com 时,浏览器会先发送一个 ClientHello 报文,其中就包含了 example.com 的 SNI 字段。只有在这之后,TLS 握手才会继续并建立加密通道。

    二、SNI 阻断的原理是什么?

    正因为 SNI 是明文传输的,它就成了防火墙和深度包检测(DPI)系统的“突破口”。

    封锁者只需在 TLS 握手过程中抓取流量,读取其中的 SNI 字段:

    1. 客户端发起 TLS 握手;
    2. 在 ClientHello 中包含明文的 SNI 字段(即你要访问的域名);
    3. 防火墙或 DPI(深度包检测)设备分析该字段;
    4. 如果域名匹配封锁规则,则立即阻断连接。

    常见的阻断方式包括:

    • 发送 TCP RST 包:强制关闭连接;
    • 直接丢弃 TLS 握手包:让连接挂起、卡死;
    • 注入伪造响应、返回错误页、返回 reset 包;

    这种方式对服务端和客户端透明、不依赖解密,加之效率极高,因此广泛用于精准封锁策略中。

    三、如何检测 SNI 是否被阻断?

    你可以使用如下方式排查:

    方法 1:使用 openssl 命令行测试

    openssl s_client -connect example.com:443 -servername example.com
    • 如果连接能建立,表示 SNI 暂未被封锁;
    • 如果连接发生 timeout、reset 或 TLS 握手失败,很可能 SNI 被拦截。

    方法 2:使用 Wireshark 抓包

    操作步骤:

    1. 打开 Wireshark,设置过滤器为 tcp.port == 443;
    2. 访问你怀疑被封锁的网站;
    3. 查找 ClientHello 包,并检查是否出现:
      • 后续无响应;
      • 接收到 TCP RST;
      • 握手中断在 SNI 之后。
        Wireshark 可视化过程清晰,非常适合深入分析封锁点。

    四、对于开发者:如何构建更安全的服务

    安全设计的关键词:默认加密、最小权限、最少暴露

    不要等出了问题才想着“加个验证”或“换个协议”——安全不是补丁,而应该是架构的一部分。

    在你开发每一个接口、设计每一个通信协议、部署每一台服务器时,都可以问问自己:

    这个组件,暴露了什么?
    是否默认安全?
    用户的数据有没有主动保护?

    真正可靠的服务,往往不是最强,而是最稳、最透明、最值得信赖。

    别忘了:安全不是奢侈品,它是你服务可信赖的基础。

  • Windows 文件文本搜索:PowerShell 与 findstr

    在Windows操作系统中,常常需要快速查找文件中的指定文本内容。这可以帮助我们在处理日志文件、源代码或其他大型文件时,迅速定位到关键信息。Windows系统提供了几种方法来完成这项任务,最常用的包括使用PowerShell的Select-String命令和命令提示符中的findstr工具。

    具体选择哪个工具,取决于你对功能的需求:

    • 如果你需要更强大的正则表达式支持和更详细的输出,PowerShell的Select-String是更好的选择。
    • 如果你需要快速搜索,并且只对简单的文本匹配感兴趣,findstr则更为高效和便捷。

    1. 使用PowerShell进行文本搜索

    PowerShell是Windows自带的命令行脚本环境,它功能强大,能够执行多种任务,尤其适合处理文件内容。通过Select-String命令,用户可以轻松地在文件中查找指定的文本。

    示例:使用PowerShell的Select-String

    假设你有一个名为large_file.txt的文本文件,想要在其中查找字符串search_string。可以使用以下命令:

    Get-Content "large_file.txt" | Select-String "search_string"

    命令解释:

    • Get-Content "large_file.txt":读取文件内容。
    • Select-String "search_string":搜索并显示包含search_string的所有行。

    该命令会返回所有匹配的行,及其对应的行号,便于用户快速定位到相关内容。

    使用正则表达式进行高级搜索

    Select-String命令支持正则表达式,允许用户进行更复杂的文本匹配。例如,如果你想匹配以“log”开头的字符串,可以使用如下命令:

    Get-Content "large_file.txt" | Select-String "^log"

    这将查找所有以”log”开头的行。

    显示上下文

    如果你希望在匹配的行前后显示几行上下文,可以使用-Context参数:

    Get-Content "large_file.txt" | Select-String "search_string" -Context 2,2

    这将显示匹配行的前后各2行内容,帮助你更好地理解匹配的上下文。

    2. 使用命令提示符中的findstr

    findstr是Windows命令提示符中的一个文本搜索工具,适用于快速查找文件中的指定字符串。尽管它不像PowerShell的Select-String那么强大,但它对于简单的文本搜索来说非常高效。

    示例:使用findstr命令

    在命令提示符下,你可以使用如下命令来搜索文件large_file.txt中的search_string:

    findstr "search_string" large_file.txt

    命令解释:

    • "search_string":指定你要查找的文本。
    • large_file.txt:指定要搜索的文件。

    findstr会输出包含匹配文本的所有行,并显示相应的行号。

    忽略大小写

    如果你想在搜索时忽略大小写,可以使用/i选项:

    findstr /i "search_string" large_file.txt

    这将忽略大小写进行匹配。

    显示行号

    要显示匹配文本所在的行号,可以使用/n选项:

    findstr /n "search_string" large_file.txt

    这将输出匹配文本及其所在的行号。

    PowerShell与findstr的对比

    特性PowerShell (Select-String)findstr
    正则表达式支持完全支持复杂正则表达式支持简单正则表达式
    功能丰富提供更详细的输出信息,如上下文、匹配行数等输出较为简洁,仅显示匹配行
    易用性更适合有一定脚本经验的用户,功能强大简单快速,适合快速操作
    性能处理大型文件时可能稍慢,但支持流式数据适用于快速搜索小文件
  • 使用 opkssh 实现 OpenID 身份验证与 SSH 连接

    opkssh 是一个结合 OpenID 身份验证和 SSH 连接的工具,它能简化 SSH 密钥的管理,并提升 SSH 连接的安全性。与传统的 SSH 密钥验证方式不同,opkssh 通过 OpenID 身份验证来生成 SSH 密钥,使得用户的身份验证更加灵活与安全。

    1. 安装 opkssh

    opkssh 可以在 Windows、macOS 和 Linux 系统上使用。下面是详细的安装步骤:

    在 Windows 上安装 opkssh

    1. 打开 PowerShell 或命令提示符。
    2. 执行以下命令,下载并安装 opkssh:
    curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -o opkssh.exe
    1. 下载完成后,你将获得 opkssh.exe 文件。你可以将它放在任何你想要的目录下,并通过命令行运行它。

    在 macOS 上安装 opkssh

    1. 打开终端。
    2. 执行以下命令,下载并安装 opkssh:
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh
    1. 这将下载 opkssh 文件并授予执行权限。你可以将其移动到 /usr/local/bin/ 目录,方便在终端中全局使用。

    在 Linux 上安装 opkssh

    Linux 系统支持多种架构。根据你的系统架构(x86_64 或 ARM64),选择相应的安装命令。

    • 对于 x86_64 架构的 Linux 系统:
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh
    • 对于 ARM64 架构的 Linux 系统:
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

    安装完成后,你可以将 opkssh 文件移动到 /usr/local/bin/ 目录,或将其保留在当前目录。

    2. 使用 opkssh 进行身份验证与 SSH 登录

    安装完成后,你可以开始使用 opkssh 进行身份验证和 SSH 连接。

    登录并生成 SSH 密钥

    1. 在终端或命令行中运行以下命令:
    opkssh login
    1. 该命令将打开一个浏览器窗口,要求你选择一个 OpenID 提供商并完成身份验证。你可以选择 Google、GitHub 等常见的 OpenID 提供商来进行登录。
    2. 登录成功后,opkssh 会在你的本地系统中生成一个 SSH 公钥文件,默认位置是 ~/.ssh/id_ecdsa。这个密钥对应的是你的 OpenID Token,凭此可以通过 SSH 连接到服务器。

    默认 SSH 密钥过期时间

    生成的 SSH 密钥默认会在 24 小时后过期。到期后,你需要重新运行 opkssh login 来生成新的密钥。

    使用 SSH 登录

    一旦密钥生成成功,你可以像使用传统 SSH 密钥一样使用它来登录到远程服务器。执行以下命令:

    ssh [email protected]

    使用 SFTP 进行文件传输

    你还可以使用 opkssh 生成的 SSH 密钥进行 SFTP 文件传输:

    sftp [email protected]

    3. 自定义 SSH 密钥名称

    opkssh 允许你为生成的密钥指定自定义名称,方便管理。

    登录时指定自定义密钥名称

    如果你希望使用特定名称的密钥,可以在执行 opkssh login 时指定密钥名称:

    opkssh login -i opkssh_server_group1

    使用自定义密钥进行 SSH 连接

    在使用 SSH 时,你可以通过 -i 参数指定自定义的密钥文件。假设你使用了 opkssh_server_group1 作为密钥名称,可以执行以下命令:

    ssh -o "IdentitiesOnly=yes" -i ~/.ssh/opkssh_server_group1.pub -i ~/.ssh/opkssh_server_group1 [email protected]

    这里的 -o "IdentitiesOnly=yes" 参数会确保 SSH 仅使用指定的密钥进行身份验证,避免使用其他默认密钥进行干扰。

    4. 在服务器端安装和配置 opkssh

    为了让你的服务器支持使用 opkssh 进行身份验证,你需要在服务器上安装并配置它。

    安装 opkssh 在服务器上

    1. 登录到你的服务器。
    2. 使用以下命令安装 opkssh:
    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

    这条命令会自动下载并安装 opkssh,并将其放置在 /usr/local/bin/ 目录中,同时配置 SSH 服务以支持 opkssh 作为附加的身份验证机制。

    允许单个用户使用 opkssh 登录

    如果你想允许某个用户(例如 [email protected])通过 OpenID 进行身份验证并作为 root 登录到服务器,可以执行以下命令:

    sudo opkssh add root [email protected] google

    允许用户组使用 opkssh 登录

    如果你希望允许某个用户组(例如 ssh-users)中的所有成员通过 OpenID 进行身份验证并作为 root 登录,可以使用以下命令:

    sudo opkssh add root oidc:groups:ssh-users google