首页
📈统计
📬留言
💘关于
更多
💞友链
📺直播
🎠壁纸
Search
1
docker部署chromium
5 阅读
2
prometheus+alertmanager告警
2 阅读
3
minio部署以及使用挂载
2 阅读
4
typecho背景透明设置
2 阅读
5
httpd文件服务器
1 阅读
🎑Linux
centos
ubuntu
deepin
debian
🎉Typecho
🎻小程序
🍕生活
🍞其他
☸k8s
🤖监控配置
登录
Search
标签搜索
shell
脚本
文档
doc
存储
typecho
chromium
lazy-balancer
Typecho
累计撰写
57
篇文章
累计收到
37
条评论
首页
栏目
🎑Linux
centos
ubuntu
deepin
debian
🎉Typecho
🎻小程序
🍕生活
🍞其他
☸k8s
🤖监控配置
页面
📈统计
📬留言
💘关于
💞友链
📺直播
🎠壁纸
搜索到
57
篇与
的结果
2026-05-13
prometheus+grafana实现监控告警
更新grafana 邮件配置# 部署见连接: https://cloud.prd.emal.cc/index.php/archives/92/ # 在docker-compose.yaml 里面添加映射将这个配置文件里面的[smtp]启用 - ./grafana/conf/grafana.ini:/etc/grafana/grafana.ini #在docker-compose.yaml添加这样 修改文件grafana.ini [smtp] enabled = true host = smtp.163.com:465 user = demo@163.com #改成你的邮箱 password = SDCFWRDXCGGHNJKB #改成你的邮箱16位授权码 skip_verify = true from_address = demo@163.com #改为你的邮箱 from_name = Grafana # 完成后启动docker-compose docker-compose down && docker-compose up -d编辑grafana页面创建告警{{ define "alert" }} {{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }} =============================== @告警通知 告警程序: Grafana 告警级别: {{ .Labels.severity }} 告警类型: {{ .Labels.alertname }} 故障主机: {{ .Labels.instance }} 告警主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 触发时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} 静默地址: https://grafana.prd.emal.cc/alerting/list =============================== {{ end }}{{ end -}} {{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }} =============================== @告警恢复 告警程序: prometheus_alert 故障主机: {{ .Labels.instance }} 故障主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 告警时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} 恢复时间: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }} =============================== {{ end }}{{ end -}} {{ end }}更多里面你可以开启静默这些操作等
2026年05月13日
0 阅读
0 评论
0 点赞
2026-05-11
原来如此美丽
暂无简介
2026年05月11日
1 阅读
0 评论
0 点赞
2026-05-08
npc部署
部署wget https://package.prd.emal.cc/package/npc/npc.sh chmod +x npc.sh ./npc.shnpc软件说明它是一款内网穿透服务,可以将局域网代理到公网,可远程办公等操作创建nps服务端创建客户端客户端部署wget https://package.prd.emal.cc/package/npc/npc.sh chmod +x npc.sh ./npc.sh
2026年05月08日
1 阅读
0 评论
0 点赞
2026-05-08
ovpn-admin docker部署
下载tar包wget https://packages.emal.cc/package/softinstall/produce/ovpn-admin/ovpn-admin.tar.gz tar -zxvf ovpn-admin.tar.gz cd ovpn-admin修改配置文件修改 docker-compose.yaml 文件中的 "OVPN_SERVER:" 改成你的公网IP 例如 OVPN_SERVER: "101.23.44.20:1194:tcp"docker build镜像docker build -f Dockerfile.openvpn -t openvpn:v1.0.0 . docker build -f Dockerfile.ovpn-admin -t ovpn-admin:v1.0.0 . #或者 wget https://packages.emal.cc/package/softinstall/produce/ovpn-admin/openvpn.tar wget https://packages.emal.cc/package/softinstall/produce/ovpn-admin/ovpn-admin.tar docker load -i openvpn.tar docker load -i ovpn-admin.tar部署docker compose up -d访问地址http://localhost:80 username: admin password: Xzm7_GTD.com
2026年05月08日
0 阅读
0 评论
0 点赞
2026-04-03
virsh脚本安装虚拟机
● 写好了自动化脚本安装虚拟机1、安装virtyum install -y qemu-kvm libvirt libvirt-client virt-install virt-viewer bridge-utils systemctl start libvirtd && systemctl enable libvirtd2、上传iso镜像到/data/iso上传iso镜像到服务器的 /data/iso/ 目录下3、mvstat脚本#!/usr/bin/env bash # 红色 red() { echo -e $'\033[0;31m'"$1"$'\033[0m' } # 黄色 yellow() { echo -e $'\033[0;33m'"$1"$'\033[0m' } # 用法: print_table "ID|名称|状态" <(paste id mvname mvstatus) print_table() { local headers="$1" local data_source="$2" # 生成id mvname mvstatus virsh list --all | awk 'NR>2 && NF>0 {print $1}' > /tmp/id virsh list --all | awk 'NR>2 && NF>0 {print $2}' > /tmp/vmname virsh list --all | awk 'NR>2 && NF>0 {print $3}' > /tmp/vmstatus # 计算字符串显示宽度(汉字占2宽,英文/数字占1宽) str_width() { local str="$1" echo -n "$str" | awk '{ width = 0 for (i = 1; i <= length($0); i++) { char = substr($0, i, 1) if (char ~ /[^\x00-\x7F]/) { width += 2 } else { width += 1 } } print width }' } # 左对齐并填充到目标宽度 align_left() { local str="$1" local target_width="$2" local current_width=$(str_width "$str") local spaces=$((target_width - current_width)) if [ $spaces -lt 0 ]; then spaces=0; fi printf "%s%*s" "$str" "$spaces" "" } # 生成横线 make_line() { local count=$1 printf '%*s' "$count" '' | tr ' ' '-' } # 收集数据 local data=("$headers") while IFS=$'\t' read -r line; do if [[ -n "$line" ]]; then data+=("$(echo "$line" | tr '\t' '|')") fi done < <(eval "$data_source" 2>/dev/null) # 获取列数 IFS='|' read -ra header_fields <<< "$headers" local col_count=${#header_fields[@]} # 计算每列最大宽度 declare -a max_width for ((col=0; col<col_count; col++)); do max_width[$col]=0 for line in "${data[@]}"; do IFS='|' read -ra fields <<< "$line" if [[ $col -lt ${#fields[@]} ]]; then local width=$(str_width "${fields[$col]}") [[ $width -gt ${max_width[$col]} ]] && max_width[$col]=$width fi done done # 打印表格分隔线 print_separator() { for col in "${!max_width[@]}"; do printf "+%s" "$(make_line $((max_width[$col] + 2)))" done echo "+" } # 打印数据行 print_data_row() { local -a fields=("$@") for col in "${!max_width[@]}"; do local field="${fields[$col]:-}" local pad=$((max_width[$col] - $(str_width "$field"))) printf "| %s%${pad}s " "$field" "" done echo "|" } # 输出表格 print_separator for line in "${data[@]}"; do IFS='|' read -ra fields <<< "$line" print_data_row "${fields[@]}" print_separator done } # 关机\开机\重启\删除\添加磁盘\卸载磁盘 DELTE_VM(){ QEMU_DIR="/data/virt-data" print_table "ID|名称|状态" "paste /tmp/id /tmp/vmname /tmp/vmstatus" read -r -p "请选择机器名称: " VIRTNAME if [ -z "${VIRTNAME}" ];then red "机器名称不能为空!" exit 1 else grep -w ${VIRTNAME} /tmp/vmname > /dev/null 2>&1 if [ $? -eq 0 ];then rm -rf /tmp/id /tmp/vmname /tmp/vmstatus else red "您选择的机器不存在!" exit 1 fi if [ "${VIRTNAME}" == "kzprd" ];then yellow "${VIRTNAME} 主机不让删除,确定删除请输入删除密码进行删除." yellow "密码提示: 123@" read -r -p "请输入密码: " PASSWORDS if [ "${PASSWORDS}" == "123@qwe~~" ];then yellow "选择的机器是: ${VIRTNAME}" else red "您输入的密码有误机器不删除,即将退出!" exit 1 fi else yellow "选择的机器是: ${VIRTNAME}" fi fi echo "1 关机" echo "2 开机" echo "3 重启" echo "4 删除" echo "5 添加磁盘" echo "6 卸载磁盘" read -r -p "请选择(1-3): " INPUTID if [ "${INPUTID}" == "1" ];then virsh destroy ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已关机" || red "机器关机失败${VIRTNAME}" elif [ "${INPUTID}" == "2" ];then virsh start ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已开机" || red "机器开机失败${VIRTNAME}" elif [ "${INPUTID}" == "3" ];then virsh reset ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已重启" || red "机器重启失败${VIRTNAME}" elif [ "${INPUTID}" == "4" ];then virsh destroy ${VIRTNAME} > /dev/null 2>&1 virsh undefine ${VIRTNAME} > /dev/null 2>&1 && yellow "机器${VIRTNAME}已删除" || red "机器删除失败${VIRTNAME}" rm -rf ${QEMU_DIR}/${VIRTNAME}.qcow2 > /dev/null 2>&1 && yellow "机器${VIRTNAME}.qcow2已删除" || red "机器${VIRTNAME}.qcow2删除失败" elif [ "${INPUTID}" == "5" ];then read -p "增加磁盘大小单位G: " DISKS case $DISKS in ''|*[!0-9]*) red "错误:请输入数字!" exit 1 ;; *) mkdir -p "${QEMU_DIR}/${VIRTNAME}" # 获取可用设备名和文件名 TARGET=$(get_next_target) DISK_PATH=$(get_next_filename) # 显示信息 yellow "准备添加数据盘:" echo " 设备名: ${TARGET}" echo " 磁盘文件: ${DISK_PATH}" echo " 大小: ${DISKS}G" # 创建磁盘 if qemu-img create -f qcow2 "${DISK_PATH}" ${DISKS}G > /dev/null 2>&1; then yellow "磁盘创建成功!" else red "磁盘创建失败!" exit 1 fi # 挂载磁盘 if virsh attach-disk ${VIRTNAME} "${DISK_PATH}" ${TARGET} --live --persistent --subdriver=qcow2 > /dev/null 2>&1; then yellow "磁盘挂载成功!" echo "" yellow "当前磁盘列表:" virsh domblklist ${VIRTNAME} else red "磁盘挂载失败!" exit 1 fi ;; esac elif [ "${INPUTID}" == "6" ];then # 获取数据盘列表(排除vda) DISKS=$(virsh domblklist ${VIRTNAME} 2>/dev/null | awk 'NR>2 && $1 != "vda" && $1 != "" {print $1}') if [ -z "$DISKS" ]; then red "没有可卸载的数据盘" exit 1 fi yellow "============= 请选择需要卸载的磁盘 =============" select DISK in $DISKS; do if [ -n "$DISK" ]; then yellow "准备卸载: $DISK" read -p "确认? (y/n): " confirm if [ "$confirm" = "y" ]; then # 先获取磁盘文件路径(在卸载前获取) DISK_PATH=$(virsh domblklist ${VIRTNAME} --details 2>/dev/null | awk -v d="$DISK" '$3==d {print $4}') # 卸载磁盘 if virsh detach-disk ${VIRTNAME} ${DISK} --live --persistent > /dev/null 2>&1; then yellow "✓ 磁盘 ${DISK} 卸载成功" # 删除对应的磁盘文件 if [ -n "$DISK_PATH" ] && [ -f "$DISK_PATH" ]; then rm -f "$DISK_PATH" yellow "✓ 磁盘文件已删除: ${DISK_PATH}" else yellow "磁盘文件不存在: ${DISK_PATH}" fi else red "✗ 磁盘 ${DISK} 卸载失败" fi fi break else red "无效选择" fi done virsh domblklist ${VIRTNAME} else red "请输入(1-6)正确的数字" exit 1 fi } # 获取已使用的设备名 get_next_target() { local used_targets=$(virsh domblklist ${VIRTNAME} --details 2>/dev/null | awk 'NR>2 {print $3}' | grep -E '^vd[a-z]+$') local letters=("b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z") for letter in "${letters[@]}"; do if ! echo "$used_targets" | grep -q "vd${letter}"; then echo "vd${letter}" return 0 fi done echo "vdb" } # 获取不重复的文件名 get_next_filename() { local base="${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data.qcow2" local counter=1 local filename="$base" # 如果基础文件不存在,直接返回 if [ ! -f "$filename" ]; then echo "$filename" return 0 fi # 基础文件存在,尝试添加后缀 while [ -f "${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data_${counter}.qcow2" ]; do ((counter++)) done echo "${QEMU_DIR}/${VIRTNAME}/${VIRTNAME}_data_${counter}.qcow2" } # 检查端口是否为数字且在范围内,且不冲突 validate_vnc_port() { local port="$1" # 1. 判断输入的必须是数字 if [[ ! "$port" =~ ^[0-9]+$ ]]; then echo "错误: 端口必须是数字!" return 1 fi # 2. 数字必须是5900-5999之间 if [[ "$port" -lt 5900 ]] || [[ "$port" -gt 5999 ]]; then echo "错误: 端口范围必须是 5900-5999 之间!" return 1 fi # 3. 选择的端口不能与本地已存在的端口冲突 if ss -tlnp 2>/dev/null | grep -q ":$port " || \ netstat -tlnp 2>/dev/null | grep -q ":$port " || \ lsof -i ":$port" 2>/dev/null | grep -q LISTEN; then echo "错误: 端口 $port 已被占用!" return 1 fi return 0 } # 创建iso,通过vnc访问安装机器 CREATE_ISO(){ read -r -p "请命名虚拟机名称: " VMNAMES if [ -z "${VMNAMES}" ];then red "虚拟机名称不能为空!" exit 1 else ISO_NAME=$(ls /data/iso/ | cat) if [ -z "$ISO_NAME" ]; then red "没有可用的镜像,请确保iso存放到了 /data/iso/ 目录下!!!" exit 1 fi echo "" yellow "请选择镜像" select ISO in $ISO_NAME; do if [ -n "$ISO" ]; then echo "选择的镜像是: $ISO" # 循环输入直到正确 while true; do read -r -p "请选择VNC端口 5900-5999: " VNCPORT if validate_vnc_port "$VNCPORT"; then yellow "✓ 端口 $VNCPORT 验证通过" break else red "端口已存在或不在5900-5999之间,请重新输入!" echo "" fi done read -p "确认? (y/n): " confirm if [ "$confirm" = "y" ]; then yellow "虚拟机 ${VMNAMES} 正在创建中..." virt-install \ --name ${VMNAMES} \ --memory 2048 \ --vcpus 1 \ --cdrom /data/iso/${ISO} \ --disk path=/data/virt-data/${VMNAMES}.qcow2,size=10 \ --network network=default \ --graphics vnc,listen=0.0.0.0,port=${VNCPORT} # 显示状态 yellow "=========================================" virsh list yellow "=========================================" yellow "查看日志: tail -f /var/log/libvirt/qemu/${VMNAMES}.log" yellow "进入控制台: virsh console ${VMNAMES}" yellow "nvc连接地址: 192.168.4.20:5999" else yellow "退出安装iso" fi break else red "无效选择" fi done fi } # 创建虚拟机 CREATE_VM(){ QEMU_FILE="/data/virt-data/kzprd.qcow2" QEMU_DIR="/data/virt-data" read -r -p "请输入您要创建的机器名称: " VMNAME if [ "${VMNAME}" == "" ];then red "机器名称不能为空!" exit 1 else yellow "正在创建机器 ${VMNAME}..." qemu-img create -f qcow2 -b ${QEMU_FILE} ${QEMU_DIR}/${VMNAME}.qcow2 qemu-img info ${QEMU_DIR}/${VMNAME}.qcow2 fi read -r -p "确定创建虚拟机?y/n: " YES if [ "${YES}" == "y" ];then virt-install \ --name ${VMNAME} \ --memory 2048 \ --vcpus 1 \ --disk path=${QEMU_DIR}/${VMNAME}.qcow2,format=qcow2 \ --import \ --network network=default \ --graphics vnc,listen=0.0.0.0,port=5902 \ --os-variant centos7.0 \ --noautoconsole else yellow "即将退出!" exit 0 fi } main(){ yellow "================================" yellow " 虚拟机管理器 v1.0.0" yellow "================================" echo "" echo " 1. ISO创建初始化机器" echo " 2. 创建虚拟机" echo " 3. 管理虚拟机" echo "" yellow "================================" read -r -p "请选择对应的数字(1-3): " STATVM if [ "${STATVM}" == "1" ];then CREATE_ISO elif [ "${STATVM}" == "2" ];then CREATE_VM elif [ "${STATVM}" == "3" ];then DELTE_VM else red "无效选择即将退出!" exit 1 fi } main4、执行mvstat脚本● 先选择1,安装iso,通过vnc连接安装iso镜像● 安装完成重启virsh虚拟机后,使用vnc连接开启虚拟机的ttyS0# virsh console使用,进入虚拟机执行命令 systemctl enable serial-getty@ttyS0.service systemctl start serial-getty@ttyS0.service# 让IP自动获取开启如下 vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes systemctl restart network
2026年04月03日
0 阅读
0 评论
0 点赞
2026-03-12
httpd配置美化apaxy
下载压缩包wget https://packages.emal.cc/package/softinstall/produce/httpd/apaxy.tar.gz解压压缩包tar -zxvf apaxy.tar.gz配置将解压的apaxy下面的 apaxy/apaxy/* copy到httpd共享目录下cp -ar apaxy/apaxy/* /data/package/ [ 14:26:34 root@t-01 /data/src ]$ ll apaxy/apaxy 总用量 16 -rw-r--r-- 1 root root 15992 3月 12 10:18 htaccess.txt drwxr-xr-x 3 root root 315 3月 12 10:18 theme修改配置sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/htaccess.txt sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/theme/footer.html sed -i 's/{FOLDERNAME}/\/package/g' /data/httpd/theme/header.html mv htaccess.txt .htaccesshttpd配置/etc/httpd/conf/httpd.conf 确保这个配置里面有“AllowOverride ALL”、”Require all granted“vim /etc/httpd/conf/httpd.conf Alias /package "/data/httpd/" <Directory "/data/httpd"> Options Indexes MultiViews FollowSymLinks AllowOverride ALL Order allow,deny Allow from all Require all granted # AuthType Basic # AuthName "Restricted Access" # AuthUserFile /etc/httpd/.htpasswd # Require valid-user </Directory>重启httpdsystemctl restart httpd页面查看
2026年03月12日
1 阅读
0 评论
0 点赞
1
2
3
...
10