知识库
- AI辅助编程
- 科学上网
- 免费申请ssl证书
- VUE前端缓存不刷新问题
- 代码规范插件
- git使用指南
- centos 配置telnet登陆
- ansible使用
- openssh升级
- 手工编译qt6.7.1 WebEngine
- ansible 一键修改服务器密码脚本
- qt集成cef(Chromium Embedded Framework) 实现自己的浏览器
- docker centos 支持中文
- busybox&&docker镜像支持systemd
- 微服务开发中的一些小工具&&小技巧
- 将部署于k8s中的redis公布出来
- 不重新打包修改nginx-web镜像写死的API地址
- 在无GUI界面的Linux服务器上执行jmeter
- 常用ai语音配音
- npm和yarn
- hbuilder项目转vue项目&&jenkins uniapp
AI辅助编程
索引
- AI启程
- AI之初体验(java),持续更新中
- AI之初体验(前端),持续更新中
step1 先决条件,科学上网,插件选择
经过试用,阿里的通义灵码和github copilot 是当前效果比较好的两个插件。阿里的通义灵码不需要科学上网,copilot需要科学上网。
科学上网请参考,https://iovhm.com/book/books/cee63/page/9872e。
step2 安装插件
idea(java方向)
截止至2024年2月28日,github Copilot 暂时不支持idea 内联聊天,但是可以支持代码生成。需要idea2023版本以上。
要获得github Copilot的体验权限,请向直属项目经理申请
不建议同时安装通义灵码和Copilot,可能产生冲突
- 安装插件
依次点击 file -> settings - > plugins 搜索 tongyi 和 github copilot 进行安装
- github copilot 插件安装
- 通义灵码插件安装
- 登录账号(github copilot)
需要用到您的个人github账号,请自行至github注册,请使用企业邮箱注册,并将用户名设置为姓名拼音,如果用户名被占用,可以加上后缀vp ,例如 youname-vp,要开通github copilot使用权限,请向直属项目经理申请
- 登录账号(通义灵码)
需要用到您的个人阿里云账号,请自行至阿里云注册
- idea科学设置(非必须)
github 可能时不时抽风,需要对IDEA进行设置。依次点击 file > settings > Appearance & Behavior > System settings > HTTP Proxy ,填入你的科学上网设置
- 再次确认插件是否生效
对插件进行设置和开启/关闭一些功能
vscode(前端方向)
点击左侧扩展图标,搜索tongyi和 github copilot
- github copilot 插件安装
- 通义灵码插件安装
- 登录账号(github copilot)
插件安装完成后,会在左侧多出对应的图标,点击相关图标既可使用对应的功能。
- 登录账号(通义灵码)
插件安装完成后,会在左侧多出对应的图标,点击相关图标既可使用对应的功能。
直接使用网页版chatgpt
网址:https://chat.openai.com/,需要魔法科学上网,openai需要登录,请自行注册。请使用gmail,hotmail邮箱注册,尽量不要使用国内的邮箱,以免被封
科学上网
参考网站
-
github:https://github.com/shadowsocks/go-shadowsocks2?tab=readme-ov-file
-
官方帮助:https://pkg.go.dev/github.com/shadowsocks/go-shadowsocks2#readme-install
-
安装
找一台海外linux服务器,推荐使用阿里云的轻应用服务器,节点选香港或者新加坡
- 安装服务器端
# 服务器端下载
wget http://qq829.cn/uploads/shadowsocks2/shadowsocks2-linux
cp ./shadowsocks2-linux /usr/local/bin
chmod 777 /usr/local/bin/shadowsocks2-linux
- 编写服务配置文件
# vi /usr/lib/systemd/system/shadowsocks2.service
[Unit]
Description=shadowsocks2
After=network.target
Wants=network-online.target
[Service]
Restart=always
Type=simple
ExecStart=/usr/local/bin/shadowsocks2-linux -s 'ss://aes-256-gcm:<password>@:8080' -verbose
# 工作于client模式
# ExecStart=/usr/local/bin/shadowsocks2-linux -c 'ss://aes-256-gcm:<password>@<server_ip>:8080' -socks :1080 -verbose
[Install]
WantedBy=multi-user.target
-
客户端配置
- 客户端下载
windows 客户端下载: https://qq829.cn/uploads/shadowsocks2/shadowsocks-4.4.1.0.zip
解压缩后,双击小火箭图标,会在任务栏出现小图标,右键任务栏小图标,填入配置信息
- 填入服务器配置
- 浏览器插件下载
https://qq829.cn/uploads/shadowsocks2/extension_2_5_21_0.crx
- 安装浏览器扩展
浏览器地址输入 chrome://extensions/ 或者找到扩展工具设置,将 extension_2_5_21_0.crx 拖到窗口进行安装。
- 让扩展程序显示在地址栏
- 设置浏览器扩展
- 代理协议:SOCKS5
- 代理服务器: 127.0.0.1
- 代理端口:1080 ,既第一步中,配置的本地监听端口
- 设置不代理地址列表,国内地址不经过代理
填入以下地址,选择右边的应用选项保存
*.baidu.com
*.jd.com
*.taobao.com
*.zhihu.com
*.qq.com
*.cn
*.huaweicloud.com
*.alipay.com
*.aliyun.com
*.alicdn.com
*.csdn.net
*.csdn.com
*.douyin.com
::1
127.0.0.1
localhost
- 选择浏览器使用代理方式连接到网络
-
注意事项
系统代理选择禁用,不要选择PAC模式和全局模式,此2个模式会将所有的网络流量全部走代理,浪费代理资源。比较科学的办法是将插件安装在edge浏览器上用于科学上网;正常访问使用chrome浏览器,便捷不用切来切去。
linux使用方法
./shadowsocks2-linux -c 'ss://aes-256-gcm:<password>@<server_ip>:8080' -socks :1080 -verbose
# 设置环境变量
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
export all_proxy=socks5://127.0.0.1:1080
# 取消设置环境变量
unset http_proxy
unset https_proxy
unset all_proxy
docker使用代理上网
-
参见docker使用代理上网:https://iovhm.com/book/books/k8s/page/docker
-
翻墙违法
- 仅限于工作需要的 google、github 等
- 请不要通过代理搜索、查看、传阅敏感话题
- 请不要通过代理观看、下载视频
- 请不要通过代理浏览非法网站、娱乐网站、社交网站等
- 没有访问外网需要时,请选择直连或者系统代理,节约资源
免费申请ssl证书
注册账号
在网站 https://zerossl.com/ 注册账号,按下图步骤获取acme key , 将EAB KID 和 EAB HMAC key记录下来
安装和使用
参考网址:https://github.com/acmesh-official/acme.sh
# 安装
wget -O - https://get.acme.sh | sh
# 增加别名(非必要)
alias acme.sh=~/.acme.sh/acme.sh
# 进入到执行目录(非必要)
cd /root/.acme.sh
# 2023-1-1 更新,更换了默认证书提供商为zerossl
# https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
# 绑定和配置账号,填入你前面记录的EAB KID和EAB HMAC key
./acme.sh --register-account --server zerossl \
--eab-kid <your kid> \
--eab-hmac-key <your key>
# 配置默认证书提供商
./acme.sh --set-default-ca --server zerossl
# 第一步
./acme.sh --debug --issue --dns -d *.saas.vppark.cn --yes-I-know-dns-manual-mode-enough-go-ahead-please --server zerossl
# 增加DNS txt验证记录
# 申请证书,多了一个参数 --renew
./acme.sh --debug --issue --renew --dns -d *.saas.vppark.cn --yes-I-know-dns-manual-mode-enough-go-ahead-please --server zerossl
# 查看本地证书
./acme.sh --list
# 更新所有的证书
acme.sh --renew-all --server zerossl
# 安装证书, 主要是两个文件,私匙(key)和证书(cer)
key: *.saas.vppark.cn.key
cer: fullchain.cer
# 查看证书过期日期
openssl x509 -enddate -noout -in fullchain.cer
openssl x509 -text -noout -in fullchain.cer
# 如果后续进行更新,使用的是zerossl,需要到zerossl网站下载更新的证书。并且将两个证书进行合并,否则会提示证书链不完整。
# 升级软件
acme.sh --upgrade
使用 阿里云 dnsapi自定添加域名认证
更多其他域名提供商api使用方法:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
使用阿里云dns api时,需要先获取到Ali_Key和Ali_Secret,获取方法为
# 参考网站:https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_ali
# 设置阿里云dns api需要的key和secret
export Ali_Key="<key>"
export Ali_Secret="<secret>"
# 申请证书
./acme.sh --issue --dns dns_ali -d *.qq829.cn -d qq829.cn
# --dns dns_ali 使用阿里云dns api
# key保存于 /root/.acme.sh/account.conf
# 保存的key和secret被重命名为 SAVED_Ali_Key='<key>'和SAVED_Ali_Secret='<secret>'
# 如果你的dns提供商不支持acme api或者你没有权限管理主域名,可以使用dns cname模式
# 在主域名上增加cname记录
# acme需要验证的域名永远是 _acme-challenge.xxx.yyy.com
# 在你的主域名dns解析上面增加 _acme-challenge.xxx.yyy.com => _acme-challenge.qq829.cn 类似的记录
# 为了便于
# 使用dns别名自动验证域名并申请证书
./acme.sh --issue --dns dns_ali -d vppark.cn -d *.vppark.cn -d *.saas.vppark.cn -d *.ihg.vppark.cn -d *.devops.vppark.cn --challenge-alias acme-vppark-cn.qq829.cn --force
# --challenge-alias acme-vppark-cn.qq829.cn 指定dns别名,acme 将自动在别名域名上添加相关认证记录,使认证域名记录变成 _acme-challenge.acme-vppark-cn.qq829.cn
# 既主域名设置的别名于别名记录有一定的匹配关系
# 例如,主域名的别名设置应该是 _acme-challenge.saas.vppark.cn => _acme-challenge.acme-vppark-cn.qq829.cn
# 而不是 _acme-challenge.saas.vppark.cn => acme-vppark-cn.qq829.cn
# 而acme.sh命令行的参数 --challenge-alias 是 acme-vppark-cn.qq829.cn,既acme会自动加上 _acme-challenge 使之变成 _acme-challenge.acme-vppark-cn.qq829.cn 而与主域名对应上
# 查看证书过期日期
openssl x509 -enddate -noout -in fullchain.cer
openssl x509 -text -noout -in fullchain.cer
VUE前端缓存不刷新问题
nginx配置增加
location / {
# 不缓存首页,解决VUE单页面发版后不生效
add_header Cache-Control "no-cache no-store must-revalidate proxy-revalidate,max-age=0";
add_header Last-Modified $date_gmt;
# 这个有顺序,需要加在最后面
etag off;
}
index.html增加
<meta http-equiv="Cache-Control" content="no-store" />
增加一个新的入口页面,并在APP或者微信公众号设置入口为这个新的页面,例如取名为root.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>数字营业厅</title>
<script type="text/javascript">
function generateRandomChar() {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
return chars[Math.floor(Math.random() * chars.length)];
}
function generateRandomString() {
const length = 3;
let str = '';
for (let i = 0; i < length; i++) {
str += generateRandomChar();
}
return str;
}
var rnd = generateRandomString();
// 需要根据前端项目是URL模式还是history模式自行修改
location.assign(`./?${rnd}`);
</script>
</head>
<body>
</body>
</html>
代码规范插件
- 进入idea设置
- 查找代码规范插件alibaba java coding guidelines的最近版本,并安装
使用参考
- 1 触发扫描,可以通过右键菜单、Toolbar按钮、快捷键三种方式手动触发代码检测。同时结果面板中可以对部分实现了QuickFix功能的规则进行快速修复。
- 2扫描范围,在左侧的Project目录树种点击右键,可以触发对整个工程或者选择的某个目录、文件进行检测。
- 3扫描结果 检测结果直接使用IDEA Run Inspection By Name功能的结果界面,插件的检测结果分级为Blocker、Critical、Major。默认按等级分组,方便统计每个级别错误的数量
默认情况我们在结果面板需要双击具体违规项才能打开对应的源文件,开启Autoscroll To Source选项,单击面板中的文件名、或者是具体的违规项的时候IDEA会自动打开对应的源文件。
必须处理bug Blocker:阻断块。最严重的错误类型; Critical:严重的错误类型; Major:重要的错误类型; 前两级别是必须要处理掉的。
git使用指南
# Git global setup
git config --global user.name "你的名字"
git config --global user.email "your email"
# Create a new repository
git clone http://10.0.0.43:10080/tjxt/htc-dashboard.git
cd htc-dashboard
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
# Existing folder
cd existing_folder
git init
git remote add origin http://10.0.0.43:10080/tjxt/htc-dashboard.git
git add .
git commit -m "Initial commit"
git push -u origin master
# Existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin http://10.0.0.43:10080/tjxt/htc-dashboard.git
git push -u origin --all
git push -u origin --tags
# 增加文件
git add .
# 提交更改
git commit -m [comment]
# 推送到远程
git push origin loacl:remote
# 获取
git pull origin branch-name
# 修改文件
git status
# 删除文件
git rm
# 移动文件
git mv
# 列出本地分之
git branch
# 列出远程分之
git branch -r
# 列出所有分之
git branch -a
# 新建分支
git branch [branch-name]
# 切换分之
git checkout [branch-name]
# 从指定分之合并
git merge [branch-name]
# 删除分之
git branch -d [branch-name]
# 删除远程分之
git push origin --delete branch-name
# 递归获取
git fetch [remote]
centos 配置telnet登陆
相关软件安装
yum install telnet telnet-server xinetd
修改 pam 模块 telnet 权限
将etc/pam.d/remote中的auth required pam_securetty.so注释掉
修改 pam 模块 telnet 权限
# 修改前
[root@localhost ~]# grep 'pam_securetty.so' /etc/pam.d/remote
auth required pam_securetty.so
# 修改后 -- 注释掉
[root@localhost ~]# grep 'pam_securetty.so' /etc/pam.d/remote
# auth required pam_securetty.so
新建配置文件
[root@localhost ~]# cat << EOF > /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}
EOF
启动服务
systemctl start telnet.socket
systemctl start xinetd
ansible使用
-
安装
# 安装扩展源
yum install epel-release
yum install ansible
-
编写配置文件
# 编辑配置文件
vi /etc/ansible/hosts
# 加入主机
[groupName]
192.168.0.10
10.vpclub.io
192.168.0.11 ansible_user=<name>,ansible_password=<passwrd>
# 支持的参数有
# ansible_port 端口
# ansible_user 用户名
# ansible_password 密码
-
配置免密登录
如果不想在ansible填写用户密码,可以配置免密登录
# 生产RSA密匙对
ssh-keygen -t rsa
# 使用命令将密公钥复制到目标主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.2
-
使用命令
ansible all -m <模块名> -a "参数"
ansible groupName -m <模块名> -a "参数"
ansible 10.vpclub.io -m <模块名> -a "参数"
openssh升级
重要,使用新的客户端成功连接前,千万不要断开ssh连接,否则就接不上了;确定升级完成、新的客户端可以连接后才断开,请确保电脑连接了电源,网络畅通
openssh升级
openssh 源代码发布网站:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/
# 查看sshd版本
ssh -V
sshd -V
# 下载最新的ssh源代码
# https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
# 解压源代码
tar -xvzf openssh-9.7p1.tar.gz
# 安装GCC编译器
yum install gcc
# 安装zlib依赖
yum install zlib-devel
# 安装pam依赖
yum install pam-devel
# 备份原配置文件
cp -a /etc/ssh/ /etc/ssh_bak/
# 配置与编译
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib
此时还可能提示openssl不存在、版本太低,如果本机没有openssl,则参见openssl升级
# 查看openssl版本
openssl version
# 查看openssl位置
which openssl
查看openssl库文件位置
ldd /usr/bin/openssl
# 指定openssh需要使用的openssl库文件位置
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-ssl-dir=/usr/local/openssl/
# 编译 并 安装
make && make install
# 验证ssh版本
ssh -V
sshd -V
# 验证配置文件正确性
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
# 修改配置文件权限,如果验证配置文件正确性语句出错的话
chmod 0600 /etc/ssh/ssh_host_rsa_key
chmod 0600 /etc/ssh/ssh_host_ecdsa_key
chmod 0600 /etc/ssh/ssh_host_ed25519_key
# 修改配置文件,如果验证配置文件正确性语句出错的话
vi /etc/ssh/sshd_config
# 修个sshd_config配置文件,启用以下两个配置
UsePAM yes
PermitRootLogin yes
# 修个sshd_config配置文件,禁用以下四个配置
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no
# 重启sshd服务,
systemctl restart sshd
# 此时可能重启失败,使用journalctl -xe 查看错误信息,一般是提示找不到 libcrypto.so.3 库
# 将库建立软连接到共享库目录
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
# 重启sshd服务卡主,修改服务通知类型为simple
vi /usr/lib/systemd/system/sshd.service
# Type=simple
systemctl daemon-reload
# 重启sshd服务
systemctl restart sshd
# 禁用ssh客户端
vi /etc/ssh/ssh_config
升级完成后,旧版的xshell提示,找不到匹配的host key算法 , 这是旧版xhsell的bug,需要升级xshell
直接在服务器使用ssh命令连接到其他机器报错:/etc/ssh/ssh_config line 59: Unsupported option "gssapiauthentication"
# 修改配置文件,是ssh,不是sshd
vi /etc/ssh/ssh_config
# 注释本行
# GSSAPIAuthentication yes
升级openssl
openssl 源代码网站:https://www.openssl.org/source/
# 下载源代码
wget https://www.openssl.org/source/openssl-3.3.1.tar.gz
# 解压缩
tar -xvzf openssl-3.3.1.tar.gz
# 安装依赖
yum install perl-IPC-Cmd
# 配置
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
# --prefix=/usr/local/openssl 安装目录
# --openssldir=/usr/local/openssl 配置目录
# 编译
make
# 测试,非必要,测试失败不意味着编译安装会失败
make test
# 安装,openssl将被安装到 /usr/local/openssl
make install
# 验证版本
openssl version
openssl将被安装到 /usr/local/openssl 。可能提示找不到 libcrypto.so.3 库,需要建立共享库搜寻路径
# 将库建立软连接到共享库目录
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
手工编译qt6.7.1 WebEngine
QWebEngine默认不支持html video播放
QWebEngine默认不支持html video播放,原因是默认编译没有包括视频解码部分
源代码编译
# 下载源代码并解压缩
# 下载地址:https://download.qt.io/official_releases/qt/6.7/6.7.1/single/qt-everywhere-src-6.7.1.zip
# 安装vistudi 2019或者更高
# 安装qt creatro
# 下载几个需要依赖的文件,在qt5安装文件有,将这个路径加入到path
# D:\Qt\Qt5.14.2\5.14.2\Src\gnuwin32\bin
# 或者使用我从qt5目录复制出来的
# https://iovhm.com/book/attachments/7
# 找到 qtcreatro 安装后自带的 Qt 6.7.1 (MSVC 2019 64-bit) 快捷方式,或者使用如下命令命令行启动命令窗口
C:\Windows\System32\cmd.exe /A /Q /K D:\Qt\Qt6.7.1\6.7.1\msvc2019_64\bin\qtenv2.bat
# 加载vc编译器,具体需要看你的visual studio位置
"C:\Program Files\Microsoft Visual Studio\2022\community\VC\Auxiliary\Build\vcvarsall.bat" amd64
# 设置环境变量
Set PATH=D:\Qt\Qt6.7.1\Tools\mingw1120_64\bin;%PATH%
# 配置编译选项
configure.bat -prefix d:/qt6.7.1 -debug-and-release -webengine-proprietary-codecs -opensource -confirm-license -platform win32-msvc -nomake examples -nomake tests
# 编译
cmake --build . --parallel
# 安装
cmake --install .
ansible 一键修改服务器密码脚本
脚本安装
- 执行安装脚本setup.sh 安装ansible和yq命令
#!/bin/bash
# 安装ansible
yum install ansible-2.9.27-1.el7.noarch.rpm -y
# 安装yq
cp -a yq /usr/local/bin/
注: yq是解析yaml工具
- 配置inithost,第一次连接服务器的用户名和密码 例:
hosts:
#192.168.40.36:
# ansible_user: root
# ansible_password: 123456
#192.168.40.37:
# ansible_user: root
# ansible_password: 123456
- 配置ansible hosts文件 例:
#[test]
#192.168.40.36
#
#[test1]
#192.168.40.37
4.生成初始连接凭据
bash ./inithost.sh
注:初始文件生成后,可以删除inithost以保证安全
常见操作
- 修改单个服务器密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=root password=123456" changepasswd.yaml
- 修改ansible组密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=test user=root password=123456" changepasswd.yaml
- 修改hosts文件里所有服务器的密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=all user=root password=123456" changepasswd.yaml
- 修改其他用户密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=test password=123456" changepasswd.yaml
- 提示: 在执行上述操作前,需要确保服务器上已存在对应的用户。
常见的问题
如果遇到以下错误信息:"Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
解决方法:先使用ssh连接目标主机,获取主机的key。
附录1: inithost.sh脚本
#!/bin/bash
# 获取从命令行传入的第一个参数作为vault_password
vault_password="3d$R7#X9"
# 创建connect目录,如果它还不存在
mkdir -p connect
# 读取主机名列表
hosts=$(yq e '.hosts | keys' inithost.yaml | sed 's/- //')
# 遍历每个主机名
for host in $hosts; do
# 检查主机名是否为空
if [ -z "$host" ]; then
continue
fi
# 删除引号,以便获取干净的主机名
host=${host//\"/}
# 从yaml文件中读取ansible_user和ansible_password
user=$(yq e .hosts.\"$host\".ansible_user inithost.yaml)
password=$(yq e .hosts.\"$host\".ansible_password inithost.yaml)
# 检查用户名和密码是否为空
if [ -z "$user" ] || [ -z "$password" ]; then
continue
fi
# 删除引号,以便获取干净的用户名和密码
user=${user//\"/}
password=${password//\"/}
# 创建新的yaml文件,文件名为IP地址,并写入ansible_user和ansible_password
# 新文件将在connect目录下创建
echo "ansible_user: $user" > connect/$host.yaml
echo "ansible_password: $password" >> connect/$host.yaml
# 创建秘密文件
echo "$vault_password" > .vault_pass
# 使用ansible vault对文件进行加密,使用传入的vault_password作为密码
echo $vault_password | ansible-vault encrypt connect/$host.yaml --vault-password-file=.vault_pass
# rm -fr .vault_pass
done
附录2:changepasswd.yaml的playbook
- hosts: "{{ target_hosts }}"
vars_files:
- "connect/{{ inventory_hostname }}.yaml"
tasks:
- name: debug
debug:
msg: "connect/{{ inventory_hostname }}.yaml"
- name: 修改服务器密码
user:
name: "{{ user }}"
password: "{{ password | password_hash('sha512') }}"
become: yes
become_user: "{{ ansible_user }}"
- name: 修改ansible连接root密码文件
local_action:
module: script
args: ansible_rootpasswd_change.sh connect/{{ inventory_hostname }}.yaml {{ password }}
when: user == 'root'
附录3 修改root密码的脚本
#!/bin/bash
# 定义你的 vault 密码
#vault_password=$1
# 定义 inventory_hostname
vault_file=$1
# 定义新的 ansible_password
new_ansible_password=$2
# 定义 vault 文件路径
#vault_file="${vault_file_path}"
# 创建一个临时文件
temp_file=$(mktemp)
# 使用 ansible-vault 解密 vault 文件并将内容写入临时文件
#echo $vault_password | ansible-vault decrypt $vault_file --output $temp_file
ansible-vault decrypt $vault_file --output $temp_file --vault-password-file=.vault_pass
# 修改 ansible_password
yq eval ".ansible_password = \"$new_ansible_password\"" $temp_file
# 使用 ansible-vault 重新加密临时文件并覆盖原来的 vault 文件
#echo $vault_password | ansible-vault encrypt $temp_file --output $vault_file
ansible-vault encrypt $temp_file --output $vault_file --vault-password-file=.vault_pass
# 删除临时文件
rm $temp_file
qt集成cef(Chromium Embedded Framework) 实现自己的浏览器
虽然QT自带的有WebEngine也是基于chrome的。简单使用没有问题,但是默认没有对视频播放的支持,虽然网上有很多关于编译QT源码以用于支持视频播放。但是耗时耗力,且不一定能成功,想要追随chrome内核更新相当麻烦
几经周折,发现有一款基于cef的包装也可以支持视频播放,在此记录一下
参考网址
- https://github.com/cefview/qcefview
- https://github.com/wodeguaiguai/cef-build-surport-for-mp3-mp4
从源代码编译
# 设置环境变量,指定QT套件目录
set QTDIR=D:\Qt\Qt6.7.12\6.7.1\msvc2019_64
# 克隆源代码
git clone --recursive -b v1.1.0 https://github.com/CefView/QCefView.git
# 加载VC编译器
"C:\Program Files\Microsoft Visual Studio\2022\community\VC\Auxiliary\Build\vcvarsall.bat" amd64
# 生成项目
generate-win-x86_64.bat
# 编译
cmake --build .build/windows.x86_64
# 替换热心网友修改过的支持视频播放的cef
# 替换到 QCefView\CefViewCore\dep 这里
# 重新执行
generate-win-x86_64.bat
cmake --build .build/windows.x86_64
在看看,播放器就支持视频播放了
在qt creator调试的时候的注意事项
需要把所有的依赖的dll拷贝到输出目录,使用环境变量设置依赖文件跑不起来
docker centos 支持中文
FROM centos:7
EXPOSE 8080
RUN yum install -y https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm && \
yum install -y nscd kde-l10n-Chinese && \
yum reinstall -y glibc-common && \
yum clean all
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
ENV LC_ALL zh_CN.utf8
ENV LANG zh_CN.utf8
ENV LANGUAGE zh_CN.utf8
COPY ./ffmpeg/linux/** /usr/local/bin/
COPY ./entrypoint.sh /root/entrypoint.sh
COPY ./target/srs-push-1.0-SNAPSHOT.jar /root/srs-push-1.0-SNAPSHOT.jar
WORKDIR /root
ENTRYPOINT ["/root/entrypoint.sh"]
busybox&&docker镜像支持systemd
k8s环境中,经常需要一个工具容器进行一些调试,特意打包了常用小工具。你可以可以使用下面的dockerfile制作自己的容器
镜像地址
harbor.iovhm.com/public/busybox:latest
Dockerfile
FROM harbor.iovhm.com/hub/centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && \
yum makecache && \
yum install -y which wget openvpn telnet && \
yum clean all && \
curl -o /usr/bin/systemctl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py && \
chmod +x /usr/bin/systemctl && \
true
COPY ./entrypoint.sh /root/entrypoint.sh
RUN chmod +x /root/entrypoint.sh
CMD [ "/root/entrypoint.sh" ]
WORKDIR /root
entrypoint.sh
#!/bin/bash
set -x
echo "busybox ..."
# 判断环境变量 OPENVPN 是否存在并且值为 1,决定是否开启 OpenVPN 客户端
if [ "${OPENVPN}" == "1" ]; then
echo "start openvpn-client ..."
/usr/sbin/openvpn --config /data/vpclub/ovpn_configuration_file.ovpn &
# 等待 OpenVPN 启动
sleep 10
else
echo "OPENVPN environment variable not set or not equal to 1. Skipping OpenVPN client setup."
fi
# 判断环境变量 IP_FORWARD 是否存在且值为 1,决定是否开启 IP 转发
if [ "${IP_FORWARD}" == "1" ]; then
echo "Enabling IP forwarding..."
echo 1 >/proc/sys/net/ipv4/ip_forward
echo "start ip_forward ..."
# 从文件读取 IP_FORWARD_RULES
if [ -f "/data/vpclub/IP_FORWARD_RULES.txt" ]; then
IP_FORWARD_RULES=$(cat /data/vpclub/IP_FORWARD_RULES.txt)
else
echo "IP_FORWARD_RULES file not found. Skipping batch IP forwarding setup."
continue
fi
# 批量设置 IP 转发规则
if [ -n "${IP_FORWARD_RULES}" ]; then
IFS=$'\n' read -r -d '' -a rules <<<"${IP_FORWARD_RULES}"
for rule in "${rules[@]}"; do
# 修改解析逻辑,支持新的格式
IFS=',' read -r SRC_IP_PORT DEST_IP_PORT DEST_PROTO <<<"$rule"
IFS=':' read -r SRC_IP SRC_PORT <<<"$SRC_IP_PORT"
IFS=':' read -r DEST_IP DEST_PORT <<<"$DEST_IP_PORT"
DEST_PROTO=${DEST_PROTO:-tcp} # 默认协议为tcp
# 添加PREROUTING规则
iptables -t nat -I PREROUTING ! -s ${DEST_IP}/32 -p ${DEST_PROTO} --dport ${SRC_PORT} -j DNAT --to ${DEST_IP}:${DEST_PORT}
# 添加POSTROUTING规则
iptables -t nat -I POSTROUTING -d ${DEST_IP}/32 -p ${DEST_PROTO} -j MASQUERADE
done
else
echo "No IP_FORWARD_RULES provided. Skipping batch IP forwarding setup."
fi
else
echo "IP_FORWARD environment variable not set or not equal to 1. Skipping IP forwarding setup."
fi
echo "success ..."
tail -f /dev/null
隐藏秘籍,内置了openvpn-client
version: "3"
services:
busybox:
image: harbor.iovhm.com/public/busybox:latest
container_name: busybox
network_mode: host # 注意一定要是host模式,因为他默认监听在容器内,并不能与主机直接通讯
privileged: true
restart: always
volumes:
- ./ovpn_configuration_file.ovpn:/data/vpclub/ovpn_configuration_file.ovpn
command: "/usr/sbin/openvpn --config /data/vpclub/ovpn_configuration_file.ovpn"
链接到集群内
增加两个环境变量
- 开启内置的VPN: OPENVPN=1
- 开启端口转发:IP_FORWARD=1
编写configmap
重要:两个配置的名称要对应上,因为启动脚本里面写死了
- 端口转发规则 IP_FORWARD_RULES.txt
格式为:SRC_IP:SRC_PORT,DST_IP:DST_PORT , 一行一个
0.0.0.0:6388,10.100.156.69:6379
0.0.0.0:5672,10.103.194.230:5672
0.0.0.0:15672,10.103.194.230:15672
其中的IP为服务发现的IP
- VPN客户端秘钥文件:ovpn_configuration_file.ovpn
可以到pritunl中下载后用记事本打开后粘贴进去
对configmap进行挂载,挂载路径为/data/vpclub
微服务开发中的一些小工具&&小技巧
稍等,我把配置改成生产上的地址
在微服务开发中,通常涉及多个服务、多个团队、异地团队一起合作开发。又因为频繁迭代,频繁发布版本,为了保证版本、代码、环境的一致性,通常使用容器化,既生产上的运行环境、配置信息应该与测试环境的保持完全一致。但是我们更多的时候会出现测试通过后,还要说:“稍等,我把配置改成生产上的地址”,一个新的的客户部署一套版本,也要“稍等,我把配置改成生产上的地址”,完全丧失了容器化的优势。
穷人的微服务开发环境
如果我们有钞能力,这个问题很好解决,每个研发人员都配置一台服务器,专门用于联调,全部使用标准端口,标准服务名称,每个项目组都配置三套环境。
在没有钞能力的情况下,只能借助不同的端口来区分服务,也正因为如此,团队协作、异地开发、新老项目同时维护,都就会出现配置文件、服务名、IP地址不一致的情况,例如生产上要求的是mysql:3306,redis:6379,测试和开发环境要求的是x.x.x.x:33306,x.x.x.x:63379,地区A的同事用的是内网地址,地区B的同事用的是映射后的地址,就导致反复修改配置文件、互相覆盖配置文件。发生产还要修改配置文件,破坏了测试结果的准确性。
在此背景下,强烈推荐使用服务发现,统一配置中心、环境变量,减少和降低测试通过后的版本还需要修改代码和配置文件的频率。
将端口转发为与生产一致的端口号
经常修改的配置文件主要集中在数据库、redis等方面,因为要区分端口,很多同事就把IP端口写死在配置文件,当要部署到生产,一个新的项目要部署时候,就需要回来改代码,这很显然是不够科学的。为了应对这一问题,应该将三个环境都用服务发现,在开发的时候,借助一些小工具和小技巧,将开发、测试、生产环境使用的服务名、端口统一起来。
- 使用有界面的端口转发PORTMAP小工具
小工具下载 https://qq829.cn/uploads/software/tools/portmap-1.6.zip
- 使用命令行(仅windows)
# 仅windows可用
# 增加一个端口转发
# netsh interface portproxy add v4tov4 listenport=<监听端口> listenaddress=<监听地址> connectport=<目标端口> connectaddress=<目标地址>
netsh interface portproxy add v4tov4 listenport=3306 listenaddress=0.0.0.0 connectport=33309 connectaddress=8.x.y.z
# 删除一个端口转发
# netsh interface portproxy delete v4tov4 listenport=<监听端口> listenaddress=<监听地址>
netsh interface portproxy delete v4tov4 listenport=3306 listenaddress=0.0.0.0
# 查看所有的端口转发规则
netsh interface portproxy show all
如上设置和命令,将原本需要修改配置文件的jdbc:mysql://mysql:33306/xxxxx,统一为使用环境变量的 jdbc:mysql://${mysql}:3306/xxxxx,保证了配置文件的一致性。
在IDEA中使用统一的环境变量设置
env文件可以迁入到代码仓库大家共享,idea设置本身并不会迁入到代码仓库,不会发生冲突
# .env文件
nacos_host=
nacos_port=
mysql=127.0.0.1
redis=127.0.0.1
hosts修改小工具
如果非常不凑巧,配置文件并没有使用环境变量占位符,可以修改hosts表来进行设置,但频繁的修改hosts文件,也挺麻烦,这里有个小工具,可以方便的管理hosts文件。当然了,如果你不嫌麻烦,也可以手工修改host文件
下载地址:https://www.easyhosts.cn/zh/
将部署于k8s中的redis公布出来
原则上中间件都应该在独立主机部署,但是因为没有钞能力,就将一些不重要的中间件也安装部署到了k8s中。但是在开发、测试环境中,也需要依赖redis服务,需要查看redis中存储的数据、数据格式定位问题。
虽然k8s有公布nodeport和hostport的方法,但是定位问题需要保留bug现场,如果直接重新发布服务为nodeport,服务重启后现场也随即消失;也因为管理需要,并不会把一系列的主机、端口都打开,仅会公布特定主机的特定端口(范围)。
docker-compose.yaml
version: "3"
services:
forward-redis-gzxfzd:
image: harbor.iovhm.com/hub/rancher/klipper-lb:v0.1.2
restart: always # 自动重启
container_name: forward-redis-gzxfzd
privileged: true # 特权提升
ports:
- 56300:6379
environment:
- SRC_PORT=6379
- DEST_PROTO=TCP
- DEST_PORT=6379
- DEST_IP=10.107.170.132
如上几个环境变量参数很好理解,主要是如何找到DEST_IP,既服务的IP。
方式一
随便找一台在k8s集群内的主机,在集群内的主机本身就可以和k8s的虚拟网络进行通讯,可以使用curl尝试调用某个服务或者pod的私有ip,此时应该可以得到正确返回,也可以尝试ping一下某个服务或者某个pod的私有ip,此时应该会有回应(前提是K8S设置的是ipvs模式,iptables模式不会有回应)
pod每次调度后,ip都会变,但是服务的ip不会变,除非你把服务删了重建的服务、集群重做了,服务ip基本上是不会变的。
- 1、通过命令行获取服务IP
kubectl get svc -n namespace_name
- 2、通过rancher界面获取服务IP
方式二
- 记住原服务的pod标签选择器
- 增加一个nodeport服务
- 填入对应的端口
- 在选择器中填入前面记下的pod标签选择器,确定后将生成一个新的服务发现,此时则可以在任意集群外的主机,访问集群内任意主机的此端口
不重新打包修改nginx-web镜像写死的API地址
由于各种原因前端的API地址被写死了,而临时需要修改地址,打包发布麻烦,不知道哪个版本的代码对应这个版本,可以这样做。
nginx.conf中写死的服务发现
- 方法一,使用主机别名,类似hosts功能
- 方法二,使用下面的字符串替换
页面中写死的API地址
- 编写一段API替换脚本和nginx启动脚本
注意第一句的#!/bin/bash , 根据镜像不同,可能是#!/bin/sh
#!/bin/bash
# 根据基础镜像的不同,可能是/bin/sh,而且这句要是第一句
# 如果环境变量存在则用环境变了,如果环境变量不存在,则使用默认值,注意前面的减号语法(-)
OLD_URL=${OLD_URL:-"https://park.wvpark.com:802/"}
NEW_URL=${NEW_URL:-"http://weipin.hmncloud.top/"}
# 文件名称很确定,直接替换
sed -i "s|${OLD_URL}|${NEW_URL}|g" /usr/share/nginx/html/assets/iframe-view-4c8b16ca.js
# 不管什么文件,直接替换
# grep -rl "ak=${OLD_AK}" /usr/share/nginx/html | xargs sed -i "s|ak=${OLD_AK}|ak=${NEW_AK}|g"
# 文件名称相对确定,查找替换
# SEARCH_DIR="/usr/share/nginx/html/assets"
# FILE_PREFIX="iframe-view*.js"
# for FILE in $(find "$SEARCH_DIR" -type f -name "${FILE_PREFIX}"); do
# # 使用 sed 进行替换操作,-i 选项表示直接编辑文件
# sed -i "s|${OLD_URL}|${NEW_URL}|g" "$FILE"
# # 打印已处理的文件名
# echo "Processed file: $FILE"
# done
# 启动nginx
nginx -g 'daemon off;'
- 将配置文件放入configmap并挂载或则直接挂载进容器,并设置挂载文件为777权限
docker和docker-compose挂载为777 请自行百度
- 将容器的启动命令设置为自己的启动脚本
在无GUI界面的Linux服务器上执行jmeter
准备工作
首先在有GUI的电脑,例如windows上将测试计划参数配置好,先使用一个并发运行一次,保证测试计划可以成功运行,将测试计划保存为jmx
在服务器上运行
jmeter是使用java编写的,需要安装jdk,将apache-jmeter-5.6.3.zip 复制到服务器并解压缩,将前面保存的jmx也上传到服务器,进入到 /apache-jmeter-5.6.3/bin 目录
# cd /apache-jmeter-5.6.3/bin
./jmeter -n -f -t /data/test.jmx -l /data/test.jtl -e -o /data/report
# -n 无GUI界面
# -t /data/test.jmx 测试计划文件
# -l /data/test.jtl 执行结果路径
# -e 测试完成后生成报告
# -o 测试报告生成路径
# -f 强制删除现有结果,默认情况是追加到已有结果,可能造成数据干扰
然后把测试报告打包下载回来查看,
tar -cvf report.tar ./report/
使用docker-compose运行,不推荐,但是可以快速验证,内置一个nginx,可以使用浏览器查看测试报告
version: "3"
services:
jmeter:
image: harbor.iovhm.com/hub/openjdk:17
container_name: jmeter
privileged: true
volumes:
- ./apache-jmeter-5.6.3:/apache-jmeter-5.6.3
- ./data:/data
command: "tail -f /dev/null"
jmeter-nginx:
image: harbor.iovhm.com/hub/nginx:1.21.3
container_name: jmeter-nginx
ports:
- "5500:80"
volumes:
- ./data:/usr/share/nginx/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
# 进入到容器
# docker exec -it jmeter /bin/bash
# 增加ll别名
# alias ll='ls -l --color=auto'
# 进入到jmeter的bin目录
# cd /apache-jmeter-5.6.3/bin
# 执行jmeter
# ./jmeter -n -f -t /data/test.jmx -l /data/test.jtl -e -o /data/report
- 开启nginx目录浏览
server {
listen 80;
#listen 443 ssl;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
autoindex on; # 开启目录浏览功能
autoindex_localtime on; # 可选,显示文件修改时间为服务器本地时间
}
}
查看测试报告二
如果你不想使用浏览器查看结果,可以将生成的jtl文件下载回来,在有界面的jmeter查看
常用ai语音配音
微软
- xiaoxiao(晓晓)
- yunjian(云建)
- yunxi(云熙)
- yunyang(云扬)
- hsiaochen(小陈,台湾)
- 魔音工坊,魔西毒
npm和yarn
区别
-
npm(Node Package Manager)
是Node.js的默认包管理工具。它主要用于JavaScript和Node.js项目的包管理。npm的出现是为了方便开发者安装、更新、管理项目依赖的包(库)。它有一个庞大的包仓库,即npm仓库,里面包含了海量的开源包。 npm仓库是全球最大的软件包仓库之一,它为开发者提供了丰富的资源。比如,如果你想在项目中使用一个轻量级的HTTP客户端库,就可以通过npm安装axios库。npm仓库中的包通常是由开发者按照一定的规范上传的,这些包可以是库、工具、插件等各种类型的软件组件。
-
Yarn
是一个由Facebook开发的现代包管理工具,它也是用于JavaScript和Node.js项目的包管理。Yarn的出现主要是为了解决npm在某些场景下存在的性能问题和稳定性问题。 Yarn和npm在功能上有很大的相似性,比如都可以安装、更新、管理包。不过,Yarn在一些方面进行了优化。例如,Yarn在安装包时会并行下载多个包,这使得安装速度比npm更快。而且Yarn在处理包的依赖关系时,采用了更先进的算法,能够更高效地解决依赖冲突等问题。
安装方式
-
npm
npm是Node.js自带的包管理工具。当你安装Node.js时,npm会自动安装在你的系统中。你可以通过在终端或命令提示符中输入npm -v来查看npm的版本,确认它是否已经正确安装。
-
Yarn
Yarn的安装方式相对独立。你可以通过npm来安装Yarn,命令是npm install -g yarn
。此外,Yarn也提供了其他安装方式,比如在macOS上可以通过Homebrew安装(brew install yarn),在Windows上可以通过Chocolatey安装(choco install yarn)等。安装完成后,你可以通过yarn -v
来查看Yarn的版本。
使用方式
-
npm
# 根据package初始化项目
npm install --registry https://registry.npmmirror.com
# 安装包
npm install three --save --registry https://registry.npmmirror.com
# 运行脚本
npm run dev
-
yarn
# 根据package初始化项目
yarn install --registry https://registry.npmmirror.com
# 安装包
yarn add three --save --registry https://registry.npmmirror.com
# 运行脚本
yarn run dev
hbuilder项目转vue项目&&jenkins uniapp
使用vue cli工具、uni预设创建新的项目
npm install --location=global @vue/cli@4 --registry=http://registry.npmmirror.com
vue create -p dcloudio/uni-preset-vue my-project
根据项目类型选择预设模板(建议选择hello uni-app模板)
移植项目
# 先将项目运行起来
npm install --registry=http://registry.npmmirror.com
npm run dev
# 删除新项目中的src目录内文件
# 复制老项目文件
# .git package.json package-lock.json node_modules vue.config 不需要复制
# 如果你的package.json有内容,需要手动合并到项目外层的package.json
# 再次运行
npm run dev
安装node-sass
如果运行时出现出现node-saas错误
"devDependencies": {
"sass": "^1.70.0",
"sass-loader": "^10.0.0",
}