先配置好参数
1 | git config --global http.lowSpeedLimit 0 |
确定配置参数
1 | git config --global user.email "xx@qq.com" |
未确认配置参数
1 |
|
1 | git config --global http.lowSpeedLimit 0 |
1 | git config --global user.email "xx@qq.com" |
1 |
|
(ALL-AI)破局
Welcome to Hexo! This is your very first post. Check documentation for more
info. If you get any problems when using Hexo, you can find the answer
in troubleshooting or you can ask me
on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment
在 MongoDB 中,没有直接的 plain复制 rename database 命令
copydatabase()已过期
copydatabase()已过期
copydatabase()已过期
mongodump和plain复制mongorestore(适合大型数据库)1 | # 1. 导出旧数据库 |
mongosh的聚合管道(MongoDB 4.2+)1 | // 遍历所有集合并复制 |
| 项目 | 说明 |
|---|---|
| 索引 | 复制后需要重新创建索引 |
| 用户权限 | 数据库用户不会自动复制,需手动创建 |
| 磁盘空间 | 确保有足够空间存储两份数据 |
| 生产环境 | 建议在维护窗口操作,或先备份 |
1 | // 查看所有数据库 |
**推荐在生产环境使用 plain复制 mongodump/mongorestore**,更加稳定可靠,且可以验证数据完整性。
这是一个涉及数据库运维的操作,需要谨慎处理。
MongoDB 集群配置主要存储在 Config Servers 中:
config): 包含分片集群的元数据1 | # 1. 停止所有 mongos 路由进程 |
1 | // 连接到 mongos |
1 | // 连接到副本集成员 |
1 | // 初始化新的 Config Server 副本集 |
1 | # 启动 mongos,指向新的 config server |
1 | // 连接到 mongos 添加分片 |
| 操作 | 风险等级 | 说明 |
|---|---|---|
| 删除 Config Server 数据 | 🔴 极高 | 会丢失所有分片元数据 |
| 强制 rs.reconfig | 🟡 中等 | 可能导致脑裂 |
| removeShard | 🟢 较低 | 数据会自动迁移 |
| 停止 mongos | 🟢 低 | 仅影响路由,不丢数据 |
1 | # 操作前务必备份 |
1 | // 检查 Config Server 状态 |
⚠️ 重要提醒:
perfmon.msc(性能监视器)定位 Windows CPU 问题,核心是通过添加关键计数器实时监控 / 日志分析,先判断 CPU
瓶颈类型,再定位到进程 / 线程,最后结合 JDK 工具深挖 Java 问题,以下是精准可落地的完整流程
这是判断 CPU 瓶颈的核心步骤,优先添加以下计数器,覆盖整体、用户 / 内核、进程、线程与中断维度:
| 计数器路径 | 作用 | 正常阈值 | 异常判断 |
|---|---|---|---|
| \Processor(*)% Processor Time | 整体 CPU 使用率(* 含所有核心,_Total 为总和) | < 70% | 持续 > 80% 为瓶颈,>90% 严重 |
| \Processor(*)% User Time | 用户态 CPU(如 Java 应用) | < 50% | 持续 > 80% 多为应用代码问题 |
| \Processor(*)% Privileged Time | 内核态 CPU(如驱动、系统调用) | < 30% | 持续 > 50% 多为驱动 / 系统服务问题 |
| \Process(*)% Processor Time | 单个进程 CPU 占用(筛选 java.exe/javaw.exe) | — | 占比高的进程优先排查 |
| \Thread(*)% Processor Time | 单个线程 CPU 占用(需指定进程 PID) | — | 定位进程内高 CPU 线程 |
| \System\Processor Queue Length | CPU 等待队列长度 | 每核心 < 2 | 持续 > 2 且 CPU 高,说明调度拥堵 |
| \Processor(*)% Interrupt Time | 中断占用时间 | < 5% | 持续 > 10% 多为硬件 / 驱动问题 |
thread -n 5 指定进程PID查看
1 | "flow-execute290488" Id=930149 cpuUsage=46.42% deltaTime=93ms time=31828ms RUNNABLE |
tail -f /jenkins/apache-tomcat-10.1.50/logs/catalina.out -n500这个密码 看起来是明文,而其他配置都是加密格式({AQAAABAAAA…})!
根本问题:这个明文密码可能包含不可见字符,或者在保存时被错误解析,导致产生了 0x00 空字符。
1 | 05-Feb-2026 14:42:19.252 警告 [Handling POST /jenkins/manage/configSubmit from 192.168.0.75 : http-nio-8080-exec-1] hudson.model.Descriptor.save Failed to save /jenkins/jenkins_home/jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml |
1 | java.io.IOException: java.lang.RuntimeException: Failed to serialize jenkins.plugins.publish_over_ssh.descriptor.BapSshPublisherPluginDescriptor#hostConfigurations for class jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin$Descriptor |
Caused by: com.thoughtworks.xstream.io.StreamException: Invalid character 0x0 in XML stream
Invalid character 0x0 表示 SSH 配置的代理密码字段 (proxyPassword) 包含空字符(NULL character),这是 XML 不允许的字符!
这不是权限问题,而是 数据污染问题!
错误链:
Jenkins 尝试保存 Publish Over SSH 配置
序列化 BapSshHostConfiguration#proxyPassword 字段时失败
密码中包含 0x0(空字符),XML 写入器拒绝写入
导致整个配置文件无法保存
可能原因:
之前配置的代理密码包含特殊字符或空字符
配置文件损坏,密码字段被污染
从其他环境复制配置时编码问题
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027
这就是问题根源!
1 | ps -ef | grep jenkins |
问题分析
UMASK=0027 是 Tomcat 的安全机制,它会:
覆盖 root 用户的默认 umask(通常是 0022)
强制新创建文件的权限为 640(即 -rw-r—–)
移除其他用户的写权限
虽然进程是 root,但 Jenkins 在写入配置文件时,Tomcat 的安全监听器会强制应用这个 umask,导致:
文件权限被限制为 640
Jenkins 无法再次写入(因为实际运行中 Jenkins 会检查并尝试重写)
1 | # 检查文件是否被其他进程占用 |
1 | sudo cat /jenkins/jenkins_home/jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml | grep -A5 "jenkins(prod-online)" |
1 | ls -lh *sh* |
1 | # 找到 Tomcat 的 setenv.sh(如果没有则创建) |
1 | # 2. 启动临时容器,不加载任何认证 |
1 | // 查看所有数据库 |
1 | # 3. 重新启动(相当于全新实例,但数据文件还在,需要修复) |
计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 安全
3. Administrator账户是否被禁用
1 | Win+R → lusrmgr.msc → 用户 → Administrator → 取消勾选"账户已禁用" |
4. 远程桌面服务的安全层设置
1 | Win+R → gpedit.msc |
检查这两项:
5. 防火墙是否放行
1 | 控制面板 → Windows Defender 防火墙 → 允许应用通过防火墙 |
6. 最粗暴测试:先关掉NLA
1 | gpedit.msc → 计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 安全 |
重启后再试。如果能连,说明是NLA凭据问题;如果连不上,是网络或防火墙问题。
想让“重启后远程直接能连”,就得让系统在开机后自动完成一次交互式登录,把会话跑起来。做法有两种:
注册表手动写 AutoAdminLogon(备用方案)
Win+R → regedit
定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
右侧新建/修改以下键值(都是 REG_SZ):
1 | AutoAdminLogon = 1 |
重启即可。
安全提醒
这是 Windows 11 的默认安全机制:
如果本地还没“真正”用密码登录过一次,系统里就没有缓存可供 NLA(网络级身份验证)使用的凭据,远程桌面就会直接拒绝连接,表现为“必须先在本机输完密码,远程才能连”。
为什么会这样
很多人第一次激活系统用的是 Microsoft 账号,但随后只设了 PIN 或 Windows Hello 刷脸/指纹。
PIN/Hello 只能解锁“已登录的本地会话”,不能当作 NLA 的凭据;而 Microsoft 账号的密码又从未在本地输入过,所以缓存里找不到有效凭据。
远程桌面服务启动时,NLA 阶段就要求出示“用户名+密码”,本地没有缓存只能失败,于是出现“必须本地先登录一次”的现象
解决思路(任选其一,推荐前两种)
本地用“账号密码”重新登录一次 a. 先锁屏 Win+L → 登录选项 → 选“密码”并输入 Microsoft 账号密码。 b.
成功后该凭据会被缓存,今后无需再本地登录即可远程 。
干脆新建一个本地管理员,专门做远程
1 | powershell |
然后在“设置 → 系统 → 远程桌面 → 远程桌面用户”里把 rdpuser 加进去。以后远程就用这个本地账户即可
关闭“仅允许 Windows Hello 登录” 设置 → 账户 → 登录选项 → 关闭“为提高安全性,仅允许 Windows Hello 登录 Microsoft
账号”。这样你就能在锁屏界面直接选“密码”,完成一次缓存 。
组策略放行“空密码”(仅家庭版不可用)
彻底关掉 NLA(降低安全性)
一句话总结
“先本地输一次密码”只是为了让 Windows 把真正的账号密码缓存下来;只要凭据存在,远程桌面就能在 NLA 阶段完成验证,之后再也不需要本地先登录。按上面
1 或 2 操作即可根治。
可以,直接把“Administrator”设为远程桌面用户即可,不需要再新建一个 rdpuser。
步骤如下(Win11 专业版/企业版):
先在本机用 Administrator 的「密码」登录一次
‑ 锁屏 → 登录选项 → 选「密码」并输入 Administrator 的密码,让系统把凭据缓存下来;这是解决“必须本地先登录”的关键。
把 Administrator 加入「远程桌面用户」组
Win+X → 终端(管理员) →
1 | net localgroup "Remote Desktop Users" administrator /add |
确认远程桌面已开启
设置 → 系统 → 远程桌面 → 打开「启用远程桌面」。
客户端连接时
用户名填 .\Administrator(或计算机名\Administrator),再输入密码即可直接远程,无需再本地先登录。
注意
如果系统用的是 Microsoft 在线账号,密码要输入「Microsoft 账号密码」而不是 PIN/Hello。
出于安全考虑,建议给 Administrator 设一个强密码,并在路由器或防火墙里限制可访问 3389 的 IP 范围
编辑/etc/hostname,服务器主机名 ubuntu
1 | vi /etc/hostname |
创建证书生成脚本 docker-cert.sh,放置/script目录
1 | sudo mkdir -p /script /data/cert/docker |
docker-cert.sh添加内容
1 |
|
执行 docker-cert.sh 脚本,生成证书放置 /data/cert/docker 目录中
1 | # ubuntu是服务器的主机名 |
按照提示输入相关信息,密码一致就行,其他信息可留空,等脚本指定完成之后,可在 /data/cert/docker 目录查看到生成的证书。
你给的 .key 文件是 RSA 加密私钥(文件头里能看到 —–BEGIN RSA PRIVATE KEY—– 或 Proc-Type: 4,ENCRYPTED),启动时 dockerd
要求你输入密码,但它跑在 systemd 里没人交互,于是读密钥失败 → TLS 配置无效 → dockerd 直接退出。
一句话结论
私钥被加密了,Docker 不会解密,必须换成“无密码”的私钥。
如果私钥仍带密码,先按前面说的去密码:
1 | sudo openssl rsa -in server-key.pem -out server-key-clear.pem |
OpenSSL 报错写得很清楚:
1 | bad ip address … value=ubuntu |
你在 extfile.cnf 里把 主机名(ubuntu)直接写进了 IP: 字段,而 IP: 后面必须是纯 IPv4/IPv6 地址,不能是字符串域名或主机名。
改成 DNS:ubuntu 或者干脆去掉域名,只保留合法 IP 即可。
修正扩展文件
1 | cat > extfile.cnf <<EOF |
如果你只想让任何地址都能连,也可以最简写:
1 | echo "subjectAltName = IP:0.0.0.0" > extfile.cnf |
重新签发
1 | openssl x509 -req -in server.csr \ |
验证
1 | openssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name" |
应看到:
1 | X509v3 Subject Alternative Name: |
不再报错即可。

1 | sudo cat /usr/lib/systemd/system/docker.service |
在ExecStart属性后追加
1 | --tlsverify --tlscacert=/data/cert/docker/ca.pem \ |
1 | --tlsverify --tlscacert=/data/cert/docker/ca.pem --tlscert=/data/cert/docker/server-cert.pem --tlskey=/data/cert/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock |

重新加载docker配置后重启
1 | sudo systemctl daemon-reload |
查看2376端口是否启动
1 | netstat -nltp | grep 2376 |

本地连接测试Docker API是否可用
1 | curl https://ubuntu:2376/info |
1 | curl https://ubuntu:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem |
将客户端所需的ca.pem、cert.pem、key.pem3个密钥文件从服务器下载到本地

IDEA连接Docker配置修改

pom.xml
1 |
|
只要 任何域名 都报 Temporary failure in name resolution,就是 本机 DNS 解析链彻底断了,与具体域名无关。
Ubuntu 20.04+ 默认走 systemd-resolved,90 % 是它没跑 / 配置丢失 / 上游 DNS 无响应。
按下面「4 句命令 → 1 次验证」一次性修好即可:
1 | systemctl is-active systemd-resolved || sudo systemctl enable --now systemd-resolved |
1 | sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf |
确保文件第一行是
1 | nameserver 127.0.0.53 |
1 | sudo mkdir -p /etc/systemd/resolved.conf.d |
1 | systemd-resolve google.com && ping -c3 google.com |
能解析、能 ping 通就表示修复完成,再去跑你的证书脚本即可。