分类: 折腾

各种软硬件、新工具的测评或使用心得。

  • docker部署wordpress

    1. 创建并进入目标目录

    首先,在 /opt 下创建一个专属目录。由于 /opt 权限通常较高,需要使用 sudo

    sudo mkdir -p /opt/wordpress-app
    sudo chown $USER:$USER /opt/wordpress-app  # 将所有权改为当前用户,方便操作
    cd /opt/wordpress-app

    2. 编写 docker-compose.yml

    在该目录下创建配置文件。我们将使用 相对路径,这样 Docker 会自动在 /opt/wordpress-app 下创建数据文件夹。

    cd /opt/wordpress-app  # 进入项目目录里
    
    nano docker-compose.yml

    粘贴以下内容

    services:
      db:
        image: mariadb:10.11
        restart: always
        environment:
          # 1. 数据库超级管理员 (root) 的密码
          # 建议设置一个非常复杂的密码,仅用于后台维护,WordPress 运行不直接使用它。
          MYSQL_ROOT_PASSWORD: your_root_password
          # 2. 自动创建的数据库名称
          # WordPress 的数据都会存放在这个名为 "wordpress" 的库里。
          MYSQL_DATABASE: wordpress
          # 3. WordPress 专用数据库用户名
          # 为了安全,不建议让网页程序直接使用 root 账号,这里创建一个普通用户。
          MYSQL_USER: wordpress_user
          # 4. WordPress 专用数据库用户的密码
          MYSQL_PASSWORD: your_password
        volumes:
          # 数据将存储在 /opt/wordpress-app/db_data
          - ./db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: always
        ports:
          - "80:80"  # 如果没被占用,直接用 80 端口
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress_user
          WORDPRESS_DB_PASSWORD: your_password
          WORDPRESS_DB_NAME: wordpress
        volumes:
          # 代码和图片将存储在 /opt/wordpress-app/wp_data
          - ./wp_data:/var/www/html
        depends_on:
          - db

    3. 启动容器

    如果出现此类报错

    root@VM-4-5-debian:/opt/wordpress-app# docker-compose up -d
    
    -bash: docker-compose: command not found

    更换较新的指令

    docker compose up -d

    如果出现这个错误原因很简单,服务器无法连接到 Docker Hub 官方镜像库

    具体来说,i/o timeout(连接超时)通常是由以下两个原因导致的:

    IPv6 优先问题:报错信息中出现了 [2a03:2880...],这说明你的系统正尝试通过 IPv6 连接 Docker 官网,但腾讯云的公网环境可能对 IPv6 支持不畅。

    网络环境限制:在国内直接拉取 docker.io 的镜像经常会遇到网络波动或被屏蔽的情况。

    root@VM-4-5-debian:/opt/wordpress-app# docker compose up -d
    [+] up 2/2
     ✘ Image mariadb:10.11    Error failed to resolve reference "docker.io/library/mariadb:10.11": failed to do request: Head "https://registry-1.docke...       30.0s
     ! Image wordpress:latest Interrupted                                                                                                                        30.0s
    Error response from daemon: failed to resolve reference "docker.io/library/mariadb:10.11": failed to do request: Head "https://registry-1.docker.io/v2/library/mariadb/manifests/10.11": dial tcp [2a03:2880:f10e:83:face:b00c:0:25de]:443: i/o timeout
    root@VM-4-5-debian:/opt/wordpress-app# 

    🛠️ 解决方案

    彻底禁用 IPv6(针对腾讯云最有效的方案)

    从报错日志看,Docker 一直在尝试通过 IPv6 (2a03:2880...) 连接。国内很多环境的 IPv6 虽然能分配地址,但路由是不通的。

    最简单的办法:让 Debian 彻底优先使用 IPv4。

    1. 打开文件:
    sudo nano /etc/gai.conf

    找到第 54 行左右的这行代码: #precedence ::ffff:0:0/96 100

    去掉前面的 #,保存退出(Ctrl+O, Enter, Ctrl+X)。

    无需重启,直接再次执行:

    docker compose up -d

    依旧失败,不着急国内的环境就是复杂一些。

    最后更换公共代理加速器

    换成目前国内维护比较勤快的第三方代理加速器。

    1. 修改 daemon.json

    将你之前的 registry-mirrors 内容替换为以下几个(这是目前 2026 年比较稳定的几个):

    sudo nano /etc/docker/daemon.json

    修改为:

    {
      "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.net"
      ],
      "log-driver": "json-file",
      "log-opts": { "max-size": "100m", "max-file": "3" },
      "live-restore": true
    }

    重启docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    启动(在wordpress-app目录里执行)

    docker compose up -d

    1.确认容器运行状态

    docker compose ps

    2.开放防火墙(腾讯云关键步骤)

    你的 Docker 映射了端口(比如 8080:8080:80),但腾讯云默认的安全组可能拦截了外部访问:

    • 登录 腾讯云控制台 -> 云服务器 -> 实例。
    • 点击 安全组 -> 修改规则
    • 添加一条:协议端口 TCP:80 (或者你设置的 8080),来源选择 0.0.0.0/0(全开)。

    3. 完成 Web 安装

    在浏览器输入:http://你的服务器公网IP

    • 看到 WordPress 著名的“五分钟安装”界面,就说明成功了!
    • 数据库连接信息如果你按之前的配置填,主机名(Host)记得填 db(这是 Compose 内部的服务名),而不是 localhost
    点击继续

    填写基本信息

    完结撒花

    通过域名访问wordpress

    1. 准备 Nginx 配置文件

    /opt/wordpress-app 目录下创建一个 nginx 文件夹,用来存放配置:

    mkdir -p /opt/wordpress-app/nginx/conf.d

    创建一个名为 default.conf 的配置文件:

    nano /opt/wordpress-app/nginx/conf.d/default.conf

    写入以下内容(记得替换域名):

    server {
        listen 80;
        server_name yourdomain.com; # 替换成你的域名
    
        location / {
            proxy_pass http://wordpress:80; # 这里的 wordpress 对应 compose 里的服务名
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    2. 更新 docker-compose.yml

    修改你现有的配置文件,把 Nginx 加进去,并注意端口冲突(WordPress 容器不需要再向外暴露 80 端口了,交给 Nginx 暴露)。

    services:
      db:
        image: mariadb:10.11
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: your_root_password
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress_user
          MYSQL_PASSWORD: your_password
        volumes:
          - ./db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: always
        # 删掉之前的 ports: - "80:80",因为我们不需要外部直接访问 WP
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress_user
          WORDPRESS_DB_PASSWORD: your_password
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - ./wp_data:/var/www/html
        depends_on:
          - db
    
      nginx:
        image: nginx:alpine
        restart: always
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./nginx/conf.d:/etc/nginx/conf.d
        depends_on:
          - wordpress

    3. 部署并验证

    1. 域名解析:在你的域名服务商处,将域名指向腾讯云服务器的公网 IP
    2. 重启服务
    cd /opt/wordpress-app
    docker compose up -d

    访问域名看看效果

    最后需要到wordpress后台设置里

    访问:http://你的域名/wp-admin/

    填写完,保存更改就可以通过域名访问我们的网站了。

  • 腾讯云服务器Debian12升级Debian13

    升级前准备

    1. 快照备份(非常重要): 在腾讯云控制台为你的服务器创建云硬盘快照。如果升级失败导致系统无法启动,这是唯一的“后悔药”。
    2. 更新现有系统: 确保当前 Debian 12 是最新状态。
    sudo apt update && sudo apt upgrade -y && sudo apt full-upgrade -y

    升级步骤

    1. 修改软件源

    Debian 的升级核心在于更换 /etc/apt/sources.list 中的代号。你需要将 bookworm 替换为 trixie

    sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
    sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list

    注意: 对于腾讯云内网源(mirrors.tencentyun.com),通常只需执行上述替换即可。

    2. 更新软件包列表

    告知系统你现在指向的是 Debian 13 的仓库。

    sudo apt update

    3. 执行最小升级 (Minimal Upgrade)

    为了降低冲突风险,建议先升级基础软件包。

    sudo apt upgrade --without-new-pkgs -y

    4. 执行全量升级 (Full Upgrade)

    这是最关键的一步,系统会删除旧包并安装 Debian 13 的新包(包括内核)。

    sudo apt full-upgrade -y

    交互提示: 升级过程中,系统可能会询问你是否保留现有的配置文件(如 sshd_config)。如果你之前对服务器做过特殊配置,建议选 N(保留当前版本);如果不确定,通常选 Y(使用开发者版本)

    5. 清理与重启

    删除不再需要的旧依赖包并重启服务器。

    sudo apt autoremove -y
    sudo reboot

    验证升级结果

    重启后重新连接 SSH,查看内核和系统版本:

    cat /etc/debian_version
    # 应该显示 13.x 或 trixie/sid
    uname -a
    # 查看新内核是否生效

    完结撒花

  • remnawave 数据备份与迁移

    remnawave项目结构

    容器名称镜像类型存放的数据内容
    remnawaveBackend (Node.js)配置文件 .env(连接数据库的钥匙)
    remnawave-dbPostgres 17.6最核心: 用户信息、节点配置、所有业务数据
    remnawave-redisValkey 8.1缓存数据(如果丢失,登录状态会失效,但业务不丢)
    remnawave-nginxNginx证书文件(SSL)和反向代理配置

    执行停机

    先进入(项目根目录)

    cd /opt/remnawave

    在项目目录里运行:

    docker compose down

    你可以看到如下信息

    [+] down 4/4
     ✔ Container remnawave       Removed                                                                                                                          1.1s
     ✔ Container remnawave-redis Removed                                                                                                                          0.5s
     ✔ Container remnawave-db    Removed                                                                                                                          0.5s
     ! Network remnawave-network Resource is still in use 

    在服务器上打包

    确保你还在 /opt/remnawave 目录下,执行以下命令将整个项目(包括配置、数据库和缓存数据)打包成一个压缩文件:

    cd /opt
    tar -czvf remnawave_backup_2026.tar.gz remnawave/

    执行完成会看到如下信息

    remnawave/
    remnawave/.env
    remnawave/docker-compose.yml
    remnawave/nginx/
    remnawave/nginx/fullchain.pem
    remnawave/nginx/privkey.key
    remnawave/nginx/docker-compose.yml
    remnawave/nginx/nginx.conf
    root@yangnode:/opt# ls -lh remnawave_backup_2026.tar.gz
    -rw-r--r-- 1 root root 6.4K Apr  9 03:29 remnawave_backup_2026.tar.gz
    

    回到项目目录(/opt/remnawave)

    cd /opt/remnawave

    执行这条命令可以看到备份的数据

    ls -lh remnawave_backup_2026.tar.gz

    下载数据压缩包

    数据包完整结构

    回到ssh客户端执行下面命令回到项目目录里

    cd /opt/remnawave

    再次执行

    docker compose up -d

    检查运行状态

    docker ps

    看看服务状态

    至此备份结束。如果迁移服务器,新的服务器需要重新安装项目,备份数据直接上传解压替换即可。

    权限修复(如果需要)

    由于打包和上传可能会改变文件的“主人”,导致 Docker 容器启动后没权限读写数据库,建议执行一次权限重置:

    chown -R root:root /opt/remnawave
    chmod -R 755 /opt/remnawave

    ⚠️ 两个需要注意的“坑”

    1. 数据库版本一致性: 你在旧服务器用的是 postgres:17.6。在新服务器启动时,Docker 会自动下载最新的 17.6 镜像。只要大版本号一致,直接替换 /data 文件夹里的物理文件是没问题的。警示:千万不要随意把 17.6 改成 18 或其他大版本,否则数据库会因为格式不兼容而无法启动。
    2. 网络与证书: 如果你之前在 Nginx 里配置了 SSL 证书,且证书路径是绝对路径(比如 /etc/letsencrypt),记得也要把这些证书文件同步迁移过去,或者在新服务器上重新申请。

    参考文档:https://docs.rw/

    总结: 迁移不是“覆盖安装”,而是**“物理移动整个项目目录”**。只要路径一致、环境对齐、权限正确,Remnawave 就能在新服务器上无缝复活。

  • 使用uptime_kuma

    Uptime Kuma 是一款开源、自托管的监控工具,因其界面精美、操作简单而在开发者和自建服务爱好者中极受欢迎。它的设计风格非常现代化,类似于商业级的 UptimeRobot,但你可以完全掌控自己的数据。

    以下是关于 Uptime Kuma 的详细介绍:


    核心功能

    • 多类型监控:支持 HTTP(s)、TCP、Ping、DNS 记录、Push、Steam 游戏服务器、Docker 容器等多种协议的存活检查。
    • 精美的仪表盘:提供直观、响应式的 UI,支持深色/浅色模式(且支持跟随系统或手动切换),图表展示了服务的延迟和可用率。
    • 状态页 (Status Page):可以创建公开的状态页,向用户展示服务的实时运行状况,无需登录即可查看。
    • 丰富的通知渠道:支持超过 90 种通知方式,包括 Telegram、Discord、飞书、钉钉、微信(通过插件)、邮件 (SMTP) 以及 Webhook 等。
    • 多语言支持:原生支持中文在内的多种语言。
    • 代理支持:如果你的服务器无法直接访问某些目标,可以通过设置代理来进行监控。

    为什么它受到欢迎?

    1. 部署极其简单

    它非常适合使用 Docker 运行。只需一行命令即可启动,且所有数据都存储在一个 SQLite 数据库文件中,备份和迁移非常方便。

    2. 交互体验优秀

    与传统的监控工具(如 Zabbix 或 Nagios)不同,Uptime Kuma 的配置几乎是“零门槛”的。添加一个监控项通常只需要填写 URL 并点击保存。

    3. 轻量化

    它采用 Node.js 和 Vue 编写,对系统资源的占用非常低,即便是 1 核 1G 的轻量云服务器也能流畅运行。


    监控网站项目

    传送门

    监控服务器项目

    传送门

  • Spartan Host 斯巴达西雅图 AS9929 限量版深度测评

    🏆【传家宝系列】Spartan Host 斯巴达西雅图 AS9929 限量版深度测评

    测评声明: 本报告基于 2024 年首发批次硬件参数及 2025-2026 年网络链路实测整理。


    📌 产品背景

    在 VPS 圈内,Spartan Host(斯巴达) 一直以“稳如泰山”的口碑和高性价比的 Cera 线路闻名。2024 年上半年,官方低调推出了基于 AS9929(联通精品网) 线路的限量版套餐。这款年付 $122.40(原价 $153 使用永久 8 折优惠码)的产品,凭借其顶级的硬件配置和近乎完美的网络表现,迅速成为二级市场的“理财产品”。


    🛠 核心硬件规格

    这款机器之所以被称为“水桶机”,是因为它在硬件上没有任何缩水:

    规格项目详细参数
    处理器 (CPU)AMD Ryzen 9 7950X (2 vCPU) – 旗舰级高频表现
    内存 (RAM)2GB DDR5 – 读写速度极快
    存储 (Disk)50GB NVMe SSD – 高 IOPS 保证
    流量 (Traffic)1TB / 月 – 1Gbps 峰值带宽
    防御 (DDoS)默认 20Gbps (由 CeraNetworks 提供,可洗 CC)
    续费价格$122.40 / 年 (永久 8 折后价格)

    🌐 网络线路深度解析

    1. 三网回程 AS9929 (CU II)

    该产品最大的卖点在于其回程线路。AS9929 是联通的精品骨干网,定位对标电信的 CN2 GIA:

    • 电信用户: 借由 Cera 优化的中转,回程强制走 9929,绕过了拥堵的 163 骨干网。
    • 联通用户: 核心受众,直连精品网,延迟与稳定性达到极致。
    • 移动用户: 同样通过 9929 优化回国,解决了西雅图方向延迟抖动较大的通病。

    2. 晚高峰表现

    根据长期监测,该机房在晚高峰(20:00 – 23:00)的丢包率通常保持在 1% 以下,4K 视频起步速度极快,是追求极致观影和远程办公体验的首选。


    🚀 性能实测 (Benchmark)

    CPU 跑分

    得益于 Ryzen 7950X,其单核性能堪称恐怖。在 Geekbench 测试中:

    • 单核得分: ~2100+
    • 多核得分: ~4000+

    注:这使得它在运行 WordPress、Docker 容器或复杂脚本时,响应速度比普通的 Xeon 核心快出 50% 以上。

    磁盘 IO 测试

    “`text
    Reading speed: 2.2 GB/s
    Writing speed: 1.8 GB/s

  • 我的GitHub第一个项目

    🛡️ SpartanHost Monitor (Universal Edition)

    一款专为 Spartan Host 设计的工业级库存监控系统,支持多平台 Linux 自动适配。提供交互式部署流程、自动邮件提醒及 RESTful API 支持,能够轻松完成库存监控应用的搭建。


    License
    Issues
    Stars
    Node
    Lint
    Architecture
    Style
    Security

    🚀 技术栈支持


    ✨ 核心特性

    •  全系统适配:一键支持 Ubuntu, Debian, CentOS, AlmaLinux, Rocky, Fedora。
    •  交互式部署:安装时动态配置邮箱及密码,实现零代码基础配置。
    •  智能提醒:支持 Gmail 等 SMTP 服务,内置防骚扰冷却机制。
    •  安全加固:管理密码支持自定义或强随机生成,接口受鉴权保护。
    •  进程守护:基于 PM2 实现开机自启、崩溃重启及实时日志监控。
    •  RESTful API:预留库存数据及订阅者管理接口,方便二次开发。

    🚀 快速开始

    1️⃣ 克隆项目 (Git 方式)

    git clone https://github.com/yokopro/spartanhost-monitor.git
    cd spartanhost-monitor

    2️⃣ 执行一键部署脚本

    将自动识别系统环境并安装 Node.js 与 PM2

    # 修复换行符并赋予权限
    sed -i 's/\r$//' deploy.sh && chmod +x deploy.sh
    
    # 运行交互式安装
    ./deploy.sh

    3️⃣ 查看管理密码

    如果在安装时选择了随机生成密码,请运行以下命令查看密码:

    pm2 logs spartan-monitor --lines 50

    🛠️ 运维管理指令

    需求指令
    实时日志pm2 logs spartan-monitor
    状态面板pm2 status
    重启应用pm2 restart spartan-monitor
    停止监控pm2 stop spartan-monitor
    资源监控pm2 monit
    彻底卸载pm2 delete spartan-monitor && rm -rf $(pwd)

    🔗 API 接口文档

    系统默认运行在 3000 端口。

    1️⃣ 实时库存数据

    • EndpointGET /api/stock
    • 说明: 返回当前监控的所有产品及其库存状态。

    2️⃣ 查看订阅者清单

    • EndpointGET /api/subscribers
    • 认证: 需在 Request Header 中添加:password: 你的管理密码

    3️⃣ 系统健康检查

    • EndpointGET /health

    📂 项目结构

    ├── public/                # Web 前端页面 (订阅及展示)
    ├── server.js              # 后端核心逻辑与 API 服务
    ├── config.js              # 自动生成的配置文件 (由 deploy.sh 生成)
    ├── deploy.sh              # 终极全能交互式部署脚本
    ├── package.json           # 项目依赖清单
    └── subscribers.json       # 订阅用户数据存储 (本地 JSON)
    

    ⚠️ 注意事项

    1. Gmail 用户
      • 请务必开启“两步验证”并使用 16 位应用专用密码,而非邮箱登录密码。
    2. 防火墙设置
      • 本脚本会自动尝试开放 3000 端口,若无法访问,请检查云服务商的安全组设置。
    3. 隐私保护
      • .gitignore 已默认忽略 config.js,请勿手动取消,防止授权码泄露至公共仓库。

    联系我

    📧邮件:mail.yaoyuan(@)gmail.com 如果还有其他需求或特色添加,请随时告诉我! 😊

  • 使用Simple Icons

    结合Gemini设计一款wordpress页脚,我的理念是以简约、留白、高级、apple风格为主。因为是个人blog所以特别鸣谢开源软件提供一切的驱动’‘wordpress、docker’‘以及我最喜爱之一的SpartanHost主机服务商。

    HTMl代码

    <div class="footer-credits" style="text-align: center; font-size: 12px; color: #86868b; margin-top: 25px; display: flex; align-items: center; justify-content: center; gap: 20px; flex-wrap: wrap; font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif; -webkit-font-smoothing: antialiased;">
        
        <a href="https://wordpress.com/" target="_blank" style="display: inline-flex; align-items: center; color: #1d1d1f; text-decoration: none; transition: opacity 0.3s ease;">
            <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" style="margin-right: 6px;">
                <title>WordPress</title>
                <path d="M21.469 6.825c.84 1.537 1.318 3.3 1.318 5.175 0 3.979-2.156 7.456-5.363 9.325l3.295-9.527c.615-1.54.82-2.771.82-3.864 0-.405-.026-.78-.07-1.11m-7.981.105c.647-.03 1.232-.105 1.232-.105.582-.075.514-.93-.067-.899 0 0-1.755.135-2.88.135-1.064 0-2.85-.15-2.85-.15-.585-.03-.661.855-.075.885 0 0 .54.061 1.125.09l1.68 4.605-2.37 7.08L5.354 6.9c.649-.03 1.234-.1 1.234-.1.585-.075.516-.93-.065-.896 0 0-1.746.138-2.874.138-.2 0-.438-.008-.69-.015C4.911 3.15 8.235 1.215 12 1.215c2.809 0 5.365 1.072 7.286 2.833-.046-.003-.091-.009-.141-.009-1.06 0-1.812.923-1.812 1.914 0 .89.513 1.643 1.06 2.531.411.72.89 1.643.89 2.977 0 .915-.354 1.994-.821 3.479l-1.075 3.585-3.9-11.61.001.014zM12 22.784c-1.059 0-2.081-.153-3.048-.437l3.237-9.406 3.315 9.087c.024.053.05.101.078.149-1.12.393-2.325.609-3.582.609M1.211 12c0-1.564.336-3.05.935-4.39L7.29 21.709C3.694 19.96 1.212 16.271 1.211 12M12 0C5.385 0 0 5.385 0 12s5.385 12 12 12 12-5.385 12-12S18.615 0 12 0"/>
            </svg>
            <span style="font-weight: 500;">WordPress</span>
        </a>
    
        <span style="color: #d2d2d7; user-select: none;">|</span>
    
        <a href="https://www.docker.com/" target="_blank" style="display: inline-flex; align-items: center; color: #1d1d1f; text-decoration: none; transition: opacity 0.3s ease;">
            <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" style="margin-right: 6px;">
                <title>Docker</title>
                <path d="M13.983 11.078h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 00.186-.186V3.574a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 00.186-.186V6.29a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.887c0 .102.082.185.185.186m-2.93 0h2.12a.186.186 0 00.184-.186V6.29a.185.185 0 00-.185-.185H8.1a.185.185 0 00-.185.185v1.887c0 .102.083.185.185.186m-2.964 0h2.119a.186.186 0 00.185-.186V6.29a.185.185 0 00-.185-.185H5.136a.186.186 0 00-.186.185v1.887c0 .102.084.185.186.186m5.893 2.715h2.118a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m-2.93 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.083.185.185.185m-2.964 0h2.119a.185.185 0 00.185-.185V9.006a.185.185 0 00-.184-.186h-2.12a.186.186 0 00-.186.186v1.887c0 .102.084.185.186.185m-2.92 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.082.185.185.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 00-.75.748 11.376 11.376 0 00.692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137.983.003 1.963-.086 2.93-.266a12.248 12.248 0 003.823-1.389c.98-.567 1.86-1.288 2.61-2.136 1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288Z"/>
            </svg>
            <span style="font-weight: 500;">Docker</span>
        </a>
    
        <span style="color: #d2d2d7; user-select: none;">|</span>
    
        <a href="https://billing.spartanhost.net/aff.php?aff=2704" target="_blank" style="display: inline-flex; align-items: center; color: #1d1d1f; text-decoration: none; transition: opacity 0.3s ease;">
            <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" style="margin-right: 6px;">
                <title>iCloud</title>
                <path d="M13.762 4.29a6.51 6.51 0 0 0-5.669 3.332 3.571 3.571 0 0 0-1.558-.36 3.571 3.571 0 0 0-3.516 3A4.918 4.918 0 0 0 0 14.796a4.918 4.918 0 0 0 4.92 4.914 4.93 4.93 0 0 0 .617-.045h14.42c2.305-.272 4.041-2.258 4.043-4.589v-.009a4.594 4.594 0 0 0-3.727-4.508 6.51 6.51 0 0 0-6.511-6.27z"/>
            </svg>
            <span style="font-weight: 500;">SpartanHost</span>
        </a>
    
    </div>
    
    <style>
        /* 模拟 Apple 官网的悬停效果 */
        .footer-credits a:hover {
            opacity: 0.7;
        }
    </style>

    说明:

    1. 矢量清晰度:使用内联 SVG 替代 <img>,在 4K 或移动端 Retinia 屏幕上永远保持锐利。
    2. 响应速度:由于 SVG 直接写在 HTML 中,减少了三次网络图片请求,页面加载会更快。
    3. SVG图标:引用simpleicons图标库,开源且免费。

    现在,这款blog的布局、排版都是由我自主设计,风格上参考apple。哎,谁让apple的审美如此时尚呢。