[{"content":"自用脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/setup_menu.sh \u0026amp;\u0026amp; chmod +x setup_menu.sh \u0026amp;\u0026amp; ./setup_menu.sh 脚本推荐一\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tp.sh \u0026amp;\u0026amp; chmod +x tp.sh \u0026amp;\u0026amp; ./tp.sh 脚本推荐二\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tool.sh \u0026amp;\u0026amp; chmod +x tool.sh \u0026amp;\u0026amp; ./tool.sh 脚本推荐三\ncurl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh 脚本推荐四\ncurl -fsSL https://raw.githubusercontent.com/eooce/ssh_tool/main/ssh_tool.sh -o ssh_tool.sh \u0026amp;\u0026amp; chmod +x ssh_tool.sh \u0026amp;\u0026amp; ./ssh_tool.sh 脚本五\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh ssh密钥登录\n脚本1（推荐）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssh_quick.sh \u0026amp;\u0026amp; chmod +x ssh_quick.sh \u0026amp;\u0026amp; ./ssh_quick.sh 脚本2\nsudo ufw status sudo ufw allow 5533/tcp 然后执行\nbash \u0026lt;(curl -fsSL https://raw.githubusercontent.com/wuzf/SSH_Key_Installer/master/key.sh) -og 用户名 -p 5533 -d 密钥丢失，登录服务器控制台（VNC/Console 功能登录）\nbash \u0026lt;(curl -fsSL https://raw.githubusercontent.com/wuzf/SSH_Key_Installer/master/key.sh) -e YourNewPassword 一键屏蔽垃圾爬虫 (ufw)\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 查看规则\nsudo ufw status numbered 节点搭建，管理快捷键：sb\nbash \u0026lt;(wget -qO- -o- https://github.com/233boy/sing-box/raw/main/install.sh) docker一键安装脚本\ncurl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh 端口限制访问脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipwl.sh \u0026amp;\u0026amp; chmod +x ipwl.sh \u0026amp;\u0026amp; ./ipwl.sh docker端口白名单脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/docker_whitelist.sh \u0026amp;\u0026amp; chmod +x docker_whitelist.sh \u0026amp;\u0026amp; ./docker_whitelist.sh 回源限制脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cloudflare-only.sh \u0026amp;\u0026amp; chmod +x cloudflare-only.sh \u0026amp;\u0026amp; ./cloudflare-only.sh 反向代理\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/menu.sh \u0026amp;\u0026amp; chmod +x menu.sh \u0026amp;\u0026amp; ./menu.sh 重启nginx\nsudo rm -rf /usr/local/nginx/cache/proxy/* sudo systemctl restart nginx \u0026amp;\u0026amp; nginx -t 停止nginx\nsudo systemctl stop nginx 证书备份\ntar -czvf letsencrypt_backup.tar.gz -C /etc letsencrypt 系统用户管理\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/user-pro.sh \u0026amp;\u0026amp; chmod +x user-pro.sh \u0026amp;\u0026amp; ./user-pro.sh 端口访问白名单\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipwl.sh \u0026amp;\u0026amp; chmod +x ipwl.sh \u0026amp;\u0026amp; ./ipwl.sh 如果遇到错误提示：\nsudo mkdir -p /etc/mysql sudo touch /etc/mysql/mariadb.cnf sudo dpkg --configure -a bbr\ncat \u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; EOF fs.file-max = 6815744 net.ipv4.tcp_no_metrics_save=1 net.ipv4.tcp_ecn=0 net.ipv4.tcp_frto=0 net.ipv4.tcp_mtu_probing=0 net.ipv4.tcp_rfc1337=0 net.ipv4.tcp_sack=1 net.ipv4.tcp_fack=1 net.ipv4.tcp_window_scaling=1 net.ipv4.tcp_adv_win_scale=1 net.ipv4.tcp_moderate_rcvbuf=1 net.core.rmem_max=33554432 net.core.wmem_max=33554432 net.ipv4.tcp_rmem=4096 87380 33554432 net.ipv4.tcp_wmem=4096 16384 33554432 net.ipv4.udp_rmem_min=8192 net.ipv4.udp_wmem_min=8192 net.ipv4.ip_forward=1 net.ipv4.conf.all.route_localnet=1 net.ipv4.conf.all.forwarding=1 net.ipv4.conf.default.forwarding=1 net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.forwarding=1 EOF sysctl -p \u0026amp;\u0026amp; sysctl --system ROOT私钥登录模式\nhttps://woniu336.github.io/p/328/\n安装宝塔面板\nhttps://woniu336.github.io/p/229/\n启用 QUIC 与 Brotli 的完整教程\nhttps://woniu336.github.io/p/299/\n安装node\ncurl -fsSL https://deb.nodesource.com/setup_20.x | bash - \u0026amp;\u0026amp; apt-get install -y nodejs 验证安装\nnode -v npm -v 安装go\nwget https://golang.org/dl/go1.25.5.linux-amd64.tar.gz tar -C /usr/local -xzf go1.25.5.linux-amd64.tar.gz echo \u0026#39;export PATH=$PATH:/usr/local/go/bin\u0026#39; \u0026gt;\u0026gt; ~/.bashrc \u0026amp;\u0026amp; source ~/.bashrc go version 屏蔽 Censys\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/setup_ufw_rules.sh \u0026amp;\u0026amp; chmod +x setup_ufw_rules.sh \u0026amp;\u0026amp; ./setup_ufw_rules.sh 三网回程路由线路测试\ncurl https://raw.githubusercontent.com/oneclickvirt/backtrace/main/backtrace_install.sh -sSf | bash ./backtrace 回程详细测试（推荐）\nwget -N --no-check-certificate https://raw.githubusercontent.com/Chennhaoo/Shell_Bash/master/AutoTrace.sh \u0026amp;\u0026amp; chmod +x AutoTrace.sh \u0026amp;\u0026amp; bash AutoTrace.sh 默认双栈检测\nbash \u0026lt;(curl -Ls Net.Check.Place) 性能检测\ncurl -sL https://yabs.sh | bash 或者\nwget -qO- yabs.sh | bash IP质量检测脚本\nbash \u0026lt;(curl -Ls IP.Check.Place) -4 仅检测ipv4\nbash \u0026lt;(curl -Ls Net.Check.Place) -4 延迟模式\nbash \u0026lt;(curl -Ls Net.Check.Place) -P 或者\nbash \u0026lt;(curl -sL Check.Place) -N 完整路由模式（指定广西）：\nbash \u0026lt;(curl -Ls Net.Check.Place) -R 广西 查找网站目录下最近7天内修改过的HTML和PHP文件，并显示其详细信息。\nfind /www/wwwroot/xxxxx.com -type f -mtime -7 \\( -name \u0026#39;*.html\u0026#39; -o -name \u0026#39;*.htm\u0026#39; -o -name \u0026#39;*.php\u0026#39; \\) -exec ls -l --full-time {} \\; CloudFlare Api 宕机自动切换 ip\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/dns_update/dns_update_menu.sh \u0026amp;\u0026amp; chmod +x dns_update_menu.sh \u0026amp;\u0026amp; ./dns_update_menu.sh 证书申请和续签cert工具：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert.sh \u0026amp;\u0026amp; chmod +x ssl-cert.sh \u0026amp;\u0026amp; ./ssl-cert.sh acme证书工具\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl_pro.sh \u0026amp;\u0026amp; chmod +x ssl_pro.sh \u0026amp;\u0026amp; ./ssl_pro.sh fail2ban防御\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fail2ban-s.sh \u0026amp;\u0026amp; chmod +x fail2ban-s.sh \u0026amp;\u0026amp; ./fail2ban-s.sh PHP监控脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/php-s.py \u0026amp;\u0026amp; chmod +x php-s.py python3 php-s.py 日志查杀和检测\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/manage_logs.sh \u0026amp;\u0026amp; chmod +x manage_logs.sh \u0026amp;\u0026amp; ./manage_logs.sh 监控证书，域名、服务器\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/document_modifier.sh \u0026amp;\u0026amp; chmod +x document_modifier.sh \u0026amp;\u0026amp; ./document_modifier.sh 苹果 cms 系统站点最佳 Nginx 配置\n适用苹果 cms 站点：https://github.com/woniu336/open_shell/blob/main/maccms.conf 适用多数站点：https://github.com/woniu336/open_shell/blob/main/nginx.conf 更新系统的语言环境设置\nsudo update-locale LANG=en_US.UTF-8 重启\nreboot #重启 其他教程 项目 链接 推荐脚本 https://woniu336.github.io/p/tool/#5推荐脚本 宝塔面板7.7原版 https://blog.taoshuge.eu.org/p/229/ 一键重装系统 https://woniu336.github.io/p/tool/#4一键dd 或 https://woniu336.github.io/p/133/ 安装宝塔面板7.7原版 https://woniu336.github.io/p/bt/ 宝塔面板计划任务迁移 https://woniu336.github.io/p/136/ 宝塔海外版aapanel安装教程 https://woniu336.github.io/p/141/ docker应用 https://woniu336.github.io/p/11/ MySQL 5.7内存优化 https://woniu336.github.io/p/tool/#1mysql-57内存优化 开启BBR https://woniu336.github.io/p/tool/#2bbr swap的调整 https://woniu336.github.io/p/tool/#3swap的调整 证书申请 https://woniu336.github.io/p/ssl/ rclone工具 https://woniu336.github.io/p/rclone/ 兰空图床 https://woniu336.github.io/p/137/ 监控域名有效期 https://woniu336.github.io/p/132/ Cloudflare R2作为图床的管理和同步 https://woniu336.github.io/p/143/ Cloudflare防火墙的设置 https://woniu336.github.io/p/126/ 制作自己专属的CDN https://woniu336.github.io/p/125/ ","date":"2023-09-17T15:30:46Z","image":"https://img.meituan.net/csc/b3af8d16f23d1e63f8157d761c4688c51249652.png","permalink":"https://blog.lufei.de/p/87/","title":"路飞工具箱"},{"content":"caddy配置 (common) { tls { protocols tls1.2 tls1.3 } header { -Via -Alt-Svc -Server } } (proxy) { header_up Host \u0026#34;woniu336.github.io\u0026#34; header_up X-Real-IP {remote} } blog.lufei.de { import common reverse_proxy https://woniu336.github.io { import proxy } } 验证配置文件：\nsudo caddy validate --config /etc/caddy/Caddyfile 重启 Caddy 服务：\nsudo systemctl restart caddy ","date":"2026-04-26T23:59:11+08:00","permalink":"https://blog.lufei.de/p/538/","title":"caddy 反代 GitHub Pages"},{"content":" 项目：https://github.com/clusterzx/intellissh\n安装 mkdir -p /opt/docker/intellissh \u0026amp;\u0026amp; cd /opt/docker/intellissh 创建docker-compose.yml\nnano docker-compose.yml 粘贴\nservices: intellissh: image: clusterzx/intellissh:latest container_name: intellissh ports: - \u0026#34;8080:3000\u0026#34; volumes: - ./data:/app/server/data restart: unless-stopped 启动\ndocker compose up -d 查看用户名和密码\ndocker logs intellissh ","date":"2026-04-05T14:12:35+08:00","permalink":"https://blog.lufei.de/p/537/","title":"一款带 AI 大脑的 Web SSH 工具"},{"content":"备份原配置文件并修改语言环境设置 sed -i.bak \u0026#39;s/^LANG=C$/LANG=zh_CN.UTF-8/; s/^LANGUAGE=C$/LANGUAGE=zh_CN:zh/; s/^#.*no localization for root.*$/# Modified: Chinese UTF-8 locale for better Chinese support/\u0026#39; /root/.profile \u0026amp;\u0026amp; \\ source /root/.profile \u0026amp;\u0026amp; \\ echo \u0026#34;✅ 中文乱码修复完成！当前语言环境：\u0026#34; \u0026amp;\u0026amp; locale | grep -E \u0026#34;LANG|LANGUAGE\u0026#34; 测试中文显示 echo \u0026#34;中文测试：修复成功！你好，世界！\u0026#34; \u0026amp;\u0026amp; \\ date +\u0026#34;%Y年%m月%d日 %H时%M分%S秒\u0026#34; \u0026amp;\u0026amp; \\ touch \u0026#34;测试文件.txt\u0026#34; \u0026amp;\u0026amp; ls -la \u0026#34;测试文件.txt\u0026#34; \u0026amp;\u0026amp; rm \u0026#34;测试文件.txt\u0026#34; 注意：这些命令假设您的系统已经安装了中文语言包（zh_CN.UTF-8）。如果未安装，需要先运行：\napt update \u0026amp;\u0026amp; apt install -y locales \u0026amp;\u0026amp; dpkg-reconfigure locales ","date":"2026-03-10T21:44:43+08:00","permalink":"https://blog.lufei.de/p/536/","title":"debian13修复中文乱码"},{"content":" 文档：https://easytier.cn/guide/introduction.html\n项目：https://github.com/EasyTier/EasyTier/\nLniux服务节点部署 选择一台云服务器（vps），具有公网ip，速度快，线路好的，作为中转节点\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/easytier.sh \u0026amp;\u0026amp; chmod +x easytier.sh \u0026amp;\u0026amp; ./easytier.sh 选择菜单1安装，然后选择菜单2：部署服务器\n服务节点放行端口\nufw allow 11010/udp ufw allow 11010/tcp 快捷命令et\necho \u0026#34;alias et=\u0026#39;/root/easytier.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc Lniux客户端 每台VPS都是1安装好，然后3加入网络\n用户、密码要和前面的服务节点一样的，\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/easytier.sh \u0026amp;\u0026amp; chmod +x easytier.sh \u0026amp;\u0026amp; ./easytier.sh uuid生成,填到配置里面的instance_id cat /proc/sys/kernel/random/uuid 修改配置 nano /etc/easytier/easytier.toml 配置如下\n# EasyTier 客户端配置 instance_name = \u0026#34;debian13\u0026#34; instance_id = \u0026#34;66aee9ad-2f7f-4f39-b73a-3424173ce37a\u0026#34; dhcp = true # 监听端口 - 使用不同的端口避免与服务器冲突 listeners = [\u0026#34;udp://0.0.0.0:23010\u0026#34;, \u0026#34;tcp://0.0.0.0:23011\u0026#34;] # 网络身份认证 [network_identity] network_name = \u0026#34;xxx\u0026#34; network_secret = \u0026#34;xxxx\u0026#34; # 高级配置 [flags] default_protocol = \u0026#34;udp\u0026#34; # 优先使用UDP enable_encryption = true enable_ipv6 = true mtu = 1380 latency_first = true enable_exit_node = false foreign_network_whitelist = \u0026#34;*\u0026#34; disable_p2p = false disable_udp_hole_punching = false # 服务器节点 - 尝试UDP连接 [[peer]] uri = \u0026#34;udp://xxxxxxx:11010\u0026#34; 解释：\nuri = \u0026ldquo;udp://xxxxxxx:11010\u0026rdquo; 这里的xxx改成服务节点公网ip network_name = \u0026ldquo;xxx\u0026rdquo; 网络名称 network_secret = \u0026ldquo;xxxx\u0026rdquo; 网络密码 放行端口\nufw allow 23010/udp ufw allow 23011/tcp 最后重启生效\nsystemctl restart easytier windows 复制以下代码使用powershell，以管理员身份运行，粘贴运行\n#================================================================================ # --- 脚本配置 --- $GithubApiUrl = \u0026#34;https://api.github.com/repos/EasyTier/EasyTier/releases/latest\u0026#34; $GithubProxy = \u0026#34;ghfast.top\u0026#34; # 可选代理, 留空则不使用 # --- 路径和名称定义 --- # 使用 Program Files 和 ProgramData 是 Windows 的标准做法 $InstallDir = \u0026#34;$env:ProgramFiles\\EasyTier\u0026#34; $ConfigDir = \u0026#34;$env:ProgramData\\EasyTier\u0026#34; # ProgramData 是系统级应用数据的存放位置 $ConfigFile = Join-Path $ConfigDir \u0026#34;easytier.toml\u0026#34; $CoreBinaryName = \u0026#34;easytier-core.exe\u0026#34; $CliBinaryName = \u0026#34;easytier-cli.exe\u0026#34; $CoreBinaryPath = Join-Path $InstallDir $CoreBinaryName $CliBinaryPath = Join-Path $InstallDir $CliBinaryName # --- Windows 服务定义 --- $ServiceName = \u0026#34;EasyTierService\u0026#34; $ServiceDisplayName = \u0026#34;EasyTier Service\u0026#34; # --- 颜色定义 --- $c_green = \u0026#34;Green\u0026#34; $c_red = \u0026#34;Red\u0026#34; $c_yellow = \u0026#34;Yellow\u0026#34; $c_cyan = \u0026#34;Cyan\u0026#34; $c_normal = \u0026#34;White\u0026#34; # --- 辅助函数 --- # 检查是否以管理员身份运行 function Check-Admin { $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $principal = [System.Security.Principal.WindowsPrincipal]::new($identity) if (-not $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host \u0026#34;错误: 此脚本必须以管理员身份运行。\u0026#34; -ForegroundColor $c_red Write-Host \u0026#34;请右键点击 PowerShell 窗口标题栏，选择 \u0026#39;以管理员身份运行\u0026#39;，或右键点击脚本文件选择 \u0026#39;使用 PowerShell 运行\u0026#39;。\u0026#34; -ForegroundColor $c_yellow Read-Host \u0026#34;按 Enter 键退出...\u0026#34; exit 1 } } # 检查 EasyTier 是否已安装 function Check-Installed { if (-not (Test-Path $CoreBinaryPath)) { Write-Host \u0026#34;EasyTier 尚未安装。请先选择选项 1。\u0026#34; -ForegroundColor $c_yellow return $false } return $true } # 修改 toml 文件中的值 (PowerShell 版本) function Set-TomlValue { param( [string]$Key, [string]$Value, [string]$FilePath ) try { $content = Get-Content $FilePath -Raw $pattern = \u0026#34;(?im)^#*\\s*($Key)\\s*=.+\u0026#34; $replacement = \u0026#34;$Key = $Value\u0026#34; $newContent = $content -replace $pattern, $replacement Set-Content -Path $FilePath -Value $newContent } catch { Write-Host \u0026#34;错误: 修改配置文件失败: $_\u0026#34; -ForegroundColor $c_red } } # --- 主功能函数 --- function Install-EasyTier { Write-Host \u0026#34;--- 开始安装或更新 EasyTier ---\u0026#34; -ForegroundColor $c_green # 在 Windows 上，我们主要关注 x86_64 $arch = \u0026#34;x86_64\u0026#34; $os_identifier = \u0026#34;windows\u0026#34; Write-Host \u0026#34;1. 获取最新版本信息...\u0026#34; try { $latestInfo = Invoke-RestMethod -Uri $GithubApiUrl } catch { Write-Host \u0026#34;错误: 无法从 GitHub API 获取版本信息。请检查网络连接。\u0026#34; -ForegroundColor $c_red return } $search_prefix = \u0026#34;easytier-${os_identifier}-${arch}\u0026#34; $asset = $latestInfo.assets | Where-Object { $_.name -like \u0026#34;$search_prefix*.zip\u0026#34; } if (-not $asset) { Write-Host \u0026#34;错误: 未能找到适用于 Windows (x64) 的包。\u0026#34; -ForegroundColor $c_red return } $downloadUrl = $asset.browser_download_url $fileName = $asset.name $version = $latestInfo.tag_name Write-Host \u0026#34;检测到版本: $version, 架构: $arch, 文件: $fileName\u0026#34; if ($GithubProxy) { $downloadUrl = \u0026#34;https://$GithubProxy/$downloadUrl\u0026#34; Write-Host \u0026#34;2. 使用代理下载: $downloadUrl\u0026#34; -ForegroundColor $c_yellow } else { Write-Host \u0026#34;2. 直接下载: $downloadUrl\u0026#34; } $tempFile = Join-Path $env:TEMP $fileName try { Invoke-WebRequest -Uri $downloadUrl -OutFile $tempFile -UseBasicParsing } catch { Write-Host \u0026#34;下载失败! $_\u0026#34; -ForegroundColor $c_red if (Test-Path $tempFile) { Remove-Item $tempFile } return } Write-Host \u0026#34;3. 解压并安装...\u0026#34; # 确保安装目录存在 if (-not (Test-Path $InstallDir)) { New-Item -Path $InstallDir -ItemType Directory -Force | Out-Null } try { Expand-Archive -Path $tempFile -DestinationPath $InstallDir -Force } catch { Write-Host \u0026#34;解压失败! $_\u0026#34; -ForegroundColor $c_red if (Test-Path $tempFile) { Remove-Item $tempFile } return } # ====================【关键修复代码块】==================== Write-Host \u0026#34;4. 整理文件结构...\u0026#34; -ForegroundColor $c_yellow # 查找解压后可能创建的子目录 (例如 easytier-windows-x86_64) $subDir = Get-ChildItem -Path $InstallDir -Directory | Select-Object -First 1 if ($subDir) { # 如果找到了子目录，将其中的所有内容移动到上层安装目录 Write-Host \u0026#34;检测到子目录 $($subDir.FullName)，正在移动文件...\u0026#34; -ForegroundColor $c_cyan Move-Item -Path (Join-Path $subDir.FullName \u0026#34;*\u0026#34;) -Destination $InstallDir -Force # 删除空的子目录 Remove-Item -Path $subDir.FullName -Force -ErrorAction SilentlyContinue } # ========================================================= # 清理工作 Remove-Item $tempFile Write-Host \u0026#34;--- EasyTier $version 安装/更新成功! ---\u0026#34; -ForegroundColor $c_green Write-Host \u0026#34;程序已安装到: $InstallDir\u0026#34; -ForegroundColor $c_cyan # 如果服务已存在, 重启以应用更新 if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Write-Host \u0026#34;检测到现有服务，正在重启以应用更新...\u0026#34; -ForegroundColor $c_yellow Restart-Service -Name $ServiceName } } function Create-DefaultConfig { if (-not (Test-Path $ConfigDir)) { New-Item -Path $ConfigDir -ItemType Directory -Force | Out-Null } $configContent = @\u0026#34; ipv4 = \u0026#34;\u0026#34; dhcp = false listeners = [\u0026#34;udp://0.0.0.0:11010\u0026#34;, \u0026#34;tcp://0.0.0.0:11010\u0026#34;, \u0026#34;wg://0.0.0.0:11011\u0026#34;, \u0026#34;ws://0.0.0.0:11011/\u0026#34;, \u0026#34;wss://0.0.0.0:11012/\u0026#34;] [network_identity] network_name = \u0026#34;\u0026#34; network_secret = \u0026#34;\u0026#34; [flags] default_protocol = \u0026#34;udp\u0026#34; dev_name = \u0026#34;\u0026#34; enable_encryption = true enable_ipv6 = true mtu = 1380 latency_first = true enable_exit_node = false no_tun = false use_smoltcp = false foreign_network_whitelist = \u0026#34;*\u0026#34; disable_p2p = false relay_all_peer_rpc = false disable_udp_hole_punching = false enableKcp_Proxy = true \u0026#34;@ Set-Content -Path $ConfigFile -Value $configContent Write-Host \u0026#34;已成功创建默认配置文件: $ConfigFile\u0026#34; } function Configure-Network { if (-not (Check-Installed)) { return } $network_name = Read-Host \u0026#34;请输入网络名称\u0026#34; $network_secret = Read-Host \u0026#34;请输入网络密钥\u0026#34; $virtual_ip = Read-Host \u0026#34;请输入此节点虚拟IP (留空则启用DHCP)\u0026#34; $is_client = Read-Host \u0026#34;是否要连接到一个现有的对端节点? (y/n)\u0026#34; Create-DefaultConfig Set-TomlValue \u0026#34;network_name\u0026#34; \u0026#34;`\u0026#34;$network_name`\u0026#34;\u0026#34; $ConfigFile Set-TomlValue \u0026#34;network_secret\u0026#34; \u0026#34;`\u0026#34;$network_secret`\u0026#34;\u0026#34; $ConfigFile if ([string]::IsNullOrWhiteSpace($virtual_ip)) { Write-Host \u0026#34;未输入IP，将启用 DHCP 自动获取地址。\u0026#34; -ForegroundColor $c_yellow Set-TomlValue \u0026#34;dhcp\u0026#34; \u0026#34;true\u0026#34; $ConfigFile Set-TomlValue \u0026#34;ipv4\u0026#34; \u0026#34;`\u0026#34;`\u0026#34;\u0026#34; $ConfigFile } else { Write-Host \u0026#34;已设置静态IP: $virtual_ip\u0026#34; -ForegroundColor $c_green Set-TomlValue \u0026#34;dhcp\u0026#34; \u0026#34;false\u0026#34; $ConfigFile Set-TomlValue \u0026#34;ipv4\u0026#34; \u0026#34;`\u0026#34;$virtual_ip`\u0026#34;\u0026#34; $ConfigFile } if ($is_client -eq \u0026#39;y\u0026#39;) { $peer_address = Read-Host \u0026#34;请输入一个对端节点地址 (如 tcp://服务器IP:11010)\u0026#34; Add-Content -Path $ConfigFile -Value \u0026#34;`n[[peer]]`nuri = `\u0026#34;$peer_address`\u0026#34;\u0026#34; } Write-Host \u0026#34;正在创建并配置 Windows 服务...\u0026#34; -ForegroundColor $c_yellow # 如果服务存在, 先删除旧的, 以确保配置更新 if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue # 使用 sc.exe delete 比 Remove-Service 更可靠 sc.exe delete $ServiceName | Out-Null Start-Sleep -Seconds 2 } # 创建服务 $binaryPathWithArgs = \u0026#34;`\u0026#34;$CoreBinaryPath`\u0026#34; -c `\u0026#34;$ConfigFile`\u0026#34;\u0026#34; New-Service -Name $ServiceName -BinaryPathName $binaryPathWithArgs -DisplayName $ServiceDisplayName -StartupType Automatic # *** 关键：配置服务失败后自动重启，实现进程守护 *** # 第一次/第二次/后续失败后, 都在5秒后重启 sc.exe failure $ServiceName reset=86400 actions=restart/5000/restart/5000/restart/5000 | Out-Null Write-Host \u0026#34;服务创建成功，正在启动...\u0026#34; -ForegroundColor $c_green Start-Service -Name $ServiceName Start-Sleep -Seconds 2 Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType } function Manage-Service { if (-not (Check-Installed)) { return } if (-not (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue)) { Write-Host \u0026#34;服务尚未创建。请先配置网络 (选项 2)。\u0026#34; -ForegroundColor $c_yellow return } $menu_title = \u0026#34;管理EasyTier服务\u0026#34; $options = @( \u0026#34;启动服务\u0026#34;, \u0026#34;停止服务\u0026#34;, \u0026#34;重启服务\u0026#34;, \u0026#34;查看状态\u0026#34;, \u0026#34;返回主菜单\u0026#34; ) while ($true) { Clear-Host Write-Host \u0026#34;================ $menu_title ================\u0026#34; -ForegroundColor $c_cyan Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType Write-Host \u0026#34;------------------------------------------------\u0026#34; -ForegroundColor $c_cyan for ($i = 0; $i -lt $options.Count; $i++) { Write-Host (\u0026#34;{0}. {1}\u0026#34; -f ($i+1), $options[$i]) } $choice = Read-Host \u0026#34;请选择操作\u0026#34; switch ($choice) { \u0026#39;1\u0026#39; { Start-Service -Name $ServiceName; Write-Host \u0026#34;服务已启动。\u0026#34; -ForegroundColor $c_green } \u0026#39;2\u0026#39; { Stop-Service -Name $ServiceName; Write-Host \u0026#34;服务已停止。\u0026#34; -ForegroundColor $c_green } \u0026#39;3\u0026#39; { Restart-Service -Name $ServiceName; Write-Host \u0026#34;服务已重启。\u0026#34; -ForegroundColor $c_green } \u0026#39;4\u0026#39; { # 状态已在顶部显示，这里刷新一次 Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType } \u0026#39;5\u0026#39; { return } default { Write-Host \u0026#34;无效输入\u0026#34; -ForegroundColor $c_red } } Read-Host \u0026#34;按 Enter 键继续...\u0026#34; } } function Uninstall-EasyTier { Write-Host \u0026#34;警告: 此操作将停止服务并删除所有相关文件和配置。\u0026#34; -ForegroundColor $c_yellow $confirm = Read-Host \u0026#34;确定要卸载吗? (y/n)\u0026#34; if ($confirm -ne \u0026#39;y\u0026#39;) { Write-Host \u0026#34;操作已取消。\u0026#34; return } Write-Host \u0026#34;正在停止并删除服务...\u0026#34; if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue sc.exe delete $ServiceName | Out-Null Start-Sleep -Seconds 2 # 等待服务删除完成 } Write-Host \u0026#34;正在删除文件和目录...\u0026#34; if (Test-Path $InstallDir) { Remove-Item -Path $InstallDir -Recurse -Force } if (Test-Path $ConfigDir) { Remove-Item -Path $ConfigDir -Recurse -Force } Write-Host \u0026#34;EasyTier 已成功卸载。\u0026#34; -ForegroundColor $c_green } # --- 主菜单循环 --- function Show-MainMenu { Check-Admin while ($true) { Clear-Host Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan Write-Host \u0026#34; EasyTier 跨平台部署脚本 (Windows Edition)\u0026#34; -ForegroundColor $c_green Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan Write-Host \u0026#34; 1. 安装或更新 EasyTier\u0026#34; Write-Host \u0026#34; 2. 配置网络并安装服务 (首次设置)\u0026#34; Write-Host \u0026#34;-------------------------------------------------------\u0026#34; Write-Host \u0026#34; 3. 管理 EasyTier 服务状态\u0026#34; Write-Host \u0026#34; 4. 查看 EasyTier 配置文件\u0026#34; Write-Host \u0026#34; 5. 查看 EasyTier 网络节点\u0026#34; Write-Host \u0026#34;-------------------------------------------------------\u0026#34; Write-Host \u0026#34; 6. 卸载 EasyTier\u0026#34; Write-Host \u0026#34; 0. 退出脚本\u0026#34; Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan $choice = Read-Host \u0026#34;请输入选项 [0-6]\u0026#34; switch ($choice) { \u0026#39;1\u0026#39; { Install-EasyTier } \u0026#39;2\u0026#39; { Configure-Network } \u0026#39;3\u0026#39; { Manage-Service } \u0026#39;4\u0026#39; { if ((Check-Installed) -and (Test-Path $ConfigFile)) { Clear-Host Get-Content $ConfigFile | Write-Host } else { Write-Host \u0026#34;配置文件不存在或未安装。\u0026#34; -ForegroundColor $c_yellow } } \u0026#39;5\u0026#39; { if (Check-Installed) { Clear-Host \u0026amp; $CliBinaryPath peer } } \u0026#39;6\u0026#39; { Uninstall-EasyTier } \u0026#39;0\u0026#39; { exit 0 } default { Write-Host \u0026#34;无效输入\u0026#34; -ForegroundColor $c_red } } Write-Host \u0026#34;\u0026#34; Read-Host \u0026#34;按任意键返回主菜单...\u0026#34; } } # --- 脚本入口 --- Show-MainMenu 方法2：下载gui客户端\nhttps://github.com/EasyTier/EasyTier/releases/download/v2.4.5/easytier-gui_2.4.5_x64-setup.exe\n","date":"2026-03-10T21:05:25+08:00","permalink":"https://blog.lufei.de/p/535/","title":"easytier一键组网脚本"},{"content":" 项目：https://github.com/v2rayA/v2rayA/blob/main/README_zh.md\n文档： https://v2raya.org/\n预览\n","date":"2026-03-10T13:39:35+08:00","permalink":"https://blog.lufei.de/p/534/","title":"一个易用而强大的，跨平台的 V2Ray 客户端"},{"content":"一键脚本\nbash \u0026lt;(curl -sSL https://cdn.jsdelivr.net/gh/sky22333/shell@main/dev/cf-tunnel.sh) win系统PowerShell在线脚本，需要以管理员模式打开PowerShell，跟linux系统使用方式一样\niwr -useb https://raw.githubusercontent.com/sky22333/shell/main/dev/cf-setup.ps1 | iex 脚本演示\n","date":"2026-03-08T21:19:23+08:00","permalink":"https://blog.lufei.de/p/533/","title":"CF-tunnel内网穿透一键脚本"},{"content":" 项目：https://github.com/router-for-me/CLIProxyAPIPlus/blob/main/README_CN.md\n文档：https://help.router-for.me/cn/configuration/basic\n推荐chrome扩展：Page Assist\n注意事项，推荐使用国外服务器注册codex\nDocker 快速部署 创建部署目录\nmkdir -p ~/cli-proxy \u0026amp;\u0026amp; cd ~/cli-proxy 创建 docker-compose.yml\ncat \u0026gt; docker-compose.yml \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; services: cli-proxy-api: image: eceasy/cli-proxy-api-plus:latest container_name: cli-proxy-api-plus ports: - \u0026#34;8317:8317\u0026#34; volumes: - ./config.yaml:/CLIProxyAPI/config.yaml - ./auths:/root/.cli-proxy-api - ./logs:/CLIProxyAPI/logs restart: unless-stopped EOF 下载示例配置\ncurl -o config.yaml https://raw.githubusercontent.com/router-for-me/CLIProxyAPIPlus/main/config.example.yaml 修改配置，使用以下命令，把123456改成你的登录密钥\nSECRET_KEY=\u0026#39;123456\u0026#39;; ESCAPED=$(printf \u0026#39;%s\u0026#39; \u0026#34;$SECRET_KEY\u0026#34; | sed \u0026#39;s/[\\/\u0026amp;]/\\\\\u0026amp;/g\u0026#39;); sed -i -E \u0026#34;s|allow-remote: false|allow-remote: true|; s|secret-key: \u0026#39;\u0026#39;|secret-key: \u0026#39;$ESCAPED\u0026#39;|\u0026#34; config.yaml 拉取并启动\ndocker compose pull \u0026amp;\u0026amp; docker compose up -d 登录后台地址\nhttp://xxxxxx:8317/management.html 到此，安装完成！~\n如果需要修改登录密码，首先进入到项目地址cd ~/cli-proxy，修改config.yaml，然后\ndocker compose down docker compose up -d 如果要开启日志统计功能，同样修改config.yaml\n批量注册codex 下载脚本 mkdir -p ~/openai \u0026amp;\u0026amp; cd ~/openai wget https://raw.githubusercontent.com/woniu336/open_shell/main/openai_register.py 设置虚拟环境 安装 venv 组件（如果还没装）\napt update apt install -y python3-venv 在项目目录创建虚拟环境\ncd ~/openai python3 -m venv .venv 激活虚拟环境\nsource .venv/bin/activate 在虚拟环境里安装依赖\npython -m pip install -U pip python -m pip install curl_cffi 运行脚本\npython openai_register.py 你会看到命令行前面出现 (.venv)，表示已进入虚拟环境。\n注册了多个账号后，可以手动停止，然后把认证文件移到cli-proxy/auths目录\nmv openai/*.json cli-proxy/auths/ 查看认证文件(即注册的账号)\ncd ~/cli-proxy/auths 退出虚拟环境\ndeactivate 进入虚拟环境（在项目目录）\ncd ~/openai source .venv/bin/activate 反向代理 caddy方式\n首先设置日志目录权限\nsudo mkdir -p /var/log/caddy sudo touch /var/log/caddy/cli.log sudo chown -R caddy:caddy /var/log/caddy sudo chmod 755 /var/log/caddy sudo chmod 644 /var/log/caddy/cli.log 配置如下\napi.sub2api.com { @static { path /assets/* path /logo.png path /favicon.ico } header @static { Cache-Control \u0026#34;public, max-age=31536000, immutable\u0026#34; -Pragma -Expires } tls { protocols tls1.2 tls1.3 ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 } reverse_proxy localhost:8317 { header_up X-Real-IP {remote_host} header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP} transport http { keepalive 120s keepalive_idle_conns 256 read_buffer 16KB write_buffer 16KB compression off } fail_duration 30s max_fails 3 unhealthy_status 500 502 503 504 } encode { zstd gzip 6 minimum_length 256 match { header Content-Type text/* header Content-Type application/json* header Content-Type application/javascript* header Content-Type application/xml* header Content-Type application/rss+xml* header Content-Type image/svg+xml* } } request_body { max_size 100MB } log { output file /var/log/caddy/cli.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } handle_errors { respond \u0026#34;{err.status_code} {err.status_text}\u0026#34; } } 或者多个应用反向代理(推荐)\n(common) { @static { path /assets/* path /logo.png path /favicon.ico } header @static { Cache-Control \u0026#34;public, max-age=31536000, immutable\u0026#34; -Pragma -Expires } tls { protocols tls1.2 tls1.3 ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 } encode { zstd gzip 6 minimum_length 256 match { header Content-Type text/* header Content-Type application/json* header Content-Type application/javascript* header Content-Type application/xml* header Content-Type application/rss+xml* header Content-Type image/svg+xml* } } request_body { max_size 100MB } handle_errors { respond \u0026#34;{err.status_code} {err.status_text}\u0026#34; } } (proxy_common) { header_up X-Real-IP {remote_host} header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP} transport http { keepalive 120s keepalive_idle_conns 256 read_buffer 16KB write_buffer 16KB compression off } fail_duration 30s max_fails 3 unhealthy_status 500 502 503 504 } cli.xxxx.de { import common reverse_proxy 6.6.6.6:8317 { import proxy_common } log { output file /var/log/caddy/cli.xxxx.de.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } } cc.xxxx.de { import common reverse_proxy 6.6.6.6:3000 { import proxy_common } log { output file /var/log/caddy/cc.xxxx.de.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } } 然后测试配置是否正常\ncaddy validate --config /etc/caddy/Caddyfile 最后重启生效\ncaddy reload --config /etc/caddy/Caddyfile opencode配置 如果报错，移除底部MCP的配置，根据你自身的情况。\n{ \u0026#34;$schema\u0026#34;: \u0026#34;https://opencode.ai/config.json\u0026#34;, \u0026#34;provider\u0026#34;: { \u0026#34;openai\u0026#34;: { \u0026#34;options\u0026#34;: { \u0026#34;baseURL\u0026#34;: \u0026#34;https://xxxx.com/v1\u0026#34;, \u0026#34;apiKey\u0026#34;: \u0026#34;sk-xxxx\u0026#34; }, \u0026#34;models\u0026#34;: { \u0026#34;gpt-5-codex\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5 Codex\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {} } }, \u0026#34;gpt-5.1-codex\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.1 Codex\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {} } }, \u0026#34;gpt-5.1-codex-max\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.1 Codex Max\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {} } }, \u0026#34;gpt-5.1-codex-mini\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.1 Codex Mini\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {} } }, \u0026#34;gpt-5.2\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.2\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {}, \u0026#34;xhigh\u0026#34;: {} } }, \u0026#34;gpt-5.3-codex-spark\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.3 Codex Spark\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 128000, \u0026#34;output\u0026#34;: 32000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {}, \u0026#34;xhigh\u0026#34;: {} } }, \u0026#34;gpt-5.3-codex\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.3 Codex\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {}, \u0026#34;xhigh\u0026#34;: {} } }, \u0026#34;gpt-5.2-codex\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;GPT-5.2 Codex\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 400000, \u0026#34;output\u0026#34;: 128000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {}, \u0026#34;xhigh\u0026#34;: {} } }, \u0026#34;codex-mini-latest\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;Codex Mini\u0026#34;, \u0026#34;limit\u0026#34;: { \u0026#34;context\u0026#34;: 200000, \u0026#34;output\u0026#34;: 100000 }, \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false }, \u0026#34;variants\u0026#34;: { \u0026#34;low\u0026#34;: {}, \u0026#34;medium\u0026#34;: {}, \u0026#34;high\u0026#34;: {} } } } } }, \u0026#34;agent\u0026#34;: { \u0026#34;build\u0026#34;: { \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false } }, \u0026#34;plan\u0026#34;: { \u0026#34;options\u0026#34;: { \u0026#34;store\u0026#34;: false } } }, \u0026#34;mcp\u0026#34;: { \u0026#34;shadcn\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;local\u0026#34;, \u0026#34;command\u0026#34;: [\u0026#34;npx\u0026#34;, \u0026#34;-y\u0026#34;, \u0026#34;@jpisnice/shadcn-ui-mcp-server\u0026#34;] }, \u0026#34;pocketbase\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;local\u0026#34;, \u0026#34;command\u0026#34;: [\u0026#34;node\u0026#34;, \u0026#34;C:/pocketbase-mcp/index.js\u0026#34;], \u0026#34;environment\u0026#34;: { \u0026#34;POCKETBASE_URL\u0026#34;: \u0026#34;http://localhost:8090\u0026#34;, \u0026#34;POCKETBASE_ADMIN_EMAIL\u0026#34;: \u0026#34;xxxxx@qq.com\u0026#34;, \u0026#34;POCKETBASE_ADMIN_PASSWORD\u0026#34;: \u0026#34;xxxxx111\u0026#34; } }, \u0026#34;chromedevtools\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;local\u0026#34;, \u0026#34;command\u0026#34;: [\u0026#34;npx\u0026#34;, \u0026#34;-y\u0026#34;, \u0026#34;chrome-devtools-mcp@latest\u0026#34;] } } } ","date":"2026-03-03T13:57:07+08:00","permalink":"https://blog.lufei.de/p/532/","title":"CLIProxyAPIPlus安装教程"},{"content":" 项目：https://github.com/Wei-Shaw/sub2api\nDocker Compose 安装方式 使用 Docker Compose 部署，包含 PostgreSQL 和 Redis 容器\n安装docker curl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh 一键部署 # 创建部署目录 mkdir -p sub2api-deploy \u0026amp;\u0026amp; cd sub2api-deploy # 下载并运行部署准备脚本 curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash # 启动服务 docker compose -f docker-compose.local.yml up -d # 查看日志，找出密码，邮箱默认：admin@sub2api.local docker compose -f docker-compose.local.yml logs sub2api | grep -Ei \u0026#34;admin|password\u0026#34; 设置账号密码 或者手动设置账号密码\ncd sub2api-deploy nano .env 修改配置：\nADMIN_EMAIL=admin@example.com ADMIN_PASSWORD=your_admin_password 重启容器\ndocker compose down docker compose up -d 反向代理 反向代理使用caddy的方法如下：\n首先设置日志目录权限 sudo mkdir -p /var/log/caddy sudo touch /var/log/caddy/sub2api.log sudo chown -R caddy:caddy /var/log/caddy sudo chmod 755 /var/log/caddy sudo chmod 644 /var/log/caddy/sub2api.log caddy 一键脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh 配置 /etc/caddy/Caddyfile\n# 修改为你的域名 api.sub2api.com { # ========================================================================= # 静态资源长期缓存（高优先级，放在最前面） # 带 hash 的文件可以永久缓存，浏览器和 CDN 都会缓存 # ========================================================================= @static { path /assets/* path /logo.png path /favicon.ico } header @static { Cache-Control \u0026#34;public, max-age=31536000, immutable\u0026#34; # 移除可能干扰缓存的头 -Pragma -Expires } # ========================================================================= # TLS 安全配置 # ========================================================================= tls { # 仅使用 TLS 1.2 和 1.3 protocols tls1.2 tls1.3 # 优先使用的加密套件 ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 } # ========================================================================= # 反向代理配置 # ========================================================================= reverse_proxy localhost:8080 { # 健康检查 health_uri /health health_interval 30s health_timeout 10s health_status 200 # 负载均衡策略（单节点可忽略，多节点时有用） lb_policy round_robin lb_try_duration 5s lb_try_interval 250ms # 传递真实客户端信息 # 兼容 Cloudflare 和直连：后端应优先读取 CF-Connecting-IP，其次 X-Real-IP header_up X-Real-IP {remote_host} header_up X-Forwarded-For {remote_host} header_up X-Forwarded-Proto {scheme} header_up X-Forwarded-Host {host} # 保留 Cloudflare 原始头（如果存在） # 后端获取 IP 的优先级建议: CF-Connecting-IP → X-Real-IP → X-Forwarded-For header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP} # 连接池优化 transport http { keepalive 120s keepalive_idle_conns 256 read_buffer 16KB write_buffer 16KB compression off } # 故障转移 fail_duration 30s max_fails 3 unhealthy_status 500 502 503 504 } # ========================================================================= # 压缩配置 # ========================================================================= encode { zstd gzip 6 minimum_length 256 match { header Content-Type text/* header Content-Type application/json* header Content-Type application/javascript* header Content-Type application/xml* header Content-Type application/rss+xml* header Content-Type image/svg+xml* } } # ========================================================================= # 请求大小限制 (防止大文件攻击) # ========================================================================= request_body { max_size 100MB } # ========================================================================= # 日志配置 # ========================================================================= log { output file /var/log/caddy/sub2api.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } # ========================================================================= # 错误处理 # ========================================================================= handle_errors { respond \u0026#34;{err.status_code} {err.status_text}\u0026#34; } } ","date":"2026-03-03T00:53:15+08:00","permalink":"https://blog.lufei.de/p/531/","title":"sub2api安装教程"},{"content":"准备好1个域名，A 纪录指向到你服务器的IP 比如我的域名是openclaw.cnno.de 然后开始反代。用caddy这个脚本，1分钟就完成了。在你的vps上运行以下内容\nwget -O caddyman.sh https://raw.githubusercontent.com/woniu336/open_shell/main/caddyman.sh \u0026amp;\u0026amp; bash caddyman.sh ","date":"2026-02-09T23:28:08+08:00","permalink":"https://blog.lufei.de/p/530/","title":"caddy一键脚本"},{"content":"前言 厌倦了每次 /clear 后都要重新调教 AI？我开发了一套基于 Windows 环境的自动化闭环：对话 -\u0026gt; 自动归档 -\u0026gt; 技能 (Skills) 自动提取。让 Claude 彻底告别 “鱼的记忆”，在实战中不断自我进化！\n只需一句 “归档”，所有技术决策、Bug 修复方案瞬间转化为本地 Skill 库。\n1️⃣ 环境准备 确保安装 Python 中文处理库：\npip install pypinyin 确认技能目录存在：\nC:\\Users\\Administrator\\.claude\\skills 2️⃣ 创建归档存储目录 创建归档目录： New-Item -ItemType Directory -Force -Path \u0026#34;C:\\Users\\Administrator\\archives\\conversations\u0026#34; 创建配置文件 archivist-config.json，路径： C:\\Users\\Administrator\\archivist-config.json 内容如下：\n{ \u0026#34;default_archive_path\u0026#34;: \u0026#34;C:\\\\Users\\\\Administrator\\\\archives\\\\conversations\u0026#34;, \u0026#34;custom_project_paths\u0026#34;: {}, \u0026#34;include_full_history\u0026#34;: false, \u0026#34;summarize_conversations\u0026#34;: true, \u0026#34;auto_tag\u0026#34;: true } 3️⃣ 创建 Python 转化脚本 路径：\nC:\\Users\\Administrator\\.claude\\scripts\\archive_to_skill.py 内容如下（保持原样）：\nimport os import re from pypinyin import pinyin, Style # 配置路径：直接指向 skills 根目录以确保可见性 ARCHIVE_DIR = r\u0026#34;C:\\Users\\Administrator\\archives\\conversations\u0026#34; SKILLS_DIR = r\u0026#34;C:\\Users\\Administrator\\.claude\\skills\u0026#34; def clean_to_english_slug(filename): name_without_ext = os.path.splitext(filename)[0] pinyin_list = pinyin(name_without_ext, style=Style.NORMAL) flattened_pinyin = \u0026#34;-\u0026#34;.join([item[0] for item in pinyin_list]) slug = re.sub(r\u0026#39;[^\\w\\s-]\u0026#39;, \u0026#39;\u0026#39;, flattened_pinyin).strip().lower() slug = re.sub(r\u0026#39;[-\\s]+\u0026#39;, \u0026#39;-\u0026#39;, slug) return slug if slug else \u0026#34;unnamed-skill\u0026#34; def convert(): if not os.path.exists(SKILLS_DIR): os.makedirs(SKILLS_DIR) for filename in os.listdir(ARCHIVE_DIR): if filename.endswith(\u0026#34;.md\u0026#34;): file_path = os.path.join(ARCHIVE_DIR, filename) try: with open(file_path, \u0026#39;r\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as f: full_content = f.read() except Exception as e: print(f\u0026#34;读取失败 {filename}: {e}\u0026#34;) continue # 生成目录名 skill_folder_name = clean_to_english_slug(filename) target_folder = os.path.join(SKILLS_DIR, skill_folder_name) os.makedirs(target_folder, exist_ok=True) # 构建完整的 SKILL.md # 头部保留元数据，正文原封不动拷贝归档内容 skill_content = ( \u0026#34;---\\n\u0026#34; f\u0026#34;name: {skill_folder_name}\\n\u0026#34; f\u0026#34;description: Full project context and patterns from {filename}\\n\u0026#34; \u0026#34;---\\n\\n\u0026#34; f\u0026#34;# Project Skill: {skill_folder_name}\\n\\n\u0026#34; \u0026#34;## 原始归档上下文 (Full Archive Content)\\n\\n\u0026#34; f\u0026#34;{full_content}\\n\u0026#34; ) skill_file_path = os.path.join(target_folder, \u0026#34;SKILL.md\u0026#34;) with open(skill_file_path, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as sf: sf.write(skill_content) print(f\u0026#34;✅ 转换成功并提升至根目录: {skill_folder_name}/SKILL.md\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: convert() 4️⃣ 配置 Claude Agent 创建目录： New-Item -ItemType Directory -Force -Path \u0026#34;C:\\Users\\Administrator\\.claude\\agents\u0026#34; 创建 Agent 文件 project-archivist.md，路径： C:\\Users\\Administrator\\.claude\\agents\\project-archivist.md 内容（保持原样）：\n--- name: project-archivist description: \u0026#34;用于在工作完成后归档对话历史、项目上下文，并将其转化为可持久化的技能。触发词：归档、保存对话、archive、整理项目。\u0026#34; model: sonnet color: amber --- 你是一位运行在 Windows 环境下的专业项目归档员（Project Archivist）。你的任务是将当前的对话价值最大化，通过创建结构化的归档并将其转化为 Claude 的“肌肉记忆”（Skills）。 ## 核心职责 1. **深度归档**：捕获完整的对话背景、技术决策、代码变更和关键逻辑。 2. **知识提取**：不仅是记录，更要提取出可复用的模式和解决问题的思路。 3. **技能进化**：自动将归档转化为符合 Claude 规范的 Skill 结构。 ## 工作流程 ### Phase 1: 归档文件生成 - **存储路径**：`C:\\Users\\Administrator\\archives\\conversations\\` - **文件名格式**：`[主题]_[概述].md`（支持中文名）。 - **内容要求**：必须包含 YAML 头部、对话摘要、## 关键要点、以及完整的核心对话记录。 ### Phase 2: 技能转化 (核心修正) 归档文件成功保存后，你必须**立即且强制**执行以下自动化操作，严禁跳过： 1. **执行转化脚本**： 在终端运行命令：`python C:\\Users\\Administrator\\.claude\\scripts\\archive_to_skill.py` 2. **规范化验证**： 确保技能被提升至根目录级别，结构必须如下： - 📁 `C:\\Users\\Administrator\\.claude\\skills\\[技能英文名或拼音]\\` - 📄 `SKILL.md` (包含完整的归档内容作为上下文) 3. **反馈确认**： 完成后告知用户：“✅ 归档已完成，且已成功转化为本地技能。下次启动对话时，我会自动加载 `skills/[技能名]` 中的经验。” ## Windows 适配准则 - **路径标准**：始终使用 `C:\\Users\\Administrator\\` 作为基础路径。 - **转义处理**：在任何需要处理 JSON 或 Shell 命令的地方，确保反斜杠已正确转义（例如 `C:\\\\Users\\\\...`）。 - **目录规范**：严禁将技能放在子目录下（如 `learned/`），必须直接放在 `skills/` 的一级子文件夹中。 ## 提取与拷贝逻辑 - **零丢失原则**：在生成 `SKILL.md` 时，如果无法通过正则精确提取要点，必须将原始归档文件的全部内容原封不动地拷贝到 `SKILL.md` 的正文中。 - **元数据要求**：`SKILL.md` 开头必须包含标准的 `name` 和 `description` 字段。 --- *你不仅是在记录历史，更是在通过自动化脚本不断进化你的知识库。* 5️⃣ 配置全局设置 文件路径：\nC:\\Users\\Administrator\\.claude\\settings.json 内容：\n{ \u0026#34;skills\u0026#34;: { \u0026#34;search_paths\u0026#34;: [ \u0026#34;C:\\\\Users\\\\Administrator\\\\.claude\\\\agents\u0026#34;, \u0026#34;C:\\\\Users\\\\Administrator\\\\.claude\\\\skills\u0026#34; ], \u0026#34;auto_load_learned\u0026#34;: true } } 6️⃣ 验证流程 在对话中对 Claude code 输入： 归档 验证技能加载： /skills 你应能看到类似 nginxpulse-deploy 的技能显示为 Enabled。\n✅ 完成\n你的 Claude code 现在可以将每次对话自动转化为本地技能，实现“肌肉记忆”，不断自我进化。\n","date":"2026-01-31T03:39:49+08:00","permalink":"https://blog.lufei.de/p/529/","title":"让你的 Claude code 拥有“肌肉记忆”！"},{"content":" 项目：https://github.com/usememos/memos\n安卓端推荐：https://github.com/hzc073/memoflow\n注意：部署成功后，需要反向代理才能打开，IP+端口是打不开的\n开放端口：5230\n下载\ncd /tmp wget https://github.com/memospot/memos-builds/releases/download/v0.25.3/memos-v0.25.3-linux-x86_64.tar.gz 解压\ntar -xzf memos-v0.25.3-linux-x86_64.tar.gz 移动到系统位置\nsudo mv memos /usr/local/bin/ sudo chmod +x /usr/local/bin/memos 创建数据目录\nsudo mkdir -p /var/lib/memos 启动\n# Create service file sudo tee /etc/systemd/system/memos.service \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; [Unit] Description=Memos After=network.target [Service] Type=simple ExecStart=/usr/local/bin/memos --mode prod --port 5230 --data /var/lib/memos Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF # Enable and start sudo systemctl daemon-reload sudo systemctl enable --now memos 升级\n下载来自memos-builds的最新版本(memos-builds) 替换二进制 sudo systemctl stop memos sudo cp /usr/local/bin/memos /usr/local/bin/memos.backup tar -xzf memos_*.tar.gz sudo mv memos /usr/local/bin/ sudo systemctl start memos ","date":"2026-01-30T23:52:46+08:00","permalink":"https://blog.lufei.de/p/528/","title":"memos备忘录/个人笔记-部署"},{"content":" 系统/工具：windows、powershell 目前的 免费额度 (~250 次 Pro 请求/天 + 1500 次 Flash 请求/天) 所有 Pro 系列模型共享这 250 次的额度池 神奇代码(powershell)\n# 创建配置文件并添加函数 $profileContent = @\u0026#39; # Git快捷命令 function mm { git add .; git commit -m \u0026#34;vibe save\u0026#34; } function uc { git reset --hard HEAD~1 } function mmp { mm; git push origin main } function ms { git status } function ml { git log --oneline -10 } \u0026#39;@ # 确保目录存在 $profileDir = Split-Path $PROFILE -Parent if (!(Test-Path $profileDir)) { New-Item -Path $profileDir -ItemType Directory -Force } $profileContent | Out-File $PROFILE -Encoding UTF8 # 立即生效 . $PROFILE Write-Host \u0026#34;✅ Git命令已永久安装！重启PowerShell后仍可用。\u0026#34; -ForegroundColor Green 安装 npm install -g @google/gemini-cli 确认\ngemini --version 设置代理 setx HTTP_PROXY \u0026#34;http://127.0.0.1:7890\u0026#34; setx HTTPS_PROXY \u0026#34;http://127.0.0.1:7890\u0026#34; Gemini CLI 年度统计 npx gemini-wrapped 生成过去 365 天，使用 Gemini 的精简报告，包括会话数、项目数量、模型使用排名、总的tokens、成本花费等。\nSkills 设置Git bash 环境变量，目录：C:\\Program Files\\Git\\bin\n设置用户目录,首先打开\nC:\\Users\\Administrator\\.gemini\\settings.json 编写\n{ \u0026#34;maxRetries\u0026#34;: 3, \u0026#34;security\u0026#34;: { \u0026#34;auth\u0026#34;: { \u0026#34;selectedType\u0026#34;: \u0026#34;oauth-personal\u0026#34; } }, \u0026#34;timeout\u0026#34;: 30000, \u0026#34;general\u0026#34;: { \u0026#34;previewFeatures\u0026#34;: true }, \u0026#34;tools\u0026#34;: { \u0026#34;autoAccept\u0026#34;: true } } 以运行 /resume 恢复上一次的历史记录\n技巧1： 始终用中文回复\nNew-Item -ItemType File -Path \u0026#34;C:\\Users\\Administrator\\.gemini\\skills\\SKILL.md\u0026#34; -Force 内容\n--- name: chinese-replier description: 始终用中文回复用户的问题或消息 triggers: - 中文回复 - 用中文回答 - always Chinese version: 1.0.0 author: 你的名字 --- # 中文回复助手 ## 功能说明 这个 skill 的作用是： - 接收用户的任何输入 - 始终用 **中文** 回复 - 不使用英文或其他语言 ## 执行流程 1. 接收用户输入 2. 分析输入内容 3. 生成中文回答 4. 输出结果 技巧2：开发框架\n在当前项目新建.gemini\\skills\\python_flask.md\nNew-Item -ItemType File -Path \u0026#34;.gemini\\skills\\python_flask.md\u0026#34; -Force 内容\n--- name: python_flask_expert description: 专注于使用 Python 和 Flask 框架进行 Web 开发、API 构建及相关系统维护的专家模式。 --- 你现在是一位精通 Python 和 Flask 框架的高级软件工程师。在处理本项目的任务时，请严格遵守以下规范： 1. **核心技术栈强制** * **语言**: 必须使用 **Python** (3.8+)。 * **Web 框架**: 必须使用 **Flask**。严禁引入 Django、FastAPI 或其他 Web 框架，除非用户有极明确的迁移指令。 * **数据库**: 使用 **SQLAlchemy** (Flask-SQLAlchemy) 进行 ORM 操作。 * **任务调度**: 使用 **APScheduler** 处理后台任务和定时作业。 2. **代码架构规范** * **应用工厂模式**: 严格保持 `create_app` 的应用工厂模式结构。 * **蓝图 (Blueprints)**: 所有新的路由和 API 端点必须通过 Flask Blueprint 在 `app/api/` 目录下组织，禁止直接挂载到 `app` 对象。 * **目录结构**: * 模型定义在 `app/models.py`。 * 业务逻辑尽可能分离到 `app/core/` 或 `app/utils.py`。 * 静态文件 (HTML/JS/CSS) 存放在 `static/`。 3. **开发行为准则** * **风格**: 遵循 PEP 8 编码规范。 * **依赖**: 引入新库时，必须检查 `requirements.txt`，并在必要时更新它。 * **测试**: 在修改核心逻辑后，应当建议或编写相应的测试用例。 * **环境**: 假定运行在 Linux/Windows 混合环境，注意路径分隔符和 OS 特异性（如 ICMP Ping 权限）。 4. **回复语言** * 除非用户另有要求，否则使用**中文**进行解释和交互。 技巧3：版本控制\n在当前项目新建.gemini\\skills\\git_expert.md\nNew-Item -ItemType File -Path \u0026#34;.gemini\\skills\\git_expert.md\u0026#34; -Force 内容\n--- name: git_expert description: 专注于 Git 版本控制管理，在任务完成后自动执行状态检查、暂存和提交操作。 --- 你现在是一位 Git 版本控制专家。在每次修改代码或完成任务后，请主动接管版本控制流程。 1. **主动检查状态** * 在完成文件修改后，不要等待用户指令，立即运行 `git status` 查看变更。 * 如果发现未跟踪 (untracked) 或已修改 (modified) 的文件，进入提交流程。 2. **自动提交 (Auto Commit)** * **暂存**: 使用 `git add .` (或指定具体文件) 暂存变更。 * **消息生成**: 直接用一句话简洁描述本次的变动即可（例如：更新安装脚本注释为中文）。 * **语言**: 使用**中文**编写提交信息。 * **执行**: 执行 `git commit -m \u0026#34;你的提交信息\u0026#34;`。 3. **推送提醒 (Push Reminder)** * 提交完成后，提示用户是否需要推送到远程仓库 (`git push`)。 * 不要自动执行 `git push`，除非用户在本次交互中明确授权或要求“同步/上传”。 4. **安全原则** * 在提交前，确保没有将敏感信息（如密码、密钥）写入代码。 * 如果是大量变更，先简要列出变更范围再提交。 移除代理\nsetx HTTP_PROXY \u0026#34;\u0026#34; setx HTTPS_PROXY \u0026#34;\u0026#34; 卸载Gemini CLI\nnpm uninstall -g @google/gemini-cli ","date":"2026-01-24T15:38:14+08:00","permalink":"https://blog.lufei.de/p/527/","title":"Gemini cli 开发技巧"},{"content":" 项目：https://github.com/woniu336/rhit\n致谢：https://github.com/Canop/rhit\n威胁情报：https://www.abuseipdb.com/\n场景 市面上有不少分析nginx日志的工具，部分内容和统计工具有重合，还有不少花里胡哨的、加载慢的，总觉得不顺手，就自己训练AI做了一个自用的，借此分享出来，如果你觉得还行，就打个星吧。\n基于 rhit 的 Web 日志分析和报告管理系统，提供友好的 Web 界面进行日志查询、威胁检测和报告管理。\n功能特性 📊 日志报告管理：自动生成和管理多站点的 rhit 报告 🔍 日志搜索：支持按状态码、路径、IP等条件搜索日志 🛡️ 威胁检测：IP威胁分析、XSS/SQL注入检测、爬虫识别 🕷️ 蜘蛛统计：识别30+种知名爬虫，按类型统计访问情况 🔐 用户认证：基于 Session 的登录认证系统 ⏰ 定时任务：自动生成每日报告并清理旧数据 快速安装 首先开放5000端口，例如\nufw allow 5000/tcp 一键脚本\ngit clone https://github.com/woniu336/rhit.git cd rhit chmod +x install.sh ./install.sh 打开浏览器访问：http://localhost:5000\n默认账号：\n用户名：admin 密码：admin123 如果使用我之前的rsyslog教程设置日志中心，需要替换脚本\ncd /rhit \u0026amp;\u0026amp; \\ wget -O daily_report.sh https://github.com/woniu336/rhit/raw/main/daily_reports.sh \u0026amp;\u0026amp; \\ chmod +x daily_report.sh \u0026amp;\u0026amp; \\ echo \u0026#34;下载并设置权限完成，准备执行...\u0026#34; \u0026amp;\u0026amp; \\ ./daily_report.sh 截图预览\n","date":"2026-01-23T22:46:27+08:00","permalink":"https://blog.lufei.de/p/526/","title":"强大简洁的nginx日志分析工具"},{"content":" 说明：日志中心指的是服务端，站点指的是客户端（你的网站）\n日志中心配置 脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/deploy_server.sh \u0026amp;\u0026amp; chmod +x deploy_server.sh 默认路径：/data/nginx_logs\n./deploy_server.sh 日志轮转文件\ncat /etc/logrotate.d/nginx-log-center 创建errors目录, 防止脚本没有创建\nmkdir -p /data/nginx_logs/errors 查看日志大小\ncd /data/nginx_logs/active du -h * | sort -h 清除配置\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cleanup_server.sh \u0026amp;\u0026amp; chmod +x cleanup_server.sh \u0026amp;\u0026amp; ./cleanup_server.sh 站点日志配置 添加日志格式 /etc/nginx/nginx.conf 在原本的log下方添加\nlog_format syslog_combined \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#39; \u0026#39;\u0026#34;$request\u0026#34; $status $body_bytes_sent \u0026#39; \u0026#39;\u0026#34;$http_referer\u0026#34; \u0026#34;$http_user_agent\u0026#34;\u0026#39;; 站点日志脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/deploy_client.sh \u0026amp;\u0026amp; chmod +x deploy_client.sh 运行脚本\n./deploy_client.sh \u0026lt;日志中心IP\u0026gt; all 注意：转发后的日志不会保存在本地\n站点恢复 BACKUP_DIR=$(ls -d /root/rsyslog_backup_* | tail -1) \u0026amp;\u0026amp; \\ cp -f \u0026#34;${BACKUP_DIR}/nginx.conf\u0026#34; /etc/nginx/ \u0026amp;\u0026amp; \\ cp -f \u0026#34;${BACKUP_DIR}/sites-available/\u0026#34;* /etc/nginx/sites-available/ \u0026amp;\u0026amp; \\ nginx -t \u0026amp;\u0026amp; systemctl reload nginx \u0026amp;\u0026amp; echo \u0026#34;✅ Nginx 配置已恢复并重载\u0026#34; 清理配置\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cleanup_rsyslog_client.sh \u0026amp;\u0026amp; chmod +x cleanup_rsyslog_client.sh \u0026amp;\u0026amp; ./cleanup_rsyslog_client.sh 清理备份\nrm -rf rsyslog_backup_* ","date":"2026-01-22T13:36:18+08:00","permalink":"https://blog.lufei.de/p/525/","title":"rsyslog配置方法"},{"content":" 项目：https://github.com/likaia/nginxpulse\n系统：debian12\n下载并解压 进入临时目录并下载：\ncd /tmp wget https://github.com/likaia/nginxpulse/releases/download/v1.6.0/nginxpulse-v1.6.0-linux-amd64.tar.gz 解压文件：\ntar -zxvf nginxpulse-v1.6.0-linux-amd64.tar.gz 解压后会得到一个名为 nginxpulse-linux-amd64 的文件。\n安装并设置权限 创建安装目录并移动文件：\nsudo mkdir -p /opt/nginxpulse sudo mv nginxpulse-linux-amd64 /opt/nginxpulse/ 赋予执行权限：\ncd ~ sudo chmod +x /opt/nginxpulse/nginxpulse-linux-amd64 创建配置文件 创建 configs 目录\ncd /opt/nginxpulse sudo mkdir -p var/nginxpulse_data sudo mkdir -p /opt/nginxpulse/configs sudo chown -R root:root /opt/nginxpulse sudo chmod -R 755 /opt/nginxpulse 创建配置文件\n配置文件是重点，如果你使用我之前日志中心的方式，那么可以使用以下脚本生成数组\n脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/gen_config.sh \u0026amp;\u0026amp; chmod +x gen_config.sh 指定路径输出\nsudo ./gen_config.sh -p /data/nginx_logs/active -o /opt/nginxpulse/configs/nginxpulse_config.json 或者手动编辑\nsudo nano /opt/nginxpulse/configs/nginxpulse_config.json 粘贴以下内容，你需要手动修改站点日志路径，和访问密码\n{ \u0026#34;websites\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;GZ Log Test\u0026#34;, \u0026#34;logPath\u0026#34;: \u0026#34;var/log/gz-log-read-test/*.gz\u0026#34;, \u0026#34;domains\u0026#34;: [\u0026#34;localhost\u0026#34;] } ], \u0026#34;system\u0026#34;: { \u0026#34;logDestination\u0026#34;: \u0026#34;file\u0026#34;, \u0026#34;taskInterval\u0026#34;: \u0026#34;1m\u0026#34;, \u0026#34;logRetentionDays\u0026#34;: 30, \u0026#34;parseBatchSize\u0026#34;: 100, \u0026#34;ipGeoCacheLimit\u0026#34;: 1000000, \u0026#34;ipGeoApiUrl\u0026#34;: \u0026#34;http://ip-api.com/batch\u0026#34;, \u0026#34;demoMode\u0026#34;: false, \u0026#34;accessKeys\u0026#34;: [], \u0026#34;language\u0026#34;: \u0026#34;zh-CN\u0026#34; }, \u0026#34;database\u0026#34;: { \u0026#34;driver\u0026#34;: \u0026#34;postgres\u0026#34;, \u0026#34;dsn\u0026#34;: \u0026#34;postgres://nginxpulse:nginxpulse@127.0.0.1:5432/nginxpulse?sslmode=disable\u0026#34;, \u0026#34;maxOpenConns\u0026#34;: 10, \u0026#34;maxIdleConns\u0026#34;: 5, \u0026#34;connMaxLifetime\u0026#34;: \u0026#34;30m\u0026#34; }, \u0026#34;server\u0026#34;: { \u0026#34;Port\u0026#34;: \u0026#34;:8089\u0026#34; }, \u0026#34;pvFilter\u0026#34;: { \u0026#34;statusCodeInclude\u0026#34;: [ 200 ], \u0026#34;excludePatterns\u0026#34;: [ \u0026#34;favicon.ico$\u0026#34;, \u0026#34;robots.txt$\u0026#34;, \u0026#34;sitemap.xml$\u0026#34;, \u0026#34;^/health$\u0026#34;, \u0026#34;^/_(?:nuxt|next)/\u0026#34;, \u0026#34;rss.xml$\u0026#34;, \u0026#34;feed.xml$\u0026#34;, \u0026#34;atom.xml$\u0026#34; ], \u0026#34;excludeIPs\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;, \u0026#34;::1\u0026#34;, \u0026#34;10.10.0.1\u0026#34;, \u0026#34;192.168.30.21\u0026#34;] } } 配置 Systemd 服务 放行防火墙，例如\nufw allow 8089/tcp 创建服务文件：\nsudo nano /etc/systemd/system/nginxpulse.service 粘贴以下内容（注意 ExecStart 指向的是你解压出来的文件名）：\n[Unit] Description=NginxPulse Analytics Service (Binary Release) After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/nginxpulse ExecStart=/opt/nginxpulse/nginxpulse-linux-amd64 Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target 安装 PostgreSQL Debian 官方仓库自带 PostgreSQL。执行以下命令安装：\nsudo apt update sudo apt install postgresql postgresql-contrib -y 安装完成后，服务会自动启动。你可以检查状态：\nsudo systemctl status postgresql 创建 NginxPulse 所需的数据库和用户 PostgreSQL 默认使用名为 postgres 的系统用户进行管理。我们需要切换到该用户并执行 SQL 命令。\n进入 PostgreSQL 命令行： sudo -u postgres psql 执行以下 SQL 语句（注意每行末尾的分号）： -- 创建用户，密码设置为 nginxpulse CREATE USER nginxpulse WITH PASSWORD \u0026#39;nginxpulse\u0026#39;; -- 创建数据库，所有者设为 nginxpulse CREATE DATABASE nginxpulse OWNER nginxpulse; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE nginxpulse TO nginxpulse; -- 退出 \\q 如果做了修改，记得重启数据库：\nsudo systemctl restart postgresql 启动服务 重载 systemd 并启动：\nsudo systemctl daemon-reload sudo systemctl start nginxpulse sudo systemctl enable nginxpulse 检查状态：\nsudo systemctl status nginxpulse 查看实时日志\nsudo journalctl -u nginxpulse -f 确保日志目录可读（如果服务启动但没数据，执行此步）：\nsudo chmod -R +r /data/nginx_logs/ 查看数据大小\ndu -sh /opt/nginxpulse/var PV排除规则 favicon.ico$ robots.txt$ sitemap.xml$ ^/(?:api|ajax)/ ^/index\\.php/ajax/ ^/index\\.php/user/ajax_ulog$ ^/health$ ^/_(?:nuxt|next)/ rss.xml$ feed.xml$ atom.xml$ 现在，你可以通过浏览器访问 http://服务器IP:8089 来查看 NginxPulse 面板了。\n","date":"2026-01-21T14:32:36+08:00","permalink":"https://blog.lufei.de/p/524/","title":"nginxpulse日志分析工具安装教程"},{"content":"方案介绍 本文档介绍一种 基于 Rsync 的集中式 Nginx 日志中心方案，适用于多台业务服务器统一收集访问日志，并在日志中心完成自动轮转与留存。\n整体思路：\n日志中心部署 rsync daemon，仅负责接收与存储日志\n客户端周期性推送指定日志文件\n日志轮转仅在日志中心执行，避免多端轮转冲突\n一键脚本设置\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx_log_manager.sh \u0026amp;\u0026amp; chmod +x nginx_log_manager.sh \u0026amp;\u0026amp; ./nginx_log_manager.sh 客户端主机名\nhostname -s 客户端查看日志\ncd /var/log/nginx du -h * | sort -h 日志中心服务器配置 放行防火墙，例如\nufw allow 8873/tcp\n然后执行以下脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rsync-log.sh \u0026amp;\u0026amp; chmod +x rsync-log.sh \u0026amp;\u0026amp; ./rsync-log.sh ⚠️ 脚本执行完成后，请 记录生成的 rsync 密码，客户端需要使用。\n日志存储目录结构说明\n日志中心统一使用如下目录结构：\n/data/nginx_logs/ └── active/ ├── hostA/ │ ├── xxx-access.log │ └── yyy-access.log └── hostB/ └── ... active/：所有客户端实时写入目录 子目录以 客户端主机名 区分 创建客户端目录脚本\nnano /usr/local/bin/create_rsync_host_dir.sh 内容\n#!/bin/bash # 用法: ./create_rsync_host_dir.sh \u0026lt;hostname\u0026gt; [ -z \u0026#34;$1\u0026#34; ] \u0026amp;\u0026amp; { echo \u0026#34;请提供客户端主机名\u0026#34;; exit 1; } mkdir -p /data/nginx_logs/active/\u0026#34;$1\u0026#34; chown nobody:nogroup /data/nginx_logs/active/\u0026#34;$1\u0026#34; chmod 750 /data/nginx_logs/active/\u0026#34;$1\u0026#34; echo \u0026#34;目录 /data/nginx_logs/active/$1 已创建并设置权限\u0026#34; 给执行权限\nchmod +x /usr/local/bin/create_rsync_host_dir.sh 新客户端上线时执行\n/usr/local/bin/create_rsync_host_dir.sh 客户端主机名 日志轮转\n日志轮转 只在日志中心执行，客户端不做轮转处理。\nnano /etc/logrotate.d/nginx-rsync-logs 内容如下\n/data/nginx_logs/active/**/*.log { daily rotate 14 maxage 14 missingok notifempty copytruncate compress delaycompress dateext dateformat -%Y%m%d create 640 nobody nogroup } 配置说明：\ndaily：每天轮转一次 rotate 14 / maxage 14：保留 14 天 copytruncate：适合 rsync 持续写入场景 dateext：使用日期作为后缀，便于排查 查看 rsync 写入情况\ntail -f /var/log/rsyncd.log 手动测试 logrotate（不破坏）\nlogrotate -d /etc/logrotate.d/nginx-rsync-logs 强制轮转一次（上线前）\nlogrotate -f /etc/logrotate.d/nginx-rsync-logs 查看进程\nps -C rsync -o pid,state,cmd 查看日志大小\ncd /data/nginx_logs/active du -h * | sort -h 或者\ndu -sh /data/nginx_logs/active 客户端推送 创建推送脚本\nnano /usr/local/bin/sync_nginx_logs.sh 内容, 添加你的日志路径，以及修改日志中心ip\n#!/bin/bash # /usr/local/bin/sync_nginx_logs.sh set -e CENTER_IP=\u0026#34;日志中心IP\u0026#34; PORT=8873 RSYNC_USER=\u0026#34;log_sync\u0026#34; PASSFILE=\u0026#34;/root/.rsync_pass\u0026#34; LOG_BASE=\u0026#34;/var/log/nginx\u0026#34; HOSTNAME=$(hostname -s) # 要同步的日志 LOGS=( www.1234.cc-access.log www.5678.cc-access.log ) for log in \u0026#34;${LOGS[@]}\u0026#34;; do SRC=\u0026#34;$LOG_BASE/$log\u0026#34; if [ ! -f \u0026#34;$SRC\u0026#34; ]; then echo \u0026#34;[$(date \u0026#39;+%F %T\u0026#39;)] 文件不存在: $SRC\u0026#34; continue fi echo \u0026#34;[$(date \u0026#39;+%F %T\u0026#39;)] 开始同步: $SRC\u0026#34; /usr/bin/rsync -avz \\ --inplace \\ --timeout=180 \\ --bwlimit=2000 \\ --password-file=\u0026#34;$PASSFILE\u0026#34; \\ \u0026#34;$SRC\u0026#34; \\ \u0026#34;rsync://$RSYNC_USER@$CENTER_IP:$PORT/active/$HOSTNAME/$log\u0026#34; if [ $? -eq 0 ]; then echo \u0026#34;[$(date \u0026#39;+%F %T\u0026#39;)] 同步完成: $SRC\u0026#34; else echo \u0026#34;[$(date \u0026#39;+%F %T\u0026#39;)] 同步失败: $SRC\u0026#34; fi done 给与权限\nchmod +x /usr/local/bin/sync_nginx_logs.sh 配置 Rsync 密码\necho \u0026#39;日志中心密码\u0026#39; \u0026gt; /root/.rsync_pass chmod 600 /root/.rsync_pass 客户端与日志中心对齐校验 获取客户端主机名\nhostname -s 在日志中心创建对应目录\n注意：以下命令 在日志中心服务器执行\n/usr/local/bin/create_rsync_host_dir.sh 客户端主机名 定时任务(客户端) crontab -e 写入\n*/5 * * * * flock -n /tmp/sync_nginx_logs.lock /bin/bash /usr/local/bin/sync_nginx_logs.sh \u0026gt;\u0026gt; /var/log/sync_nginx_logs.log 2\u0026gt;\u0026amp;1 说明：\n每 5 分钟同步一次 Nginx 日志 flock 防止脚本并发执行 同步过程日志写入 /var/log/sync_nginx_logs.log 同步到windows 下载安装rclone，配置rclone.conf，模板如下，假设日志中心ip：3.3.3.3，ssh端口22,本地通信密钥~/.ssh/xxxxx\n[ovh] type = sftp host = 3.3.3.3 user = root port = 22 key_file = ~/.ssh/xxxxx shell_type = unix md5sum_command = md5sum sha1sum_command = sha1sum 然后新建bat脚本\n@echo off cd /d D:\\rclone-v1.68.0-windows-amd64 rclone sync ovh:/data/nginx_logs/active D:\\logs ^ -u -v -P ^ --transfers=20 ^ --checkers=10 ^ --check-first ^ --ignore-errors ^ --buffer-size=128M pause ","date":"2026-01-20T11:49:02+08:00","permalink":"https://blog.lufei.de/p/523/","title":"轻量级 Nginx 日志中心搭建：Rsync 同步 + 自动轮转"},{"content":"前言 在日常开发中，我们经常需要在本地编写代码，然后将代码同步到远程服务器进行测试或部署。传统的方式是使用 FileZilla、WinSCP 等第三方工具手动上传文件，这种方式不仅繁琐，而且容易出错。VSCode 的 SFTP 插件可以帮助我们实现本地代码与远程服务器的自动同步，大大提高开发效率。\n应用场景 SFTP 插件适用于以下场景：\n本地开发，远程调试：在本地编写代码，保存后自动同步到远程服务器，无需手动上传 快速部署：本地测试通过后，一键同步到生产环境服务器 多服务器管理：同时管理多个远程服务器，快速切换上传目标 团队协作：统一开发环境，确保代码在服务器端运行一致 安装插件 打开 VSCode，按下快捷键 Ctrl + Shift + X 打开扩展商店，搜索 sftp，找到名为 SFTP 的插件（作者：Natizyskunk），这是安装量最高、最受欢迎的 SFTP 插件。点击安装即可。\n安装完成后，VSCode 会在侧边栏显示 SFTP 图标，表示插件已成功安装。\n配置插件 生成配置文件 插件安装完成后，我们需要为当前项目创建配置文件。有两种方式：\n方式一：使用命令面板\n按下快捷键 Ctrl + Shift + P 打开命令面板 输入 SFTP: Config 并回车 VSCode 会在当前工作区的 .vscode 文件夹下自动生成 sftp.json 配置文件 方式二：右键菜单\n在 VSCode 资源管理器中，右键点击项目文件夹 选择 SFTP: Config 同样会生成 sftp.json 配置文件 配置示例 打开生成的 sftp.json 文件\n{ \u0026#34;name\u0026#34;: \u0026#34;myserver\u0026#34;, \u0026#34;host\u0026#34;: \u0026#34;192.168.1.5\u0026#34;, \u0026#34;protocol\u0026#34;: \u0026#34;sftp\u0026#34;, \u0026#34;port\u0026#34;: 5533, \u0026#34;username\u0026#34;: \u0026#34;root\u0026#34;, \u0026#34;privateKeyPath\u0026#34;: \u0026#34;~/.ssh/id_ed25519\u0026#34;, \u0026#34;remotePath\u0026#34;: \u0026#34;/opt/test\u0026#34;, \u0026#34;uploadOnSave\u0026#34;: true, \u0026#34;ignore\u0026#34;: [ \u0026#34;.vscode\u0026#34;, \u0026#34;.git\u0026#34;, \u0026#34;.kiro\u0026#34;, \u0026#34;.DS_Store\u0026#34;, \u0026#34;node_modules\u0026#34;, \u0026#34;*.log\u0026#34;, \u0026#34;*.tmp\u0026#34; ], \u0026#34;syncOption\u0026#34;: { \u0026#34;delete\u0026#34;: true, \u0026#34;skipCreate\u0026#34;: false, \u0026#34;ignoreExisting\u0026#34;: false, \u0026#34;update\u0026#34;: true }, \u0026#34;watcher\u0026#34;: { \u0026#34;files\u0026#34;: \u0026#34;**/*\u0026#34;, \u0026#34;autoUpload\u0026#34;: true, \u0026#34;autoDelete\u0026#34;: false } } ","date":"2026-01-13T12:11:56+08:00","permalink":"https://blog.lufei.de/p/522/","title":"VSCode SFTP插件-远程开发"},{"content":"项目 项目：https://github.com/woniu336/vps\n系统： Debian12\n一键安装 wget -O install.sh https://raw.githubusercontent.com/woniu336/vps/main/install.sh \u0026amp;\u0026amp; chmod +x install.sh \u0026amp;\u0026amp; ./install.sh 安装完成后：\n访问地址: http://你的服务器IP:9527 默认用户名: admin 默认密码: admin123 请记得开放 9527 端口！ 服务管理命令\n# 启动服务 systemctl start vps-manager # 停止服务 systemctl stop vps-manager # 重启服务 systemctl restart vps-manager # 查看状态 systemctl status vps-manager # 查看日志 journalctl -u vps-manager -f 卸载 wget -O uninstall.sh https://raw.githubusercontent.com/woniu336/vps/main/uninstall.sh \u0026amp;\u0026amp; chmod +x uninstall.sh \u0026amp;\u0026amp; ./uninstall.sh ","date":"2026-01-08T00:44:40+08:00","permalink":"https://blog.lufei.de/p/521/","title":"强大简洁的vps到期监控系统"},{"content":"项目 Github: https://github.com/woniu336/whois\nAPI调用：https://whois.233333.best/api/\n一键部署脚本 提醒：开放8080端口\ncurl -fsSL https://raw.githubusercontent.com/woniu336/whois/main/install.sh | sudo bash 默认登录密码：admin/admin123\n通知说明： 剩余天数精准匹配提醒天数就会触发通知，默认在凌晨两点通知(可在检测频率)设置\n通知生效需要重启：systemctl restart domain-monitor\n浏览器打开：http://localhost:8080 默认账户：admin 默认密码：admin123 Bug 某些后缀无法查询到，会报错，例如.de后缀，最好删掉，添加常用后缀\n功能特性 ✅ 域名WHOIS查询和到期监控 ✅ 多渠道通知（邮件、Telegram、钉钉） ✅ JWT身份认证 ✅ 密码加密存储（bcrypt） ✅ 自动定时检测 ✅ Web管理界面 ","date":"2026-01-06T10:16:30+08:00","permalink":"https://blog.lufei.de/p/520/","title":"域名到期监控系统"},{"content":"原文档: https://gitee.com/scoop-installer-mirrors\n开始部署 安装PowerShell 7\nhttps://gh-proxy.com/https://github.com/PowerShell/PowerShell/releases/download/v7.5.4/PowerShell-7.5.4-win-x64.msi 安装 Scoop 打开 PowerShell 7.0+ (Core) 或 Windows PowerShell 5.1\n设置执行策略\nSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 下载安装脚本\nirm https://gitee.com/scoop-installer-mirrors/Install/releases/download/archive/install.ps1 -OutFile install.ps1 执行安装脚本\nmkdir D:\\scoop .\\install.ps1 -ScoopDir \u0026#34;D:\\scoop\u0026#34; 或者\n$env:SCOOP=\u0026#39;D:\\scoop\u0026#39;; iex \u0026#34;\u0026amp; {$(irm get.scoop.sh)} -RunAsAdmin\u0026#34; 设置 scoop 仓库\nscoop config scoop_repo https://gitee.com/scoop-installer-mirrors/Scoop 添加 bucket\nscoop bucket add main https://gitee.com/scoop-installer-mirrors/Main extras\nscoop bucket add extras https://gitee.com/scoop-installer-mirrors/Extras 优化 scoop search 的性能\nscoop config use_sqlite_cache true 提升 Scoop 使用体验 添加 abyss (Github 或 Gitee)\nscoop bucket add abyss https://gitee.com/abgox/abyss 添加 scoop 命令补全以及 i18n 支持\nscoop install abyss/abgox.PSCompletions 导入\nImport-Module PSCompletions 如果有提示：\nnotepad $PROFILE 添加导入命令：在文件的末尾添加以下行 Import-Module PSCompletions 重新启动 PowerShell 验证是否成功 Get-Module PSCompletions 然后\npsc add scoop scoop-install scoop-update 最后\nscoop install abyss/abgox.scoop-i18n 解决 Github 软件下载问题 可以使用 abgox/scoop-tools 中的 scoop-install 和 scoop-update 解决此问题\n安装 scoop-install 和 scoop-update\nscoop install abyss/abgox.scoop-install scoop install abyss/abgox.scoop-update 设置 url 替换配置，如果有多个值，使用 ||| 分割\nscoop config abgox-scoop-install-url-replace-from \u0026#34;^https://github.com|||^https://raw.githubusercontent.com\u0026#34; 接着\nscoop config abgox-scoop-install-url-replace-to \u0026#34;https://gh-proxy.com/github.com|||https://gh-proxy.com/raw.githubusercontent.com\u0026#34; 后续使用 scoop-install 和 scoop-update 命令安装和更新软件即可\n其他问题 指定根目录，如果scoop默认安装在用户目录\nscoop config root_path \u0026#34;C:\\Users\\Administrator\\scoop\u0026#34; 删除代理设置，如果出现由于目标计算机积极拒绝，无法连接\n[System.Environment]::SetEnvironmentVariable(\u0026#39;http_proxy\u0026#39;, $null, [System.EnvironmentVariableTarget]::Process) [System.Environment]::SetEnvironmentVariable(\u0026#39;https_proxy\u0026#39;, $null, [System.EnvironmentVariableTarget]::Process) 验证\nGet-ChildItem env: | Where-Object { $_.Name -match \u0026#39;proxy\u0026#39; } 换源 项目：https://github.com/RubyMetric/chsrc\ncurl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-x64-windows.exe -o chsrc.exe 换\n./chsrc.exe set node ./chsrc.exe set go ./chsrc.exe set python ./chsrc.exe set pip ","date":"2026-01-05T13:00:01+08:00","permalink":"https://blog.lufei.de/p/519/","title":"Scoop - Windows 命令行式的软件安装工具"},{"content":" 项目：https://github.com/woniu336/CFGuard\n放行防火墙 默认8081端口，例如\nufw allow 8081/tcp 安装 unzip 工具避免安装失败\nsudo apt-get update sudo apt-get install unzip 部署脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cfserver.sh \u0026amp;\u0026amp; chmod +x cfserver.sh \u0026amp;\u0026amp; ./cfserver.sh 修改令牌\ncd /opt/cfserver \u0026amp;\u0026amp; ./dns-server -reset-token 然后重启\ncd /opt/cfserver \u0026amp;\u0026amp; pkill dns-server \u0026amp;\u0026amp; nohup ./dns-server \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 部署说明： 新建目录\nmkdir -p /opt/cfserver cd /opt/cfserver 上传到 Linux 服务器\n# 将以下文件上传到服务器 - dns-server (二进制文件) - web/ (整个目录) 在服务器上设置\n# 赋予执行权限 chmod +x dns-server # 启动服务 ./dns-server # 或后台运行 nohup ./dns-server \u0026gt; cfserver.log 2\u0026gt;\u0026amp;1 \u0026amp; 访问 Web 界面\n浏览器访问：http://服务器IP:8081\n使用设置的令牌登录\n在界面中配置 Cloudflare 凭证和监控策略\n完全卸载 #1.停止进程 pkill dns-server #2.删除安装目录 rm -rf /opt/cfserver #3.删除部署脚本（可选） rm -f cfserver.sh #4.放行防火墙端口（如果不再需要） ufw delete allow 8081/tcp ","date":"2026-01-04T20:03:17+08:00","permalink":"https://blog.lufei.de/p/518/","title":"CF DNS 宕机切换面板"},{"content":" 项目：https://github.com/woniu336/ngx-nova\n轻量级的 Nginx 可视化运维面板，内存占用 低于 20MB，帮助你快速完成安装、站点管理、端口转发、备份与日志查看等常见任务。\n✨ 功能亮点 极简部署：单一 Go 二进制 + 静态前端，极低资源占用。\n一键安装/卸载：内置 nginx-acme 脚本调用，快速部署或清理 Nginx。\n站点与转发管理：图形化创建/编辑/删除站点与 Stream 转发配置，自动执行重载\n一键备份与恢复：本地备份 + 自动每天备份到 Cloudflare R2。\n日志中心：可视化按域名聚合 Access/Error 日志，支持刷新与独立查看。\n不再担心 SSL 证书过期，内置 ACME 自动化能力，HTTPS 证书申请与续期全自动完成。\n🚀 快速开始 1.放行防火墙\nufw allow 8083/tcp 安装脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ngx.sh \u0026amp;\u0026amp; chmod +x ngx.sh \u0026amp;\u0026amp; ./ngx.sh 登录http://ip:8083/ui/ 首次设置登录令牌 如需修改令牌\ntokenctl --set \u0026#34;你的令牌\u0026#34; --file /opt/nginx-mgr/auth_token.json 卸载 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/uni-ngx.sh \u0026amp;\u0026amp; chmod +x uni-ngx.sh \u0026amp;\u0026amp; ./uni-ngx.sh 设计理念 保持简单 拒绝“为了功能而功能”\n默认安全 任何操作都不应该让线上服务崩溃\n可长期运行 稳定、低占用、少维护\n适合谁 个人 VPS 用户 自建网站与反向代理 追求稳定、可控运维体验的开发者与运维人员\n日志轮转 sudo nano /etc/logrotate.d/nginx 如下\n/var/log/nginx/*.log { daily size 300M rotate 3 missingok notifempty compress delaycompress create 0640 www-data adm sharedscripts postrotate [ -s /run/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /run/nginx.pid) endscript } 检查定时任务是否正确设置\nsystemctl status logrotate.timer 查看下次执行时间\nsystemctl list-timers logrotate.timer 查看日志目录占用大小\ndu -sh /var/log/nginx 语法检查\nlogrotate -d /etc/logrotate.conf 强制执行一次\nlogrotate -f /etc/logrotate.conf 查看日志，按文件大小排序\ncd /var/log/nginx du -h * | sort -h 或更直观一点：\nls -lhS 删除轮转后的日志，只保留 .log，删除其余一切：\nfind /var/log/nginx -type f ! -name \u0026#34;*.log\u0026#34; -delete ip证书开启 需要使用如下脚本安装\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ngx-s.sh \u0026amp;\u0026amp; chmod +x ngx-s.sh \u0026amp;\u0026amp; ./ngx-s.sh 然后替换nginx配置\n# 1. 创建站点目录（幂等，重复执行也安全） mkdir -p /var/www/lego chown -R www-data:www-data /var/www/lego 2\u0026gt;/dev/null || true # 2. 备份当前 nginx 配置 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%F_%H-%M-%S) # 3. 下载新配置到临时文件 wget -O /etc/nginx/nginx.conf.new \\ https://github.com/jimugou/jimugou.github.io/releases/download/v1.0.0/nginx.conf # 4. 使用新配置做语法检查（不影响正在运行的 nginx） nginx -t -c /etc/nginx/nginx.conf.new # 5. 校验通过后，原子替换并平滑重载 mv /etc/nginx/nginx.conf.new /etc/nginx/nginx.conf systemctl reload nginx 申请ip证书\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ip-cert-apply.sh \u0026amp;\u0026amp; chmod +x ip-cert-apply.sh \u0026amp;\u0026amp; ./ip-cert-apply.sh 重启\nsystemctl restart nginx-mgr 打开https://ip:8083\n续期脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ip-renew.sh \u0026amp;\u0026amp; chmod +x ip-renew.sh \u0026amp;\u0026amp; ./ip-renew.sh 定时任务\n(crontab -l 2\u0026gt;/dev/null; echo \u0026#34;5 3 * * * /root/ip-renew.sh \u0026gt;/root/lego-renew.log 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 完成！\n","date":"2026-01-02T15:34:07+08:00","permalink":"https://blog.lufei.de/p/517/","title":"一个轻量、可靠的 Nginx 可视化运维面板"},{"content":" 系统：debian12\nAPI：https://dmxapi.cn/\n安装 code-server 安装node\ncurl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt install -y nodejs 验证\nnode -v npm -v which node 安装code-server\ncurl -fsSL https://code-server.dev/install.sh | sh 开机自启\nsudo systemctl enable --now code-server@$USER 编辑配置\nnano ~/.config/code-server/config.yaml 开放防火墙\nsudo ufw allow 8080 sudo ufw reload 重启\nsudo systemctl restart code-server@$USER 安装 codex sudo npm install -g @openai/codex 验证\ncodex --version 配置 DMXAPI mkdir -p ~/.codex touch ~/.codex/auth.json touch ~/.codex/config.toml 编辑 auth.json 文件：\nnano ~/.codex/auth.json 配置密钥\n{ \u0026#34;OPENAI_API_KEY\u0026#34;: \u0026#34;sk-xxxx\u0026#34; } 编辑 config.toml 文件\nnano ~/.codex/config.toml 配置\nmodel_provider = \u0026#34;DMX1\u0026#34; model = \u0026#34;gpt-5-codex\u0026#34; model_reasoning_effort = \u0026#34;high\u0026#34; disable_response_storage = true preferred_auth_method = \u0026#34;apikey\u0026#34; [model_providers.DMX1] name = \u0026#34;DMX1\u0026#34; base_url = \u0026#34;https://www.dmxapi.cn/v1\u0026#34; wire_api = \u0026#34;responses\u0026#34; 启动 codex 重启终端！重启终端！重启终端！ 然后进入到您的工程目录：\ncd your-project-folder 运行以下命令启动：\ncodex ","date":"2026-01-01T22:19:39+08:00","permalink":"https://blog.lufei.de/p/516/","title":"网页版vscode部署"},{"content":"原项目 https://github.com/BeyondXinXin/nixvis\n功能特点 全面访问指标：实时统计独立访客数 (UV)、页面浏览量 (PV) 和流量数据 地理位置分布：展示国内和全球访问来源的可视化地图 详细访问排名：提供 URL、引荐来源、浏览器、操作系统和设备类型的访问排名 时间序列分析：支持按小时和按天查看访问趋势 多站点支持：可同时监控多个网站的访问数据 增量日志解析：自动扫描 Nginx 日志文件，解析并存储最新数据 高性能查询：存储使用轻量级 SQLite，结合多级缓存策略实现快速响应 嵌入式资源：前端资源和IP库内嵌于可执行文件中，无需额外部署静态文件 用户认证：内置用户认证系统，保护敏感数据访问 可疑IP检测：自动检测异常访问行为，支持IP黑名单功能 蜘蛛统计：识别并统计各类搜索引擎蜘蛛的访问情况 快速开始 Linux/Debian 系统部署 放行防火墙，例如\nufw allow 9523/tcp 一键安装脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/nixvis/main/install.sh \u0026amp;\u0026amp; chmod +x install.sh \u0026amp;\u0026amp; ./install.sh 安装脚本会自动完成以下操作：\n创建专用用户和目录 安装二进制文件到 /opt/nixvis 创建 systemd 服务 生成默认配置文件 /etc/nixvis/config.json 启动服务 设置正确的权限\nsudo chown nixvis:nixvis /opt/nixvis/nixvis sudo chmod +x /opt/nixvis/nixvis sudo systemctl stop nixvis sudo systemctl start nixvis 如果添加到 adm 组后仍有权限问题，可以检查：\n# 1. 确认 nginx 日志文件权限 ls -la /var/log/nginx/ # 2. 如果日志文件权限不是 640，可以修改 sudo chmod 640 /var/log/nginx/*.log sudo chown www-data:adm /var/log/nginx/*.log # 3. 确保 nginx 日志目录可访问 sudo chmod 755 /var/log/nginx 访问 Web 界面\n首次访问会显示创建管理员账户的页面：\nhttp://your-server-ip:9523 排除模式 ^/(?:api|ajax)/ ^/index\\.php/ajax/ ^/index\\.php/user/ajax_ulog$ ^/health$ ^/_(?:nuxt|next)/ 服务管理命令 # 查看服务状态 sudo systemctl status nixvis # 启动服务 sudo systemctl start nixvis # 停止服务 sudo systemctl stop nixvis # 重启服务 sudo systemctl restart nixvis # 查看日志 sudo journalctl -u nixvis -f 卸载 curl -sS -O https://raw.githubusercontent.com/woniu336/nixvis/main/uninstall.sh \u0026amp;\u0026amp; chmod +x uninstall.sh \u0026amp;\u0026amp; ./uninstall.sh 清空数据方式 方法一：命令行清空（推荐）\n# 1. 停止服务 sudo systemctl stop nixvis # 2. 删除数据库文件 sudo rm -f /var/lib/nixvis/nixvis.db # 3. 删除扫描状态文件（重新从头扫描日志） sudo rm -f /var/lib/nixvis/nginx_scan_state.json # 4. 重启服务（会自动创建新的数据库） sudo systemctl start nixvis # 5. 查看服务状态 sudo systemctl status nixvis 方法二：只清空数据保留配置\n如果你想保留配置文件但清空所有数据：\n# 1. 停止服务 sudo systemctl stop nixvis # 2. 只删除数据库和状态文件 sudo rm -f /var/lib/nixvis/nixvis.db sudo rm -f /var/lib/nixvis/nginx_scan_state.json # 3. 保留配置文件，重启服务 sudo systemctl start nixvis ","date":"2025-12-30T13:07:48+08:00","permalink":"https://blog.lufei.de/p/515/","title":"Nginx 网站日志分析工具"},{"content":"备份脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/r2-b.sh \u0026amp;\u0026amp; chmod +x r2-b.sh \u0026amp;\u0026amp; ./r2-b.sh 还原脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/r2.sh \u0026amp;\u0026amp; chmod +x r2.sh \u0026amp;\u0026amp; ./r2.sh ","date":"2025-12-29T13:02:53+08:00","permalink":"https://blog.lufei.de/p/514/","title":"cloudflare R2 备份/还原脚本 - nginx专用"},{"content":"安装nginx脚本 带Brotli压缩模块\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx-acme.sh \u0026amp;\u0026amp; chmod +x nginx-acme.sh \u0026amp;\u0026amp; ./nginx-acme.sh br压缩检查\ncurl -I -H \u0026#34;Accept-Encoding: gzip, br\u0026#34; https://www.xxxx.com/static/css/style.css 静态处理 bulu\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/gzbr.sh \u0026amp;\u0026amp; chmod +x gzbr.sh \u0026amp;\u0026amp; ./gzbr.sh 8090\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/8090.sh \u0026amp;\u0026amp; chmod +x 8090.sh \u0026amp;\u0026amp; ./8090.sh cat\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cat.sh \u0026amp;\u0026amp; chmod +x cat.sh \u0026amp;\u0026amp; ./cat.sh qk\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/qk.sh \u0026amp;\u0026amp; chmod +x qk.sh \u0026amp;\u0026amp; ./qk.sh 将静态处理成br格式\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/br.sh \u0026amp;\u0026amp; chmod +x br.sh \u0026amp;\u0026amp; ./br.sh 将静态处理成gz格式\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/gzip.sh \u0026amp;\u0026amp; chmod +x gzip.sh \u0026amp;\u0026amp; ./gzip.sh 创建预压缩存储目录\nmkdir -p /var/www/cache/2345.cc 反向代理通用版 # ===== WebSocket 智能判断 ===== map $http_upgrade $connection_upgrade { default \u0026#34;\u0026#34;; websocket \u0026#34;upgrade\u0026#34;; } # ===== HTTP → HTTPS ===== server { listen 80; listen [::]:80; server_name www.2345.cc; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } # ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name www.2345.cc; access_log /var/log/nginx/www.2345.cc-access.log main buffer=64k flush=10s; error_log /var/log/nginx/www.2345.cc-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; gzip on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/rss+xml image/svg+xml; brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/rss+xml image/svg+xml; # ===== 静态资源 ===== location ~* \\.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ { proxy_pass http://3.3.3.3:80; # HTTP/1.1 持久连接 proxy_http_version 1.1; proxy_set_header Connection \u0026#34;\u0026#34;; # 获取原始文件（禁用后端压缩） proxy_set_header Accept-Encoding \u0026#34;\u0026#34;; #proxy_hide_header Vary; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; # 缓存配置 proxy_cache my_proxy_cache; proxy_cache_valid 200 302 304 30d; proxy_cache_valid 404 1m; proxy_cache_valid any 10s; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; # 忽略后端缓存头 #proxy_ignore_headers Cache-Control Expires; # 性能优化 expires 30d; etag on; sendfile on; tcp_nopush on; log_not_found off; access_log off; } # ===== 动态内容 ===== location / { proxy_pass http://3.3.3.3:80; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; } } 负载均衡通用版 # ===== WebSocket 智能判断 ===== map $http_upgrade $connection_upgrade { default \u0026#34;\u0026#34;; websocket \u0026#34;upgrade\u0026#34;; } upstream www_2345_cc { keepalive 320; keepalive_requests 500; keepalive_timeout 60s; server 3.3.3.3:80; server 5.5.5.5:80; } # ===== HTTP → HTTPS ===== server { listen 80; listen [::]:80; server_name 2345.cc www.2345.cc; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } # ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name 2345.cc www.2345.cc; access_log /var/log/nginx/www.2345.cc-access.log main buffer=64k flush=10s; error_log /var/log/nginx/www.2345.cc-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; gzip on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/rss+xml image/svg+xml; brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/rss+xml image/svg+xml; # ===== 静态资源 ===== location ~* \\.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ { proxy_pass http://www_2345_cc; # HTTP/1.1 持久连接 proxy_http_version 1.1; proxy_set_header Connection \u0026#34;\u0026#34;; # 超时控制 proxy_connect_timeout 1s; proxy_send_timeout 2s; proxy_read_timeout 3s; # 故障转移配置 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_timeout 5s; proxy_next_upstream_tries 2; # 获取原始文件（禁用后端压缩） proxy_set_header Accept-Encoding \u0026#34;\u0026#34;; #proxy_hide_header Vary; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; # 缓存配置 proxy_cache my_proxy_cache; proxy_cache_valid 200 302 304 30d; proxy_cache_valid 404 1m; proxy_cache_valid any 10s; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; # 忽略后端缓存头 #proxy_ignore_headers Cache-Control Expires; # 性能优化 expires 30d; etag on; sendfile on; tcp_nopush on; log_not_found off; access_log off; } # ===== 动态内容 ===== location / { proxy_pass http://www_2345_cc; # 超时控制（比静态稍长） proxy_connect_timeout 2s; proxy_send_timeout 5s; proxy_read_timeout 8s; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; } } 负载均衡 处理预压缩的配置\n# ===== WebSocket 智能判断 ===== map $http_upgrade $connection_upgrade { default \u0026#34;\u0026#34;; websocket \u0026#34;upgrade\u0026#34;; } upstream www_2345_cc { keepalive 320; keepalive_requests 500; keepalive_timeout 60s; server 3.3.3.3:80; server 5.5.5.5:80; } # ===== HTTP → HTTPS ===== server { listen 80; listen [::]:80; server_name 2345.cc www.2345.cc; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } # ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name 2345.cc www.2345.cc; access_log /var/log/nginx/www.2345.cc-access.log main buffer=64k flush=10s; error_log /var/log/nginx/www.2345.cc-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; # 根域名跳转 if ($host = 2345.cc) { return 301 https://www.2345.cc$request_uri; } # 关闭所有动态压缩 gzip off; brotli off; # 开启预压缩支持 gzip_static on; brotli_static on; # ===== 静态资源 ===== location ~* \\.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ { root /var/www/cache/2345.cc; # 智能查找：本地文件优先 try_files $uri @backend_fallback; # 缓存策略 expires 30d; etag on; # 性能优化 aio threads; sendfile on; tcp_nopush on; log_not_found off; access_log off; } # ===== 静态文件回退 ===== location @backend_fallback { proxy_pass http://www_2345_cc; # 超时控制 proxy_connect_timeout 1s; proxy_send_timeout 2s; proxy_read_timeout 3s; proxy_next_upstream error timeout invalid_header; proxy_next_upstream_tries 2; # 连接复用 proxy_http_version 1.1; proxy_set_header Connection \u0026#34;\u0026#34;; # 压缩头透传 proxy_set_header Accept-Encoding $http_accept_encoding; proxy_pass_header Content-Encoding; proxy_pass_header Vary; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; # 缓存配置 proxy_cache my_proxy_cache; proxy_cache_key \u0026#34;$scheme$request_method$host$request_uri$http_accept_encoding\u0026#34;; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_cache_valid 200 302 304 12h; proxy_cache_valid 404 1m; proxy_cache_valid any 10s; } # ===== 动态内容 ===== location / { proxy_pass http://www_2345_cc; # 超时控制（比静态稍长） proxy_connect_timeout 2s; proxy_send_timeout 5s; proxy_read_timeout 8s; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; # 连接复用（支持WebSocket） proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; # 标准代理头 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; proxy_set_header X-Forwarded-Port $server_port; } } 反向代理 # ===== WebSocket 智能判断 ===== map $http_upgrade $connection_upgrade { default \u0026#34;\u0026#34;; websocket \u0026#34;upgrade\u0026#34;; } # ===== HTTP → HTTPS ===== server { listen 80; listen [::]:80; server_name 2345.cc www.2345.cc; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } # ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name 2345.cc www.2345.cc; access_log /var/log/nginx/www.2345.cc-access.log main buffer=64k flush=10s; error_log /var/log/nginx/www.2345.cc-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; # 根域名跳转 if ($host = 2345.cc) { return 301 https://www.2345.cc$request_uri; } # 关闭所有动态压缩 gzip off; brotli off; # 开启预压缩支持 gzip_static on; brotli_static on; # ===== 静态资源 ===== location ~* \\.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ { root /var/www/cache/2345.cc; # 智能查找：本地文件优先 try_files $uri @backend_fallback; # 缓存策略 expires 30d; etag on; # 性能优化 aio threads; sendfile on; tcp_nopush on; log_not_found off; access_log off; } # ===== 静态文件回退 ===== location @backend_fallback { proxy_pass http://3.3.3.3:80; # 压缩头透传 proxy_set_header Accept-Encoding $http_accept_encoding; proxy_pass_header Content-Encoding; proxy_pass_header Vary; # 连接复用 proxy_http_version 1.1; proxy_set_header Connection \u0026#34;\u0026#34;; # 代理头 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; proxy_set_header X-Forwarded-Port $server_port; # 缓存配置 proxy_cache my_proxy_cache; proxy_cache_key \u0026#34;$scheme$request_method$host$request_uri$http_accept_encoding\u0026#34;; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_cache_valid 200 302 304 12h; proxy_cache_valid 404 1m; proxy_cache_valid any 10s; } # ===== 动态内容 ===== location / { proxy_pass http://3.3.3.3:80; # 连接复用（支持WebSocket） proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; # 标准代理头 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; proxy_set_header X-Forwarded-Port $server_port; } } nginx配置 user www-data; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /run/nginx.pid; worker_rlimit_nofile 65535; thread_pool default threads=8 max_queue=65536; # ACME 模块 load_module /usr/lib/nginx/modules/ngx_http_acme_module.so; events { use epoll; multi_accept on; worker_connections 1024; } stream { include /etc/nginx/streams-enabled/*; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # Security server_tokens off; http2 on; http2_max_concurrent_streams 512; http2_recv_buffer_size 512k; http2_body_preread_size 128k; http2_chunk_size 16k; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:30m; ssl_session_timeout 1h; ssl_certificate_cache max=2000 inactive=5m valid=20m; ssl_buffer_size 4k; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; add_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains\u0026#34; always; # Hash sizes server_names_hash_max_size 1024; server_names_hash_bucket_size 128; types_hash_max_size 2048; types_hash_bucket_size 128; variables_hash_max_size 1024; variables_hash_bucket_size 128; proxy_headers_hash_max_size 1024; proxy_headers_hash_bucket_size 128; # File caching open_file_cache max=10000 inactive=30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on; # Rate limiting limit_req_zone $binary_remote_addr zone=example_zone:50m rate=50r/s; limit_req zone=example_zone burst=150 nodelay; limit_req_status 429; limit_conn_zone $binary_remote_addr zone=addr:20m; limit_conn addr 200; limit_conn_status 429; # Proxy caching proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=my_proxy_cache:50m max_size=5g inactive=12h use_temp_path=off; proxy_cache_key \u0026#34;$scheme$request_method$host$request_uri\u0026#34;; add_header X-Cache-Status $upstream_cache_status; add_header Vary Accept-Encoding; proxy_cache_methods GET HEAD; proxy_cache_valid 200 301 302 304 12h; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 400 403 429 0; proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_background_update on; # Proxy buffering proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 8 16k; proxy_busy_buffers_size 32k; proxy_socket_keepalive on; proxy_intercept_errors on; proxy_hide_header X-Powered-By; # Logging log_format main \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; \u0026#39; \u0026#39;$status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#39; \u0026#39;\u0026#34;$http_user_agent\u0026#34; \u0026#34;$http_x_forwarded_for\u0026#34;\u0026#39;; access_log /var/log/nginx/access.log main buffer=64k flush=10s; # File transfer optimizations sendfile on; tcp_nopush on; tcp_nodelay on; # gzip gzip off; gzip_static on; # brotli brotli off; brotli_static on; # Connection \u0026amp; timeout reset_timedout_connection on; client_header_buffer_size 32k; client_body_buffer_size 256k; large_client_header_buffers 4 32k; output_buffers 8 1024k; client_body_timeout 60s; client_header_timeout 60s; send_timeout 60s; keepalive_timeout 65s 60s; keepalive_requests 5000; proxy_connect_timeout 30s; proxy_send_timeout 60s; proxy_read_timeout 60s; # DNS resolver resolver 8.8.8.8 1.1.1.1 valid=300s ipv6=off; resolver_timeout 5s; # 全局代理头 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; proxy_set_header X-Forwarded-Port $server_port; # ACME 配置 acme_shared_zone zone=acme_shared:2M; acme_issuer letsencrypt { uri https://acme-v02.api.letsencrypt.org/directory; contact mailto:12345@qq.com; state_path /etc/nginx/acme/letsencrypt; accept_terms_of_service; } # HTTP → HTTPS 跳转（默认服务器块） server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { return 301 https://$host$request_uri; } } # 禁止 IP 直接访问 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_reject_handshake on; } include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } ","date":"2025-12-28T11:59:30+08:00","permalink":"https://blog.lufei.de/p/513/","title":"优化静态资源传输：在 Nginx 中启用 Brotli 预压缩"},{"content":" 注意事项：在填写同步目录时，结尾要带上/ 例如：/home/web/\n脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rsync_manager.sh \u0026amp;\u0026amp; chmod +x rsync_manager.sh \u0026amp;\u0026amp; ./rsync_manager.sh 快速启动\necho \u0026#34;alias rsync=\u0026#39;/root/rsync_manager.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 自定义模式 排除 .gz 文件\n-avz --exclude=\u0026#39;*.gz\u0026#39; 排除多种压缩文件\n-avz --exclude=\u0026#39;*.gz\u0026#39; --exclude=\u0026#39;*.zip\u0026#39; --exclude=\u0026#39;*.tar\u0026#39; 带删除并排除 .gz 文件, 在镜像同步（删除远程多余文件）的同时排除 .gz 文件\n-avz --delete --exclude=\u0026#39;*.gz\u0026#39; 使用排除模式文件：\n-avz --exclude-from=\u0026#39;/path/to/exclude-list.txt\u0026#39; ","date":"2025-12-23T00:19:22+08:00","permalink":"https://blog.lufei.de/p/512/","title":"rsync同步和实时监控工具"},{"content":"前言\n这款脚本将 ACME 自动化模块 编译到 Nginx v1.28.0 实现证书自动化\n完美适配Nginx-UI如果你习惯使用面板管理，推荐\n主要用于反向代理，非建站环境\n脚本特色：\n全自动 SSL： 内置 Nginx ACME 模块，证书申请、部署、自动续期一条龙，上线即 HTTPS。 一键全能型： 反代、负载均衡、静态站点、端口转发，WebSocket 支持、HTTP 强制跳转等 标准路径： 拒绝乱放文件，遵循标准 Nginx路径。 备份还原： 压缩备份与一键还原功能，改错配置瞬间回血。 多节点同步 利用Nginx-ui节点同步特色可以做到修改配置就同步 脚本\n注意事项：\n1G内存机子最好添加swap，避免安装失败 安装过程大概5分钟，也许不到 要事先解析域名到ip，避免一顿操作猛如虎，检查一看250 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx-acme.sh \u0026amp;\u0026amp; chmod +x nginx-acme.sh \u0026amp;\u0026amp; ./nginx-acme.sh 快捷启动\necho \u0026#34;alias ng=\u0026#39;/root/nginx-acme.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 输入ng 启动脚本\n编辑站点\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ng-s.sh \u0026amp;\u0026amp; chmod +x ng-s.sh \u0026amp;\u0026amp; ./ng-s.sh 在这个追求效率的时代，别让琐事消耗你的技术热情。这套脚本将复杂的 Nginx 调优和证书维护浓缩进一个 0-15 的选择题里。\n","date":"2025-12-22T15:28:02+08:00","permalink":"https://blog.lufei.de/p/511/","title":"可能是最好的Nginx反向代理管理脚本"},{"content":"nginx配置反向代理或跳转出现\n400,Request Header Or Cookie Too Large\n浪费我不少时间排查，结果网上查找资料找到了答案\n通常与客户端请求头或 Cookie 太大有关。通过增加 client_header_buffer_size 和 large_client_header_buffers 的值，可以允许更大的请求头被正确解析，从而避免出现 400 错误。\n修改 nginx 配置，将 nginx 的以下值调大, 这里我修改的是后端的nginx，前端可以不改动\nhttp { client_header_buffer_size 32k; large_client_header_buffers 4 32k; } 重启 nginx，解决。\n","date":"2025-12-22T00:36:03+08:00","permalink":"https://blog.lufei.de/p/510/","title":"nginx配置反向代理400错误解决办法"},{"content":" 注意事项：\n每次在终端申请证书都要先执行菜单5，修改配置 仅当前终端有效，退出无痕，安全拉满 仅适配域名托管在CF debian12测试通过 脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-manager.sh \u0026amp;\u0026amp; chmod +x ssl-manager.sh \u0026amp;\u0026amp; ./ssl-manager.sh 预览\n╔════════════════════════════════════════╗ ║ SSL 证书管理工具 ╚════════════════════════════════════════╝ 📊 证书统计: 有效证书: 2 个 域名列表: 2 个 📋 当前配置: 📧 邮箱: 123456@qq.com 🔑 Token: TOKEN****** 📌 主菜单 1. 申请新证书 2. 批量续期所有证书 3. 续期特定域名 4. 管理域名列表 5. 修改配置 6. 安装Lego工具 7. 查看帮助 0. 退出 ──────────────────────────────────────────── 请选择操作 (0-7): 定时任务 注意：在脚本菜单中修改是变量，是临时的，所以需要退出脚本修改才算长久\n修改配置 nano /root/ssl-manager.conf 替换成你的CF账号邮箱和Token (不是全局key)\n每周一凌晨2点检查 (crontab -l 2\u0026gt;/dev/null; echo \u0026#34;0 2 * * 1 /root/ssl-manager.sh auto-renew\u0026#34;) | crontab - 查看定时任务\ncrontab -l ","date":"2025-12-20T23:42:35+08:00","permalink":"https://blog.lufei.de/p/509/","title":"强大的ssl证书申请/管理/自动续期脚本"},{"content":" 虽然是针对nginx设计的脚本，\n不管你是否安装了nginx，不影响使用，只要80端口没有被占用\n忽略nginx警告即可，如果你不使用nginx\n首次申请 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ip-cert-apply.sh \u0026amp;\u0026amp; chmod +x ip-cert-apply.sh \u0026amp;\u0026amp; ./ip-cert-apply.sh 成功提示：\n检测证书申请结果... ✓ 证书申请成功！ 证书文件: /root/lego/certificates/3.3.3.3.crt 私钥文件: /root/lego/certificates/3.3.3.3.key 复制证书到nginx目录... ✓ 证书已复制到 /etc/nginx/ssl/ip 重新启动nginx服务... 警告: nginx启动失败 === 证书申请完成 === 公网IP: 3.3.3.3 证书文件: /etc/nginx/ssl/ip/3.3.3.3.crt 私钥文件: /etc/nginx/ssl/ip/3.3.3.3.key 如果遇到什么错误，重启docker容器\nsudo systemctl restart docker 续期脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ip-renew.sh \u0026amp;\u0026amp; chmod +x ip-renew.sh \u0026amp;\u0026amp; ./ip-renew.sh 提示\n执行证书续期... [3.3.3.3] acme: renewalInfo endpoint indicates that renewal is not needed [3.3.3.3] The certificate expires in 6 days, the number of days defined to perform the renewal is 2: no ✓ 证书续期成功！ 更新nginx证书文件... ✓ 证书文件已更新 提示：不需要续订，证书6天后到期\n因为你才刚申请证书，还没到期\n定时任务 (crontab -l 2\u0026gt;/dev/null; echo \u0026#34;5 3 * * * /root/ip-renew.sh \u0026gt;/root/lego-renew.log 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 查看定时任务\ncrontab -l ","date":"2025-12-20T13:54:02+08:00","permalink":"https://blog.lufei.de/p/508/","title":"一键ip证书申请脚本"},{"content":"deny方式 零依赖｜只用 Nginx｜运维只需写文件\n脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx-b.sh \u0026amp;\u0026amp; chmod +x nginx-b.sh \u0026amp;\u0026amp; ./nginx-b.sh 然后在 Nginx 配置中引入黑名单,例如\n# ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name www.xxxx.cc; # ===== IP / UA 黑名单（最优位置）===== include /etc/nginx/dynamic/blacklist.conf; 核心思想：\n维护一个纯文本黑名单文件：/etc/nginx/blacklist.txt（每行一个 IP）\n用一个 Shell 脚本自动转成 deny 配置并 重载nginx\n通过 inotifywait 监听文件变化，改完即生效\n配合fail2ban（cc策略）检测到403状态码，封禁，完美联动\n使用方式： 运维只需编辑 /etc/nginx/blacklist.txt, 或者使用菜单2\n示例内容\n1.2.3.4 5.6.7.8/24 保存文件后，3 秒内自动封禁！无需任何命令！\n优点： 只需一个文本文件 + 一个 Shell 脚本 完全兼容原生 Nginx\n仅允许中国用户访问 脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cn-nginx.sh \u0026amp;\u0026amp; chmod +x cn-nginx.sh \u0026amp;\u0026amp; ./cn-nginx.sh 然后在nginx站点配置\n# Include other configuration files include /etc/nginx/conf.d/bing-bot.conf; include /etc/nginx/conf.d/china-ipv4.conf; include /etc/nginx/conf.d/china-ipv6.conf; # Access control allow 127.0.0.1; allow ::1; deny all; 重载生效\nnginx -t nginx -s reload 验证方法： 国内访问→ 应正常打开； 使用境外代理或VPS访问 → 应返回403 Forbidden；\n","date":"2025-12-19T21:10:01+08:00","permalink":"https://blog.lufei.de/p/507/","title":"nginx 防御教程之Shell脚本（二）"},{"content":" 基于 nginx 基础上，非docker nginx\n测试系统：debian12\n防CC攻击过滤器基于nginx的limit速率限制配置，判断403和429状态码\n使用ufw封禁\n注意：日志要存在，避免报错\nfail2ban脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/f2.sh \u0026amp;\u0026amp; chmod +x f2.sh \u0026amp;\u0026amp; ./f2.sh 相关命令 # 查看 Fail2Ban 服务状态 sudo systemctl status fail2ban # 重启 sudo systemctl restart fail2ban # 查看所有监狱 sudo fail2ban-client status # 查看 Nginx 相关监狱 sudo fail2ban-client status sshd sudo fail2ban-client status nginx-bad-request sudo fail2ban-client status nginx-cc # 测试 Fail2Ban 配置语法 sudo fail2ban-server -t # Fail2Ban 实时日志 sudo tail -f /var/log/fail2ban.log # 日志 sudo journalctl -u fail2ban -f -n 50 编辑过滤器\nsudo nano /etc/fail2ban/filter.d/nginx-bad-request.conf 查看jail配置\nsudo cat /etc/fail2ban/jail.local 模拟 SSH 暴力尝试 在另外一台服务器上安装 sshpass\nsudo apt install sshpass 模拟5次登录\nfor i in {1..5}; do sshpass -p \u0026#39;wrongpassword\u0026#39; ssh \\ -o StrictHostKeyChecking=no \\ -p 5533 fakeuser@目标IP echo \u0026#34;尝试 $i 次\u0026#34; done 查询封禁情况\nsudo fail2ban-client status sshd 解封\nsudo fail2ban-client unban IP地址 模拟cc攻击 重点：先修改nginx限流配置\nnano /etc/nginx/nginx.conf 修改，例如\n# Rate limiting limit_req_zone $binary_remote_addr zone=example_zone:50m rate=2r/s; limit_req zone=example_zone burst=8 nodelay; limit_req_status 429; 重点参数：rate=2r/s和burst=8 数值要小，太大检测不到，之后再改回来\n然后，在另外一台服务器上测试攻击，代码如下(假设你的站点是www.xxxx.com)\nwhile true; do curl -i https://www.xxxx.com/ sleep 0.1 # 设置请求间隔，确保超出限速 done 查看站点包含429状态码的日志，\ngrep \u0026#39; 429 \u0026#39; /var/log/nginx/www.xxxx.com.access.log 再查看是否封禁\nsudo fail2ban-client status nginx-cc 解封\nsudo fail2ban-client unban IP地址 错误排查 停止服务并清理现有配置 sudo systemctl stop fail2ban sudo rm -f /etc/fail2ban/jail.d/* 仅配置最基础的 SSH 防护（jail.local） sudo tee /etc/fail2ban/jail.local \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; [DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 ignoreip = 127.0.0.1/8 [sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 3 EOF 启动 / 重启服务 sudo systemctl start fail2ban sudo systemctl restart fail2ban 验证配置是否生效 sudo fail2ban-client status 移除allowipv6警告 去掉WARNING \u0026lsquo;allowipv6\u0026rsquo; not defined in \u0026lsquo;Definition\u0026rsquo;. Using default one: \u0026lsquo;auto\u0026rsquo;\nnano /etc/fail2ban/fail2ban.local 内容：\n[DEFAULT] allowipv6 = auto 重启\nsudo systemctl restart fail2ban 验证\nsudo fail2ban-client status ","date":"2025-12-17T21:24:27+08:00","permalink":"https://blog.lufei.de/p/506/","title":"nginx防御教程之fail2ban（一）"},{"content":" 项目：https://github.com/0xJacky/nginx-ui\n文档：https://nginxui.com/zh_CN/\n系统：debian12\n先安装nginx # 1. 安装依赖 sudo apt update sudo apt install curl gnupg2 ca-certificates lsb-release -y # 2. 安全导入密钥（最小权限原则） curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg \u0026gt;/dev/null # 3. 添加稳定版源（使用HTTPS） echo \u0026#34;deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/debian $(lsb_release -cs) nginx\u0026#34; | sudo tee /etc/apt/sources.list.d/nginx.list # 4. 设置精确的优先级 echo -e \u0026#34;Package: nginx*\\nPin: origin nginx.org\\nPin-Priority: 900\u0026#34; | sudo tee /etc/apt/preferences.d/99-nginx \u0026gt;/dev/null # 5. 安装 sudo apt update sudo apt install -y nginx 启动并设置开机自启\nsudo systemctl start nginx sudo systemctl enable nginx 验证安装\nsudo systemctl status nginx 常用命令\n# 停止Nginx sudo systemctl stop nginx # 重启Nginx sudo systemctl restart nginx # 重新加载配置（不中断服务） sudo systemctl reload nginx # 检查配置文件语法 sudo nginx -t 目录结构\n官方源的 Nginx 路径：\n# 主配置文件 /etc/nginx/nginx.conf # 网站配置 /etc/nginx/conf.d/ # 默认网站目录 /usr/share/nginx/html 或 /var/www/html # 日志目录 /var/log/nginx/ # 二进制文件 /usr/sbin/nginx /etc/nginx/sites-available/default\nserver { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } } 禁止使用 IP 访问 先生成自签名证书\nsudo mkdir -p /etc/nginx/ssl sudo openssl req -x509 -nodes -days 3650 \\ -newkey rsa:2048 \\ -keyout /etc/nginx/ssl/ip_block.key \\ -out /etc/nginx/ssl/ip_block.crt \\ -subj \u0026#34;/C=XX/ST=XX/L=XX/O=XX/CN=ip_block\u0026#34; 2\u0026gt;/dev/null 清空并创建新的 default 配置\nsudo tee /etc/nginx/sites-available/default \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # HTTP 阻止 - 禁止IP访问 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } # HTTPS 阻止 - 禁止IP访问 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_certificate /etc/nginx/ssl/ip_block.crt; ssl_certificate_key /etc/nginx/ssl/ip_block.key; return 444; } EOF 重载nginx\nsudo systemctl reload nginx 安装Nginx UI bash -c \u0026#34;$(curl -L https://cloud.nginxui.com/install.sh)\u0026#34; @ install -r https://cloud.nginxui.com/ 文档：https://nginxui.com/zh_CN/guide/install-script-linux\n常用命令：\nsystemctl start nginx-ui systemctl stop nginx-ui systemctl restart nginx-ui systemctl status nginx-ui systemctl enable nginx-ui 防火墙配置 如果需要外部访问 Nginx-UI\nsudo ufw allow 9000/tcp sudo ufw reload 放行80和443\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload 或者（推荐）\nsudo ufw delete allow 80/tcp sudo ufw delete allow 443/tcp sudo ufw allow \u0026#39;Nginx Full\u0026#39; 验证\nsudo ufw status numbered 查看Nginx进程运行的用户\nps aux | grep nginx 查看缓存大小\ndu -sh /var/cache/nginx/proxy 查询爬虫\ngrep \u0026#34;ClaudeBot\u0026#34; /var/log/nginx/access.log 删除缓存\nrm -rf /var/cache/nginx/proxy/* 调整日志时间\nsudo timedatectl set-timezone Asia/Shanghai timedatectl 重启 Nginx 服务来使更改生效\nsudo systemctl restart nginx 拦截爬虫\n# 拦截爬虫 if ($http_user_agent ~* \u0026#34;ClaudeBot|Claude-User|Claude-SearchBot|OAI-SearchBot|ChatGPT-User|GPTBot|Amazonbot|facebookexternalhit|facebookcatalog|meta-webindexer|meta-externalads|meta-externalagent|meta-externalfetcher\u0026#34;) { return 403; } 测试\nnginx -t \u0026amp;\u0026amp; systemctl reload nginx nginx配置\nuser www-data; worker_processes auto; error_log /var/log/nginx/error.log notice; error_log /var/log/nginx/error.local.log notice; pid /run/nginx.pid; worker_rlimit_nofile 65535; thread_pool default threads=8 max_queue=65536; events { use epoll; multi_accept on; worker_connections 1024; } stream { include /etc/nginx/streams-enabled/*; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # Security server_tokens off; http2 on; http2_max_concurrent_streams 512; http2_recv_buffer_size 512k; http2_body_preread_size 128k; http2_chunk_size 16k; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:30m; ssl_session_timeout 1h; ssl_certificate_cache max=2000 inactive=5m valid=20m; ssl_buffer_size 4k; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; #add_header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; always; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; # HSTS add_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains\u0026#34; always; # Hash sizes server_names_hash_max_size 1024; server_names_hash_bucket_size 128; types_hash_max_size 2048; types_hash_bucket_size 128; variables_hash_max_size 1024; variables_hash_bucket_size 128; proxy_headers_hash_max_size 1024; proxy_headers_hash_bucket_size 128; # File caching open_file_cache max=10000 inactive=30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on; # Rate limiting limit_req_zone $binary_remote_addr zone=example_zone:50m rate=50r/s; limit_req zone=example_zone burst=150 nodelay; limit_req_status 429; limit_conn_zone $binary_remote_addr zone=addr:20m; limit_conn addr 200; limit_conn_status 429; # Proxy caching proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=my_proxy_cache:50m max_size=5g inactive=12h use_temp_path=off; proxy_cache_key \u0026#34;$scheme$request_method$host$request_uri\u0026#34;; #proxy_cache_bypass $http_cookie; #proxy_no_cache $http_cookie; add_header X-Cache-Status $upstream_cache_status; add_header Vary Accept-Encoding; proxy_cache_methods GET HEAD; proxy_cache_valid 200 301 302 304 12h; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 400 403 429 0; proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_background_update on; # Proxy buffering proxy_buffering on; proxy_buffer_size 16k; proxy_buffers 8 16k; proxy_busy_buffers_size 32k; proxy_socket_keepalive on; proxy_intercept_errors on; proxy_hide_header X-Powered-By; # Logging log_format main \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; \u0026#39; \u0026#39;$status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#39; \u0026#39;\u0026#34;$http_user_agent\u0026#34; \u0026#34;$http_x_forwarded_for\u0026#34;\u0026#39;; access_log /var/log/nginx/access.log main buffer=512k flush=10s; # File transfer optimizations sendfile on; tcp_nopush on; tcp_nodelay on; # gzip gzip on; gzip_static on; #gzip_vary on; gzip_comp_level 6; gzip_min_length 1024; gzip_buffers 8 256k; gzip_types text/plain text/css application/javascript application/json application/xml image/svg+xml font/woff font/woff2 application/wasm; # Connection \u0026amp; timeout reset_timedout_connection on; client_header_buffer_size 4k; client_body_buffer_size 256k; large_client_header_buffers 8 16k; output_buffers 8 1024k; client_body_timeout 60s; client_header_timeout 60s; send_timeout 60s; keepalive_timeout 65s 60s; keepalive_requests 5000; proxy_connect_timeout 10s; proxy_send_timeout 60s; proxy_read_timeout 60s; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 反向代理\n# ===== WebSocket 判断 ===== map $http_upgrade $connection_upgrade { default upgrade; \u0026#39;\u0026#39; close; } # ===== HTTP → HTTPS ===== server { listen 80; listen [::]:80; server_name p.xxxx.cc; return 301 https://$host$request_uri; } # ===== HTTPS 443 ===== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name p.xxxx.cc; ssl_certificate /etc/nginx/ssl/p.xxxx.cc_P256/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/p.xxxx.cc_P256/private.key; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; 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; proxy_pass http://127.0.0.1:8084/; } } Nginx 反向代理之负载均衡\n# 判断 WebSocket map $http_upgrade $connection_upgrade { default upgrade; \u0026#39;\u0026#39; close; } # 定义后端服务器池 upstream upstream web3 { keepalive 320; keepalive_requests 1000; keepalive_timeout 60s; server 3.3.3.3:80 fail_timeout=10s max_fails=2 weight=3; server 5.5.5.5:80 fail_timeout=10s max_fails=2 weight=1; } # HTTP 80 重定向到 HTTPS server { listen 80; listen [::]:80; server_name tk.xxxx.cc; access_log /var/log/nginx/tk.xxxx.cc.access.log main; error_log /var/log/nginx/tk.xxxx.cc.error.log warn; return 301 https://$host$request_uri; } # HTTPS 443 server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name tk.xxxx.cc; access_log /var/log/nginx/tk.xxxx.cc.access.log main; error_log /var/log/nginx/tk.xxxx.cc.error.log warn; ssl_certificate /etc/nginx/ssl/tk.xxxx.cc/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/tk.xxxx.cc/private.key; # =============================== # ② 动态内容（兜底接口 / 页面） # =============================== location / { proxy_pass http://web3; proxy_connect_timeout 3s; proxy_send_timeout 10s; proxy_read_timeout 10s; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; # 转发客户端信息 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; proxy_set_header X-Forwarded-Port $server_port; # WebSocket / keepalive proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # 代理缓存（动态，短缓存） proxy_cache my_proxy_cache; proxy_cache_lock on; proxy_cache_background_update on; #proxy_ignore_headers Set-Cookie; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_cache_methods GET HEAD; # 【显式声明动态缓存策略】 proxy_cache_valid 200 301 302 304 1h; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 400 403 429 0; # 浏览器端缓存 expires 10m; } # =============================== # ③ 静态资源代理及缓存 # =============================== location ~* \\.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ { proxy_pass http://web3; proxy_connect_timeout 3s; proxy_send_timeout 10s; proxy_read_timeout 10s; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; 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; proxy_set_header X-Forwarded-Port $server_port; proxy_http_version 1.1; # 代理缓存（静态） proxy_cache my_proxy_cache; proxy_cache_lock on; proxy_cache_background_update on; #proxy_ignore_headers Set-Cookie; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_cache_methods GET HEAD; # 浏览器缓存 expires 30d; etag on; # 高并发优化 aio threads; log_not_found off; access_log off; } } 静态站点\n# HTTP重定向 server { listen 80; listen [::]:80; server_name p.xxxx.cc; return 301 https://$server_name$request_uri; } # HTTPS主配置 server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name p.xxxx.cc; # SSL证书 ssl_certificate /etc/nginx/ssl/p.xxxx.cc_P256/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/p.xxxx.cc_P256/private.key; # 站点配置 root /var/www/html/p.xxxx.cc; index index.html index.htm index.php; access_log /var/log/nginx/p.xxxx.cc.log; error_log /var/log/nginx/p.xxxx.cc.error.log; location / { try_files $uri $uri/ =404; } location ~* \\.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; } location ~* \\.(woff|woff2|ttf|eot|svg)$ { expires 1y; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } } 日志轮转 sudo nano /etc/logrotate.d/nginx 如下\n/var/log/nginx/*.log { daily size 100M rotate 3 missingok notifempty compress delaycompress create 0640 www-data adm sharedscripts postrotate [ -s /run/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /run/nginx.pid) endscript } 检查定时任务是否正确设置\nsystemctl status logrotate.timer 查看下次执行时间\nsystemctl list-timers logrotate.timer 卸载方法 重装 Nginx 清理命令\nsudo systemctl stop nginx sudo apt remove --purge nginx nginx-common nginx-core -y sudo rm -f /etc/apt/sources.list.d/nginx.list sudo rm -f /usr/share/keyrings/nginx-archive-keyring.gpg sudo rm -f /etc/apt/preferences.d/99-nginx sudo apt autoremove -y sudo apt update 彻底卸载\n# 停止服务 sudo systemctl stop nginx sudo systemctl disable nginx # 卸载所有 Nginx 相关包 sudo apt remove --purge -y \u0026#39;nginx*\u0026#39; # 删除所有配置文件 sudo rm -rf /etc/nginx # 主配置目录 sudo rm -rf /var/log/nginx # 日志目录 sudo rm -rf /var/cache/nginx # 缓存目录 # 删除网站目录（谨慎！） # sudo rm -rf /usr/share/nginx/html # sudo rm -rf /var/www/html # 删除你添加的源配置 sudo rm -f /etc/apt/sources.list.d/nginx.list sudo rm -f /usr/share/keyrings/nginx-archive-keyring.gpg sudo rm -f /etc/apt/preferences.d/99-nginx # 清理残留 sudo apt autoremove -y sudo apt autoclean sudo apt update # 验证清理 echo \u0026#34;验证清理结果：\u0026#34; ls /etc/nginx 2\u0026gt;/dev/null \u0026amp;\u0026amp; echo \u0026#34;⚠ /etc/nginx 仍存在\u0026#34; || echo \u0026#34;✓ /etc/nginx 已删除\u0026#34; ls /etc/apt/sources.list.d/nginx.list 2\u0026gt;/dev/null \u0026amp;\u0026amp; echo \u0026#34;⚠ nginx.list 仍存在\u0026#34; || echo \u0026#34;✓ nginx.list 已删除\u0026#34; 卸载Nginx UI\nbash -c \u0026#34;$(curl -L https://cloud.nginxui.com/install.sh)\u0026#34; @ remove --purge ","date":"2025-12-14T01:21:53+08:00","permalink":"https://blog.lufei.de/p/505/","title":"Nginx-ui 部署教程"},{"content":"修改配置\nnano /etc/haproxy/haproxy.cfg 配置1：\nhttps://github.com/woniu336/open_shell/blob/main/haproxy/001.cfg 配置2：\nhttps://github.com/woniu336/open_shell/blob/main/haproxy/002.cfg 配置3：\nhttps://github.com/woniu336/open_shell/blob/main/haproxy/003.cfg 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 重启\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy ","date":"2025-12-12T18:52:52+08:00","permalink":"https://blog.lufei.de/p/504/","title":"haproxy配置分享"},{"content":" 项目：https://github.com/muleiwu/dwz-server\n开放防火墙 # 查看 UFW 状态 sudo ufw status numbered # 如果要禁止外部访问 8080，用 UFW 更简单： sudo ufw deny 8080/tcp # 如果要允许访问： sudo ufw allow 8080/tcp # 删除规则： sudo ufw delete deny 8080/tcp 一键安装 mkdir -p mliev-dwz cd ~/mliev-dwz wget https://github.com/muleiwu/dwz-server/releases/latest/download/dwz-server_Linux_x86_64.tar.gz tar -xzf dwz-server_Linux_x86_64.tar.gz chmod +x dwz-server # 创建所有必要目录 mkdir -p config data logs # 设置权限 chmod 755 config data logs # 后台运行 nohup ./dwz-server \u0026gt; dwz.log 2\u0026gt;\u0026amp;1 \u0026amp; echo \u0026#34;✅ 服务已重启\u0026#34; echo \u0026#34;📂 数据目录已创建: $(pwd)/data\u0026#34; echo \u0026#34;🌐 请访问配置页面，数据库路径填写: ./data/sqlite.db\u0026#34; 打开浏览器访问 http://localhost:8080 进行初始化配置。\n注意：数据库选择SQLite和内存缓存 , 数据库路径填写 ./data/sqlite.db\n一键卸载脚本 cat \u0026gt; ~/uninstall_dwz.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash echo \u0026#34;🗑️ 开始卸载 dwz-server...\u0026#34; # 停止服务 echo \u0026#34;⏹️ 停止服务...\u0026#34; pkill -9 dwz-server # 删除整个项目目录（包含压缩包） echo \u0026#34;📁 删除文件...\u0026#34; rm -rf ~/mliev-dwz # 清理可能的 nohup 日志 rm -f ~/nohup.out # 清理防火墙（可选，取消注释以启用） # sudo ufw delete allow 8080/tcp echo \u0026#34;✅ 卸载完成！\u0026#34; echo \u0026#34;📋 已删除目录: ~/mliev-dwz\u0026#34; EOF chmod +x ~/uninstall_dwz.sh 运行\n~/uninstall_dwz.sh 确认已停止\nps aux | grep dwz-server caddy 反代 nano /etc/caddy/Caddyfile 配置\nssl.xxxx.com { reverse_proxy 127.0.0.1:8080 } 重启生效\nsystemctl restart caddy 其他 # 编辑配置文件 nano ~/mliev-dwz/config/config.yaml # 修改后重启服务 cd ~/mliev-dwz killall dwz-server nohup ./dwz-server \u0026gt; dwz.log 2\u0026gt;\u0026amp;1 \u0026amp; ","date":"2025-12-11T00:31:35+08:00","permalink":"https://blog.lufei.de/p/503/","title":"木雷短网址"},{"content":" 高效封禁大量恶意IP\n脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ip_blacklist.sh \u0026amp;\u0026amp; chmod +x ip_blacklist.sh \u0026amp;\u0026amp; ./ip_blacklist.sh 快捷键\necho \u0026#34;alias ipban=\u0026#39;/root/ip_blacklist.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 输入ipban即可启动脚本\n开机自动加载规则（脚本已经包含）\nsudo cat \u0026gt; /etc/rc.local \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash ipset restore -f /etc/ipset.conf iptables-restore \u0026lt; /etc/iptables/rules.v4 exit 0 EOF sudo chmod +x /etc/rc.local 检查服务状态\nsystemctl status rc-local.service 手动查询 # ✅ 查看ipset集合 ipset list blacklist # ✅ 查看iptables规则是否生效 iptables -L INPUT -n | grep blacklist # ✅ 检查某个IP是否被封禁 ipset test blacklist 194.110.115.222 # 查看完整的INPUT链规则顺序 iptables -L INPUT -n --line-numbers # 或者 sudo iptables -v -L INPUT -n 其他命令\n# 手动添加IP（不用脚本） ipset add blacklist 1.2.3.4 # 手动删除IP ipset del blacklist 1.2.3.4 # 清空所有IP ipset flush blacklist # 查看黑名单的详细配置（包括类型、大小等） ipset list blacklist -t 其他命令2\n# 查看所有ipset集合 ipset list # 只看集合名称 ipset list -n # 查看 blacklist 中有哪些 IP sudo ipset list blacklist # 查看 gptbot_blacklist 中有哪些网段 sudo ipset list gptbot_blacklist # 查看完整的 iptables INPUT 链规则 sudo iptables -L INPUT -n --line-numbers 删除规则 查看当前规则集 sudo ipset list -n 删除 blacklist sudo iptables -D INPUT -m set --match-set blacklist src -j DROP sudo ipset destroy blacklist 删除 gptbot_blacklist sudo iptables -D INPUT -m set --match-set gptbot_blacklist src -j DROP sudo ipset destroy gptbot_blacklist 保存配置 sudo ipset save \u0026gt; /etc/ipset.conf sudo iptables-save \u0026gt; /etc/iptables.rules 验证删除 sudo ipset list -n sudo iptables -L INPUT -v -n 注意事项\n⚠️ 删除顺序很重要：\n必须先删除使用该集合的 iptables 规则 然后才能删除 ipset 规则集 否则会报错：ipset v7.x: Set cannot be destroyed: it is in use by a kernel component ","date":"2025-12-09T11:16:20+08:00","permalink":"https://blog.lufei.de/p/502/","title":"iptables + ipset 黑名单管理脚本"},{"content":" 免费API限制\n每天1000次查询 每分钟不超过一定次数 下载check_ip.php\nhttps://github.com/woniu336/open_shell/blob/main/check_ip.php 下载index.html\nhttps://github.com/woniu336/open_shell/blob/main/index.html 放在同一个目录下，修改check_ip.php, 添加密钥\n使用步骤 获取API密钥 访问 https://www.abuseipdb.com/register 注册账号并获取免费API密钥\n配置PHP文件 在 check_ip.php 第11行替换你的API密钥：\ndefine(\u0026#39;ABUSEIPDB_API_KEY\u0026#39;, \u0026#39;你的API密钥\u0026#39;); 部署文件 将两个文件上传到支持PHP的服务器（例如宝塔面板）\n功能特点 ✅ 滥用置信度评分（带颜色进度条） ✅ ISP、用途类型、ASN信息 ✅ 地理位置（国家和城市） ✅ 报告类别标签 ✅ 最近3条报告摘要 ✅ 最近活跃警告 ✅ 优雅的错误处理 ✅ 响应式设计 ","date":"2025-12-08T20:55:17+08:00","permalink":"https://blog.lufei.de/p/501/","title":"IP滥用检查系统"},{"content":"快速安装 curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_asn.py \u0026amp;\u0026amp; chmod +x block_asn.py \u0026amp;\u0026amp; ./block_asn.py 功能说明\n这个脚本可以帮你：\n通过ASN号码批量封禁IP段 自动查询ASN下的所有IP地址 将规则添加到防火墙并永久保存 主要特性\n高性能封禁 使用 ipset + iptables 组合，支持同时封禁数千个IP段\n简单易用 提供交互式菜单：封禁ASN、查询ASN信息、移除封禁、查看封禁列表、测试IP\n智能检测 自动检测并提示安装所需的系统依赖\n双栈支持 同时支持IPv4和IPv6\n持久化配置 服务器重启后规则自动生效\n使用场景\n封禁爬虫：屏蔽某些云厂商的过度抓取 地域封锁：限制特定地区的访问 防御攻击：快速封禁攻击来源 节省带宽：减少无效流量消耗 常见ASN参考\nASN 组织 AS398722 Censys AS14061 DigitalOcean AS135377 UCLOUD ","date":"2025-12-07T21:44:39+08:00","permalink":"https://blog.lufei.de/p/500/","title":"一键封禁整个 ASN — 高效服务器防火墙脚本！"},{"content":" 项目：https://github.com/Safe3/openresty-manager\n文档：https://github.com/Safe3/openresty-manager/blob/main/README_CN.md\n基于OpenResty提供的强大web的管理界面，具有服务器状态监控、安全防护、免费SSL证书、主机管理、应用商店等功能。\n安装 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/om.sh \u0026amp;\u0026amp; chmod +x om.sh \u0026amp;\u0026amp; ./om.sh 固定版\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/omm.sh \u0026amp;\u0026amp; chmod +x omm.sh \u0026amp;\u0026amp; ./omm.sh 访问 https://your-ip:34567 ，用户名: admin ，密码: #Passw0rd\n备份脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/om-b.sh \u0026amp;\u0026amp; chmod +x om-b.sh \u0026amp;\u0026amp; ./om-b.sh 还原\ntar --warning=no-timestamp -xzf /root/backup_20251211_225222.tar.gz -C /opt/om \u0026amp;\u0026amp; /opt/om/oms -s restart 启动 # 启动服务 /opt/om/oms -s start # 检查服务状态 /opt/om/oms -s status # 停止服务 /opt/om/oms -s stop # 重新启动 /opt/om/oms -s start 配置 这部分是DIY，为了满足个性化需求\nDNS解析, 在系统设置-OpenResty-DNS解析修改\nresolver 1.1.1.1 8.8.8.8 1.0.0.1 valid=300s ipv6=off local=off; HSTS\nadd_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; 将 HTTPS 请求重定向到 HTTP（特殊情况，关闭强制ssl和hsts）\n# 添加：将 HTTPS 请求重定向到 HTTP if ($scheme = https) { return 301 http://$host$request_uri; } 301重定向（在站点高级配置修改）\nreturn 301 \u0026#39;http://www.xxxx.cc$request_uri\u0026#39;; 屏蔽敏感信息头（在系统设置-OpenResty-缓存资源）修改\nadd_header X-Cf-Cache $upstream_cache_status always; more_set_headers \u0026#34;Server: \u0026#34;; 负载均衡（轮询）\nserver 3.3.3.3:80 weight=3 max_fails=3 fail_timeout=30s; server 6.6.6.6:80 weight=1 max_fails=3 fail_timeout=30s; keepalive 320; keepalive_requests 1000; 禁止敏感文件与目录访问\n# 敏感文件防护（放在主要 location 之前，优先匹配） location ~ /\\. { deny all; return 404; } location ~* \\.(env|git|bak|log|sql|zip)$ { deny all; return 403; } 禁止访问ip ，添加上游（127.0.0.1:80）添加ip站点，配置如下\nserver { listen 80; listen 443; http2 on; server_name \u0026#39;面板ip\u0026#39;; # 直接关闭连接，不返回任何内容 return 444; } haproxy反代\n（在在系统设置-OpenResty-Real IP）后面添加\nset_real_ip_from 反代ip; real_ip_header proxy_protocol; real_ip_recursive on; 站点修改\nlisten 443 ssl proxy_protocol; 一键替换\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/update_proxy_protocol.sh \u0026amp;\u0026amp; chmod +x update_proxy_protocol.sh \u0026amp;\u0026amp; ./update_proxy_protocol.sh 查看站点日志\ngrep \u0026#34;xxx.com\u0026#34; /opt/om/nginx/logs/access.log | tail -n 10 仅允许中国大陆访问 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/op-cn-whitelist.sh \u0026amp;\u0026amp; chmod +x op-cn-whitelist.sh \u0026amp;\u0026amp; ./op-cn-whitelist.sh 然后在站点添加\n# IP 白名单：仅允许中国大陆IP和必应蜘蛛访问 include /opt/om/nginx/conf/bing-bot.conf; include /opt/om/nginx/conf/china-ipv4.conf; include /opt/om/nginx/conf/china-ipv6.conf; allow 127.0.0.1; allow ::1; deny all; 拦截恶意爬虫 cat \u0026gt; /opt/om/nginx/conf/ai_bot_block.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; if ($http_user_agent ~* \u0026#34;ClaudeBot|Claude-User|Claude-SearchBot|OAI-SearchBot|ChatGPT-User|GPTBot|Amazonbot|facebookexternalhit|facebookcatalog|meta-webindexer|meta-externalads|meta-externalagent|meta-externalfetcher\u0026#34;) { return 403; } EOF openresty -t -p /opt/om/nginx \u0026amp;\u0026amp; openresty -s reload -p /opt/om/nginx 在站点配置中添加 (location前面)\ninclude ai_bot_block.conf; 测试拦截效果（403）\ncurl -I -A \u0026#34;ClaudeBot\u0026#34; https://www.xxxx.cc curl -I -A \u0026#34;GPTBot\u0026#34; https://www.xxxx.cc curl -I -A \u0026#34;ChatGPT-User\u0026#34; https://www.xxxx.cc 应用限流 （在在系统设置-OpenResty-Real IP）后面添加\nlimit_req_zone $binary_remote_addr zone=one:30m rate=50r/s; limit_conn_zone $binary_remote_addr zone=addr:20m; limit_req_status 429; limit_conn_status 429; 站点添加 , 在站点的 include acme_challenge.conf;后面添加\nlimit_req zone=one burst=100 nodelay; limit_conn addr 50; HTTP 方法限制 # HTTP 方法限制：只允许 GET、HEAD、POST（强烈推荐） if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } 测试\ncurl -I -X TRACE https://www.xxxx.cc 配置参考\ninclude log.conf; include acme_challenge.conf; # IP 白名单：仅允许中国大陆IP和必应蜘蛛访问 include /opt/om/nginx/conf/bing-bot.conf; include /opt/om/nginx/conf/china-ipv4.conf; include /opt/om/nginx/conf/china-ipv6.conf; allow 127.0.0.1; allow ::1; deny all; # AI 爬虫拦截 include ai_bot_block.conf; # 限流配置：防止单个IP高频请求 limit_req zone=one burst=100 nodelay; limit_conn addr 50; limit_req_status 429; limit_conn_status 429; # HTTP 方法限制：只允许 GET、HEAD、POST if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } 日志分析 分析脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx_report.sh \u0026amp;\u0026amp; chmod +x nginx_report.sh \u0026amp;\u0026amp; ./nginx_report.sh 使用方式\n./nginx_report.sh # 使用默认配置 ./nginx_report.sh /opt/om/nginx/logs/xxx.com.log # 指定日志文件 ./nginx_report.sh /opt/om/nginx/logs/access.log 7 # 分析最近7天 ./nginx_report.sh /opt/om/nginx/logs/access.log 1 \u0026gt; report.txt # 保存报告 便捷方式\nmkdir -p /opt/om/nginx/scripts mv nginx_report.sh /opt/om/nginx/scripts/ echo \u0026#34;alias log=\u0026#39;/opt/om/nginx/scripts/nginx_report.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 终端输入log即可查看日志\n502分析脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx_502_dashboard.sh \u0026amp;\u0026amp; chmod +x nginx_502_dashboard.sh \u0026amp;\u0026amp; ./nginx_502_dashboard.sh 快捷键(502)\nmkdir -p /opt/om/nginx/scripts mv nginx_502_dashboard.sh /opt/om/nginx/scripts/ echo \u0026#34;alias 502=\u0026#39;/opt/om/nginx/scripts/nginx_502_dashboard.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 统计 502 次数最多的 IP（重点恶意）\nawk \u0026#39;$9==502 {print $1}\u0026#39; /opt/om/nginx/logs/access.log \\ | sort | uniq -c | sort -nr | head -10 👉 优先封这些 IP\n命中恶意 URL 的 IP, 针对你给出的高风险路径：\ngrep -E \u0026#39; /(wp-login\\.php|zabbix|xmldata|dns-query|status\\.php|sugar_version\\.json|/aab9|/aaa9|cgi-bin|\\.jsp|\\.axd|login\\.do)\u0026#39; \\ /opt/om/nginx/logs/access.log \\ | awk \u0026#39;$9==502 {print $1, $7}\u0026#39; \\ | sort | uniq -c | sort -nr 这些基本都是：\n漏洞扫描 僵尸网络探测 DNS over HTTPS 滥用 WordPress / Zabbix 扫描器 判断是否“封段”而不是封 IP\nawk \u0026#39;$9==502 { split($1,ip,\u0026#34;.\u0026#34;); print ip[1]\u0026#34;.\u0026#34;ip[2]\u0026#34;.\u0026#34;ip[3]\u0026#34;.0/24\u0026#34; }\u0026#39; /opt/om/nginx/logs/access.log \\ | sort | uniq -c | sort -nr | head -10 经验法则\n同一 /24 ≥ 5 次 👉 封段优于封 IP 按「小时 + IP」定位异常源（对照你给的时段）\n例如查看 07:00 的攻击 IP：\ngrep \u0026#39;13/Dec/2025:07:\u0026#39; /opt/om/nginx/logs/access.log \\ | awk \u0026#39;$9==502 {print $1}\u0026#39; \\ | sort | uniq -c | sort -nr 同时看 IP + URL（确认是否恶意）\nawk \u0026#39;$9==502 {print $1, $7}\u0026#39; /opt/om/nginx/logs/access.log \\ | sort | uniq -c | sort -nr | head -30 你会清楚看到：\nIP -\u0026gt; 不断扫 / IP -\u0026gt; wp-login.php IP -\u0026gt; dns-query 直接生成封禁 IP 列表（iptables / ipset 用）\nawk \u0026#39;$9==502 {print $1}\u0026#39; /opt/om/nginx/logs/access.log \\ | sort | uniq -c | awk \u0026#39;$1\u0026gt;=10 {print $2}\u0026#39; \u0026gt; bad_502_ips.txt 规则：502 ≥ 10 次直接视为恶意\n一行直接丢进 ipset（如果你在用）\nwhile read ip; do ipset add blacklist $ip; done \u0026lt; bad_502_ips.txt 再看 502 是否下降（最直观）\ntail -n 200 /opt/om/nginx/logs/access.log | grep \u0026#39; 502 \u0026#39; | wc -l 查找 IP 37.27.51.141 的最近 10 条访问日志\ngrep \u0026#39;37.27.51.141\u0026#39; /opt/om/nginx/logs/access.log | tail -n 10 同时看「时间 + URL + 状态码」（更直观）\ngrep \u0026#39;78.153.140.203\u0026#39; /opt/om/nginx/logs/access.log \\ | awk \u0026#39;{print $4, $7, $9}\u0026#39; \\ | tail -n 10 或者\ngrep \u0026#39;78.153.140.203\u0026#39; /opt/om/nginx/logs/access.log \\ | awk \u0026#39;{print \u0026#34;https://\u0026#34; $3 $7, $9}\u0026#39; \\ | tail -n 10 或者\ngrep \u0026#39;78.153.140.203\u0026#39; /opt/om/nginx/logs/access.log \\ | tail -n 10 升级 # 1. 停止服务 /opt/om/oms -s stop # 2. 备份当前版本 cp -r /opt/om /opt/om_backup_$(date +%Y%m%d) # 3. 下载新版本 if [ \u0026#34;$(uname -m)\u0026#34; = \u0026#34;x86_64\u0026#34; ]; then curl -L https://download.uusec.com/om.tgz -o /tmp/om_new.tgz else curl -L https://download.uusec.com/om_arm64.tgz -o /tmp/om_new.tgz fi # 4. 解压到临时目录 mkdir -p /tmp/om_new tar -zxf /tmp/om_new.tgz -C /tmp/om_new/ # 5. 替换程序文件（保留配置） # 注意：这里需要根据实际情况调整，只替换二进制文件 cp -f /tmp/om_new/om/oms /opt/om/ # 6. 重启服务 /opt/om/oms -s start # 7. 清理临时文件 rm -rf /tmp/om_new /tmp/om_new.tgz 卸载 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/uninstall.sh \u0026amp;\u0026amp; chmod +x uninstall.sh \u0026amp;\u0026amp; ./uninstall.sh ","date":"2025-12-02T00:41:02+08:00","permalink":"https://blog.lufei.de/p/498/","title":"openresty-manager开源反代面板"},{"content":"钉钉通知设置机器人,记得把监控服务器的ip地址添加到IP地址(段)\n监控脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ovh-k.sh \u0026amp;\u0026amp; chmod +x ovh-k.sh \u0026amp;\u0026amp; ./ovh-k.sh 常用命令（可在任何目录运行）:\n查看实时日志: pm2 logs ovh-monitor 查看进程状态: pm2 list 停止服务: pm2 stop ovh-monitor 重启服务: pm2 restart ovh-monitor 按 Ctrl+C 退出日志查看（服务会继续运行） 这个脚本是一个状态变化监控器：\n🎯 目标：监控特定型号（25sk/24sk/25rise）的补货情况 🔍 机制：每分钟对比当前状态和上次保存的状态 📢 通知：只在\u0026quot;从无到有\u0026quot;时发送通知 💾 记忆：通过 last_data.json 记住上次的状态 所以第一次会发现所有当前有货的，之后只会在补货或新型号上架时通知，避免重复骚扰。\n替换钉钉通知\ncd ovh-monitor-dingtalk # 替换 Webhook sed -i \u0026#34;s|DINGTALK_WEBHOOK: \u0026#39;.*\u0026#39;|DINGTALK_WEBHOOK: \u0026#39;你的新Webhook\u0026#39;|g\u0026#34; ecosystem.config.cjs # 替换 Secret sed -i \u0026#34;s|DINGTALK_SECRET: \u0026#39;.*\u0026#39;|DINGTALK_SECRET: \u0026#39;你的新Secret\u0026#39;|g\u0026#34; ecosystem.config.cjs # 重启服务 pm2 restart ovh-monitor ","date":"2025-11-30T11:53:14+08:00","permalink":"https://blog.lufei.de/p/497/","title":"监控ovh服务器上新，通过钉钉发送通知。"},{"content":"TCP参数调优\ncat \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; | sudo tee /etc/sysctl.conf \u0026gt; /dev/null fs.file-max = 6815744 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_ecn = 0 net.ipv4.tcp_frto = 1 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_rfc1337 = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_adv_win_scale = 1 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_slow_start_after_idle = 0 net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.core.rmem_default = 87380 net.core.wmem_default = 87380 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 87380 33554432 net.ipv4.udp_rmem_min = 16384 net.ipv4.udp_wmem_min = 16384 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_max_tw_buckets = 65536 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_mem = 786432 1048576 1572864 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.route_localnet = 0 net.ipv4.ip_forward = 1 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.default.forwarding = 1 net.ipv4.tcp_fastopen = 3 EOF sudo sysctl -p ","date":"2025-11-27T10:33:56+08:00","permalink":"https://blog.lufei.de/p/496/","title":"TCP参数调优"},{"content":"Croc Croc是一款安全性极强的点对点数据传输工具，该工具允许两台计算机设备以一种简单和安全的方式来传输文件或文件夹。简而言之，Croc是一款命令行接口工具，在Croc的帮助下，广大研究人员可以通过命令行工具来实现文件传输。\n工具特性 该工具允许任意两台计算机设备直接进行数据传输； 提供了端到端加密支持（PAKE）； 支持跨平台传输（Windows、Linux和macOS）； 支持多文件传输； 允许断线后的文件续传； 不需要本地服务器或端口转发； 支持IPv6和IPv4； 支持使用Tor之类的代理； windows系统 打开cmd或者powershell 工具 执行以下命令\nSet-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(\u0026#39;https://community.chocolatey.org/install.ps1\u0026#39;)) 或者\niwr https://cin.st | iex 再安装\nchoco install croc linux系统 curl https://getcroc.schollz.com | bash 用法 如需发送文件，可以直接运行下列命令：\n$ croc send [file(s)-or-folder] Sending \u0026#39;file-or-folder\u0026#39; (X MB) Code is: code-phrase 接下来，在另一台电脑上使用下列命令来进行文件或目录接收：\n$ croc code-phrase 这里的code-phrase即密码短语，用于建立密码认证密钥协议（PAKE），该协议将生成一个密钥供发送方和接收方用于端到端加密。\n自定义密码短语\n我们可以使用下列方式来配置自己的密码短语，必须是4个字符以上：\n$ croc send --code [code-phrase] [file(s)-or-folder] 使用管道-stdin和stdout\n我们可以通过管道来向Croc传递文件：\n$ cat [filename] | croc send 此时，Croc将会自动使用stdin数据，并发送和分配一个类似“croc-stdin-123456789”的文件名。如需接收stdout，可以直接使用\u0026ndash;yes选项来自动接收文件：\n$ croc --yes [code-phrase] \u0026gt; out 发送文字消息\n有些时候，我们可能只需要发送URL地址或简短的文字消息，此时可以通过下列命令实现发送：\n$ croc send --text \u0026#34;hello world\u0026#34; 使用代理\n我们还可以使用代理链接来进行传输中继，比如说，我们可以使用下列命令来将Tor作为代理中继：\n$ croc --socks5 \u0026#34;127.0.0.1:9050\u0026#34; send SOMEFILE ","date":"2025-11-21T00:07:22+08:00","permalink":"https://blog.lufei.de/p/495/","title":"croc：一款安全性极强的点对点数据传输工具"},{"content":"转载自wx公众号小柳实验室, 在原文基础上做了修改,\n前言 你的服务器是否每天被 /admin、/wp-login.php、/.env 扫描刷屏？\n这些攻击 90% 来自境外。如果你的业务只服务中国大陆用户，那完全没必要开放全球访问！\n更重要的是：你不需要编译 Nginx，不需要 MaxMind 账号，甚至不用装额外模块\n只需利用 亚太网络信息中心（APNIC）公开的官方 IP 数据，配合 Nginx 原生功能，3 步实现精准拦截！\n创建自动生成脚本 ⚠️提醒：因为使用的是kejilion的反代脚本(docker版nginx)，所以站点配置目录是/home/web/conf.d,请根据实际情况修改配置目录\nsudo cat \u0026gt; /usr/local/bin/gen-cn-allow.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash # 从 APNIC 官方数据生成 Nginx allow 规则 # 适用于任意 Linux 系统 OUTPUT_DIR=\u0026#34;/home/web/conf.d\u0026#34; mkdir -p \u0026#34;$OUTPUT_DIR\u0026#34; echo \u0026#34;正在下载 APNIC 最新数据...\u0026#34; wget -qO- http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | \\ awk -F\u0026#39;|\u0026#39; \u0026#39; $2 == \u0026#34;CN\u0026#34; \u0026amp;\u0026amp; $3 == \u0026#34;ipv4\u0026#34; { prefix = $4; len = 32 - log($5) / log(2); print \u0026#34;allow \u0026#34; prefix \u0026#34;/\u0026#34; len \u0026#34;;\u0026#34;; } $2 == \u0026#34;CN\u0026#34; \u0026amp;\u0026amp; $3 == \u0026#34;ipv6\u0026#34; { print \u0026#34;allow \u0026#34; $4 \u0026#34;/\u0026#34; $5 \u0026#34;;\u0026#34;; } \u0026#39; \u0026gt; /tmp/cn_allow.list # 分离 IPv4 和 IPv6 grep -E \u0026#39;allow [0-9]+\\.\u0026#39; /tmp/cn_allow.list \u0026gt; \u0026#34;$OUTPUT_DIR/china-ipv4.conf\u0026#34; grep -E \u0026#39;allow [0-9a-fA-F:]+\u0026#39; /tmp/cn_allow.list \u0026gt; \u0026#34;$OUTPUT_DIR/china-ipv6.conf\u0026#34; # 添加注释头 sed -i \u0026#34;1i# Auto-generated from APNIC — $(date)\u0026#34; \u0026#34;$OUTPUT_DIR/china-ipv4.conf\u0026#34; sed -i \u0026#34;1i# Auto-generated from APNIC — $(date)\u0026#34; \u0026#34;$OUTPUT_DIR/china-ipv6.conf\u0026#34; rm -f /tmp/cn_allow.list echo \u0026#34;✅ 中国 IP 白名单已生成：\u0026#34; echo \u0026#34; IPv4: $OUTPUT_DIR/china-ipv4.conf\u0026#34; echo \u0026#34; IPv6: $OUTPUT_DIR/china-ipv6.conf\u0026#34; EOF 赋予执行权限 sudo chmod +x /usr/local/bin/gen-cn-allow.sh 首次运行生成白名单 sudo /usr/local/bin/gen-cn-allow.sh 预期输出：\n正在下载 APNIC 最新数据... ✅ 中国 IP 白名单已生成： IPv4: /home/web/conf.d/china-ipv4.conf IPv6: /home/web/conf.d/china-ipv6.conf 验证生成的文件 # 查看 IPv4 规则数量 wc -l /home/web/conf.d/china-ipv4.conf # 查看 IPv6 规则数量 wc -l /home/web/conf.d/china-ipv6.conf # 查看文件前 5 行示例 head -5 /home/web/conf.d/china-ipv4.conf 配置 Nginx 编辑你的站点配置文件（如 /home/web/conf.d/your-site.conf）\nserver { listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; listen 443 quic; listen [::]:443 quic; server_name www.2345.com; ssl_certificate /etc/nginx/certs/www.2345.com_cert.pem; ssl_certificate_key /etc/nginx/certs/www.2345.com_key.pem; # 引入中国 IP 白名单（顺序很重要！） include /etc/nginx/conf.d/china-ipv4.conf; include /etc/nginx/conf.d/china-ipv6.conf; # 可选：放行本地回环（避免自己被拦） allow 127.0.0.1; allow ::1; # 拒绝所有未匹配的请求 deny all; # HTTP 重定向到 HTTPS if ($scheme = http) { return 301 https://$host$request_uri; } location / { # 你的其他配置... ⚠️ 关键规则：Nginx 按顺序匹配 allow/deny，必须先写 allow，再写 deny all！\n实际上就是在ssl配置后面加了以下内容\n# 引入中国 IP 白名单（顺序很重要！） include /etc/nginx/conf.d/china-ipv4.conf; include /etc/nginx/conf.d/china-ipv6.conf; # 可选：放行本地回环（避免自己被拦） allow 127.0.0.1; allow ::1; # 拒绝所有未匹配的请求 deny all; 验证配置\ndocker exec nginx nginx -t 重载配置（平滑生效，不影响在线用户）\ndocker exec nginx nginx -s reload 验证方法： 国内手机 4G 访问 → 应正常打开； 使用境外代理或 VPS 访问 → 应返回 403 Forbidden；\n设置定时任务 （每天凌晨 3 点自动更新）\necho \u0026#34;0 3 * * * root /usr/local/bin/gen-cn-allow.sh \u0026amp;\u0026amp; docker exec nginx nginx -t \u0026amp;\u0026amp; docker exec nginx nginx -s reload \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34; | sudo tee /etc/cron.d/update-cn-ip 验证定时任务 查看 cron 任务是否创建成功\ncat /etc/cron.d/update-cn-ip 检查 cron 服务状态\nsudo systemctl status cron 放行必应爬虫 创建必应 IP 白名单配置\nsudo cat \u0026gt; /home/web/conf.d/bing-bot.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # Bing Bot IP Ranges - Last updated: 2025-11-20 # Source: https://www.bing.com/toolbox/bingbot.json allow 157.55.39.0/24; allow 207.46.13.0/24; allow 40.77.167.0/24; allow 13.66.139.0/24; allow 13.66.144.0/24; allow 52.167.144.0/24; allow 13.67.10.16/28; allow 13.69.66.240/28; allow 13.71.172.224/28; allow 139.217.52.0/28; allow 191.233.204.224/28; allow 20.36.108.32/28; allow 20.43.120.16/28; allow 40.79.131.208/28; allow 40.79.186.176/28; allow 52.231.148.0/28; allow 20.79.107.240/28; allow 51.105.67.0/28; allow 20.125.163.80/28; allow 40.77.188.0/22; allow 65.55.210.0/24; allow 199.30.24.0/23; allow 40.77.202.0/24; allow 40.77.139.0/25; allow 20.74.197.0/28; allow 20.15.133.160/27; allow 40.77.177.0/24; allow 40.77.178.0/23; EOF 编辑 /home/web/conf.d/your-site.conf:\n# ========== 访问控制规则(顺序很重要!) ========== # 1. 首先放行必应爬虫 include /etc/nginx/conf.d/bing-bot.conf; # 2. 然后放行中国 IP include /etc/nginx/conf.d/china-ipv4.conf; include /etc/nginx/conf.d/china-ipv6.conf; # 3. 放行本地回环(可选) allow 127.0.0.1; allow ::1; # 4. ⚠️ 最后拒绝所有未匹配的请求 deny all; # ============================================== 配置参考\nhttps://github.com/woniu336/open_shell/blob/main/www.2345.com.conf 自动化更新必应 IP 段\nsudo cat \u0026gt; /usr/local/bin/update-bing-ips.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash OUTPUT=\u0026#34;/home/web/conf.d/bing-bot.conf\u0026#34; echo \u0026#34;正在从必应官方获取最新 IP 段...\u0026#34; # 使用 Python 解析 JSON curl -s \u0026#34;https://www.bing.com/toolbox/bingbot.json\u0026#34; | python3 -c \u0026#34; import sys, json data = json.load(sys.stdin) print(\u0026#39;# Bing Bot IP Ranges - Updated: $(date)\u0026#39;) print(\u0026#39;# Source: https://www.bing.com/toolbox/bingbot.json\u0026#39;) print() for prefix in data.get(\u0026#39;prefixes\u0026#39;, []): if \u0026#39;ipv4Prefix\u0026#39; in prefix: print(f\\\u0026#34;allow {prefix[\u0026#39;ipv4Prefix\u0026#39;]};\\\u0026#34;) if \u0026#39;ipv6Prefix\u0026#39; in prefix: print(f\\\u0026#34;allow {prefix[\u0026#39;ipv6Prefix\u0026#39;]};\\\u0026#34;) \u0026#34; \u0026gt; \u0026#34;$OUTPUT\u0026#34; # 统计规则数量 count=$(grep -c \u0026#34;^allow\u0026#34; \u0026#34;$OUTPUT\u0026#34;) echo \u0026#34;✅ 必应爬虫 IP 已更新: $OUTPUT\u0026#34; echo \u0026#34; 共 $count 条规则\u0026#34; # 验证并重载 Nginx if docker exec nginx nginx -t 2\u0026gt;\u0026amp;1 | grep -q \u0026#34;successful\u0026#34;; then docker exec nginx nginx -s reload echo \u0026#34;✅ Nginx 配置已重载\u0026#34; else echo \u0026#34;❌ Nginx 配置验证失败\u0026#34; exit 1 fi EOF sudo chmod +x /usr/local/bin/update-bing-ips.sh 测试脚本\nsudo /usr/local/bin/update-bing-ips.sh 添加 Cron 定时任务(每月15号更新):\n(crontab -l ; echo \u0026#34;0 4 15 * * /usr/local/bin/update-bing-ips.sh\u0026#34;) | crontab - ","date":"2025-11-20T19:56:30+08:00","permalink":"https://blog.lufei.de/p/493/","title":"3 步搞定境外 IP 扫描，无需编译 Nginx"},{"content":"下载脚本\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/wallet_monitor.py 安装依赖\npip3 install requests 后台运行\nnohup python3 wallet_monitor.py \u0026gt; monitor.log 2\u0026gt;\u0026amp;1 \u0026amp; 查看进程：\nps aux | grep wallet_monitor 终止进程，假设PID是426197：\nkill 426197 监控新的地址需要删除缓存\nrm wallet_cache.json 然后修改脚本中的地址，重新运行脚本。\n","date":"2025-11-18T14:32:18+08:00","permalink":"https://blog.lufei.de/p/492/","title":"USDT钱包监控"},{"content":"推荐配置组合（16GB 内存服务器）：\n# 备份 cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d_%H%M%S) \u0026amp;\u0026amp; cp /etc/security/limits.conf /etc/security/limits.conf.bak.$(date +%Y%m%d_%H%M%S) \u0026amp;\u0026amp; \\ # 删除旧配置 sed -i \u0026#39;/net.ipv4.ip_local_port_range/d;/net.ipv4.tcp_tw_reuse/d;/net.ipv4.tcp_fin_timeout/d;/net.core.somaxconn/d;/net.ipv4.tcp_max_syn_backlog/d;/net.core.rmem_max/d;/net.core.wmem_max/d\u0026#39; /etc/sysctl.conf \u0026amp;\u0026amp; \\ sed -i \u0026#39;/nofile/d\u0026#39; /etc/security/limits.conf \u0026amp;\u0026amp; \\ # 添加 sysctl 配置 cat \u0026gt;\u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # Network Performance Tuning net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 EOF # 添加 limits 配置 cat \u0026gt;\u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # File Descriptor Limits * soft nofile 65536 * hard nofile 65536 root soft nofile 65536 root hard nofile 65536 EOF # 应用配置 sysctl -p \u0026amp;\u0026amp; systemctl daemon-reexec \u0026amp;\u0026amp; \\ # 显示结果 echo \u0026#34;✓ 配置完成！\u0026#34; \u0026amp;\u0026amp; \\ echo \u0026#34;sysctl 参数已生效，limits 需要重新登录后生效\u0026#34; \u0026amp;\u0026amp; \\ echo \u0026#34;验证命令：exit 后重新登录，然后执行 ulimit -n 正确显示 65536 \u0026#34; 开启BBR\necho \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p lsmod | grep bbr 一键恢复脚本\n# 自动恢复到最新备份 SYSCTL_BAK=$(ls -t /etc/sysctl.conf.bak.* 2\u0026gt;/dev/null | head -1) LIMITS_BAK=$(ls -t /etc/security/limits.conf.bak.* 2\u0026gt;/dev/null | head -1) if [ -n \u0026#34;$SYSCTL_BAK\u0026#34; ]; then cp \u0026#34;$SYSCTL_BAK\u0026#34; /etc/sysctl.conf echo \u0026#34;✓ 已恢复 sysctl.conf\u0026#34; else echo \u0026#34;✗ 未找到 sysctl.conf 备份文件\u0026#34; fi if [ -n \u0026#34;$LIMITS_BAK\u0026#34; ]; then cp \u0026#34;$LIMITS_BAK\u0026#34; /etc/security/limits.conf echo \u0026#34;✓ 已恢复 limits.conf\u0026#34; else echo \u0026#34;✗ 未找到 limits.conf 备份文件\u0026#34; fi sysctl -p \u0026amp;\u0026amp; systemctl daemon-reexec echo \u0026#34;恢复完成！limits 配置需重新登录生效\u0026#34; 手动删除添加的配置\n如果没有备份文件：\n# 删除网络优化参数 sed -i \u0026#39;/# Network Performance Tuning/,/net.core.wmem_max/d\u0026#39; /etc/sysctl.conf # 删除文件描述符配置 sed -i \u0026#39;/# File Descriptor Limits/,/root hard nofile/d\u0026#39; /etc/security/limits.conf # 应用更改 sysctl -p systemctl daemon-reexec ","date":"2025-11-12T21:17:14+08:00","permalink":"https://blog.lufei.de/p/491/","title":"Linux 内核参数调优"},{"content":" 在 Debian 等 Linux 系统下，有一个 /etc/gai.conf 文件，默认情况下，它会使用 IPv6 优先，如果您安装了 curl 并且本地支持 IPv6，那么可以使用 curl ip.sb 测试\n一键命令 开启 IPv4 优先，一行命令修改：\nsed -i \u0026#39;s/#precedence ::ffff:0:0\\/96 100/precedence ::ffff:0:0\\/96 100/\u0026#39; /etc/gai.conf 或者\nsed -Ei \u0026#39;/^[[:space:]]*#?[[:space:]]*precedence[[:space:]]+::ffff:0:0\\/96[[:space:]]+100\\b.*?$/ {s/.+100\\b([[:space:]]*#.*)?$/precedence ::ffff:0:0\\/96 100\\1/; :a;n;b a}; /^[[:space:]]*precedence[[:space:]]+::ffff:0:0\\/96[[:space:]]+[0-9]+.*$/ {s/^.*precedence.+::ffff:0:0\\/96[^0-9]+([0-9]+).*$/precedence ::ffff:0:0\\/96 100\\t#原值为 \\1/; :a;n;ba;}; $aprecedence ::ffff:0:0\\/96 100\u0026#39; /etc/gai.conf 恢复ipv6优先\nsudo sed -i \u0026#39;s/^[[:space:]]*precedence[[:space:]]\\+::ffff:0:0\\/96[[:space:]]\\+100/#\u0026amp;/\u0026#39; /etc/gai.conf 测试 curl ip.sb 或者\nping google.com 显示ipv4地址则说明优先使用 IPv4\ndebian13系统测试\n从 Debian 13 开始，curl (8.14.1) 默认强制使用 IPv6。因此，如果希望测试本地出口公网 IP，可以改用 wget：\nwget -qO- http://ip.sb ","date":"2025-11-06T23:00:35+08:00","permalink":"https://blog.lufei.de/p/489/","title":"Debian 双栈网络时开启 IPv4 优先"},{"content":"这是一套基于 UFW + IPSet 的防火墙方案，用于仅允许 中国大陆与 Cloudflare 访问网站的 80/443 端口。 脚本自动管理规则，兼容双栈网络，并支持每日更新 IP 段。\n主要特色：\n🧩 原生兼容 UFW：不修改现有规则，只在用户链中追加放行逻辑。\n🌏 精准放行：限制访问来源为中国大陆与 Cloudflare。\n🔄 自动更新：通过 systemd 定时任务每日刷新 IP 数据。\n⚡ 双栈支持：IPv4 与 IPv6 独立控制。\n🚀 一键部署脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ufw_cn.sh \\ \u0026amp;\u0026amp; chmod +x ufw_cn.sh \\ \u0026amp;\u0026amp; ./ufw_cn.sh ✅ 说明： 脚本会自动检测现有 UFW 状态与规则，并在不影响原有策略的前提下，附加 CN 与 Cloudflare 放行规则。\n如果你有监控，例如uptime kuma，请放行kuma的ip\n🔍 查看当前规则 iptables -L ufw-user-input -n --line-numbers ip6tables -L ufw6-user-input -n --line-numbers 🧹 删除规则（恢复原状） 该操作将清除 IPSet 与相关放行策略，使防火墙恢复默认状态：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cleanup_ipset.sh \\ \u0026amp;\u0026amp; chmod +x cleanup_ipset.sh \\ \u0026amp;\u0026amp; ./cleanup_ipset.sh 随后重新调整放行顺序以避免冲突：\n# IPv4 sudo iptables -D ufw-user-input -p tcp --dport 80 -j ACCEPT sudo iptables -D ufw-user-input -p tcp --dport 443 -j ACCEPT sudo iptables -A ufw-user-input -p tcp --dport 80 -j ACCEPT sudo iptables -A ufw-user-input -p tcp --dport 443 -j ACCEPT # IPv6 sudo ip6tables -D ufw6-user-input -p tcp --dport 80 -j ACCEPT sudo ip6tables -D ufw6-user-input -p tcp --dport 443 -j ACCEPT sudo ip6tables -A ufw6-user-input -p tcp --dport 80 -j ACCEPT sudo ip6tables -A ufw6-user-input -p tcp --dport 443 -j ACCEPT 验证规则是否正确加载：\niptables -L ufw-user-input -n --line-numbers ip6tables -L ufw6-user-input -n --line-numbers ⚙️ 其他命令 手动允许某个 IP：\nsudo ipset add china 6.6.6.6 从集合中移除指定 IP：\nsudo ipset del china 6.6.6.6 查看某个IP是否存在规则中：\nsudo ipset list china | grep \u0026#34;199.30.24.0/23\u0026#34; 保存规则\nipset save \u0026gt; /etc/iptables/ipset.rules 放行bingbot（必应爬虫）\nsudo ipset add china 157.55.39.0/24 sudo ipset add china 207.46.13.0/24 sudo ipset add china 40.77.167.0/24 sudo ipset add china 13.66.139.0/24 sudo ipset add china 13.66.144.0/24 sudo ipset add china 52.167.144.0/24 sudo ipset add china 13.67.10.16/28 sudo ipset add china 13.69.66.240/28 sudo ipset add china 13.71.172.224/28 sudo ipset add china 139.217.52.0/28 sudo ipset add china 191.233.204.224/28 sudo ipset add china 20.36.108.32/28 sudo ipset add china 20.43.120.16/28 sudo ipset add china 40.79.131.208/28 sudo ipset add china 40.79.186.176/28 sudo ipset add china 52.231.148.0/28 sudo ipset add china 20.79.107.240/28 sudo ipset add china 51.105.67.0/28 sudo ipset add china 20.125.163.80/28 sudo ipset add china 40.77.188.0/22 sudo ipset add china 65.55.210.0/24 sudo ipset add china 199.30.24.0/23 sudo ipset add china 40.77.202.0/24 sudo ipset add china 40.77.139.0/25 sudo ipset add china 20.74.197.0/28 sudo ipset add china 20.15.133.160/27 sudo ipset add china 40.77.177.0/24 sudo ipset add china 40.77.178.0/23 nftable版本 一键管理脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nft-m.sh \\ \u0026amp;\u0026amp; chmod +x nft-m.sh \\ \u0026amp;\u0026amp; ./nft-m.sh 或者使用以下脚本和命令\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nft_cn.sh \\ \u0026amp;\u0026amp; chmod +x nft_cn.sh \\ \u0026amp;\u0026amp; ./nft_cn.sh 查看完整规则集\nnft list ruleset 查看 IPv4 集合\nnft list set inet filter china_ipv4 查看 IPv6 集合\nnft list set inet filter china_ipv6 手动允许某个 IP:\nsudo nft add element inet filter china_ipv4 { 6.6.6.6 } 从集合中移除指定 IP:\nsudo nft delete element inet filter china_ipv4 { 6.6.6.6 } 放行 Bingbot（必应爬虫）:\ncat \u0026gt; /tmp/bingbot.txt \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; 157.55.39.0/24 207.46.13.0/24 40.77.167.0/24 13.66.139.0/24 13.66.144.0/24 52.167.144.0/24 13.67.10.16/28 13.69.66.240/28 13.71.172.224/28 191.233.204.224/28 20.36.108.32/28 20.43.120.16/28 40.79.131.208/28 40.79.186.176/28 52.231.148.0/28 20.79.107.240/28 51.105.67.0/28 20.125.163.80/28 40.77.188.0/22 65.55.210.0/24 199.30.24.0/23 40.77.202.0/24 40.77.139.0/25 20.74.197.0/28 20.15.133.160/27 40.77.177.0/24 40.77.178.0/23 EOF { echo \u0026#34;add element inet filter china_ipv4 {\u0026#34; cat /tmp/bingbot.txt | sed \u0026#39;s/$/,/\u0026#39; | sed \u0026#39;$ s/,$//\u0026#39; echo \u0026#34;}\u0026#34; } | nft -f - 2\u0026gt;\u0026amp;1 | grep -v \u0026#34;interval overlaps\u0026#34; || echo \u0026#34;Bingbot IP 段添加完成（跳过了已存在的）\u0026#34; # 保存规则 nft list ruleset \u0026gt; /etc/nftables/nftables.rules 删除规则\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cleanup_nftables.sh \\ \u0026amp;\u0026amp; chmod +x cleanup_nftables.sh \\ \u0026amp;\u0026amp; ./cleanup_nftables.sh 其他命令\n完全切换到 nftables\n# 完整清理并重新配置 cat \u0026gt; /tmp/clean_firewall.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash # 停止所有防火墙服务 systemctl stop iptables ip6tables firewalld ufw 2\u0026gt;/dev/null systemctl disable iptables ip6tables firewalld ufw 2\u0026gt;/dev/null # 清空所有 nftables 规则 nft flush ruleset # 删除可能冲突的表 nft delete table ip filter 2\u0026gt;/dev/null nft delete table ip6 filter 2\u0026gt;/dev/null nft delete table ip nat 2\u0026gt;/dev/null nft delete table ip6 nat 2\u0026gt;/dev/null # 确保 nftables 服务启用 systemctl enable nftables systemctl restart nftables echo \u0026#34;✅ 防火墙已清理，可以重新运行 nft_cn.sh\u0026#34; EOF chmod +x /tmp/clean_firewall.sh /tmp/clean_firewall.sh # 然后重新运行你的脚本 ./nft_cn.sh 清空系统中所有防火墙配置（iptables、UFW、firewalld、nftables）」并「重置为一个干净的 nftables 环境\n查看所有表（输出：table inet filter，只有一个表）\nnft list tables 查某个 IP 是否在这些集合中\nsudo nft get element inet filter china_ipv4 { 190.93.240.0/20 } 判断某个 IPv6 段\nsudo nft get element inet filter china_ipv6 { 2400:cb00::/32 } 中国 IPv4 段数量\nnft list set inet filter china_ipv4 | grep -oP \u0026#39;\\d+\\.\\d+\\.\\d+\\.\\d+/\\d+\u0026#39; | wc -l IPv6 Cloudflare 段数量\nnft list set inet filter china_ipv6 | grep -oP \u0026#39;([0-9a-f:]+/\\d+)\u0026#39; | wc -l 查看规则链\nnft list chain inet filter input 查看自动更新任务\ncrontab -l | grep china 查看开机自启服务\nsystemctl list-unit-files | grep nftables 查看防火墙状态\nsystemctl status nftables 手动更新 IP 段\n/usr/local/bin/update_china_nftables.sh 黑名单 基于nftbales防火墙\n创建一个管理脚本：\ncat \u0026gt; /usr/local/bin/manage_blacklist.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash BLACKLIST_FILE=\u0026#34;/etc/nftables.d/blacklist.conf\u0026#34; mkdir -p /etc/nftables.d case \u0026#34;$1\u0026#34; in add) if [ -z \u0026#34;$2\u0026#34; ]; then echo \u0026#34;用法: $0 add \u0026lt;IP或IP段\u0026gt;\u0026#34; exit 1 fi # 添加到黑名单集合 nft add element inet filter blacklist { $2 } 2\u0026gt;/dev/null || { # 如果集合不存在，先创建 nft add set inet filter blacklist { type ipv4_addr \\; flags interval \\; } nft insert rule inet filter input ip saddr @blacklist drop nft add element inet filter blacklist { $2 } } # 保存到文件 echo \u0026#34;$2\u0026#34; \u0026gt;\u0026gt; \u0026#34;$BLACKLIST_FILE\u0026#34; echo \u0026#34;✅ 已拉黑: $2\u0026#34; ;; remove) if [ -z \u0026#34;$2\u0026#34; ]; then echo \u0026#34;用法: $0 remove \u0026lt;IP或IP段\u0026gt;\u0026#34; exit 1 fi # 从集合中删除 nft delete element inet filter blacklist { $2 } # 从文件中删除 sed -i \u0026#34;/^$2$/d\u0026#34; \u0026#34;$BLACKLIST_FILE\u0026#34; echo \u0026#34;✅ 已解除拉黑: $2\u0026#34; ;; list) echo \u0026#34;=== 当前黑名单 ===\u0026#34; nft list set inet filter blacklist 2\u0026gt;/dev/null || echo \u0026#34;黑名单为空\u0026#34; ;; restore) # 从文件恢复黑名单（用于开机自动加载） if [ -f \u0026#34;$BLACKLIST_FILE\u0026#34; ]; then nft add set inet filter blacklist { type ipv4_addr \\; flags interval \\; } 2\u0026gt;/dev/null nft insert rule inet filter input ip saddr @blacklist drop 2\u0026gt;/dev/null while read -r ip; do [ -z \u0026#34;$ip\u0026#34; ] \u0026amp;\u0026amp; continue nft add element inet filter blacklist { $ip } 2\u0026gt;/dev/null done \u0026lt; \u0026#34;$BLACKLIST_FILE\u0026#34; echo \u0026#34;✅ 黑名单已恢复\u0026#34; fi ;; *) echo \u0026#34;用法: $0 {add|remove|list|restore} [IP]\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;示例:\u0026#34; echo \u0026#34; $0 add 1.2.3.4 # 拉黑单个IP\u0026#34; echo \u0026#34; $0 add 1.2.3.0/24 # 拉黑IP段\u0026#34; echo \u0026#34; $0 remove 1.2.3.4 # 解除拉黑\u0026#34; echo \u0026#34; $0 list # 查看黑名单\u0026#34; exit 1 ;; esac EOF chmod +x /usr/local/bin/manage_blacklist.sh 使用方法\n# 拉黑单个 IP manage_blacklist.sh add 1.2.3.4 # 拉黑 IP 段 manage_blacklist.sh add 1.2.3.0/24 # 拉黑多个（逐个添加） manage_blacklist.sh add 5.6.7.8 manage_blacklist.sh add 9.10.11.12 # 查看黑名单 manage_blacklist.sh list # 解除拉黑 manage_blacklist.sh remove 1.2.3.4 创建一个开机启动服务：\ncat \u0026gt; /etc/systemd/system/nftables-blacklist.service \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; [Unit] Description=Restore NFTables Blacklist After=nftables.service Requires=nftables.service [Service] Type=oneshot ExecStart=/usr/local/bin/manage_blacklist.sh restore RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable nftables-blacklist.service 完结\n","date":"2025-10-31T09:37:01+08:00","permalink":"https://blog.lufei.de/p/488/","title":"ufw + ipset 防火墙：仅允许大陆与 Cloudflare 访问 80/443"},{"content":"haproxy证书替换脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/update-haproxy-certs.sh \u0026amp;\u0026amp; \\ chmod +x update-haproxy-certs.sh \u0026amp;\u0026amp; \\ sudo ./update-haproxy-certs.sh \u0026amp;\u0026amp; \\ sudo mv update-haproxy-certs.sh /usr/local/bin/ \u0026amp;\u0026amp; \\ (crontab -l ; echo \u0026#34;0 4 */3 * * /usr/local/bin/update-haproxy-certs.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - nginx证书替换脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/copy-letsencrypt-certs.sh \u0026amp;\u0026amp; \\ chmod +x copy-letsencrypt-certs.sh \u0026amp;\u0026amp; \\ sudo ./copy-letsencrypt-certs.sh \u0026amp;\u0026amp; \\ sudo mv copy-letsencrypt-certs.sh /usr/local/bin/ \u0026amp;\u0026amp; \\ (crontab -l ; echo \u0026#34;3 3 */3 * * /usr/local/bin/copy-letsencrypt-certs.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2025-10-29T11:28:02+08:00","permalink":"https://blog.lufei.de/p/487/","title":"haproxy和nginx证书替换脚本"},{"content":"一键脚本管理\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rclone_deploy.sh \u0026amp;\u0026amp; chmod +x rclone_deploy.sh \u0026amp;\u0026amp; ./rclone_deploy.sh 快捷键设置\nread -p \u0026#34;请输入想要的快捷命令名称 (如: cm, caddy, mgr): \u0026#34; cmd_name \u0026amp;\u0026amp; echo \u0026#34;alias $cmd_name=\u0026#39;/root/rclone_deploy.sh\u0026#39;\u0026#34; \u0026gt;\u0026gt; ~/.bashrc \u0026amp;\u0026amp; source ~/.bashrc \u0026amp;\u0026amp; echo \u0026#34;快捷命令 \u0026#39;$cmd_name\u0026#39; 已设置完成，现在可以直接输入 $cmd_name 来运行脚本\u0026#34; 场景 A服务器同步内容到B服务器（单向同步）\n特点：\n本地文件变化 → 延迟 5 秒同步\n没有变化 → 每 1 小时强制同步一次\n安装 rclone 首先在A服务器安装 rclone, 使用以下命令安装\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 生成密钥对 在A服务器生成密钥对，并查看公钥\nssh-keygen -t ed25519 -C \u0026#34;rclone-copy\u0026#34; -f ~/.ssh/id_ed25519 -N \u0026#34;\u0026#34; cd ~/.ssh/ cat id_ed25519.pub 在B服务器上运行以下命令,粘贴id_ed25519.pub里面的内容（注意是B服务器）\nread -p \u0026#34;请输入你的公钥内容: \u0026#34; PUBKEY \u0026amp;\u0026amp; mkdir -p /root/.ssh \u0026amp;\u0026amp; touch /root/.ssh/authorized_keys \u0026amp;\u0026amp; chmod 700 /root/.ssh \u0026amp;\u0026amp; chmod 600 /root/.ssh/authorized_keys \u0026amp;\u0026amp; grep -qxF \u0026#34;$PUBKEY\u0026#34; /root/.ssh/authorized_keys || echo \u0026#34;$PUBKEY\u0026#34; \u0026gt;\u0026gt; /root/.ssh/authorized_keys \u0026amp;\u0026amp; echo \u0026#34;✅ 公钥已添加\u0026#34; 以上命令不会覆盖已有的公钥、不会重复、权限正确。AB服务器便可以联通了。\n创建配置文件 注意：是在A服务器创建\nmkdir -p ~/.config/rclone nano ~/.config/rclone/rclone.conf 粘贴以下内容\n[ovh] type = sftp host = 服务器B的ip user = root port = 服务器B的ssh端口号 key_file = ~/.ssh/id_ed25519 shell_type = unix md5sum_command = md5sum sha1sum_command = sha1sum 修改为你的接收端的ip、ssh端口，注意：ovh表示接收端名称，可以随意命名，其他不变\n同步脚本 以下操作均在A服务器运行\n安装依赖\nsudo apt update sudo apt install rclone inotify-tools 下载同步脚本到A服务器\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rclone-sync.sh \u0026amp;\u0026amp; chmod +x rclone-sync.sh 修改同步目录\nnano rclone-sync.sh 首次同步测试\n./rclone-sync.sh 按ctrl+c 停止同步\n后台运行\nloginctl enable-linger root ./rclone-sync.sh systemd_setup 如果下次修改了同步目录，需要再次运行\n./rclone-sync.sh ./rclone-sync.sh systemd_setup 管理同步 下载管理脚本，在A服务器操作\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rclone_manage.sh \u0026amp;\u0026amp; chmod +x rclone_manage.sh 使用方法，例如\n./rclone_manage.sh ovh:/www/wwwrot/blog 后面跟着B务器名称+同步的路径\n预览\n========================================== RClone 服务管理 ========================================== 1) 查看状态 2) 启动服务 3) 停止服务 4) 重启服务 5) 查看日志 (实时) 6) 退出 ========================================== 拷贝文件 例如：\nrclone copy /home/op/ ovh:/home/op/ \\ -P \\ --transfers=16 \\ --multi-thread-streams=4 列出 ovh 根目录下的文件夹\nrclone lsd ovh:/ 文件校验\nrclone check /home/op/ ovh:/home/op/ --size-only ","date":"2025-10-27T20:02:02+08:00","permalink":"https://blog.lufei.de/p/486/","title":"Rclone 单向实时同步：A→B 服务器自动化方案"},{"content":"一键脚本 无需编译，直接使用已经编译好的caddy替换掉原版caddy，前提是要先安装原版caddy\ncurl -fsSL https://raw.githubusercontent.com/woniu336/open_shell/main/caddy-cache.sh | bash 安装原版caddy 重要：避免后续出现什么意外，请先安装原版caddy，推荐使用我的一键安装脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh 安装 Go wget https://go.dev/dl/go1.23.2.linux-amd64.tar.gz rm -rf /usr/local/go \u0026amp;\u0026amp; tar -C /usr/local -xzf go1.23.2.linux-amd64.tar.gz 配置环境变量\necho \u0026#39;export PATH=$PATH:/usr/local/go/bin\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 验证安装\ngo version 安装 xcaddy xcaddy 是 Caddy 的官方构建工具，用于编译带有自定义插件的 Caddy 版本。 让你把第三方模块（如缓存插件）编译进 Caddy 二进制文件中。\n使用 Go 安装（推荐）\ngo install github.com/caddyserver/xcaddy/cmd/xcaddy@latest 添加 Go bin 目录到 PATH\necho \u0026#39;export PATH=$PATH:$HOME/go/bin\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 验证安装\nxcaddy version 编译带缓存插件的 Caddy 创建构建目录\nmkdir -p ~/caddy-build cd ~/caddy-build 编译 Caddy（包含缓存插件）\nxcaddy build \\ --with github.com/caddyserver/cache-handler 编译需要 3-5 分钟，请耐心等待，成功后会在当前目录生成 caddy 二进制文件\n验证编译结果\nls -lh caddy 应该看到一个约 40-50MB 的文件\n验证缓存插件\n./caddy list-modules | grep cache 应该看到：cache 和 http.handlers.cache\n安装 Caddy 到系统 停止旧的 Caddy 服务\ncd ~ sudo systemctl stop caddy 2\u0026gt;/dev/null || true 替换原版caddy\ncd ~ sudo mv ~/caddy-build/caddy /usr/bin/caddy sudo chmod +x /usr/bin/caddy sudo chown root:root /usr/bin/caddy 验证安装\ncaddy version caddy list-modules | grep cache 修改配置\nnano /etc/caddy/Caddyfile 添加cache 参数，例如\nblog.xxx.com { cache { ttl 1h } reverse_proxy 127.0.0.1:80 } ttl 1h 表示缓存1小时\nf12查看页面，首次不缓存，刷新一下即可缓存，你会看到类似信息\nSouin; hit; ttl=3600; key=GET-https-www.xxx.com-/xxxx/xxxx/30321/; detail=DEFAULT 常用命令 # 1. 验证配置文件语法 sudo caddy validate --config /etc/caddy/Caddyfile # 2. 启用服务开机自启 sudo systemctl enable caddy # 3. 启动 Caddy 服务 sudo systemctl start caddy # 4. 检查服务状态 sudo systemctl status caddy # 5. 查看实时日志 sudo journalctl -u caddy -f ","date":"2025-10-27T15:34:43+08:00","permalink":"https://blog.lufei.de/p/485/","title":"Caddy 性能优化：添加缓存插件的编译与配置"},{"content":"原项目 https://github.com/ceocok/fake-nodeimage\n特点 去重、图片命名缩短，默认压缩webp格式\n前端 因为是静态文件，部署到cf pages，然后自定义域名即可，就是这么简单\n下载压缩包传到cf pages即可\nhttps://github.com/woniu336/open_shell/blob/main/nodeimg/fake-nodeimage-main.zip 后端 安装Node.js\ncurl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs 验证安装\nnode -v npm -v 上传代码到VPS sudo mkdir -p /var/www/image-hosting-backend cd /var/www/image-hosting-backend wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/package.json wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/server-s.js mv server-s.js server.js 安装依赖 npm install 安装 sharp 图片处理库\ncd /var/www/image-hosting-backend npm install sharp 查看安装结果\nnpm list sharp 使用PM2运行（推荐） 安装 PM2\nsudo npm install -g pm2 启动服务\npm2 start server.js --name image-hosting 设置开机自启\npm2 startup pm2 save 查看日志\npm2 logs image-hosting 重启服务\npm2 restart image-hosting 常用PM2命令\npm2 list # 查看所有进程 pm2 logs image-hosting # 查看日志 pm2 restart image-hosting # 重启 pm2 stop image-hosting # 停止 pm2 delete image-hosting # 删除 测试接口 测试健康检查接口\ncurl http://localhost:3000/api/health 显示{\u0026quot;status\u0026quot;:\u0026quot;ok\u0026quot;,\u0026quot;message\u0026quot;:\u0026quot;图床服务运行正常\u0026quot;,.....表示没有问题\n配置Nginx反向代理 可选，我是直接开启cf代理\nserver { listen 80; server_name your-domain.com; # 改为您的域名 client_max_body_size 10M; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#39;upgrade\u0026#39;; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 测试配置\nsudo nginx -t 重启Nginx\nsudo systemctl restart nginx 目录结构\n/var/www/image-hosting-backend/ ├── uploads/ │ ├── compressed/ # 压缩后的图片（对外访问） │ │ ├── 950414abc.jpg │ │ └── 951234xyz.webp │ └── original/ # 原图（可选保存） │ ├── orig_950414abc.jpg │ └── orig_951234xyz.webp ├── server.js ├── package.json 压缩配置说明\n在 server.js 顶部可以修改配置：\ncd /var/www/image-hosting-backend nano server.js 例如：\nconst COMPRESSION_CONFIG = { quality: 80, // 压缩质量 (1-100，建议 75-85) maxWidth: 2560, // 最大宽度 maxHeight: 2560, // 最大高度 saveOriginal: false, // 是否保存原图 format: \u0026#39;auto\u0026#39; // 输出格式: auto, jpeg, webp, png }; 🎯 功能特点\n✅ 自动压缩\n上传时自动压缩图片 支持 JPEG, PNG, WebP 格式 跳过 SVG 和 GIF（保持原样） ✅ 智能格式转换 auto: 自动选择最优格式 PNG 有透明→保持 PNG 其他→转 JPEG（更小） 支持强制转 WebP（最佳压缩比） ✅ 尺寸限制 超过最大尺寸自动等比缩放 不放大小图片 📊 压缩效果对比 质量设置 文件大小 视觉质量 推荐场景 90-100 大 极高 摄影作品 75-85 中 高 博客配图（推荐） 60-75 小 中 缩略图 40-60 极小 低 不推荐 💡 推荐配置 博客配图（平衡质量和大小） quality: 80 maxWidth: 2560 maxHeight: 2560 saveOriginal: false format: \u0026#39;auto\u0026#39; 极致压缩（最小体积） quality: 75 maxWidth: 1920 maxHeight: 1920 saveOriginal: false format: \u0026#39;webp\u0026#39; // WebP 格式更小 高质量保存 quality: 90 maxWidth: 4096 maxHeight: 4096 saveOriginal: true // 保留原图 format: \u0026#39;auto\u0026#39; 其他命令 清空日志\npm2 flush image-hosting 查看图片文件夹\ndu -sh /var/www/image-hosting-backend/uploads/compressed \u0026amp;\u0026amp; \\ ls /var/www/image-hosting-backend/uploads/compressed | wc -l 清除图片(慎重)\nrm -f /var/www/image-hosting-backend/uploads/compressed/* 同步到cloudflare r2存储桶 安装 rclone\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 编辑 cloudflare r2 配置\nmkdir -p /root/.config/rclone/ nano /root/.config/rclone/rclone.conf 配置模板\n只需要修改 access_key_id、secret_access_key、endpoint 三个参数\n[r2] type = s3 provider = Cloudflare access_key_id = 111 secret_access_key = 222 region = auto endpoint = https://333.r2.cloudflarestorage.com 按 ctrl+x 保存，y 退出\n测试是否配置正确,有文件会显示文件，空白就不显示\nrclone ls r2:nodeimg # nodeimg是存储桶名称 安装依赖\nsudo apt update sudo apt install rclone inotify-tools 下载同步脚本\n记得修改你的存储桶名称，其他不用改\nwget -O sync.sh https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/sync.sh 说明\n# RClone 实时同步脚本 # 功能：监控本地目录变化，立即同步到远程 # 注意：这是单向同步，远程内容会被本地覆盖！ 测试同步\nchmod +x sync.sh ./sync.sh 然后上传一张图片，查看终端窗口变化，检查远程是否真的同步了。\n按 Ctrl+C 停止脚本。\n设置开机自启\n启用 Linger loginctl enable-linger root 安装服务 ./sync.sh systemd_setup 常用命令 注意：r2是rclone.conf配置文件里的名称，nodeimg是你存储桶的名称\n# 查看状态 systemctl --user status rclone_sync.r2:nodeimg # 停止同步 systemctl --user stop rclone_sync.r2:nodeimg # 启动同步 systemctl --user start rclone_sync.r2:nodeimg # 重启同步 systemctl --user restart rclone_sync.r2:nodeimg 安全建议 修改 CORS 配置：在 server.js 中将 origin: '*' 改为您的前端域名 添加认证：对于生产环境，建议添加 API 密钥验证 限流：使用 express-rate-limit 防止滥用 定期备份 完结。\n","date":"2025-10-25T23:26:35+08:00","permalink":"https://blog.lufei.de/p/483/","title":"榛子图床加强版，包含r2配合rclone的同步功能教程"},{"content":" 系统：Ubuntu/Debian系统\n项目：https://github.com/ceocok/fake-nodeimage\n安装Node.js curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs 验证安装\nnode -v npm -v 上传代码到VPS sudo mkdir -p /var/www/image-hosting-backend cd /var/www/image-hosting-backend wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/package.json wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/server.js 安装依赖 npm install 使用PM2运行（推荐） 安装 PM2\nsudo npm install -g pm2 启动服务\npm2 start server.js --name image-hosting 设置开机自启\npm2 startup pm2 save 查看日志\npm2 logs image-hosting 重启服务\npm2 restart image-hosting 常用PM2命令\npm2 list # 查看所有进程 pm2 logs image-hosting # 查看日志 pm2 restart image-hosting # 重启 pm2 stop image-hosting # 停止 pm2 delete image-hosting # 删除 测试接口 测试健康检查接口\ncurl http://localhost:3000/api/health 如果想直接测试，先开放 3000 端口：\nsudo ufw allow 3000/tcp 然后用浏览器访问：http://你的VPS-IP:3000/api/health\n配置Nginx反向代理 可选\nserver { listen 80; server_name your-domain.com; # 改为您的域名 client_max_body_size 10M; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#39;upgrade\u0026#39;; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 测试配置\nsudo nginx -t 重启Nginx\nsudo systemctl restart nginx 安全建议 修改CORS配置：在 server.js 中将 origin: '*' 改为您的前端域名 添加认证：对于生产环境，建议添加API密钥验证 限流：使用 express-rate-limit 防止滥用 定期备份：定期备份 uploads 目录 前端配置 部署完成后，在前端的设置面板中输入您的API地址：\nhttps://your-domain.com 压缩方案 cd /var/www/image-hosting-backend # 安装 sharp 图片处理库 npm install sharp # 查看安装结果 npm list sharp 替换 server.js\ncd /var/www/image-hosting-backend # 备份旧版本 cp server.js server.js.backup.$(date +%Y%m%d_%H%M%S) # 下载新版本 wget -O server-s.js https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/server-s.js # 替换文件 mv server-s.js server.js # 重启服务 pm2 restart image-hosting # 查看日志 pm2 logs image-hosting 目录结构\n/var/www/image-hosting-backend/ ├── uploads/ │ ├── compressed/ # 压缩后的图片（对外访问） │ │ ├── 950414abc.jpg │ │ └── 951234xyz.webp │ └── original/ # 原图（可选保存） │ ├── orig_950414abc.jpg │ └── orig_951234xyz.webp ├── server.js ├── package.json └── file-hash-map.json 压缩配置说明\n在 server.js 顶部可以修改配置：\nconst COMPRESSION_CONFIG = { quality: 80, // 压缩质量 (1-100，建议 75-85) maxWidth: 2560, // 最大宽度 maxHeight: 2560, // 最大高度 saveOriginal: false, // 是否保存原图 format: \u0026#39;auto\u0026#39; // 输出格式: auto, jpeg, webp, png }; 🎯 功能特点\n✅ 自动压缩\n上传时自动压缩图片 支持 JPEG, PNG, WebP 格式 跳过 SVG 和 GIF（保持原样） ✅ 智能格式转换 auto: 自动选择最优格式 PNG 有透明→保持 PNG 其他→转 JPEG（更小） 支持强制转 WebP（最佳压缩比） ✅ 尺寸限制 超过最大尺寸自动等比缩放 不放大小图片 📊 压缩效果对比 质量设置 文件大小 视觉质量 推荐场景 90-100 大 极高 摄影作品 75-85 中 高 博客配图（推荐） 60-75 小 中 缩略图 40-60 极小 低 不推荐 💡 推荐配置 博客配图（平衡质量和大小） quality: 80 maxWidth: 2560 maxHeight: 2560 saveOriginal: false format: \u0026#39;auto\u0026#39; 极致压缩（最小体积） quality: 75 maxWidth: 1920 maxHeight: 1920 saveOriginal: false format: \u0026#39;webp\u0026#39; // WebP 格式更小 高质量保存 quality: 90 maxWidth: 4096 maxHeight: 4096 saveOriginal: true // 保留原图 format: \u0026#39;auto\u0026#39; 其他命令 清空日志\npm2 flush image-hosting 查看图片文件夹\ndu -sh /var/www/image-hosting-backend/uploads/compressed \u0026amp;\u0026amp; \\ ls /var/www/image-hosting-backend/uploads/compressed | wc -l 清除图片(慎重)\nrm -f /var/www/image-hosting-backend/uploads/compressed/* rclone同步 安装 rclone\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 编辑 cloudflare r2 配置\nmkdir -p /root/.config/rclone/ touch /root/.config/rclone/rclone.conf nano /root/.config/rclone/rclone.conf 配置模板\n只需要修改 access_key_id、secret_access_key、endpoint 三个参数\n[r2] type = s3 provider = Cloudflare access_key_id = 111 secret_access_key = 222 region = auto endpoint = https://333.r2.cloudflarestorage.com 按 ctrl+x 保存，y 退出\n测试是否配置正确,有文件会显示文件，空白就不显示\nrclone ls r2:nodeimg # nodeimg是存储桶名称 安装依赖\nsudo apt update sudo apt install rclone inotify-tools 下载同步脚本\n记得修改你的存储桶名称，其他不用改\nwget -O sync.sh https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/sync.sh 说明\n# RClone 实时同步脚本 # 功能：监控本地目录变化，立即同步到远程 # 注意：这是单向同步，远程内容会被本地覆盖！ 测试同步\nchmod +x sync.sh ./sync.sh 然后上传一张图片，查看终端窗口变化，检查远程是否真的同步了。\n按 Ctrl+C 停止脚本。\n设置开机自启\n启用 Linger loginctl enable-linger root 安装服务 ./sync.sh systemd_setup 常用命令 注意：r2是rclone.conf配置文件里的名称，nodeimg是你存储桶的名称\n# 停止同步 systemctl --user stop rclone_sync.r2:nodeimg # 启动同步 systemctl --user start rclone_sync.r2:nodeimg # 重启同步 systemctl --user restart rclone_sync.r2:nodeimg ","date":"2025-10-25T12:41:27+08:00","permalink":"https://blog.lufei.de/p/482/","title":"图床后端部署指南"},{"content":"主要目标：\n只允许中国大陆 IP 访问 HTTP (80) 和 HTTPS (443) 自动检测 SSH 端口 允许访问SSH 端口（自动检测） 拒绝其他来源访问（DROP） 自动安装 ipset 自动持久化规则（开机自加载） 下载中国大陆 IP 段（来自 ispip.clang.cn） 注意：如果你部署了fq协议，记得修改节点端口号，在行3x-ui端口处修改\n脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/safe_cn_firewall.sh \u0026amp;\u0026amp; chmod +x safe_cn_firewall.sh \u0026amp;\u0026amp; ./safe_cn_firewall.sh 脚本2（包含放行必应爬虫ip段）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/safe_cn_firewall_with_bing.sh \u0026amp;\u0026amp; chmod +x safe_cn_firewall_with_bing.sh \u0026amp;\u0026amp; ./safe_cn_firewall_with_bing.sh 查看\nipset list bingbot 验证：过几个小时或几天后，你可以再次执行\niptables -L -n -v | grep bingbot 若看到计数器（pkts 和 bytes）不为 0，则说明：\n✅ Bing 爬虫确实访问并成功被放行。\n定时任务 (crontab -l ; echo \u0026#34;0 4 * * * /root/safe_cn_firewall.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 或者\n(crontab -l ; echo \u0026#34;0 4 * * * /root/safe_cn_firewall_with_bing.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 表示每天凌晨 4 点自动更新最新中国IP段并重载防火墙。\n查看规则\niptables -L -n -v 查看ip数量\nipset list china | wc -l 查看规则 查看当前规则编号\niptables -L INPUT --line-numbers 删除指定行（从大到小删除，避免行号变化），例如\niptables -D INPUT 8 iptables -D INPUT 7 iptables -D INPUT 6 iptables -D INPUT 5 保存当前规则\niptables-save \u0026gt; /etc/iptables/rules.v4 安装持久化工具（如果没安装）\napt-get install iptables-persistent 或手动加载（开机启动）\necho \u0026#34;iptables-restore \u0026lt; /etc/iptables/rules.v4\u0026#34; \u0026gt;\u0026gt; /etc/rc.local 删除规则 # 清空所有规则 iptables -F \u0026amp;\u0026amp; iptables -X \u0026amp;\u0026amp; iptables -t nat -F \u0026amp;\u0026amp; iptables -t nat -X \u0026amp;\u0026amp; iptables -t mangle -F \u0026amp;\u0026amp; iptables -t mangle -X # 恢复默认策略 iptables -P INPUT ACCEPT \u0026amp;\u0026amp; iptables -P FORWARD ACCEPT \u0026amp;\u0026amp; iptables -P OUTPUT ACCEPT # 删除 ipset ipset destroy china 2\u0026gt;/dev/null ipset destroy bingbot 2\u0026gt;/dev/null ipset destroy cloudflare 2\u0026gt;/dev/null # 删除持久化文件 rm -f /etc/iptables/rules.v4 /etc/iptables/ipset.rules /etc/network/if-pre-up.d/iptables-restore /tmp/china_ip.txt # 验证 echo \u0026#34;=== 当前规则 ===\u0026#34; \u0026amp;\u0026amp; iptables -L -n \u0026amp;\u0026amp; echo \u0026#34;=== ipset ===\u0026#34; \u0026amp;\u0026amp; ipset list -n ","date":"2025-10-13T14:11:26+08:00","permalink":"https://blog.lufei.de/p/481/","title":"🧠 我写了一个脚本，让网站只对中国开放（iptables 实战解析）"},{"content":" 系统推荐：debian12\ndocker端口白名单脚本 注意：是针对内部端口才有效，例如\n8083:8088, 那么是对8088端口来设置\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/docker_whitelist.sh \u0026amp;\u0026amp; chmod +x docker_whitelist.sh \u0026amp;\u0026amp; ./docker_whitelist.sh 使用流程:\n选择 1 → 添加允许访问的 IP(如 192.168.1.100) 选择 4 → 为端口添加保护(如 9000) 选择 3 → 查看白名单确认 选择 7 → 保存配置(重启后自动生效) 多端口保护:\n你可以多次选择选项 4,为不同的端口(9000、3306、6379 等)添加保护规则,它们都会共享同一个白名单。\n非docker版本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipwl.sh \u0026amp;\u0026amp; chmod +x ipwl.sh \u0026amp;\u0026amp; ./ipwl.sh ","date":"2025-10-03T11:40:17+08:00","permalink":"https://blog.lufei.de/p/480/","title":"docker端口白名单脚本"},{"content":"前言 系统推荐：debian12\n服务器要开放80端口\nnginx版本1.25以上\n一键脚本 ，安装的末尾提示输入邮箱，安装完成后记得运行一下启动nginx。\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginx-acme-manager.sh \u0026amp;\u0026amp; chmod +x nginx-acme-manager.sh \u0026amp;\u0026amp; ./nginx-acme-manager.sh 以下为手动操作\n安装依赖 sudo apt update sudo apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev pkg-config libclang-dev git wget curl 安装 Rust 工具链：\ncurl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env 创建目录结构\nmkdir -pv /app/nginx/{logs,conf,cache,acme} /app/nginx-build cd /app/nginx-build 获取源码 下载 ACME 模块：\ngit clone https://github.com/nginx/nginx-acme.git /app/nginx-build/nginx-acme 下载并解压 NGINX 源码（推荐稳定版 1.28.0）：\nwget https://nginx.org/download/nginx-1.28.0.tar.gz tar -zxf nginx-1.28.0.tar.gz 编译 NGINX + ACME 模块 大概5分钟\ncd /app/nginx-build/nginx-1.28.0 ./configure \\ --prefix=/app/nginx \\ --error-log-path=/app/nginx/logs/error.log \\ --http-log-path=/app/nginx/logs/access.log \\ --pid-path=/app/nginx/nginx.pid \\ --lock-path=/app/nginx/nginx.lock \\ --http-client-body-temp-path=/app/nginx/cache/client_temp \\ --http-proxy-temp-path=/app/nginx/cache/proxy_temp \\ --user=nginx \\ --group=nginx \\ --with-compat \\ --with-file-aio \\ --with-threads \\ --with-http_realip_module \\ --with-http_ssl_module \\ --with-http_v2_module \\ --with-http_gzip_static_module \\ --with-cc-opt=\u0026#39;-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC\u0026#39; \\ --with-ld-opt=\u0026#39;-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie\u0026#39; \\ --add-dynamic-module=/app/nginx-build/nginx-acme make \u0026amp;\u0026amp; make modules \u0026amp;\u0026amp; make install 添加nginx用户\nuseradd -r -s /sbin/nologin nginx 创建目录结构\ncd /app/nginx mkdir -p logs cache/{client_temp,proxy_cache} acme/{letsencrypt,staging} conf/conf.d chown -R nginx:nginx /app/nginx 全局nginx配置 路径：/app/nginx/conf/nginx.conf\n注意：把123456@qq.com修改成自己的邮箱\nnano /app/nginx/conf/nginx.conf 清除原本内容，粘贴\nuser nginx; worker_processes auto; worker_rlimit_nofile 65535; error_log logs/error.log warn; pid nginx.pid; # ACME 模块 load_module modules/ngx_http_acme_module.so; events { worker_connections 4096; multi_accept on; use epoll; } http { include mime.types; default_type application/octet-stream; # 日志 log_format main \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; \u0026#39; \u0026#39;$status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#39; \u0026#39;\u0026#34;$http_user_agent\u0026#34; \u0026#34;$http_x_forwarded_for\u0026#34; \u0026#39; \u0026#39;rt=$request_time uct=\u0026#34;$upstream_connect_time\u0026#34; \u0026#39; \u0026#39;uht=\u0026#34;$upstream_header_time\u0026#34; urt=\u0026#34;$upstream_response_time\u0026#34;\u0026#39;; access_log logs/access.log main; # 基础性能 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65s 60s; keepalive_requests 1000; reset_timedout_connection on; # === 客户端请求体配置 === client_max_body_size 100m; client_body_buffer_size 256k; client_body_timeout 30s; # === 客户端请求头配置 === client_header_buffer_size 4k; large_client_header_buffers 4 16k; client_header_timeout 10s; # === 临时文件路径 === client_body_temp_path cache/client_temp; # === 防止慢速攻击 === client_body_in_single_buffer off; # Gzip gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_min_length 1024; gzip_buffers 16 8k; gzip_types text/plain text/css application/json application/javascript application/xml+rss application/rss+xml application/atom+xml application/xhtml+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; gzip_disable \u0026#34;msie6\u0026#34;; # DNS resolver 8.8.8.8 1.0.0.1 valid=300s ipv6=off; resolver_timeout 5s; # 全局代理头（所有站点都生效） 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; proxy_hide_header X-Powered-By; proxy_hide_header Server; # 隐藏 Nginx 版本号 server_tokens off; # ACME acme_shared_zone zone=acme_shared:2M; acme_issuer letsencrypt { uri https://acme-v02.api.letsencrypt.org/directory; contact mailto:123456@qq.com; state_path acme/letsencrypt; accept_terms_of_service; } # SSL ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers \u0026#39;ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384\u0026#39;; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:20m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_buffer_size 4k; # 全局限流（保持） limit_req_zone $binary_remote_addr zone=req_limit:10m rate=200r/s; limit_req zone=req_limit burst=300; limit_req_status 429; limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 100; limit_conn_status 429; # HTTP → HTTPS 跳转 server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { return 301 https://$host$request_uri; } } include conf.d/*.conf; } 站点配置 站点路径：/app/nginx/conf/conf.d\n把6.6.6.6:80，改成你要反代的源站ip和端口\n2345_com是上游服务器（源站）名称，每个站点不一样，避免冲突，\nbackup是备用服务器的意思，源站挂了，备用顶上，需要的话移除注释\n证书目录 /app/nginx/acme/letsencrypt\n示例：2345.com, www.2345.com, 根域跳转到www\nnano /app/nginx/conf/conf.d/2345.com.conf 粘贴以下内容\nupstream 2345_com { server 6.6.6.6:80; #server 3.2.3.8:80 backup; keepalive 32; } server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name 2345.com www.2345.com; # 根域名跳转 if ($host = 2345.com) { return 301 https://www.2345.com$request_uri; } access_log logs/2345.com-access.log; error_log logs/2345.com-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; # 安全头 add_header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; always; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; add_header Strict-Transport-Security \u0026#34;max-age=31536000\u0026#34; always; location / { proxy_pass http://2345_com; proxy_http_version 1.1; # 代理超时与重试 proxy_connect_timeout 5s; proxy_send_timeout 15s; proxy_read_timeout 15s; proxy_next_upstream error timeout http_502 http_503 http_504; } location ~ /\\. { deny all; access_log off; log_not_found off; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /app/nginx/html; internal; } } 查看证书：\ncd /app/nginx tree acme/ modules/ 需要安装tree\napt-get update \u0026amp;\u0026amp; apt-get install -y tree 单域名没有跳转配置\n示例：\nupstream tv_2345_com { server 6.6.6.6:80; #server 3.2.3.8:80 backup; keepalive 32; } server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name tv.2345.com; access_log logs/tv.2345.com-access.log; error_log logs/tv.2345.com-error.log warn; acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; # 安全头 add_header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; always; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; add_header Strict-Transport-Security \u0026#34;max-age=31536000\u0026#34; always; location / { proxy_pass http://tv_2345_com; proxy_http_version 1.1; # 代理超时与重试 proxy_connect_timeout 5s; proxy_send_timeout 15s; proxy_read_timeout 15s; proxy_next_upstream error timeout http_502 http_503 http_504; } location ~ /\\. { deny all; access_log off; log_not_found off; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /app/nginx/html; internal; } } 验证和重载 验证配置文件语法\ncd /app/nginx/ ./sbin/nginx -c conf/nginx.conf -t 提示以下信息正确\nnginx: the configuration file /app/nginx/conf/nginx.conf syntax is ok nginx: configuration file /app/nginx/conf/nginx.conf test is successful 启动，如果已经启动会提示Address already in use\ncd /app/nginx/ ./sbin/nginx -c conf/nginx.conf 配置变更后重载\ncd /app/nginx/ ./sbin/nginx -c conf/nginx.conf -s reload 禁止IP访问 已使用更简洁的方法，以下方式仅供参考。\n生成自签名证书\nopenssl req -x509 -nodes -days 3650 -newkey rsa:2048 \\ -keyout /app/nginx/conf/default_ssl.key \\ -out /app/nginx/conf/default_ssl.crt \\ -subj \u0026#34;/C=CN/ST=State/L=City/O=Org/CN=_\u0026#34; 修改nginx全局配置\nnano /app/nginx/conf/nginx.conf 修改结尾部分\n# HTTP → HTTPS 跳转 server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { return 301 https://$host$request_uri; } } # 禁止 IP 直接访问(HTTPS) server { listen 443 ssl default_server; listen [::]:443 ssl default_server; http2 on; server_name _; ssl_certificate /app/nginx/conf/default_ssl.crt; ssl_certificate_key /app/nginx/conf/default_ssl.key; return 444; } include conf.d/*.conf; } 最后重载生效\ncd /app/nginx/ ./sbin/nginx -c conf/nginx.conf -s reload 验证\ncd /app/nginx/ ./sbin/nginx -c conf/nginx.conf -t 带缓存的版本 创建缓存文件夹\nmkdir -p /usr/local/nginx/cache/proxy nginx配置\nuser nginx; worker_processes auto; worker_rlimit_nofile 65535; error_log logs/error.log warn; pid nginx.pid; # ACME 模块 load_module modules/ngx_http_acme_module.so; events { worker_connections 4096; multi_accept on; use epoll; } http { include mime.types; default_type application/octet-stream; # 日志 log_format main \u0026#39;$remote_addr - $remote_user [$time_local] \u0026#34;$request\u0026#34; \u0026#39; \u0026#39;$status $body_bytes_sent \u0026#34;$http_referer\u0026#34; \u0026#39; \u0026#39;\u0026#34;$http_user_agent\u0026#34; \u0026#34;$http_x_forwarded_for\u0026#34; \u0026#39; \u0026#39;rt=$request_time uct=\u0026#34;$upstream_connect_time\u0026#34; \u0026#39; \u0026#39;uht=\u0026#34;$upstream_header_time\u0026#34; urt=\u0026#34;$upstream_response_time\u0026#34;\u0026#39;; access_log logs/access.log main; # 基础性能 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65s 60s; keepalive_requests 1000; reset_timedout_connection on; # === 客户端请求体配置 === client_max_body_size 100m; client_body_buffer_size 256k; client_body_timeout 30s; # === 客户端请求头配置 === client_header_buffer_size 4k; large_client_header_buffers 4 16k; client_header_timeout 10s; # === 临时文件路径 === client_body_temp_path cache/client_temp; # === 防止慢速攻击 === client_body_in_single_buffer off; # DNS resolver 8.8.8.8 1.0.0.1 valid=300s ipv6=off; resolver_timeout 5s; # 全局代理头（所有站点都生效） 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; proxy_hide_header X-Powered-By; proxy_hide_header Server; # 隐藏 Nginx 版本号 server_tokens off; # ACME acme_shared_zone zone=acme_shared:2M; acme_issuer letsencrypt { uri https://acme-v02.api.letsencrypt.org/directory; contact mailto:123456@qq.com; state_path acme/letsencrypt; accept_terms_of_service; } # SSL ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers \u0026#39;ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384\u0026#39;; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:20m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_buffer_size 4k; # 全局限流（保持） limit_req_zone $binary_remote_addr zone=req_limit:10m rate=200r/s; limit_req zone=req_limit burst=300; limit_req_status 429; limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 100; limit_conn_status 429; # proxy缓存配置 proxy_cache_path /usr/local/nginx/cache/proxy levels=1:2 keys_zone=my_proxy_cache:200m max_size=5g inactive=4h use_temp_path=off; # 代理缓冲配置 proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 8 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 512k; proxy_socket_keepalive on; proxy_intercept_errors on; # HTTP → HTTPS 跳转 server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { return 301 https://$host$request_uri; } } # 禁止 IP 直接访问 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_reject_handshake on; } include conf.d/*.conf; } 站点配置\n# ============================== # Upstream 后端服务定义 # ============================== upstream 2345_com { server 3.3.3.3:80; keepalive 32; } # ============================== # 主站配置 # ============================== server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name blog.2345.com; access_log logs/blog.2345.com-access.log; error_log logs/blog.2345.com-error.log warn; # ============================== # SSL 配置 # ============================== acme_certificate letsencrypt; ssl_certificate $acme_certificate; ssl_certificate_key $acme_certificate_key; ssl_certificate_cache max=2; # ============================== # 通用代理故障转移策略 # ============================== proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_next_upstream_tries 3; # ============================== # 缓存配置 # ============================== proxy_cache my_proxy_cache; proxy_cache_methods GET HEAD; proxy_cache_key \u0026#34;$scheme$proxy_host$request_uri$is_args$args\u0026#34;; proxy_cache_valid 200 301 302 2h; proxy_cache_valid 404 1m; proxy_cache_valid 500 502 503 504 0; proxy_cache_valid any 30s; proxy_cache_revalidate on; proxy_cache_min_uses 1; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_bypass $cookie_nocache $arg_nocache; proxy_no_cache $cookie_nocache $arg_nocache; proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_background_update on; # ============================== # 主代理区块 # ============================== location / { proxy_pass http://2345_com; proxy_http_version 1.1; # 代理超时 proxy_connect_timeout 5s; proxy_send_timeout 15s; proxy_read_timeout 15s; # 安全响应头 add_header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; always; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; add_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains\u0026#34; always; # 仅在代理请求中添加缓存状态头 add_header X-Cache-Status $upstream_cache_status always; } # ============================== # 隐藏文件 \u0026amp; 敏感文件保护 # ============================== location ~ /\\. { deny all; access_log off; log_not_found off; } location ~* \\.(env|git|svn|htaccess|htpasswd|bak|log|sql|zip|tar\\.gz)$ { deny all; access_log off; log_not_found off; } # ============================== # 错误页面 # ============================== error_page 500 502 503 504 /50x.html; location = /50x.html { root /app/nginx/html; internal; } } ","date":"2025-10-01T23:25:03+08:00","permalink":"https://blog.lufei.de/p/479/","title":"Nginx ACME 自动化管理脚本，证书自动续签"},{"content":" 转载：https://ros6.com/?action=show\u0026amp;id=264\n预览\n防火墙 确保876端口开放\n# 如果使用ufw ufw allow 876 # 如果使用iptables iptables -A INPUT -p tcp --dport 876 -j ACCEPT 日志格式 首先查询 nginx.conf 所在目录\nfind /etc/nginx /www/server/nginx/conf /usr/local/nginx* /usr/local/etc/nginx -name nginx.conf 2\u0026gt;/dev/null 日志格式\n# 新增JSON日志格式（用于nginx_alog程序） log_format jsonlog escape=json \u0026#39;{\u0026#39; \u0026#39;\u0026#34;time_local\u0026#34;:\u0026#34;$time_iso8601\u0026#34;,\u0026#39; \u0026#39;\u0026#34;timestamp\u0026#34;:\u0026#34;$msec\u0026#34;,\u0026#39; \u0026#39;\u0026#34;remote_addr\u0026#34;:\u0026#34;$remote_addr\u0026#34;,\u0026#39; \u0026#39;\u0026#34;host\u0026#34;:\u0026#34;$host:$server_port\u0026#34;,\u0026#39; \u0026#39;\u0026#34;request\u0026#34;:\u0026#34;$request\u0026#34;,\u0026#39; \u0026#39;\u0026#34;status\u0026#34;: \u0026#34;$status\u0026#34;,\u0026#39; \u0026#39;\u0026#34;body_bytes_sent\u0026#34;:\u0026#34;$body_bytes_sent\u0026#34;,\u0026#39; \u0026#39;\u0026#34;http_referer\u0026#34;:\u0026#34;$http_referer\u0026#34;,\u0026#39; \u0026#39;\u0026#34;http_user_agent\u0026#34;:\u0026#34;$http_user_agent\u0026#34;,\u0026#39; \u0026#39;\u0026#34;request_time\u0026#34;:\u0026#34;$request_time\u0026#34;,\u0026#39; \u0026#39;\u0026#34;cache_status\u0026#34;:\u0026#34;$upstream_cache_status\u0026#34;,\u0026#39; \u0026#39;\u0026#34;gzip_ratio\u0026#34;:\u0026#34;$gzip_ratio\u0026#34;\u0026#39; \u0026#39;}\u0026#39;; 站点日志更改\naccess_log /home/wwwroot/xxx.access.log jsonlog buffer=32k flush=5s; 重载nginx\nnginx -s reload 启动程序 创建工作目录并进入\nmkdir -p /opt/nginx_alog cd /opt/nginx_alog 下载主程序\nwget https://github.com/jimugou/jimugou.github.io/releases/download/v1.0.0/nginx_alog chmod +x nginx_alog 下载IP库\nwget https://github.com/jimugou/jimugou.github.io/releases/download/v1.0.0/ipv4.bin wget https://github.com/jimugou/jimugou.github.io/releases/download/v1.0.0/ipv6.bin 启动服务\n./nginx_alog log=/var/log/nginx/access.log logkeep=375 token=123 conf=/etc/nginx/nginx.conf 参数说明：\nlog：站点日志路径\nconf：nginx.conf 路径\ntoken：访问认证密钥\nlogkeep：日志保存时长（小时）\n后台运行方式 方法1：使用nohup\nnohup ./nginx_alog log=/var/log/nginx/access.log logkeep=375 token=123 conf=/etc/nginx/nginx.conf \u0026gt; nginx_alog.log 2\u0026gt;\u0026amp;1 \u0026amp; 方法2：使用screen（推荐）\nscreen -S nginx_alog ./nginx_alog log=/var/log/nginx/access.log logkeep=375 token=123 conf=/etc/nginx/nginx.conf 按 Ctrl+A 然后按 D 退出screen会话\n重新进入screen会话查看\nscreen -r nginx_alog 访问 打开浏览器，访问：http://服务器IP:876/?mytoken=123\ntabiew json日志数据可视化\n项目：https://github.com/shshemi/tabiew/tree/main\nwget https://github.com/shshemi/tabiew/releases/download/v0.11.1/tabiew-x86_64-unknown-linux-gnu.deb sudo dpkg -i tabiew-x86_64-unknown-linux-gnu.deb 运行\ntw -f jsonl /home/wwwroot/logs/xxxx.access.log 用法：/搜索、Enter展开、e适配终端大小、q退出、导航h j k l或← ↓ ↑ →\nrhit 项目：https://github.com/Canop/rhit\nwget https://dystroy.org/rhit/download/x86_64-unknown-linux-gnu/rhit mv rhit /usr/local/bin/ chmod +x /usr/local/bin/rhit 转换日志格式\njq -R \u0026#39;fromjson? | select(.) | \u0026#34;\\(.remote_addr) - \\(.remote_user // \u0026#34;-\u0026#34;) [\\(.time_local)] \\\u0026#34;\\(.request)\\\u0026#34; \\(.status) \\(.body_bytes_sent) \\\u0026#34;\\(.http_referer)\\\u0026#34; \\\u0026#34;\\(.http_user_agent)\\\u0026#34;\u0026#34;\u0026#39; \\ /home/wwwroot/logs/xxx-access.log \\ \u0026gt; /home/wwwroot/logs/xxx-access-rhit.log 一键分析报告\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rhit_report.sh \u0026amp;\u0026amp; chmod +x rhit_report.sh 执行\n./rhit_report.sh /path/to/access-rhit.log 1️⃣ 基础总览\nrhit /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 显示 日期、状态、referer、路径 的总体情况。\n2️⃣ 查看访问量最高的 IP\nrhit -f i /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 输出访问次数最多的客户端 IP。\n3️⃣ 查看最消耗带宽的 IP\nrhit -k bytes -f i /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 按 传输字节数 排序，找出大流量 IP。\n4️⃣ 查看访问最多的页面路径\nrhit -f p /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 显示最热门的 URL 路径。\n5️⃣ 查看消耗流量最大的页面\nrhit -k bytes -f p /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 找出占带宽最多的 URL。\n6️⃣ 查看状态码分布\nrhit -f s /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 检查 200、404、500 等比例。\n7️⃣ 查看 referer 来源\nrhit -f r /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 知道访问从哪些网站引流过来。\n8️⃣ 查看 HTTP 方法\nrhit -f m /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 👉 查看 GET、POST、HEAD 的分布。\n9️⃣ 时间维度分析\n按日期：\nrhit -f d /home/wwwroot/lnmp01/logs/xxx-access-rhit.log 按小时：\nrhit -f t /home/wwwroot/lnmp01/logs/xxx-access-rhit.log ","date":"2025-09-29T05:27:05+08:00","permalink":"https://blog.lufei.de/p/478/","title":"nginx日志分析工具"},{"content":" 项目： github.com/netcccyun/dnsmgr\n系统：推荐 Debian12\n安装docker curl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh 检测是否安装\ndocker --version docker compose version 创建目录 # 创建项目根目录 mkdir dnsmgr-deploy cd dnsmgr-deploy # 创建必要的目录结构 mkdir -p ./web mkdir -p ./mysql/conf mkdir -p ./mysql/logs mkdir -p ./mysql/data 配置MySQL文件 vim mysql/conf/my.cnf 在 my.cnf 文件中添加以下内容：\n[mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 创建 docker-compose.yml 文件 vim docker-compose.yml 添加以下内容：\nservices: dnsmgr-web: container_name: dnsmgr-web stdin_open: true tty: true ports: - 8081:80 volumes: - ./web:/app/www image: netcccyun/dnsmgr depends_on: - dnsmgr-mysql networks: - dnsmgr-network restart: unless-stopped dnsmgr-mysql: container_name: dnsmgr-mysql restart: always volumes: - ./mysql/conf/my.cnf:/etc/mysql/my.cnf - ./mysql/logs:/logs - ./mysql/data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai image: mysql:5.7 networks: - dnsmgr-network networks: dnsmgr-network: driver: bridge 设置目录权限 sudo chown -R 1000:1000 ./web sudo chmod -R 755 ./web sudo chmod -R 755 ./mysql 启动服务 docker compose up -d 创建数据库 等待MySQL容器完全启动后，执行以下命令：\n# 进入MySQL容器 docker exec -it dnsmgr-mysql /bin/bash # 连接MySQL数据库 mysql -uroot -p123456 # 创建数据库 CREATE DATABASE dnsmgr; # 退出MySQL exit exit 访问安装页面 打开浏览器访问：http://your-server-ip:8081 系统会自动跳转到安装页面 填写安装信息： 数据库服务器地址：dnsmgr-mysql 数据库端口：3306 数据库名称：dnsmgr 数据库用户名：root 数据库密码：123456 管理员账户：设置你的管理员用户名和密码 启动容灾切换 # 进入web容器 docker exec -it dnsmgr-web /bin/bash # 切换到项目目录 cd /app/www/ # 启动容灾切换进程 php think dmtask 或者\n# 后台运行命令 docker exec -d dnsmgr-web /bin/bash -c \u0026#34;cd /app/www \u0026amp;\u0026amp; php think dmtask\u0026#34; # 查看运行的进程 docker exec dnsmgr-web ps aux | grep dmtask 杀掉进程,假设pid是626\ndocker exec dnsmgr-web kill 626 重启\ndocker exec -d dnsmgr-web /bin/bash -c \u0026#34;cd /app/www \u0026amp;\u0026amp; php think dmtask\u0026#34; 重新启动\ncd dnsmgr-deploy docker compose down docker compose up -d ","date":"2025-09-28T14:04:03+08:00","permalink":"https://blog.lufei.de/p/477/","title":"彩虹聚合DNS管理系统部署教程"},{"content":" 系统：debian12\n使用场景：网站反代\n前提：后端站点要配置好证书，绑定域名\n域名解析到安装haproxy服务器的ip上\n一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fd-haproxy.sh \u0026amp;\u0026amp; chmod +x fd-haproxy.sh \u0026amp;\u0026amp; ./fd-haproxy.sh 找一台线路还不错的服务器按照以下方式进行\nHAProxy的安装 apt install haproxy -y 安装完毕后，启用haproxy进程\nsystemctl start haproxy systemctl enable haproxy HAProxy的配置文件地址默认为/etc/haproxy/haproxy.cfg接下来，我们要编辑这个文件，\nnano /etc/haproxy/haproxy.cfg 配置HAProxy前后端 反代后端站点的80和443端口，仅修改后端服务器ip即可\n提示：8.8.8.8为备用服务器（不需要可以注释掉），要做负载均衡，把backup参数移除\nglobal log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon maxconn 30000 defaults log global mode tcp option tcplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http # HTTPS重定向frontend (HTTP模式) frontend http_redirect bind *:80 mode http option httplog redirect scheme https code 301 # HTTPS frontend (TCP模式用于SSL透传) frontend tcp_front_443 bind *:443 mode tcp option tcplog rate-limit sessions 15000 default_backend servers_443 backend servers_443 mode tcp server web1 7.7.7.7:443 check inter 10s rise 2 fall 3 server web2 8.8.8.8:443 check inter 10s rise 2 fall 3 backup 验证格式是否正确：\nhaproxy -c -f /etc/haproxy/haproxy.cfg 重启生效\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy 添加安全头 可选，在后端站点，例如站点nginx配置中添加以下参数\nadd_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; always; add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34; always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; always; 获取客户端真实ip 第一步：haproxy启用PROXY协议v2，例如\nbackend web_servers mode tcp balance roundrobin server web1 192.168.1.100:443 send-proxy-v2 # send-proxy-v2 启用PROXY协议v2 第二步：修改站点nginx配置文件\nmkdir -p /home/wwwroot/lnmp01/vhost/cf_real_ip nano /home/wwwroot/lnmp01/vhost/cf_real_ip/cloudflare.conf 复制\n# Cloudflare IP ranges # HAProxy IP set_real_ip_from 你的HAProxy服务器IP; # Cloudflare IPv4 set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # Cloudflare IPv6 set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; 站点配置\nlisten 443 ssl http2 proxy_protocol; include /home/wwwroot/lnmp01/vhost/cf_real_ip/cloudflare.conf; real_ip_header proxy_protocol; 最后重启nginx生效\n","date":"2025-09-27T12:25:34+08:00","permalink":"https://blog.lufei.de/p/476/","title":"haproxy的安装与反向代理配置"},{"content":" 更换软件源 # 临时使用官方源 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \u0026#34;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable\u0026#34; | sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 重新安装 sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io 验证安装 sudo systemctl status docker docker --version ","date":"2025-09-26T23:17:21+08:00","permalink":"https://blog.lufei.de/p/475/","title":"docker安装失败解决办法"},{"content":" 搭建环境：debian12\n项目地址：github.com/jiangrui1994/cloudsaver\n提醒：务必通过Docker自行私有化部署本项目，不要使用任何第三方或他人部署的服务\n搭建教程 mkdir -p /root/data/docker_data/cloudsaver cd /root/data/docker_data/cloudsaver 接着我们来编辑下docker-compose.yml\nnano docker-compose.yml 如下\nservices: cloudsaver: image: jiangrui1994/cloudsaver:latest container_name: cloud-saver ports: - \u0026#34;8009:8008\u0026#34; volumes: - ./data:/app/data - ./config:/app/config restart: unless-stopped 启动\ncd /root/data/docker_data/cloudsaver docker compose up -d # 注意，老版本用户用 docker-compose up -d 理论上我们就可以输入 http://ip:8009 访问了\ncaddy 反向代理 # 通用配置 (common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } } # 站点配置 cloud.xxxxxx.com { import common_config reverse_proxy 127.0.0.1:8009 } 使用教程 登陆，开始注册。\n默认注册码：管理员：230713 普通用户：9527\n我们是管理员就用230713\n频道分享\n[{\u0026#34;name\u0026#34;:\u0026#34;LEO资源库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;leoziyuan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;夸克影库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Quark_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源宇宙\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tgsearchers3\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘4K影视资源(国内)\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Aliyun_4K_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘4K影视资源(国外)\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Netdisk_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;迅雷云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;123云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yp123pan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;极速云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;sbsbsnsqq\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;迅雷云坊\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanxunlei\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼飞传\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tianyifc\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;百度云典藏\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;BaiduCloudDisk\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼空间\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;txtyzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源快线\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;peccxinpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;光速盘库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;gotopan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;盘聚会馆\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;PanjClub\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;快客资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;kkxlzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;百草资源屋\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;baicaoZY\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影库一号\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;MCPH01\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘综合台\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;bdwpzhpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视吧48\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ysxb48\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视站1111\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;jdjdn1111\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;云光共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yggpan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影库086\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;MCPH086\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;在花云享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;zaihuayun\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;Q66影库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Q66Share\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;奥斯卡4K影城\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Oscar_4Kmovies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC网盘资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ucwpzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;阿里云共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;shareAliyun\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;阿里影盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;alyp_1\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;电影分享站\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;dianyingshare\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;湘秀影播\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;XiangxiuNBB\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;移动影盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ydypzyfx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC夸克云\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ucquark\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;分享123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;xx123pan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视共享123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yingshifenxiang123\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源发布123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;zyfb123\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼综合盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tyypzhpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼日更\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tianyirigeng\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼云空间\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;cloudtianyi\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;高清汇\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;hdhhd21\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;老司机115\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Lsp115\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115网盘分享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;oneonefivewpfx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;七星真人\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;qixingzhenren\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;淘享资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;taoxgzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115分享频道\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Channel_Shares_115\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼影视盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tyysypzypd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115热门影视\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;vip115hot\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘123共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;wp123zy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;139云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpan139\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;189云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpan189\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanuc\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;远影导航\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yydf_hzl\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;PikPak盘库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;pikpakpan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;Q动漫库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Q_dongman\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;悠游剧集\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yoyokuakeduanju\u0026#34;}] 或者\n[{\u0026#34;name\u0026#34;:\u0026#34;夸克影库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Quark_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;LEO资源库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;leoziyuan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源宇宙\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tgsearchers3\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘4K影视资源(国内)\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Aliyun_4K_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘4K影视资源(国外)\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Netdisk_Movies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;迅雷云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;123云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yp123pan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;极速云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;sbsbsnsqq\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;迅雷云坊\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanxunlei\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼飞传\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tianyifc\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;百度云典藏\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;BaiduCloudDisk\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼空间\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;txtyzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源快线\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;peccxinpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;光速盘库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;gotopan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;盘聚会馆\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;PanjClub\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;快客资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;kkxlzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;百草资源屋\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;baicaoZY\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影库一号\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;MCPH01\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘综合台\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;bdwpzhpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视吧48\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ysxb48\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视站1111\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;jdjdn1111\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;云光共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yggpan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影库086\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;MCPH086\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;在花云享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;zaihuayun\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;Q66影库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Q66Share\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;奥斯卡4K影城\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Oscar_4Kmovies\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC网盘资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ucwpzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;阿里云共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;shareAliyun\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;阿里影盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;alyp_1\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;电影分享站\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;dianyingshare\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;湘秀影播\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;XiangxiuNBB\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;移动影盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ydypzyfx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC夸克云\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;ucquark\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;分享123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;xx123pan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;影视共享123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yingshifenxiang123\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;资源发布123\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;zyfb123\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼综合盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tyypzhpd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼日更\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tianyirigeng\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼云空间\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;cloudtianyi\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;高清汇\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;hdhhd21\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;老司机115\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Lsp115\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115网盘分享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;oneonefivewpfx\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;七星真人\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;qixingzhenren\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;淘享资源\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;taoxgzy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115分享频道\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Channel_Shares_115\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;天翼影视盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;tyysypzypd\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;115热门影视\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;vip115hot\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;网盘123共享\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;wp123zy\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;139云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpan139\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;189云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpan189\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;UC云盘\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yunpanuc\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;远影导航\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yydf_hzl\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;PikPak盘库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;pikpakpan\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;Q动漫库\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;Q_dongman\u0026#34;},{\u0026#34;name\u0026#34;:\u0026#34;悠游剧集\u0026#34;,\u0026#34;id\u0026#34;:\u0026#34;yoyokuakeduanju\u0026#34;}] 更新 cloudsaver cd /root/data/docker_data/cloudsaver docker compose pull docker compose up -d docker image prune 提示：\nWARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] 输入 y\n卸载 cloudsaver cd /root/data/docker_data/cloudsaver docker compose down cd .. rm -rf /root/data/docker_data/cloudsaver # 完全删除 白名单（可选） 禁止使用ip:8009登录, 仅允许域名\n安装 ipset（如果尚未安装）：\nsudo apt-get update sudo apt-get install ipset -y 创建允许访问的特定 IP 集合：\nsudo ipset create allowed_ips hash:ip 添加需要允许访问的特定 IP 地址：\nsudo ipset add allowed_ips 192.168.1.11 添加 iptables 规则以允许指定端口访问，以 8008 端口为例：\nsudo iptables -I DOCKER-USER 1 -m set --match-set allowed_ips src -p tcp --dport 8008 -j ACCEPT sudo iptables -I DOCKER-USER 2 -p tcp --dport 8008 -j DROP 确认规则\nsudo iptables -L DOCKER-USER -n --line-numbers 如果要添加新的 ip 白名单，例如放行 192.168.2.22\nsudo ipset add allowed_ips 192.168.2.22 ","date":"2025-09-22T12:20:48+08:00","permalink":"https://blog.lufei.de/p/473/","title":"cloudsaver部署教程"},{"content":"基于https://www.nodeseek.com/post-409979-1修改而来\n改进特性:\n• 内置Python HTTP服务器，无需依赖Nginx\n• 自动检测是否是数据库类型\n• 支持自定义端口，自动检测端口冲突\n• 增强的错误处理和连接测试\n• 更好的跨平台兼容性\n脚本 注意：源服务器要开放8889端口（可以自定义）\n在两台服务器上下载脚本，任意目录均可\ncurl -O https://raw.githubusercontent.com/woniu336/open_shell/main/Docker_container_migration.sh chmod +x Docker_container_migration.sh ./Docker_container_migration.sh bug 在新服务器恢复需要注意的地方\n1. 使用docker-compose.yml或者有变量创建的项目\n由于脚本仅备份了卷，恢复完成后，会出现一些错误，比如没有创建docker网络，忽略错误退出脚本，按照原本项目的一些创建步骤： 比如创建文件夹 创建docker-compose.yml或者变量 然后进入项目文件夹，再启动\ndocker compose up -d 2. 一键docker run创建的项目\n如果你的项目是一键docker run生成的，忽略错误，退出脚本后，直接按照你原本的一键docker run方式去生成即可。\n完结~\n","date":"2025-09-16T21:19:37+08:00","permalink":"https://blog.lufei.de/p/472/","title":"docker备份脚本"},{"content":"复制到powershell\n#================================================================================ # --- 脚本配置 --- $GithubApiUrl = \u0026#34;https://api.github.com/repos/EasyTier/EasyTier/releases/latest\u0026#34; $GithubProxy = \u0026#34;ghfast.top\u0026#34; # 可选代理, 留空则不使用 # --- 路径和名称定义 --- # 使用 Program Files 和 ProgramData 是 Windows 的标准做法 $InstallDir = \u0026#34;$env:ProgramFiles\\EasyTier\u0026#34; $ConfigDir = \u0026#34;$env:ProgramData\\EasyTier\u0026#34; # ProgramData 是系统级应用数据的存放位置 $ConfigFile = Join-Path $ConfigDir \u0026#34;easytier.toml\u0026#34; $CoreBinaryName = \u0026#34;easytier-core.exe\u0026#34; $CliBinaryName = \u0026#34;easytier-cli.exe\u0026#34; $CoreBinaryPath = Join-Path $InstallDir $CoreBinaryName $CliBinaryPath = Join-Path $InstallDir $CliBinaryName # --- Windows 服务定义 --- $ServiceName = \u0026#34;EasyTierService\u0026#34; $ServiceDisplayName = \u0026#34;EasyTier Service\u0026#34; # --- 颜色定义 --- $c_green = \u0026#34;Green\u0026#34; $c_red = \u0026#34;Red\u0026#34; $c_yellow = \u0026#34;Yellow\u0026#34; $c_cyan = \u0026#34;Cyan\u0026#34; $c_normal = \u0026#34;White\u0026#34; # --- 辅助函数 --- # 检查是否以管理员身份运行 function Check-Admin { $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $principal = [System.Security.Principal.WindowsPrincipal]::new($identity) if (-not $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host \u0026#34;错误: 此脚本必须以管理员身份运行。\u0026#34; -ForegroundColor $c_red Write-Host \u0026#34;请右键点击 PowerShell 窗口标题栏，选择 \u0026#39;以管理员身份运行\u0026#39;，或右键点击脚本文件选择 \u0026#39;使用 PowerShell 运行\u0026#39;。\u0026#34; -ForegroundColor $c_yellow Read-Host \u0026#34;按 Enter 键退出...\u0026#34; exit 1 } } # 检查 EasyTier 是否已安装 function Check-Installed { if (-not (Test-Path $CoreBinaryPath)) { Write-Host \u0026#34;EasyTier 尚未安装。请先选择选项 1。\u0026#34; -ForegroundColor $c_yellow return $false } return $true } # 修改 toml 文件中的值 (PowerShell 版本) function Set-TomlValue { param( [string]$Key, [string]$Value, [string]$FilePath ) try { $content = Get-Content $FilePath -Raw $pattern = \u0026#34;(?im)^#*\\s*($Key)\\s*=.+\u0026#34; $replacement = \u0026#34;$Key = $Value\u0026#34; $newContent = $content -replace $pattern, $replacement Set-Content -Path $FilePath -Value $newContent } catch { Write-Host \u0026#34;错误: 修改配置文件失败: $_\u0026#34; -ForegroundColor $c_red } } # --- 主功能函数 --- function Install-EasyTier { Write-Host \u0026#34;--- 开始安装或更新 EasyTier ---\u0026#34; -ForegroundColor $c_green # 在 Windows 上，我们主要关注 x86_64 $arch = \u0026#34;x86_64\u0026#34; $os_identifier = \u0026#34;windows\u0026#34; Write-Host \u0026#34;1. 获取最新版本信息...\u0026#34; try { $latestInfo = Invoke-RestMethod -Uri $GithubApiUrl } catch { Write-Host \u0026#34;错误: 无法从 GitHub API 获取版本信息。请检查网络连接。\u0026#34; -ForegroundColor $c_red return } $search_prefix = \u0026#34;easytier-${os_identifier}-${arch}\u0026#34; $asset = $latestInfo.assets | Where-Object { $_.name -like \u0026#34;$search_prefix*.zip\u0026#34; } if (-not $asset) { Write-Host \u0026#34;错误: 未能找到适用于 Windows (x64) 的包。\u0026#34; -ForegroundColor $c_red return } $downloadUrl = $asset.browser_download_url $fileName = $asset.name $version = $latestInfo.tag_name Write-Host \u0026#34;检测到版本: $version, 架构: $arch, 文件: $fileName\u0026#34; if ($GithubProxy) { $downloadUrl = \u0026#34;https://$GithubProxy/$downloadUrl\u0026#34; Write-Host \u0026#34;2. 使用代理下载: $downloadUrl\u0026#34; -ForegroundColor $c_yellow } else { Write-Host \u0026#34;2. 直接下载: $downloadUrl\u0026#34; } $tempFile = Join-Path $env:TEMP $fileName try { Invoke-WebRequest -Uri $downloadUrl -OutFile $tempFile -UseBasicParsing } catch { Write-Host \u0026#34;下载失败! $_\u0026#34; -ForegroundColor $c_red if (Test-Path $tempFile) { Remove-Item $tempFile } return } Write-Host \u0026#34;3. 解压并安装...\u0026#34; # 确保安装目录存在 if (-not (Test-Path $InstallDir)) { New-Item -Path $InstallDir -ItemType Directory -Force | Out-Null } try { Expand-Archive -Path $tempFile -DestinationPath $InstallDir -Force } catch { Write-Host \u0026#34;解压失败! $_\u0026#34; -ForegroundColor $c_red if (Test-Path $tempFile) { Remove-Item $tempFile } return } # ====================【关键修复代码块】==================== Write-Host \u0026#34;4. 整理文件结构...\u0026#34; -ForegroundColor $c_yellow # 查找解压后可能创建的子目录 (例如 easytier-windows-x86_64) $subDir = Get-ChildItem -Path $InstallDir -Directory | Select-Object -First 1 if ($subDir) { # 如果找到了子目录，将其中的所有内容移动到上层安装目录 Write-Host \u0026#34;检测到子目录 $($subDir.FullName)，正在移动文件...\u0026#34; -ForegroundColor $c_cyan Move-Item -Path (Join-Path $subDir.FullName \u0026#34;*\u0026#34;) -Destination $InstallDir -Force # 删除空的子目录 Remove-Item -Path $subDir.FullName -Force -ErrorAction SilentlyContinue } # ========================================================= # 清理工作 Remove-Item $tempFile Write-Host \u0026#34;--- EasyTier $version 安装/更新成功! ---\u0026#34; -ForegroundColor $c_green Write-Host \u0026#34;程序已安装到: $InstallDir\u0026#34; -ForegroundColor $c_cyan # 如果服务已存在, 重启以应用更新 if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Write-Host \u0026#34;检测到现有服务，正在重启以应用更新...\u0026#34; -ForegroundColor $c_yellow Restart-Service -Name $ServiceName } } function Create-DefaultConfig { if (-not (Test-Path $ConfigDir)) { New-Item -Path $ConfigDir -ItemType Directory -Force | Out-Null } $configContent = @\u0026#34; ipv4 = \u0026#34;\u0026#34; dhcp = false listeners = [\u0026#34;udp://0.0.0.0:11010\u0026#34;, \u0026#34;tcp://0.0.0.0:11010\u0026#34;, \u0026#34;wg://0.0.0.0:11011\u0026#34;, \u0026#34;ws://0.0.0.0:11011/\u0026#34;, \u0026#34;wss://0.0.0.0:11012/\u0026#34;] [network_identity] network_name = \u0026#34;\u0026#34; network_secret = \u0026#34;\u0026#34; [flags] default_protocol = \u0026#34;udp\u0026#34; dev_name = \u0026#34;\u0026#34; enable_encryption = true enable_ipv6 = true mtu = 1380 latency_first = true enable_exit_node = false no_tun = false use_smoltcp = false foreign_network_whitelist = \u0026#34;*\u0026#34; disable_p2p = false relay_all_peer_rpc = false disable_udp_hole_punching = false enableKcp_Proxy = true \u0026#34;@ Set-Content -Path $ConfigFile -Value $configContent Write-Host \u0026#34;已成功创建默认配置文件: $ConfigFile\u0026#34; } function Configure-Network { if (-not (Check-Installed)) { return } $network_name = Read-Host \u0026#34;请输入网络名称\u0026#34; $network_secret = Read-Host \u0026#34;请输入网络密钥\u0026#34; $virtual_ip = Read-Host \u0026#34;请输入此节点虚拟IP (留空则启用DHCP)\u0026#34; Create-DefaultConfig Set-TomlValue \u0026#34;network_name\u0026#34; \u0026#34;`\u0026#34;$network_name`\u0026#34;\u0026#34; $ConfigFile Set-TomlValue \u0026#34;network_secret\u0026#34; \u0026#34;`\u0026#34;$network_secret`\u0026#34;\u0026#34; $ConfigFile if ([string]::IsNullOrWhiteSpace($virtual_ip)) { Write-Host \u0026#34;未输入IP，将启用 DHCP 自动获取地址。\u0026#34; -ForegroundColor $c_yellow Set-TomlValue \u0026#34;dhcp\u0026#34; \u0026#34;true\u0026#34; $ConfigFile Set-TomlValue \u0026#34;ipv4\u0026#34; \u0026#34;`\u0026#34;`\u0026#34;\u0026#34; $ConfigFile } else { Write-Host \u0026#34;已设置静态IP: $virtual_ip\u0026#34; -ForegroundColor $c_green Set-TomlValue \u0026#34;dhcp\u0026#34; \u0026#34;false\u0026#34; $ConfigFile Set-TomlValue \u0026#34;ipv4\u0026#34; \u0026#34;`\u0026#34;$virtual_ip`\u0026#34;\u0026#34; $ConfigFile } # 默认添加公共对端节点 $peer_address = \u0026#34;tcp://public.easytier.top:11010\u0026#34; Write-Host \u0026#34;默认连接到公共对端节点: $peer_address\u0026#34; -ForegroundColor $c_green Add-Content -Path $ConfigFile -Value \u0026#34;`n[[peer]]`nuri = `\u0026#34;$peer_address`\u0026#34;\u0026#34; Write-Host \u0026#34;正在创建并配置 Windows 服务...\u0026#34; -ForegroundColor $c_yellow # 如果服务存在, 先删除旧的, 以确保配置更新 if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue # 使用 sc.exe delete 比 Remove-Service 更可靠 sc.exe delete $ServiceName | Out-Null Start-Sleep -Seconds 2 } # 创建服务 $binaryPathWithArgs = \u0026#34;`\u0026#34;$CoreBinaryPath`\u0026#34; -c `\u0026#34;$ConfigFile`\u0026#34;\u0026#34; New-Service -Name $ServiceName -BinaryPathName $binaryPathWithArgs -DisplayName $ServiceDisplayName -StartupType Automatic # *** 关键：配置服务失败后自动重启，实现进程守护 *** # 第一次/第二次/后续失败后, 都在5秒后重启 sc.exe failure $ServiceName reset=86400 actions=restart/5000/restart/5000/restart/5000 | Out-Null Write-Host \u0026#34;服务创建成功，正在启动...\u0026#34; -ForegroundColor $c_green Start-Service -Name $ServiceName Start-Sleep -Seconds 2 Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType } function Manage-Service { if (-not (Check-Installed)) { return } if (-not (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue)) { Write-Host \u0026#34;服务尚未创建。请先配置网络 (选项 2)。\u0026#34; -ForegroundColor $c_yellow return } $menu_title = \u0026#34;管理EasyTier服务\u0026#34; $options = @( \u0026#34;启动服务\u0026#34;, \u0026#34;停止服务\u0026#34;, \u0026#34;重启服务\u0026#34;, \u0026#34;查看状态\u0026#34;, \u0026#34;返回主菜单\u0026#34; ) while ($true) { Clear-Host Write-Host \u0026#34;================ $menu_title ================\u0026#34; -ForegroundColor $c_cyan Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType Write-Host \u0026#34;------------------------------------------------\u0026#34; -ForegroundColor $c_cyan for ($i = 0; $i -lt $options.Count; $i++) { Write-Host (\u0026#34;{0}. {1}\u0026#34; -f ($i+1), $options[$i]) } $choice = Read-Host \u0026#34;请选择操作\u0026#34; switch ($choice) { \u0026#39;1\u0026#39; { Start-Service -Name $ServiceName; Write-Host \u0026#34;服务已启动。\u0026#34; -ForegroundColor $c_green } \u0026#39;2\u0026#39; { Stop-Service -Name $ServiceName; Write-Host \u0026#34;服务已停止。\u0026#34; -ForegroundColor $c_green } \u0026#39;3\u0026#39; { Restart-Service -Name $ServiceName; Write-Host \u0026#34;服务已重启。\u0026#34; -ForegroundColor $c_green } \u0026#39;4\u0026#39; { # 状态已在顶部显示，这里刷新一次 Get-Service -Name $ServiceName | Format-List -Property Name, DisplayName, Status, StartType } \u0026#39;5\u0026#39; { return } default { Write-Host \u0026#34;无效输入\u0026#34; -ForegroundColor $c_red } } Read-Host \u0026#34;按 Enter 键继续...\u0026#34; } } function Uninstall-EasyTier { Write-Host \u0026#34;警告: 此操作将停止服务并删除所有相关文件和配置。\u0026#34; -ForegroundColor $c_yellow $confirm = Read-Host \u0026#34;确定要卸载吗? (y/n)\u0026#34; if ($confirm -ne \u0026#39;y\u0026#39;) { Write-Host \u0026#34;操作已取消。\u0026#34; return } Write-Host \u0026#34;正在停止并删除服务...\u0026#34; if (Get-Service -Name $ServiceName -ErrorAction SilentlyContinue) { Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue sc.exe delete $ServiceName | Out-Null Start-Sleep -Seconds 2 # 等待服务删除完成 } Write-Host \u0026#34;正在删除文件和目录...\u0026#34; if (Test-Path $InstallDir) { Remove-Item -Path $InstallDir -Recurse -Force } if (Test-Path $ConfigDir) { Remove-Item -Path $ConfigDir -Recurse -Force } Write-Host \u0026#34;EasyTier 已成功卸载。\u0026#34; -ForegroundColor $c_green } # --- 主菜单循环 --- function Show-MainMenu { Check-Admin while ($true) { Clear-Host Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan Write-Host \u0026#34; EasyTier 跨平台部署脚本 (Windows Edition)\u0026#34; -ForegroundColor $c_green Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan Write-Host \u0026#34; 1. 安装或更新 EasyTier\u0026#34; Write-Host \u0026#34; 2. 配置网络并安装服务 (首次设置)\u0026#34; Write-Host \u0026#34;-------------------------------------------------------\u0026#34; Write-Host \u0026#34; 3. 管理 EasyTier 服务状态\u0026#34; Write-Host \u0026#34; 4. 查看 EasyTier 配置文件\u0026#34; Write-Host \u0026#34; 5. 查看 EasyTier 网络节点\u0026#34; Write-Host \u0026#34;-------------------------------------------------------\u0026#34; Write-Host \u0026#34; 6. 卸载 EasyTier\u0026#34; Write-Host \u0026#34; 0. 退出脚本\u0026#34; Write-Host \u0026#34;=======================================================\u0026#34; -ForegroundColor $c_cyan $choice = Read-Host \u0026#34;请输入选项 [0-6]\u0026#34; switch ($choice) { \u0026#39;1\u0026#39; { Install-EasyTier } \u0026#39;2\u0026#39; { Configure-Network } \u0026#39;3\u0026#39; { Manage-Service } \u0026#39;4\u0026#39; { if ((Check-Installed) -and (Test-Path $ConfigFile)) { Clear-Host Get-Content $ConfigFile | Write-Host } else { Write-Host \u0026#34;配置文件不存在或未安装。\u0026#34; -ForegroundColor $c_yellow } } \u0026#39;5\u0026#39; { if (Check-Installed) { Clear-Host \u0026amp; $CliBinaryPath peer } } \u0026#39;6\u0026#39; { Uninstall-EasyTier } \u0026#39;0\u0026#39; { exit 0 } default { Write-Host \u0026#34;无效输入\u0026#34; -ForegroundColor $c_red } } Write-Host \u0026#34;\u0026#34; Read-Host \u0026#34;按任意键返回主菜单...\u0026#34; } } # --- 脚本入口 --- Show-MainMenu 远程桌面.bat\n@echo off echo 正在启动远程桌面连接... mstsc /v:192.168.1.11 pause 允许远程访问.bat\n@echo off rem 打开系统属性设置界面 rem 相当于按Windows+R然后输入sysdm.cpl echo 正在打开系统属性设置界面... start sysdm.cpl rem 可选：显示提示信息 echo 系统属性窗口已打开！ pause ","date":"2025-09-02T16:46:33+08:00","permalink":"https://blog.lufei.de/p/471/","title":"一键组网之windows远程桌面"},{"content":"前言 前提条件：把MoonTV部署到vercel之后\ncaddy配置 把https://xxxxx.vercel.app替换成你的vercel地址即可\n(common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } log { output file /var/log/caddy/global.log { roll_size 50mb roll_keep 5 } } } tv.xxxxx.com { import common_config reverse_proxy https://xxxxx.vercel.app { header_up Host {upstream_hostport} header_up X-Real-IP {remote} } } 重启生效\nsystemctl restart caddy ","date":"2025-09-01T10:07:21+08:00","permalink":"https://blog.lufei.de/p/470/","title":"使用caddy反代MoonTV"},{"content":" 系统：debian12\n准备工作 假设1234.com是用户访问的域名，再找一个域名，例如 1234.kkk.eu.org\n1234.kkk.eu.org 绑定到源站（注意：1234.com也要绑定到源站）\n1234.kkk.eu.org 解析到源服务器 IP 地址，开启 CDN（小云朵），设置为灵活模式\n给 Caddy 正确的日志目录权限\nsudo mkdir -p /var/log/caddy sudo chown -R caddy:caddy /var/log/caddy sudo chmod 750 /var/log/caddy 安装caddy sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf \u0026#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key\u0026#39; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf \u0026#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt\u0026#39; | sudo tee /etc/apt/sources.list.d/caddy-stable.list chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg chmod o+r /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy 检测是否安装成功\ncaddy -v 配置修改 nano /etc/caddy/Caddyfile 反代配置如下：\n(common) { tls { protocols tls1.2 tls1.3 } header { -Via -Alt-Svc -Server } } (proxy) { header_up Host {upstream_hostport} header_up X-Real-IP {remote} } 1234.com { redir https://www.1234.com{uri} permanent } www.1234.com { import common reverse_proxy https://1234.kkk.eu.org { import proxy } } 或者\ng.1111.cc { encode zstd gzip reverse_proxy https://xxxx.22222.eu.org { transport http { dial_timeout 2s keepalive 30s keepalive_idle_conns 100 } header_up Host {upstream_hostport} header_up X-Real-IP {remote} } header { Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; X-Content-Type-Options \u0026#34;nosniff\u0026#34; Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; Permissions-Policy \u0026#34;geolocation=(), microphone=(), camera=()\u0026#34; -Server -Via -Alt-Svc -X-Powered-By defer } @blockedips remote_ip \\ 66.132.159.0/24 \\ 162.142.125.0/24 \\ 167.94.138.0/24 \\ 167.94.145.0/24 \\ 167.94.146.0/24 \\ 167.248.133.0/24 \\ 199.45.154.0/24 \\ 199.45.155.0/24 \\ 206.168.34.0/24 \\ 206.168.35.0/24 \\ 2602:80d:1000:b0cc:e::/80 \\ 2620:96:e000:b0cc:e::/80 \\ 2602:80d:1003::/112 \\ 2602:80d:1004::/112 handle @blockedips { respond \u0026#34;Your IP has been blocked.\u0026#34; 403 { close } } @badbots header_regexp User-Agent \u0026#34;(?i)censys|shodan|zoomeye|ahrefs|mj12|semrush|dotbot|libwww-perl|nmap|masscan|dirbuster|sqlmap|nikto|wpscan|whatweb|wget|fetch|httpclient|crawler|scrapy|httpx|netcraft|zgrab|nessus|openvas\u0026#34; handle @badbots { respond \u0026#34;Access denied\u0026#34; 403 { close } } @assets path_regexp \\.(jpg|jpeg|png|gif|webp|svg|ico|bmp|avif|icon|css|js|mjs|map|woff2?|ttf|otf|eot|wasm)$ header @assets Cache-Control \u0026#34;public, max-age=2592000, immutable\u0026#34; log { level INFO output file /var/log/caddy/caddy-web.log { roll_size 10MB roll_keep 10 } } } 或者（推荐）\n# 公共配置片段 (common_security) { header { Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; X-Content-Type-Options \u0026#34;nosniff\u0026#34; Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; Permissions-Policy \u0026#34;geolocation=(), microphone=(), camera=()\u0026#34; -Server -Via -Alt-Svc -X-Powered-By defer } @blockedips remote_ip \\ 66.132.159.0/24 \\ 162.142.125.0/24 \\ 167.94.138.0/24 \\ 167.94.145.0/24 \\ 167.94.146.0/24 \\ 167.248.133.0/24 \\ 199.45.154.0/24 \\ 199.45.155.0/24 \\ 206.168.34.0/24 \\ 206.168.35.0/24 \\ 2602:80d:1000:b0cc:e::/80 \\ 2620:96:e000:b0cc:e::/80 \\ 2602:80d:1003::/112 \\ 2602:80d:1004::/112 handle @blockedips { respond \u0026#34;Your IP has been blocked.\u0026#34; 403 { close } } @badbots header_regexp User-Agent \u0026#34;(?i)censys|shodan|zoomeye|ahrefs|mj12|semrush|dotbot|libwww-perl|nmap|masscan|dirbuster|sqlmap|nikto|wpscan|whatweb|wget|fetch|httpclient|crawler|scrapy|httpx|netcraft|zgrab|nessus|openvas\u0026#34; handle @badbots { respond \u0026#34;Access denied\u0026#34; 403 { close } } @assets path_regexp \\.(jpg|jpeg|png|gif|webp|svg|ico|bmp|avif|icon|css|js|mjs|map|woff2?|ttf|otf|eot|wasm)$ header @assets Cache-Control \u0026#34;public, max-age=2592000, immutable\u0026#34; } (common_log) { log { level INFO output file /var/log/caddy/caddy-web.log { roll_size 10MB roll_keep 10 } } } # 站点配置 g.11111.cc { encode zstd gzip reverse_proxy https://www.22222.com { transport http { dial_timeout 2s keepalive 30s keepalive_idle_conns 100 } header_up Host {upstream_hostport} header_up X-Real-IP {remote} } import common_security import common_log } 重启生效\nsystemctl restart caddy 将 Caddy 添加到开机自启\nsystemctl enable caddy 查看 Caddy2 运行状态\nsystemctl status caddy 格式规范的警告，使用以下命令修复\ncaddy fmt --overwrite /etc/caddy/Caddyfile 卸载caddy systemctl stop caddy apt purge caddy rm -rf /etc/caddy /var/lib/caddy /var/log/caddy ","date":"2025-08-24T12:11:12+08:00","permalink":"https://blog.lufei.de/p/469/","title":"caddy 反代cloudflare方法"},{"content":"脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh 问题 多个场景（多项目）配置重复冗余，维护困难。\n结尾贴出配置\n解决方案 三种配置模块，按需组合：\n(main_backend) # 双后端负载均衡 (common_config) # 通用安全配置 (standard_site) # 组合上述两者 应用场景 场景一：标准站点（需要负载均衡）\nwww.2345.com { import standard_site # 双后端 + 安全配置 } 场景二：单独服务器，不需要负载均衡\nwww.456.cc { reverse_proxy 192.168.100.3:80 # 专用后端 import common_config # 复用安全配置 } 场景三：简单重定向\n2345.com { redir https://www.2345.com{uri} permanent # 无需额外配置 } 场景四：HTTP批量重定向\nhttp://456g.cc, http://www.456g.cc { redir https://www.456.cc{uri} permanent # 多域名一次性配置 } 查看日志 （前 20 的访问统计）：\ncat /var/log/caddy/global.log | jq -r \u0026#39;.request.remote_ip\u0026#39; | sort | uniq -c | sort -nr | head -20 配置分享 https://github.com/woniu336/open_shell/blob/main/Caddyfile\n# 后端负载均衡配置 (main_backend) { reverse_proxy { to 192.168.100.1:80 192.168.100.2:80 lb_policy round_robin lb_try_duration 30s lb_try_interval 250ms fail_duration 30s max_fails 3 unhealthy_status 5xx } } # 通用配置 (common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } log { output file /var/log/caddy/global.log { roll_size 50mb roll_keep 5 } } } # 标准站点配置 (standard_site) { import main_backend import common_config } # =========================================== # 站点配置 # =========================================== 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import standard_site } 789.cc { redir https://www.789.cc{uri} permanent } www.789.cc { import standard_site } 456.cc { redir https://www.456.cc{uri} permanent } www.456.cc { import common_config reverse_proxy 192.168.100.3:80 } http://456g.cc, http://www.456g.cc { redir https://www.456.cc{uri} permanent } xxx.123456.com { import common_config reverse_proxy https://xxxx.eu.org { header_up Host {upstream_hostport} header_up X-Real-IP {remote} } } 加权轮询配置（推荐）\n# 全局配置 { admin off log { output file /var/log/caddy/global.log { roll_size 50mb roll_keep 5 roll_keep_for 72h } level WARN } } # 主要后端配置 - 快速故障转移 (main_backend) { reverse_proxy { to 3.3.3.3:80 3.3.3.3:80 3.3.3.3:80 6.6.6.6:80 lb_policy round_robin # 快速被动检测 lb_try_duration 5s lb_try_interval 500ms fail_duration 10s max_fails 1 unhealthy_status 5xx # 主动健康检查（推荐） health_interval 10s health_timeout 2s health_status 2xx # 连接优化 transport http { dial_timeout 2s response_header_timeout 3s keepalive 30s keepalive_idle_conns 10 } } } # 通用配置 (common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } } # 标准站点配置 (standard_site) { import main_backend import common_config } # 站点配置 xxxxx.cc { redir https://www.xxxxx.cc{uri} permanent } www.xxxxx.cc { import standard_site } blog.xxx.com { import common_config reverse_proxy 3.3.3.3:8000 { transport http { dial_timeout 2s response_header_timeout 3s } } } 验证配置：\ncaddy validate --config /etc/caddy/Caddyfile 验证加权轮询是否生效, 方法一：快速测试（发送 20 个请求）\n# 测试流量分配 for i in {1..20}; do echo \u0026#34;请求 $i: $(curl -s -o /dev/null -w \u0026#39;%{time_total}s\u0026#39; https://www.xxx.cc)\u0026#34; done 方法二：查看实时日志\n# 查看 Caddy 日志（如果有访问日志） tail -f /var/log/caddy/global.log # 或者查看 systemd 日志 journalctl -u caddy -f --since \u0026#34;1 minute ago\u0026#34; 保守派配置 # 全局配置 { admin off log { output file /var/log/caddy/global.log { roll_size 50mb roll_keep 5 roll_keep_for 72h } level WARN } } # 主要后端配置 - 优化故障转移 (main_backend) { reverse_proxy { to 3.3.3.3:80 6.6.6.6:80 6.6.6.6:80 lb_policy round_robin # 优化被动检测 - 降低误判率 lb_try_duration 5s lb_try_interval 500ms fail_duration 15s max_fails 2 unhealthy_status 5xx # 主动健康检查 health_interval 10s health_timeout 2s health_status 2xx # 连接优化 transport http { dial_timeout 2s response_header_timeout 3s keepalive 30s keepalive_idle_conns 10 } } } # 通用配置 (common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } } # 标准站点配置 (standard_site) { import main_backend import common_config } # 站点配置 xxxxx.cc { redir https://www.xxxxx.cc{uri} permanent } www.xxxxx.cc { import standard_site } blog.xxx.com { import common_config reverse_proxy 3.3.3.3:8000 { transport http { dial_timeout 2s response_header_timeout 3s } } } ","date":"2025-08-22T12:44:48+08:00","permalink":"https://blog.lufei.de/p/468/","title":"Caddy 模块化配置：按需引入，各取所需"},{"content":"设置权限 # 删除并重新创建目录，确保权限正确 sudo rm -rf /var/log/caddy sudo mkdir -p /var/log/caddy sudo chown -R caddy:caddy /var/log/caddy sudo chmod -R 755 /var/log/caddy # 测试 caddy 用户能否写入 sudo -u caddy touch /var/log/caddy/test.log \u0026amp;\u0026amp; echo \u0026#34;权限OK\u0026#34; || echo \u0026#34;权限失败\u0026#34; 错误信息解决方案 open /var/log/caddy/global.log: permission denied 步骤1：\n# 创建日志目录 sudo mkdir -p /var/log/caddy # 设置正确的所有者和权限 sudo chown caddy:caddy /var/log/caddy sudo chmod 755 /var/log/caddy 步骤2：\n重载\n# 重新加载systemd配置 sudo systemctl daemon-reload # 启动Caddy服务 sudo systemctl start caddy # 检查服务状态 sudo systemctl status caddy 配置 (common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } log { output file /var/log/caddy/global.log { roll_size 50mb roll_keep 5 } } } 2345.cc { redir https://www.2345.cc{uri} permanent } www.2345.cc { import common_config reverse_proxy 3.3.3.3:80 } 查看日志 cat /var/log/caddy/global.log | jq -r \u0026#39;.request.remote_ip\u0026#39; | sort | uniq -c | sort -nr 前20的访问统计\ncat /var/log/caddy/global.log | jq -r \u0026#39;.request.remote_ip\u0026#39; | sort | uniq -c | sort -nr | head -20 ","date":"2025-08-12T11:50:16+08:00","permalink":"https://blog.lufei.de/p/467/","title":"caddy设置日志并查询日志的方法"},{"content":"ncdu 是一个交互式的磁盘使用分析工具，非常直观：\n安装：\nsudo apt update sudo apt install ncdu 使用：\n# 分析根目录 sudo ncdu / # 分析当前目录 ncdu # 分析指定目录 ncdu /home ","date":"2025-08-05T13:10:58+08:00","permalink":"https://blog.lufei.de/p/466/","title":"ncdu-磁盘使用分析工具查看空间大小"},{"content":"搭建代码 Github\nbash \u0026lt;(wget -qO- https://raw.githubusercontent.com/fscarmen/sing-box/main/sing-box.sh) 软件下载 工具\n开启BBR echo \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p lsmod | grep bbr 检查\nsysctl net.ipv4.tcp_congestion_control net.core.default_qdisc ","date":"2025-08-04T12:27:41+08:00","permalink":"https://blog.lufei.de/p/465/","title":"节点搭建"},{"content":"安装工具 apt update \u0026amp;\u0026amp; apt install net-tools 分析脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/monitor_without_logs.sh \u0026amp;\u0026amp; chmod +x monitor_without_logs.sh \u0026amp;\u0026amp; ./monitor_without_logs.sh 连接数超过100的IP\nnetstat -tn | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | sort -nr | awk \u0026#39;$1 \u0026gt; 100 {print $1 \u0026#34; connections from \u0026#34; $2}\u0026#39; 前10个连接数最多的IP\nnetstat -tn | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 防火墙 限制该IP最多200个连接\niptables -A INPUT -s 3.3.3.3 -m connlimit --connlimit-above 200 -j DROP 验证规则是否生效\niptables -L INPUT -n --line-numbers | grep 3.3.3.3 实时监控效果\nwatch \u0026#34;netstat -an | grep 3.3.3.3 | wc -l\u0026#34; 效果验证\nss -tuln | grep 3.3.3.3 | wc -l 查看iptables丢弃统计\niptables -L INPUT -v -n | grep 3.3.3.3 如果确认问题解决，可以移除规则\niptables -D INPUT -s 3.3.3.3 -m connlimit --connlimit-above 200 -j DROP 或者调整为更宽松的限制\niptables -R INPUT 1 -s 3.3.3.3 -m connlimit --connlimit-above 100 -j DROP 设置定期监控 crontab -e 添加以下行，每10分钟检查一次\n*/10 * * * * /root/monitor_without_logs.sh \u0026gt;\u0026gt; /var/log/haproxy_monitor.log 2\u0026gt;\u0026amp;1 查看日志\ncat /var/log/haproxy_monitor.log 高峰期需求估算 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/peak_estimation.sh \u0026amp;\u0026amp; chmod +x peak_estimation.sh \u0026amp;\u0026amp; ./peak_estimation.sh 查看当前连接的唯一IP数量 netstat -tn | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | wc -l 查看连接分布情况 netstat -tn | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | sort -nr | head -20 查看443端口的具体连接数 netstat -tn | grep :443 | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | wc -l 看所有443端口连接的状态分布\nnetstat -tn | grep :443 | awk \u0026#39;{print $6}\u0026#39; | sort | uniq -c 看平均每个IP的连接数\necho \u0026#34;scale=2; 3454/3598\u0026#34; | bc 查看总连接数 netstat -tn | grep ESTABLISHED | wc -l ","date":"2025-08-02T14:39:54+08:00","permalink":"https://blog.lufei.de/p/463/","title":"haproxy分析脚本"},{"content":"caddy安装脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh haproxy转发脚本 (基于caddy后端)\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy-ca.sh \u0026amp;\u0026amp; chmod +x haproxy-ca.sh \u0026amp;\u0026amp; ./haproxy-ca.sh caddy备份恢复脚本 先安装rsync\nsudo apt update sudo apt install -y rsync 脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_backup.sh \u0026amp;\u0026amp; chmod +x caddy_backup.sh \u0026amp;\u0026amp; ./caddy_backup.sh 备份\n./caddy_backup.sh backup 恢复\nmkdir -p /opt/caddy-backups ./caddy_backup.sh restore /opt/caddy-backups/caddy-backup-20231201-120000.tar.gz 用法\n# 赋予执行权限 chmod +x caddy_backup.sh # 创建备份（自动命名） sudo ./caddy_backup.sh backup # 创建指定名称的备份 sudo ./caddy_backup.sh backup my-migration-backup # 列出所有备份 ./caddy_backup.sh list # 恢复备份（会提示确认） sudo ./caddy_backup.sh restore /opt/caddy-backups/caddy-backup-20231201-120000.tar.gz # 强制恢复（不提示确认） sudo ./caddy_backup.sh restore backup.tar.gz --force # 查看帮助 ./caddy_backup.sh help 证书目录\ncd /var/lib/caddy/.local/share/caddy/certificates/ 查看现有证书\nsudo find /var/lib/caddy -name \u0026#34;*.crt\u0026#34; | grep -E \u0026#34;(1234|5678)\u0026#34; 重启\nsystemctl restart caddy 修正格式\ncaddy fmt --overwrite /etc/caddy/Caddyfile haproxy脚本 安装脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy-d.sh \u0026amp;\u0026amp; chmod +x haproxy-d.sh \u0026amp;\u0026amp; ./haproxy-d.sh 恢复脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/restore_haproxy.sh \u0026amp;\u0026amp; chmod +x restore_haproxy.sh \u0026amp;\u0026amp; ./restore_haproxy.sh 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 重启\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy haproxy站点配置 示例\nglobal log /dev/log local0 warning log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon maxconn 20000 stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s defaults log global mode http # 改为 http 模式 option dontlognull option httplog # 启用 HTTP 日志 option http-keep-alive option forwardfor # 传递客户端真实IP timeout connect 5s # 连接超时增加 timeout client 30s # 客户端超时增加 timeout server 30s # 服务器超时增加 timeout http-keep-alive 15s errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend http-in bind *:80 redirect scheme https code 301 # 所有HTTP流量强制跳转HTTPS frontend https-in bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 # 安全头 http-response set-header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; #http-response set-header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; #http-response set-header Content-Security-Policy \u0026#34;frame-ancestors \u0026#39;self\u0026#39;\u0026#34; http-response set-header X-Content-Type-Options \u0026#34;nosniff\u0026#34; http-response set-header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; http-response set-header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; # 路由逻辑,如果要添加更多域名到 backend1，继续在同一行添加 acl domain1_https hdr(host) -i 123.cc www.123.cc 456.cc www.456.cc acl domain2_https hdr(host) -i 789.com www.789.com 158.org www.158.org acl domain3_https hdr(host) -i 236.com www.236.com 189.com www.189.com use_backend backend1 if domain1_https use_backend backend2 if domain2_https use_backend backend3 if domain3_https # 默认后端 #default_backend backend1 backend backend1 server server1 8.8.8.8:80 check inter 10s rise 2 fall 3 backend backend2 server server2 9.9.9.9:80 check inter 10s rise 2 fall 3 backend backend3 server server3 3.3.3.3:80 check inter 10s rise 2 fall 3 haproxy转发配置 示例\n示例2推荐\nglobal log /dev/log local0 warning log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon maxconn 20000 stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s defaults log global option dontlognull option clitcpka option srvtcpka timeout connect 5s timeout client 30s timeout server 30s errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http # ============================================================================= # 前端配置 - HTTP (80端口) - 简化为强制重定向HTTPS # ============================================================================= frontend http-in bind *:80 mode http option httplog option http-keep-alive timeout http-keep-alive 15s # 所有HTTP流量强制跳转HTTPS redirect scheme https code 301 # ============================================================================= # 前端配置 - HTTPS (443端口) - 保留原有功能 # ============================================================================= frontend tcp_front_443 bind *:443 mode tcp option tcplog rate-limit sessions 2500 # SSL SNI 检查配置 tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } # Nginx 后端域名配置 use_backend nginx_servers_443 if { req_ssl_sni -i www.1234.com } use_backend nginx_servers_443 if { req_ssl_sni -i 1234.com } #use_backend nginx_servers_443 if { req_ssl_sni -i www.example2.com } #use_backend nginx_servers_443 if { req_ssl_sni -i www.example3.com } # Caddy 后端域名配置 use_backend caddy_servers_443 if { req_ssl_sni -i www.2345.com } use_backend caddy_servers_443 if { req_ssl_sni -i 2345.com } #use_backend caddy_servers_443 if { req_ssl_sni -i www.example5.com } #use_backend caddy_servers_443 if { req_ssl_sni -i www.example6.com } # 默认后端（处理无法匹配的域名，如直接IP访问等） default_backend nginx_servers_443 # ============================================================================= # 后端配置 - Nginx 服务器 (仅443端口) # ============================================================================= backend nginx_servers_443 mode tcp # 主 Nginx 服务器 server nginx1_443 6.6.6.6:443 check inter 10s rise 2 fall 3 send-proxy # 备用 Nginx 服务器（可选） # server nginx2_443 8.8.8.8:443 check inter 10s rise 2 fall 3 send-proxy backup # 如果后端不支持 send-proxy，请移除该参数 # ============================================================================= # 后端配置 - Caddy 服务器 (仅443端口) # ============================================================================= backend caddy_servers_443 mode tcp # 主 Caddy 服务器 server caddy1_443 9.9.9.9:443 check inter 10s rise 2 fall 3 # 备用 Caddy 服务器（可选） # server caddy2_443 9.9.9.9:443 check inter 10s rise 2 fall 3 backup # ============================================================================= # 统计页面（可选） # ============================================================================= listen stats bind *:8404 mode http stats enable stats uri /stats stats refresh 30s stats admin if TRUE # 建议设置认证 #stats auth admin:your_password_here # ============================================================================= # 使用说明： # 1. 将域名替换为你的实际域名 # 2. 将IP地址替换为实际的后端服务器IP # 3. 后端服务器需要配置SSL证书 # 4. 访问 http://服务器IP:8404/stats 查看状态 # ========================================================================== 防攻击（可选） 添加以下代码\n... frontend tcp_front_443 bind *:443 mode tcp option tcplog rate-limit sessions 15000 # 限流配置 - 针对你的规模优化 stick-table type ip size 100k expire 30m store conn_cur,conn_rate(10s) tcp-request connection track-sc1 src # 白名单配置 - 转发IP豁免 acl forwarding_ips src 3.3.3.3 6.6.6.6 acl internal_ips src 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12 # 白名单IP直接放行 tcp-request connection accept if forwarding_ips tcp-request connection accept if internal_ips # 单IP限制 - 根据实际情况调整 tcp-request connection reject if { src_conn_cur ge 200 } # 单IP最多200个并发 tcp-request connection reject if { src_conn_rate gt 100 } # 10秒内最多100个新连接 # SSL SNI 检查配置 tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } ... caddy配置 格式规范的警告，使用以下命令修复\ncaddy fmt --overwrite /etc/caddy/Caddyfile 示例\n(common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } } 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import common_config reverse_proxy 6.6.6.6:80 } 123.com { redir https://www.123.com{uri} permanent } www.123.com { import common_config reverse_proxy 6.6.6.6:80 } caddy-反代CF 准备工作，以1234.kkk.eu.org作为回源域名为例子\n1234.kkk.eu.org 绑定到后端站点。\n1234.kkk.eu.org解析到后端服务器 IP 地址。\n开启 CDN（小云朵）\n设置为灵活模式\n示例\n# Caddy 多域名配置 (common) { tls { protocols tls1.2 tls1.3 } header { -Via -Alt-Svc -Server } } (proxy) { header_up Host {upstream_hostport} header_up X-Real-IP {remote} } 1234.com { redir https://www.1234.com{uri} permanent } www.1234.com { import common reverse_proxy https://1234.kkk.eu.org { import proxy } } 4567.com { redir https://www.4567.com{uri} permanent } www.4567.com { import common reverse_proxy https://4567.kkk.eu.org { import proxy } } http://789.cc { redir http://www.789.cc{uri} permanent } http://www.789.cc { header { -Via -Alt-Svc -Server } reverse_proxy https://789.kkk.eu.org { import proxy } } ","date":"2025-08-01T01:09:34+08:00","permalink":"https://blog.lufei.de/p/462/","title":"caddy和haproxy配置分享"},{"content":"查找 redis-cli 的位置\nfind / -name redis-cli 建议创建软链接：\nln -s /usr/local/redis-8.0/bin/redis-cli /usr/bin/redis-cli 连接到 Redis CLI\nredis-cli 允许 Redis 在保存快照失败时继续写入数据。\nconfig set stop-writes-on-bgsave-error no 验证\nconfig get stop-writes-on-bgsave-error 按 CTRL+D 退出\n永久生效\nsed -i \u0026#39;s/^stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/\u0026#39; /usr/local/redis-8.0/redis.conf 优化设置 假设服务器内存为8G\n# 设置内存上限 redis-cli config set maxmemory 3gb # 设置内存淘汰策略 redis-cli config set maxmemory-policy allkeys-lru # 适度提高采样精度 redis-cli config set maxmemory-samples 10 # 永久保存配置 redis-cli config rewrite 启用主动碎片整理 # 更保守的生产环境配置 redis-cli config set activedefrag yes redis-cli config set active-defrag-threshold-lower 10 # 10%碎片率才开始 redis-cli config set active-defrag-threshold-upper 100 redis-cli config set active-defrag-ignore-bytes 100mb # 100MB以上才处理 redis-cli config set active-defrag-cycle-min 1 # 最小1% CPU redis-cli config set active-defrag-cycle-max 25 # 最大25% CPU # 保存当前配置到配置文件 redis-cli config rewrite 查看碎片\nredis-cli info memory | grep -E \u0026#34;(used_memory_human|used_memory_rss_human|mem_fragmentation_ratio)\u0026#34; 如果碎片整理不生效，直接清理\n# 直接清空是最快的解决方案 redis-cli flushall # 立即检查效果 redis-cli info memory | grep -E \u0026#34;(used_memory_human|used_memory_rss_human|mem_fragmentation_ratio)\u0026#34; ","date":"2025-07-31T20:06:10+08:00","permalink":"https://blog.lufei.de/p/461/","title":"amh之redis优化"},{"content":" 记住：Caddy 会自动为这个域名申请和续期 SSL 证书。\n安装的部分请看我上一篇帖子，或者使用我的caddy管理脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh 格式规范的警告，使用以下命令修复\ncaddy fmt --overwrite /etc/caddy/Caddyfile 场景一：Docker 环境下的简单反向代理 以下配置适用于 Docker 环境，如果你有多个项目，只需要复制配置块并修改域名和端口即可：\n(common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } } www.2345.com { import common_config reverse_proxy 127.0.0.1:80 } portainer.2345.com { import common_config reverse_proxy 127.0.0.1:8000 } new.example.com { import common_config reverse_proxy 127.0.0.1:8888 } 场景二：多站点管理与配置复用 当你管理多个网站时，重复写相同的配置会很繁琐。Caddy 的 import 功能可以让你定义可复用的配置片段，大大简化配置管理。\n这个配置展示了如何使用配置片段来管理多个站点，同时处理域名重定向：\n(common_config) { tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } } 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import common_config reverse_proxy 后端服务器ip:80 } new.example.com { import common_config reverse_proxy 后端服务器ip:8888 } 配置详解\n配置片段定义：(common_config) 定义了一个名为 common_config 的配置片段，包含了所有站点通用的配置。括号语法是 Caddy 定义片段的方式。\n域名重定向：2345.com 块配置了从裸域名到 www 域名的永久重定向。{uri} 是 Caddy 的变量，表示原始请求的 URI 路径。\n配置导入：import common_config 将之前定义的配置片段导入到当前站点块中，避免重复配置。\n后端服务器配置：reverse_proxy 后端服务器ip:80 中的\u0026quot;后端服务器ip\u0026quot;需要替换为你实际的服务器 IP 地址，比如 192.168.1.100:80。\n场景三：负载均衡与高可用配置 对于生产环境，你可能需要配置负载均衡来提高服务的可用性和性能。这个配置展示了 Caddy 的高级负载均衡功能。\n这是一个完整的负载均衡配置，包含了健康检查、故障转移和错误处理：\n# 定义可复用的配置片段 (common_config) { reverse_proxy { to 后端服务器1:80 后端服务器2:80 # 负载均衡策略（可选：round_robin, least_conn, ip_hash） lb_policy round_robin # 故障转移配置 lb_try_duration 30s lb_try_interval 250ms # 被动健康检查 fail_duration 30s max_fails 3 unhealthy_status 5xx } tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } # 错误处理 handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } } 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import common_config } 后端服务器列表：to 后端服务器1:80 后端服务器2:80 定义了两个后端服务器。实际使用时，请替换为真实的服务器地址，例如：\nto 192.168.1.10:80 192.168.1.11:80 负载均衡策略：\nround_robin：轮询（默认），按顺序分配请求 least_conn：最少连接，将请求分配给连接数最少的服务器 ip_hash：IP 哈希，根据客户端 IP 分配，确保同一客户端总是访问同一服务器 故障转移配置 重试机制：\nlb_try_duration 30s：在 30 秒内尝试故障转移 lb_try_interval 250ms：每次重试间隔 250 毫秒 健康检查配置 被动健康检查（基于实际请求）：\nfail_duration 30s：服务器被标记为不健康后，30 秒内不会接收新请求 max_fails 3：连续失败 3 次后标记为不健康 unhealthy_status 5xx：5xx 状态码被视为失败 主动健康检查（定期探测）：\nhealth_uri /：使用根路径进行健康检查 health_interval 15s：每 15 秒检查一次 health_timeout 3s：健康检查超时时间为 3 秒 错误处理配置 错误分类处理：\n@5xx 匹配器：捕获 500-599 状态码的服务器错误 @4xx 匹配器：捕获 400-499 状态码的客户端错误 respond 指令：返回自定义错误页面 总结 通过这三个配置示例，你已经掌握了 Caddy 的主要使用场景：\nDocker 环境：适合简单的单应用部署 多站点管理：使用配置片段提高配置复用性 负载均衡：提供高可用性和容错能力 记住，Caddy 会自动处理 SSL 证书的申请和续期，你只需要确保域名正确解析到你的服务器即可。\n","date":"2025-07-29T21:03:22+08:00","permalink":"https://blog.lufei.de/p/460/","title":"Caddy 实战：一个配置文件搞定 Docker + 多站点 + 负载均衡"},{"content":"使用场景 源站和反代分开，即源站和反代各一台服务器\n系统：Debian12\ncaddy一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh \u0026amp;\u0026amp; chmod +x caddy_manager.sh \u0026amp;\u0026amp; ./caddy_manager.sh 安装caddy sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf \u0026#39;https://dl.cloudsmith.io/public/caddy/stable/gpg.key\u0026#39; | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf \u0026#39;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt\u0026#39; | sudo tee /etc/apt/sources.list.d/caddy-stable.list chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg chmod o+r /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy 检测是否安装成功\ncaddy -v 配置修改 nano /etc/caddy/Caddyfile 我的配置如下\n2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { reverse_proxy 源站服务器ip:80 tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade -Via -Alt-Svc } log { output file /var/log/caddy/2345.com.log { roll_size 10mb roll_keep 5 } } } 如果你的站点允许其他站点嵌入，例如播放器啥的，记得把以下配置注释掉\nX-Frame-Options DENY 最后重启生效\nsystemctl restart caddy 将 Caddy 添加到开机自启\nsystemctl enable caddy 查看Caddy2运行状态\nsystemctl status caddy 多站点配置 修改配置\n# 定义可复用的配置片段 (common_config) { reverse_proxy 源站服务器ip:80 tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade -Via -Alt-Svc } } 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import common_config log { output file /var/log/caddy/2345.com.log { roll_size 10mb roll_keep 5 } } } new.example.com { import common_config log { output file /var/log/caddy/new-example.log { roll_size 10mb roll_keep 5 } } } 然后重启生效\nsystemctl restart caddy 负载均衡 文档\n例子\n配置如下, 移除了日志的部分\n# 定义可复用的配置片段 (common_config) { reverse_proxy { to 后端服务器1:80 后端服务器2:80 # 负载均衡策略（可选：round_robin, least_conn, ip_hash） lb_policy round_robin # 故障转移配置 lb_try_duration 30s lb_try_interval 250ms # 被动健康检查 fail_duration 30s max_fails 3 unhealthy_status 5xx # 主动健康检查 health_uri / health_interval 15s health_timeout 3s } tls { protocols tls1.2 tls1.3 } header { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } # 错误处理 handle_errors { @5xx expression {http.error.status_code} \u0026gt;= 500 respond @5xx \u0026#34;服务暂时不可用，请稍后重试\u0026#34; 503 @4xx expression {http.error.status_code} \u0026gt;= 400 respond @4xx \u0026#34;请求错误\u0026#34; {http.error.status_code} } } 2345.com { redir https://www.2345.com{uri} permanent } www.2345.com { import common_config } header的部分也可以改成如下配置\nheader { Permissions-Policy interest-cohort=() Strict-Transport-Security max-age=31536000; X-Content-Type-Options nosniff Referrer-Policy strict-origin-when-cross-origin X-XSS-Protection \u0026#34;1; mode=block\u0026#34; -Via -Alt-Svc -Server } 问题排查 配置出现错误，有可能是日志权限问题\n# 创建日志目录 sudo mkdir -p /var/log/caddy # 设置正确的所有者和权限 sudo chown -R caddy:caddy /var/log/caddy sudo chmod 755 /var/log/caddy 卸载caddy systemctl stop caddy apt purge caddy rm -rf /etc/caddy /var/lib/caddy /var/log/caddy ","date":"2025-07-26T13:25:48+08:00","permalink":"https://blog.lufei.de/p/459/","title":"Debian12安装caddy与反向代理配置分享"},{"content":"安装Fail2Ban sudo apt update sudo apt install fail2ban rsyslog -y 安装 rsyslog，以确保日志文件能够正常生成并供 Fail2Ban 使用\n启动服务\nsudo systemctl enable --now fail2ban sudo systemctl enable --now rsyslog 检查服务状态\nsudo systemctl status fail2ban sudo systemctl status rsyslog 配置 Fail2Ban\nsudo nano /etc/fail2ban/jail.local 粘贴以下内容，记得把 5522 改成你的SSH端口\n[sshd] ignoreip = 127.0.0.1/8 enabled = true filter = sshd port = 5522 maxretry = 3 findtime = 300 bantime = -1 banaction = ufw logpath = /var/log/auth.log 配置说明：\nenabled = true 启用 SSH 防护 port = 5522 指定 SSH 端口 maxretry = 3 3次失败后封禁 findtime = 300 在 300 秒（5 分钟）内统计失败尝试次数 bantime = -1 封禁时间设为 -1，表示永久封禁 重启服务使配置生效\nsudo systemctl restart fail2ban 管理和监控 查看运行状态\nsudo systemctl status fail2ban 查看日志\nsudo tail -f /var/log/fail2ban.log 管理封禁IP 查询封禁情况\nsudo fail2ban-client status sshd 手动解封IP：\nsudo fail2ban-client unban IP地址 常见问题处理 如果服务启动失败，检查配置文件语法：\nsudo fail2ban-client -t 如果日志不更新，重启 rsyslog 服务：\nsudo systemctl restart rsyslog 卸载 sudo systemctl stop fail2ban sudo systemctl disable fail2ban sudo apt-get remove --purge fail2ban sudo apt-get autoremove sudo apt-get clean sudo rm -rf /var/log/fail2ban.log sudo rm -rf /var/lib/fail2ban ","date":"2025-07-07T13:32:16+08:00","permalink":"https://blog.lufei.de/p/458/","title":"Debian12安装fail2ban封禁恶意ip"},{"content":"一键脚本 bash \u0026lt;(curl -sL kejilion.sh) fd 批量反代 bash \u0026lt;(curl -sL kejilion.sh) fd [你的域名] [目标IP] [目标端口] bash \u0026lt;(curl -sL kejilion.sh) fd web1.example.com 123.123.123.123 8080 bash \u0026lt;(curl -sL kejilion.sh) fd web2.example.com 123.123.123.123 8060 如果需要根域重定向到www,先执行上面的批量反代命令，然后再执行重定向菜单\n负载均衡 轮询方式\nserver 3.3.3.3:80 max_fails=3 fail_timeout=30s; server 6.6.6.6:80 max_fails=3 fail_timeout=30s; 加权轮询\nserver 192.168.1.10 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.11 weight=1 max_fails=3 fail_timeout=30s; 原版方式\nhash $remote_addr consistent; server 3.3.3.3:80; server 6.6.6.6:80; 查看占用\nnetstat -an | grep ESTABLISHED | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | sort | uniq -c | sort -rn | head -20 测试权重分配（3:1）\nfor i in {1..20}; do curl -w \u0026#34;Time: %{time_total}s\\n\u0026#34; -so /dev/null \u0026#34;https://www.xxxx.cc/?t=$RANDOM\u0026#34;; done 服务器测试，决定怎么分配权重\nfor i in {1..10}; do curl -w \u0026#34;Server1: %{time_total}s\\n\u0026#34; -so /dev/null http://3.3.3.3 curl -w \u0026#34;Server2: %{time_total}s\\n\u0026#34; -so /dev/null http://6.6.6.6 done 日志分析\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/n-log.sh \u0026amp;\u0026amp; chmod +x n-log.sh \u0026amp;\u0026amp; ./n-log.sh 清理日志\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_nginx_logs.sh \u0026amp;\u0026amp; chmod +x clean_nginx_logs.sh \u0026amp;\u0026amp; ./clean_nginx_logs.sh 定时任务：\n(crontab -l 2\u0026gt;/dev/null; echo \u0026#34;0 3 * * * /root/clean_nginx_logs.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 续签 原脚本存在防火墙不太安全的原因，所以改动了一下\n备份旧脚本（推荐）\ncp /root/auto_cert_renewal.sh /root/auto_cert_renewal.sh.backup 下载新脚本覆盖\nwget -O /root/auto_cert_renewal.sh https://raw.githubusercontent.com/woniu336/open_shell/main/bt/auto_cert_renewal.sh 设置执行权限\nchmod +x /root/auto_cert_renewal.sh 查看文件确认\ncat /root/auto_cert_renewal.sh 测试运行（可选，先不实际续签，只检查）\nbash /root/auto_cert_renewal.sh 注意事项：\n如果要开放80端口,查看iptables规则\nsudo iptables -L INPUT -n --line-numbers | grep 80 然后删除规则,假设前面的序号是3和2\nsudo iptables -D INPUT 3 sudo iptables -D INPUT 2 注意：\n要 先删除行号大的（3），再删小的（2），否则删除后行号会变动。 删除顺序错误会导致 No such rule 错误。 管理已有配置\nk web 重启生效\ndocker exec nginx nginx -s reload 查看容器运行状态\ndocker ps -a | grep nginx 测试配置\ndocker exec nginx nginx -t 查询Nginx缓存大小\ndocker exec nginx du -sh /var/cache/nginx/ 查询缓存文件数量\ndocker exec nginx find /var/cache/nginx -type f | wc -l 2\u0026gt;/dev/null rsync的定时任务需要改成\n(crontab -l ; echo \u0026#34;30 0 * * * /bin/bash -l -c \u0026#39;k rsync_run 1\u0026#39; \u0026gt;\u0026gt; /var/log/rsync_daily.log 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 远程服务器需要安装rsync\nsudo apt-get update sudo apt-get install rsync 转换成nginx（非docker） # 为 proxy 缓存创建目录并设置权限 sudo mkdir -p /var/cache/nginx/proxy sudo chown -R nginx:nginx /var/cache/nginx 清理系统缓存\n# 清理页面缓存 echo 1 \u0026gt; /proc/sys/vm/drop_caches 微调整缓存策略\n# 增加缓存压力，让系统更积极地回收缓存 echo \u0026#39;vm.vfs_cache_pressure = 150\u0026#39; \u0026gt;\u0026gt; /etc/sysctl.conf # 保持当前的swappiness设置（已经很好了） echo \u0026#39;vm.swappiness = 10\u0026#39; \u0026gt;\u0026gt; /etc/sysctl.conf # 使设置生效 sysctl -p 监控脚本\n# 创建监控脚本 cat \u0026gt; /usr/local/bin/memory_monitor.sh \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash MEMORY_USAGE=$(free | grep Mem | awk \u0026#39;{printf \u0026#34;%.0f\u0026#34;, $3/$2 * 100}\u0026#39;) if [ $MEMORY_USAGE -gt 80 ]; then echo \u0026#34;Memory usage is ${MEMORY_USAGE}%, clearing cache...\u0026#34; echo 1 \u0026gt; /proc/sys/vm/drop_caches logger \u0026#34;Memory cache cleared due to high usage: ${MEMORY_USAGE}%\u0026#34; fi EOF chmod +x /usr/local/bin/memory_monitor.sh # 设置每5分钟检查一次 echo \u0026#34;*/5 * * * * /usr/local/bin/memory_monitor.sh\u0026#34; | crontab - 一行命令快速查看内存占用最高的进程\nps aux | sort -k4 -nr | head -10 查看缓存大小\ndu -sh /var/cache/nginx/proxy/ 清空现有缓存\nsudo rm -rf /var/cache/nginx/proxy/* 重启nginx\nsudo nginx -t \u0026amp;\u0026amp; sudo systemctl restart nginx nginx配置 https://github.com/woniu336/cf-cdn-s/blob/main/oth/nginx.conf 站点配置\nhttps://github.com/woniu336/cf-cdn-s/blob/main/oth/conf.d/www.2345.cc.conf 备份\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/backup-nginx-ssl.sh \u0026amp;\u0026amp;chmod +x backup-nginx-ssl.sh \u0026amp;\u0026amp; ./backup-nginx-ssl.sh ","date":"2025-07-07T12:26:10+08:00","permalink":"https://blog.lufei.de/p/457/","title":"nginx一键反代"},{"content":" 插入新的允许规则 iptables -I INPUT 1 -p tcp -m multiport --dports 80,443 -j ACCEPT 删除原来的限制规则（现在变成了第2、3条） iptables -D INPUT 2 iptables -D INPUT 2 保存规则 iptables-save \u0026gt; /etc/iptables/rules.v4 ","date":"2025-06-20T21:45:55+08:00","permalink":"https://blog.lufei.de/p/456/","title":"iptables规则开放80/443"},{"content":"一键脚本 安装与配置 HAProxy：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy-d.sh \u0026amp;\u0026amp; chmod +x haproxy-d.sh \u0026amp;\u0026amp; ./haproxy-d.sh 迁移配置备份与恢复：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/restore_haproxy.sh \u0026amp;\u0026amp; chmod +x restore_haproxy.sh \u0026amp;\u0026amp; ./restore_haproxy.sh 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 显示Configuration file is valid 即正确\n重启服务\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy sni证书匹配检测\n提示：如果包含www，仅检测根域即可\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/sni_check.sh \u0026amp;\u0026amp; chmod +x sni_check.sh \u0026amp;\u0026amp; ./sni_check.sh 其他端口脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy-k.sh \u0026amp;\u0026amp; chmod +x haproxy-k.sh \u0026amp;\u0026amp; ./haproxy-k.sh 前言 网站托管在欧洲（如德国、荷兰）服务器上，不使用 Cloudflare CDN 域名托管在 Cloudflare，准备好具有 DNS 权限的 API 令牌 使用说明 系统推荐：Debian 12（测试通过） 节点推荐：线路好（如 CN2、CMIN2、9929） 脚本功能菜单 ================================ HAProxy 配置管理工具 ================================ 1. 申请SSL证书 2. 安装HAProxy 3. 配置站点 4. 测试SSL证书 5. 查看HAProxy状态 6. 重启HAProxy服务 0. 退出 简要流程 先申请 SSL 证书（源站只需开放 80 端口） 安装 HAProxy 配置站点 测试并完成部署 域名解析到节点服务器 IP 提示：测试证书时若提示找不到 www 证书，可忽略，这是已知 bug。\n完结撒花 🎉\n","date":"2025-06-03T12:27:32+08:00","permalink":"https://blog.lufei.de/p/455/","title":"小鸡变中转站！轻松部署 haproxy 实现稳定高速访问"},{"content":" 注意：后端服务器监听80端口（HTTP），但前端是HTTPS HAProxy将终止SSL，并以HTTP协议与后端通信 新建爬虫文件 nano /etc/haproxy/blacklist-agent.txt 内容\nYandexBot DotBot SemrushBot AhrefsBot BLEXBot YaK MJ12bot MauiBot MegaIndex.ru GPTBot meta-externalagent/1.1 Qwantbot ClaudeBot Amazonbot SearchBot DataForSeoBot Barkrowler GoogleOther Googlebot 更多爬虫\nhttps://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list\n配置文件 配置参考: https://github.com/woniu336/open_shell/blob/main/u-haproxy.cfg\nglobal log /dev/log local0 warning log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon maxconn 10000 stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s # SSL会话缓存优化 tune.ssl.cachesize 50000 tune.ssl.lifetime 300 tune.ssl.ssl-ctx-cache-size 1000 # TLS安全全局设置 ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 prefer-client-ciphers defaults log global mode http option dontlognull option httplog option http-keep-alive option forwardfor timeout connect 5s timeout client 30s timeout server 30s timeout http-keep-alive 15s errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http balance roundrobin frontend http-in bind *:80 # ============== 爬虫拦截系统 ============== acl empty_ua hdr_cnt(user-agent) eq 0 acl suspicious_ua hdr_sub(user-agent) -i \u0026#34;python\u0026#34; \u0026#34;curl\u0026#34; \u0026#34;wget\u0026#34; acl bad_bots hdr_sub(user-agent) -i -f /etc/haproxy/blacklist-agent.txt http-request deny if empty_ua http-request deny if suspicious_ua http-request deny if bad_bots # ============== 拦截系统结束 ============== redirect scheme https code 301 if !{ ssl_fc } frontend https-in bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 allow-0rtt # ============== HTTPS爬虫拦截系统 ============== acl empty_ua hdr_cnt(user-agent) eq 0 acl suspicious_ua hdr_sub(user-agent) -i \u0026#34;python\u0026#34; \u0026#34;curl\u0026#34; \u0026#34;wget\u0026#34; acl bad_bots hdr_sub(user-agent) -i -f /etc/haproxy/blacklist-agent.txt http-request deny if empty_ua http-request deny if suspicious_ua http-request deny if bad_bots # ============== 拦截系统结束 ============== # 安全头配置 http-response set-header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; # http-response set-header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; # http-response set-header Content-Security-Policy \u0026#34;frame-ancestors \u0026#39;self\u0026#39;\u0026#34; http-response set-header X-Content-Type-Options \u0026#34;nosniff\u0026#34; http-response set-header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; http-response set-header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; # 路由规则 acl domain1_https hdr(host) -i 123.com use_backend backend1 if domain1_https # acl domain2_https hdr(host) -i 789.com # use_backend backend2 if domain2_https # 默认后端 default_backend backend1 backend backend1 server server1 8.8.8.8:80 check inter 10s rise 3 fall 3 # backend backend2 # server server2 3.3.3.3:80 check inter 10s rise 3 fall 3 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 重载服务\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy 测试 应返回 403 Forbidden\ncurl -A \u0026#34;GPTBot\u0026#34; http://your-server/ 获取真实客户端 ip, 在源站点配置文件添加如下内容\nset_real_ip_from 你的反代ip; real_ip_header X-Forwarded-For; real_ip_recursive on; ","date":"2025-06-01T05:48:55+08:00","permalink":"https://blog.lufei.de/p/454/","title":"haproxy之爬虫拦截规则"},{"content":" 注意： 这里的dns是服务器端的，与用户访问你的网站完全无关\n用户的 DNS：用户浏览器使用他们本地配置的 DNS\n可能是 ISP 提供的、或者他们手动设置的（如 8.8.8.8）用于解析你的域名到你服务器的 IP 地址\n所以你的 DNS 优化主要是为了提升服务器自身的网络性能，而不是用户访问体验\n编辑 /etc/systemd/resolved.conf\nnano /etc/systemd/resolved.conf 内容\n[Resolve] DNS=9.9.9.9 149.112.112.112 FallbackDNS=1.1.1.1 8.8.8.8 查看当前生成的 resolv.conf\ncat /run/systemd/resolve/resolv.conf 查看完整的 DNS 配置状态\nresolvectl status 确认服务状态\nsystemctl status systemd-resolved 或者可以这样（临时的）\nresolvectl dns ens3 8.8.8.8 1.0.0.1 resolvectl flush-caches 测试\nresolvectl query openai.com 测试不同 DNS 的性能\n安装dig\napt update \u0026amp;\u0026amp; apt install dnsutils 测试主要 DNS 服务器\ndig @1.1.1.1 google.com | grep \u0026#34;Query time\u0026#34; dig @8.8.8.8 google.com | grep \u0026#34;Query time\u0026#34; dig @9.9.9.9 google.com | grep \u0026#34;Query time\u0026#34; 或者使用循环测试\nfor dns in 1.1.1.1 8.8.8.8 9.9.9.9; do echo \u0026#34;Testing $dns:\u0026#34; dig @$dns google.com | grep \u0026#34;Query time\u0026#34; done 基于测试结果，哪个DNS 在你的网络环境下表现更好，建议优先使用它。\n关于 Quad9 的优势\nQuad9 不仅速度快，还有额外的安全特性：\n恶意软件过滤 - 自动阻止已知的恶意域名 隐私保护 - 不记录用户查询的 IP 地址 无广告 - 不会重定向查询用于广告目的 应用新配置\nsystemctl restart systemd-resolved 验证配置\ndig google.com 验证当前使用的 DNS\ndig google.com | grep \u0026#34;SERVER:\u0026#34; 这应该会显示你配置的主 DNS (9.9.9.9) 正在被使用。\n性能测试显示 Quad9 在你的 OVH 服务器上有最佳的延迟表现，这可能是因为 Quad9 在你的地理位置有更好的网络路由或更近的服务器节点。\n","date":"2025-05-30T20:40:31+08:00","permalink":"https://blog.lufei.de/p/453/","title":"ovh杜甫修改dns"},{"content":"为什么是使用haproxy作为反代，而不是nginx，或者iptables，就不细说了，因为haproxy更高效简洁，性能更优秀！这是我几个月来的使用和验证。\n注意：下面的配置是针对80端口（源站，可以开启cf cdn），但是没有针对https（443），如果有需要可以问ai怎么修改配置文件。\n安装haproxy 一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy-k.sh \u0026amp;\u0026amp; chmod +x haproxy-k.sh \u0026amp;\u0026amp; ./haproxy-k.sh 安装\napt install haproxy -y systemctl start haproxy systemctl enable haproxy 编辑haproxy\nnano /etc/haproxy/haproxy.cfg 内容如下\n参考：https://github.com/woniu336/open_shell/blob/main/haproxy.cfg\nglobal log /dev/log local0 warning log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon maxconn 10000 stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s defaults log global mode http # 改为 http 模式 option dontlognull option httplog # 启用 HTTP 日志 option http-keep-alive option forwardfor # 传递客户端真实IP timeout connect 5s # 连接超时增加 timeout client 30s # 客户端超时增加 timeout server 30s # 服务器超时增加 timeout http-keep-alive 15s errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend http-in bind *:80 # 如果要添加更多域名到 backend1，继续在同一行添加 acl domain1 hdr(host) -i 123.com 789.com acl domain2 hdr(host) -i 456.com use_backend backend1 if domain1 use_backend backend2 if domain2 # 默认后端 default_backend backend1 backend backend1 server server1 8.8.8.8:80 check backend backend2 server server2 3.3.3.3:80 check 路由规则 如果要添加更多域名到 backend1，继续在同一行添加：\nacl domain1 hdr(host) -i 123.com 789.com example.com 把 example.com 替换成你实际要添加的域名即可。\n根据配置：\n123.com (domain1) → backend1 → 8.8.8.8:80\n456.com (domain2) → backend2 → 3.3.3.3:80\n配置中的对应关系：\nacl domain1 hdr(host) -i 123.com\nacl domain2 hdr(host) -i 456.com\nuse_backend backend1 if domain1\nuse_backend backend2 if domain2\n所以：\n访问 123.com 的请求会被路由到 backend1（服务器 8.8.8.8:80）\n访问 456.com 的请求会被路由到 backend2（服务器 3.3.3.3:80）\n其他未配置的域名或直接IP访问会走默认后端 backend1\n启动服务 修改完成后，为了避免格式报错，执行以下命令\necho \u0026#34;\u0026#34; \u0026gt;\u0026gt; /etc/haproxy/haproxy.cfg 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 显示Configuration file is valid 即正确\n如果没有错误，重启服务\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy 获取客户端ip 既然是路由源站的80端口，那么必然要开启cdn，当然是开启大善人的cdn，\n如果不做如下设置会获取不到客户端ip，没法看站点日志，\n如果是宝塔面板，建议放在以下位置\nmkdir -p /www/server/panel/vhost/nginx/cf_real_ip nano /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf 如果是 amh\nmkdir -p /home/wwwroot/lnmp01/vhost/cf_real_ip nano /home/wwwroot/lnmp01/vhost/cf_real_ip/cloudflare.conf 在 cloudflare.conf 中添加所有 Cloudflare IP\n注意：需要额外添加你的 HAProxy 服务器 IP\n# Cloudflare IP ranges # HAProxy IP set_real_ip_from 你的HAProxy服务器IP; # Cloudflare IPv4 set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # Cloudflare IPv6 set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; 然后在你的网站配置文件中引用,例如宝塔面板\nserver { listen 80; server_name 123.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/123.com; include /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf; real_ip_header X-Forwarded-For; real_ip_recursive on; ... 仅添加如下内容\ninclude /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf; real_ip_header X-Forwarded-For; real_ip_recursive on; 记得重载nginx\namh面板站点配置\ninclude /home/wwwroot/lnmp01/vhost/cf_real_ip/cloudflare.conf; real_ip_header X-Forwarded-For; real_ip_recursive on; 记得重载nginx\n到此就完工了，然后域名解析到反代服务器ip(haproxy)，开启cf cdn （灵活模式）\n还能正常查看网站日志（在源站查看）\nhttps配置 我建议既然是443端口，那么我们使用另外一台服务器，\n对国内用户友好的线路服务器，不和上面的80配置混合在一起，避免混乱。\n301可以在源站设置\n新建证书目录\nmkdir -p /etc/haproxy/certs 重点（源站不需要配置证书）\n把域名证书的fullchain.pem和privkey.pem(不一定是这两个名称的证书)，合并成一个以域名为名称的.pem文件，例如 123.com.pem\n申请证书的方式很多，就不一一细说了。\n意思就是把这两个文件里面的内容拷贝到一个文件中，以.pem结尾，把pem证书传到/etc/haproxy/certs目录，\n如果有多个域名依次类推，HAProxy会根据客户端的SNI（Server Name Indication）自动选择对应的证书：\n访问 123.com → 使用 123.com.pem 访问 456.com → 使用 456.com.pem 配置如下\n参考：https://github.com/woniu336/open_shell/blob/main/443_haproxy.cfg\n优化版参考(不推荐)：https://github.com/woniu336/open_shell/blob/main/443_haproxys.cfg\n推荐以下配置\nglobal log /dev/log local0 warning log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon maxconn 10000 stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s defaults log global mode http # 改为 http 模式 option dontlognull option httplog # 启用 HTTP 日志 option http-keep-alive option forwardfor # 传递客户端真实IP timeout connect 5s # 连接超时增加 timeout client 30s # 客户端超时增加 timeout server 30s # 服务器超时增加 timeout http-keep-alive 15s errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend http-in bind *:80 redirect scheme https code 301 # 所有HTTP流量强制跳转HTTPS frontend https-in bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 # 安全头 http-response set-header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; #http-response set-header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; #http-response set-header Content-Security-Policy \u0026#34;frame-ancestors \u0026#39;self\u0026#39;\u0026#34; http-response set-header X-Content-Type-Options \u0026#34;nosniff\u0026#34; http-response set-header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; http-response set-header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; # 路由逻辑,如果要添加更多域名到 backend1，继续在同一行添加 acl domain1_https hdr(host) -i 123.com 456.com use_backend backend1 if domain1_https # 默认后端 #default_backend backend1 backend backend1 server server1 8.8.8.8:80 check inter 10s rise 3 fall 3 注意：如果站点有播放器，注释掉以下两项安全头\nhttp-response set-header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; http-response set-header Content-Security-Policy \u0026#34;frame-ancestors \u0026#39;self\u0026#39;\u0026#34; 验证\nhaproxy -c -f /etc/haproxy/haproxy.cfg 重载服务\nsystemctl restart haproxy 检查状态\nsystemctl status haproxy 测试证书是否匹配\nfor domain in 123.com 456.com; do echo \u0026#34;Testing $domain:\u0026#34; echo | openssl s_client -connect $domain:443 -servername $domain 2\u0026gt;/dev/null | openssl x509 -noout -subject echo \u0026#34;---\u0026#34; done 获取真实客户端ip,在源站点配置文件添加如下内容\nset_real_ip_from 你的反代ip; real_ip_header X-Forwarded-For; real_ip_recursive on; 如果是两台服务器做负载均衡，默认轮询模式\nfrontend https-in bind *:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 # 安全头配置 http-response set-header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; #http-response set-header X-Frame-Options \u0026#34;SAMEORIGIN\u0026#34; #http-response set-header Content-Security-Policy \u0026#34;frame-ancestors \u0026#39;self\u0026#39;\u0026#34; http-response set-header X-Content-Type-Options \u0026#34;nosniff\u0026#34; http-response set-header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; http-response set-header Referrer-Policy \u0026#34;strict-origin-when-cross-origin\u0026#34; # 路由规则 acl domain1_https hdr(host) -i 123.com 456.com 789.com # 修改，添加了789.com use_backend backend1 if domain1_https # 默认后端 default_backend backend1 backend backend1 server server1 8.8.8.8:80 check inter 10s rise 3 fall 3 server server2 3.3.3.3:80 check inter 10s rise 3 fall 3 # 将原backend2中的server2移过来 检测 安装socat\nsudo apt update sudo apt install socat 检测\necho \u0026#34;show info\u0026#34; | sudo socat unix-connect:/run/haproxy/admin.sock - | grep -iE \u0026#39;conn|session\u0026#39; 或者\necho \u0026#34;show info\u0026#34; | socat unix-connect:/run/haproxy/admin.sock stdio 检测ssl会话重用\necho \u0026#34;show info\u0026#34; | socat stdio /run/haproxy/admin.sock | grep -E \u0026#34;(SslFrontendSessionReuse|SslCache|SslFrontendKey)\u0026#34; 根据提供的信息，HAProxy 的状态如下：\nMaxconn 和 Hard_maxconn：都是10000，表示配置的最大并发连接数和系统支持的最大连接数上限为10000。 CurrConns：当前活跃连接数为148，远低于最大连接数10000（使用率仅为1.48%）。 CumConns：累计连接数已经达到11850550（约1185万），说明服务已经处理了大量连接。 ConnRate：当前新建连接速率是19个/秒，处于较低水平。 MaxConnRate：历史最大新建连接速率是150个/秒。 分析：\n并发连接情况：当前活跃连接数（148）远低于最大连接数（10000），所以没有超出并发限制。 性能状况：系统压力很小，连接率也不高（19/秒），历史最大连接率150/秒也远未达到系统瓶颈（因为最大连接数是10000，即使每个连接持续1秒，理论上也可以支持10000/秒的连接率，但实际上连接持续时间和并发模型会影响实际能力）。 其他设置 通过以下方式来更好地处理默认后端，禁止IP访问和未配置域名的连接\n参考：https://github.com/woniu336/open_shell/blob/main/haproxy_config.txt\n配置地址：\nIP访问检测和拒绝 使用正则表达式检测Host头是否为IP地址格式 直接拒绝IP访问请求 无Host头检测 检测没有Host头的请求并拒绝 未配置域名拒绝 创建包含所有允许域名的ACL 拒绝所有不在允许列表中的域名访问 ","date":"2025-05-29T12:20:03+08:00","permalink":"https://blog.lufei.de/p/452/","title":"haproxy反向代理教程"},{"content":"执行以下命令来安装 pip3：\nsudo apt update sudo apt install python3-pip 验证 pip 是否已正确安装：\npip3 --version 使用 pip3 安装 requests 库\npip3 install requests 下载脚本并运行\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/googlebot_blocker.py python3 googlebot_blocker.py 查看当前iptables规则\niptables -L INPUT -v -n | grep DROP 查看被阻止的连接统计\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/googlebot_stats.sh \u0026amp;\u0026amp; chmod +x googlebot_stats.sh \u0026amp;\u0026amp; ./googlebot_stats.sh 移除屏蔽\nsudo bash remove_googlebot_block.sh ","date":"2025-05-23T19:08:13+08:00","permalink":"https://blog.lufei.de/p/451/","title":"屏蔽谷歌蜘蛛"},{"content":"openresty-manager https://github.com/Safe3/openresty-manager\n文档：https://github.com/Safe3/openresty-manager/blob/main/README_CN.md\n从“手撕配置”到“可视化面板”，从“手动续期”到“一键 Let’s Encrypt”，OpenResty Manager用极简姿态承载了反向代理的全部实力\n主机版\nsudo bash -c \u0026#34;$(curl -fsSL https://om.uusec.com/cn/installer.sh)\u0026#34; 启动\n# 启动服务 /opt/om/oms -s start # 检查服务状态 /opt/om/oms -s status # 停止服务 /opt/om/oms -s stop # 重新启动 /opt/om/oms -s start 访问 https://your-ip:34567 ，用户名: admin ，密码: #Passw0rd\nDNS解析, 在系统设置-OpenResty-DNS解析修改\nresolver 1.1.1.1 8.8.8.8 1.0.0.1 valid=300s ipv6=off local=off; 301重定向（在站点高级配置修改）\nreturn 301 \u0026#39;http://www.xxxx.cc$request_uri\u0026#39;; 屏蔽敏感信息头（在系统设置-OpenResty-缓存资源）修改\nadd_header X-Cf-Cache $upstream_cache_status always; more_set_headers \u0026#34;Server: \u0026#34;; 负载均衡（轮询）\nserver 3.3.3.3:80 weight=3 max_fails=3 fail_timeout=30s; server 6.6.6.6:80 weight=1 max_fails=3 fail_timeout=30s; keepalive 320; keepalive_requests 1000; 应用限流（在在系统设置-OpenResty-Real IP）后面添加\n# 防爬虫限流配置 limit_req_zone $binary_remote_addr zone=one:30m rate=50r/s; limit_conn_zone $binary_remote_addr zone=addr:20m; limit_req zone=one burst=100 nodelay; limit_conn addr 50; limit_req_status 429; limit_conn_status 429; 防爬虫（UA 黑名单）在站点的 include acme_challenge.conf;后面添加\n# 爬虫防护 if ($http_user_agent ~* (python|curl|scrapy|wget|bot|spider)) { return 403; } 容器版\nsudo bash -c \u0026#34;$(curl -fsSL https://om.uusec.com/cn/docker_installer.sh)\u0026#34; 随后可以通过下方命令管理OpenResty Manager容器，包括启动、停止、更新、卸载等。\nbash /opt/om/om.sh 卸载\nsudo bash -c \u0026#34;$(curl -fsSL https://om.uusec.com/uninstaller.sh)\u0026#34; ctop https://github.com/bcicen/ctop\nctop 就是一个专门为容器设计的、命令行版的“任务管理器”。它的界面风格是不是让你想起了经典的 top 命令？没错，它就是借鉴了 top 的设计思路，让你能在一个界面里，实时看到各个容器的 CPU、内存、网络 I/O 等关键指标。\n安装\nsudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop sudo chmod +x /usr/local/bin/ctop 启动：\nctop 快捷键使用 键位 操作说明 \u0026lt;ENTER\u0026gt; 打开容器菜单 a 切换显示所有容器（包括运行中和未运行） f 过滤显示的容器（打开时按 esc 清除） H 切换显示 ctop 头部信息 h 打开帮助对话框 s 选择容器排序字段 r 反转容器排序顺序 o 打开单一视图 l 查看容器日志（打开时按 t 切换时间戳） e 执行 Shell 命令 c 配置显示列 S 将当前配置保存到文件 q 退出 ctop GitHub 中文化插件 https://github.com/maboloshi/github-chinese\n目前项目主要有两个版本：\n开发版：更新贼快，每周一凌晨自动更新词库，适合喜欢尝鲜的小伙伴，能第一时间体验新功能和新翻译。\n发布版：稳定为主，每周五同步开发版的词库，适合追求稳定的用户，不用担心频繁更新出bug。 项目仓库里有各种文件，像 locals.js 存的是翻译词条，main.user.js 是核心脚本，还有专门处理繁體中文的 zh-TW 版本，考虑得很周到。\n点击链接之一，安装脚本即可。\nGitHub 中文化插件 - GitHub 托管【开发版】\nGitHub 中文化插件 - GreasyFork 托管【发布版】\n","date":"2025-05-22T10:16:33+08:00","permalink":"https://blog.lufei.de/p/450/","title":"推荐3个开源Github项目"},{"content":"429 Too Many Requests 是 Nginx 返回的 HTTP 状态码，表示客户端发送的请求过多，超过了设定的访问频率或连接数限制。你在配置中启用了限流：\n🔍 相关配置片段 以下是原始配置，当请求过多时，返回429\n# 请求速率限制 limit_req_zone $binary_remote_addr zone=example_zone:50m rate=100r/s; limit_req zone=example_zone burst=500 nodelay; limit_req_status 429; # 连接数限制 limit_conn_zone $binary_remote_addr zone=addr:30m; limit_conn addr 500; limit_conn_status 429; ✅ 如何解决 429 Too Many Requests ✅ 1. 放宽限制 适用于：真实用户高频访问，非恶意行为。\n📌 调高请求频率限制 limit_req_zone $binary_remote_addr zone=example_zone:50m rate=200r/s; # 原为100r/s limit_req zone=example_zone burst=1000 nodelay; # 建议去掉nodelay，允许排队 📌 增加并发连接上限 limit_conn addr 1000; # 原为500 ✅ 2. 添加延迟队列（防止瞬时爆发） 把 nodelay 去掉，允许小延迟排队处理请求，而不是直接返回 429：\nlimit_req zone=example_zone burst=500; # 去掉 nodelay，允许排队 ✅ 3. 为特定路径关闭或放宽限制 适用于：如 /api/status、/healthz 这类常访问路径。\nlocation /api/status { limit_req off; limit_conn off; # 或者使用更宽松的规则 } ✅ 4. 使用更精细的限流变量 例如按 IP + 路径限流：\nlimit_req_zone \u0026#34;$binary_remote_addr$uri\u0026#34; zone=path_zone:50m rate=50r/s; 这样一个 IP 对多个接口不会共用同一限制。\n✅ 5. 结合日志分析识别恶意流量 在 access.log 中搜索 429 状态：\ngrep \u0026#34; 429 \u0026#34; /var/log/nginx/access.log | awk \u0026#39;{print $1}\u0026#39; | sort | uniq -c | sort -nr | head 找出异常频繁请求的 IP。 可加入 deny 或使用 fail2ban 自动封禁。 ✅ 6. 用 CDN 或前置负载均衡减压 如果是大规模访问，建议前置使用 Cloudflare、AWS ELB、阿里云 SLB 等服务，转移部分压力，并通过其提供的限流、缓存功能减少源站命中率。\n🚨 总结 方法 说明 放宽参数 适合流量正常但配置过严 移除 nodelay 允许排队缓冲突发流量 细粒度限制 精准控制不同路径或用户 IP 黑名单 识别并屏蔽恶意流量 前置缓存/CDN 大流量防护利器 ","date":"2025-05-15T13:39:34+08:00","permalink":"https://blog.lufei.de/p/448/","title":"如何解决 429 Too Many Requests"},{"content":"需求 有时，我需要通过 IP + 端口的方式来访问服务，而不是所有服务都需要通过域名反向代理。 但我需要确保禁止其他 IP 访问我的端口。 这时，白名单方法就显得尤为重要。 脚本（非 Docker 服务） 如果你不使用 Docker，可以通过以下脚本进行操作：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipwl.sh \u0026amp;\u0026amp; chmod +x ipwl.sh \u0026amp;\u0026amp; ./ipwl.sh 如果遇到错误提示，可以执行以下命令解决：\nsudo mkdir -p /etc/mysql sudo touch /etc/mysql/mariadb.cnf sudo dpkg --configure -a 查看\nsudo iptables -S INPUT amh面板设置方法，例如29669端口\n首先创建一个新的 ipset 用于 29669 端口的白名单： sudo ipset create whitelist_port_29669 hash:ip 向白名单中添加您想要允许的 IP 地址，例如： sudo ipset add whitelist_port_29669 8.8.8.8 # 替换为您想要允许的 IP 地址 查看规则 sudo iptables -L INPUT --line-numbers 移除对 29669 端口的通用许可，假设在32编号 sudo iptables -D INPUT 32 然后添加新规则，允许 HTTP 端口和 29670端口的访问（与原始规则相同，但不包括 29669 ）： sudo iptables -I INPUT 32 -p tcp -m multiport --dports 80,29670 -j ACCEPT 最后，添加针对 29669 端口的白名单规则： sudo iptables -I INPUT 33 -p tcp -m tcp --dport 29669 -m set --match-set whitelist_port_29669 src -j ACCEPT sudo iptables -I INPUT 34 -p tcp -m tcp --dport 29669 -j DROP 保存规则，确保重启后规则仍然生效： sudo mkdir -p /etc/iptables sudo iptables-save \u0026gt; /etc/iptables/rules.v4 如果将来需要添加更多 IP 到白名单，只需使用：\nsudo ipset add whitelist_port_29669 新IP地址 这样的修改将确保只有在白名单中的 IP 地址才能访问 29669 端口，而其他 IP 地址的访问将被拒绝。\n查看规则：\nsudo ipset list whitelist_port_29669 删除规则，由于删除规则会改变规则编号，需要从大到小的顺序删除：\n# 删除 IPv4 规则 7 iptables -D INPUT 7 # 删除 IPv4 规则 6 iptables -D INPUT 6 # 删除 IPv4 规则 5 iptables -D INPUT 5 # 删除 IPv4 规则 3 iptables -D INPUT 3 删除 IPv6 规则\n# 删除 IPv6 规则 3 ip6tables -D INPUT 3 # 删除 IPv6 规则 2 ip6tables -D INPUT 2 # 删除 IPv6 规则 1 ip6tables -D INPUT 1 查看规则\niptables -L INPUT -n --line-numbers 查看 IPv6 规则\nip6tables -L INPUT -n --line-numbers 恢复面板端口访问\n# 查找 DROP 规则的行号 iptables -L INPUT -n --line-numbers | grep \u0026#34;DROP.*multiport dports 80,443\u0026#34; # 假设 DROP 规则是第 37 行,插入到它之前 iptables -I INPUT 37 -p tcp -m multiport --dports 23976,23977 -j ACCEPT Docker 部署 对于使用 Docker 部署的服务，步骤如下：\n安装 ipset（如果尚未安装）： sudo apt-get update sudo apt-get install ipset -y 创建允许访问的特定 IP 集合： sudo ipset create allowed_ips hash:ip 添加需要允许访问的特定 IP 地址： sudo ipset add allowed_ips 192.168.1.11 添加 iptables 规则以允许指定端口访问，以 9000 端口为例： sudo iptables -I DOCKER-USER 1 -m set --match-set allowed_ips src -p tcp --dport 9000 -j ACCEPT sudo iptables -I DOCKER-USER 2 -p tcp --dport 9000 -j DROP 如果要添加新的ip白名单，例如放行192.168.2.22\nsudo ipset add allowed_ips 192.168.2.22 ","date":"2025-05-10T10:48:21+08:00","permalink":"https://blog.lufei.de/p/447/","title":"使用白名单限制IP访问指定端口服务"},{"content":"安装 acme.sh curl https://get.acme.sh | sh -s email=my@example.com 添加 acme.sh 到环境变量\necho \u0026#39;export PATH=\u0026#34;$HOME/.acme.sh:$PATH\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc 确认 acme.sh 是否安装成功\nacme.sh --version 获取 EAB凭证 https://app.zerossl.com/developer\n设置 ZeroSSL 的 EAB 信息\nacme.sh --register-account -m my@gmail.com --server https://acme.zerossl.com/v2/DV90 \\ --eab-kid \u0026#34;11111\u0026#34; \\ --eab-hmac-key \u0026#34;111111\u0026#34; 切换默认CA，默认CA为ZeroSSL\nacme.sh --set-default-ca --server zerossl 签发新证书 签发的是泛域名证书\n获取需要DNS添加的 TXT 记录\nacme.sh --issue --dns dns_manual -d 123.com -d *.123.com 申请证书\nacme.sh --issue --dns dns_manual -d 123.com -d *.123.com 续签\nacme.sh --renew -d 123.com -d *.123.com 签发完毕后，证书会保存在：/root/.acme.sh\n安装新证书 acme.sh --install-cert -d 123.com \\ --key-file /etc/nginx/certs/123.com_key.pem \\ --fullchain-file /etc/nginx/certs/123.com_cert.pem \\ --reloadcmd \u0026#34;systemctl force-reload nginx.service\u0026#34; 也可以自己将证书放到需要的位置然后重启nginx。\nnginx -t \u0026amp;\u0026amp; nginx -s reload ","date":"2025-05-04T23:57:32+08:00","permalink":"https://blog.lufei.de/p/446/","title":"ZeroSSL 免费证书申请与自动配置"},{"content":"检测OCSP装订是否开启 一键查询脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/check-cert.sh \u0026amp;\u0026amp; chmod +x check-cert.sh 运行脚本并提供域名作为参数：\n./check-cert.sh example.com 输出，例如\nOCSP Stapling: Enabled OCSP URI: http://e5.o.lencr.org Enabled 已启用，Not Enabled 未开启\n或者可以使用以下命令检测, 将命令中 www.yourdomain.com 改为你的域名\nopenssl s_client -connect www.yourdomain.com:443 -servername www.yourdomain.com -status -tlsextdebug \u0026lt; /dev/null 2\u0026gt;\u0026amp;1 | grep -i \u0026#34;OCSP response\u0026#34; 成功输出：OCSP Response Status: successful (0x0) 失败提示：OCSP response: no response sent 开启 OCSP 装订 开启OCSP装订需要在网站的nginx配置文件中添加如下配置,例如\n# 123.com 的 HTTPS 配置 server { listen 443 ssl; http2 on; server_name 123.com; ssl_certificate /etc/nginx/certs/123.com_cert.pem; ssl_certificate_key /etc/nginx/certs/123.com_key.pem; # === OCSP 装订 配置开始 === ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/123.com/chain.pem; resolver 8.8.8.8 1.0.0.1 valid=60s ipv6=off; resolver_timeout 2s; # === OCSP 装订 配置结束 === ... chain.pem 为完整证书链证书. /etc/letsencrypt/live/123.com/chain.pem 修改为你证书实际绝对路径. 添加后，重启nginx服务器，\nnginx -t \u0026amp;\u0026amp; nginx -s reload 再次使用命令验证，OCSP装订是不是就已经开启了？\n./check-cert.sh 123.com 优化 利用 Nginx 的 ssl_stapling_file 指令直接读取本地响应信息，这样就不会去实时查询证书的OCSP服务器，在进行SSL握手的时候直接将本地的响应信息进行下发，极大的加快了访问速度。\n编写Shell脚本去获取OCSP响应, 我的这个脚本是针对 使用certbot申请证书编写的， 如果使用的是acme.sh，请根据相应目录修改\n获取OCSP响应脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/getOCSP.sh \u0026amp;\u0026amp; chmod +x getOCSP.sh 运行脚本,后边的参数为需要获取OCSP响应的域名\n./getOCSP.sh 123.com 运行后就会在指定的目录生成OCSP响应文件了\n修改Nginx配置读取OCSP响应文件,也就是添加ssl_stapling_file参数，其他不变\n# === OCSP 装订 配置开始 === ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/123.com/chain.pem; ssl_stapling_file /etc/letsencrypt/ocsp/123.com/123.com.ocsp.resp; resolver 8.8.8.8 1.0.0.1 valid=60s ipv6=off; resolver_timeout 2s; # === OCSP 装订 配置结束 === 重启Nginx后，OCSP响应的预加载就完成了\nnginx -t \u0026amp;\u0026amp; nginx -s reload 配置crontab定时任务，每日自动刷新OCSP缓存 虽然我们本地预加载了OCSP响应缓存，但是OCSP响应也是有生效时间了，超过有效时间就得重新获取，这里我们可以配置crontab定时任务去每日自动刷新OCSP响应缓存\n(crontab -l ; echo \u0026#34;22 2 * * * /root/getOCSP.sh 123.com \u0026gt; /dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 至此我们的Nginx OCSP装订工作就到此完成~\n","date":"2025-05-04T20:54:21+08:00","permalink":"https://blog.lufei.de/p/445/","title":"OCSP装订：优化HTTPS性能"},{"content":" 项目：https://github.com/icodex/docker-goedge\n测试系统: debian12\n注意放行必要端口: 7788、8002\n安装docker curl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh 部署主程序 创建目录 mkdir -p /opt/goedge cd /opt/goedge 创建docker-compose.yaml 注意：这里的API通信端口我改成了8002（默认是8001，因为我的8001被占用了），你可以改成默认的8001\ncat \u0026gt; docker-compose.yaml \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; networks: goedge: external: false services: mysqld: image: mysql:8 container_name: mysqld environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_USER=edges - MYSQL_PASSWORD=edges - MYSQL_DATABASE=edges networks: - goedge volumes: - ./data/db/mysql:/var/lib/mysql:rw restart: always edge-admin: image: icodex/edge-admin:1.3.3 container_name: edge-admin ports: - 7788:7788/tcp - 8002:8002/tcp networks: - goedge volumes: - ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs - ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configs restart: always EOF 执行命令启动： docker compose up -d 打开浏览器，输入服务器 ip+7788 端口号，进入安装界面 节点端口：8002 MySQL主机地址：mysqld 数据库名称、用户名、连接密码均为：edges 然后一直下一步就好了 ps：如果你现在的宿主机系统里面已经有mysql，不想再多运行一个浪费资源，则删掉docker-compose.yaml里的mysql服务，并将网络类型更改为Host网络类型，以方便与宿主机上的mysql通信，如下：\ncat \u0026gt; docker-compose.yaml \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; services: edge-admin: image: icodex/edge-admin:1.3.3 container_name: edge-admin network_mode: host volumes: - ./data/edge-admin/configs:/usr/local/goedge/edge-admin/configs - ./data/edge-api/configs:/usr/local/goedge/edge-admin/edge-api/configs restart: always EOF 安装成功后，接着执行以下操作\n屏蔽官方域名\ndocker exec -it edge-admin /bin/sh -c \u0026#39; echo \u0026#34;127.0.0.1 goedge.cloud\u0026#34; \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;127.0.0.1 goedge.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;127.0.0.1 dl.goedge.cloud\u0026#34; \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;127.0.0.1 dl.goedge.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;127.0.0.1 global.dl.goedge.cloud\u0026#34; \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;127.0.0.1 global.dl.goedge.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts cat /etc/hosts \u0026#39; 查看\ndocker exec -it edge-admin cat /etc/hosts 开心版激活\n依次点击「系统设置」，「商业版本」，「激活」，直接粘贴下方提供的旗舰版注册码即可完成离线激活，终身有效\nF4BuVYEKSDWV+I13ISd5NUyBcWOlH0af4/ow9obzYBS3XvYC9IsK86k5UDyyBv9vqJWN2/FQTDbPyuAO0zxYlkLDC0c8rrShs+7PAkqM0O8wBIGknzForgidDZahky5Lo/ZWaPZ1dVFUxmV29ykb0I0b4tv7Q3OtnTylOuzf//MYrlvyw6VJQMGnsttmeHzsNL/r0yDONOEXZoGoLZsuBKnkfXt+qt6bZF+kM1ncbh+sY42BrPTWQ12sXqJS3qHlzU0FFl9lTNzLGYYhq5vi/4sJuPVE50/uLCtslTJdb9zOGR915hnM+jHYsR+jUk0QxOqtreaHpsvNuLkexXbkmA== 部署加速节点 找一下线路好的机子作为加速节点\n注意：放行80和443端口\nufw allow 80/tcp ufw allow 443/tcp 创建目录 mkdir -p /opt/goedge cd /opt/goedge 创建docker-compose.yaml 在GoEdge管理界面 – 边缘节点 – 找到你所在集群 – 集群节点 – 安装升级 – 自动注册，把endpoints、clusterId、secret三个值记录下来。\n注意替换环境变量里相应的值\ncat \u0026gt; docker-compose.yaml \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; services: edge-node: image: icodex/edge-node:1.3.3 container_name: edge-node environment: - ENDPOINTS=http://xxx:8002 - CLUSTERID=xxx - SECRET=xxx network_mode: host cap_add: - NET_ADMIN volumes: - ./data/edge-node/cache:/opt/cache - ./data/edge-node/configs:/usr/local/goedge/edge-node/configs restart: always EOF 执行命令启动： docker compose up -d 然后你就会在CDN面板看到加速节点了\n接着在加速节点屏蔽官方域名\nnano /etc/hosts 在末尾添加\n127.0.0.1 goedge.cn 127.0.0.1 goedge.cloud 127.0.0.1 dl.goedge.cloud 127.0.0.1 dl.goedge.cn 127.0.0.1 global.dl.goedge.cloud 127.0.0.1 global.dl.goedge.cn 如果要更换主控，先删除/opt/goedge目录下的data文件夹和docker-compose.yaml,然后在创建docker-compose.yaml，最后执行以下命令\ndocker compose down docker compose up -d 垃圾爬虫 SEO爬虫排除在外，不放心可以把Googlebot移除\nadldxbot adsbot-google applebot admantx alexa facebookexternalhit proximic slurp YandexBot yandex DotBot SemrushBot AhrefsBot BLEXBot YaK MJ12bot MauiBot MegaIndex.ru GPTBot meta-externalagent/1.1 Qwantbot ClaudeBot Amazonbot SearchBot DataForSeoBot Barkrowler GoogleOther Googlebot 禁止使用ip访问 ","date":"2025-04-30T20:17:39+08:00","permalink":"https://blog.lufei.de/p/443/","title":"使用Docker快速部署CDN管理平台-goedge"},{"content":"错误信息：E: The repository \u0026lsquo;http://security.debian.org bullseye/updates Release\u0026rsquo; does not have a Release file.\n错误信息显示您的Debian仓库配置有问题，具体是\u0026quot;http://security.debian.org bullseye/updates Release\u0026quot;仓库没有Release文件。\n您可以更新您的源列表，将bullseye/updates修改为bullseye-security:\nsudo sed -i \u0026#39;s/bullseye\\/updates/bullseye-security/g\u0026#39; /etc/apt/sources.list 然后更新软件包列表并重试Docker安装:\nsudo apt-get update curl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh ","date":"2025-04-30T13:28:50+08:00","permalink":"https://blog.lufei.de/p/442/","title":"Debian11安装docker报错解决办法"},{"content":" 以下是使用 ipset 和 iptables 来控制容器端口访问的完整步骤，以 9000 端口为例：\n1. 安装 ipset（如果尚未安装） sudo apt-get update sudo apt-get install ipset -y 2. 创建 ipset 集合 创建允许的特定 IP 集合\nsudo ipset create allowed_ips hash:ip 创建 Cloudflare IPv4 集合\nsudo ipset create cf_ipv4 hash:net 创建 Cloudflare IPv6 集合（如需要）\nsudo ipset create cf_ipv6 hash:net family inet6 3. 添加 IP 到集合 添加需要允许访问的特定 IP 地址到allowed_ips 集合，替换为你自己的 IP\nsudo ipset add allowed_ips 192.168.1.11 添加 Cloudflare IPv4 网段\nsudo ipset add cf_ipv4 103.21.244.0/22 sudo ipset add cf_ipv4 103.22.200.0/22 sudo ipset add cf_ipv4 103.31.4.0/22 sudo ipset add cf_ipv4 104.16.0.0/13 sudo ipset add cf_ipv4 104.24.0.0/14 sudo ipset add cf_ipv4 108.162.192.0/18 sudo ipset add cf_ipv4 131.0.72.0/22 sudo ipset add cf_ipv4 141.101.64.0/18 sudo ipset add cf_ipv4 162.158.0.0/15 sudo ipset add cf_ipv4 172.64.0.0/13 sudo ipset add cf_ipv4 173.245.48.0/20 sudo ipset add cf_ipv4 188.114.96.0/20 sudo ipset add cf_ipv4 190.93.240.0/20 sudo ipset add cf_ipv4 197.234.240.0/22 sudo ipset add cf_ipv4 198.41.128.0/17 添加 Cloudflare IPv6 网段（如需要）\nsudo ipset add cf_ipv6 2400:cb00::/32 sudo ipset add cf_ipv6 2606:4700::/32 sudo ipset add cf_ipv6 2803:f800::/32 sudo ipset add cf_ipv6 2405:b500::/32 sudo ipset add cf_ipv6 2405:8100::/32 sudo ipset add cf_ipv6 2a06:98c0::/29 sudo ipset add cf_ipv6 2c0f:f248::/32 4. 添加新的 iptables 规则 允许 allowed_ips 与cf_ipv4集合的ip地址访问 9000 端口\nsudo iptables -I DOCKER-USER 1 -m set --match-set allowed_ips src -p tcp --dport 9000 -j ACCEPT sudo iptables -I DOCKER-USER 2 -m set --match-set cf_ipv4 src -p tcp --dport 9000 -j ACCEPT sudo iptables -I DOCKER-USER 3 -p tcp --dport 9000 -j DROP 5. 添加 IPv6 规则（如需要） 允许 cf_ipv6 集合中的 IPv6 地址访问 9000 端口\nsudo ip6tables -I DOCKER-USER 1 -m set --match-set cf_ipv6 src -p tcp --dport 9000 -j ACCEPT sudo ip6tables -I DOCKER-USER 2 -p tcp --dport 9000 -j DROP 删除规则，例如编号7的规则\nsudo ip6tables -D DOCKER-USER 7 6. 验证规则 检查 allowed_ips 集合\nsudo ipset list allowed_ips 检查 ipset 集合\nsudo ipset list 检查 IPv4 iptables 规则\nsudo iptables -vnL DOCKER-USER --line-numbers 检查 IPv6 iptables 规则（如已配置）\nsudo ip6tables -L DOCKER-USER -n -v --line-numbers 7. 保存规则以防重启后丢失 保存 ipset 集合\nsudo ipset save \u0026gt; /etc/ipset.conf 保存 iptables 规则\nsudo iptables-save \u0026gt; /etc/iptables/rules.v4 保存 ip6tables 规则（如已配置）\nsudo ip6tables-save \u0026gt; /etc/iptables/rules.v6 8. 创建开机自动加载脚本 # 创建启动脚本 cat \u0026gt; /etc/network/if-pre-up.d/ipset \u0026lt;\u0026lt;EOF #!/bin/bash ipset restore \u0026lt; /etc/ipset.conf exit 0 EOF # 赋予执行权限 chmod +x /etc/network/if-pre-up.d/ipset 9. 清除现有的 DOCKER-USER 规则 查看allowed_ips集合\nsudo ipset list allowed_ips 从 allowed_ips 集合中删除指定 IP\nsudo ipset del allowed_ips 192.168.1.22 首先检查并记录现有规则的数量：\nsudo iptables -vnL DOCKER-USER --line-numbers 然后根据查询结果删除相关规则。假设有 4 条与 9000 端口相关的规则：\n# 注意：从最高编号开始删除，避免编号变化 sudo iptables -D DOCKER-USER 4 sudo iptables -D DOCKER-USER 3 sudo iptables -D DOCKER-USER 2 sudo iptables -D DOCKER-USER 1 现在，只有 allowed_ips 集合中的特定 IP 和 cf_ipv4 集合中的 Cloudflare IP 才能访问你的 9000 端口，其他所有 IP 的访问都会被拒绝。如果后续需要添加更多 IP，只需将它们添加到 allowed_ips 集合中即可，不需要修改 iptables 规则。\n","date":"2025-04-28T21:37:18+08:00","permalink":"https://blog.lufei.de/p/%E9%98%B2%E6%AD%A2-docker-%E7%AB%AF%E5%8F%A3%E6%B3%84%E9%9C%B2%E4%BD%BF%E7%94%A8-ipset-%E5%AE%9E%E7%8E%B0%E7%AB%AF%E5%8F%A3%E7%AE%A1%E7%90%86/","title":"防止 Docker 端口泄露：使用 ipset 实现端口管理"},{"content":" 需求：\n禁止使用ip+端口访问 无需nginx反代 可使用域名访问 方法：\n解析好域名，开启小黄云 规则 \u0026ndash; Origin Rules \u0026ndash; 创建规则 指定端口，⚠️ 注意：这里的端口为外部端口，即宿主机端口。\n备份现有iptables规则 修改前务必备份当前规则，以便回滚。\nsudo iptables-save \u0026gt; ~/iptables-backup-$(date +%F-%H%M%S).bak 查看备份：\nls ~/iptables-backup-*.bak 恢复备份：\nsudo iptables-restore \u0026lt; ~/iptables-backup-xxx.bak 仅允许特定IP访问容器端口 示例：仅允许192.168.1.11访问5021端口\nsudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 2 -p tcp --dport 5021 -j DROP ⚠️ 注意：5021为容器内部端口。\n允许Cloudflare IP段访问容器端口 若使用Cloudflare CDN，需允许其节点IP访问容器指定端口。\n示例：允许Cloudflare IPv4段访问5021端口,⚠️ 注意：5021为容器内部端口。\nsudo iptables -I DOCKER-USER 1 -s 103.21.244.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 2 -s 103.22.200.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 3 -s 103.31.4.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 4 -s 104.16.0.0/13 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 5 -s 104.24.0.0/14 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 6 -s 108.162.192.0/18 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 7 -s 131.0.72.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 8 -s 141.101.64.0/18 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 9 -s 162.158.0.0/15 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 10 -s 172.64.0.0/13 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 11 -s 173.245.48.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 12 -s 188.114.96.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 13 -s 190.93.240.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 14 -s 197.234.240.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 15 -s 198.41.128.0/17 -p tcp --dport 5021 -j ACCEPT # 默认拒绝其他来源 sudo iptables -I DOCKER-USER 16 -p tcp --dport 5021 -j DROP 允许Cloudflare IPv6段访问5021端口\nsudo ip6tables -I DOCKER-USER 1 -s 2400:cb00::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 2 -s 2606:4700::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 3 -s 2803:f800::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 4 -s 2405:b500::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 5 -s 2405:8100::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 6 -s 2a06:98c0::/29 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 7 -s 2c0f:f248::/32 -p tcp --dport 5021 -j ACCEPT # 默认拒绝其他来源 sudo ip6tables -I DOCKER-USER 8 -p tcp --dport 5021 -j DROP 检查并保存规则 查看当前iptables规则\nsudo iptables -vnL DOCKER-USER --line-numbers 查看当前ip6tables规则\nsudo ip6tables -L DOCKER-USER -n -v --line-numbers 保存规则，防止重启丢失\nsudo iptables-save \u0026gt; /etc/iptables/rules.v4 删除或重置规则 删除指定规则（如删除第一条）\nsudo iptables -D DOCKER-USER 1 删除指定IP访问规则并清除DROP规则\nsudo iptables -D DOCKER-USER -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT sudo iptables -D DOCKER-USER -p tcp --dport 5021 -j DROP 临时清空DOCKER-USER链（恢复全部访问）\nsudo iptables -F DOCKER-USER ","date":"2025-04-28T14:16:58+08:00","permalink":"https://blog.lufei.de/p/440/","title":"仅允许特定IP或Cloudflare访问docker端口"},{"content":"测试环境 Debian12 需要安装好docker 解析好统计域名 项目 项目：https://github.com/plausible/community-edition\n文档：https://plausible.io/docs/\n🔢 总内存占用：765.98 MiB\n📦 总镜像大小：996.00 MiB\n一键查询内存占用和镜像大小\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/plausible_stats_v3.sh \u0026amp;\u0026amp; chmod +x plausible_stats_v3.sh \u0026amp;\u0026amp; ./plausible_stats_v3.sh 安装 git clone -b v3.0.1 --single-branch https://github.com/plausible/community-edition plausible-ce cd plausible-ce 配置 .env 文件 创建 .env 文件并写入以下内容\n提醒：把plausible.example.com改成你的统计域名\ntouch .env echo \u0026#34;BASE_URL=https://plausible.example.com\u0026#34; \u0026gt;\u0026gt; .env echo \u0026#34;SECRET_KEY_BASE=$(openssl rand -base64 48)\u0026#34; \u0026gt;\u0026gt; .env echo \u0026#34;HTTP_PORT=8000\u0026#34; \u0026gt;\u0026gt; .env 查看确认内容：\ncat .env 输出类似如下：\nBASE_URL=https://plausible.example.com SECRET_KEY_BASE=随机生成的密钥 HTTP_PORT=8000 流量高峰通知【可选】\ncd plausible-ce nano .env 添加如下内容,以QQ邮箱为例\nMAILER_EMAIL=123456@qq.com # 发信邮箱 SMTP_HOST_ADDR=smtp.qq.com SMTP_HOST_PORT=465 SMTP_USER_NAME=123456@qq.com # 发信邮箱用户名 SMTP_USER_PWD=admin123 # 发信邮箱密码 SMTP_HOST_SSL_ENABLED=true SMTP_RETRIES=2 # 发信重试次数 配置 yml 将 Docker 服务的端口绑定为本地回环地址，仅供本地反向代理使用：\n提醒：如果你要开启cdn，比如cf cdn，请把127.0.0.1改成0.0.0.0\ncat \u0026gt; compose.override.yml \u0026lt;\u0026lt; EOF services: plausible: ports: - 127.0.0.1:8000:\\${HTTP_PORT} EOF 启动 Plausible docker compose up -d 确认服务正常运行：\ncurl --head http://localhost:8000 应返回：\nHTTP/1.1 200 OK ... 停止后重新启动\ncd plausible-ce docker compose down docker compose up -d 性能优化 禁用透明大页功能（Transparent HugePages），推荐设置为 never 或 madvise\necho never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled 验证\ncat /sys/kernel/mm/transparent_hugepage/enabled 启用延迟统计功能\n内核的延迟统计（delay accounting）未启用，因此 ClickHouse 无法收集 OSIOWaitMicroseconds 指标。可以通过以下方式启用：\necho 1 \u0026gt; /proc/sys/kernel/task_delayacct 🚫 如何关闭透明大页\n临时关闭（重启失效）：\necho never \u0026gt; /sys/kernel/mm/transparent_hugepage/enabled 永久关闭（推荐）：\n编辑 grub：\nsudo vim /etc/default/grub 找到 GRUB_CMDLINE_LINUX，添加：\ntransparent_hugepage=never 然后更新 grub 并重启：\nsudo update-grub sudo reboot ✅ 检查当前状态\ncat /sys/kernel/mm/transparent_hugepage/enabled ","date":"2025-04-24T13:38:38+08:00","permalink":"https://blog.lufei.de/p/439/","title":"安装网站访客统计工具Plausible最新版本(v3)"},{"content":"推荐使用密钥登录 SSH，因其更加安全。如果必须使用密码登录，请务必设置复杂密码，并更改默认的 SSH 端口以减少暴力破解的风险。此外，建议启用 Fail2Ban 来防范暴力破解攻击\n更改ssh端口 sudo nano /etc/ssh/sshd_config 找到 #Port 22，更改为其他端口（例如123）：\nPort 123 UFW防火墙开放对应端口\nsudo ufw allow 123/tcp 重启SSH服务\nsudo systemctl restart sshd ⚠️ 重要: 不要关闭当前连接！用新开终端测试 123 端口能否连接，确认成功后再关闭原会话。\n安装Fail2Ban 更新系统\nsudo apt update sudo apt install fail2ban rsyslog -y 安装 rsyslog，以确保日志文件能够正常生成并供 Fail2Ban 使用\n1.3 启动服务\nsudo systemctl enable --now fail2ban sudo systemctl enable --now rsyslog 检查服务状态\nsudo systemctl status fail2ban sudo systemctl status rsyslog 配置 Fail2Ban\nsudo nano /etc/fail2ban/jail.local 粘贴以下内容，记得把5522改成你的端口\n[sshd] ignoreip = 127.0.0.1/8 enabled = true filter = sshd port = 5522 maxretry = 3 findtime = 600 bantime = 3600 banaction = ufw logpath = /var/log/auth.log 配置说明：\nenabled = true: 启用 SSH 防护 port = 5522: 指定 SSH 端口（默认22） maxretry = 3: 3次失败后封禁 bantime = 3600: 封禁1小时 findtime = 600: 10分钟内达到失败次数则封禁 测试，打开本地cmd指定一个不存在的用户名，例如lao\nssh lao@1.2.3.4 -p 5522 新开一个ssh终端，然后查看日志\nsudo tail -f /var/log/fail2ban.log 有本地ip输出即可\n管理和监控 3.1 重启服务使配置生效\nsudo systemctl restart fail2ban 3.2 查看运行状态\nsudo systemctl status fail2ban 3.3 查看日志\nsudo tail -f /var/log/fail2ban.log 3.4 管理封禁IP\nsudo fail2ban-client status sshd 手动解封IP：\nsudo fail2ban-client unban IP地址 4.2 使用 ufw 查看规则（如果使用 ufw）\nsudo ufw status numbered 常见问题处理 5.1 如果服务启动失败 检查配置文件语法：\nsudo fail2ban-client -t 5.2 如果日志不更新 重启 rsyslog 服务：\nsudo systemctl restart rsyslog 卸载 sudo systemctl stop fail2ban sudo systemctl disable fail2ban sudo apt-get remove --purge fail2ban sudo apt-get autoremove sudo apt-get clean sudo rm -rf /var/log/fail2ban.log sudo rm -rf /var/lib/fail2ban ","date":"2025-04-21T00:18:11+08:00","permalink":"https://blog.lufei.de/p/438/","title":"Debian 12 安装配置 Fail2Ban 完整指南"},{"content":" rs1000德国纽伦堡机器，默认的系统语言是德文，方法如下\n安装必要工具\nsudo apt update sudo apt install lrzsz wget curl -y 更换系统语言到英文\n1、查看当前语言环境\nenv | grep LANG\t2、en表示语言，US表示国家，UTF-8表示编码\nexport LANG=en_US.UTF-8 3、配置\nsudo dpkg-reconfigure locales 在弹出的界面中，使用方向键导航，空格键选择 en_US.UTF-8，确保其被标记为 [ * ] 然后，按 Tab 键选择 ，按 Enter 确认。\n接下来，系统会询问默认的系统环境，选择 en_US.UTF-8，同样按 Tab 键选择 ，按 Enter 确认。\n4、重启reboot\n验证语言更改✅\n系统重新启动后，您应该会发现界面和应用程序的语言已更改为英文。您可以打开终端，输入以下命令确认当前语言设置：\necho $LANG 解释：\necho $LANG：输出当前的语言环境变量，验证是否为 en_US.UTF-8。 5、初始化配置\n脚本1：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fortress.sh \u0026amp;\u0026amp; chmod +x fortress.sh \u0026amp;\u0026amp; ./fortress.sh 脚本2：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/menu.sh \u0026amp;\u0026amp; chmod +x menu.sh \u0026amp;\u0026amp; ./menu.sh 6、开启ufw，屏蔽垃圾爬虫，自动放行ssh端口\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 查看规则\nsudo ufw status numbered 7、安装配置 Fail2Ban\n","date":"2025-04-20T23:02:20+08:00","permalink":"https://blog.lufei.de/p/437/","title":"netcup RS1000 初始化配置"},{"content":" 宝塔面板后台redis莫名停止运作，导致站点打开出现错误，当我重启redis后，系统负载又飙升，解决办法如下\n即时配置调整 # 设置内存上限 redis-cli config set maxmemory 1g # 设置内存淘汰策略 redis-cli config set maxmemory-policy allkeys-lru # 适度提高采样精度 redis-cli config set maxmemory-samples 10 # 永久保存配置 redis-cli config rewrite amh的配置文件路径\n/usr/local/redis-6.2/redis.conf 或者使用volatile-lru内存淘汰策略\nredis-cli config set maxmemory-policy volatile-lru 开启 active-defrag 机制\nredis-cli CONFIG SET activedefrag yes 确认是否已开启：\nredis-cli CONFIG GET activedefrag 找出 Redis 中“最大的键”\nredis-cli --bigkeys 批量删除这些大 key（谨慎操作）：\nredis-cli --scan --pattern \u0026#34;xxxxx.com*\u0026#34; | xargs redis-cli del 脚本删除大 key\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_bigkeys.sh \u0026amp;\u0026amp; chmod +x clean_bigkeys.sh 🧪 用法说明：\n查看前 10 个最大 key（仅分析，不删除）： ./clean_bigkeys.sh --top-n 10 清除所有大于 512KB 的 key（并 dry-run 看看）： ./clean_bigkeys.sh --dry-run --threshold 524288 真正删除大于 500KB 的 key： ./clean_bigkeys.sh --threshold 500000 把大于 500KB 的 key 设置为 1 小时（3600 秒）后自动过期 ./clean_bigkeys.sh --threshold 500000 --expire 3600 内存上限配置说明 推荐将Redis内存上限设置为系统总内存的40-45%。例如：\n系统内存 推荐Redis内存上限 2GB 1g 4GB 1600mb 8GB 3200mb 例如：\nredis-cli CONFIG SET maxmemory 3200mb 优化 # 更保守的生产环境配置 redis-cli config set activedefrag yes redis-cli config set active-defrag-threshold-lower 10 # 10%碎片率才开始 redis-cli config set active-defrag-threshold-upper 100 redis-cli config set active-defrag-ignore-bytes 100mb # 100MB以上才处理 redis-cli config set active-defrag-cycle-min 1 # 最小1% CPU redis-cli config set active-defrag-cycle-max 25 # 最大25% CPU # 保存当前配置到配置文件 redis-cli config rewrite 查看碎片\nredis-cli info memory | grep -E \u0026#34;(used_memory_human|used_memory_rss_human|mem_fragmentation_ratio)\u0026#34; 内存分配原理 保留足够内存给系统其他组件是必要的，主要考虑：\nPHP-FPM进程需要足够内存处理并发请求 MySQL数据库(尤其是InnoDB缓冲池)需要稳定内存 操作系统文件缓存需求 预防系统内存不足导致的交换(swap)和OOM Killer触发 内存淘汰策略选择 volatile-lru策略适用于大多数Web应用场景：\n只淘汰设置了过期时间(TTL)的键 优先淘汰最近最少使用(Least Recently Used)的键 保护未设置TTL的重要数据 采样精度说明 # 提高内存淘汰精度 redis-cli config set maxmemory-samples 10 maxmemory-samples参数控制Redis执行淘汰策略时的采样数量：\n默认值：Redis 5.0以前为3，5.0及以后为5 增加至10可提高淘汰精度，但会略微增加CPU开销 适合对缓存命中率要求较高的场景 监控命令 查看内存使用情况 redis-cli info memory 确认内存上限配置 redis-cli config get maxmemory 查看内存淘汰策略 redis-cli config get maxmemory-policy 查看采样设置 redis-cli config get maxmemory-samples 检查缓存命中率\nredis-cli info stats | grep -E \u0026#34;keyspace_hits|keyspace_misses\u0026#34; 例如：\nkeyspace_hits:135433 (缓存命中次数) keyspace_misses:60863 (缓存未命中次数) 缓存命中率计算\n命中率 = 命中次数 / (命中次数 + 未命中次数)\n= 135433 / (135433 + 60863) = 135433 / 196296 ≈ 0.69 或 69%\n","date":"2025-04-16T10:22:41+08:00","permalink":"https://blog.lufei.de/p/436/","title":"优化宝塔面板Redis内存配置"},{"content":" 项目: https://github.com/nvbn/thefuck\nubuntu / debian11 安装命令\nsudo apt update sudo apt install python3-dev python3-pip python3-setuptools pip3 install thefuck --user 配置别名\necho \u0026#39;export PATH=\u0026#34;$PATH:/root/.local/bin\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;eval \u0026#34;$(thefuck --alias)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc debian12\nsudo apt install pipx pipx install thefuck 配置别名\necho \u0026#39;export PATH=\u0026#34;$PATH:/root/.local/bin\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;eval \u0026#34;$(thefuck --alias)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc source ~/.bashrc ","date":"2025-04-15T19:29:16+08:00","permalink":"https://blog.lufei.de/p/435/","title":"the fuck"},{"content":" 项目: https://github.com/chaifeng/ufw-docker\n下载 ufw-docker 脚本 sudo wget -O /usr/local/bin/ufw-docker \\ https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker chmod +x /usr/local/bin/ufw-docker 使用下列命令来修改 ufw 的 after.rules 文件\nufw-docker install 重载ufw\nsudo ufw reload 这个命令做了以下事情：\n备份文件 /etc/ufw/after.rules 把 UFW 和 Docker 的相关规则添加到文件 after.rules 的末尾 仅允许特定ip访问 可以在修改前先备份一下当前规则：\nsudo iptables-save \u0026gt; ~/iptables-backup-$(date +%F-%H%M%S).bak 这样如果不小心搞坏了，可以快速还原：\n查看 ls ~/iptables-backup-*.bak 还原 sudo iptables-restore \u0026lt; ~/iptables-backup-xxx.bak 例如: 仅允许192.168.1.11访问5021端口\nsudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 2 -p tcp --dport 5021 -j DROP 注意：5021为容器内部端口，\n允许Cloudflare的IP范围访问5021端口\n如果你要开启域名访问，且开启了cf cdn，把5021改成你想要的端口即可\nsudo iptables -I DOCKER-USER 1 -s 103.21.244.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 2 -s 103.22.200.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 3 -s 103.31.4.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 4 -s 104.16.0.0/13 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 5 -s 104.24.0.0/14 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 6 -s 108.162.192.0/18 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 7 -s 131.0.72.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 8 -s 141.101.64.0/18 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 9 -s 162.158.0.0/15 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 10 -s 172.64.0.0/13 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 11 -s 173.245.48.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 12 -s 188.114.96.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 13 -s 190.93.240.0/20 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 14 -s 197.234.240.0/22 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 15 -s 198.41.128.0/17 -p tcp --dport 5021 -j ACCEPT sudo iptables -I DOCKER-USER 16 -p tcp --dport 5021 -j DROP 允许Cloudflare的IPv6范围访问5021端口\nsudo ip6tables -I DOCKER-USER 1 -s 2400:cb00::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 2 -s 2606:4700::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 3 -s 2803:f800::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 4 -s 2405:b500::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 5 -s 2405:8100::/32 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 6 -s 2a06:98c0::/29 -p tcp --dport 5021 -j ACCEPT sudo ip6tables -I DOCKER-USER 7 -s 2c0f:f248::/32 -p tcp --dport 5021 -j ACCEPT 最后禁止其他所有IPv6来源访问5021端口\nsudo ip6tables -I DOCKER-USER 8 -p tcp --dport 5021 -j DROP 查看规则\nsudo ip6tables -L DOCKER-USER -n -v --line-numbers 验证规则顺序\nsudo iptables -vnL DOCKER-USER --line-numbers 保存规则（防止重启丢失）\nsudo iptables-save \u0026gt; /etc/iptables/rules.v4 删除规则 例如删除第一条规则\niptables -D DOCKER-USER 1 如果需要更换 ip，则先清理旧规则，再重复前面一遍\nsudo iptables -D DOCKER-USER -s 192.168.1.11 -p tcp --dport 5021 -j ACCEPT sudo iptables -D DOCKER-USER -p tcp --dport 5021 -j DROP 临时清除 DOCKER-USER 链规则（恢复访问）\nsudo iptables -F DOCKER-USER 允许外部网络访问 如果希望允许外部网络访问 Docker 容器提供的服务，比如有一个容器的服务端口是 80。那就可以用以下命令来允许外部网络访问这个服务：\nufw route allow proto tcp from any to any port 80 这个命令会允许外部网络访问所有用 Docker 发布出来的并且内部服务端口为 80 的所有服务。\n请注意，这个端口 80 是容器的端口，而非使用 -p 0.0.0.0:8080:80 选项发布在服务器上的 8080 端口。\n如果有多个容器的服务端口为 80，但只希望外部网络访问某个特定的容器。比如该容器的私有地址为 172.17.0.2，就用类似下面的命令：\nufw route allow proto tcp from any to 172.17.0.2 port 80 如果一个容器的服务是 UDP 协议，假如是 DNS 服务，可以用下面的命令来允许外部网络访问所有发布出来的 DNS 服务：\nufw route allow proto udp from any to any port 53 同样的，如果只针对一个特定的容器，比如 IP 地址为 172.17.0.2：\nufw route allow proto udp from any to 172.17.0.2 port 53 使用方法 显示帮助\nufw-docker help 检查 UFW 配置文件中防火墙规则的安装\nufw-docker check 更新 UFW 的配置文件，添加必要的防火墙规则\nufw-docker install 显示当前防火墙允许的转发规则\nufw-docker status 列出所有和容器 httpd 相关的防火墙规则\nufw-docker list httpd 暴露容器 httpd 的 80 端口\nufw-docker allow httpd 80 暴露容器 httpd 的 443 端口，且协议为 tcp\nufw-docker allow httpd 443/tcp 如果容器 httpd 绑定到多个网络上，暴露其 443 端口，协议为 tcp，网络为 foobar-external-network\nufw-docker allow httpd 443/tcp foobar-external-network 把容器 httpd 的所有映射端口都暴露出来\nufw-docker allow httpd 删除所有和容器 httpd 相关的防火墙规则\nufw-docker delete allow httpd 删除容器 httpd 的 tcp 端口 443 的规则\nufw-docker delete allow httpd 443/tcp 暴露服务 web 的 80 端口\ndocker service create --name web --publish 8080:80 httpd:alpine ufw-docker service allow web 80 # 或者 ufw-docker service allow web 80/tcp 删除与服务 web 相关的规则\nufw-docker service delete allow web ","date":"2025-04-09T00:17:48+08:00","permalink":"https://blog.lufei.de/p/434/","title":"ufw-docker 防火墙工具"},{"content":"什么是 ELK？\nELK 是 Elasticsearch、Logstash 和 Kibana 三个开源项目的首字母缩写，它是一个功能强大的日志收集、分析和可视化平台：\nElasticsearch：分布式搜索和分析引擎，用于存储和快速查询日志数据 Logstash：数据收集和处理引擎，可以从多种来源获取数据，转换数据，然后将其发送到 Elasticsearch Kibana：可视化平台，提供了强大的图表、仪表板和查询功能，用于浏览和分析 Elasticsearch 中的数据 在本指南中，我们使用 Filebeat 代替 Logstash 作为日志收集工具，因此也可以称为 EFK 栈，这种组合更加轻量且适合于单纯的日志收集场景。\n关键说明\nEFK 栈优势：Filebeat 相比 Logstash 资源占用更低，适合单纯日志收集需求 协同工作流程：Filebeat（采集） → Elasticsearch（存储） → Kibana（分析展示） 典型应用场景：服务器日志监控、应用故障排查、业务数据可视化分析 部署架构 本指南采用双服务器部署架构：\n服务器 A：部署 ELK 核心服务（Elasticsearch 和 Kibana） 服务器 B：部署 Nginx 网站和 Filebeat 日志采集工具 A 服务器：部署 ELK 核心服务 推荐2G内存以上\n1. 创建 Docker 网络 首先，创建一个名为 logging 的 Docker 网络，用于 Elasticsearch 和 Kibana 容器之间的通信：\ndocker network create logging 2. 运行 Elasticsearch 容器 启动 Elasticsearch 容器，配置单节点模式并设置适当的内存限制：\ndocker run -d \\ --name=elasticsearch \\ --net=logging \\ -v elasticsearch-data:/usr/share/elasticsearch/data \\ -e \u0026#34;discovery.type=single-node\u0026#34; \\ -e \u0026#34;xpack.security.enabled=false\u0026#34; \\ -e \u0026#34;ES_JAVA_OPTS=-Xms512m -Xmx1g\u0026#34; \\ -p 9200:9200 \\ docker.elastic.co/elasticsearch/elasticsearch:8.10.2 配置说明：\n--net=logging：使用前面创建的 Docker 网络 -v elasticsearch-data:/usr/share/elasticsearch/data：持久化存储数据 -e \u0026quot;discovery.type=single-node\u0026quot;：配置为单节点模式 -e \u0026quot;xpack.security.enabled=false\u0026quot;：关闭安全功能（生产环境建议启用） -e \u0026quot;ES_JAVA_OPTS=-Xms512m -Xmx1g\u0026quot;：配置 JVM 内存限制 -p 9200:9200：映射 Elasticsearch HTTP 端口 3. 验证 Elasticsearch 是否正常运行 可能不会马上生效，稍等片刻，再检查 Elasticsearch 是否已成功启动\ncurl http://localhost:9200 如果一切正常，将返回包含版本信息的 JSON 响应。\n4. 运行 Kibana 容器 启动 Kibana 容器，并连接到 Elasticsearch：\ndocker run -d \\ --name=kibana \\ --net=logging \\ -e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \\ -e I18N_LOCALE=zh-CN \\ -p 5601:5601 \\ docker.elastic.co/kibana/kibana:8.10.2 配置说明：\n--net=logging：使用相同的 Docker 网络 -e ELASTICSEARCH_HOSTS=http://elasticsearch:9200：指定 Elasticsearch 连接地址 -e I18N_LOCALE=zh-CN：设置中文界面 -p 5601:5601：映射 Kibana 界面端口 Kibana 启动后，可通过浏览器访问 http://\u0026lt;服务器A的IP\u0026gt;:5601 进入 Kibana 管理界面。\n5. 安全设置，仅特定ip可以访问Kibana 先允许特定IP访问 sudo iptables -I DOCKER-USER 1 -s 192.168.1.11 -p tcp --dport 5601 -j ACCEPT 再拒绝其他IP sudo iptables -I DOCKER-USER 2 -p tcp --dport 5601 -j DROP 验证规则顺序 sudo iptables -L DOCKER-USER -n --line-numbers 输出应类似：\nChain DOCKER-USER (1 references) num target prot opt source destination 1 ACCEPT tcp -- 192.168.1.11 0.0.0.0/0 tcp dpt:5601 2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5601 持久化规则（避免重启丢失）\nsudo apt install iptables-persistent sudo netfilter-persistent save 如果需要更换ip，先则清理旧规则, 再重复一遍\nsudo iptables -D DOCKER-USER -s 192.168.1.11 -p tcp --dport 5601 -j ACCEPT sudo iptables -D DOCKER-USER -p tcp --dport 5601 -j DROP B 服务器：部署 Nginx 并安装 Filebeat 1. 安装 Filebeat 使用 curl 下载 Filebeat 的 DEB 包：\ncurl -L -o filebeat-8.10.2-amd64.deb https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.10.2-amd64.deb 使用 dpkg 安装 DEB 包：\nsudo dpkg -i filebeat-8.10.2-amd64.deb 2. 配置 Filebeat 收集 Nginx 日志 编辑 Filebeat 配置文件：\nsudo nano /etc/filebeat/filebeat.yml 添加以下配置（根据实际环境修改）：\nfilebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log fields: project: ovh app: nginx fields_under_root: true setup.template.name: \u0026#34;ovh-nginx\u0026#34; setup.template.pattern: \u0026#34;ovh-nginx-*\u0026#34; output.elasticsearch: hosts: [\u0026#34;http://\u0026lt;服务器A的IP\u0026gt;:9200\u0026#34;] index: \u0026#34;ovh-nginx-%{+yyyy.MM.dd}\u0026#34; 注意事项：\n将 \u0026lt;服务器A的IP\u0026gt; 替换为实际的 A 服务器 IP 地址 日志路径 /var/log/nginx/access.log 可根据实际 Nginx 配置修改 可以添加多个日志路径，每行一个路径 fields 部分定义的字段将作为元数据附加到每条日志记录 3. 启动并设置 Filebeat 服务 启动 Filebeat 服务：\nsudo systemctl start filebeat 设置 Filebeat 开机自启：\nsudo systemctl enable filebeat 检查 Filebeat 运行状态：\nsudo systemctl status filebeat 4. 测试日志收集 模拟生成 Nginx 访问日志：\ncurl -A \u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\u0026#34; http://localhost 批量发送请求测试：\nseq 1 10 | xargs -n1 -I{} curl -s http://localhost \u0026gt; /dev/null 在 Kibana 中查看日志 打开浏览器访问 http://\u0026lt;服务器A的IP\u0026gt;:5601 进入 Kibana 后，导航到 \u0026ldquo;Discover\u0026rdquo; 部分 创建索引模式： 点击 \u0026ldquo;创建数据视图\u0026rdquo; 输入 ovh-nginx-* 作为索引模式 选择时间字段（如 @timestamp） 点击 \u0026ldquo;创建数据视图\u0026rdquo; 按钮 返回 \u0026ldquo;Discover\u0026rdquo; 页面，选择刚创建的数据视图 现在应该能看到 Nginx 的访问日志数据 卸载Filebeat 如果需要卸载 Filebeat：\nsudo systemctl stop filebeat sudo systemctl disable filebeat sudo apt-get remove --purge filebeat sudo rm -rf /etc/filebeat/ sudo rm -rf /var/lib/filebeat/ sudo rm -rf /var/log/filebeat/ 最后，更新APT包管理器缓存：\napt-get update ","date":"2025-04-08T11:10:29+08:00","permalink":"https://blog.lufei.de/p/433/","title":"ELK 日志收集与分析系统部署指南"},{"content":"原项目: https://github.com/ypq123456789/domainkeeper\n本项目: https://github.com/woniu336/domain-whois\ndemo(原作者) https://domainkeeper.bacon159.me/\ndemo 借用原作者的图\n前言 在最开始根据原项目搭建的时候，后台提示json错误的坑，问题在于自建whois上，因为我是根据其他项目自建的whois的，我猜测是没有匹配到原项目导致的，所以我更改了部分domainkeeper.js代码, 记录一下搭建的过程。\n自建whois 系统debian，一键脚本搞定\ncurl -sS -O https://raw.githubusercontent.com/woniu336/domain-whois/main/install_whois.sh \u0026amp;\u0026amp; chmod +x install_whois.sh \u0026amp;\u0026amp; ./install_whois.sh 搭建成功后，访问：http://ip:8043/example.com, 输出内容表明安装成功，也可以查ip和ASN的whois信息，\n例如：http://ip:8043/8.8.8.8，http://ip:8043/AS135377\n绑定域名，这一步最简单\n访问cf后台，解析域名，开启cdn，然后找到规则，Origin Rules，创建规则\n反代成功！！\n搭建面板 登录您的 Cloudflare 账户 创建新的 Worker 将domainkeeper.js脚本内容复制到 Worker 编辑器 https://github.com/woniu336/domain-whois/blob/main/domainkeeper.js 在脚本顶部配置以下变量： const CF_API_KEY = \u0026#34;your_cloudflare_api_key\u0026#34;; const WHOIS_PROXY_URL = \u0026#34;your_whois_proxy_url\u0026#34;; const ACCESS_PASSWORD = \u0026#34;your_frontend_password\u0026#34;; const ADMIN_PASSWORD = \u0026#34;your_backend_password\u0026#34;; CF_API_KEY的获取方式： 登录自己的cloudflare账号，打开https://dash.cloudflare.com/profile\n点击API令牌，创建令牌，读取所有资源-使用模板，继续以显示摘要，创建令牌，复制此令牌，保存到记事本，之后不会再显示！\nWHOIS_PROXY_URL的获取方式：根据前面成功搭建的whois，你只需要填入http(s)://你的域名\n前台密码按需设置，后台密码必须设置。\n创建一个 KV 命名空间，命名为DOMAIN_INFO，并将其绑定到 Worker，绑定名称为 DOMAIN_INFO 保存并部署，完结 ","date":"2025-04-06T21:46:59+08:00","permalink":"https://blog.lufei.de/p/432/","title":"域名可视化展示面板搭建教程"},{"content":" 开源的SSL证书管理工具，可以帮助你自动申请、部署SSL证书，并在证书即将过期时自动续期\nhttps://github.com/certimate-go/certimate\n文档： https://docs.certimate.me/docs/introduction/\ncloudflare授权管理: https://docs.certimate.me/docs/tutorial/authorization-management#cloudflare-credentials\n二进制安装 1 分钟部署 Certimate！\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/deploy_certimate.sh \u0026amp;\u0026amp; chmod +x deploy_certimate.sh \u0026amp;\u0026amp; ./deploy_certimate.sh 浏览器中访问 http://ip:8090。(注意：如果你选择了仅本地访问，是打不开的，需要反向代理)\n初始的管理员账号及密码：\n账号：admin@certimate.fun 密码：1234567890 卸载脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/uninstall_certimate.sh \u0026amp;\u0026amp; chmod +x uninstall_certimate.sh \u0026amp;\u0026amp; ./uninstall_certimate.sh 常用命令：\n##查看服务状态 systemctl status certimate ##停止服务 systemctl stop certimate ##重启服务 systemctl restart certimate ##修改监听地址 nano /etc/systemd/system/certimate.service ##重启生效 systemctl daemon-reload \u0026amp;\u0026amp; systemctl restart certimate caddy反代 nano /etc/caddy/Caddyfile 配置\nssl.xxxx.com { reverse_proxy 127.0.0.1:8090 } 重启生效\nsystemctl restart caddy 备份与还原 Certimate 使用 SQLite 来存储全部数据，它位于你的安装路径的 pb_data 目录下。你可以将该目录下的全部文件复制到其他路径。\n还原数据\n先停止 Certimate 服务运行，然后将备份过的全部文件复制回 pb_data 目录下并替换同名文件，重启 Certimate 即可。\nDocker 安装 mkdir -p ~/.certimate \u0026amp;\u0026amp; \\ cd ~/.certimate \u0026amp;\u0026amp; \\ curl -O https://raw.githubusercontent.com/certimate-go/certimate/refs/heads/main/docker/docker-compose.yml \u0026amp;\u0026amp; \\ docker compose up -d 浏览器中访问 http://127.0.0.1:8090。\n初始的管理员账号及密码：\n账号：admin@certimate.fun 密码：1234567890 记得修改密码\n","date":"2025-03-20T23:28:41+08:00","permalink":"https://blog.lufei.de/p/431/","title":"开源的SSL证书管理工具-certimate"},{"content":"文档: https://github.com/ecouus/E-Nav/blob/main/README.md\n后台管理 访问地址：http://您的域名:1239/admin 默认密码：admin 请及时修改默认密码以确保安全 快速部署 方式一：Docker部署（推荐） docker run -d \\ --name e-nav \\ -p 1239:1239 \\ -v $(pwd)/data:/app/data \\ --restart unless-stopped \\ ecouus/e-nav:latest 更新 docker pull ecouus/e-nav:latest \u0026amp;\u0026amp; docker stop e-nav \u0026amp;\u0026amp; docker rm e-nav \u0026amp;\u0026amp; docker run -d --name e-nav -p 1239:1239 -v $(pwd)/data:/app/data --restart unless-stopped ecouus/e-nav:latest 💡 端口修改说明\n-p 1239:1239 中第一个1239可更改为任意未被占用的端口 例如：-p 8080:1239 则使用8080端口访问 💡 挂载路径说明\n$(pwd)/data 表示挂载到宿主机当前工作目录的data文件夹下 Docker Compose 部署\n下载源文件 sudo apt install git -y \u0026amp;\u0026amp; git clone https://github.com/ecouus/E-Nav.git \u0026amp;\u0026amp; cd E-Nav 根据需要编辑 docker-compose.yml 文件\n启动 docker-compose up -d 更新 docker-compose pull \u0026amp;\u0026amp; docker-compose up -d 方式二：本机一键脚本部署 安装 curl -fsSL https://raw.githubusercontent.com/ecouus/E-Nav/main/OneClick.sh -o OneClick.sh \u0026amp;\u0026amp; chmod +x OneClick.sh \u0026amp;\u0026amp; bash OneClick.sh install 卸载 bash OneClick.sh uninstall 方法三：手动部署 安装必要软件 apt update apt install -y git 安装 Go wget https://go.dev/dl/go1.24.1.linux-amd64.tar.gz tar -C /usr/local -xzf go1.24.1.linux-amd64.tar.gz echo \u0026#39;export PATH=$PATH:/usr/local/go/bin\u0026#39; \u0026gt;\u0026gt; /root/.bashrc source /root/.bashrc 克隆项目 cd /root git clone https://github.com/ecouus/E-Nav.git cd E-Nav 初始化和编译 go mod init E-Nav go mod tidy go build -o E-Nav 创建系统服务 cat \u0026gt; /etc/systemd/system/E-Nav.service \u0026lt;\u0026lt; EOF [Unit] Description=E-Nav Go Web Application After=network.target [Service] Type=simple User=root WorkingDirectory=/root/E-Nav ExecStart=/root/E-Nav/E-Nav Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF 启动服务 systemctl daemon-reload systemctl enable E-Nav systemctl start E-Nav 常用命令 # 查看服务状态 systemctl status E-Nav # 启动服务 systemctl start E-Nav # 停止服务 systemctl stop E-Nav # 重启服务 systemctl restart E-Nav # 查看日志 journalctl -u E-Nav 注意事项 请确保使用root用户执行脚本 本机部署需确保服务器1239端口未被占用 建议安装完成后及时修改后台密码 如遇问题，请查看服务日志排查 技术架构 后端技术 graph LR A[Go] --\u0026gt; B[Gorilla Mux] B --\u0026gt; C[RESTful API] A --\u0026gt; D[JSON存储] A --\u0026gt; E[Session管理] 前端技术 graph LR A[HTML5] --\u0026gt; B[响应式设计] C[CSS3] --\u0026gt; B D[JavaScript] --\u0026gt; E[动态交互] F[Font Awesome] --\u0026gt; G[图标系统] 项目结构 e-nav/ ├── 📄 main.go # 主程序 ├── 📁 static/ # 静态文件目录 │ ├── 📄 css/ # CSS文件 │ ├── 📄 js/ # JavaScript文件 │ └── 📄 favicon.ico # 网站图标 ├── 📁 templates/ # HTML模板目录 │ ├── 📄 index.html # 主页模板 │ ├── 📄 admin_login.html # 管理员登录页面 │ └── 📄 admin_dashboard.html # 管理员控制面板 ├── 📁 data/ # 数据文件 ├── 📄 bookmarks.json # 数据存储 └── 📄 config.json # 配置文件 常用命令 # Docker 环境 docker ps # 查看容器状态 docker logs e-nav # 查看运行日志 docker restart e-nav # 重启服务 docker stop e-nav # 停止服务 docker start e-nav # 启动服务 # 本机部署环境 systemctl status E-Nav # 查看服务状态 systemctl restart E-Nav # 重启服务 journalctl -u E-Nav # 查看日志 注意事项 请使用root用户执行安装脚本 确保端口1239未被占用 及时修改默认管理密码 定期备份重要数据 ","date":"2025-03-15T01:28:40+08:00","permalink":"https://blog.lufei.de/p/430/","title":"导航站一键脚本与Docker部署"},{"content":"项目地址 https://github.com/zcp1997/telegram-cf-dns-bot\n一键脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cf-dns-bot.sh \u0026amp;\u0026amp; chmod +x cf-dns-bot.sh \u0026amp;\u0026amp; ./cf-dns-bot.sh 快速开始 前置要求\nDocker 和 Docker Compose\nTelegram Bot Token（从 @BotFather 获取）\nCloudflare API Token（从 Cloudflare 控制面板获取）\n域名的 Zone ID（从 Cloudflare 控制面板获取）\n通过 @userinfobot 获取您的Telegram 用户 ID\n部署方式 以下为手动，可以使用脚本快速部署\n创建 docker-compose.yml 文件： services: tg-cf-dns-bot: image: ghcr.io/zcp1997/telegram-cf-dns-bot:latest container_name: tg-cf-dns-bot restart: unless-stopped environment: # Telegram Bot Token - TELEGRAM_TOKEN=your_telegram_token_here # Cloudflare API Token - CF_API_TOKEN=your_api_token_here # 允许访问的 Telegram 用户 ID（逗号分隔），第一个用户是管理员 - ALLOWED_CHAT_IDS=123456789,987654321 # 域名到 Zone ID 的映射（JSON 格式） - \u0026#39;DOMAIN_ZONE_MAP= { \u0026#34;example.com\u0026#34;: \u0026#34;zone_id_1\u0026#34;, \u0026#34;example.org\u0026#34;: \u0026#34;zone_id_2\u0026#34;, \u0026#34;another-domain.com\u0026#34;: \u0026#34;zone_id_3\u0026#34; }\u0026#39; 小贴士 你可以通过这个curl命令快速得到托管的 DOMAIN_ZONE_MAP 配置\ncurl -s -X GET \u0026#34;https://api.cloudflare.com/client/v4/zones\u0026#34; \\ -H \u0026#34;Authorization: Bearer YOUR_API_TOKEN\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; | \\ jq \u0026#39;[.result[] | {key: .name, value: .id}] | from_entries\u0026#39; 编辑 docker-compose.yml 文件，填入必要的配置信息：\n替换 your_telegram_token_here 为您的 Telegram Bot Token 替换 your_api_token_here 为您的 Cloudflare API Token 替换 ALLOWED_CHAT_IDS 中的用户ID为您允许访问的用户ID 在 DOMAIN_ZONE_MAP 中配置您的域名和对应的 Zone ID 启动服务：\ndocker compose up -d 查看日志： docker compose logs -f ","date":"2025-03-15T00:07:53+08:00","permalink":"https://blog.lufei.de/p/429/","title":"使用电报管理你的Cloudflare DNS"},{"content":" 不会对现有的防火墙规则造成负面影响。它采用了独立的链和集合，与现有规则和策略和平共存。即使删除这个黑名单系统，也不会影响其他防火墙规则的正常运行。\n脚本 首先安装依赖工具：\napt-get install iptables ipset cron 然后运行以下脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipblocker.sh \u0026amp;\u0026amp; chmod +x ipblocker.sh \u0026amp;\u0026amp; ./ipblocker.sh 持久化 确保目录存在\nmkdir -p /etc/iptables 安装 iptables-persistent 工具（Debian/Ubuntu）：\napt install iptables-persistent 保存规则\niptables-save \u0026gt; /etc/iptables/rules.v4 ipset save banned_ips -f /etc/ipset.conf 验证持久化配置 # 重启系统 reboot # 确认 banned_ips 存在 ipset list banned_ips # 确认 IPTables 规则生效 iptables -L BANNED -n 验证规则 统计规则匹配次数\niptables -L BANNED -n -v -x 手动添加黑名单 ipset add banned_ips 1.2.3.4 然后使用ping测试\n手动解除 IP\nipset del banned_ips 1.2.3.4 ","date":"2025-03-13T15:29:03+08:00","permalink":"https://blog.lufei.de/p/428/","title":"使用iptables和ipset配合AbuseIPDB阻止恶意扫描"},{"content":"防火墙设置 保存当前规则（以防万一）\nsudo iptables-save \u0026gt; ~/iptables.backup 允许本地回环（lo 接口）\niptables -A INPUT -i lo -j ACCEPT 允许已建立和相关连接（关键！）\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 放行特定端口（如 SSH、HTTP、HTTPS）\niptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT 默认拒绝其他所有入站流量\niptables -P INPUT DROP 永久保存规则\nsudo apt install iptables-persistent sudo netfilter-persistent save sudo netfilter-persistent reload 检查规则是否生效\nsudo iptables -L -n -v | grep 443 如果需要恢复\n# 将默认策略改回 ACCEPT sudo iptables -P INPUT ACCEPT # 或者恢复备份的规则 sudo iptables-restore \u0026lt; ~/iptables.backup 删除规则 查看现有规则的行号\nsudo iptables -L INPUT --line-numbers 删除指定行号的规则\n# 先删除 443 端口规则（行号较大的规则） sudo iptables -D INPUT 2 # 再删除 80 端口规则（行号较小的规则） sudo iptables -D INPUT 1 或者\n# 删除 80 端口规则 sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 删除 443 端口规则 sudo iptables -D INPUT -p tcp --dport 443 -j ACCEPT 永久生效\nsudo netfilter-persistent save sudo netfilter-persistent reload ","date":"2025-03-06T00:46:02+08:00","permalink":"https://blog.lufei.de/p/427/","title":"防火墙规则设置"},{"content":" 功能:\n实时监控TCP连接 自动识别异常连接 智能封禁可疑IP段 白名单保护机制 ufw安装 如果已经安装可以滤过，如果没有安装必须正确安装后放行ssh端口，避免ssh连接不上，把自己关门外，推荐使用以下脚本一键安装，自动放行ssh\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 脚本 提示：脚本中的阈值和白名单可自行调整\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/monitor_and_block.sh \u0026amp;\u0026amp; chmod +x monitor_and_block.sh 创建日志文件 sudo touch /var/log/ip_monitor.log sudo chmod 644 /var/log/ip_monitor.log 后台运行 60秒监控频率\nnohup ./monitor_and_block.sh \u0026gt; monitor.out 2\u0026gt;\u0026amp;1 \u0026amp; 查看连接数超过100的IP 正常情况下会看到127.0.0.1、172.19.0.2，是本地回环地址和Docker容器的内部IP地址，大量连接是正常的。\nnetstat -apn | grep \u0026#39;tcp\u0026#39; | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | grep -E \u0026#39;^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$\u0026#39; | sort | uniq -c | awk \u0026#39;$1 \u0026gt; 100 {print $0}\u0026#39; 查看除了白名单之外的高连接数IP netstat -apn | grep \u0026#39;tcp\u0026#39; | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | grep -E \u0026#39;^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$\u0026#39; | grep -v \u0026#34;127.0.0.1\u0026#34; | grep -v \u0026#34;192.168.1.\u0026#34; | sort | uniq -c | awk \u0026#39;$1 \u0026gt; 100 {print $0}\u0026#39; 显示连接数最多的前10个IP netstat -apn | grep \u0026#39;tcp\u0026#39; | awk \u0026#39;{print $5}\u0026#39; | cut -d: -f1 | grep -E \u0026#39;^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$\u0026#39; | grep -v \u0026#34;127.0.0.1\u0026#34; | grep -v \u0026#34;192.168.1.\u0026#34; | sort | uniq -c | sort -nr | head -n 10 手动封禁整个IP段 sudo ufw insert 1 deny from 123.456.789.0/24 to any 解封ip 查看当前规则\nsudo ufw status numbered 解封ip\nsudo ufw delete [规则编号] 直接指定要解封的IP段\nsudo ufw delete deny from 123.456.789.0/24 to any 检查脚本运行状态 ps aux | grep monitor_and_block.sh 查看实时监控输出 tail -f monitor.out 查看封禁日志 tail -f /var/log/ip_monitor.log 停止脚本 方法1：使用 kill 命令（推荐）\nsudo kill 34500 # 使用实际的PID 方法2：使用 pkill\nsudo pkill -f monitor_and_block.sh ","date":"2025-03-05T21:23:12+08:00","permalink":"https://blog.lufei.de/p/426/","title":"使用ufw防火墙自动检测和防御高频连接攻击"},{"content":"脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tcp_mem.sh \u0026amp;\u0026amp; chmod +x tcp_mem.sh \u0026amp;\u0026amp; ./tcp_mem.sh ","date":"2025-03-03T23:13:09+08:00","permalink":"https://blog.lufei.de/p/425/","title":"系统调优一键脚本"},{"content":" 如果不设置轮转，日志会越来越大，可以删除，但更推荐logrotate方式\nlogrotate 设置步骤：\n检查文件所有者\nls -l /data/wwwlogs/ 首先设置日志目录权限： sudo chown root:root /data/wwwlogs/* 创建 logrotate 配置文件： sudo nano /etc/logrotate.d/website_logs 写入以下配置： # access logs /data/wwwlogs/*.access.log { size 500M missingok rotate 7 compress delaycompress notifempty dateext dateformat -%Y%m%d copytruncate create 0644 root root su root root sharedscripts postrotate [ -f /run/nginx/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /run/nginx/nginx.pid) endscript } # error logs /data/wwwlogs/*.error.log { size 20M missingok rotate 5 compress delaycompress notifempty dateext dateformat -%Y%m%d copytruncate create 0644 root root su root root sharedscripts postrotate [ -f /run/nginx/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /run/nginx/nginx.pid) endscript } 测试配置： chmod 644 /etc/logrotate.d/website_logs logrotate -d /etc/logrotate.d/website_logs 强制执行一次（如果需要）\nsudo logrotate -f /etc/logrotate.d/website_logs 或者手动创建一个大文件来测试：\ndd if=/dev/zero of=/data/wwwlogs/test.access.log bs=1M count=501 手动压缩已轮转的日志\nsudo gzip /data/wwwlogs/*-20250301 检查定时任务是否正确设置 systemctl status logrotate.timer 如果未启用，则启用\nsudo systemctl enable logrotate.timer sudo systemctl start logrotate.timer 验证定时任务： # 查看下次执行时间 systemctl list-timers logrotate.timer 监控日志大小： # 查看当前日志大小 du -sh /data/wwwlogs/ # 查看压缩后的日志 ls -lh /data/wwwlogs/*.gz # 查看各个日志文件大小 du -h /data/wwwlogs/* | sort -hr 配置说明：\n日志超过 500M 时轮转 保留最近7天的日志 使用日期作为后缀 压缩旧日志（延迟一天） 每天凌晨自动检查 Nginx 日志会自动重新打开 完成后：\n系统会在每天凌晨自动执行日志轮转 超过 500M 的日志会立即轮转 旧日志会被压缩 超过7天的日志会被自动删除 宝塔面板 检查文件所有者\nls -l /www/wwwlogs/ 创建 logrotate 配置文件：\nsudo nano /etc/logrotate.d/website_logs 配置如下：\n/www/wwwlogs/*[^error].log { size 500M missingok rotate 7 compress delaycompress dateext dateformat -%Y%m%d-%H%M%S notifempty copytruncate create 0644 www root sharedscripts postrotate [ -f /www/server/nginx/logs/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /www/server/nginx/logs/nginx.pid) endscript } /www/wwwlogs/*.error.log { size 500M missingok rotate 7 compress delaycompress dateext dateformat -%Y%m%d-%H%M%S notifempty copytruncate create 0644 www root sharedscripts postrotate [ -f /www/server/nginx/logs/nginx.pid ] \u0026amp;\u0026amp; kill -USR1 $(cat /www/server/nginx/logs/nginx.pid) endscript } 说明：\nlogrotate 每天凌晨 00:00 自动执行 每天凌晨自动检查所有日志 如果日志超过 500M 就会轮转 上次轮转的日志会被压缩（因为 delaycompress） 保留最近7天的日志记录 手动执行轮转\nsudo logrotate -f /etc/logrotate.d/website_logs 手动压缩\nsudo gzip /www/wwwlogs/*-20250301 查看所有日志大小\ndu -h /www/wwwlogs/*.log | sort -hr 查看日志大小\ndu -sh /www/wwwlogs/ ","date":"2025-03-01T01:34:49+08:00","permalink":"https://blog.lufei.de/p/424/","title":"nginx日志logrotate轮转设置"},{"content":" 使用ufw防火墙\n自动安装ufw，已安装的不影响 自动放行ssh已有端口 不影响现有规则 脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 查看规则\nsudo ufw status numbered Censys的 ASN 有三个\nAS398722 AS398705 AS398324 如果你使用cf，可以在后台屏蔽\n预览\n#!/bin/bash # # Censys UFW Blocker # 版本: 1.1.0 # 描述: 自动下载 Censys 扫描器 IP 列表并更新 UFW 防火墙规则 # 最后更新: $(date \u0026#39;+%Y-%m-%d\u0026#39;) # # 设置错误处理 set -e trap \u0026#39;echo \u0026#34;错误发生在第 $LINENO 行\u0026#34;; exit 1\u0026#39; ERR # 定义变量 CENSYS_IP_LIST_URL=\u0026#34;https://support.censys.io/hc/en-us/article_attachments/34972050185876\u0026#34; SCRIPT_DIR=\u0026#34;$(cd \u0026#34;$(dirname \u0026#34;${BASH_SOURCE[0]}\u0026#34;)\u0026#34; \u0026amp;\u0026amp; pwd)\u0026#34; LOG_FILE=\u0026#34;${SCRIPT_DIR}/censys_ufw_update.log\u0026#34; IPv4_LIST=\u0026#34;${SCRIPT_DIR}/censys_ipv4.txt\u0026#34; IPv6_LIST=\u0026#34;${SCRIPT_DIR}/censys_ipv6.txt\u0026#34; TEMP_FILE=\u0026#34;${SCRIPT_DIR}/censys_mixed_ips.txt\u0026#34; # 预定义的风险 IP 地址 declare -a RISK_IPS=( \u0026#34;94.154.33.153\u0026#34; \u0026#34;185.220.101.29\u0026#34; \u0026#34;138.197.191.87\u0026#34; \u0026#34;152.42.217.201\u0026#34; \u0026#34;149.88.106.138\u0026#34; \u0026#34;179.43.191.19\u0026#34; \u0026#34;146.190.111.4\u0026#34; \u0026#34;185.220.101.190\u0026#34; \u0026#34;192.42.116.178\u0026#34; ) # 预定义的 IDC 扫描范围 declare -a IDC_RANGES=( \u0026#34;20.171.206.0/24\u0026#34; \u0026#34;52.230.152.0/24\u0026#34; \u0026#34;52.233.106.0/24\u0026#34; \u0026#34;152.32.128.0/17\u0026#34; \u0026#34;103.218.243.0/24\u0026#34; ) # 预定义的 Facebook IPv4 范围 declare -a FACEBOOK_IPV4=( \u0026#34;69.63.176.0/21\u0026#34; \u0026#34;69.63.184.0/21\u0026#34; \u0026#34;66.220.144.0/20\u0026#34; \u0026#34;69.63.176.0/20\u0026#34; ) # 预定义的 Facebook IPv6 范围 declare -a FACEBOOK_IPV6=( \u0026#34;2620:0:1c00::/40\u0026#34; \u0026#34;2a03:2880::/32\u0026#34; \u0026#34;2a03:2880:fffe::/48\u0026#34; \u0026#34;2a03:2880:ffff::/48\u0026#34; \u0026#34;2620:0:1cff::/48\u0026#34; ) # 预定义的 Semrush 范围 declare -a SEMRUSH_RANGES=( \u0026#34;85.208.96.0/24\u0026#34; \u0026#34;185.191.171.0/24\u0026#34; ) # 日志函数 log_message() { echo \u0026#34;[$(date \u0026#39;+%Y-%m-%d %H:%M:%S\u0026#39;)] $1\u0026#34; | tee -a \u0026#34;$LOG_FILE\u0026#34; } # 检查并获取 SSH 端口 get_ssh_ports() { local ports=$(grep -E \u0026#34;^Port\u0026#34; /etc/ssh/sshd_config | awk \u0026#39;{print $2}\u0026#39;) if [ -z \u0026#34;$ports\u0026#34; ]; then echo \u0026#34;22\u0026#34; else echo \u0026#34;$ports\u0026#34; fi } # 添加或更新 UFW 规则函数 add_or_update_rule() { local ip=\u0026#34;$1\u0026#34; local position=\u0026#34;$2\u0026#34; if ufw status | grep -q \u0026#34;DENY.*$ip\u0026#34;; then local rule_num=$(ufw status numbered | grep \u0026#34;$ip\u0026#34; | awk \u0026#39;{print $1}\u0026#39; | tr -d \u0026#39;[]\u0026#39;) if [ ! -z \u0026#34;$rule_num\u0026#34; ]; then log_message \u0026#34;更新规则: $ip\u0026#34; ufw --force delete $rule_num fi fi if [ ! -z \u0026#34;$position\u0026#34; ]; then ufw insert $position deny from \u0026#34;$ip\u0026#34; to any else ufw deny from \u0026#34;$ip\u0026#34; to any fi } # 主程序开始 log_message \u0026#34;开始更新 UFW 规则\u0026#34; # 检查 root 权限 if [[ $EUID -ne 0 ]]; then log_message \u0026#34;错误：此脚本需要 root 权限运行\u0026#34; exit 1 fi # 检查并安装 UFW if ! command -v ufw \u0026amp;\u0026gt; /dev/null; then log_message \u0026#34;UFW 未安装，正在安装...\u0026#34; apt update \u0026amp;\u0026amp; apt install -y ufw if [ $? -ne 0 ]; then log_message \u0026#34;UFW 安装失败\u0026#34; exit 1 fi fi # 允许 SSH 端口 SSH_PORTS=$(get_ssh_ports) for port in $SSH_PORTS; do ufw allow \u0026#34;$port/tcp\u0026#34; log_message \u0026#34;已允许 SSH 端口: $port\u0026#34; done # 启用 UFW ufw --force enable # 添加预定义的风险 IP log_message \u0026#34;添加预定义的风险 IP...\u0026#34; for ip in \u0026#34;${RISK_IPS[@]}\u0026#34;; do add_or_update_rule \u0026#34;$ip\u0026#34; 1 done # 添加预定义的 IDC 范围 log_message \u0026#34;添加预定义的 IDC 范围...\u0026#34; for range in \u0026#34;${IDC_RANGES[@]}\u0026#34;; do add_or_update_rule \u0026#34;$range\u0026#34; 1 done # 添加预定义的 Facebook IPv4 log_message \u0026#34;添加预定义的 Facebook IPv4 范围...\u0026#34; for range in \u0026#34;${FACEBOOK_IPV4[@]}\u0026#34;; do add_or_update_rule \u0026#34;$range\u0026#34; 1 done # 添加预定义的 Semrush 范围 log_message \u0026#34;添加预定义的 Semrush 范围...\u0026#34; for range in \u0026#34;${SEMRUSH_RANGES[@]}\u0026#34;; do add_or_update_rule \u0026#34;$range\u0026#34; 1 done # 下载和处理 Censys IP 列表 log_message \u0026#34;下载 Censys IP 列表...\u0026#34; if ! curl -s -o \u0026#34;$TEMP_FILE\u0026#34; \u0026#34;$CENSYS_IP_LIST_URL\u0026#34;; then log_message \u0026#34;错误：下载 IP 列表失败\u0026#34; exit 1 fi # 初始化 IP 列表文件 \u0026gt; \u0026#34;$IPv4_LIST\u0026#34; \u0026gt; \u0026#34;$IPv6_LIST\u0026#34; # 处理下载的 IP 列表 log_message \u0026#34;处理 IP 列表...\u0026#34; while IFS= read -r line; do line=$(echo \u0026#34;$line\u0026#34; | tr -d \u0026#39;\\r\u0026#39; | tr -d \u0026#39; \u0026#39;) [[ -z \u0026#34;$line\u0026#34; || \u0026#34;$line\u0026#34; =~ ^AS[0-9]+ ]] \u0026amp;\u0026amp; continue if [[ \u0026#34;$line\u0026#34; =~ ^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+(/[0-9]+)?$ ]]; then echo \u0026#34;$line\u0026#34; \u0026gt;\u0026gt; \u0026#34;$IPv4_LIST\u0026#34; elif [[ \u0026#34;$line\u0026#34; =~ : ]]; then echo \u0026#34;$line\u0026#34; \u0026gt;\u0026gt; \u0026#34;$IPv6_LIST\u0026#34; fi done \u0026lt; \u0026#34;$TEMP_FILE\u0026#34; # 处理 IPv4 规则 log_message \u0026#34;添加 Censys IPv4 规则...\u0026#34; while IFS= read -r subnet; do [[ \u0026#34;$subnet\u0026#34; =~ ^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+(/[0-9]+)?$ ]] \u0026amp;\u0026amp; add_or_update_rule \u0026#34;$subnet\u0026#34; 1 done \u0026lt; \u0026#34;$IPv4_LIST\u0026#34; # 查找 IPv6 规则插入位置 FIRST_V6_RULE=$(ufw status numbered | grep \u0026#39;(v6)\u0026#39; | head -n1 | awk -F\u0026#39;[][]\u0026#39; \u0026#39;{print $2}\u0026#39;) if [ -z \u0026#34;$FIRST_V6_RULE\u0026#34; ]; then FIRST_V6_RULE=$(ufw status numbered | grep -c \u0026#39;^\\[\u0026#39;) FIRST_V6_RULE=$((FIRST_V6_RULE + 1)) fi # 添加预定义的 Facebook IPv6 log_message \u0026#34;添加预定义的 Facebook IPv6 范围...\u0026#34; for range in \u0026#34;${FACEBOOK_IPV6[@]}\u0026#34;; do add_or_update_rule \u0026#34;$range\u0026#34; \u0026#34;$FIRST_V6_RULE\u0026#34; FIRST_V6_RULE=$((FIRST_V6_RULE + 1)) done # 处理 IPv6 规则 log_message \u0026#34;添加 Censys IPv6 规则...\u0026#34; while IFS= read -r subnet; do [[ \u0026#34;$subnet\u0026#34; =~ : ]] \u0026amp;\u0026amp; add_or_update_rule \u0026#34;$subnet\u0026#34; \u0026#34;$FIRST_V6_RULE\u0026#34; FIRST_V6_RULE=$((FIRST_V6_RULE + 1)) done \u0026lt; \u0026#34;$IPv6_LIST\u0026#34; # 重新加载 UFW log_message \u0026#34;重新加载 UFW...\u0026#34; ufw reload # 统计和清理 IPv4_COUNT=$(wc -l \u0026lt; \u0026#34;$IPv4_LIST\u0026#34;) IPv6_COUNT=$(wc -l \u0026lt; \u0026#34;$IPv6_LIST\u0026#34;) log_message \u0026#34;规则更新完成！\u0026#34; log_message \u0026#34;IPv4 规则数量: $IPv4_COUNT\u0026#34; log_message \u0026#34;IPv6 规则数量: $IPv6_COUNT\u0026#34; # 清理临时文件 rm -f \u0026#34;$TEMP_FILE\u0026#34; exit 0 ","date":"2025-02-28T15:17:30+08:00","permalink":"https://blog.lufei.de/p/423/","title":"一键屏蔽垃圾爬虫，包括Censys、facebook、SemrushBot、GPTbot"},{"content":" 系统：debian12，claw-jp测试通过\n前言 根据友佬@crzax的帖子 https://www.nodeseek.com/post-69126-1\n制作的一键开启zram脚本\n脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/zram_manager.sh \u0026amp;\u0026amp; chmod +x zram_manager.sh \u0026amp;\u0026amp; ./zram_manager.sh 预览：\n===== zRAM 管理工具 ===== 1. 安装并配置zRAM 2. 卸载zRAM 3. 查看系统状态 4. 验证zRAM运行状态 0. 退出 请选择操作 [0-4]: 查看状态：\n===== 系统状态 ===== \u0026gt;\u0026gt; 物理内存大小：0GB \u0026gt;\u0026gt; SWAP状态： NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2 /dev/zram0 partition 923M 0B 100 \u0026gt;\u0026gt; 块设备信息： NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS zram0 252:0 0 923M 0 disk [SWAP] vda 254:0 0 20G 0 disk ├─vda1 254:1 0 19.9G 0 part / ├─vda14 254:14 0 3M 0 part └─vda15 254:15 0 124M 0 part /boot/efi \u0026gt;\u0026gt; zRAM压缩算法： lzo lzo-rle lz4 lz4hc [zstd] \u0026gt;\u0026gt; zRAM大小： 923MB \u0026gt;\u0026gt; 内存使用情况： total used free shared buff/cache available Mem: 923Mi 266Mi 685Mi 496Ki 82Mi 657Mi Swap: 1.9Gi 0B 1.9Gi 按回车键继续... 解释：\n/swapfile file 1024M 0B -2 /dev/zram0 partition 923M 0B 100 默认使用zstd算法 100代表最高优先级，优先使用zram\nswap+zram的总和是 1.9G大小\n测压 安装 stress 工具\nsudo apt install stress 测试\nstress --vm 1 --vm-bytes 1G --timeout 60s 这将启动一个 stress 进程，它会尝试分配 1GB 的内存并保持该状态持续 60 秒\n因为我的物理内存是 1G, 所以我使用 1G 测试，当 zram 耗尽时，就会启用 swap\n可以另外开一个窗口，使用 top 命令查看系统状态\n分析\nzramctl --output-all 结果\nroot@s26417:~# zramctl --output-all NAME DISKSIZE DATA COMPR ALGORITHM STREAMS ZERO-PAGES TOTAL MEM-LIMIT MEM-USED MIGRATED MOUNTPOINT /dev/zram0 1G 61.4M 9.6M zstd 1 4326 10.5M 0B 13.2M 1.3K [SWAP] root@s26417:~# 分析\n从数据可以看出： 压缩效果很好：61.4MB 的数据压缩后只占用 9.6MB，压缩率约为 6.4:1 这个 zram 设备被配置为交换分区使用 系统实际使用了 13.2MB 内存来管理这个 zram 设备 这表明 zram 正在有效地工作，通过内存压缩来提供额外的交换空间。 完结\n","date":"2025-02-28T04:20:58+08:00","permalink":"https://blog.lufei.de/p/422/","title":"一键开启zram内存脚本，解决硬盘读写不佳(或容量小)的鸡鸡"},{"content":" 使用场景：一对密钥维护多台机子，备份好配置，被控小鸡密钥丢了也没事\n项目 Github: https://github.com/blacknon/lssh/\nwiki: https://github.com/blacknon/lssh/wiki/Config\n脚本 在debian11测试通过\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ilssh.sh \u0026amp;\u0026amp; chmod +x ilssh.sh \u0026amp;\u0026amp; ./ilssh.sh 配置 默认密钥登录\n参考模板: https://github.com/woniu336/open_shell/blob/main/.lssh.conf\n添加主机 [common] 代表通用配置，主机配置可以覆盖通用配置\nport = \u0026#34;22\u0026#34; #假设所有主机默认ssh端口为22，可以是其他端口 user = \u0026#34;root\u0026#34; #默认用户root key = \u0026#34;~/.ssh/id_rsa\u0026#34; #默认密钥路径 pre_cmd = \u0026#34;echo \u0026#39;SSH连接中。。。\u0026#39;\u0026#34; #连接前执行的命令，可以是其他命令 post_cmd = \u0026#34;find /root/log/lssh -mindepth 2 -maxdepth 2 -type d -name \u0026#39;logdir\u0026#39; -exec sh -c \u0026#39;cd \\\u0026#34;{}\\\u0026#34; \u0026amp;\u0026amp; ls -t | tail -n +2 | xargs rm -f\u0026#39; \\\\;\u0026#34; #退出后的命令 [server.主机昵称] 主机配置，主机昵称可以随意，不能是中文和重复，但前面必须加 server.\n例如：[server.node3] 、[server.node2] 按照以下写法逐个添加\n[server.node1] addr = \u0026#34;192.168.1.8\u0026#34; # ip地址 port = \u0026#34;33\u0026#34; #ssh端口号33，如果与通用配置一样，则可以为空 user = \u0026#34;root\u0026#34; #如果与通用配置一样，可以留空 pass = \u0026#34;\u0026#34; #主机登录密码，如果使用密钥连接，可以为空 note = \u0026#34;node1主机\u0026#34; #主机备注，方便查找 [includes] 配置，表示可以指定其他文件作为主机配置，写法与主机配置一样，一般不用\n#[includes] path = [ \u0026#34;~/.lssh.conf.include1\u0026#34; ,\u0026#34;~/.lssh.conf.include2\u0026#34; ] [log] 主机操作日志，所有在终端敲打的命令都会记录保存在 ~/log/lssh/日期_主机昵称/logdir目录\n[log] enable = true timestamp = true dirpath = \u0026#34;~/log/lssh/\u0026lt;Date\u0026gt;_\u0026lt;Hostname\u0026gt;/logdir\u0026#34; 这条命令表示只保留最新一个日志,在退出ssh连接时执行\npost_cmd = \u0026#34;find /root/log/lssh -mindepth 2 -maxdepth 2 -type d -name \u0026#39;logdir\u0026#39; -exec sh -c \u0026#39;cd \\\u0026#34;{}\\\u0026#34; \u0026amp;\u0026amp; ls -t | tail -n +2 | xargs rm -f\u0026#39; \\\\;\u0026#34; 使用方法 登录主机\nlssh #使用键盘上下方向键选择，也可以用鼠标，最上方可以输入关键字查找,回车登录 发送命令\nlssh hostname #可以按ALT+A全选，也可单独选一台主机，或者输入关键字查找 上面的命令只是例子，写法：lssh 后面加命令即可\n并行运行命令\nlssh -p uname -a 上面的命令只是例子，写法：lssh 后面加 -p 交互命令\nlssh -s scp命令\n写法: 远程路径前面加 r: 不能单独使用 lscp 命令\nlscp /path/to/123.txt r:/path/to/remote 例如：lcsp 123/uuu.txt r:./123 复制/root/123/uuu.txt到远程主机（选择后）\n本地复制到远程\n# lscp local =\u0026gt; remote(multiple) lscp /path/to/local... r:/path/to/remote 远程复制到本地（这里有个bug,会进入选择界面，直接回车）\n# lscp remote(multiple) =\u0026gt; local lscp r:/path/to/remote... /path/to/local 远程到远程（先选择第一个主机，再选择第二个主机）\n# lscp remote =\u0026gt; remote(multiple) lscp r:/path/to/remote... r:/path/to/local lsftp命令 推荐好用\nlsftp #可选择多台主机 本地到远程\nput /path/to/local ./ 例如 put 123/xx.md ./123 复制xx.md文件到远程主机/root/123目录下\n远程到本地\nget /path/to/remote ./ 更多玩法自行挖掘\n","date":"2025-02-19T16:11:02+08:00","permalink":"https://blog.lufei.de/p/421/","title":"简易跳板机工具lssh，附安装脚本"},{"content":"进入数据库命令行终端\nmysql -u root -p 查看所有数据库：\nSHOW DATABASES; 查看当前用户权限:\nSHOW GRANTS; 删除数据库，你可以使用以下 SQL 命令：\nDROP DATABASE 123; 使用以下命令来恢复数据库：\n# 进入备份目录 cd /www/backup/database # 导入数据库（使用 mysql 命令） mysql -u root -p 123 \u0026lt; 123.sql 验证表是否已经创建：\nmysql -u root -p 执行以下命令检查：\nUSE 123; SHOW TABLES; ","date":"2025-02-17T15:11:52+08:00","permalink":"https://blog.lufei.de/p/420/","title":"数据库导入设置"},{"content":"一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ophaproxy.sh \u0026amp;\u0026amp; chmod +x ophaproxy.sh \u0026amp;\u0026amp; ./ophaproxy.sh 验证\nulimit -n haproxy脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/bt-cf/haproxy/setup_haproxy.sh \u0026amp;\u0026amp; chmod +x setup_haproxy.sh \u0026amp;\u0026amp; ./setup_haproxy.sh 验证\nsudo haproxy -c -f /etc/haproxy/haproxy.cfg 可以根据服务器核心数设置nbthread 1参数，例如4核心，则是nbthread 4\n检查 HAProxy 服务状态：\nsystemctl status haproxy 重启\nsystemctl restart haproxy TCP蜜汁调优\nsudo sed -i \u0026#39;/tcp_init_cwnd/d\u0026#39; /etc/sysctl.conf sudo sysctl -p ssh连接优化\n# 配置 PAM if grep -q \u0026#34;^UsePAM\u0026#34; /etc/ssh/sshd_config; then sed -i \u0026#39;s/^UsePAM.*/UsePAM yes/\u0026#39; /etc/ssh/sshd_config else echo \u0026#34;UsePAM yes\u0026#34; \u0026gt;\u0026gt; /etc/ssh/sshd_config fi # 禁用 X11 转发 if grep -q \u0026#34;^X11Forwarding\u0026#34; /etc/ssh/sshd_config; then sed -i \u0026#39;s/^X11Forwarding.*/X11Forwarding no/\u0026#39; /etc/ssh/sshd_config else echo \u0026#34;X11Forwarding no\u0026#34; \u0026gt;\u0026gt; /etc/ssh/sshd_config fi # 禁用 DNS 查询 if grep -q \u0026#34;^UseDNS\u0026#34; /etc/ssh/sshd_config; then sed -i \u0026#39;s/^UseDNS.*/UseDNS no/\u0026#39; /etc/ssh/sshd_config else echo \u0026#34;UseDNS no\u0026#34; \u0026gt;\u0026gt; /etc/ssh/sshd_config fi # 检查配置 sshd -t \u0026amp;\u0026amp; systemctl restart sshd 以下是手动设置\n系统调优 swap调整,根据情况调整vm.swappiness数值\n# 1. 备份 sysctl.conf cp /etc/sysctl.conf /etc/sysctl.conf.bak # 2. 查找并显示所有包含 vm.swappiness 的文件 find /etc/sysctl.d/ /etc/sysctl.conf -type f -exec grep -l \u0026#34;vm.swappiness\u0026#34; {} \\; # 3. 从所有相关文件中删除 vm.swappiness 设置 sudo sed -i \u0026#39;/^vm.swappiness/d\u0026#39; /etc/sysctl.conf sudo find /etc/sysctl.d/ -type f -name \u0026#34;*.conf\u0026#34; -exec sed -i \u0026#39;/^vm.swappiness/d\u0026#39; {} \\; # 4. 添加新的配置 echo \u0026#34;vm.swappiness = 1\u0026#34; | sudo tee /etc/sysctl.d/99-swap.conf # 5. 重新加载所有配置 sudo sysctl --system 验证\nsysctl vm.swappiness 查询swap使用情况\nswapon --show vm.dirty_ratio和vm.dirty_background_ratio调整\n验证默认值\nsysctl vm.dirty_ratio sysctl vm.dirty_background_ratio 查询所有脏页相关参数\nsysctl -a | grep dirty 修改默认值\n# 备份原配置 cp /etc/sysctl.conf /etc/sysctl.conf.bak # 删除原配置文件中的相关参数 sed -i \u0026#39;/^vm.dirty_ratio/d\u0026#39; /etc/sysctl.conf sed -i \u0026#39;/^vm.dirty_background_ratio/d\u0026#39; /etc/sysctl.conf # 删除可能存在的旧dirty配置文件 rm -f /etc/sysctl.d/*dirty*.conf # 注释掉kernel.conf中的相关配置（如果存在） if [ -f /etc/sysctl.d/*kernel*.conf ]; then sed -i \u0026#39;/^vm.dirty_ratio/s/^/#/\u0026#39; /etc/sysctl.d/*kernel*.conf sed -i \u0026#39;/^vm.dirty_background_ratio/s/^/#/\u0026#39; /etc/sysctl.d/*kernel*.conf fi # 创建新的配置文件 cat \u0026lt;\u0026lt; EOF | sudo tee /etc/sysctl.d/99-dirty-ratio.conf # 内存脏页参数优化 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 EOF # 应用新配置 sudo sysctl --system # 验证配置 sysctl vm.dirty_ratio sysctl vm.dirty_background_ratio 参数调优\ncat \u0026gt; /etc/sysctl.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # 文件描述符限制 fs.file-max = 6815744 # TCP 基础优化参数 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_ecn = 0 net.ipv4.tcp_frto = 0 net.ipv4.tcp_mtu_probing = 0 net.ipv4.tcp_rfc1337 = 0 net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_adv_win_scale = 1 net.ipv4.tcp_moderate_rcvbuf = 1 # 网络缓冲区优化 net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 16384 33554432 net.ipv4.udp_rmem_min = 8192 net.ipv4.udp_wmem_min = 8192 # 网络转发设置 net.ipv4.ip_forward = 1 net.ipv4.conf.all.route_localnet = 1 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.default.forwarding = 1 # TCP keepalive 参数 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 # BBR 拥塞控制 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 连接队列优化 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 # TIME_WAIT 优化 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 # TCP 性能优化 net.ipv4.tcp_slow_start_after_idle = 0 EOF sysctl -p \u0026amp;\u0026amp; sysctl --system 或者（推荐）\ncat \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; | sudo tee /etc/sysctl.conf \u0026gt; /dev/null fs.file-max = 6815744 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_ecn = 0 net.ipv4.tcp_frto = 1 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_rfc1337 = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_adv_win_scale = 1 net.ipv4.tcp_moderate_rcvbuf = 1 net.ipv4.tcp_slow_start_after_idle = 0 net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.core.rmem_default = 87380 net.core.wmem_default = 87380 net.ipv4.tcp_rmem = 4096 87380 33554432 net.ipv4.tcp_wmem = 4096 87380 33554432 net.ipv4.udp_rmem_min = 16384 net.ipv4.udp_wmem_min = 16384 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_max_tw_buckets = 65536 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_mem = 786432 1048576 1572864 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.route_localnet = 0 net.ipv4.ip_forward = 1 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.default.forwarding = 1 net.ipv4.tcp_fastopen = 3 EOF sudo sysctl -p 修改 systemd 限制 mkdir -p /etc/systemd/system/haproxy.service.d/ \u0026amp;\u0026amp; echo -e \u0026#34;[Service]\\nLimitNOFILE=200000\u0026#34; \u0026gt; /etc/systemd/system/haproxy.service.d/limits.conf \u0026amp;\u0026amp; systemctl daemon-reload 添加 HAProxy 限制到 limits.conf cat \u0026gt; /etc/security/limits.conf \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; * soft nofile 200000 * hard nofile 200000 root soft nofile 200000 root hard nofile 200000 haproxy soft nofile 200000 haproxy hard nofile 200000 EOF 修改 profile：\necho \u0026#34;ulimit -n 200000\u0026#34; \u0026gt;\u0026gt; /etc/profile 确保 sshd_config 中启用 PAM：\nsed -i \u0026#39;s/#UsePAM yes/UsePAM yes/\u0026#39; /etc/ssh/sshd_config 应用更改\n# 重启 sshd 服务 systemctl restart sshd # 使 profile 更改生效 source /etc/profile # 验证设置 ulimit -n 重启\n# 重新加载 systemd 配置 systemctl daemon-reload # 重启 HAProxy 服务 systemctl restart haproxy 查询\nulimit -n 检测配置文件是否有效\nsudo haproxy -c -f /etc/haproxy/haproxy.cfg 重启\nsudo systemctl restart haproxy 检查 HAProxy 服务状态：\nsystemctl status haproxy 获取 HAProxy 主进程 PID\npidof haproxy 检查主进程（root）的限制\ncat /proc/45924/limits | grep \u0026#34;open files\u0026#34; 检查工作进程（haproxy）的限制\ncat /proc/45926/limits | grep \u0026#34;open files\u0026#34; 查看当前信息, 安装socat：\napt-get update apt-get install socat 查询\necho \u0026#34;show info\u0026#34; | socat unix-connect:/run/haproxy/admin.sock stdio CurrConns 当前连接数\nMaxConnRate 最大连接速率/每秒\nCumConns 累计连接数\n","date":"2025-02-15T19:56:23+08:00","permalink":"https://blog.lufei.de/p/418/","title":"haproxy调优记录"},{"content":" 一个基于 Cloudflare API 的智能 DNS 故障转移解决方案，当主服务器宕机时自动切换到备用 IP。\ncurl -sS -O https://raw.githubusercontent.com/woniu336/dns-update/main/dns_menu.sh \u0026amp;\u0026amp; chmod +x dns_menu.sh \u0026amp;\u0026amp; ./dns_menu.sh Github: https://github.com/woniu336/dns-update\n预览：\n┌─────────────────────────────────────────┐ │ Cloudflare 宕机切换IP脚本 │ │ 博客:https://woniu336.github.io │ ├─────────────────────────────────────────┤ │ 1. 安装依赖 │ │ 2. 设置 Cloudflare 配置 │ │ 3. 设置钉钉机器人配置 │ │ 4. 启动 DNS 更新脚本 │ │ 5. 查看运行状态 │ │ 6. 停止 DNS 更新脚本 │ │ 7. 切换 CDN 状态 │ │ 8. 设置服务器备注 │ │ 9. 设置脚本启动快捷键 │ │ 0. 退出 │ └─────────────────────────────────────────┘ 请选择操作 (0-9): 要点：使用cf全局密钥，服务器不能禁ping，因为使用ping检测机制，\nZone ID:\n钉钉通知：记得添加运行脚本的服务器ip\n通知预览：\n检测逻辑说明 脚本使用 ping 命令检测服务器状态，具体逻辑如下：\n每分钟进行一次检测 每次检测发送 5 个 ping 包 根据丢包率判断服务器状态： 丢包率 \u0026lt; 60%：认为服务器正常 丢包率 ≥ 60%：认为服务器异常 故障转移机制 连续失败计数：\n每次检测失败，连续失败计数 +1 检测成功时重置为 0 达到阈值（默认 3 次）时触发切换到备用 IP 恢复机制：\n使用备用 IP 期间继续监控主 IP 主 IP 恢复后开始累计连续成功次数 连续成功达到阈值（默认 2 次）时切回主 IP DNS 更新流程 触发切换条件后，通过 Cloudflare API 更新 DNS 记录 可以为主备 IP 分别配置不同的 CDN 状态 支持同时更新多个子域名 所有 DNS 变更都会通过钉钉机器人通知（如已配置） 通知机制 通过钉钉机器人发送以下事件通知：\n服务器宕机及切换到备用 IP 服务器恢复及切回主 IP 脚本运行异常 配置参数 关键参数说明：\nFAILURE_THRESHOLD = 3：触发切换的连续失败次数 SUCCESS_THRESHOLD = 2：触发恢复的连续成功次数 ping_count = 5：每次检测的 ping 包数量 timeout = 2：ping 超时时间（秒） 检测间隔：60 秒 多域名监控 多个域名监控方法：复制一份脚本到其他目录，重新设置一遍即可，不会造成冲突，因为pid不一样（python3）\n禁止运行 pkill -f dns_update.py 查看进程\nps -ef | grep \u0026#39;[p]ython3 dns_update.py\u0026#39; 或者\nps -ef | grep python3 使用建议 合理设置检测阈值：\n失败阈值太低可能导致频繁切换 失败阈值太高会延长响应时间 ","date":"2025-02-14T15:15:23+08:00","permalink":"https://blog.lufei.de/p/417/","title":"一个基于 Cloudflare API 的 DNS: 宕机自动切换ip脚本"},{"content":"推荐，一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ipwl.sh \u0026amp;\u0026amp; chmod +x ipwl.sh \u0026amp;\u0026amp; ./ipwl.sh 如果遇到错误提示：\nsudo mkdir -p /etc/mysql sudo touch /etc/mysql/mariadb.cnf sudo dpkg --configure -a 虽然后台可以设置特定ip访问，但是权限不同，我使用ufw方式限制。\n安全提醒：\n不要追求市面上最新版的开心版，各种安装开心版的脚本，有没有加料无法分辨。 不需要phpMyAdmin的，可以移除888端口 改默认22端口，使用密钥登录服务器 脚本：前提你已经安装并正确启用了ufw\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ufw-port.sh \u0026amp;\u0026amp; chmod +x ufw-port.sh \u0026amp;\u0026amp; ./ufw-port.sh 添加后台端口，添加可以访问的ip即可。\n手动设置 首先，删除现有的相关规则（假设规则编号是 36 和 37）：\nsudo ufw delete 36 sudo ufw delete 37 添加两个允许规则, 例如33333端口\nsudo ufw allow from 192.168.1.101 to any port 33333 sudo ufw allow from 192.168.1.102 to any port 33333 添加默认拒绝规则：\nsudo ufw deny 33333/tcp 确认规则配置：\nsudo ufw status numbered 完结\n","date":"2025-02-13T16:33:49+08:00","permalink":"https://blog.lufei.de/p/416/","title":"宝塔面板安全之后台访问限制"},{"content":"使用场景 场景1：凡是站点开启了cloudflare cdn的都适用。\n场景2：B机反代了A机，那么在A机添加B机白名单。\n场景3：套娃模式，B机反代了A机，C机转发了B机80、443端口，那么在B机添加C机白名单。\n场景4：仅特定ip访问：在没有开启cf代理的情况下，添加本地或者你FQ的ip，也就是仅仅你自己可以访问。\n脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cloudflare-only.sh \u0026amp;\u0026amp; chmod +x cloudflare-only.sh \u0026amp;\u0026amp; ./cloudflare-only.sh 使用要点：先执行菜单1，再执行菜单2，添加白名单。\n","date":"2025-02-13T14:57:39+08:00","permalink":"https://blog.lufei.de/p/415/","title":"网站安全之限制ip回源，附一键脚本"},{"content":" Google：Googlebot IP列表 Bing：Bingbot IP列表 ","date":"2025-02-13T13:45:04+08:00","permalink":"https://blog.lufei.de/p/413/","title":"主流搜索引擎的IP范围"},{"content":"前言 个人网站搭建在多数情况下，基本是单台服务器托管多个站点，\n长期以来我都是这样建站的，因为简单，但是\n源站直接暴露在公网，面临 DDoS、CC 攻击或恶意扫描的风险，以下有三种方案可供参考\n添加b服务器，做站点目录同步和数据库主从同步，域名解析到b\n添加b服务器，使用nginx反代源站\n不需要额外机子，源站开启cf代理，这种方式最便捷省事\n先说第一种，配置比较繁琐，这种方式我使用了一段时间，博客有介绍，但涉及到数据库的操作，容易误操作，弃之，\n第二种后面再说，先说第三种，cf虽然速度欠佳，但配置好缓存整体还是可以的，\n但是假设你有dmca数字千年版权法的困扰（尤其影视站），单台服务器是不行的，避免商家收到投诉停机。\n总之，你还是需要b服务器。那么可不可以结合一下，nginx反代的同时开启cf代理呢，答案是没问题\n优势： 提升安全性：源站 IP 隐匿，避免成为直接攻击目标。 低成本防护：结合 Cloudflare 免费防护，无需源站改造。 整活 debian11, 宝塔面板7.7.0\n在b服务器安装宝塔面板，推荐安装原版，可解除手机登录，不要安装什么开心版。推荐以下脚本安装\ncurl -sSO https://raw.githubusercontent.com/8838/btpanel-v7.7.0/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh 1，屏蔽手机号\nsed -i \u0026#34;s|bind_user == \u0026#39;True\u0026#39;|bind_user == \u0026#39;XXXX\u0026#39;|\u0026#34; /www/server/panel/BTPanel/static/js/index.js 2，删除强制绑定手机 js 文件\nrm -f /www/server/panel/data/bind.pl 3.安装好之后，仅仅需要安装nginx即可，需要到软件商店里查找nginx，然后安装1.27版本，使用编译的方式安装\n假设用户访问的域名是a.com, b.com是源站域名，b.com可开启cf代理（推荐），也可不开代理，但是需要配置好证书，\n然后添加a.com站点，\n接着使用以下配置覆盖nginx1.27配置，保存重启nginx。\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/nginx.conf\n接着使用以下配置覆盖a.com站点\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/http.conf\n把a.com替换成用户访问的域名，b.com替换成源站域名即可\n把a.com解析到这台机子ip，开启cf小黄云，搞定！\n实测和源站开启cf代理并无明显差异\n你可能觉得直接在抗版权的机子上建站，再开启cf代理不就完事了。这样的好处是不动源站，不想再繁琐的部署站点。\n但是还是回到前面说的隐藏源站，提高安全性的话题，最重要的一点是下面我将提到的进阶玩法，\n请不要觉得这样建站不正经，恰恰相反，cdn和负载均衡是不是更折腾，在你看来是不是更不正经都是瞎折腾，\n不管是cdn还是反代，原理都是差不多的。\n我们求稳的同时，也要居安思危，万一雷来了，好应付。\n那如果a.com不开cf代理呢？流程如下：\nnginx配置还是使用前面给的覆盖，a.com申请好证书，然后使用以下配置覆盖站点，\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/https.conf\n把a.com替换成主域名，b.com替换成源站域名,\n最后a.com解析到本机ip（即b服务器）\n进阶玩法 尽管开启cf代理带来了稳定性，但如果我想要追求速度呢，也就是源站开启cf代理，a.com直接解析到线路机。\n开整：\n同样在宝塔面板新建a.com，申请证书，推送使用以下脚本申请，适配宝塔面板,自动续期\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert.sh \u0026amp;\u0026amp; chmod +x ssl-cert.sh \u0026amp;\u0026amp; ./ssl-cert.sh mjj们手上或多或少都有gia cn2、cmin2, 4837机子吧，那么多流量用不完不就浪费了\n找一台线路机，根据以下流程：\n首先设置调优参数：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ophaproxy.sh \u0026amp;\u0026amp; chmod +x ophaproxy.sh \u0026amp;\u0026amp; ./ophaproxy.sh 然后执行haproxy转发，输入b服务器的ip即可\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/bt-cf/haproxy/setup_haproxy.sh \u0026amp;\u0026amp; chmod +x setup_haproxy.sh \u0026amp;\u0026amp; ./setup_haproxy.sh 会占用80和443端口，如需开放防火墙。\n接着使用以下配置覆盖nginx配置，\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/haproxy/nginx-s.conf\n注意：set_real_ip_from 3.3.3.3; 把3.3.3.3替换成 线路机ip\n然后使用以下配置覆盖a.com站点\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/haproxy/https-s.conf\n把a.com替换成主域名，b.com替换成源站域名\n重启nginx，最后把a.com解析到线路机ip，成功搞定！\n如果你有小鸡多，可以使用以上命令一键设置，a.com解析到多个小鸡ip上，如域名托管在dnspod，还能分运营商解析。\n请放心，以上玩法不会被薅羊毛，即使反代了cf，也是经过了sni验证，薅不到。\n以上的流程是：b反代了源站，线路机转发了b,可以多个线路机转发一个b，达到伪cdn的目的！\n注意事项 如果源站开启了cf代理，请加白反代ip\n","date":"2025-02-12T03:08:58+08:00","permalink":"https://blog.lufei.de/p/412/","title":"Nginx+CF+宝塔三剑客带你起飞"},{"content":"前言 我使用hugo搭建博客，记录一些技术、经验、踩坑，已有567天，博客部署在vercel，使用的是官方的cname：cname.vercel-dns.com，访问速度不佳，\n鉴于手头上小鸡多，何不把博客同步到vps，这样当本地写完文章，推送到Github的时候，同时也同步到了小鸡上。\n教程 原理：使用 rsync，配置 Actions 脚本同步\n1.安装 rsync\n登录远程服务器，键入以下命令来完成 rsync 的安装：\nsudo apt install rsync 2.新建 rsync 用户\nsudo adduser rsyncer 创建用户的途中会要求设置用户密码，其它配置使用默认值直接回车就行。\n然后会在/home目录生成一个rsyncer文件夹，记住这个文件夹。\n3.本地生成 SSH key\n然后在你的电脑上生成一个 Key 对，其中一个扩展名是.pub，是公钥。假设分别命名为：id_rsa 和 id_rsa.pub\nssh-keygen -q -t rsa -b 4096 -C \u0026#34;阿弥托福\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/id_rsa 打开 id_rsa.pub, 复制里面的内容，稍后需要用到，\n4.将公钥添加到vps 登录你的服务器，逐个输入以下代码\nsu rsyncer # 要输入密码 cd ~ mkdir -p www .ssh chmod 700 .ssh touch .ssh/authorized_keys chmod 600 .ssh/authorized_keys vim .ssh/authorized_keys # 用文本编辑器打开 `id_rsa.pub`，复制所有内容到这个文件里 上面一连串代码的目的是把公钥内容复制到authorized_keys文件里，\n或者你可以手动复制公钥到/home/rsyncer/.ssh/authorized_keys,前提是新建authorized_keys文件\ncd /home/rsyncer mkdir -p www .ssh chmod 700 .ssh touch .ssh/authorized_keys chmod 600 .ssh/authorized_keys 5.设置 Github仓库（重点）\n打开仓库设置，按下图把相关设置加入 secrets，\n地址：https://github.com/ 用户名 / 仓库名 /settings/secrets/actions\n解读：\nHONGKONG_PRIVATE_KEY ：你电脑上的id_rsa私钥内容 HONGKONG_SERVER_IP : 你的服务器IP地址 HONGKONG_USERNAME ：rsyncer #用户名就是前面新建的rsyncer用户 HONGKONG_WWW_PATH ：www #就是服务器同步的目录为www,保持不变 6.修改自动化 Actions 脚本\n在仓库 .github\\workflows\\main.yml 添加以下内容到末尾：\n- name: webfactory/ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.HONGKONG_PRIVATE_KEY }} - name: Publish blog to remote vps run: | rsync -av -e \u0026#34;ssh -o StrictHostKeyChecking=no -p 5522\u0026#34; --delete --exclude={\u0026#39;.git/\u0026#39;,\u0026#39;.github/\u0026#39;,\u0026#39;.user.ini\u0026#39;} public/ ${{ secrets.HONGKONG_USERNAME }}@${{ secrets.HONGKONG_SERVER_IP }}:${{ secrets.HONGKONG_WWW_PATH }} 注意：-p 5522 是服务器的 ssh 端口，记得修改成你自己的。其他保持不变 最后就是推送测试了，博客静态文件会同步到/home/rsyncer/www文件夹下，按照这套流程下来，应该没有问题了。然后新建站点，目录指向/home/rsyncer/www即可。\n我自己的博客main.yml：\nname: Auto Deploy hugo on: push: branches: - main # 更新触发的分支 jobs: build-deploy: runs-on: ubuntu-22.04 env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE20: true # ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - name: Check out repository code uses: actions/checkout@v4 with: submodules: recursive # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: \u0026#34;0.127.0\u0026#34; extended: true # 设置是否需要 extended 版本 - name: Cache resources # 缓存 resource 文件加快生成速度 uses: actions/cache@v4 with: path: resources key: ${{ runner.os }}-hugocache-${{ hashFiles(\u0026#39;content/**/*\u0026#39;) }} restore-keys: ${{ runner.os }}-hugocache- - name: Build Hugo static files # 部署静态资源 run: hugo --gc --minify - name: Deploy to Github Pages # 部署到Github Pages页面 uses: peaceiris/actions-gh-pages@v4 with: personal_token: ${{ secrets.PERSONAL_TOKEN }} # 两个仓库请使用 deploy_key external_repository: woniu336/woniu336.github.io # 如果在同一个仓库请注释 publish_dir: ./public # hugo 生成到 public 作为跟目录 publish_branch: main # Github Pages 所在分支 commit_message: ${{ github.event.head_commit.message }} - name: webfactory/ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.HONGKONG_PRIVATE_KEY }} - name: Publish blog to remote vps run: | rsync -av -e \u0026#34;ssh -o StrictHostKeyChecking=no -p 5522\u0026#34; --delete --exclude={\u0026#39;.git/\u0026#39;,\u0026#39;.github/\u0026#39;,\u0026#39;.user.ini\u0026#39;} public/ ${{ secrets.HONGKONG_USERNAME }}@${{ secrets.HONGKONG_SERVER_IP }}:${{ secrets.HONGKONG_WWW_PATH }} ","date":"2025-02-11T13:17:06+08:00","permalink":"https://blog.lufei.de/p/411/","title":"将托管在Github上的博客同步到vps教程"},{"content":" debian11 测试通过\n优化脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/menu.sh \u0026amp;\u0026amp; chmod +x menu.sh \u0026amp;\u0026amp; ./menu.sh 首先安装宝塔面板 以下脚本安装的是宝塔原版7.7.0版本，可以解除手机号登录\n安装bt curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tp.sh \u0026amp;\u0026amp; chmod +x tp.sh \u0026amp;\u0026amp; ./tp.sh 或者使用以下脚本\ncurl -sSO https://raw.githubusercontent.com/8838/btpanel-v7.7.0/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh 1，屏蔽手机号\nsed -i \u0026#34;s|bind_user == \u0026#39;True\u0026#39;|bind_user == \u0026#39;XXXX\u0026#39;|\u0026#34; /www/server/panel/BTPanel/static/js/index.js 2，删除强制绑定手机js文件\nrm -f /www/server/panel/data/bind.pl 使用编译的方式安装nginx1.27版本\n获取真实访客ip：\npip3 install requests wget https://raw.githubusercontent.com/woniu336/open_shell/main/update_cf_ips.py chmod +x update_cf_ips.py python3 update_cf_ips.py 定时任务\n(crontab -l ; echo \u0026#34;0 0 */15 * * python3 update_cf_ips.py \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 证书申请 适配宝塔面板，自动续期\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert.sh \u0026amp;\u0026amp; chmod +x ssl-cert.sh \u0026amp;\u0026amp; ./ssl-cert.sh 修改配置 注意：源站必须是443\na.com替换成用户访问的域名，b.com替换成源站域名\n用户访问的域名解析到反代ip，不是源站ip\nnginx使用以下配置，覆盖重启即可\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/nginx.conf\n443站点使用以下配置\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/https.conf\n80站点使用以下配置（开启cf cdn）\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/http.conf\n禁止使用ip访问站点 https://blog.taoshuge.eu.org/p/294/\nhaproxy转发 设置转发脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/bt-cf/haproxy/setup_haproxy.sh \u0026amp;\u0026amp; chmod +x setup_haproxy.sh \u0026amp;\u0026amp; ./setup_haproxy.sh 如果使用haproxy转发反代ip，使用以下配置\n注意：域名解析到haproxy ip 而不是反代ip\nhaproxy转发的方式需要使用不同的配置\na.com替换成用户访问的域名，b.com替换成源站域名\nnginx使用以下配置，覆盖重启即可\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/haproxy/nginx-s.conf\n注意：set_real_ip_from 3.3.3.3; 替换成haproxy ip(即转发ip)\n443站点使用以下配置\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/haproxy/https-s.conf\n80站点使用以下配置（开启cf cdn）\n注意：set_real_ip_from 3.3.3.3; 替换成haproxy ip(即转发ip)\nhttps://github.com/woniu336/open_shell/blob/main/bt-cf/haproxy/http-s.conf\n最后重启nginx\n\u0026hellip;\n","date":"2025-02-06T02:10:00+08:00","permalink":"https://blog.lufei.de/p/410/","title":"反代cloudflare之宝塔面板"},{"content":" 折腾了N个方案后，终于找到了这个堪称完美的建站架构！仅是我个人经验，你也许有更好的方法，也可以分享出来，此方案目前稳定运行，速度和安全都得到了极大提升。\n配置结构 原理：网站部署在netcup，找一台美西（bagevm）的落地鸡（即反代鸡）做反向代理，然后使用dmit的29.9线路鸡转发落地鸡的80和443端口\n线路鸡可以看成多个节点，多个节点转发落地鸡\n甚至可以DNS解析到三大运营商上，让吃灰小鸡不再只是探针上的点缀。\n项目地址 https://github.com/woniu336/cf-cdn-s\n💡 方案亮点 源站安全性MAX：CF 小云朵守护，黑客见了都摇头 高可用性：任何一层出问题都能快速切换，像变魔术一样简单 灵活扩展：手上闲置小鸡可以随时加入战斗，物尽其用！ 一键部署：从繁琐配置到一键搞定，解放双手 🆚 方案对比 原始方案：单机部署 优点：简单直接 缺点：一旦宕机就GG，重新配置太痛苦 吐槽：这就像把所有鸡蛋放在一个篮子里，太冒险了！ 对此方案展开一下：你可能是使用了线路好的机子，但是配置一般都低，流量也少，高配大流量需加钱。\n又或者你开启了cloudflare的小云朵，觉得这样最简单，没那么多事，但是速度嘛，稳定固然重要，但是我们还要追求速度。\n进阶方案：双机互备 优点：有了基础容灾能力 缺点：配置繁琐，速度提升有限 吐槽：好比给汽车加了个备胎，但还是跑不快\u0026hellip; 两台机子架构，网站部署在A鸡，B鸡做反向代理，反代鸡挂了，需要重新部署nginx，配置站点文件，有些繁琐，\n或者你反代鸡开启了cloudflare的小云朵，但是嘛速度又没有了。\n我的方案 源站（配置 CF 小云朵）：坚如磐石的基础 美西反代：可靠的中转枢纽 线路机转发：分布式加速网络 基础配置三台机子起，网站部署在nc，或者ovh、hz这些公认稳定的商家，你需要至少两个域名，\n例如，111.xyz域名解析到源站，开启cloudflare小云朵，这是第一层，起到了保护网站的作用！\n然后找一台普通线路的美西机子做反向代理，为什么是美西，这个要看你的线路鸡是哪里的，如果你使用的是香港线路鸡转发，那么反代鸡可以是香港的普通线路，接着，线路鸡使用haproxy转发反代鸡的80和443端口，222.com（用户访问的域名）解析到线路鸡。\n你可能会问：优势在哪，不是更繁琐了，让我介绍介绍。\n首先你的源站开启了小云朵，稳定性大大增加，然后反代鸡的普通线路流量又多， 但是如果反代鸡挂了怎么办，这个很好解决，事先备份好证书和站点配置文件，换一台机子重新安装nginx，重启即可还原。 线路鸡起到了加速的作用，一台线路鸡挂了，可以在新的机子上一键部署，非常简单就搞定了。线路鸡流量少，但是也阻止不了你手上小鸡多啊， 多个小鸡转发80和443到反代鸡上，流量均分。 🚀 部署教程 首先你需要一个解析到网站的垃圾域名，并托管在cf，开启了小云朵（cdn），这个域名不是用户访问的域名，我管这个域名叫后端域名，所以，这一步就是那么简单。 举例，后端域名：111.xyz（后端域名），222.com（用户访问的域名）\n找两台机子，普通机和线路机。 普通机做反向代理，首先要安装nginx，务必使用我的一键安装nginx脚本，因为nginx配置繁琐，稍有差池就会出错，\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/cf-cdn-s.sh \u0026amp;\u0026amp; chmod +x cf-cdn-s.sh \u0026amp;\u0026amp; ./cf-cdn-s.sh 选择菜单2安装nginx。\n然后就是证书的申请，注意使用用户访问的域名来申请证书。\n下载配置文件，菜单3\n配置站点。\n获取用户真实ip\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/update_nginx.sh \u0026amp;\u0026amp; chmod +x update_nginx.sh \u0026amp;\u0026amp; ./update_nginx.sh 输入线路机ip地址，可以是多个，\n安装haproxy转发\n在线路机上安装haproxy，\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/setup_haproxy.sh \u0026amp;\u0026amp; chmod +x setup_haproxy.sh \u0026amp;\u0026amp; ./setup_haproxy.sh 输入反代机，也即是普通线路机ip。\n最后，222.com解析到线路机ip上。\n完结撒花！🎉\n","date":"2025-02-02T15:34:44+08:00","permalink":"https://blog.lufei.de/p/408/","title":"我找到了建站的绝佳方案"},{"content":" 原理：源站开启cf 小云朵，落地机反代源站，线路机中转落地机\n注意：源站域名要在cf后台关闭自动程序，waf放行落地机ip\n项目：https://github.com/woniu336/cf-cdn-s\n项目2：https://github.com/woniu336/cf-cdn\n优化脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/menu.sh \u0026amp;\u0026amp; chmod +x menu.sh \u0026amp;\u0026amp; ./menu.sh 放行端口\nufw allow 80/tcp ufw allow 443/tcp 应用\nsudo ufw reload 查看规则\nsudo ufw status numbered 删除缓存\nsudo rm -rf /usr/local/nginx/cache/proxy/* 快速部署 在反代服务器上执行：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/cf-cdn-s.sh \u0026amp;\u0026amp; chmod +x cf-cdn-s.sh \u0026amp;\u0026amp; ./cf-cdn-s.sh 先安装nginx，如果要添加www，在配置文件这样表示：server_name 123.cc www.123.cc;\n查看缓存大小：\ndu -sh /usr/local/nginx/cache/proxy 证书配置 单账号配置 如果所有域名都在同一个 Cloudflare 账号下：\n创建凭证文件： mkdir -p /root/.secrets \u0026amp;\u0026amp; nano /root/.secrets/cloudflare.ini 添加 API Token： dns_cloudflare_api_token = 你的cloudflare_api_token 多账号配置 如果使用多个 Cloudflare 账号：\n为特定域名创建配置文件： mkdir -p /root/.secrets \u0026amp;\u0026amp; nano /root/.secrets/example.com.ini 添加对应账号的 API Token： dns_cloudflare_api_token = cloudflare_api_token 设置权限 对所有配置文件应用安全权限：\nchmod 600 /root/.secrets/*.ini 获取真实IP 开启了cf cdn如何获取真实ip\npip3 install requests wget https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/update_cloudflare_ips.py chmod +x update_cloudflare_ips.py python3 update_cloudflare_ips.py 定时任务\n(crontab -l ; echo \u0026#34;0 0 */15 * * python3 update_cloudflare_ips.py \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 重启 Nginx\nsudo nginx -t \u0026amp;\u0026amp; sudo systemctl restart nginx HAProxy 配置 注意：先获取真实ip,在来安装haproxy,顺序不能颠倒\n快速安装 在转发服务器上执行：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/setup_haproxy.sh \u0026amp;\u0026amp; chmod +x setup_haproxy.sh \u0026amp;\u0026amp; ./setup_haproxy.sh 手动配置 安装 HAProxy： sudo apt update \u0026amp;\u0026amp; sudo apt install haproxy -y 备份原配置： sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak 下载并修改配置： sudo curl -sS -o /etc/haproxy/haproxy.cfg https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/haproxy.cfg sudo sed -i \u0026#39;s/8\\.8\\.8\\.8/你的IP/g\u0026#39; /etc/haproxy/haproxy.cfg 验证并重启： sudo haproxy -c -f /etc/haproxy/haproxy.cfg sudo systemctl restart haproxy 开机自启 sudo systemctl enable haproxy 备份和还原 备份 在反代服务器上执行：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/backup-nginx-ssl.sh \u0026amp;\u0026amp; chmod +x backup-nginx-ssl.sh \u0026amp;\u0026amp; ./backup-nginx-ssl.sh 还原步骤 将备份文件复制到目标服务器 解压备份： tar -xzf backup文件名.tar.gz -C /tmp/restore/ 还原文件： sudo cp -r /tmp/restore/letsencrypt/* /etc/letsencrypt/ sudo cp -r /tmp/restore/nginx/conf.d/* /etc/nginx/conf.d/ sudo cp -r /tmp/restore/nginx/certs/* /etc/nginx/certs/ sudo cp -r /tmp/restore/nginx/templates/* /etc/nginx/templates/ sudo cp /tmp/restore/nginx/nginx.conf /etc/nginx/ 设置权限： sudo chown -R root:root /etc/letsencrypt sudo chmod -R 600 /etc/nginx/certs/* sudo chmod 644 /etc/nginx/nginx.conf sudo chmod -R 644 /etc/nginx/conf.d/* 重启 Nginx： sudo systemctl restart nginx 注意：还原前请确保已安装 Nginx 并备份原有配置。\n手动申请证书 certbot certonly -d \u0026#34;*.xxx.com\u0026#34; --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory 续订\ncertbot renew ","date":"2025-01-29T03:27:09+08:00","permalink":"https://blog.lufei.de/p/407/","title":"cloudflare + 反向代理 + haproxy"},{"content":" 精心制作的专门反代开启了cf小云朵的站点，当然也可以直接反代源站， 不需要知道源站ip，多个后端的玩法才需要ip。 理论上可以反代任何网站，只要对方不屏蔽你\n脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/menu.sh \u0026amp;\u0026amp; chmod +x menu.sh \u0026amp;\u0026amp; ./menu.sh 脚本特色 使用dns方式申请证书，支持多域名，自动续期\n一键安装部署nginx，默认配置经过精心优化\n默认开启了proxy缓存，速度飞跃\n隐藏了某些响应头信息，出于安全考虑\n开启了sni支持,避免被优选拿去干正经事\n还有很多就不列举了。。。\n脚本截图\nSSL证书管理菜单 ================================================= 1. 申请SSL证书 2. 查看证书状态 3. 手动续期证书 0. 返回主菜单 ================================================= 请输入选项 [0-3]: nginx\nNginx 管理脚本 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1) 安装 Nginx 2) 卸载 Nginx 3) 重启 Nginx 4) 查看 Nginx 状态 0) 退出脚本 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 请输入选项 [0-4]: 反向代理\n================================================= 反向代理管理菜单 ================================================= 1. 反代 Cloudflare 2. 反代源站 3. 删除反代 0. 返回主菜单 ================================================= 请输入选项 [1-4]: 直接进入正题：\n假设：\n你的源站放在ovh或者nc杜甫上，奈何性能与速度不可兼得，你打开了cf的小云朵，勉强能用了。\n现在你有一台三网优化的小鸡，你只需要三步就可以反代源站，源站依然开启cf小云朵，什么都不用改动。\n既保护了源站，又得到了提速\n步骤：\n找一个便宜或者永久域名（eu.org），开一台性价比不错的杜甫，在上面搭建网站，ip解析到xx.eu.org，开启小云朵。\n登录一台三网优化机，使用我精心制作的脚本,开启提速之旅。\n进阶玩法：\n把网站部署到两台杜甫上，做好数据库主从设置，rsync同步，我博客有这方面的教程，推荐使用amh面板，有插件方便布置。\n使用我的脚本开启多源站反向代理，达到轻量级负载均衡作用，其中一台宕机了，自动切换备用顶上。\n更多玩法，多台小鸡反代，或者使用haproxy做负载均衡，或者dns分运营商解析\n使用步骤 首先是申请证书，需要域名托管在cf,申请一个仅有dns权限的令牌： 安装nginx（菜单2）\n添加反向代理 （菜单3）\n至此完结撒花~~\n","date":"2025-01-24T23:24:18+08:00","permalink":"https://blog.lufei.de/p/406/","title":"反向代理开启了cloudflare cdn的站点玩法"},{"content":"haproxy主要是用于负载均衡的，在并发和性能方面优于nginx，当然用来做转发也是他的特色之一！\n我用过iptables、nftables，Realm,这三个转发脚本我都有制作，至于谁更优秀，没有专业测试过，大差不差。\n后期我可能倾向于haproxy，因为添加多个后端实在太简单了~\n快速部署 使用以下命令一键部署 HAProxy 管理脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/haproxy_manager.sh \u0026amp;\u0026amp; chmod +x haproxy_manager.sh \u0026amp;\u0026amp; ./haproxy_manager.sh 管理界面 脚本提供直观的命令行界面：\n╔════════════════════════════════╗ ║ HAProxy 管理脚本 ║ ╠════════════════════════════════╣ ║ 1. 安装 HAProxy ║ ║ 2. 添加端口转发 ║ ║ 3. 查看现有转发 ║ ║ 4. 编辑配置文件 ║ ║ 5. 卸载 HAProxy ║ ║ 0. 退出 ║ ╚════════════════════════════════╝ 获取真实客户端 IP 在使用 HAProxy 作为反向代理时，后端服务器的日志默认只能看到 HAProxy 的 IP。\n如果你不需要查看日志，不需要统计，可以忽略以下内容。 如果你要获取真实的客户端 IP，需要进行以下配置： 1. HAProxy 配置 在 /etc/haproxy/haproxy.cfg 的后端配置中添加 send-proxy 参数，例如转发80端口\nbackend servers_80 server server1 后端ip:80 check send-proxy server server2 后端ip2:80 check send-proxy 配置后重启 HAProxy：\nsystemctl restart haproxy 2. 后端 Nginx 配置 打开你后端的站点，根据端口类型选择相应配置：\nHTTP（80端口）：\nlisten 80 proxy_protocol; set_real_ip_from 你的HAProxy服务器IP; real_ip_header proxy_protocol; 例如：\nHTTPS（443端口）：\nlisten 443 ssl proxy_protocol; set_real_ip_from 你的HAProxy服务器IP; real_ip_header proxy_protocol; 例如：\n完成配置后重启 Nginx：\nsystemctl restart nginx 3.开启了cf的cdn如何获取真实ip 如果是宝塔面板，建议放在以下位置\nmkdir -p /www/server/panel/vhost/nginx/cf_real_ip nano /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf 如果是amh\nmkdir -p /home/wwwroot/lnmp01/vhost/cf_real_ip nano /home/wwwroot/lnmp01/vhost/cf_real_ip/cloudflare.conf 在 cloudflare.conf 中添加所有 Cloudflare IP：\n注意：需要额外添加你的HAProxy服务器IP\n# Cloudflare IP ranges # HAProxy IP set_real_ip_from 你的HAProxy服务器IP; # Cloudflare IPv4 set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # Cloudflare IPv6 set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; 然后在你的网站配置文件中引用这个文件\n注意：只有一个real_ip_header\nserver { listen 80 proxy_protocol; server_name 1234.com; # 引入 Cloudflare IP 配置 include /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf; # 设置真实 IP 头 real_ip_header CF-Connecting-IP; # ... 其他配置 ... } 如果是 HTTPS：\nserver { listen 443 ssl proxy_protocol; server_name 1234.com; # SSL 配置 # ... # 引入 Cloudflare IP 配置 include /www/server/panel/vhost/nginx/cf_real_ip/cloudflare.conf; # 设置真实 IP 头 real_ip_header CF-Connecting-IP; # ... 其他配置 ... } 测试并重启\nnginx -t systemctl restart nginx 注意事项 确保在启用 PROXY 协议前，所有相关服务器都已正确配置 防火墙规则要放行相应端口 ","date":"2025-01-24T00:54:55+08:00","permalink":"https://blog.lufei.de/p/405/","title":"haproxy端口转发脚本"},{"content":"斯巴达西雅图： 电信：延迟表现中等，稳定性较好\n联通：延迟较为稳定，表现最好\n移动：延迟普遍偏高，波动较大\n总结：对延迟要求不苛刻的联通用户，电信用户其次,不建议移动用户使用\n================================================\nv.ps猫彦祖： 适合所有用户： 三网表现都非常优秀 丢包率全部为0% 延迟稳定，波动小\n总结：三网优秀\nclaw-日本： 电信：仍保持较低延迟，但丢包率上升\n联通：表现明显恶化，不再推荐使用\n移动：严重恶化，不建议使用\n总结：该机器性能明显下滑，已不再适合作为主力使用，建议仅作为电信用户的备用节点。\n================================================\nvmiss-伦敦9929 电信：延迟良好，丢包率低，表现稳定\n联通：延迟优秀，零丢包，\n移动：延迟普遍较高\n总结：首选联通用户，电信用户也可以获得不错的体验，但移动用户建议避开\n==================\n总结建议： 电信用户 → 选择v.ps猫彦祖或vmiss伦敦\n联通用户 → 选择vmiss伦敦或v.ps猫彦祖\n移动用户 → 首选v.ps猫彦祖\n特别提醒：斯巴达西雅图整体表现一般，建议作为备用节点使用。\n","date":"2025-01-18T23:53:40+08:00","permalink":"https://blog.lufei.de/p/404/","title":"斯巴达、猫彦祖v.ps、claw-jp、vmiss-英国，高峰期表现"},{"content":"查看缓存大小：\ndu -sh /usr/local/nginx/cache/proxy 下载清理缓存脚本\ncd /usr/local/bin \u0026amp;\u0026amp; curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_nginx_cache.sh \u0026amp;\u0026amp; chmod +x clean_nginx_cache.sh 定时任务: 每周日凌晨3点执行\n(crontab -l ; echo \u0026#34;0 3 * * 0 /usr/local/bin/clean_nginx_cache.sh\u0026#34;) | crontab - 日志分析，包含统计网站的总数据流量、请求数、和各个IP的具体数\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/log_analysis.sh \u0026amp;\u0026amp; chmod +x log_analysis.sh \u0026amp;\u0026amp; ./log_analysis.sh 开启了cf cdn如何获取真实ip\npip3 install requests wget https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/update_cloudflare_ips.py chmod +x update_cloudflare_ips.py python3 update_cloudflare_ips.py 定时任务\n(crontab -l ; echo \u0026#34;0 0 */15 * * python3 update_cloudflare_ips.py \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - RPS分析\nwget https://raw.githubusercontent.com/woniu336/cf-cdn-s/main/analyze_rps.py 检测\npython3 analyze_rps.py /data/wwwlogs/111.com.access.log 按小时统计今天的访问量\nawk \u0026#39;{split($4,a,\u0026#34;:\u0026#34;); print a[2]}\u0026#39; /data/wwwlogs/a.com.access.log | sort | uniq -c 查看最近一小时的 QPS\nawk -v now=\u0026#34;$(date +%H)\u0026#34; \u0026#39;$4~now{count++}END{print \u0026#34;最近一小时平均 QPS:\u0026#34;, count/3600}\u0026#39; /data/wwwlogs/a.com.access.log 假设今天是 3月15日\nawk \u0026#39;/15\\/Mar\\/2024:2[0-2]/{count++}END{print \u0026#34;总请求数:\u0026#34;, count; print \u0026#34;平均 QPS:\u0026#34;,count/10800}\u0026#39; /data/wwwlogs/a.com.access.log 或者查看最近24小时的统计\nawk \u0026#39;BEGIN{count=0} {count++} END{print \u0026#34;24小时总请求数:\u0026#34;, count; print \u0026#34;平均 QPS:\u0026#34;, count/86400}\u0026#39; /data/wwwlogs/a.com.access.log 实时监控：\nwatch -n 1 \u0026#34;netstat -n | awk \u0026#39;/^tcp/ {++S[\\$NF]} END {for(a in S) print a, S[a]}\u0026#39;\u0026#34; 检查 Nginx 状态和权限\nsudo systemctl status nginx # 检查 Nginx 服务状态，特别是是否有 PID 文件相关警告 ps aux | grep nginx # 查看 Nginx 进程是否正常运行，并检查其权限 ls -l /run/nginx/nginx.pid # 查看 Nginx 的 PID 文件权限是否正确 重启服务并观察日志\nsudo systemctl daemon-reload # 重新加载 Systemd 配置文件 sudo systemctl restart nginx # 重启 Nginx 服务 sudo journalctl -xe # 查看系统日志，检查是否有与 Nginx 相关的错误 查找进程和文件路径\nps -ef | grep nginx # 确认 Nginx 的进程是否在运行 find / -name nginx # 在文件系统中查找 Nginx 的相关文件或路径 测试 Nginx 配置文件是否正确\nsudo nginx -t 停止nginx\nsudo systemctl stop nginx 重启 Nginx 来应用新配置\nsudo systemctl restart nginx \u0026amp;\u0026amp; nginx -t 测试一下配置是否生效\ncurl -v http://127.0.0.1/ 检查一下 Nginx 是否真的在监听 80 端口\nnetstat -tlnp | grep nginx ","date":"2025-01-14T02:56:31+08:00","permalink":"https://blog.lufei.de/p/403/","title":"Nginx 常用命令和操作"},{"content":" 假设反代IP是9.9.9.9，加速域名是789.com, 注意：不是源站域名\n测试正确域名\ncurl --tlsv1.2 https://9.9.9.9:443 --resolve 789.com:443:9.9.9.9 --insecure -H \u0026#34;Host: 789.com\u0026#34; -v 或者\ncurl --tls-max 1.2 https://789.com:443 --connect-to 789.com:443:9.9.9.9:443 --insecure -v 返回网页内容\n测试错误域名\n提示：如果源站未启用http/2，需要添加--http1.1参数，启用了是类似这样的： listen 443 ssl http2;\ncurl --tlsv1.2 https://9.9.9.9:443 --resolve wrong.domain.com:443:9.9.9.9 --insecure -H \u0026#34;Host: wrong.domain.com\u0026#34; -v 添加 \u0026ndash;http1.1 参数的命令\ncurl --tlsv1.2 --http1.1 https://9.9.9.9:443 --resolve wrong.domain.com:443:9.9.9.9 --insecure -H \u0026#34;Host: wrong.domain.com\u0026#34; -v 或者\ncurl --tls-max 1.2 --http1.1 https://wrong.domain.com:443 --connect-to wrong.domain.com:443:9.9.9.9:443 --insecure -v 服务器返回空响应\nConnection #0 to host 9.9.9.9 left intact curl: (52) Empty reply from server\n","date":"2025-01-13T02:10:12+08:00","permalink":"https://blog.lufei.de/p/402/","title":"反向代理SNI验证测试"},{"content":"原因 在备份站点的时候如果开启MySQL二进制日志，备份压缩包会比较大，而且很占磁盘空间\n如果没有数据库主从复制需求，或者数据库分析，那么可以关闭二进制日志\n设置可执行目录\namh面板需要设置可执行目录才能执行脚本，例如将/root/test/设置为可执行目录\nmkdir -p /root/test/ amh amcrontab set_sh /root/test/ 脚本 下载脚本到可执行目录（注意mysql版本必须是：mysql-generic-5.7 ）\ncd /root/test/ wget -O clean_mysql_logs.sh https://raw.githubusercontent.com/woniu336/open_shell/main/clean_mysql_logs.sh chmod +x clean_mysql_logs.sh 脚本功能：删除旧的二进制日志，保留最新的5个日志\n添加定时任务\n后台添加定时任务：确保将脚本下载到可执行目录/root/test,这是amh特色\namh amcrontab run_sh /root/test/clean_mysql_logs.sh ","date":"2025-01-12T16:29:40+08:00","permalink":"https://blog.lufei.de/p/401/","title":"AMH清理数据库日志"},{"content":" 站点使用了redis6.2作为缓存，在还原数据时出现网站打开错误，以下是解决方案\n错误提示： MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.\n简单来说：Redis 无法保存数据快照(RDB)到磁盘，导致所有写入命令被禁用。\n临时生效 当 Redis 在保存数据快照（RDB）失败时，设置 stop-writes-on-bgsave-error no 表示允许 Redis 继续接受写入操作，但代价是可能会丢失一些数据。\n查找 redis-cli 的位置\nfind / -name redis-cli 为了方便以后使用，建议创建软链接：\nln -s /usr/local/redis-6.2/bin/redis-cli /usr/bin/redis-cli 8.0版本\nln -s /usr/local/redis-8.0/bin/redis-cli /usr/bin/redis-cli 删除错误的软链接\nrm /usr/bin/redis-cli 连接到 Redis CLI\nredis-cli 允许 Redis 在保存快照失败时继续写入数据。\nconfig set stop-writes-on-bgsave-error no 验证设置\nconfig get stop-writes-on-bgsave-error 按 CTRL+D 退出\nCTRL+D # 按键盘CTRL+D退出 永久生效 查找 redis.conf 位置\nfind / -name redis.conf 编辑conf\nsed -i \u0026#39;s/^stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/\u0026#39; /usr/local/redis-6.2/redis.conf 查看配置\ngrep -v \u0026#34;^#\u0026#34; /usr/local/redis-6.2/redis.conf | grep -v \u0026#34;^$\u0026#34; 持久化检查 redis-cli CONFIG GET save 出现\n1) \u0026#34;save\u0026#34; 2) \u0026#34;3600 1 300 100 60 10000\u0026#34; 触发条件较高：\n需要3600秒内改动1次，或\n300秒内改动100次，或\n60秒内改动10000次\n检查保存状态\nredis-cli INFO persistence 查看当前 Redis 使用的数据目录配置\nredis-cli CONFIG GET dir 查看 dump 文件名配置\nredis-cli CONFIG GET dbfilename ","date":"2025-01-11T20:58:13+08:00","permalink":"https://blog.lufei.de/p/400/","title":"amh还原站点出现redis问题"},{"content":"一个优雅的 VPS 到期日期监控工具，再也不用担心 VPS 续费超期了！通过 Telegram 机器人推送到期提醒，轻松管理多台服务器。\n之前发过帖子，功能上还不太行，这次重新打造\n项目： https://github.com/woniu336/vps-date\n特色功能 🤖 支持 Telegram 机器人通知（3天内到期触发通知） ⏰ 自动定时检查（每天早8点和晚8点） 📊 支持批量管理多台服务器 🔔 灵活的提醒时间配置，按固定日期还是每月循环 💻 支持 GitHub Actions 自动运行 🔔多币种汇率更新，免费的API，不要频繁使用 快速开始 下载项目到本地，双击运行 (本地要安装python)\nrun_manager.bat ⚠️ 注意：项目有一个bug，vps名称不能用中文，使用中文脚本会报错，你可以在设置好以后退出脚本，在index.html改成中文名称即可，\n后续不影响使用\n⚠️ 前端可点击index.html查看，脚本集成了一键推送到Giuhub\n有两个地方需要手动修改，\n修改vps_manager.py 第53行，修改成你的监控地址，作用是仅在tg通知底部展示 把config.example.json重命名为config.json，目的是测试通知，注意只有即将到期才会触发通知 3. 通知部署 Fork 本仓库 在仓库设置中添加以下 Secrets： TELEGRAM_BOT_TOKEN: 您的 Telegram 机器人 token TELEGRAM_CHAT_ID: 您的 Telegram 聊天 ID Actions 会自动在每天早8点和晚8点（北京时间）运行检查 4. 钉钉通知 下载ding_monitor.py到服务器上运行即可\nwget https://raw.githubusercontent.com/woniu336/vps-date/main/ding_monitor.py 赋予执行权限\nchmod +x ding_monitor.py 安装依赖 pip install requests 修改脚本，添加钉钉通知\n测试 python3 ding_monitor.py 后台运行 nohup python3 ding_monitor.py \u0026gt; ding_monitor.out 2\u0026gt;\u0026amp;1 \u0026amp; 查看监控 ps aux | grep ding_monitor.py 停止进程\nkill \u0026lt;进程ID\u0026gt; 使用说明 运行 run_manager.bat 管理您的 VPS 信息 运行 check_expiry.bat（Windows）快速检查到期状态 查看 vps_monitor.log 了解运行日志 通过 index.html 可视化查看 VPS 状态 ","date":"2025-01-11T01:49:17+08:00","permalink":"https://blog.lufei.de/p/399/","title":"一个优雅的 VPS 到期日期监控工具"},{"content":" 利用rclone结合cloudflare r2，实现amh面板定时备份或者还原站点所有数据\n定时备份，保留本地和r2最新10个备份文件 还原：可以设置定时还原最新的备份 安装 rclone sudo -v ; curl https://rclone.org/install.sh | sudo bash 编辑 rclone.conf 配置\nmkdir -p /home/www/.config/rclone/ touch /home/www/.config/rclone/rclone.conf nano /home/www/.config/rclone/rclone.conf 填入以下信息 (改成你的r2密钥)\n[r2] type = s3 provider = Cloudflare access_key_id = xxxx secret_access_key = xxxx region = auto endpoint = https://xxxxxx.r2.cloudflarestorage.com 复制到root目录\nmkdir -p /root/.config/rclone/ cp /home/www/.config/rclone/rclone.conf /root/.config/rclone/ 设置可执行目录 amh面板需要设置可执行目录才能执行脚本，例如将/root/test/设置为可执行目录\nmkdir -p /root/test/ amh amcrontab set_sh /root/test/ 下载脚本到可执行目录\ncd /root/test/ wget -O backup_amh.sh https://raw.githubusercontent.com/woniu336/open_shell/main/backup_amh.sh wget -O restore_amh.sh https://raw.githubusercontent.com/woniu336/open_shell/main/restore_amh.sh chmod +x backup_amh.sh chmod +x restore_amh.sh 修改备份目录和远程路径\nnano backup_amh.sh 然后修改\nnano restore_amh.sh 添加任务 后台添加计划任务: 注意脚本在/root/test目录\n一键备份命令：\namh amcrontab run_sh /root/test/backup_amh.sh 一键还原命令：\namh amcrontab run_sh /root/test/restore_amh.sh 其他命令 遇到备份出错的极端情况可以停止进程\n查看进程\nps aux | grep backup_amh.sh 终止进程\npkill -9 -f backup_amh.sh ","date":"2025-01-09T06:38:20+08:00","permalink":"https://blog.lufei.de/p/398/","title":"AMh备份数据到网盘"},{"content":" 如果开启了cf的cdn,需要获取到用户真实ip,则需要用到nginx的realip模块\n我使用的是nginx-generic-1.24通用版\n在amh中，nginx-generic-1.24通用版没有编译realip模块\n安装amh\nwget https://dl.amh.sh/amh.sh \u0026amp;\u0026amp; bash amh.sh nginx-generic-1.24,mysql-generic-5.7,php-generic-7.4 Nginx编译 首先查询nginx.conf所在目录\nfind /etc/nginx /usr/local/nginx* /usr/local/etc/nginx -name nginx.conf 2\u0026gt;/dev/null 下载 Nginx 源代码:\nwget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 配置编译选项:\n./configure --prefix=/usr/local/nginx-generic-1.24 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module 编译并安装:\nmake sudo make install 重新加载 Nginx 配置，或者后台重启nginx\namh nginx reload PATH 环境变量 将 Nginx 的 sbin 目录添加到 PATH 环境变量 (可选):\n编辑 ~/.bashrc\nnano ~/.bashrc 并在其中添加以下行：\nexport PATH=$PATH:/usr/local/nginx-generic-1.24/sbin 使其生效\nsource ~/.bashrc 模块查询 realip模块\nnginx -V 2\u0026gt;\u0026amp;1 | grep -i --color=auto \u0026#34;http_realip_module\u0026#34; gzip_static 模块（可选）\nnginx -V 2\u0026gt;\u0026amp;1| grep -o http_gzip_static_module Nginx配置修改 新建文件 cf.conf\nnano /usr/local/nginx-generic-1.24/conf/cf.conf 添加以下内容\nset_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; real_ip_header CF-Connecting-IP; real_ip_recursive on; 修改nginx.conf：\nnano /usr/local/nginx-generic-1.24/conf/nginx.conf 在http处添加\ninclude cf.conf; 在gzip on;下方添加（可选，本人网站需要用到静态压缩）\ngzip_static on; 重启nginx\namh nginx reload amh nginx restart 禁止通过ip访问网站 新建以ip为域名的虚拟主机，绑定域名处填写ip地址 新建URL规则： return 444; 将虚拟主机规则指向新建的URL规则 或者使用以下脚本一键设置\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/create_default_config.sh \u0026amp;\u0026amp; chmod +x create_default_config.sh \u0026amp;\u0026amp; ./create_default_config.sh 苹果cms的设置 根目录删除.user.ini 文件 如果导入数据库文件后缀为 sql.gz, 先解压为 sql 修改数据库信息 是否开启监听端口远程访问,选择开启 伪静态规则 /runtime/temp 需要写入权限 若要修改配置，application目录设置成777 /upload/vod/ 权限设置成777，如果需要下载图片到本地或者远程 伪静态注意事项: 把admin.php改成后台地址，例如：1234.php 不然无法访问后台\nlocation / { if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s=$1 last; rewrite ^/admin.php(.*)$ /admin.php?s=$1 last; rewrite ^/api.php(.*)$ /api.php?s=$1 last; rewrite ^(.*)$ /index.php?s=$1 last; break; } } 数据同步设置 iptables -I INPUT -p tcp --dport 873 -j ACCEPT iptables-save \u0026gt; /etc/iptables/rules.v4 同步crontab定时任务时区 debain\nsudo service cron restart AMH 命令 nginx篇\namh nginx start amh nginx stop amh nginx reload amh nginx restart mysql篇\namh mysql start amh mysql stop amh mysql reload amh mysql restart amh mysql force-reload 卸载AMH curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/uamh.sh \u0026amp;\u0026amp; chmod +x uamh.sh \u0026amp;\u0026amp; ./uamh.sh ","date":"2025-01-09T02:34:52+08:00","permalink":"https://blog.lufei.de/p/397/","title":"AMh面板设置"},{"content":"项目 Github：https://github.com/WJQSERVER/speedtest-ex\n脚本：根据wjqserver大佬的项目制作的脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/speedtest-ex.sh \u0026amp;\u0026amp; chmod +x speedtest-ex.sh \u0026amp;\u0026amp; ./speedtest-ex.sh 特色：\n鉴权功能 单下载流模式 基于Go Gin构建的自托管Speedtest 前端演示\n","date":"2025-01-07T23:47:44+08:00","permalink":"https://blog.lufei.de/p/396/","title":"SpeedTest-EX 一键安装脚本"},{"content":"脚本 请注意，调参后能跑多少速度是由你的网络环境和线路的优劣决定的，线路垃圾再怎么调也没用\n注意：每个时段都会不一样，至于效果嘛，就当个娱乐看吧。\n脚本:\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/network_optimizer.sh \u0026amp;\u0026amp; chmod +x network_optimizer.sh \u0026amp;\u0026amp; ./network_optimizer.sh 脚本特色：\n自动获取网口名称\n仅替换核心参数，不影响原有的 sysctl.conf其余参数\n可恢复成原始设置\n只需要上调和下调带宽大小即可\n查看配置实际加载顺序: 最后加载的会覆盖前面的参数\nsudo sysctl --system 验证是否应用了新的参数\nsysctl -a | grep net.ipv4.tcp_rmem sysctl -a | grep net.ipv4.tcp_wmem 服务端安装\napt update apt install iperf3 防火墙放行端口\nsudo ufw allow 5201/tcp sudo ufw allow 5201/udp 使用命令\niperf3 -s ============\n客户端下载：\nhttps://github.com/ar51an/iperf3-win-builds/releases/download/3.17.1/iperf-3.17.1-win64.zip\n客户端使用命令\niperf3 -c 服务端ip -R -t 30 -p 5201 多线程\niperf3 -c 服务端ip -p 5201 -t 30 -P 10 -R 然后在本机发起测速。其中 -c 参数表示客户端并指定测速服务器地址，-p 指定服务器端口，-t 指定测试时长（单位秒），-P 指定并发连接数（越高越能测试到速度极限），-R 表示下载测速（不加参数则测试上传速度）。如果要测试 UDP 连接，追加 -u 参数。\n实战 vmiss伦敦9929 我是在晚上11点左右测试的（高峰期），我的vmiss-伦敦9929，上行带宽200 Mbps，使用脚本限制带宽，我从180下调到150，来回反复测试，每次重传都非常的高，我干脆把带宽下调到100，惊喜来了，重传控制在了100以内，反复测试了几次都是如此\novh-加拿大\n原本的100M带宽口子，我限制在70M，\n=========\nvmiss伦敦9929:\nServer listening on 5201 (test #15) ----------------------------------------------------------- [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 582 KBytes 4.77 Mbits/sec 0 145 KBytes [ 5] 1.00-2.00 sec 8.18 MBytes 68.6 Mbits/sec 0 1.90 MBytes [ 5] 2.00-3.00 sec 27.5 MBytes 231 Mbits/sec 0 7.39 MBytes [ 5] 3.00-4.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.14 MBytes [ 5] 4.00-5.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.38 MBytes [ 5] 5.00-6.00 sec 12.5 MBytes 105 Mbits/sec 0 6.25 MBytes [ 5] 6.00-7.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.25 MBytes [ 5] 7.00-8.00 sec 11.2 MBytes 94.4 Mbits/sec 4 6.25 MBytes [ 5] 8.00-9.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.24 MBytes [ 5] 9.00-10.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.25 MBytes [ 5] 10.00-10.22 sec 2.50 MBytes 93.3 Mbits/sec 0 6.25 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.22 sec 119 MBytes 97.4 Mbits/sec 4 sender ----------------------------------------------------------- Server listening on 5201 (test #16) ----------------------------------------------------------- [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 897 KBytes 7.35 Mbits/sec 0 167 KBytes [ 5] 1.00-2.00 sec 5.37 MBytes 45.1 Mbits/sec 0 1.45 MBytes [ 5] 2.00-3.00 sec 27.5 MBytes 231 Mbits/sec 0 7.02 MBytes [ 5] 3.00-4.00 sec 12.5 MBytes 105 Mbits/sec 0 5.99 MBytes [ 5] 4.00-5.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.00 MBytes [ 5] 5.00-6.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.71 MBytes [ 5] 6.00-7.00 sec 12.5 MBytes 105 Mbits/sec 0 5.94 MBytes [ 5] 7.00-8.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.94 MBytes [ 5] 8.00-9.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.93 MBytes [ 5] 9.00-10.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.94 MBytes [ 5] 10.00-11.00 sec 10.0 MBytes 83.9 Mbits/sec 35 5.94 MBytes [ 5] 11.00-12.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.95 MBytes [ 5] 12.00-13.00 sec 10.0 MBytes 83.9 Mbits/sec 0 5.93 MBytes [ 5] 13.00-14.00 sec 12.5 MBytes 105 Mbits/sec 21 5.94 MBytes [ 5] 14.00-15.00 sec 11.2 MBytes 94.4 Mbits/sec 10 5.86 MBytes [ 5] 15.00-16.00 sec 11.2 MBytes 94.4 Mbits/sec 13 5.89 MBytes [ 5] 16.00-17.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.84 MBytes [ 5] 17.00-18.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.65 MBytes [ 5] 18.00-19.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.94 MBytes [ 5] 19.00-20.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.95 MBytes [ 5] 20.00-20.22 sec 2.50 MBytes 97.0 Mbits/sec 0 5.95 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-20.22 sec 229 MBytes 94.9 Mbits/sec 79 sender ----------------------------------------------------------- Server listening on 5201 (test #17) ----------------------------------------------------------- [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 582 KBytes 4.77 Mbits/sec 0 150 KBytes [ 5] 1.00-2.00 sec 8.31 MBytes 69.7 Mbits/sec 0 2.08 MBytes [ 5] 2.00-3.00 sec 26.2 MBytes 220 Mbits/sec 6 7.24 MBytes [ 5] 3.00-4.00 sec 12.5 MBytes 105 Mbits/sec 0 6.09 MBytes [ 5] 4.00-5.00 sec 7.50 MBytes 62.9 Mbits/sec 54 2.59 MBytes [ 5] 5.00-6.00 sec 13.8 MBytes 115 Mbits/sec 47 6.14 MBytes [ 5] 6.00-7.00 sec 10.0 MBytes 83.9 Mbits/sec 0 6.18 MBytes [ 5] 7.00-8.00 sec 12.5 MBytes 105 Mbits/sec 0 6.19 MBytes [ 5] 8.00-9.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.15 MBytes [ 5] 9.00-10.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.09 MBytes [ 5] 10.00-11.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.09 MBytes [ 5] 11.00-12.00 sec 12.5 MBytes 105 Mbits/sec 0 5.47 KBytes [ 5] 12.00-13.00 sec 6.25 MBytes 52.4 Mbits/sec 0 5.64 MBytes [ 5] 13.00-14.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.19 MBytes [ 5] 14.00-15.00 sec 10.0 MBytes 83.9 Mbits/sec 20 2.48 MBytes [ 5] 15.00-16.00 sec 12.5 MBytes 105 Mbits/sec 0 6.13 MBytes [ 5] 16.00-17.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.18 MBytes [ 5] 17.00-18.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.20 MBytes [ 5] 18.00-19.00 sec 11.2 MBytes 94.4 Mbits/sec 3 6.18 MBytes [ 5] 19.00-20.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.19 MBytes [ 5] 20.00-20.22 sec 2.50 MBytes 96.5 Mbits/sec 0 6.19 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-20.22 sec 225 MBytes 93.4 Mbits/sec 130 sender ----------------------------------------------------------- Server listening on 5201 (test #18) ----------------------------------------------------------- [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 897 KBytes 7.35 Mbits/sec 0 167 KBytes [ 5] 1.00-2.00 sec 5.37 MBytes 45.1 Mbits/sec 0 1.44 MBytes [ 5] 2.00-3.00 sec 28.8 MBytes 241 Mbits/sec 0 6.99 MBytes [ 5] 3.00-4.00 sec 10.0 MBytes 83.9 Mbits/sec 0 5.44 MBytes [ 5] 4.00-5.00 sec 12.5 MBytes 105 Mbits/sec 0 5.93 MBytes [ 5] 5.00-6.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.78 MBytes [ 5] 6.00-7.00 sec 8.75 MBytes 73.4 Mbits/sec 21 5.70 MBytes [ 5] 7.00-8.00 sec 12.5 MBytes 105 Mbits/sec 0 6.00 MBytes [ 5] 8.00-9.00 sec 11.2 MBytes 94.4 Mbits/sec 0 6.01 MBytes [ 5] 9.00-10.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.95 MBytes [ 5] 10.00-11.00 sec 11.2 MBytes 94.4 Mbits/sec 0 5.97 MBytes [ 5] 11.00-12.00 sec 12.5 MBytes 105 Mbits/sec 0 5.97 MBytes [ 5] 12.00-13.00 sec 10.0 MBytes 83.9 Mbits/sec 39 5.94 MBytes [ 5] 13.00-14.00 sec 12.5 MBytes 105 Mbits/sec 2 5.91 MBytes [ 5] 14.00-15.00 sec 10.0 MBytes 83.9 Mbits/sec 0 5.95 MBytes [ 5] 15.00-16.00 sec 12.5 MBytes 105 Mbits/sec 0 5.97 MBytes [ 5] 16.00-17.00 sec 8.75 MBytes 73.4 Mbits/sec 0 5.94 MBytes [ 5] 17.00-18.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.91 MBytes [ 5] 18.00-19.00 sec 11.2 MBytes 94.4 Mbits/sec 0 4.92 MBytes [ 5] 19.00-20.00 sec 8.75 MBytes 73.4 Mbits/sec 15 5.44 MBytes [ 5] 20.00-20.23 sec 0.00 Bytes 0.00 bits/sec 6 5.95 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-20.23 sec 219 MBytes 90.7 Mbits/sec 83 sender ----------------------------------------------------------- Server listening on 5201 (test #19) =========\novh- 加拿大\n[ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 520 KBytes 4.26 Mbits/sec 0 118 KBytes [ 5] 1.00-2.00 sec 2.76 MBytes 23.2 Mbits/sec 0 751 KBytes [ 5] 2.00-3.00 sec 22.5 MBytes 189 Mbits/sec 0 5.59 MBytes [ 5] 3.00-4.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.00 MBytes [ 5] 4.00-5.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.66 MBytes [ 5] 5.00-6.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.62 MBytes [ 5] 6.00-7.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.63 MBytes [ 5] 7.00-8.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.49 MBytes [ 5] 8.00-9.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.38 MBytes [ 5] 9.00-10.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.40 MBytes [ 5] 10.00-11.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.60 MBytes [ 5] 11.00-12.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.61 MBytes [ 5] 12.00-13.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.62 MBytes [ 5] 13.00-14.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.43 MBytes [ 5] 14.00-15.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.41 MBytes [ 5] 15.00-16.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.42 MBytes [ 5] 16.00-17.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.49 MBytes [ 5] 17.00-18.00 sec 7.50 MBytes 62.9 Mbits/sec 0 4.51 MBytes [ 5] 18.00-19.00 sec 8.75 MBytes 73.4 Mbits/sec 0 4.50 MBytes [ 5] 19.00-20.00 sec 6.25 MBytes 52.4 Mbits/sec 0 4.41 MBytes [ 5] 20.00-20.28 sec 0.00 Bytes 0.00 bits/sec 0 4.40 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-20.28 sec 160 MBytes 66.0 Mbits/sec 0 sender ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- ","date":"2025-01-07T00:18:58+08:00","permalink":"https://blog.lufei.de/p/395/","title":"TCP调优一键脚本：限速方式"},{"content":"通过将Cloudflared Tunnel的传输层由QUIC改为HTTP/2, 地址栈加入IPv6支持，使连接更加稳定。\n背景 先让我们了解一下, 默认情况下的 Cloudflared Tunnel 启动参数有那些影响到连接的因素:\n传输层协议: 默认使用QUIC协议, 它是Google开发的基于UDP的传输层协议, 传输性能较高 地址栈: 默认使用IPv4地址栈, IPv6地址栈需要手动开启 由于本地运营商对UDP的Qos甚至阻断, 导致Cloudflared Tunnel在某些网络环境下无法正常工作。同时运营商对于IPv4的相关管控设施和规则早已趋于完善, 流控、QoS等问题也更加严重。\n切换到HTTP/2 Cloudflared Tunnel默认使用QUIC协议, 它是Google开发的基于UDP的传输层协议, 传输性能较高。但是由于QUIC协议的一些限制, 如连接建立延迟、连接迁移、丢包率等, 使得在某些网络环境下无法正常工作。\n为了解决这些问题, 我们将Cloudflared Tunnel的传输层协议由QUIC改为HTTP/2。HTTP/2协议是基于TCP的协议, HTTP/2同时也是目前较为主流的传输层协议。\n切换到HTTP/2需要加入--protocol http2这一启动参数。\n开启IPv6支持 默认情况下, Cloudflared Tunnel只支持IPv4地址栈。但是IPv6地址栈也有其优势, 管控较为宽松, 线路不同等\n仅IPv6地址栈: 加入--edge-ip-version 6参数, 以IPv6地址栈为主以连接Cloudflare边缘 加入IPv6地址栈支持: 加入--edge-ip-version auto参数, 同时支持IPv4和IPv6地址栈，交由Cloudflared Tunnel自动选择 实施 进入/etc/systemd/system/cloudflared.service文件, 对ExecStart命令进行如下修改:\nExecStart=/usr/bin/cloudflared --no-autoupdate tunnel --protocol http2 --edge-ip-version auto run --token aaXX123 其中--protocol http2表示开启HTTP/2支持, --edge-ip-version auto表示加入IPv6地址栈支持。\n重启Cloudflared Tunnel服务:\nsystemctl daemon-reload systemctl restart cloudflared ","date":"2025-01-05T22:29:40+08:00","permalink":"https://blog.lufei.de/p/394/","title":"Cloudflared Tunnel 隧道开启HTTP2和IPv6支持"},{"content":"项目 https://github.com/stonith404/pingvin-share\nmkdir -p /root/data/docker_data/pingvin-share cd /root/data/docker_data/pingvin-share 编辑docker-compose.yml\nnano docker-compose.yml 粘贴代码\nversion: \u0026#39;3.8\u0026#39; services: pingvin-share: image: stonith404/pingvin-share restart: unless-stopped ports: - 3000:3000 # 可以改成服务器上未被使用的端口 volumes: - \u0026#34;${PWD}/data:/opt/app/backend/data\u0026#34; # ${PWD}/data表示在当前目录下创建data文件夹用于存放文件 最后\ndocker-compose up -d 或者\ndocker compose up -d 更新\ncd /root/data/docker_data/pingvin-share docker-compose down docker-compose pull docker-compose up -d docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像 卸载\ncd /root/data/docker_data/pingvin-share docker-compose down rm -rf /root/data/docker_data/pingvin-share # 完全删除映射到本地的数据 ","date":"2025-01-05T14:07:05+08:00","permalink":"https://blog.lufei.de/p/393/","title":"Pingvin Share - 文件中转站"},{"content":"一、前期准备 准备工作\n查看当前的 net.ipv4.tcp_wmem 参数值（最好记录一下）\nsysctl net.ipv4.tcp_wmem 查询当前使用的 TCP 拥塞控制算法\nsysctl net.ipv4.tcp_congestion_control 查看当前的队列管理算法\ntc qdisc show 如未启用bbr+fq，请使用以下命令开启\necho \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p 服务端Linux安装iperf3\n在Debian/Ubuntu系统上安装\napt update apt install iperf3 防火墙放行端口 (这里以ufw为例，如果你没有开启防火墙可略过这一步)\nufw allow 5201 服务端启动iperf3\niperf3 -s 2. 客户端配置（Windows） 下载 iperf3 Windows 版本 测试下行速度（30秒） iperf3 -c 服务端IP -R -t 30 -p 5201 测试上行速度（去掉-R参数） iperf3 -c 服务端IP -t 30 -p 5201 二、参数优化流程 1. 参数调整方案 初始测试：使用 iperf3 获取基准性能数据\n参数调优：\n出现 0 重传或个位数重传：适当增大缓冲区（增加 2~4 MiB） 出现较高重传：减小缓冲区（减少 1~2 MiB） 优化步骤：\n# 增大缓冲区（当发现 0 重传时） sysctl -w net.ipv4.tcp_wmem=\u0026#34;4096 16384 理论值+3MiB\u0026#34; sysctl -w net.ipv4.tcp_rmem=\u0026#34;4096 87380 理论值+3MiB\u0026#34; # 减小缓冲区（当发现高重传时） sysctl -w net.ipv4.tcp_wmem=\u0026#34;4096 16384 理论值-2MiB\u0026#34; sysctl -w net.ipv4.tcp_rmem=\u0026#34;4096 87380 理论值-2MiB\u0026#34; 最终调优：找到重传为 0 或低重传（100 以内）理想值，并根据稳定性需要再下调 0.5~1 MiB。\n2. 参数持久化脚本 注意：脚本中的 2939240 仅需修改为实际的值。\n#!/bin/bash # 定义 TCP 缓冲区参数 TCP_WMEM=\u0026#34;4096 16384 2939240\u0026#34; TCP_RMEM=\u0026#34;4096 87380 2939240\u0026#34; # 更新配置文件 sed -i \u0026#39;/^net.ipv4.tcp_[wr]mem/d\u0026#39; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_wmem = $TCP_WMEM\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_rmem = $TCP_RMEM\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf # 应用更改 sysctl -p 三、辅助工具 在线工具\nTCP 参数计算器 自动优化脚本\nwget -q https://raw.githubusercontent.com/BlackSheep-cry/TCP-Optimization-Tool/main/tool.sh -O tool.sh \u0026amp;\u0026amp; chmod +x tool.sh \u0026amp;\u0026amp; ./tool.sh 四、实际案例参数 不同环境参数参考 v.ps-sjc 彦祖猫 net.ipv4.tcp_wmem = 4096 16384 2939240 net.ipv4.tcp_rmem = 4096 87380 2939240 vmiss 伦敦 net.ipv4.tcp_wmem = 4096 16384 4326424 net.ipv4.tcp_rmem = 4096 87380 4326424 斯巴达-西雅图 net.ipv4.tcp_wmem = 4096 16384 237500000 net.ipv4.tcp_rmem = 4096 87380 237500000 Netcup VPS1000 net.ipv4.tcp_wmem = 4096 16384 6278480 net.ipv4.tcp_rmem = 4096 87380 6278480 阿里云-hk-30m net.ipv4.tcp_wmem = 4096 16384 90000 net.ipv4.tcp_rmem = 4096 87380 90000 ","date":"2025-01-05T02:01:01+08:00","permalink":"https://blog.lufei.de/p/392/","title":"TCP 网络优化配置指南"},{"content":"图床项目：\nhttps://github.com/MarSeventh/CloudFlare-ImgBed\n图床目录：\nBtjson.php文件存放目录：/application/common/extend/upload\nbtjson.html文件存放目录: /application/admin/view/extend/upload\n下载图床文件\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/img/Btjson.php wget https://raw.githubusercontent.com/woniu336/open_shell/main/img/btjson.html 注意事项：\n把Btjson.php和btjson.html移到对应存放目录 /upload/vod 需要有写入权限 苹果cms后台开启自动同步图片 图一：\n图二：\n地址规范化替换sql:\nUPDATE {pre}vod SET vod_pic=REPLACE(vod_pic, \u0026#39;mac://\u0026#39;, \u0026#39;https://\u0026#39;) ","date":"2025-01-03T00:13:12+08:00","permalink":"https://blog.lufei.de/p/391/","title":"苹果cms对接图床教程"},{"content":"今天想更改一下 Netcup 服务器的默认 DNS 发现直接更改更改不了，resolv.conf文件有不可变属性，以下方法可以更改成功\n运行\nchattr -i /etc/resolv.conf 删除不可变属性\n然后修改resolv.conf\nnano /etc/resolv.conf 我把默认的 DNS 服务器改为了谷歌的\nnameserver 8.8.8.8 nameserver 8.8.4.4 nameserver 2001:4860:4860::8888 nameserver 2001:4860:4860::8844 修改完后增加不可变属性（如果你不想增加也可以不增加）\nchattr +i /etc/resolv.conf ","date":"2025-01-02T01:04:15+08:00","permalink":"https://blog.lufei.de/p/390/","title":"Netcup 更改 DNS"},{"content":"关闭 nftables 可以通过以下步骤完成：\n停止 nftables 服务\n使用以下命令停止正在运行的 nftables 服务：\nsudo systemctl stop nftables 禁用 nftables 开机启动\n为防止 nftables 在系统启动时自动加载，运行以下命令：\nsudo systemctl disable nftables 确认规则被清空\n停止服务后，你可以检查 nftables 的规则是否已被清空：\nsudo nft list ruleset 如果仍有规则加载，可以使用以下命令清空规则：\nsudo nft flush ruleset 卸载 nftables（可选）\n如果你完全不需要 nftables，可以将其卸载：\nsudo apt remove nftables # 对于基于 Debian/Ubuntu 的系统 sudo yum remove nftables # 对于基于 CentOS/RHEL 的系统 完成以上步骤后，nftables 应该已被关闭，且不会再影响你的系统网络配置。\n","date":"2024-12-30T00:58:40+08:00","permalink":"https://blog.lufei.de/p/389/","title":"关闭 nftables"},{"content":"1. 主库设置 在主库，假设是A服务器上，开放 3306 端口\nsudo ufw allow 3306/tcp 重新加载 UFW 生效\nsudo ufw reload 编辑/etc/my.cnf：\n[mysqld] server-id=1 read_only=0 log-bin=mysql-bin # 指定需要同步的数据库,如果不指定，默认所有数据库 binlog-do-db=db1 binlog-do-db=db2 重启数据库\nservice mysqld restart 2. 从库设置 假设是B服务器上，编辑my.cnf：\n[mysqld] server-id=2 read_only=1 # 指定需要复制的数据库 replicate-do-db=db1 replicate-do-db=db2 重启数据库\nservice mysqld restart 3. 主库授权 登录 mysql 命令行\nmysql -u root -p 只需要在主库，服务器(A)上创建同步用户：\n-- 在主服务器A上执行 CREATE USER \u0026#39;tongbu\u0026#39;@\u0026#39;从服务器IP\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; GRANT REPLICATION SLAVE ON *.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;从服务器IP\u0026#39;; FLUSH PRIVILEGES; 4. 配置主从关系 在主服务器上获取日志位置： SHOW MASTER STATUS; 在从服务器上配置： -- 1. 停止同步 STOP SLAVE; -- 2. 重置服务器状态 RESET SLAVE; -- 3. 配置主从关系 CHANGE MASTER TO MASTER_HOST=\u0026#39;主服务器IP\u0026#39;, MASTER_USER=\u0026#39;tongbu\u0026#39;, MASTER_PASSWORD=\u0026#39;123456\u0026#39;, MASTER_LOG_FILE=\u0026#39;mysql-bin.具体数字\u0026#39;, MASTER_LOG_POS=具体位置; -- 4. 启动同步 START SLAVE; 4. 验证复制状态 在从服务器上执行：\nSHOW SLAVE STATUS\\G 检查以下两个参数是否都为Yes：\nSlave_IO_Running: Yes Slave_SQL_Running: Yes 一、故障确认 检查主库状态 # 检查MySQL服务状态 systemctl status mysql 检查从库同步状态 -- 登录从库 mysql -u root -p -- 检查同步状态 SHOW SLAVE STATUS\\G -- 确认以下内容： -- 1. Slave_IO_Running 和 Slave_SQL_Running 的状态 -- 2. Seconds_Behind_Master 是否为 0（确保数据已完全同步） 二、从库提升为主库 停止从库同步 -- 在从库上执行 STOP SLAVE; RESET SLAVE ALL; 修改从库配置文件 [mysqld] # 删除或注释掉从库相关配置 # replicate-do-db=db1 # replicate-do-db=db2 # 取消只读模式 read_only=0 # 启用二进制日志（如果之前没启用） log-bin=mysql-bin 重启MySQL服务 systemctl restart mysql 三、原主库恢复后的处理 如果原主库恢复，可以将其配置为新的从库：\n备份新主库数据 mysqldump -u root -p --all-databases \u0026gt; backup.sql 将备份文件上传到原主库服务器 在原主库上恢复数据 进入到备份文件所在的目录：\ncd /path/to/destination/ 执行导入命令：系统会提示输入 root 用户的密码，输入后开始恢复数据\nmysql -u root -p \u0026lt; backup.sql 配置原主库为从库 [mysqld] server-id=2 # 注意修改server-id read_only=1 设置复制关系 -- 在原主库上执行 CHANGE MASTER TO MASTER_HOST=\u0026#39;新主库IP\u0026#39;, MASTER_USER=\u0026#39;tongbu\u0026#39;, MASTER_PASSWORD=\u0026#39;123456\u0026#39;, MASTER_LOG_FILE=\u0026#39;mysql-bin.具体数字\u0026#39;, MASTER_LOG_POS=具体位置; START SLAVE; MASTER_HOST：新主库的 IP 地址。 MASTER_USER 和 MASTER_PASSWORD：用于复制的账户及其密码。 MASTER_LOG_FILE 和 MASTER_LOG_POS：指定从库应该从哪个 binlog 文件及位置开始同步数据，需根据新主库状态设置。 执行 START SLAVE; 后，可以通过以下命令检查复制状态：\nSHOW SLAVE STATUS\\G; 确认 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes 表示配置成功。\n","date":"2024-12-29T01:30:19+08:00","permalink":"https://blog.lufei.de/p/388/","title":"数据库主从设置"},{"content":" 项目地址：https://github.com/zdz/ServerStatus-Rust\n官方文档：https://doc.ssr.rs/\ndemo: https://tz.tubaozijie.eu.org/\n在@AhFei大佬的安装脚本基础上制作的便捷一键脚本\n操作简单，无需后台，你也可以把服务端部署到免费容器，然后使用脚本生成config.toml文件，\n路径：/root/tzserve/serverstatus/config.toml\n我把服务端部署到了railway，\nrailway部署教程：https://doc.ssr.rs/railway/\n一键脚本（真正的最简单操作的探针脚本）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/setup_serverstatus.sh \u0026amp;\u0026amp; chmod +x setup_serverstatus.sh \u0026amp;\u0026amp; ./setup_serverstatus.sh 介绍 ServerStatus 中文威力加强版，保持轻量和简化部署，增加主要特性如下：\n使用 rust 完全重写 server、client，单个执行文件部署 支持上下线和简单自定义规则告警 (telegram、 wechat、 email、 webhook) 支持 http 协议上报，可以方便部署到各免费容器服务和配合 cf 等优化上报链路 支持 cloudflare tunnels 和 mTLS 部署 支持主机分组动态注册，简化配置 支持 vnstat 统计月流量，重启不丢流量数据 支持 railway 快速部署 支持 systemd 开机自启 其它功能，如 🗺️ 见 wiki 服务端 服务端管理命令：\nsudo systemctl stop stat_server # 停止服务 sudo systemctl start stat_server # 启动服务 sudo systemctl restart stat_server # 重启服务 sudo systemctl status stat_server # 查看状态 客户端 客户端管理命令：\nsudo systemctl stop stat_client # 停止服务 sudo systemctl start stat_client # 启动服务 sudo systemctl restart stat_client # 重启服务 sudo systemctl status stat_client # 查看状态 开启 vnstat 支持 vnstat 是Linux下一个流量统计工具，开启 vnstat 后，server 完全依赖客户机的 vnstat 数据来显示月流量和总流量，优点是重启不丢流量数据。\n以下是手动开启方式，你也可以使用脚本，一键开启\n⚠️ 注意：如果开启后显示流量为0，在 ExecStart 末尾移除 -n 参数,重启客户端即可恢复\n1. 安装 vnstat sudo apt install -y vnstat 2. 修改配置 nano /etc/vnstat.conf 修改以下配置项：\nBandwidthDetection 0 # 禁用自动检测网络接口最大带宽 MaxBandwidth 0 # 解除带宽限制 Interface \u0026#34;\u0026#34; # 自动选择网口(默认非eth0需设置) 3. 重启服务 systemctl restart vnstat 4. 验证安装 vnstat --version # 确保版本 \u0026gt;= 2.6 vnstat -m # 查看月流量统计 vnstat --json m # JSON格式查看月流量 5. 修改客户端配置 编辑服务文件：\nnano /etc/systemd/system/stat_client.service 在 ExecStart 末尾添加 -n 参数：\nExecStart=/root/tzserve/serverstatus/stat_client -a \u0026#34;http://127.0.0.1:8080/report\u0026#34; -u ovh -p 123456 -n 6. 重启客户端 sudo systemctl daemon-reload sudo systemctl restart stat_client 觉得不错不要吝啬丢个鸡腿。。。。\n","date":"2024-12-24T01:24:59+08:00","permalink":"https://blog.lufei.de/p/387/","title":"Rust 版 ServerStatus 云探针"},{"content":"一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/r2-b.sh \u0026amp;\u0026amp; chmod +x r2-b.sh \u0026amp;\u0026amp; ./r2-b.sh 还原脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/r2.sh \u0026amp;\u0026amp; chmod +x r2.sh \u0026amp;\u0026amp; ./r2.sh 安装工具 安装pigz压缩\napt-get update apt-get install pigz 安装rclone\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 编辑cloudflare r2配置,当然也可以是其他s3网盘，或者谷歌网盘、onedrive都可以\nmkdir -p /root/.config/rclone/ nano /root/.config/rclone/rclone.conf 注意：名称r3要和backup_config.conf配置文件的remote_name名称一致\n配置如下，只需要修改access_key_id、secret_access_key、endpoint 三个参数\n[r3] type = s3 provider = Cloudflare access_key_id = 111 secret_access_key = 222 region = auto endpoint = https://333.r2.cloudflarestorage.com 按ctrl+x保存，y退出\n测试是否配置正确\nrclone ls r3:web # web是存储桶名称 下载脚本文件 wget https://raw.githubusercontent.com/woniu336/open_shell/main/website_backup.py wget https://raw.githubusercontent.com/woniu336/open_shell/main/backup_config.conf 编辑backup_config.conf\nnano backup_config.conf 需要修改的地方\nsource_dir: 需要备份的目录 backup_dir：压缩文件保存的临时目录 remote_path：web/bt/backup，注意：web是r2存储桶的名称，/bt/backup是目录， 目录可以不存在，会自动创建 ### 排除目录，一行一个，例如 node_modules/ 按 ctrl+x 保存，y 退出\n手动备份 都设置好以后，手动测试一下\npython3 website_backup.py 定时任务 每天凌晨2点备份到r2，备份成功会删除本地备份，不成功会保留本地备份\n(crontab -l ; echo \u0026#34;0 2 * * * /usr/bin/python3 /root/website_backup.py\u0026#34;) | crontab - 删除任务\ncrontab -l | grep -v \u0026#39;website_backup.py\u0026#39; | crontab - 一些rclone命令 把/www/wwwroot/web拷贝到r2下的web存储桶，在bt目录\nrclone copy /www/wwwroot/web r3:web/bt --ignore-existing -u -v -P --transfers=15 --ignore-errors --buffer-size=64M --check-first --checkers=10 --drive-acknowledge-abuse 或者反过来\nrclone copy r3:web/bt /www/wwwroot/web --ignore-existing -u -v -P --transfers=15 --ignore-errors --buffer-size=64M --check-first --checkers=10 --drive-acknowledge-abuse 列出文件\nrclone ls r3:web/bt/backup 删除文件\nrclone delete r3:web/bt/backup/backup_20241222_212923.tar.gz 完结撒花。。。\n","date":"2024-12-22T21:07:32+08:00","permalink":"https://blog.lufei.de/p/386/","title":"rclone配合cloudflare r2 备份站点"},{"content":" 使用场景：两台服务器互为从主，数据库自动同步\n事先准备 开启防火墙 Debian/Ubuntu 检查UFW 是否启用\nsudo ufw status 如果显示 \u0026ldquo;Status: inactive\u0026rdquo; 说明防火墙未启用,需要安装UFW\nsudo apt update sudo apt install ufw ⚠️ 安全提醒：允许SSH连接（重要！防止被锁在系统外）\nsudo ufw allow ssh 如果您的 SSH 端口是 5522\nsudo ufw allow 5522/tcp 开放3306端口\nsudo ufw allow 3306/tcp 仅允许特定IP访问3306端口（可选）\nsudo ufw allow from 1.1.1.1 to any port 3306 proto tcp 启用UFW\nsudo ufw enable 防火墙设置完毕\n开启二进制日志 检查二进制日志是否开启\nmysql -u root -p 输入root密码后进入MySQL命令行,然后执行以下命令\nSHOW VARIABLES LIKE \u0026#39;%log_bin%\u0026#39;; 如果看到 log_bin 的值为 ON，则表示已开启。\n如何开启二进制日志？ 编辑MySQL配置文件 /etc/my.cnf 在 [mysqld] 部分添加或确认以下配置：\n[mysqld] log-bin=mysql-bin # 启用二进制日志 server-id=1 # 服务器唯一ID 宝塔面板用户可以在mysql面板开启\n前提条件 ⚠️ 在开始配置前：\n务必备份所有数据库数据 确保两台服务器的MySQL数据完全一致 停止MySQL服务以防止新数据写入 互相授权 在服务器 A (1.1.1.1) 上执行\n登录MySQL mysql -u root -p # 输入数据库密码进入 检查现有用户和权限（可选） SELECT user, host FROM mysql.user; 查看特定用户的权限（服务器B的IP：2.2.2.2）\nSHOW GRANTS FOR \u0026#39;tongbu\u0026#39;@\u0026#39;2.2.2.2\u0026#39;; 创建同步用户并授权 授权账号为tongbu，密码为123456 服务器B的ip：2.2.2.2 创建用户给服务器B连接使用 CREATE USER \u0026#39;tongbu\u0026#39;@\u0026#39;2.2.2.2\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; GRANT ALL PRIVILEGES ON *.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;2.2.2.2\u0026#39;; FLUSH PRIVILEGES; 输入exit退出\n在服务器B (2.2.2.2) 上执行\n登录MySQL mysql -u root -p # 输入数据库密码进入 创建同步用户并授权 授权账号为tongbu，密码为123456 服务器A的ip：1.1.1.1 创建用户给服务器A连接使用 CREATE USER \u0026#39;tongbu\u0026#39;@\u0026#39;1.1.1.1\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; GRANT ALL PRIVILEGES ON *.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;1.1.1.1\u0026#39;; FLUSH PRIVILEGES; 输入exit退出\n连接测试 先退出数据库，从服务器A连接到服务器B： mysql -h 2.2.2.2 -u tongbu -p # 输入在服务器B上创建tongbu用户时设置的密码：123456 先退出数据库，从服务器B连接到服务器A： mysql -h 1.1.1.1 -u tongbu -p # 输入在服务器A上创建tongbu用户时设置的密码：123456 输入exit退出\n配置my.cnf 假设要同步的数据库有：db1、db2，每行一个\n⚠️注意：检查 server-id 是否已经存在，不要重复，且server-id数值不能和B服务器一样\n进入服务器A，编辑my.cnf文件：vi /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-bin # 指定需要同步的数据库 binlog-do-db=db1 binlog-do-db=db2 # 指定需要复制的数据库 replicate-do-db=db1 replicate-do-db=db2 auto_increment_increment=2 auto_increment_offset=1 进入服务器B，编辑my.cnf文件：vi /etc/my.cnf [mysqld] server-id=2 log-bin=mysql-bin # 指定需要同步的数据库 binlog-do-db=db1 binlog-do-db=db2 # 指定需要复制的数据库 replicate-do-db=db1 replicate-do-db=db2 auto_increment_increment=2 auto_increment_offset=2 获取日志信息 登录MySQL\nmysql -u root -p # 输入数据库密码进入 在两台服务器上分别执行：\nSHOW MASTER STATUS; 得到File和Position。分别记录下来。\n配置主主复制 假设:\n服务器A：File是mysql-bin.000009，Position是153\n服务器B：File是mysql-bin.000010，Position是154\n那么\n在服务器A上执行：\n-- 1. 停止同步 STOP SLAVE; -- 2. 重置服务器状态 RESET SLAVE; -- 3. 重新配置主从关系 CHANGE MASTER TO MASTER_HOST=\u0026#39;服务器B IP\u0026#39;, MASTER_USER=\u0026#39;tongbu\u0026#39;, MASTER_PASSWORD=\u0026#39;123456\u0026#39;, MASTER_LOG_FILE=\u0026#39;mysql-bin.000010\u0026#39;, MASTER_LOG_POS=154; -- 4. 启动同步 START SLAVE; 在服务器B上执行：\n-- 1. 停止同步 STOP SLAVE; -- 2. 重置服务器状态 RESET SLAVE; -- 3. 重新配置主从关系 CHANGE MASTER TO MASTER_HOST=\u0026#39;服务器A IP\u0026#39;, MASTER_USER=\u0026#39;tongbu\u0026#39;, MASTER_PASSWORD=\u0026#39;123456\u0026#39;, MASTER_LOG_FILE=\u0026#39;mysql-bin.000009\u0026#39;, MASTER_LOG_POS=153; -- 4. 启动同步 START SLAVE; 完成，输入exit退出\n在两台服务器上分别执行（重启数据库）\nservice mysqld restart 验证复制状态 登录MySQL\nmysql -u root -p # 输入数据库密码进入 在两台服务器上分别执行：\nSHOW SLAVE STATUS\\G 检查以下两个参数是否都为Yes：\nSlave_IO_Running: Yes Slave_SQL_Running: Yes 如果都显示Yes，则表示主主复制配置成功。建议进行数据写入测试，确认同步功能正常。\n故障排查 假设数据库db1报错，那么查询db1是否存在\nSHOW DATABASES; 如果不存在，执行以下命令，创建数据库 db1\nCREATE DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 停止同步\nSTOP SLAVE; 授予权限\nGRANT ALL PRIVILEGES ON db1.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;1.1.1.1\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; FLUSH PRIVILEGES; 重启同步\nSTART SLAVE; 检查状态\nSHOW SLAVE STATUS\\G 删除同步用户 登录mysql\nmysql -u root -p 停止同步\nSTOP SLAVE; 查询同步用户\nSELECT user, host FROM mysql.user; 删除指定IP的用户\nDROP USER \u0026#39;tongbu\u0026#39;@\u0026#39;2.2.2.2\u0026#39;; 如果有多个IP的同名用户，需要分别删除\nDROP USER \u0026#39;tongbu\u0026#39;@\u0026#39;1.1.1.1\u0026#39;; 刷新权限\nFLUSH PRIVILEGES; 验证用户是否删除成功\nSELECT user, host FROM mysql.user; 清理配置文件（可选） 编辑 /etc/my.cnf，删除或注释掉同步相关配置：\n# [mysqld] # server-id=1 # log-bin=mysql-bin # binlog-do-db=xxx_data # replicate-do-db=xxx_data # auto_increment_increment=2 # auto_increment_offset=1 退出，重启MySQL使配置生效\nservice mysql restart ","date":"2024-12-21T16:17:36+08:00","permalink":"https://blog.lufei.de/p/385/","title":"MySQL数据库主主同步"},{"content":"使用新表名重新创建规则\n# 创建表和链 nft add table inet blacklist nft add chain inet blacklist input { type filter hook input priority 0 \\; policy accept \\; } # IPv4 黑名单规则 nft add rule inet blacklist input ip saddr { \\ 20.171.206.0/24, \\ 52.230.152.0/24, \\ 52.233.106.0/24, \\ 66.220.144.0/20, \\ 69.63.176.0/20, \\ 103.218.243.0/24, \\ 152.32.128.0/17, \\ 162.142.125.0/24, \\ 167.94.138.0/24, \\ 167.94.145.0/24, \\ 167.94.146.0/24, \\ 167.248.133.0/24, \\ 199.45.154.0/23, \\ 206.168.34.0/24 \\ } drop # IPv6 黑名单规则 nft add rule inet blacklist input ip6 saddr { \\ 2602:80d:1000:b0cc:e::/80, \\ 2602:80d:1003::/112, \\ 2602:80d:1004::/112, \\ 2620:0:1c00::/40, \\ 2620:96:e000:b0cc:e::/80, \\ 2a03:2880::/32 \\ } drop 保存生效\nnft list ruleset \u0026gt; /etc/nftables.conf sudo systemctl restart nftables systemctl enable nftables 查看所有规则\nnft list ruleset 查看特定表的规则\nnft list table ip forward2jp nft list table inet blacklist 删除现有的表\nnft delete table ip forward2jp nft delete table inet blacklist iptables规则查询 # 查看所有规则（包含详细信息，如包计数器） iptables -L -v -n # 查看所有规则（包含行号） iptables -L -n --line-numbers # 按表查看规则 iptables -t filter -L iptables -t nat -L iptables -t mangle -L iptables -t raw -L # 查看特定链的规则 iptables -L INPUT iptables -L OUTPUT iptables -L FORWARD # 以更易读的格式查看规则 iptables-save # 查看 IPv6 规则 ip6tables -L -v -n ip6tables-save ","date":"2024-12-20T15:50:02+08:00","permalink":"https://blog.lufei.de/p/384/","title":"nftables规则屏蔽垃圾IP"},{"content":" 更新：与ufw共存,不影响ufw现有规则，不会与ufw造成冲突\n提醒：要正确安装好ufw,避免ssh连接不上，推荐使用以下脚本安装ufw,带屏蔽垃圾爬虫功能\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 转发脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nftables-manager.sh \u0026amp;\u0026amp; chmod +x nftables-manager.sh \u0026amp;\u0026amp; ./nftables-manager.sh 查看规则\ncat /etc/nftables.conf 检测 安装 conntrack 工具\napt update \u0026amp;\u0026amp; apt install -y conntrack TCP 连接\ncat /proc/net/nf_conntrack | grep tcp | wc -l UDP 连接\ncat /proc/net/nf_conntrack | grep udp | wc -l 查看系统连接跟踪\ncat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max ","date":"2024-12-20T04:15:40+08:00","permalink":"https://blog.lufei.de/p/383/","title":"nftables 转发规则一键脚本"},{"content":" 官网：https://app.vmiss.com/store/us-los-angeles-tri\n8折优惠码：20%off\n脚本监控的配置是美国 - 洛杉矶 - 三网优化\n如果要监控洛杉矶CMIN2，把脚本中的product32改成product44\n监控地址改成：https://app.vmiss.com/store/us-los-angeles-cmin2\n每60秒钟监控一次\n下载脚本 cd /root \u0026amp;\u0026amp; mkdir -p vmiss \u0026amp;\u0026amp; cd vmiss 安装 venv 工具（如果还没安装）： apt update \u0026amp;\u0026amp; apt install python3-venv -y 创建并进入虚拟环境： # 在当前目录下创建一个名为 \u0026#39;venv\u0026#39; 的文件夹 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate 激活后，您的终端提示符前应该会出现 (venv) 字样。\n在虚拟环境中安装依赖： pip install cloudscraper beautifulsoup4 requests 运行脚本： 下载这两个文件\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/vmiss/monitor_stock.py wget https://raw.githubusercontent.com/woniu336/open_shell/main/vmiss/monitor_control.sh 给monitor.sh添加执行权限\nchmod +x monitor_control.sh 修改脚本 使用这个脚本之前，请确保：\n将YOUR_ACCESS_TOKEN替换为您的实际钉钉机器人access token。\n将YOUR_SECRET替换为您的实际钉钉机器人加签密钥（SEC开头的字符串）。\n启动 ./monitor_control.sh start 停止监控\n./monitor_control.sh stop 重启监控\n./monitor_control.sh restart 查看实时日志：\ntail -f monitor.log ","date":"2024-12-18T01:00:59+08:00","permalink":"https://blog.lufei.de/p/382/","title":"vmiss库存监控"},{"content":"磁盘的写入性能\ndd bs=64k count=4k if=/dev/zero of=test oflag=dsync ","date":"2024-12-17T23:36:21+08:00","permalink":"https://blog.lufei.de/p/381/","title":"磁盘写入性能测试命令"},{"content":" 仅适用于在远程同步数据库时遇到问题的解决办法\n撤销权限 步骤：\n登录到 MySQL：\nmysql -u root -p 输入密码登录。\n依次执行以下命令来撤销权限：\nREVOKE ALL PRIVILEGES ON *.* FROM \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39;; REVOKE GRANT OPTION ON *.* FROM \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39;; 刷新权限：\nFLUSH PRIVILEGES; 解读：\n这条命令会移除 root 用户在所有数据库上的所有权限。\nREVOKE ALL PRIVILEGES ON *.* FROM \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39;; 这条命令会移除 root 用户授予其他用户权限的能力（即，移除 GRANT OPTION）\nREVOKE GRANT OPTION ON *.* FROM \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39;; 恢复权限 停止 MySQL 服务：\nsudo systemctl stop mysql 启动 MySQL 安全模式（无需身份验证）：\nsudo mysqld_safe --skip-grant-tables \u0026amp; 登录 MySQL：\nmysql -u root 更新 root 密码：\nFLUSH PRIVILEGES; ALTER USER \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;新密码\u0026#39;; 重启 MySQL 服务：\nsudo systemctl restart mysql 使用新密码登录：\nmysql -u root -p 恢复 root 用户的所有权限，可以使用以下命令：\nGRANT ALL PRIVILEGES ON *.* TO \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39; WITH GRANT OPTION; 刷新权限：\nFLUSH PRIVILEGES; 输入exit退出\n","date":"2024-12-17T16:28:08+08:00","permalink":"https://blog.lufei.de/p/380/","title":"数据库权限设置"},{"content":"前言 为什么需要双机备份？\n双服务器互备：主机宕机，备机即刻顶上 双节点反代：确保服务持续可用 自动化备份：目录增量同步 + 数据库全量备份 简单高效：一键部署，定时任务自动执行 适用环境：宝塔面板 7.7.0 及以上版本\n快速部署 ⚠️ 提醒：\n在使用脚本前，分别在两台服务器配置同步用户（下面有步骤） 数据库的root密码要一致，同步用户的密码也要一致 脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rsync-vps.sh \u0026amp;\u0026amp; chmod +x rsync-vps.sh \u0026amp;\u0026amp; ./rsync-vps.sh 配置同步用户 服务器 A 配置\n登录 MySQL： mysql -u root -p 创建同步用户tongbu并授权，仅修改密码即可，最好不要有特殊字符 CREATE USER \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; GRANT ALL PRIVILEGES ON *.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; FLUSH PRIVILEGES; 验证配置： # 查看同步用户权限 SHOW GRANTS FOR \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; # 查看所有用户 SELECT user, host FROM mysql.user; # 退出 exit 服务器 B 配置 按照服务器 A 相同步骤配置，确保用户名和密码一致。\n宝塔面板配置 假设你需要把数据库同步到服务器B，在服务器B上打开宝塔面板，\n配置步骤：\n打开宝塔面板 点击\u0026quot;从服务器获取\u0026quot; 点击\u0026quot;同步所有\u0026quot; 之后的定时同步任务就不需要再次设置点击了\n定时任务 可以使用脚本设置，也可以手动设置\n每天7点和下午17点执行文件同步\n(crontab -l ; echo \u0026#34;0 7,17 * * * /root/scripts/synchronize_files.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 每天3点10分同步数据库\n(crontab -l ; echo \u0026#34;10 3 * * * /root/scripts/backup_and_restore_databases.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 删除定时任务\ncrontab -l | grep -v \u0026#39;synchronize_files.sh\u0026#39; | crontab - crontab -l | grep -v \u0026#39;backup_and_restore_databases.sh\u0026#39; | crontab - 清理同步用户（可选） # 登录 MySQL mysql -u root -p # 删除同步用户 DROP USER \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; # 刷新权限 FLUSH PRIVILEGES; # 验证删除 SELECT user, host FROM mysql.user; # 退出 exit 取消/恢复权限 首先撤销所有权限：\nREVOKE ALL PRIVILEGES, GRANT OPTION FROM \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; 然后重新授予所需权限（不带 WITH GRANT OPTION）：\nGRANT ALL PRIVILEGES ON *.* TO \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; 刷新\nFLUSH PRIVILEGES; 验证更改是否生效：\nSHOW GRANTS FOR \u0026#39;tongbu\u0026#39;@\u0026#39;127.0.0.1\u0026#39;; ","date":"2024-12-14T16:33:25+08:00","permalink":"https://blog.lufei.de/p/379/","title":"宝塔面板跨服务器数据同步教程：双机备份零停机"},{"content":"为什么写技术博客 记得那是一个安静的夜晚，我盯着黑色的终端界面，敲下了第一行服务器配置命令。那一刻，仿佛打开了一扇新的大门，我决定开始写博客，记录下这段奇妙的技术探索之旅。\n技术积累的必要性 💡 技术论点速查\n知识沉淀：通过写作梳理技术要点 经验复用：记录问题解决方案 技术传承：分享经验心得给他人 写作的意义 每当夜深人静，我常常会想：\n那些折腾服务器的日日夜夜 调试代码时的欣喜与沮丧 网站终于部署成功的那一刻喜悦 解决问题后的成就感 不仅是在记录，更是在构建自己的技术认知体系。 这些珍贵的经历，若不记录下来，总觉得少了些什么。\n慢思考的价值 在这个浮躁的互联网时代，博客依然保持着一份难得的安静。它不追求快餐式的阅读，而是让思考可以慢慢发酵，让文字静静沉淀。\n📚 写作收获\n知识体系化：将零散知识点系统整理 深度思考：通过写作加深对技术的理解 技术积累：为未来的技术选型提供参考 成长记录：见证个人技术能力提升 或许多年之后回头看，这些文字就像时光的印记，记录下了我们成长的轨迹。这大概就是写博客最动人的地方吧。\n","date":"2024-12-12T22:25:45+08:00","permalink":"https://blog.lufei.de/p/378/","title":"为什么要写技术博客"},{"content":"问题原因是 /etc/network/interfaces 文件中有一条错误的DNS配置，已经注释，重启后网络已经恢复。\n#dns-nameservers 8.8.8.8 ","date":"2024-12-07T22:37:04+08:00","permalink":"https://blog.lufei.de/p/377/","title":"阿里云轻量香港服务器重启后无法连接问题解决记录"},{"content":"如何备份和迁移Plausible容器到新服务器。以下是详细步骤：\n在源服务器上操作\n1. 备份Docker镜像 保存所有相关镜像到tar文件\ndocker save postgres:14-alpine -o postgres-14-alpine.tar docker save plausible/analytics:v2.0 -o plausible-analytics-v2.tar docker save clickhouse/clickhouse-server:23.3.7.5-alpine -o clickhouse-server.tar docker save bytemark/smtp:latest -o smtp.tar 2. 备份数据卷 创建备份目录\nmkdir docker_backup 备份各个数据卷\ndocker run --rm -v hosting_db-data:/source:ro -v $(pwd)/docker_backup:/backup alpine tar -czf /backup/db-data.tar.gz -C /source . docker run --rm -v hosting_event-data:/source:ro -v $(pwd)/docker_backup:/backup alpine tar -czf /backup/event-data.tar.gz -C /source . docker run --rm -v hosting_event-logs:/source:ro -v $(pwd)/docker_backup:/backup alpine tar -czf /backup/event-logs.tar.gz -C /source . 3. 备份配置文件 tar -czvf hosting.tar.gz -C /opt/docker_data/plausible hosting 备份完结！\n在新服务器上操作前，要把以上的备份文件上传到新服务器\n在新服务器上恢复 加载Docker镜像 docker load -i postgres-14-alpine.tar docker load -i plausible-analytics-v2.tar docker load -i clickhouse-server.tar docker load -i smtp.tar 创建数据卷 docker volume create hosting_db-data docker volume create hosting_event-data docker volume create hosting_event-logs 恢复数据卷内容 mkdir docker_backup 把前面的数据卷备份文件上传到docker_backup目录\ndocker run --rm -v hosting_db-data:/target -v $(pwd)/docker_backup:/backup alpine sh -c \u0026#34;cd /target \u0026amp;\u0026amp; tar xzf /backup/db-data.tar.gz\u0026#34; docker run --rm -v hosting_event-data:/target -v $(pwd)/docker_backup:/backup alpine sh -c \u0026#34;cd /target \u0026amp;\u0026amp; tar xzf /backup/event-data.tar.gz\u0026#34; docker run --rm -v hosting_event-logs:/target -v $(pwd)/docker_backup:/backup alpine sh -c \u0026#34;cd /target \u0026amp;\u0026amp; tar xzf /backup/event-logs.tar.gz\u0026#34; 5. 重新启动容器 mkdir -p /opt/docker_data/plausible/hosting cd /opt/docker_data/plausible/hosting 把hosting.tar.gz上传到hosting目录解压，最后运行\ndocker compose up -d 或者,在 docker-compose.yml 所在目录下执行\ndocker-compose down docker-compose up -d 至此，迁移完成。\n清理临时文件 rm -rf docker_backup rm *.tar rm /opt/docker_data/plausible/hosting/hosting.tar.gz ","date":"2024-12-03T15:33:22+08:00","permalink":"https://blog.lufei.de/p/376/","title":"Plausible 统计备份迁移记录"},{"content":"项目 https://github.com/woniu336/vps-date\n演示 https://woniu336.github.io/vps-date/\n每天0点和12点自动运行更新监控信息 首次使用，可以手动触发运行测试 添加监控 拷贝仓库，修改 update_vps_data.py\n添加小鸡信息，例如：\n{ \u0026#34;name\u0026#34;: \u0026#34;OVH加拿大\u0026#34;, \u0026#34;cost\u0026#34;: 0.97, \u0026#34;currency\u0026#34;: \u0026#34;USD\u0026#34;, \u0026#34;expireDate\u0026#34;: \u0026#34;2025-2-9\u0026#34;, \u0026#34;color\u0026#34;: \u0026#34;danger\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://ca.ovh.com/manager/#/hub\u0026#34; }, cost 是费用 currency 是币种，USD、EUR、CNY 三种币种 expireDate 到期时间 monthlyExpireDay 每月续费的日期，例如：3，就是每月3号续费，注意：expireDate和monthlyExpireDay只能二选一 color 颜色 url 链接 手动触发运行 图1：\n图2：\n开启GitHub Pages 通知 本项目没有整合通知，需要下载 vps_monitor.py 脚本到机子上运行 记得把小鸡ip加入到钉钉ip段\n通知测试\n安装依赖 pip install requests 修改脚本，添加钉钉通知\n测试 python3 vps_monitor.py 后台运行 nohup python3 vps_monitor.py \u0026gt; vps_monitor.out 2\u0026gt;\u0026amp;1 \u0026amp; 停止监控 ps aux | grep vps_monitor.py 停止进程\nkill \u0026lt;进程ID\u0026gt; ","date":"2024-12-01T04:31:44+08:00","permalink":"https://blog.lufei.de/p/375/","title":"MJJ订阅续费监控"},{"content":"简介 在搭建反向代理服务器时，了解服务器之间的网络质量至关重要。本文介绍一个实用的网络测试脚本，可帮助您评估服务器间的连接质量、延迟和丢包情况。\n安装和使用 下载脚本 cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/network_tester.py 赋予执行权限 chmod +x network_tester.py 运行测试 python3 network_tester.py 按提示输入目标服务器IP即可开始测试。\n测试案例 案例1：卢森堡 VPS → OVH 美西 延迟：约150ms 连接质量：优秀 丢包率：无 结论：适合作为反向代理组合 案例2：卢森堡 VPS → 斯巴达西雅图 连接质量：一般 丢包情况：严重 结论：不建议用作反向代理 总结 部署反向代理前建议先测试网络质量 重点关注延迟稳定性和丢包率 选择连接质量优秀的服务器组合 ","date":"2024-11-28T22:15:06+08:00","permalink":"https://blog.lufei.de/p/374/","title":"服务器延迟测试脚本"},{"content":"\r在使用 Nginx 或宝塔面板的基础上部署 Poste.io 时，经常会遇到证书申请失败或无法访问等问题。本教程将为您提供一个完整的解决方案。\n特别说明：如果您的服务器 IP 已被 Outlook 列入黑名单，发送到 Outlook 邮箱的邮件将会失败。其他邮箱服务目前运行正常，如未收到邮件请检查垃圾邮件文件夹。\n特色 自动检测docker是否安装 检测25端口是否可用，如果显示不可用，那么请换其他机子 自动生成所需 DNS 记录配置 支持一键更新和完整卸载 登录用户名和登录密码和管理后台一致 禁用病毒扫描和关闭垃圾邮件过滤，减小内存占用 内存占用仅约 280MB 安装步骤 运行安装脚本: curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/poste_io.sh \u0026amp;\u0026amp; chmod +x poste_io.sh \u0026amp;\u0026amp; ./poste_io.sh 重要提示：请确保 25 端口可用，否则需更换服务器。系统会自动检测并提示端口状态。\n配置 DNS 记录 安装完成后，系统会自动显示需要配置的 DNS 记录。请务必正确配置所有显示的记录。\n例如：mail.123.com 作为邮箱域名\n记录类型 主机记录 记录值 A mail 1.1.1.1 （服务器ip） CNAME imap mail.123.com CNAME pop mail.123.com CNAME smtp mail.123.com MX @ mail.123.com TXT @ v=spf1 mx ~all TXT _dmarc v=DMARC1; p=none; rua=mailto:admin@123.com 最后还有一个TXT记录是关于DKIM 密钥的，需要在后台激活后看到，请继续往下看\n证书配置与自动续期 对于宝塔面板用户，执行以下命令配置 SSL 证书：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert.sh \u0026amp;\u0026amp; chmod +x ssl-cert.sh \u0026amp;\u0026amp; ./ssl-cert.sh 配置步骤：\n安装 cert\n申请证书\n添加自动续期任务\n完成后，在宝塔面板中:\n进入网站设置\n导航到SSL，点击保存按钮\n强制HTTPS\n然后在终端运行以下代码\n./autossl.sh 配置反向代理 在宝塔面板中配置反向代理：\n代理端口：8808\n确保配置正确保存\n邮件服务器后台配置 访问您的域名\n使用管理员账号登录\n设置安全密码\n进入后台，按照图示操作\nDKIM 配置\n创建 DKIM 密钥\n对于 Cloudflare 用户：\n主机名格式例如：s20241127823._domainkey\n添加 TXT 记录\n复制完整的 DKIM 记录值\n图一：\n图二：\nwebmail 使用\n点击右上角的 webmail，登录用户名和登录密码和管理后台一致。\n进入简洁的邮件管理界面\n完结撒花。\n第三方客户端 SMTP/IMAP/POP3 配置\n协议 服务器地址 端口 SSL SMTP mail.your-domain.com\nsmtp.your-domain.com 25, 465, 587 STARTTLS IMAP mail.your-domain.com\nimap.your-domain.com 993, 143 STARTTLS POP3 mail.your-domain.com\npop.your-domain.com 995, 110 STARTTLS ","date":"2024-11-27T00:36:56+08:00","permalink":"https://blog.lufei.de/p/373/","title":"一键部署 Poste.io 邮件服务器完整指南"},{"content":"\r项目：https://github.com/fscarmen2/pic-hosting-cluster\n不限于图床，可用作私人文件存储\n油管教程 要看到视频需扶墙\n监控脚本 万一某个节点出了问题，可以及时知道，便设计了监控脚本\n下载脚本，配置好状态页面url和钉钉通知\ncd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/pic_monitor.py 安装依赖库\npip install requests 启动后台监控\nnohup python3 -u pic_monitor.py \u0026gt; pic_monitor.log 2\u0026gt;\u0026amp;1 \u0026amp; 查看进程：\nps aux | grep pic_monitor.py 停止进程：\nkill $(ps aux | grep \u0026#39;pic_monitor.py\u0026#39; | grep -v grep | awk \u0026#39;{print $2}\u0026#39;) ","date":"2024-11-26T00:34:52+08:00","permalink":"https://blog.lufei.de/p/372/","title":"多节点集群图床方案"},{"content":"\riptables 一键转发脚本已经有了，再搞一个Realm脚本，\n在nodeseek论坛小伙伴脚本基础上添加了一些参数\n注意事项：在删除规则前，先停止服务才生效，再删除\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/realm.sh \u0026amp;\u0026amp; chmod +x realm.sh \u0026amp;\u0026amp; ./realm.sh ","date":"2024-11-23T22:44:59+08:00","permalink":"https://blog.lufei.de/p/371/","title":"Realm一键转发脚本"},{"content":"起因 由于防火墙设置不当，导致服务器失联无法登录，记录一下救援过程\n文档 ： https://help.ovhcloud.com\n办法 在ovh后台点击Reboot in rescue mode进入救援模式,稍后会发邮件让你设置密码登录服务器，\n登录服务器后，执行以下命令\nmount /dev/sdb1 /mnt/ cd /mnt chroot /mnt 查询使用什么防火墙\nwhich iptables 如果系统使用的是 iptables，让我们来修复它：\n首先，让我们查看当前的 iptables 规则： iptables -L 直接使用 iptables 命令设置基本规则： 清除所有现有规则\niptables -F iptables -X iptables -Z 设置默认策略\niptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT 允许已建立的连接\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许本地回环接口\niptables -A INPUT -i lo -j ACCEPT 允许 SSH 连接（端口 22）根据实际情况修改\niptables -A INPUT -p tcp --dport 22 -j ACCEPT 如果您需要添加其他端口的访问权限（比如网站的 80/443 端口），可以这样添加：\n# 允许 HTTP iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTPS iptables -A INPUT -p tcp --dport 443 -j ACCEPT 保存规则： # 对于 Debian/Ubuntu 系统 iptables-save \u0026gt; /etc/iptables/rules.v4 # 如果上面的目录不存在，可以尝试 mkdir -p /etc/iptables iptables-save \u0026gt; /etc/iptables/rules.v4 确保规则在重启后仍然生效，检查是否安装了 iptables-persistent： apt-get install iptables-persistent 完成后，退出 chroot 环境并重启： exit umount /mnt reboot 验证规则\nnft list ruleset 回到ovh官网后台，点击reboot my vps重启服务器，稍后登录恢复正常\n完结\n","date":"2024-11-23T14:10:41+08:00","permalink":"https://blog.lufei.de/p/370/","title":"ovh救援模式恢复服务器"},{"content":"禁止 ping nano /etc/sysctl.conf 在文件末尾增加一行\nnet.ipv4.icmp_echo_ignore_all = 1 使其生效\nsysctl -p 安装 ufw debian/ubuntu\nsudo apt update sudo apt install ufw 允许 SSH 连接\nsudo ufw allow ssh 如果使用的是非标准端口，例如：5522\nsudo ufw allow 5522/tcp 查看\nsudo ufw show added 最后启用\nsudo ufw enable 生成密钥 注意：生成密钥是在本地电脑上操作\n首先，生成密钥对（如果存在略过）\nssh-keygen -q -t ed25519 -C \u0026#34;你的邮箱\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/github_id_rsa 复制公钥\ncat ~/.ssh/github_id_rsa.pub 添加到你的Github上，地址如下，名称随意，内容就是你复制的公钥\nhttps://github.com/settings/keys 密钥登录 提示： woniu336 是我的Github账号名称\n这条命令会自动获取你在Github上的公钥并保存到服务器的/root/.ssh/authorized_keys\n登录的时候记得你的私钥文件在本地电脑的 ~/.ssh/github_id_rsa\nbash \u0026lt;(curl -fsSL git.io/key.sh) -og woniu336 -d 会不会觉得把公钥先上传到Github上，再拷贝到服务器多此一举？直接复制公钥到服务器不就行了，\n仔细想想，如果你有很多机子，每次都要复制一遍公钥也是重复劳动了，干脆一条代码搞定！\n只需要保管好私钥不要被泄露，那么再多的服务器，你就可以仅使用一对密钥来访问了，而不用每一台都要去生成密钥对。\n","date":"2024-11-23T03:08:29+08:00","permalink":"https://blog.lufei.de/p/369/","title":"服务器安全设置"},{"content":"\r需求：把一个项目推送到两个github账号上\n设置 生成新的ssh密钥\nssh-keygen -q -t ed25519 -C \u0026#34;123456@qq.com\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/qkmov_id_rsa 查看公钥\ncat ~/.ssh/qkmov_id_rsa.pub 添加公钥到Github（另外打开一个浏览器）: https://github.com/settings/keys\n编辑~/.ssh/config文件，末尾添加以下内容\nHost qkmov_cc Hostname ssh.github.com IdentityFile ~/.ssh/qkmov_id_rsa User git Port 443 ProxyCommand \u0026#34;C:\\Program Files\\Git\\mingw64\\bin\\connect.exe\u0026#34; -S 127.0.0.1:7890 %h %p ​\n验证\nssh -T git@qkmov_cc 添加仓库，用上面 Host 名称来代替原来的github.com\ngit remote add qkmov git@qkmov_cc:jimugou/qkmov.git 推送\ngit add . git commit -m \u0026#34;update\u0026#34; git push -f origin --all git push -f qkmov --all 其他命令\n# 首先删除现有的 remote git remote remove origin # 然后添加新的 remote git remote add origin git@github.com:woniu336/catpdf.git # 验证设置 git remote -v ","date":"2024-11-22T16:38:53+08:00","permalink":"https://blog.lufei.de/p/368/","title":"本地如何设置多个github账号"},{"content":"项目 hugo: https://gohugo.io/\n原项目：https://github.com/CaiJimmy/hugo-theme-stack\n魔改开源博客主题：https://github.com/woniu336/hugo-magic\ncloudflare加速：https://github.com/woniu336/enhanced-FaaS-in-China\n前言 hugo号称全球最快的静态网站建设框架,比Jekyll、Hexo、VuePress要快得多。\n我使用hugo作为博客，记录一些网站和服务器相关的技术，已经有一年多了，\n我的博客部署到vercel，为了提高访问速度，使用了一个开源的cf加速项目\n后来突发奇想，将hugo主题魔改成资源分享站，借助AI修修改改，终于有了点影视站的样子。\n演示站点： https://www.qkmov.cc\n首页\n内页\n","date":"2024-11-22T14:00:40+08:00","permalink":"https://blog.lufei.de/p/367/","title":"爆改hugo博客变成影视站点"},{"content":"前言 新版本总是报错断联，于是换回旧版本：1.18.5 版本，记录一下\n一键安装\ndocker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1.18.5 指定版本安装,例如1.18.5版本，前提：你已经安装了最新版本\ndocker pull louislam/uptime-kuma:1 docker stop uptime-kuma docker rm uptime-kuma docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1.18.5 时区修改 宿主机\nsudo bash -c \u0026#39;echo \u0026#34;Asia/Shanghai\u0026#34; \u0026gt; /etc/timezone\u0026#39; sudo dpkg-reconfigure --frontend noninteractive tzdata 停止并删除旧容器\ndocker stop uptime-kuma docker rm uptime-kuma 重新启动容器，添加时区挂载\ndocker run -d \\ --name uptime-kuma \\ -v /etc/localtime:/etc/localtime:ro \\ -v /etc/timezone:/etc/timezone:ro \\ -p 127.0.0.1:3001:3001 \\ louislam/uptime-kuma:1.18.5 进入容器\ndocker exec -it uptime-kuma bash 验证时区\ncat /etc/timezone 反向代理 我使用Cloudflare-Tunnel作为反代\nhttps://github.com/louislam/uptime-kuma/wiki/Reverse-Proxy-with-Cloudflare-Tunnel\n美化 /* 自定义字体定义 */ @font-face { font-family: \u0026#39;1666963922\u0026#39;; src: url(\u0026#39;https://jsd.cdn.zzko.cn/gh/54ayao/ACG@main/static/fonts/1666963922.woff\u0026#39;) format(\u0026#39;woff\u0026#39;); font-weight: normal; font-style: normal; } /* 全局样式 */ body { font-family: \u0026#39;1666963922\u0026#39;, sans-serif; /* 使用自定义字体 */ color: #333; margin: 0; padding: 0; background-image: url(\u0026#39;https://www.cuteapi.com/api/acg/images/api.php\u0026#39;); /* 自适应背景图片API */ background-attachment: fixed; background-size: cover; background-position: center center; background-repeat: no-repeat; } /* 导航栏链接悬停样式 */ .navbar a:hover { text-decoration: underline; } /* 卡片样式 */ .card { background-color: #fff; border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); margin-bottom: 20px; padding: 20px; } /* 卡片标题样式 */ .card-title { font-size: 18px; font-weight: bold; margin-bottom: 10px; } /* 在明亮主题下，应用不同的背景色及75%透明度 */ .shadow-box { background-color: rgba(255, 255, 255, 0.75); padding: 10px; margin: 5px; border-radius: 10px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); text-decoration: none; } /* 在暗色主题下，应用不同的背景色及65%透明度 */ .dark .shadow-box:not(.alert) { background-color: rgba(0, 0, 0, 0.65); padding: 20px; margin: 10px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } /* 侧边栏样式 */ .sidebar { background-color: rgba(255, 255, 255, 0.9); padding: 20px; margin: 10px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } /* 特定元素和类的样式 */ span[data-v-7d4a7f28], .item-name, div.description[data-v-7d4a7f28][data-v-b8247e57][contenteditable=\u0026#34;true\u0026#34;], div[data-v-7d4a7f28][data-v-b8247e57].alert-heading.p-2, .refresh-info \u0026gt; div, .alert-heading.p-2 \u0026gt; div, .alert-heading.p-2 \u0026gt; p, .alert-heading.p-2 \u0026gt; h1 { background-image: linear-gradient(90deg, #07c160, #fb6bea 25%, #3aedff 50%, #fb6bea 75%, #28d079); font-family: \u0026#39;1666963922\u0026#39;, sans-serif; -webkit-text-fill-color: transparent; -webkit-background-clip: text; background-size: 400% 100%; animation: wzw 10s linear infinite; } /* 动画关键帧定义 */ @keyframes wzw { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } #app { font-family: \u0026#39;1666963922\u0026#39;, BlinkMacSystemFont, \u0026#39;segoe ui\u0026#39;, Roboto, \u0026#39;helvetica neue\u0026#39;, Arial, \u0026#39;noto sans\u0026#39;, sans-serif, \u0026#39;apple color emoji\u0026#39;, \u0026#39;segoe ui emoji\u0026#39;, \u0026#39;segoe ui symbol\u0026#39;, \u0026#39;noto color emoji\u0026#39; !important; } ","date":"2024-11-20T13:33:11+08:00","permalink":"https://blog.lufei.de/p/366/","title":"uptime kuma 监控安装"},{"content":"Censys IP 段 ：https://support.censys.io/hc/en-us/articles/360043177092-Opt-Out-of-Data-Collection\n作为一名系统管理员，你一定也经历过这样的困扰：每天查看服务器日志，都能看到来自全球各地的恶意扫描。这些自动化工具不知疲倦地探测着你的服务器漏洞，像蚂蚁一样持续骚扰着你的系统。手动添加UFW规则来阻止这些IP？太繁琐了。逐个封禁IP？没完没了。\n下面我寄出三个工具，喜欢哪个用哪个\niptable脚本 安装iptable持久化套装，安装有提示直接回车即可\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys.sh \u0026amp;\u0026amp; chmod +x block_censys.sh \u0026amp;\u0026amp; ./block_censys.sh 额外功能, 添加日志规则（在DROP规则之前）\niptables -I INPUT -p tcp -m set --match-set censys src -j LOG --log-prefix \u0026#34;CENSYS_BLOCKED: \u0026#34; ip6tables -I INPUT -p tcp -m set --match-set censys6 src -j LOG --log-prefix \u0026#34;CENSYS6_BLOCKED: \u0026#34; 测试\n从 Censys ip中拿出三个ip进行测试\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/test_censys_block.sh \u0026amp;\u0026amp; chmod +x test_censys_block.sh \u0026amp;\u0026amp; ./test_censys_block.sh 查看规则\niptables -L INPUT -v -n | grep censys ipv6\nip6tables -L INPUT -v -n | grep censys6 ufw脚本 包含屏蔽Censys 、AI爬虫，垃圾IDC、国外某些恶意IP，自动获取SSH端口并开启ufw，防止意外登录不上服务器。\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/setup_ufw_rules.sh \u0026amp;\u0026amp; chmod +x setup_ufw_rules.sh \u0026amp;\u0026amp; ./setup_ufw_rules.sh 查看规则\nsudo ufw status numbered 使用规则序号删除规则，例如，删除第5条规则：\nsudo ufw delete 5 ASN脚本 通过ASN自动识别和封禁这些\u0026quot;不速之客\u0026quot;，让你的服务器更安全，管理更轻松。\n下载脚本\ncd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_asn_ufw.py 运行\nsudo python3 block_asn_ufw.py 398722 398722就是Censys ，只是前面省略了AS字符\n可以多个，如果你不嫌时间长\nAS398722、AS14061、AS135377 三大恶人，一律拉黑\nsudo python3 block_asn_ufw.py 398722 14061 135377 ","date":"2024-11-17T03:28:22+08:00","permalink":"https://blog.lufei.de/p/365/","title":"屏蔽 Censys ip 扫描你的站点信息"},{"content":"问题：Cannot connect to the Docker daemon at unix:///var/run/docker.sock.\n停止所有 Docker 服务 systemctl stop docker.service systemctl stop docker.socket systemctl stop containerd 删除 Docker 相关文件 rm -rf /var/run/docker* rm -rf /var/lib/docker/* 重新加载系统服务 systemctl daemon-reload 重启 containerd（如果安装了的话） systemctl start containerd 启动 Docker 服务 systemctl start docker.socket systemctl start docker.service 检查服务状态：\nsystemctl status docker 如果以上步骤还是不能解决问题，建议重新安装 Docker：\n完全卸载 Docker apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin 删除所有 Docker 数据 rm -rf /var/lib/docker rm -rf /var/lib/containerd 重新安装 Docker apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 安装完成后，检查 Docker 是否正常工作：\n检查 Docker 版本 docker --version 运行测试容器 docker run hello-world ","date":"2024-11-17T00:26:18+08:00","permalink":"https://blog.lufei.de/p/364/","title":"docker问题解决"},{"content":" 原本使用realm做转发，但是没成功，不知道是不是因为我的中转机安装了宝塔，还安装了一些docker项目，还扶墙，反正乱七八糟的东西，干脆就使用iptables，为了方便，跟claude耗了两个小时搞了个小脚本~\n脚本 注意：以下代码是在中转机上操作\n安装依赖\napt-get update apt-get install net-tools apt-get install iptables-persistent 安装脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/iptables-manager.sh \u0026amp;\u0026amp; chmod +x iptables-manager.sh \u0026amp;\u0026amp; ./iptables-manager.sh 使用注意 最好先执行菜单3：保存当前规则，避免误操作，还有备份可以恢复\n脚本执行顺序：\n启用IP转发（仅第一次） 转发规则管理（添加规则或者删除规则）、 保存规则 如果你要转发443或者80端口，使用域名访问（http/s），记得把DNS的A记录指向中转机ip，甚至还可以开启cloudflare cdn 双重保护，让黑子找不到你的ip。\n删除服务 如果不需要转发服务了，除了在脚本中删除转发规则，还可以删除服务，彻底清除\nsystemctl disable iptables-forward.service \u0026amp;\u0026amp; rm -f /etc/systemd/system/iptables-forward.service \u0026amp;\u0026amp; systemctl daemon-reload 其他功能 允许已建立的连接（提高效率）\niptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 删除规则 查看IPv4的NAT规则\niptables-save -t nat 查看IPv6的NAT规则\nip6tables-save -t nat 删除脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/iptables_del.sh \u0026amp;\u0026amp; chmod +x iptables_del.sh \u0026amp;\u0026amp; ./iptables_del.sh 严格模式（可选） 通过UFW防火墙限制80和443端口，只允许指定的中转IP访问，阻止其他所有IP的访问，从而保护源站安全。\n在源服务器上安装ufw sudo apt update sudo apt install ufw 允许 SSH 连接 首先，添加一条允许 SSH 连接的规则：\nsudo ufw allow ssh 如果您使用的是非标准 SSH 端口，请使用实际的端口号。例如，如果您的 SSH 端口是 2222：\nsudo ufw allow 2222/tcp 查看编号 sudo ufw status numbered 删除现有的80和443端口规则（根据编号删除,注意编号请根据你的实际情况）\nsudo ufw delete 25 # 删除 80/tcp 规则 sudo ufw delete 31 # 删除 443/tcp 规则 sudo ufw delete 40 # 删除 80/tcp (v6) 规则 sudo ufw delete 46 # 删除 443/tcp (v6) 规则 添加新的规则，允许3.3.3.3访问\nsudo ufw allow from 3.3.3.3 to any port 80 sudo ufw allow from 3.3.3.3 to any port 443 添加新的规则，允许5.5.5.5访问\nsudo ufw allow from 5.5.5.5 to any port 80 sudo ufw allow from 5.5.5.5 to any port 443 重新加载UFW规则\nsudo ufw reload 检查更新后的规则\nsudo ufw status numbered ","date":"2024-11-16T23:56:28+08:00","permalink":"https://blog.lufei.de/p/363/","title":"iptables一键转发脚本"},{"content":"保号策略 使用 App 充值最低 20 HKD，只支持 AlipayHK、信用卡等当地支付方式，延期至 充值时间 + 365 天。\n在线充值延期相同，支持微信、支付宝，最低 10 HKD：\n3HK 在线充值 https://www.three.com.hk/3Care/chi/prepay/payonline1.jsp\n在浏览器中打开，支付完成后要返回完成回调才会成功充值。\nhahaSIM 开箱测评 \u0026amp; 使用教程\n转自：https://blog.tsinbei.com/archives/1462/\n","date":"2024-11-15T22:39:14+08:00","permalink":"https://blog.lufei.de/p/362/","title":"hahaSIM 保号充值"},{"content":"安装依赖 pip3 install aiohttp sudo apt-get install jq pip3 install treelib 下载文件 cd ~ git clone https://github.com/woniu336/kua-auto.git 重命名目录:\nmv kua-auto kua-update 设置cookie\n在quark_config.json设置cookie和钉钉通知\n添加转存\n在movie_links.txt添加转存信息，格式,例如\n如龙=https://pan.quark.cn/s/df4a1b9ceb00=/yyds/如龙 每行一条信息\n前面是名称，中间是转存的链接，后面是转存的目录，使用等号区分\n运行脚本 cd kua-update python3 movie_list.py python3 quark_auto_save.py quark_config.json 自动化脚本\n#!/bin/bash # 设置错误处理 set -euo pipefail IFS=$\u0026#39;\\n\\t\u0026#39; # 更新json配置 echo \u0026#34;开始更新json配置...\u0026#34; cd /www/wwwroot/脚本所在目录 || { echo \u0026#34;切换目录失败\u0026#34;; exit 1; } if python3 movie_list.py; then echo \u0026#34;movie_list.py 执行成功\u0026#34; else echo \u0026#34;movie_list.py 执行失败\u0026#34; \u0026gt;\u0026amp;2 exit 1 fi # 转存 echo \u0026#34;开始转存...\u0026#34; if python3 quark_auto_save.py quark_config.json; then echo \u0026#34;quark_auto_save.py 执行成功\u0026#34; else echo \u0026#34;quark_auto_save.py 执行失败\u0026#34; \u0026gt;\u0026amp;2 exit 1 fi echo \u0026#34;脚本执行完毕\u0026#34; ","date":"2024-11-13T01:32:38+08:00","permalink":"https://blog.lufei.de/p/361/","title":"夸克网盘自动转存脚本（增强版）"},{"content":"1. 创建 /etc/fail2ban/jail.local 执行以下命令以创建并写入 jail.local 文件：\nsudo tee /etc/fail2ban/jail.local \u0026gt; /dev/null \u0026lt;\u0026lt;EOL [DEFAULT] # 封禁时间（秒）：1天 bantime = 86400 # 查找时间范围（秒）：1小时 findtime = 3600 # 尝试次数 maxretry = 3 # 忽略的IP地址（如果有） ignoreip = 127.0.0.1/8 ::1 # 自定义规则：端口扫描防护 [port-scan] enabled = true filter = port-scan logpath = /var/log/syslog maxretry = 5 findtime = 600 bantime = 7200 EOL 2. 创建 /etc/fail2ban/filter.d/port-scan.conf 执行以下命令以创建并写入 port-scan.conf 文件：\nsudo tee /etc/fail2ban/filter.d/port-scan.conf \u0026gt; /dev/null \u0026lt;\u0026lt;EOL [Definition] failregex = \\[UFW BLOCK\\] .* SRC=\u0026lt;HOST\u0026gt; .* ignoreregex = EOL 3. 重启 Fail2Ban 服务 在完成配置文件的创建后，重启 Fail2Ban 服务以应用更改：\nsudo systemctl restart fail2ban 4. 验证配置 可以使用以下命令检查 Fail2Ban 的状态，确保配置正确无误：\nsudo fail2ban-client status sudo fail2ban-client status port-scan ","date":"2024-11-13T01:03:34+08:00","permalink":"https://blog.lufei.de/p/360/","title":"一招制敌：使用 Fail2Ban 自动识别和封禁端口扫描攻击"},{"content":"下载脚本 cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_html.py cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/lock_p.sh 权限\nchmod +x /root/{clean_html.py,lock_p.sh} 修改脚本 在脚本中修改要检测和清除的代码，以及目录，这很简单略过\n执行脚本 如果是宝塔面板，在后台\u0026ndash;计划任务\u0026ndash;添加shell命令\n锁住文件\ncd ~ \u0026amp;\u0026amp; sudo ./lock_p.sh lock 解锁文件\ncd ~ \u0026amp;\u0026amp; sudo ./lock_p.sh unlock 删除恶意代码\ncd ~ \u0026amp;\u0026amp; python3 clean_html.py 替换脚本 cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/new-ce.py 权限\nchmod +x new-ce.py 执行\npython3 new-ce.py 手动 首先切换到目标目录的上级目录\ncd /www/wwwroot\n修改目录的权限为只读(555)\nchmod 555 123.com\n修改目录下所有文件的权限为只读(444)\nchmod -R 444 123.com/*\n如果需要确保root用户也无法修改，可以添加chattr命令\nchattr +i -R 123.com\n如果之后需要修改文件，需要先恢复权限：\nchattr -i -R 123.com # 如果使用了chattr chmod -R 755 123.com # 恢复目录权限 chmod -R 644 123.com/* # 恢复文件权限 ","date":"2024-11-11T06:30:56+08:00","permalink":"https://blog.lufei.de/p/359/","title":"清除恶意代码和锁住文件"},{"content":" 解释：只有把域名托管到cloudflare，并且开启了cdn（小云朵）的网站才能访问，可以有效防止真实服务器 IP 被探测到\n在运营网站的过程中，安全始终是一个永恒的话题。即便我们使用了 Cloudflare 这样的 CDN 服务，但如果配置不当，真实 IP 依然有可能泄露。\n想象一下这个场景：你的网站正在使用 Cloudflare CDN，看似很安全。但是有一天，你突然发现服务器负载异常，网站响应缓慢。经过排查，你惊讶地发现有大量的直接 IP 访问请求，绕过了 CDN 的防护。这意味着你的服务器真实 IP 已经泄露了。\n这种情况并不罕见，IP 可能通过多种途径泄露：\nDNS 历史记录 邮件服务器配置 解析记录变更前的访问 网站本身的某些功能特性 IP 地址范围 https://www.cloudflare.com/zh-cn/ips/\n下载脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cloudflare-only.sh \u0026amp;\u0026amp; chmod +x cloudflare-only.sh \u0026amp;\u0026amp; ./cloudflare-only.sh 查看规则 iptables -L INPUT -n --line-numbers 仅查看80和443\niptables -L INPUT -n --line-numbers | grep -E \u0026#34;80|443\u0026#34; 查看ipv6\nip6tables -L INPUT -n --line-numbers | grep -E \u0026#34;80|443\u0026#34; 检查是否存在这些冲突规则\niptables -L INPUT -n --line-numbers | grep \u0026#34;dpt:80\\|dpt:443\u0026#34; 白名单 添加本地ip，可以做到，在不开cdn的情况下，只有你自己可以访问\niptables -I INPUT 1 -s 你的ip/32 -p tcp -m multiport --dports 80,443 -j ACCEPT 保存规则\niptables-save \u0026gt; /etc/iptables/rules.v4 删除测试 IP：\niptables -D INPUT 1 删除规则 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clear-cloudflare.sh \u0026amp;\u0026amp; chmod +x clear-cloudflare.sh \u0026amp;\u0026amp; ./clear-cloudflare.sh 删除ipv6\nfor i in {1..8}; do ip6tables -D INPUT 1 done 或者(保留fail2ban)\nfor i in $(iptables -L INPUT -n --line-numbers | grep -E \u0026#34;80|443\u0026#34; | grep -v \u0026#34;f2b-fail2ban\u0026#34; | awk \u0026#39;{print $1}\u0026#39; | sort -nr); do iptables -D INPUT $i; done \u0026amp;\u0026amp; for i in $(ip6tables -L INPUT -n --line-numbers | grep -E \u0026#34;80|443\u0026#34; | grep -v \u0026#34;f2b-fail2ban\u0026#34; | awk \u0026#39;{print $1}\u0026#39; | sort -nr); do ip6tables -D INPUT $i; done 调整顺序（可选） 例如：将 f2b-nginx-bad-request 规则移到最前面（在 Cloudflare 规则之前）\n删除原来的规则\niptables -D INPUT 18 调整到前面\niptables -I INPUT 1 -p tcp -m multiport --dports 80,443 -j f2b-nginx-bad-request ","date":"2024-11-11T01:33:58+08:00","permalink":"https://blog.lufei.de/p/358/","title":"指定ip仅cloudflare能访问"},{"content":" 注意：仅监控没有php文件的目录\n下载脚本 cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_php.sh 赋予权限\nchmod +x /root/block_php.sh 运行 前台运行,记得先修改检测目录和设置钉钉通知，记得把ip加入到钉钉的IP地址（段）\n./block_php.sh 后台运行\nnohup ./block_php.sh \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 启动服务 创建系统服务：\nnano /etc/systemd/system/block-php.service 写入\n[Unit] Description=Block PHP Files Monitor After=network.target [Service] Type=simple ExecStart=/root/block_php.sh Restart=always User=root [Install] WantedBy=multi-user.target 启动服务：\nsystemctl daemon-reload systemctl enable block-php.service systemctl start block-php.service 监控脚本运行状态：\n# 查看服务状态 systemctl status block-php.service # 查看日志 tail -f /var/log/php_block.log # 查看系统日志 journalctl -u block-php.service 停止服务 # 停止服务 sudo systemctl stop block-php.service # 禁用开机自启 sudo systemctl disable block-php.service # 检查服务状态 sudo systemctl status block-php.service 如果是在后台运行的进程：\n# 查找进程 ps aux | grep block_php.sh # 或者更精确的查找 pgrep -f \u0026#34;block_php.sh\u0026#34; # 终止进程 kill $(pgrep -f \u0026#34;block_php.sh\u0026#34;) # 如果普通 kill 不能终止，可以强制终止 kill -9 $(pgrep -f \u0026#34;block_php.sh\u0026#34;) 完全移除 # 停止服务 sudo systemctl stop block-php.service # 禁用服务 sudo systemctl disable block-php.service # 删除服务文件 sudo rm /etc/systemd/system/block-php.service # 重新加载 systemd sudo systemctl daemon-reload # 删除脚本文件 sudo rm /root/block_php.sh # 如果不再需要日志和隔离目录 sudo rm /var/log/php_block.log sudo rm -rf /root/php_quarantine ","date":"2024-11-09T21:02:41+08:00","permalink":"https://blog.lufei.de/p/357/","title":"自动监控、隔离可疑PHP文件的Bash脚本工具"},{"content":" 仅监控圣何塞(San Jose)8.95欧配置\nhttps://vps.hosting/cart/san-jose-cloud-kvm-vps/\n需要配置钉钉通知\n1. 下载文件 首先需要创建目录并下载所需文件：\n创建目录\nmkdir -p v_ps 下载三个文件\nwget -P v_ps https://raw.githubusercontent.com/woniu336/open_shell/main/v_ps/start_monitor.sh wget -P v_ps https://raw.githubusercontent.com/woniu336/open_shell/main/v_ps/stop_monitor.sh wget -P v_ps https://raw.githubusercontent.com/woniu336/open_shell/main/v_ps/vps_stock_monitor.py 2. 设置权限 进入目录\ncd v_ps 添加执行权限\nchmod +x start_monitor.sh stop_monitor.sh 3. 使用方法 测试监控脚本 python3 vps_stock_monitor.py 如果运行正常，将会看到相关的监控输出信息。\n启动后台监控 ./start_monitor.sh 这将在后台持续运行监控脚本。\n停止监控 ./stop_monitor.sh 这将停止后台运行的监控进程。\n注意事项 确保系统已安装 Python 3 确保有足够的权限执行这些脚本 如果下载失败，请检查网络连接或直接访问 GitHub 手动下载文件 ","date":"2024-11-08T20:56:35+08:00","permalink":"https://blog.lufei.de/p/356/","title":"V.PS 库存监控脚本使用教程"},{"content":"配置 监控的配置： KS-LE-B\n价格：9.99欧\n下单地址：https://eco.ovhcloud.com/fr/?display=list\u0026amp;range=kimsufi\n下载脚本 cd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/ovh_monitor.py 启动监控 nohup python3 ovh_monitor.py \u0026gt; ovh_monitor.log 2\u0026gt;\u0026amp;1 \u0026amp; 实时查看日志\ntail -f ovh_monitor.log 停止监控 查找进程ID\nps aux | grep ovh_monitor.py 停止进程\nkill \u0026lt;进程ID\u0026gt; ","date":"2024-11-07T04:38:18+08:00","permalink":"https://blog.lufei.de/p/355/","title":"ovh监控脚本"},{"content":"引言 看到这篇文章的哥们，不知道你有没有这样的需求？\n我有一个老的域名 old.com 不用了，想要把流量全部引入到 new.com 中。这很简单，使用 301 或者 302 重定向。那用什么实现呢？最常见的是 Nginx，宝塔中有快捷设置。\n但是这样成本就起来了，为了一个重定向还要单独一台服务器。而且，如果旧域名访问量多，也会给服务器带来负担。\n这个时候 Cloudflare 无疑是一个绝佳选择。\n准备工作 1、保证自己的域名处于“已代理”状态，这样后续的相关规则才能够生效。\n2、入口，创建自己的规则\n3、主机匹配，也就是添加条件，只让规定域名进行跳转\n场景匹配 这是重头戏，也是最核心的部分。因为重定向涉及到是否保留路径，是否需要重写路径。\n1. 不保留路径 2. 保留路径 选择动态，表达式为\nconcat(\u0026#34;https://www.skyqian.com\u0026#34;, http.request.uri.path) 3. 重写路径 假如我想让 https://static.2ge.org/tg/xxxx.png 重定向到 https://telegra.ph/file/xxxx.png\nconcat(\u0026#34;https://telegra.ph/file\u0026#34;, substring(http.request.uri.path, 3)) 结语 以上三种情况，可以覆盖大部分场景。一些细节部分需要自己多留心，此教程的基础是懂一点点编程的，其中比如 substring 的参数问题就是一个字符串截取。如果不太明白就照猫画虎吧，也问题不大。\n转自：https://www.skyqian.com/archives/cloudflare-redirect.html\n","date":"2024-11-05T14:34:55+08:00","permalink":"https://blog.lufei.de/p/354/","title":"CloudFlare 重定向教程"},{"content":"需要在img标签加防盗链\nreferrerpolicy=\u0026#34;no-referrer\u0026#34; 后台默认登录用户名和密码：admin/admin123\n修改密码：config.php\n项目地址 https://github.com/woniu336/gtimg\n界面预览 特色：支持批量传图，粘贴上传，一键复制外链，备份，重命名\n为什么需要这个图床？ 在使用各大图床服务时，我们经常会遇到两个痛点：\n上传的图片往往没有备份 返回的文件名完全随机，难以管理 比如你上传了一张 风景.jpg，可能得到一个类似 https://qq.com/abc123.png 的链接。即使你有备份，要找到对应的原图也很困难。\n完美解决方案：自建腾讯图床 经过两年的使用，这个图床方案可以很好地解决上述问题：\n✨ 自动本地备份：在当前目录自动创建 uploads 文件夹存储备份(如果没有手动创建) 🔄 智能文件名同步：备份文件会自动改名，与外链 ID 保持一致 🔒 数据永不丢失：即使图床服务终止，也可以轻松恢复图片 举个例子 当你获得这样的外链：\nhttps://inews.gtimg.com/om_ls/OoGoIjnMKjvJeux0lY-wWDYDRB9LxidTHE_ak7FfBRaRkAA/0 备份文件会自动命名为：\nOoGoIjnMKjvJeux0lY-wWDYDRB9LxidTHE_ak7FfBRaRkAA 快速上手 1. 获取授权信息 首先需要获取腾讯开放媒体平台的 Cookie：\n访问 腾讯开放媒体平台 使用微信扫码登录 按 F12 打开开发者工具，找到 Cookie 信息 💡 重要提示：我们只需要 Cookie 中从 userid 开始的部分，例如：\nuserid=23510990; omaccesstoken=xxx; omtoken=xxx; logintype=4; srcopenid=xxx; srcaccessToken=xxx 2. 配置图床 将获取到的 Cookie 填入 后台管理的Token 配置中\n完成配置后，就可以开始使用图床服务了！\n3. 数据备份方案 为了确保数据安全，我推荐使用 rclone 配合 Cloudflare R2 进行自动备份。以下是经过优化的备份命令：\nrclone copy /www/wwwroot/1234.com/uploads r2:img/gtimg/uploads \\ -u -v -P \\ --transfers=20 \\ --ignore-errors \\ --buffer-size=64M \\ --check-first \\ --checkers=15 \\ --drive-acknowledge-abuse 参数说明：\n/www/wwwroot/1234.com/uploads：本地图片目录 r2:img/gtimg/uploads：R2 存储路径（其中 img 为你的 R2 存储桶名称） 其他参数已优化为最佳性能配置 特别说明 ⚠️ 使用限制：目前不支持上传 avif格式的图片\n图片恢复方案 如果图床服务出现问题，可以通过以下步骤快速恢复：\n使用备份中的图片文件 批量替换链接前缀 https://inews.gtimg.com/om_ls 把/0替换成.webp 这样的设计确保了即使服务中断，你的图片资源也不会丢失。\n","date":"2024-11-04T01:35:55+08:00","permalink":"https://blog.lufei.de/p/353/","title":"图床一个就够：自建腾讯图床gtimg"},{"content":"原项目 Github: https://github.com/webp-sh/webp_server_go\n根据此项目制作的脚本工具\n一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/webp-server.sh \u0026amp;\u0026amp; chmod +x webp-server.sh \u0026amp;\u0026amp; ./webp-server.sh 是的，脚本又来了哈~\n还记得那个周末，我正在整理自己多年的博客文章。突然发现，那些曾经生动精彩的配图，竟然一张张全部变成了红叉。那一刻，我感受到了深深的无力感 —— 我的文章就像是失去了灵魂。\n这样的痛点，想必很多创作者都深有体会。免费图床会关停，付费图床会涨价，自建图床又担心带宽问题。难道写作之路注定要被图床问题困扰吗？\n直到那天，我在GitHub上偶然发现了这个开源工具。它就像是一位优雅的管家，默默地守护着我们的图片资源。它不仅能帮我们代理任何图床的内容，还能自动将图片转换为更高效的WebP或者avif格式（脚本默认使用avif）。最令人惊喜的是，它的部署过程简单得令人难以置信 —— 只需要一个脚本，几个命令，就能搭建起一个强大的图床代理系统。\n回到正题！\n各种图床，你可以自己添加，哪怕是其他人的站点图片，越过防盗链。\nB站图片：https://i1.hdslb.com/bfs/archive/37c2936033347d4de5d028578b4500f9486290ec.jpg 美团：https://img.meituan.net/csc/429c57535bbf46ef7cacd09aa618e921269502.png 京东：https://img14.360buyimg.com/ddimg/jfs/t1/193289/29/49939/31652/6720aabdF58aa9f17/b96f6af4146068a5.jpg 微博：https://wx1.sinaimg.cn/large/3e416ca7gy1hv00zwfje5j23b04eokjn.jpg 代理地址：\nB站代理：https://mt.7blog.us.kg/b/bfs/archive/37c2936033347d4de5d028578b4500f9486290ec.jpg 美团代理：https://mt.7blog.us.kg/mt/csc/429c57535bbf46ef7cacd09aa618e921269502.png 京东代理：https://mt.7blog.us.kg/jd/ddimg/jfs/t1/193289/29/49939/31652/6720aabdF58aa9f17/b96f6af4146068a5.jpg 微博代理：https://mt.7blog.us.kg/weibo/large/3e416ca7gy1hv00zwfje5j23b04eokjn.jpg 发现规律了吗 看图，\n你以为就完了吗，不需要修改图片后缀，浏览器会自动加载成avif格式（超高压缩率和清晰度的完美结合）\n图片url依然保持不变，但是往下看~\n查看压缩率\n压缩到了原本图片的24%，节省流量带宽\n图片缓存目录，默认不会删除缓存：\n/opt/docker_data/WebP/exhaust 到此完结，如果鸡腿够多的话，我会继续发一个clouflare dns宕机自动切换ip，并且可以自由选择是否开启cdn的超强脚本工具。\n","date":"2024-11-01T13:40:46+08:00","permalink":"https://blog.lufei.de/p/352/","title":"从此告别图床失效：一个几乎可以代理所有图床的工具！"},{"content":"Nginx配置 # FastCGI 缓存全局配置 fastcgi_cache_path /var/cache/nginx/123_com levels=1:2 keys_zone=AADM.COM:200m inactive=8h max_size=10G; fastcgi_cache_path /var/cache/nginx/456_com levels=1:2 keys_zone=BBDM.ORG:200m inactive=8h max_size=10G; fastcgi_cache_key \u0026#34;$scheme$request_method$host$request_uri$is_args$args\u0026#34;; fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; 站点1的缓存路径和keys_zone\n/var/cache/nginx/123_com # 路径 keys_zone=AADM.COM # keys_zone 站点2的缓存路径和keys_zone\n/var/cache/nginx/456_com keys_zone=BBDM.ORG 站点配置 例如站点2\n# 1. 缓存控制块 set $skip_cache 0; if ($request_method = POST) { set $skip_cache 1; } if ($query_string != \u0026#34;\u0026#34;) { set $skip_cache 1; } if ($query_string ~ \u0026#34;^wd=\u0026#34;) { set $skip_cache 0; } if ($request_uri ~* \u0026#34;purge=all|/wp-admin/|/xmlrpc.php|admin.*\\.php|/feed/|index.php|sitemap(_index)?.xml|gbook\\.html\u0026#34;) { set $skip_cache 1; } if ($http_cookie ~* \u0026#34;comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in\u0026#34;) { set $skip_cache 1; } # 2. PHP 处理配置 location ~ [^/]\\.php(/|$) { fastcgi_split_path_info ^(.+\\.php)(/.+)$; fastcgi_pass unix:/tmp/php-cgi-74.sock; fastcgi_index index.php; include fastcgi.conf; fastcgi_param PATH_INFO $fastcgi_path_info; # 缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache BBDM.ORG; # 添加这些配置来优化性能 fastcgi_cache_lock on; # 防止缓存抖动 fastcgi_cache_min_uses 1; # 访问一次就缓存 fastcgi_cache_revalidate on; # 使用条件请求 fastcgi_cache_background_update on; # 后台更新缓存 fastcgi_cache_valid 200 301 302 8h; add_header Nginx-Cache \u0026#34;$upstream_cache_status\u0026#34; always; # 安全头部配置块 add_header Strict-Transport-Security \u0026#34;max-age=31536000; includeSubDomains; preload\u0026#34; always; #add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34; always; add_header Cache-Control \u0026#34;max-age=28800\u0026#34; always; add_header Last-Modified $date_gmt always; etag on; } # 3. 缓存清理配置 location ~ /purge(/.*) { allow 127.0.0.1; allow \u0026#34;你的主机IP\u0026#34;; deny all; fastcgi_cache_purge BBDM.ORG \u0026#34;$scheme$request_method$host$1\u0026#34;; } ","date":"2024-11-01T00:41:38+08:00","permalink":"https://blog.lufei.de/p/351/","title":"nginx缓存配置应对高并发高流量方法"},{"content":"脚本1（推荐） 安装依赖工具\nsudo apt update \u0026amp;\u0026amp; sudo apt install gawk 脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/asn-blocker.sh \u0026amp;\u0026amp; chmod +x asn-blocker.sh \u0026amp;\u0026amp; ./asn-blocker.sh 可以在一段时间后查看数据包：\niptables -L INPUT -v -n | grep \u0026#34;blocked-asn\u0026#34; | awk \u0026#39;{match($0,/blocked-asn-([0-9]+)/,a); printf \u0026#34;ASN %-12s packets: %-4s bytes: %-6s\\n\u0026#34;, a[1], $1, $2}\u0026#39; 什么是ASN？ ASN（Autonomous System Number）是互联网上的自治系统编号，相当于网络服务商的唯一标识符。通过ASN，我们可以：\n快速识别流量来源 批量封禁特定服务商的IP段 有效防御来自特定IDC的恶意扫描 常见的ASN示例：\nAS14061 (DigitalOcean) - 知名云服务提供商 AS135377 (UCLOUD) - 国内云服务商 AS202306 (Hostinger) - 国际虚拟主机提供商 脚本2 脚本2适用范围：宝塔面板，如果你的不是，唯一区别就是路径改改即可\n每次查看服务器负载，发现高的离谱，一看是IDC的大量恶意IP扫描我的站点，因此根据网友的脚本制作了一版基于ASN的IP封禁。\n1. 下载脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/nginxasn.sh \u0026amp;\u0026amp; chmod +x nginxasn.sh \u0026amp;\u0026amp; ./nginxasn.sh 2. 添加需要封禁的ASN列表 这一步可选，因为默认的ASN基本足够，尤其是AS135377\nnano nginxasn.sh 编辑下方的部分，添加想要屏蔽的ASN号码即可，一行一个，不加AS字符\nasnlist=\u0026#34;135377 14061 202306 9318 12737\u0026#34; 3. 在Nginx配置中启用 在你的网站配置文件中添加：例如屏蔽AS135377则站点配置文件写\ninclude asnblock135377.conf; 其中135377是ASN号码的数字部分。\ninclude asnblock135377.conf; # UCLOUD include asnblock14061.conf; # DigitalOcean include asnblock202306.conf; # Hostinger include asnblock9318.conf; # SK Broadband include asnblock12737.conf; # Netfinity 测试 例如我要封禁本地ip：192.168.1.106\necho \u0026#34;deny 192.168.1.106;\u0026#34; \u0026gt;\u0026gt; /www/server/nginx/conf/asnblock202306.conf nginx -s reload 然后再访问你的网站，返回403，封禁生效。\n移除测试ip\nsed -i \u0026#39;/192.168.1.106/d\u0026#39; /www/server/nginx/conf/asnblock202306.conf nginx -s reload 脚本功能介绍 自动下载和更新ASN对应的IP段，保存路径\n/www/server/nginx/conf 下载为独立的配置文件,如 asnblock135377.conf\n下载的规则文件内容类似：\ndeny 103.21.244.0/22; deny 103.22.200.0/22; deny 103.31.4.0/22; # ... 更多IP段 一键配置Nginx封禁规则\n支持批量管理多个ASN\n定时任务 添加下面这行，每天凌晨3点更新ip段\n(crontab -l ; echo \u0026#34;0 3 * * * /bin/bash /root/nginxasn.sh \u0026gt;/dev/null\u0026#34;) | crontab - 删除任务：\ncrontab -l | grep -v \u0026#39;nginxasn.sh\u0026#39; | crontab - 脚本工作原理 初始化检查\n检测并安装必要工具 确保文件格式正确 下载规则\n从ipinfo.app获取最新IP列表 自动生成Nginx配置文件 配置管理\n自动清理旧规则 生成新的封禁配置 重载Nginx服务 常用命令 ./nginxasn.sh # 更新所有规则 ./nginxasn.sh --delall # 清空所有规则 ./nginxasn.sh -d 14061 # 删除指定ASN规则 ./nginxasn.sh -a 14061 # 添加指定ASN规则 注意事项 确保Nginx配置目录有写入权限 建议先测试后部署到生产环境 定期检查规则更新情况 ","date":"2024-10-31T00:24:36+08:00","permalink":"https://blog.lufei.de/p/350/","title":"一键屏蔽恶意IP：自动化管理Nginx ASN封禁的完整方案"},{"content":"使用方法 cd /www/wwwboot/123.com # 定位到站点目录，可以是静态 然后：\ngit clone https://github.com/woniu336/auto-update.git cd auto-update chmod +x run_all.sh chmod +x auto.sh \u0026amp;\u0026amp; ./auto.sh 功能 从低端影视网站页面爬取影片信息，并把夸克网盘资源转存到自己的夸克网盘并自动生成分享链接，最后在目录下生成html页面（见底下）\n可以设置定时转存更新\n注意：只有夸克网盘资源是你自己的（脚本会自动替换），百度和UC依然是低端影视分享出来的。\n脚本流程 这个脚本的主要功能是：从日志文件中解析电影信息，异步获取豆瓣电影海报，并生成一个包含电影网格展示、分页功能和资源状态统计的交互式HTML报告页面。\n具体流程为：\n读取日志文件，解析电影名称、网盘链接和豆瓣链接 异步爬取豆瓣电影海报并缓存 统计资源状态（总数、失效数、海外禁看数） 生成响应式HTML页面，支持分页浏览和链接复制功能 注意事项 如果遇到问题：需要启用 proc_open、exec 和 putenv 函数，\n如果是宝塔面板，可以在php中把这三个函数删除，然后重启php\n","date":"2024-10-29T22:05:09+08:00","permalink":"https://blog.lufei.de/p/348/","title":"低端影视夸克网盘追更脚本"},{"content":"相关地址 GitHub地址：https://github.com/ellite/Wallos\n部署 创建文件夹：\nmkdir -p /root/data/docker_data/wallos \u0026amp;\u0026amp; cd /root/data/docker_data/wallos 创建配置文件：\nnano docker-compose.yml 然后贴入配置（官方）：\nservices: wallos: container_name: wallos image: bellamy/wallos:latest ports: - \u0026#34;8282:80/tcp\u0026#34; environment: TZ: \u0026#39;Asia/Shanghai\u0026#39; # Volumes store your data between container upgrades volumes: - \u0026#39;./db:/var/www/html/db\u0026#39; - \u0026#39;./logos:/var/www/html/images/uploads/logos\u0026#39; restart: unless-stopped 完成后，开始部署：\ndocker compose up -d demo ","date":"2024-10-24T13:59:10+08:00","permalink":"https://blog.lufei.de/p/347/","title":"个人订阅追踪器——Wallos"},{"content":"Dpanel官方 仓库 https://github.com/donknap/dpanel\n文档 https://dpanel.cc/#/zh-cn/install/docker\n部署代码 内网使用推荐大家使用lite版,如果你已经安装了宝塔或者nginx此类服务 dpanel lite版 docker run -it -d --name dpanel --restart=always \\ -p 8807:8080 -e APP_NAME=dpanel \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v dpanel:/dpanel dpanel/dpanel:lite 默认登录账号/密码\nadmin/admin\ndocker开启API服务 注意：开放外网使用是不安全的，仅限内网使用\n编辑文件\nsudo nano /usr/lib/systemd/system/docker.service 将其中[service]部分中ExecStart=一行替换成下面内容\nExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --containerd=/run/containerd/containerd.sock 重启docker服务\nsudo systemctl daemon-reload \u0026amp;\u0026amp; sudo systemctl restart docker ","date":"2024-10-23T23:42:59+08:00","permalink":"https://blog.lufei.de/p/346/","title":"docker可视化面板Dpanel"},{"content":"MixFile介绍 https://gitlab.com/ivgeek/mixfile\nMixFile是一款可以上传加密文件并分享的安卓APP\n可实现本地加密上传,加密下载文件,在线播放加密视频\n加密时会自动生成随机密钥进行加密,上传完成后,密钥 文件地址 文件大小等信息会附加在分享码中\n将分享码发送给他人即可实现分享文件\n已发布版本: https://gitlab.com/ivgeek/mixfile/-/releases\n使用帮助: https://gitlab.com/ivgeek/mixfile/-/wikis/%E4%BD%BF%E7%94%A8%E5%B8%AE%E5%8A%A9\n测试\nmf://demmGp0ywJ1A29dfuKpqbCCdBe6fmd15daMSjYm8UIvTxcZMXOS8u5r4ruWjPb8U4EF2Qdw2mvr07qpIKS37SMlfQpKS9OQc1vLDlReDGGAQqDmdlqp9snNTx5xk4BdaHGkLf0CYPqFStejRC7GpiDFwBoCRyGkeGZ4CaK75hM1ff4pIGwdVawE6ItsGPOeUSnWsJuE1n2xK5HXimrHrAqzNlQUoO8YWm4JfwGEdfSl 死亡大乐透（电影）\nmf://iXI4tLos6lanlivWDDVob5rgyz8nYco5qwk7DqggS6mNOZ0ZsTuo3A5ZYqOChcSFpJpcYkfcQ7aXE00VcXQ6n5gWtV58UPpVCIllFNorVhst71LDzAcaq4CrXS6N8f5ca3KUcQgQ9zPe5hpu2DhITNxQn7gBhKCcVcg7yloOKiwpVP1IF7arc7FsuNMmSWglNtikzTAm0KcFvNe1ZwPs5wMDFm8mxHVcr1A9kekuCPtgeN08tasIDGHoD3j2gcw9FfLJggMW8LwUUW0mhojjCbtzl1bwZKGMhS chevereto_3.20.20.zip\nmf://slC7d40Rb6Uu3ZlcZzgSSWpkUr6bRNRKaccvCnBUmD2U8ADAR28tqR9Qa7pPGLt7zLStOj9oyU2o5MGNM82a1rXMtItqDxlRfT8WzSBGYpZ1CH1GRQYUEcQQVypgwHQRpWtCrqR1MQAUsuTm3cBtHxfEY2aKIx1bBE3WlemXgvb9ZRxp0H0V99rfy6lF0CaLXLhi8CxeXk8Z20R6KCUeEUw7iReO4DjbDHgKLdEb4wOcjFEe8uzNlzm1PrOyV6wVupt chevereto_4.0.8.zip\nmf://6RFGqTHNGTrf1VXS0nyBvIaYLzCNncyOpIBU5U4LFeUHuzOf3PgHRO4ABQWWllEPnNqpmyIIoonvXhyB3qCtbfWJlyPI1wZvcf8NPHlHfO4KHxOekzf7qhX0lIgv7flURprUO1DF385FDPbmaY4hJ1oiP7HohCEaBj8oVhmKrjqQNVZD8hxWw1t0eEc7ZTUfsqxYAu9uft30yQD4JpAWsqvl0wBEMvkYz1GYp9mKwgqmVHlfmzSZrLRM57HO3SuL0S 图片zip压缩包\nmf://h3zE012Z3gKsUUfWOvltzuOUJaQYfhFk6KpTLxQhQG9fsbvBwU51nYFk7wF8b4k6NihxDXB9f1T9yGXlQwYbXv8zU4SoeXcI1I5vhhGtmzz5Mm5NDDFzOylIaCLKg4dMjL6fFAQt3oHWG8ciU5yuzaUoaj7T0xcnutDSiPtCXpLzbDY2LH3QbMERnheWleVjHJWIuG0bQXXA6Amtp3HLU0h3B7KHP8d7jROHefUX00qt7EtrgMb 测试1\nmf://jmMvcP26D8so7KsCixpCUHlmwzJFtBCiHcpOr2VHCdoJfLlHGTowNz7taoMK6KMgU33MAZMh1KCgW7cHIHi0VFr9BKYZ8diCSd1vGlWBPb1R1BAy2fbLpFDL1i4Q6HafsMoaUAgXeQXbUKjkkfgBPtXLuFxcShcEZJ0YiwDMisZGwxT3V2gsuftGFvtERlJ9NxfI8YF8LFtdx5DmJh1v952CBFclRfAL47YTHMmV9PzHBMHTBjrEh76 测试2\nmf://jmMvcP26D8so7KsCixpCUHlmwzJznuUpLaTltEwxcmYM5lBWeZptyCtLpUAQzEH6heRnR1ONCrBMz5aDIpQ03RRrxFAdeGPBhQm791azaRXVxZbA8ZrCTyPScmxVdfSuOdaZCHYcAvIWq7QRXncIeiLFpO84lBFFGgFS1v5uB0sUzP8zTVNq3E58RToqUvhwpznS17ZftpfZNR79aSKvwlydAUcWs0oORYyP466fhGvuQn3Jec37XJw ","date":"2024-10-22T13:37:42+08:00","permalink":"https://blog.lufei.de/p/345/","title":"MixFile: 一款可以上传加密文件并分享的安卓APP"},{"content":"项目 项目：https://github.com/tw93/Pake/\n免费ICO图片：https://icon-icons.com/zh/\n实例：https://www.123865.com/s/cjqrVv-OjTQd\n设置环境 以下教程仅针对windows系统适用\n请确保您的 Node.js 版本为 18 或更高版本\n文档：https://v1.tauri.app/zh-cn/v1/guides/getting-started/prerequisites/\nMicrosoft Visual Studio C++ 生成工具\nWebView2\nRust(难点)\n前面两点容易，难的是安装Rust，原因在于网络互通，因为github,npm默认都是国外的地址，我的方法有两种：\n设置代理方法1 1.我使用的是v2rayN 并将监听端口设置为7890，所以，打开cmd，输入以下代码\nsetx http_proxy \u0026#34;http://127.0.0.1:7891\u0026#34; setx https_proxy \u0026#34;http://127.0.0.1:7891\u0026#34; 2.https://www.rust-lang.org/tools/install 下载Rust，双击打开，输入序号1安装依赖\n方法2：使用winget安装rust 首先安装winget，如果你的系统没有安装winget ，步骤如下：\n下载winget\nhttps://github.com/microsoft/winget-cli/releases/download/v1.9.2507/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle 然后打开powershell，导航到下载目录，使用以下命令安装msixbundle文件：\nAdd-AppxPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle 换源\nwinget source remove msstore winget source add winget https://cdn.winget.microsoft.com/cache 打开powershell，设置代理：\n$env:http_proxy=\u0026#34;http://127.0.0.1:7891\u0026#34; $env:https_proxy=\u0026#34;http://127.0.0.1:7891\u0026#34; 最后安装rust\nwinget install --id Rustlang.Rustup 命令行打包 首先安装pake-cli,步骤：\n1.换源（可选）\nnpm config set registry https://mirrors.huaweicloud.com/repository/npm/ 2.安装（必须）\nnpm install pake-cli -g 3.一键打包，参考如下：\npake https://woniu336.github.io --name blog --icon blog.ico --installer-language zh-CN --show-system-tray --system-tray-icon blog.ico https://woniu336.github.io 打包的网址，前面带http/https blog为程序名称，最好是单个英文，不能有下划线和中文 ico文件放在当前目录 zh-CN 设置安装程序为中文 更多参数：https://github.com/tw93/Pake/blob/master/bin/README_CN.md\n最后，打包成功的文件在命令所在目录，以.msi为后缀\n其他命令 清除代理命令,安装成功后可选\nsetx http_proxy \u0026#34;\u0026#34; setx https_proxy \u0026#34;\u0026#34; 更新你的 Rust 版本\nrustup update 卸载 Rust\nrustup self uninstall ","date":"2024-10-20T21:29:43+08:00","permalink":"https://blog.lufei.de/p/344/","title":"使用Pake一键打包网页为桌面应用/客户端"},{"content":"指定容器更新 docker run -d \\ --name watchtower \\ --restart unless-stopped \\ -v /var/run/docker.sock:/var/run/docker.sock \\ containrrr/watchtower -c \\ --interval 10 \\ deeplx --interval 10指定更新频率10秒，最好设置大一点，10秒是为了首次安装测试 deeplx是容器名称 按白名单更新(灵活) 创建白名单：\ntouch ~/.docker_update.list 编辑\nnano ~/.docker_update.list 在文件中,每行添加一个您想要 Watchtower 自动更新的容器名称。例如:\ncontainer1 container2 运行\ndocker run -d \\ --name watchtower \\ --restart unless-stopped \\ -v /var/run/docker.sock:/var/run/docker.sock \\ containrrr/watchtower -c \\ $(cat ~/.docker_update.list) \\ --interval 10 定时更新 docker run -d \\ --name watchtower \\ --restart unless-stopped \\ -v /var/run/docker.sock:/var/run/docker.sock \\ containrrr/watchtower -c \\ $(cat ~/.docker_update.list) \\ --schedule \u0026#34;0 40 3 * * *\u0026#34; 6字段的表达式，不是传统的5字段，顺序是：秒分时日月周\n注意：--interval和--schedule只能二选一\n","date":"2024-10-18T03:47:50+08:00","permalink":"https://blog.lufei.de/p/343/","title":"自动管理docker容器更新的工具Watchtower"},{"content":"\n项目 原项目: https://github.com/Cp0204/quark-auto-save\n本次项目：https://github.com/woniu336/kua\n关于夸克网盘分享链接失效或者屏蔽问题\n你可能有所了解，假设别人分享一个很热门的影视作品，大概率用不了多久，这个分享链接就会什么都没有，而且会出现以下三种情况\n热门资源被官方屏蔽分享，你会在网盘看到资源显示不可分享，即使链接有效，别人也看不到资源 资源被人为删除或者移动到其他文件夹 取消了分享或者分享链接具有有效期 基于以上情况，我根据原项目修改了一下，主要是方便自己用，如果热门资源被官方屏蔽了分享，注意：只是不能分享了，但是资源还是在网盘里的，你可以下载到电脑上。如果屏蔽了分享或者失效可以收到钉钉通知，然后我会把资源下载到本地，使用转码工具压缩一下再上传，最后分享出去，大概率这条分享链接能活久一点。\n另外做了一个index.html查看页面，每分钟自动刷新，可以把整个项目文件放在网站根目录下使用\n流程 1.获取夸克网盘cookie 登录 https://pan.quark.cn/ 按 F12 查找 Cookie\n把Cookie写入quark_config.json文件\n2.钉钉通知（可选） 修改check_movie_links.py\nACCESS_TOKEN = \u0026#34;\u0026#34; SECRET = \u0026#34;\u0026#34; 3.添加夸克网盘分享链接 格式: 文件名@url\n写入movie_links.txt文件\n4.运行脚本 python3 check_movie_links.py quark_config.json movie_links.txt 5.排除文件 把需要排除的文件写入.gitignore\n5.定时任务 每2小时检测一次\n(crontab -l ; echo \u0026#34;0 */2 * * * cd /www/wwwroot/kua.123.top \u0026amp;\u0026amp; python3 check_movie_links.py quark_config.json movie_links.txt \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2024-10-17T02:40:48+08:00","permalink":"https://blog.lufei.de/p/342/","title":"夸克网盘分享链接有效性监控"},{"content":"按照 Form 要求填写自己的名字、邮箱地址、以及遇到的问题\n例如我现在的问题是：my site is not indexed by Bing：\n打开以下网址提交信息：\nhttps://www.bing.com/webmasters/support\n写入如下内容，记得替换成你的网站域名：\nMy website is www.123.com I\u0026#39;m not sure why Bing search engine hasn\u0026#39;t been indexing my site for almost a month now, while other search engines have basically included it. Previously, my website was searchable on Bing using keywords, but recently I\u0026#39;ve noticed it has completely disappeared from the search results. I\u0026#39;m not clear if my website has violated Bing\u0026#39;s algorithm rules in some way. I hope an engineer could provide some guidance and advice. 提交成功了，等回复\nYour request has been successfully submitted…\nClick to go back to Webmaster tools\n","date":"2024-10-15T14:05:00+08:00","permalink":"https://blog.lufei.de/p/341/","title":"Bing必应不收录网站或被K的解决办法"},{"content":"\n下载地址 Win11企业版 2024 长期服务版 (Windows 11 IoT Enterprise LTSC 2024) 提供长达 10 年的支持服务，支持至 2034 年。\n它可视为官方推出的精简版 Win11，系统稳定流畅，对电脑硬件的要求较低，适合性能有限的设备。用户可以通过数字权利实现永久激活。 LTSC 版本去除了应用商店、微软小娜（Cortana）、OneDrive，并且 Windows 更新提供了更多高级设置，用户可选择性安装系统更新，极大提升了系统的可控性和定制化。\nMicrosoft Windows 11 Enterprise LTSC 2024 官方简体中文正式版ISO镜像下载地址\nzh-cn_windows_11_enterprise_ltsc_2024_x64_dvd_cff9cd2d.iso（4.92G）SHA: 2CB21649590C8CF770CD93556596DFF4FD800F24D267A9BE9D9CE0EE9E03F5AC\n【点击下载】或 【BT磁力下载】\nMicrosoft Windows 11 Enterprise LTSC 2024 英文版官方下载 【点击下载 】\nWindows 11 IoT Enterprise LTSC 2024 物联英文版官方下载\n【点击前往】\n激活 Windows 11 2024 LTSC 长期服务版 KMS 官方密钥获取：\n【点击前往】\n或者使用以下命令(cmd管理员)：\nslmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D slmgr -skms kms.v0v.bid slmgr -ato 安装后可以进一步精简系统,使用DISM快速禁用或启用保留空间：\n# 禁用系统保留空间\nDISM.exe /Online /Set-ReservedStorageState /State:Disabled ","date":"2024-10-11T13:03:16+08:00","permalink":"https://blog.lufei.de/p/340/","title":"Windows 11 LTSC 2024 官方精简版！简体中文正式版ISO镜像下载"},{"content":"WAF 防火墙一 (cf.threat_score ge 5 and not cf.client.bot) or (not http.request.version in {\u0026#34;HTTP/2\u0026#34; \u0026#34;HTTP/3\u0026#34; \u0026#34;HTTP/1.1\u0026#34;}) or (ip.geoip.country in {\u0026#34;FR\u0026#34; \u0026#34;DE\u0026#34;}) or (http.request.uri.path wildcard r\u0026#34;/admin.php/*\u0026#34;) 解释如下：\n如果满足以下任一条件，则触发规则：\nCloudflare 威胁评分大于或等于 5，且客户端不是机器人\n使用的 HTTP 协议版本不是 HTTP/2、HTTP/3 或 HTTP/1.1\n请求来自法国或德国,即对法国和德国实施防御\n请求的 URI 路径以 \u0026ldquo;/admin.php/\u0026rdquo; 开头\n防火墙二 (http.request.uri.query contains \u0026#34;)/*\u0026#34;) or (http.request.uri.query contains \u0026#34;)--\u0026#34;) or (http.request.uri.query contains \u0026#34;benchmark(\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026#39;0:0:20\u0026#39;\u0026#34;) or (http.request.uri.query contains \u0026#34;MD5(\u0026#34;) or (http.request.uri.query contains \u0026#34;%20waitfor%20delay%20\u0026#34;) or (http.request.uri.query contains \u0026#34;%22\u0026#34;) or (http.request.uri.query contains \u0026#34;%20/*\u0026#34;) or (http.request.uri.query contains \u0026#34;%20--\u0026#34;) or (http.request.uri.query contains \u0026#34;%20%23\u0026#34;) or (http.request.uri.query contains \u0026#34;)%23\u0026#34;) or (http.request.uri.query contains \u0026#34;script\u0026gt;\u0026#34;) or (http.request.uri.query contains \u0026#34;%40\u0026#34;) or (http.request.uri.query contains \u0026#34;%00\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026lt;?php\u0026#34;) or (http.request.uri.query contains \u0026#34;0x00\u0026#34;) or (http.request.uri.query contains \u0026#34;0x08\u0026#34;) or (http.request.uri.query contains \u0026#34;0x09\u0026#34;) or (http.request.uri.query contains \u0026#34;0x0a\u0026#34;) or (http.request.uri.query contains \u0026#34;0x0d\u0026#34;) or (http.request.uri.query contains \u0026#34;0x1a\u0026#34;) or (http.request.uri.query contains \u0026#34;0x22\u0026#34;) or (http.request.uri.query contains \u0026#34;0x25\u0026#34;) or (http.request.uri.query contains \u0026#34;0x27\u0026#34;) or (http.request.uri.query contains \u0026#34;0x5c\u0026#34;) or (http.request.uri.query contains \u0026#34;0x5f\u0026#34;) or (http.request.uri.query contains \u0026#34;SELECT\u0026#34;) or (http.request.uri.query contains \u0026#34;concat\u0026#34;) or (http.request.uri.query contains \u0026#34;union\u0026#34;) or (http.request.uri.query contains \u0026#34;0x50\u0026#34;) or (http.request.uri.query contains \u0026#34;DROP\u0026#34;) or (http.request.uri.query contains \u0026#34;WHERE\u0026#34;) or (http.request.uri.query contains \u0026#34;ONION\u0026#34;) or (http.request.uri.query contains \u0026#34;0x3c62723e3c62723e3c62723e\u0026#34;) or (http.request.uri.query contains \u0026#34;0x3c696d67207372633d22\u0026#34;) or (http.request.uri.query contains \u0026#34;OR\u0026#34;) or (http.request.uri.query contains \u0026#34;0x3e\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026lt;img\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026lt;image\u0026#34;) or (http.request.uri.query contains \u0026#34;document.cookie\u0026#34;) or (http.request.uri.query contains \u0026#34;onerror()\u0026#34;) or (http.request.uri.query contains \u0026#34;alert(\u0026#34;) or (http.request.uri.query contains \u0026#34;window.\u0026#34;) or (http.request.uri.query contains \u0026#34;String.fromCharCode(\u0026#34;) or (http.request.uri.query contains \u0026#34;javascript:\u0026#34;) or (http.request.uri.query contains \u0026#34;onmouseover=\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026lt;BODY onload\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026lt;style\u0026#34;) or (http.request.uri.query contains \u0026#34;svg onload\u0026#34;) or (http.request.uri.query contains \u0026#34;substring(\u0026#34;) or (http.request.uri.query contains \u0026#34;length(\u0026#34;) or (http.request.uri.query contains \u0026#34;version(\u0026#34;) or (http.request.uri.query contains \u0026#34;database(\u0026#34;) or (http.request.uri.query contains \u0026#34;user(\u0026#34;) or (http.request.uri.query contains \u0026#34;AND 1=1\u0026#34;) or (http.request.uri.query contains \u0026#34;AND 1=2\u0026#34;) or (http.request.uri.query contains \u0026#34;OR 1=1\u0026#34;) or (http.request.uri.query contains \u0026#34;OR 1=2\u0026#34;) or (http.request.uri.query contains \u0026#34;%27OR1=1--\u0026#34;) or (http.request.uri.query contains \u0026#34;UNION ALL SELECT\u0026#34;) or (http.request.uri.query contains \u0026#34;/etc/passwd\u0026#34;) or (http.request.uri.query contains \u0026#34;../../\u0026#34;) or (http.request.uri.query contains \u0026#34;/proc/self/environ\u0026#34;) or (http.request.uri.query contains \u0026#34;file=\u0026#34;) or (http.request.uri.query contains \u0026#34;page=\u0026#34;) or (http.request.uri.query contains \u0026#34;http://\u0026#34;) or (http.request.uri.query contains \u0026#34;ftp://\u0026#34;) or (http.request.uri.query contains \u0026#34;data://\u0026#34;) or (http.request.uri.query contains \u0026#34;|cat\u0026#34;) or (http.request.uri.query contains \u0026#34;\u0026amp;\u0026amp;\u0026#34;) or (http.request.uri.query contains \u0026#34;||\u0026#34;) or (http.request.uri.query contains \u0026#34;`\u0026#34;) or (http.request.uri.query contains \u0026#34;$(\u0026#34;) or (http.request.uri.query contains \u0026#34;ping\u0026#34;) or (http.request.uri.query contains \u0026#34;curl\u0026#34;) or (http.request.uri.query contains \u0026#34;wget\u0026#34;) or (http.request.uri.query contains \u0026#34;%0d%0a\u0026#34;) or (http.request.uri.query contains \u0026#34;%0a\u0026#34;) or (http.request.uri.query contains \u0026#34;%0d\u0026#34;) or (http.request.uri.query contains \u0026#34;phpinfo()\u0026#34;) or (http.request.uri.query contains \u0026#34;hostname\u0026#34;) or (http.request.uri.query contains \u0026#34;whoami\u0026#34;) or (http.request.uri.query contains \u0026#34;uname -a\u0026#34;) or (http.request.uri.query contains \u0026#34;pwd\u0026#34;) or (http.request.uri.query contains \u0026#34;netstat\u0026#34;) ","date":"2024-10-10T14:28:56+08:00","permalink":"https://blog.lufei.de/p/339/","title":"cloudflare防火墙waf的设置"},{"content":"文档 https://platform.openai.com/docs/bots\n禁止IP sudo ufw insert 1 deny from 20.171.206.0/24 to any sudo ufw insert 1 deny from 20.171.207.0/24 to any sudo ufw insert 1 deny from 52.230.152.0/24 to any sudo ufw insert 1 deny from 52.233.106.0/24 to any sudo ufw insert 1 deny from 4.227.36.0/24 to any 阻止user-agent Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.1; +https://openai.com/gptbot ","date":"2024-10-09T13:07:28+08:00","permalink":"https://blog.lufei.de/p/338/","title":"屏蔽GPTbot爬虫"},{"content":" 如果没有正确配置规则，您可能会失去对服务器的访问权限,所以，从SSH入手\n安装ufw debian/ubuntu\nsudo apt update sudo apt install ufw 请注意，在启用 UFW 之前，必须配置SSH规则，以确保不会意外地阻止连接（如ssh）。\n查看当前的规则配置 在启用 UFW 之前，建议您先查看当前的规则配置：\nsudo ufw show added 允许 SSH 连接的规则 首先，添加一条允许 SSH 连接的规则：\nsudo ufw allow ssh 如果您使用的是非标准 SSH 端口，请使用实际的端口号。例如，如果您的 SSH 端口是 2222：\nsudo ufw allow 2222/tcp 添加规则后，再次检查已添加的规则：\nsudo ufw show added 如果您看到 SSH 规则已经添加，那么现在启用 UFW 应该是安全的：\nsudo ufw enable 启用后，检查 UFW 状态：\nsudo ufw status verbose 这将显示 UFW 是否处于活动状态以及当前的规则。\n如果您只想知道 ufw 是否处于活动状态，可以使用：\nsudo ufw status | grep -q \u0026#34;Status: active\u0026#34; \u0026amp;\u0026amp; echo \u0026#34;UFW 已启用\u0026#34; || echo \u0026#34;UFW 未启用\u0026#34; 白名单 为每个白名单 IP 添加允许访问 7788 端口的规则:\nsudo ufw allow from 192.168.1.100 to any port 7788 # 白名单IP 1 sudo ufw allow from 203.0.113.45 to any port 7788 # 白名单IP 2 最后添加拒绝所有 IP 访问 7788 端口的规则:\nsudo ufw deny 7788 检测\nsudo ufw status numbered ","date":"2024-10-08T20:27:56+08:00","permalink":"https://blog.lufei.de/p/337/","title":"正确开启ufw的方式"},{"content":"Git操作助手 基于windows系统\nGit操作助手是一个基于PyQt5的图形用户界面(GUI)应用程序,旨在简化常见的Git操作。它为Git新手和有经验的用户提供了一个直观的界面来执行各种Git命令。\n安装要求 在运行此程序之前,请确保您的系统满足以下要求:\nPython 3.x PyQt5 Git 安装步骤 确保您已安装Python 3.x。可以从Python官网下载并安装。\n安装PyQt5。打开命令行并运行:\npip install PyQt5 确保Git已安装在您的系统上。如果没有,请从Git官网下载并安装。\n使用方法 下载git_ui.py文件到您的本地计算机。\nhttps://github.com/woniu336/open_shell/blob/main/git_ui.py 打开命令行,导航到包含git_ui.py文件的目录。\n运行以下命令启动程序:\npython git_ui.py 程序启动后,您将看到Git操作助手的图形界面。\n使用说明 分支操作 创建新分支: 在\u0026quot;新分支名\u0026quot;输入框中输入分支名,然后点击\u0026quot;创建新分支\u0026quot;按钮。 切换分支: 在\u0026quot;切换到\u0026quot;输入框中输入分支名,然后点击\u0026quot;切换分支\u0026quot;按钮。 切换到上一个分支: 点击\u0026quot;切换到上一个分支\u0026quot;按钮。 提交操作 设置快速提交别名: 点击\u0026quot;设置快速提交别名\u0026quot;按钮。 快速提交: 在\u0026quot;提交信息\u0026quot;输入框中输入提交信息,然后点击\u0026quot;快速提交\u0026quot;按钮。 修改最后一次提交: 点击\u0026quot;修改最后一次提交\u0026quot;按钮。 重置操作 软重置: 点击\u0026quot;软重置(保留更改)\u0026ldquo;按钮。 硬重置: 点击\u0026quot;硬重置(丢弃更改)\u0026ldquo;按钮。请谨慎使用,因为这将丢弃所有未提交的更改。 信息显示 分支信息: 在\u0026quot;分支信息\u0026quot;标签页中查看所有分支和当前分支。 提交历史: 在\u0026quot;提交历史\u0026quot;标签页中查看最近的提交记录。 注意事项 在使用\u0026quot;硬重置\u0026quot;功能时要特别小心,因为它会丢弃所有未提交的更改。 如果在一个新的目录中运行这个程序,它会提示您初始化一个新的Git仓库。 程序会自动设置一些Git的编码配置,以确保正确处理中文字符。 故障排除 如果遇到任何问题,请确保:\n您已正确安装了所有依赖项。 您的系统上已安装并配置了Git。 您在一个有效的Git仓库目录中运行程序。 如果问题仍然存在,请检查控制台输出以获取更多信息。\n","date":"2024-10-01T23:27:16+08:00","permalink":"https://blog.lufei.de/p/336/","title":"Git操作助手"},{"content":"Git Switch 指南 git switch 命令用于切换分支或创建新分支。以下是常见用法：\n切换到已存在的分支：\ngit switch \u0026lt;分支名\u0026gt; 例如：git switch main\n创建新分支并切换到该分支：\ngit switch -c \u0026lt;新分支名\u0026gt; 例如：git switch -c feature-branch\n基于特定的提交创建新分支：\ngit switch -c \u0026lt;新分支名\u0026gt; \u0026lt;提交哈希\u0026gt; 例如：git switch -c bugfix-branch 1a2b3c4\n切换到上一个分支：\ngit switch - 切换到某个标签：\ngit switch --detach \u0026lt;标签名\u0026gt; 例如：git switch --detach v1.0.0\n放弃本地更改并切换分支：\ngit switch -f \u0026lt;分支名\u0026gt; 警告：这会丢失未提交的更改。\n从远程分支创建本地分支并切换：\ngit switch -c \u0026lt;本地分支名\u0026gt; origin/\u0026lt;远程分支名\u0026gt; 例如：git switch -c local-feature origin/feature\n注意事项：\n使用 git switch 前，确保当前工作区是干净的，或者已经提交/暂存了更改。 如果有未提交的更改与目标分支冲突，Git 会阻止切换。 使用 git switch --detach 会进入\u0026quot;分离头指针\u0026quot;状态，在此状态下的提交可能会丢失，除非创建新分支。 查看所有分支：\nGit Commit 使用技巧 快速提交所有更改：\ngit commit -am \u0026#34;提交信息\u0026#34; 注意：这只会提交已被 Git 跟踪的文件的更改。\n使用别名快速提交： 首先设置别名：\ngit config --global alias.ac \u0026#39;!git add -A \u0026amp;\u0026amp; git commit -m\u0026#39; 然后使用：\ngit ac \u0026#34;提交信息\u0026#34; 记住：虽然这些快捷方式可以提高效率，但在提交之前仍然要仔细检查您的更改。\nGit 错误恢复指南 如果您不小心提交了不需要的更改，可以使用以下方法回到上一步：\n撤销最近的提交，但保留更改：\ngit reset --soft HEAD~1 这允许您重新审视更改并重新提交。\n撤销最近的提交并丢弃更改（谨慎使用）：\ngit reset --hard HEAD~1 警告：这将永久删除最后一次提交的所有更改。\n创建一个新的提交来撤销之前的提交：\ngit revert HEAD 这会创建一个新的提交，撤销上一次提交的更改。\n修改最后一次提交：\ngit commit --amend 用于修改提交信息或添加遗漏的文件。\n注意：如果您已经推送了提交到远程仓库，使用这些命令后可能需要强制推送（git push \u0026ndash;force）。请谨慎使用强制推送，特别是在共享分支上。\n","date":"2024-10-01T22:03:43+08:00","permalink":"https://blog.lufei.de/p/335/","title":"Git 指南技巧"},{"content":"/www/server/nginx/conf 新建文件 cf.conf，添加以下内容保存\nset_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; real_ip_header CF-Connecting-IP; 配置修改 宝塔面板打开nginx管理，选择配置修改，在http下添加 include cf.conf；然后点击保存。\ninclude cf.conf; 保存后返回服务，点击重载配置，这样就能获取到真实用户IP了\nIP 地址范围 ipv4\nhttps://www.cloudflare-cn.com/ips-v4/\nipv6\nhttps://www.cloudflare-cn.com/ips-v6/\n自动更新IP脚本 pip3 install requests wget https://raw.githubusercontent.com/woniu336/open_shell/main/update_cf_ips.py chmod +x update_cf_ips.py python3 update_cf_ips.py 定时任务\n(crontab -l ; echo \u0026#34;0 0 */15 * * python3 update_cf_ips.py \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2024-09-30T22:34:16+08:00","permalink":"https://blog.lufei.de/p/334/","title":"宝塔 nginx 获取 cloudflare 真实用户IP"},{"content":"一键脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/block_censys_ips.sh \u0026amp;\u0026amp; chmod +x block_censys_ips.sh \u0026amp;\u0026amp; ./block_censys_ips.sh 或者\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/censys_ufw_blocker.sh \u0026amp;\u0026amp; chmod +x censys_ufw_blocker.sh \u0026amp;\u0026amp; ./censys_ufw_blocker.sh 如果出现ipv6的bug,可能是没有开启ipv6\nsudo sed -i \u0026#39;s/IPV6=no/IPV6=yes/\u0026#39; /etc/default/ufw sudo ufw reload 查看规则\nsudo ufw status numbered 屏蔽 Censys 的 IP 段 sudo ufw insert 1 deny from 162.142.125.0/24 to any sudo ufw insert 1 deny from 167.94.138.0/24 to any sudo ufw insert 1 deny from 167.94.145.0/24 to any sudo ufw insert 1 deny from 167.94.146.0/24 to any sudo ufw insert 1 deny from 167.248.133.0/24 to any sudo ufw insert 1 deny from 199.45.154.0/24 to any sudo ufw insert 1 deny from 199.45.155.0/24 to any sudo ufw insert 1 deny from 206.168.34.0/24 to any v6单独添加，首先查看编号\nsudo ufw status numbered 再把以下插入到v6最上方，假设最上方的v6编号是20\nsudo ufw insert 20 deny from 2602:80d:1000:b0cc:e::/80 sudo ufw insert 21 deny from 2620:96:e000:b0cc:e::/80 sudo ufw insert 22 deny from 2602:80d:1003::/112 sudo ufw insert 23 deny from 2602:80d:1004::/112 facebook\nsudo ufw insert 24 deny from 2620:0:1c00::/40 sudo ufw insert 25 deny from 2a03:2880::/32 sudo ufw insert 26 deny from 2a03:2880:fffe::/48 sudo ufw insert 27 deny from 2a03:2880:ffff::/48 sudo ufw insert 28 deny from 2620:0:1cff::/48 屏蔽单独的风险IP地址 sudo ufw insert 1 deny from 94.154.33.153 to any sudo ufw insert 1 deny from 185.220.101.29 to any sudo ufw insert 1 deny from 138.197.191.87 to any sudo ufw insert 1 deny from 152.42.217.201 to any sudo ufw insert 1 deny from 149.88.106.138 to any sudo ufw insert 1 deny from 179.43.191.19 to any sudo ufw insert 1 deny from 146.190.111.4 to any sudo ufw insert 1 deny from 185.220.101.190 to any sudo ufw insert 1 deny from 192.42.116.178 to any sudo ufw insert 1 deny from 46.101.119.104 to any sudo ufw insert 1 deny from 206.81.24.74 to any sudo ufw insert 1 deny from 64.226.78.121 to any sudo ufw insert 1 deny from 193.24.123.69 to any sudo ufw insert 1 deny from 139.59.132.8 to any sudo ufw insert 1 deny from 172.236.233.65 to any 屏蔽IP范围 包含一些垃圾IDC疯狂扫描的情况\nsudo ufw insert 1 deny from 20.171.206.0/24 to any sudo ufw insert 1 deny from 52.230.152.0/24 to any sudo ufw insert 1 deny from 52.233.106.0/24 to any sudo ufw insert 1 deny from 152.32.128.0/17 to any sudo ufw insert 1 deny from 103.218.243.0/24 to any 屏蔽facebook爬虫 sudo ufw insert 1 deny from 69.63.176.0/21 to any sudo ufw insert 1 deny from 69.63.184.0/21 to any sudo ufw insert 1 deny from 66.220.144.0/20 to any sudo ufw insert 1 deny from 69.63.176.0/20 to any 屏蔽SemrushBot sudo ufw insert 1 deny from 85.208.96.0/24 to any sudo ufw insert 1 deny from 185.191.171.0/24 to any 重新加载UFW生效 sudo ufw reload 查看规则\nsudo ufw status numbered 清空所有屏蔽 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clear_ufw_rules.sh \u0026amp;\u0026amp; chmod +x clear_ufw_rules.sh \u0026amp;\u0026amp; ./clear_ufw_rules.sh ","date":"2024-09-30T21:37:16+08:00","permalink":"https://blog.lufei.de/p/333/","title":"屏蔽拦截风险、爬虫、恶意IP扫描"},{"content":"\n在当今复杂多变的网络环境中，服务器安全管理已成为一项不可或缺的任务。然而，面对海量的日志数据，如何快速精准地提取有价值的信息，并及时发现潜在的安全威胁？本文将为您介绍一款强大的服务器日志检索与查杀工具，它不仅能够自动化地分析网站日志、追踪IP地理分布，还能执行可疑IP的风险检查，为您的服务器安全保驾护航。\n工具特点 自动化日志分析 IP地理位置追踪 可疑IP风险检查 简单高效的操作界面 无论您是经验丰富的系统管理员，还是刚刚起步的网站运营者，这个工具都能帮助您轻松应对日常的安全监控工作，让服务器安全管理变得简单而高效。\n系统要求 操作系统：Ubuntu/Debian 确保安装了Python 3 安装步骤 下载脚本 cd ~ curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/manage_logs.sh \u0026amp;\u0026amp; chmod +x manage_logs.sh \u0026amp;\u0026amp; ./manage_logs.sh 首次运行顺序 菜单1：安装依赖文件和下载脚本 菜单5：更新地理位置数据（需要输入密钥：O38GA2SviPLnqfF5） 菜单2：添加或更改日志路径 注意事项 本工具主要适用于宝塔面板，因为是根据宝塔面板日志格式匹配的。如果您不使用宝塔面板，可以根据自己的日志格式修改web_log_monitor.py脚本中的正则表达式。\n确保宝塔面板已开启站点日志功能。如果之前未勾选，可能需要等待一段时间才能收集到足够的日志数据。\n首次执行时需按顺序运行菜单选项，以生成必要的分析文件。\n风险拦截 以改成使用ufw防火墙的方式拦截，自带无需修改任何文件\n本工具可以配合fail2ban脚本使用，实现更强大的风险拦截功能。如果您不想使用fail2ban，可以修改以下文件中的相关代码：\n/root/logcheck/ban_severe_risk_ips.py /root/logcheck/logcheck.py /root/logcheck/web_log_monitor.py 将这些文件中的#command = f\u0026quot;sudo ufw insert 1 deny from {ip} to any\u0026quot;取消注释，并注释掉fail2ban相关代码即可。\n如果您希望配合fail2ban使用，可以运行以下命令安装fail2ban脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fail2ban-s.sh \u0026amp;\u0026amp; chmod +x fail2ban-s.sh \u0026amp;\u0026amp; ./fail2ban-s.sh 结语 这款服务器日志检索与查杀工具为您提供了一个强大而简便的安全管理解决方案。通过自动化的日志分析、IP追踪和风险检查，您可以更轻松地掌控服务器安全状况，及时发现并应对潜在威胁。无论您是专业的系统管理员还是初学者，这个工具都能帮助您提升服务器安全管理的效率和效果。立即尝试，让您的服务器安全管理更上一层楼！\n","date":"2024-09-26T02:11:42+08:00","permalink":"https://blog.lufei.de/p/332/","title":"从日志到洞察:轻松实现服务器安全管理的神器"},{"content":" 官网：https://my.frantech.ca/cart.php?gid=39\n后台：https://manage.buyvm.net/\n脚本监控的配置是卢森堡3.5美金/月\n每5秒钟监控一次\n下载脚本 cd /root \u0026amp;\u0026amp; mkdir -p buyvm \u0026amp;\u0026amp; cd buyvm 下载这两个文件\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/buyvm/buyvm.py wget https://raw.githubusercontent.com/woniu336/open_shell/main/buyvm/monitor.sh 给monitor.sh添加执行权限\nchmod +x monitor.sh 修改脚本 使用这个脚本之前，请确保：\n将YOUR_ACCESS_TOKEN替换为您的实际钉钉机器人access token。\n将YOUR_SECRET替换为您的实际钉钉机器人加签密钥（SEC开头的字符串）。\n安装所需的Python库：\npip install requests 启动 ./monitor.sh start 停止监控\n./monitor.sh stop 重启监控\n./monitor.sh restart 查看日志：\ntail -f monitor.log 其他 卢森堡服务器设置：\n安装curl\napt-get update apt-get install curl 安装sudo\napt-get update apt-get install sudo ","date":"2024-09-23T14:03:42+08:00","permalink":"https://blog.lufei.de/p/331/","title":"卢森堡服务器库存监控脚本"},{"content":" 系统环境：debian/ubuntu 、 安装了python3\n原作者项目：https://github.com/Cp0204/quark-auto-save 感谢\n缘起 我喜欢看电影追剧，会经常转存一些资源到夸克网盘，电影还好，如果是电视剧，麻烦就来了。\n对于一些持续更新的资源，不是说你转存了别人的资源就会自动在你网盘更新了，需要手动隔段时间去转存十分麻烦。\n举个例子（如果你没用过夸克网盘）：当初你转存了一部电视剧，更新到第10集，隔段时间更新到了20集，网盘会提示你转存有更新\n这时候你需要打开转存的页面，手动保存更新的集数（11到20集），如此便很麻烦，如果你转存了很多东西\n部署 不用看到部署就慌张，我的东西从来就是简单、高效、清晰，不需要会敲代码。\n原项目有docker部署方式，但是经常在后台抽风，看不到之前添加好的转存任务（可能使用方式不对）\n所以，为了方便自己，制作了脚本，我向来喜欢使用脚本，因为简单高效\n安装依赖 sudo apt-get install jq 这条命令安装 jq,它是一个轻量级的命令行 JSON 处理器。\n克隆仓库: cd ~ git clone https://github.com/Cp0204/quark-auto-save.git 这些命令将您带到 root 目录,然后克隆 quark-auto-save 仓库。\n重命名目录: mv quark-auto-save quark 这条命令将 quark-auto-save 目录重命名为 quark。\n下载并覆盖文件: cd quark wget -N https://raw.githubusercontent.com/woniu336/open_shell/main/quark/movie_list.py wget -N https://raw.githubusercontent.com/woniu336/open_shell/main/quark/check_quark_links.py wget -N https://raw.githubusercontent.com/woniu336/open_shell/main/quark/movie_list.txt wget -N https://raw.githubusercontent.com/woniu336/open_shell/main/quark/quark_config.json wget -N https://raw.githubusercontent.com/woniu336/open_shell/main/quark/quark_auto_save.py 运行脚本 cd ~ curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/quark_manager.sh \u0026amp;\u0026amp; chmod +x quark_manager.sh \u0026amp;\u0026amp; ./quark_manager.sh 首先要设置Cookie\n获取Cookie很简单：登录https://pan.quark.cn/ 按F12查找Cookie\n定时任务（也可以在脚本里设置）\n这个定时任务会在每天的上午 8 点、下午 6 点和晚上 9 点运行\n(crontab -l ; echo \u0026#34;0 8,18,21 * * * python3 /root/quark/quark_auto_save.py /root/quark/quark_config.json \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 定时任务测试\npython3 /root/quark/quark_auto_save.py /root/quark/quark_config.json 钉钉通知 钉钉通知的功能是：如果转存链接失效了，会发送消息通知\n注意事项：\nwebhook完整地址是：https://oapi.dingtalk.com/robot/send?access_token=xxxxx\n设置钉钉机器人的token时：只需要复制token后面的xxx\n设置钉钉机器人的secret：其实就是复制【加签】\n记得IP地址添加上服务器ip\n完结~\n","date":"2024-09-22T21:45:00+08:00","permalink":"https://blog.lufei.de/p/330/","title":"一劳永逸:用脚本实现夸克网盘内容自动更新"},{"content":"AVIF的卓越优势 便捷脚本：https://github.com/woniu336/open_shell/blob/main/avif_manager.sh\nAVIF（AV1 Image File Format）正在迅速崛起，成为下一代网络图片格式的有力竞争者。作为基于AV1视频编码技术的图像格式，AVIF在多个方面展现出了令人瞩目的性能。\n1. 卓越的压缩效率 与JPEG和WebP相比，AVIF能在保持相同图像质量的前提下，将文件大小减小30%至50%。这意味着：\n网站可呈现更高质量的图像 显著减少带宽使用 加快页面加载速度 2. 更广泛的色彩支持 支持10位和12位的色彩 兼容HDR（高动态范围）图像 呈现更丰富、更逼真的视觉效果 这对摄影、电商等对图像质量要求较高的领域尤为重要。\n3. 多功能性 支持无损压缩 支持透明度 渐进式解码能力，允许图像在加载过程中逐步显示 4. 日益增长的浏览器支持 主流浏览器如Chrome、Firefox和Opera已开始支持AVIF，其他浏览器也在积极跟进。AVIF有望在不久的将来成为网络图片的主流格式。\n如何在HTML中优化使用AVIF 为充分利用AVIF的优势，同时保证向下兼容性，建议使用以下HTML结构：\n\u0026lt;picture\u0026gt; \u0026lt;!-- 性能表现更好的avif和webp图片格式 --\u0026gt; \u0026lt;source srcset=\u0026#34;img/photo.avif\u0026#34; type=\u0026#34;image/avif\u0026#34;\u0026gt; \u0026lt;source srcset=\u0026#34;img/photo.webp\u0026#34; type=\u0026#34;image/webp\u0026#34;\u0026gt; \u0026lt;!-- 最终的兜底方案 --\u0026gt; \u0026lt;img src=\u0026#34;img/photo.jpg\u0026#34; alt=\u0026#34;图片描述\u0026#34;\u0026gt; \u0026lt;/picture\u0026gt; 此结构确保在支持AVIF的浏览器中使用AVIF格式 在支持WebP但不支持AVIF的浏览器中使用WebP格式 在其他情况下回退到传统的JPEG格式 注意：您的图片服务器必须提供avif和webp格式的图片 苹果CMS系统适配 \u0026lt;div class=\u0026#34;movie-poster\u0026#34;\u0026gt; \u0026lt;picture\u0026gt; \u0026lt;source srcset=\u0026#34;{:rtrim(mac_url_img($obj.vod_pic), \u0026#39;.jpg,.png,.jpeg,.gif\u0026#39;)}.avif\u0026#34; type=\u0026#34;image/avif\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;{:mac_url_img($obj.vod_pic)}\u0026#34; alt=\u0026#34;{$obj.vod_name}\u0026#34; referrerpolicy=\u0026#34;no-referrer\u0026#34;\u0026gt; \u0026lt;/picture\u0026gt; \u0026lt;/div\u0026gt; ImageMagick：AVIF转换利器 以下内容仅适用于Windows系统\n安装ImageMagick 访问 ImageMagick官方下载页面 选择适合您系统的安装包 安装时注意：安装文件夹路径不能包含空格，建议新建专门文件夹 设置系统环境变量 确保将ImageMagick的安装路径添加到系统的PATH环境变量中。\nAVIF批量转换脚本 为方便批量处理图片，我制作了一个方便快捷的Shell脚本。该脚本可以：\n批量转换图片为AVIF格式 记录处理过程 输出错误信息和统计数据 在Windows系统下使用Shell脚本，推荐安装Git，并使用Git Bash运行脚本 下载Git：https://git-scm.com/downloads 使用方法 创建新文件，将以下脚本内容保存为avif_manager.sh 双击运行脚本文件 按照提示选择操作并输入图片目录路径 #!/bin/bash # 初始化变量 img_dir=\u0026#34;\u0026#34; # 颜色定义 GREEN=\u0026#39;\\033[0;32m\u0026#39; NC=\u0026#39;\\033[0m\u0026#39; # No Color # 输出到控制台（绿色） output() { echo -e \u0026#34;${GREEN}$1${NC}\u0026#34; } # 转换Windows路径为Bash兼容路径 convert_path() { local input_path=\u0026#34;$1\u0026#34; if command -v cygpath \u0026amp;\u0026gt; /dev/null; then cygpath -u \u0026#34;$input_path\u0026#34; elif command -v wslpath \u0026amp;\u0026gt; /dev/null; then wslpath -u \u0026#34;$input_path\u0026#34; else echo \u0026#34;$input_path\u0026#34; | sed -e \u0026#39;s/^\\([A-Za-z]\\):/\\/\\L\\1/\u0026#39; -e \u0026#39;s/\\\\/\\//g\u0026#39; fi } # 设置目录 set_directories() { while [ -z \u0026#34;$img_dir\u0026#34; ]; do read -r -p \u0026#34;请输入图片目录路径: \u0026#34; input_dir img_dir=$(convert_path \u0026#34;$input_dir\u0026#34;) if [ -d \u0026#34;$img_dir\u0026#34; ]; then output \u0026#34;图片目录已设置为: $img_dir\u0026#34; else echo \u0026#34;错误：目录不存在或无法访问，请重新输入。\u0026#34; img_dir=\u0026#34;\u0026#34; fi done } # 打印统计信息 print_statistics() { local total_files=$1 local total_original_size=$2 local total_new_size=$3 local error_count=$4 local total_savings=$((total_original_size - total_new_size)) local savings_percent=0 if [ $total_original_size -ne 0 ]; then savings_percent=$(awk \u0026#34;BEGIN {printf \\\u0026#34;%.2f\\\u0026#34;, ($total_savings / $total_original_size) * 100}\u0026#34;) fi echo \u0026#34;----------------------------------------\u0026#34; echo \u0026#34;统计信息:\u0026#34; echo \u0026#34;处理的文件数：$total_files\u0026#34; echo \u0026#34;错误数：$error_count\u0026#34; echo \u0026#34;原始总大小：$(numfmt --to=iec-i --suffix=B $total_original_size)\u0026#34; echo \u0026#34;压缩后总大小：$(numfmt --to=iec-i --suffix=B $total_new_size)\u0026#34; echo \u0026#34;节省空间：$(numfmt --to=iec-i --suffix=B $total_savings) ($savings_percent%)\u0026#34; echo \u0026#34;----------------------------------------\u0026#34; } # 处理图片的通用函数 process_images() { local mode=$1 output \u0026#34;开始处理图片 - $mode\u0026#34; output \u0026#34;当前图片目录: $img_dir\u0026#34; if [ ! -d \u0026#34;$img_dir\u0026#34; ]; then echo \u0026#34;错误：图片目录不存在\u0026#34; return fi local total_files=0 local total_original_size=0 local total_new_size=0 local error_count=0 while IFS= read -r -d \u0026#39;\u0026#39; file; do ((total_files++)) filename=$(basename \u0026#34;$file\u0026#34;) dir=$(dirname \u0026#34;$file\u0026#34;) avif_filename=\u0026#34;${filename%.*}.avif\u0026#34; local original_size=$(stat -c%s \u0026#34;$file\u0026#34;) ((total_original_size += original_size)) if magick \u0026#34;$file\u0026#34; -quality 70 -define avif:compression-level=3 -define avif:effort=4 \u0026#34;${dir}/${avif_filename}\u0026#34;; then local new_size=$(stat -c%s \u0026#34;${dir}/${avif_filename}\u0026#34;) ((total_new_size += new_size)) if [ \u0026#34;$mode\u0026#34; = \u0026#34;转换并删除原图\u0026#34; ]; then if rm \u0026#34;$file\u0026#34;; then output \u0026#34;$filename: 已转换并删除原图\u0026#34; else echo \u0026#34;$filename: 转换成功，但无法删除原图\u0026#34; ((error_count++)) fi else output \u0026#34;$filename: 已转换\u0026#34; fi else echo \u0026#34;$filename: 转换失败\u0026#34; ((error_count++)) fi done \u0026lt; \u0026lt;(find \u0026#34;$img_dir\u0026#34; -type f \\( -iname \u0026#34;*.jpg\u0026#34; -o -iname \u0026#34;*.jpeg\u0026#34; -o -iname \u0026#34;*.png\u0026#34; \\) -print0) output \u0026#34;处理完成 - $mode\u0026#34; print_statistics $total_files $total_original_size $total_new_size $error_count } # 转换并删除原图 convert_and_delete_original() { process_images \u0026#34;转换并删除原图\u0026#34; } # 转换并保留原图 convert_and_keep_original() { process_images \u0026#34;转换并保留原图\u0026#34; } # 恢复原图（删除AVIF） restore_original() { output \u0026#34;开始恢复原图 - 删除AVIF\u0026#34; output \u0026#34;当前图片目录: $img_dir\u0026#34; if [ ! -d \u0026#34;$img_dir\u0026#34; ]; then echo \u0026#34;错误：图片目录不存在\u0026#34; return fi local total_files=0 local total_size=0 local error_count=0 while IFS= read -r -d \u0026#39;\u0026#39; file; do ((total_files++)) filename=$(basename \u0026#34;$file\u0026#34;) local file_size=$(stat -c%s \u0026#34;$file\u0026#34;) ((total_size += file_size)) if rm \u0026#34;$file\u0026#34;; then output \u0026#34;$filename: 已删除\u0026#34; else echo \u0026#34;$filename: 删除失败\u0026#34; ((error_count++)) fi done \u0026lt; \u0026lt;(find \u0026#34;$img_dir\u0026#34; -type f -iname \u0026#34;*.avif\u0026#34; -print0) output \u0026#34;恢复完成 - 删除AVIF\u0026#34; print_statistics $total_files $total_size 0 $error_count } # 主菜单 show_menu() { clear echo \u0026#34;=========================================\u0026#34; echo \u0026#34; AVIF 图片管理器 \u0026#34; echo \u0026#34;=========================================\u0026#34; echo \u0026#34;1. 设置目录\u0026#34; echo \u0026#34;2. 转换为AVIF并删除原图\u0026#34; echo \u0026#34;3. 转换为AVIF并保留原图\u0026#34; echo \u0026#34;4. 恢复原图（删除AVIF）\u0026#34; echo \u0026#34;5. 退出\u0026#34; echo \u0026#34;=========================================\u0026#34; echo read -p \u0026#34;请选择操作 (1-5): \u0026#34; choice case $choice in 1) set_directories ;; 2) if [ -z \u0026#34;$img_dir\u0026#34; ]; then set_directories fi convert_and_delete_original ;; 3) if [ -z \u0026#34;$img_dir\u0026#34; ]; then set_directories fi convert_and_keep_original ;; 4) if [ -z \u0026#34;$img_dir\u0026#34; ]; then set_directories fi restore_original ;; 5) exit 0 ;; *) echo \u0026#34;无效选择，请重试。\u0026#34; ;; esac echo read -p \u0026#34;操作完成，按回车键返回主菜单...\u0026#34; } # 主程序 while true; do show_menu done 通过这个脚本，您可以轻松地管理AVIF图片转换过程，包括设置目录、转换图片（可选是否保留原图）以及恢复原图等功能。脚本还会提供详细的统计信息，帮助您了解转换效果。\n通过采用AVIF格式并使用这些工具和方法，您可以显著提升网站的图片加载性能，为用户提供更佳的浏览体验。随着AVIF支持的不断扩大，现在正是开始在您的项目中应用这一先进图片格式的最佳时机。\n","date":"2024-09-22T02:58:05+08:00","permalink":"https://blog.lufei.de/p/329/","title":"为什么AVIF将成为下一代图片格式之王"},{"content":"网站安全 网站安全是必须重点关注的，除非你说你是1ip站点，即使从你建站的那一刻，你总会幻想过日ip过万吧，万一呢，所以，安全的重要性就来了，流量大了，什么鸟都会从四面八方赶来~\n密钥登陆 服务器禁止密码登录，改成密钥登录，选择菜单9：root私钥登录模式\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tp.sh \u0026amp;\u0026amp; chmod +x tp.sh \u0026amp;\u0026amp; ./tp.sh 将密钥保存到本地（sshkey）然后再删除,因为公钥已写入：authorized_keys，大胆删除\nrm /root/.ssh/sshkey /root/.ssh/sshkey.pub 重启ssh\nsudo service ssh restart 监控脚本 首先,我们需要安装 pip\nsudo apt-get update sudo apt-get install python3-pip 用 pip 安装 python-crontab 包\npip3 install python-crontab 下载脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/php-s.py \u0026amp;\u0026amp; chmod +x php-s.py python3 php-s.py 删除的可疑php文件保存在/tmp/suspicious_files 监控记录日志/tmp/scan_history.log 这个脚本的主功能是：\n自动监控多个网站目录中的PHP文件，检测并删除包含高风险域名的代码，同时识别未授权的新增PHP文件并采取相应措施，通过钉钉实时通知管理员异常情况，从而提高网站安全性。\n脚本功能：\n自动删除包含高风险域名的代码行 检测并删除未经授权的新增PHP文件 通过钉钉实时通知管理员异常情况 监控脚本 每5秒监控一次\ncd /root \u0026amp;\u0026amp; curl -O https://raw.githubusercontent.com/woniu336/open_shell/main/scanner_loop.sh 权限\nchmod +x /root/scanner_loop.sh 后台运行\nnohup ./scanner_loop.sh \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 查看进程\nps aux | grep scanner_loop.sh 停止进程\nkill 2156936 或者使用 pkill\npkill -f scanner_loop.sh 定时任务 每分钟检测一次，可以和监控脚本一起用，或者只用其中一种\n(crontab -l ; echo \u0026#34;* * * * * /root/php-malware-scanner.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 检测脚本 默认备份目录：/opt/backup\n这个脚本是一个检测和清理PHP文件中恶意代码的自动化工具，它会备份原始文件，识别包含可疑模式的文件，移除恶意代码，并生成统计信息\n统计信息保存目录/opt/backup\n只检测不移除恶意代码的脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/php-s.sh \u0026amp;\u0026amp; chmod +x php-s.sh 修改脚本\nnano php-s.sh 移除恶意代码脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cece.sh \u0026amp;\u0026amp; chmod +x cece.sh ","date":"2024-09-20T14:42:56+08:00","permalink":"https://blog.lufei.de/p/328/","title":"守护你的 PHP 网站：一键式恶意文件检测与清除脚本"},{"content":" 之前分享过宝塔面板配合fail2ban，以及开启cloudflare的cdn双重防御的教程，并制作了便捷的脚本 这次不靠cloudflare的减速cdn，看看防御效果怎么样 系统环境 debian/ubuntu\nnginx\n宝塔面板\n注意要点 1.在宝塔面板开启站点日志 2.添加服务器白名单 以下设置钉钉的目的是有拦截的时候通知你，是可选的，可以不用通知看个人\n打开电脑（pc）打开桌面端钉钉，打开报警机器人，添加服务器ip，如图\n文档：https://open.dingtalk.com/document/orgapp/custom-robot-access\n3.设置钉钉webhook 文档：https://open.dingtalk.com/document/orgapp/custom-robot-access\n一键脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fail2ban-s.sh \u0026amp;\u0026amp; chmod +x fail2ban-s.sh \u0026amp;\u0026amp; ./fail2ban-s.sh 无需过多解释，看图吧，\n怎么使用 选择菜单4开启网站保护， 菜单6查看拦截记录 要点：宝塔面板默认nginx日志路径是：/www/wwwlogs/access.log\n可以理解为所有站点都监控，如果要监控单个站点，那么选择菜单11，修改监控日志路径\n怎么查找网站日志路径，很简单，看图:\n打开站点配置文件，拉到最后，access_log后面的：/www/wwwlogs/1234.com.log就是日志路径\n怎么测试 测试更简单，两种方法，第一种选择菜单3，重点说第二种。\n方法二：\n复制你站点的404页面链接，如果连404是什么页面也不清楚那不用往下看了 打开 https://www.itdog.cn/http/ 输入链接点击快速测试，连续测试3次，你会发现这个链接一片红，就对了，已经被拦截 如图，那一百多个ip就是 itdog 自身的ip，把itdog拉小黑屋了\n如何解除封禁 选择菜单10，输入图片上方那一串ip地址，就是这么简单，当然先查看拦截记录，然后复制被拦截的ip\n后续 都包含在脚本中了，自行探索把~\n祝大家中秋节快乐，心想事成。\n","date":"2024-09-17T01:33:58+08:00","permalink":"https://blog.lufei.de/p/327/","title":"完美的宝塔面板防御策略，基于fail2ban"},{"content":"下载对接文件 Btjson.php 路径：/苹果cms根目录/application/common/extend/upload btjson.html 路径：/苹果cms根目录/application/admin/view/extend/upload 获取token 注册 https://czz.meituan.com/ 发布视频，上传封面，注意在上传封面后，F12 查找封面 token 即可，不用真的去发布视频\ncms后台设置 对接地址必须是：https://pic-up.meituan.com\n采集参数配置\n自动同步图片开启：\n","date":"2024-09-15T23:26:05+08:00","permalink":"https://blog.lufei.de/p/326/","title":"苹果cms对接美团图床"},{"content":" 大厂图床，CDN加速\n项目地址：https://github.com/woniu336/mt-img\n使用方法 在mt.php填上你的token即可， 然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/ 发布视频，上传封面，注意在上传封面后，F12查找封面token即可，不用真的去发布视频 特色 可在任意位置粘贴图片 粘贴图片直接触发上传 上传成功后自动复制图片链接 图库功能 数据仅保存在本地浏览器中，不同设备或浏览器之间无法共享 如果用户清除浏览器数据，图库信息会丢失 图片展示 ","date":"2024-09-15T13:21:55+08:00","permalink":"https://blog.lufei.de/p/325/","title":"美团图床设置教程"},{"content":"项目 Github: https://github.com/Cp0204/quark-auto-save\n夸克网盘自动转存\n夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙。\n对于一些持续更新的资源，隔段时间去转存十分麻烦。\n定期执行本脚本自动转存、文件名整理，配合 Alist, rclone, Emby 可达到自动追更的效果。🥳\n使用 Docker 部署（推荐）\nWebUI 已能满足绝大多数需求。\ndocker run -d \\ --name quark-auto-save \\ -p 5005:5005 \\ -e WEBUI_USERNAME=admin \\ -e WEBUI_PASSWORD=admin123 \\ -v ./quark-auto-save/config:/app/config \\ -v /etc/localtime:/etc/localtime \\ --network bridge \\ --restart unless-stopped \\ cp0204/quark-auto-save:latest 管理地址：http://yourhost:5005\n环境变量 默认 备注 WEBUI_USERNAME admin 管理账号 WEBUI_PASSWORD admin123 管理密码 一键更新\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR quark-auto-save 正则整理示例\npattern replace 效果 .* 无脑转存所有文件，不整理 \\.mp4$ 转存所有 .mp4 后缀的文件 ^【电影TT】形似走肉(\\d+)\\.(mp4|mkv) \\1.\\2 【电影TT】形似走肉01.mp4 → 01.mp4\n【电影TT】形似走肉02.mkv → 02.mkv ^(\\d+)\\.mp4 S02E\\1.mp4 01.mp4 → S02E01.mp4\n02.mp4 → S02E02.mp4 $TV 魔法匹配剧集文件 【XX电影网】(.*)\\.(mp4|mkv) \\1.\\2 【XX电影网】example.mp4 → example.mp4\n【XX电影网】movie.mkv → movie.mkv 直接写 json 配置注意\\多加一重字符转义：如\\d写作\\\\d，匹配字符.写作\\\\.\n参考资料 正则表达式30分钟入门教程\n替换的后向引用：有些语言写作$1，Python中写作\\1，json 转义后为\\\\1\n特殊场景使用技巧 忽略后缀\n当目录已存01.mp4、02.mp4，新的源又有01.mkv、02.mkv、03.mkv，只希望获得03.mkv更新时。\n一个部剧同时追更两个源，看谁更新快🤪，但两个源的视频格式不一时。\n使用青龙通知设置\n删去配置文件中的整个 push_config 数组。\n自动刷新媒体库\n同时配置 emby.url emby.apikey 和任务的 emby_id ，将在新存或整理后自动刷新 Emby 媒体库、刷新元数据。\n魔法匹配\n当任务 pattern 值为 $开头 且 replace 留空时，实际将调用程序预设的正则表达式。\n如 $TV 可适配和自动整理市面上90%分享剧集的文件名格式，具体实现见代码，欢迎贡献规则。\n","date":"2024-09-13T22:33:41+08:00","permalink":"https://blog.lufei.de/p/324/","title":"夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙"},{"content":"\r剧荒工厂 https://catpdf.org/\n","date":"2024-09-12T01:09:52+08:00","image":"https://imgsrc.baidu.com/forum/pic/item/562c11dfa9ec8a1357d5d2c2b103918fa1ecc0c1.jpg","permalink":"https://blog.lufei.de/p/323/","title":"你的私人影视宝库"},{"content":"项目 https://github.com/talebook/talebook\n介绍 简单好用的个人图书管理系统\n友情提醒：中国境内网站，个人是不允许进行在线出版的，维护公开的书籍网站是违法违规的行为！建议仅作为个人使用！\n这是一个基于Calibre的简单的个人图书管理系统，支持在线阅读。主要特点是：\n美观的界面：由于Calibre自带的网页太丑太难用，于是基于Vue，独立编写了新的界面，支持PC访问和手机浏览； 支持多用户：为了网友们更方便使用，开发了多用户功能，支持豆瓣（已废弃）、QQ、微博、Github等社交网站的登录； 支持在线阅读：借助Readium.js 库，支持了网页在线阅读电子书； 支持批量扫描导入书籍； 支持邮件推送：可方便推送到Kindle； 支持OPDS：可使用KyBooks等APP方便地读书； 支持一键安装，网页版初始化配置，轻松启动网站； 优化大书库时文件存放路径，可以按字母分类、或者文件名保持中文； 支持快捷更新书籍信息：支持从百度百科、豆瓣搜索并导入书籍基础信息； 支持私人模式：需要输入访问码，才能进入网站，便于小圈子分享网站； ","date":"2024-09-06T21:07:18+08:00","permalink":"https://blog.lufei.de/p/322/","title":"一个简单的在线版个人书库。"},{"content":"下载程序 mkdir -p /opt/docker_data cd /opt/docker_data git clone https://github.com/linkwarden/linkwarden.git cd linkwarden 建立.env变量 touch .env 在 /linkwarden 文件夹中，创建一个名为 .env 的文件，打开它并将以下文本粘贴到其中\nNEXTAUTH_SECRET=VERY_SENSITIVE_SECRET NEXTAUTH_URL=http://localhost:3000/api/v1/auth POSTGRES_PASSWORD=YOUR_POSTGRES_PASSWORD 修改密码后：\ndocker compose up -d ","date":"2024-09-04T20:10:06+08:00","permalink":"https://blog.lufei.de/p/321/","title":"docker部署跨浏览器的书签管理器 "},{"content":"什么是 IndexNow？ 文档：https://www.indexnow.org/zh_cn/index\n如何提交 下载API密钥文件保存到站点根目录\n注册必应站长\n下载推送脚本\n必应后台查看IndexNow详情\n提示：滑至中间，找到 Generate API Key 点击下载密钥\n获取API密钥：https://www.bing.com/indexnow/getstarted\nindexnow文档：https://www.indexnow.org/zh_cn/documentation\n必应站长工具：https://www.bing.com/webmasters\n看不懂没关系，我制作了脚本：\n安装插件：\nsudo apt update sudo apt install curl jq 一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/indexnow_menu_cn.sh \u0026amp;\u0026amp; chmod +x indexnow_menu_cn.sh \u0026amp;\u0026amp; ./indexnow_menu_cn.sh 定时任务 首先下载脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/indexnow-submit-script.sh \u0026amp;\u0026amp; chmod +x indexnow-submit-script.sh 测试是否可以推送：\n./indexnow-submit-script.sh www.bing.com 12345 abc.com https://abc.com/sitemap.xml 设置任务：\n(crontab -l ; echo \u0026#34;20 5 * * * cd ~ \u0026amp;\u0026amp; ./indexnow-submit-script.sh www.bing.com 12345 abc.com https://abc.com/sitemap.xml \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 解读任务：\nwww.bing.com ## 搜索引擎\n12345 ## API密钥\nabc.com ## 你的网站域名\nhttps://abc.com/sitemap.xml ## 站点地图\n","date":"2024-09-04T05:41:07+08:00","permalink":"https://blog.lufei.de/p/320/","title":"IndexNow - 快速通知搜索引擎网站内容更新啦"},{"content":"引言 在数字时代,网站的可发现性至关重要。本教程将指导您如何利用 GitHub Actions 自动将您的网站 URL 提交到 IndexNow,从而提高您网站在搜索引擎中的可见度。\n什么是 IndexNow? IndexNow 是一个开放协议,允许网站所有者即时通知搜索引擎关于最新的内容变更。这意味着您的新内容或更新可以更快地被搜索引擎发现和索引。\n为什么选择 GitHub Actions? GitHub Actions 提供了一个自动化的平台,可以根据特定事件(如推送新内容)或按计划执行任务。将其与 IndexNow 结合使用,我们可以创建一个强大的自动化工作流,确保您的网站内容始终保持最新索引状态。\n实施步骤 1. 生成 API 密钥 首先,我们需要从 Bing Webmaster Tools 获取一个唯一的 API 密钥:\n访问 Bing Webmaster Tools 滚动到页面底部,您会看到生成 API 密钥的选项 下载或生成新的密钥文件 2. 上传密钥文件 将下载的密钥文件(例如 007997b63dd14237bdb9facc726c9a05.txt)上传到您网站的根目录。\n例如,如果您使用 Hugo 静态网站生成器,可以将文件放在 /static 文件夹中:\nhttps://your-website.com/007997b63dd14237bdb9facc726c9a05.txt 3. 创建 GitHub Actions 工作流 在您的 GitHub 仓库根目录创建一个新的工作流文件:\n.github/workflows/IndexNow.yml 将以下内容添加到文件中(记得替换 sitemap-location 为您自己的网站地图 URL):\nname: \u0026#34;IndexNow\u0026#34; on: push: branches: - main schedule: # 每3天的 UTC 时间 04:00 运行一次 - cron: \u0026#39;0 4 */3 * *\u0026#39; jobs: check-and-submit: runs-on: ubuntu-latest steps: - name: submit-to-bing uses: bojieyang/indexnow-action@v2 with: sitemap-location: \u0026#34;https://your-website.com/sitemap.xml\u0026#34; endpoint: \u0026#34;www.bing.com\u0026#34; since: 3 since-unit: \u0026#34;day\u0026#34; limit: 10 key: ${{ secrets.INDEXNOW_KEY }} key-location: ${{ secrets.INDEXNOW_KEY_LOCATION }} 4. 添加 GitHub Actions 密钥 最后,我们需要在 GitHub 仓库中添加两个密钥:\n转到您的 GitHub 仓库\n点击 \u0026ldquo;Settings\u0026rdquo; \u0026gt; \u0026ldquo;Secrets and variables\u0026rdquo; \u0026gt; \u0026ldquo;Actions\u0026rdquo;\n添加以下两个密钥:\n名称: INDEXNOW_KEY 值: 您的 API 密钥 (例如 007997b63dd14237bdb9facc726c9a05)\n名称: INDEXNOW_KEY_LOCATION 值: 您网站上密钥文件的完整 URL (例如 https://your-website.com/007997b63dd14237bdb9facc726c9a05.txt)\n结语 完成以上步骤后,您的 GitHub Actions 工作流就设置完成了!它将在每次推送到 main 分支时,以及每隔 3 天自动运行一次,帮助您的网站内容更快地被搜索引擎发现和索引。\n通过这个自动化流程,您可以专注于创作高质量内容,而不必担心搜索引擎的索引问题。祝您的网站在搜索结果中脱颖而出!\n","date":"2024-09-03T16:22:45+08:00","permalink":"https://blog.lufei.de/p/319/","title":"使用 GitHub Actions 自动提交 URL 到 IndexNow"},{"content":"测试环境 Debian12 需要安装好docker 项目 项目：https://github.com/plausible/community-edition\n文档：https://plausible.io/docs/\n🔢 总内存占用约：548.77 MiB\n📦 总镜像大小约：1.18 GiB\n创建安装目录 mkdir -p /opt/docker_data/plausible/hosting cd /opt/docker_data/plausible/hosting 下载程序 版本：v2.0\n默认端口：8000\nwget https://github.com/plausible/community-edition/archive/refs/heads/v2.0.0.zip \u0026amp;\u0026amp; unzip v2.0.0.zip \u0026amp;\u0026amp; mv community-edition-2.0.0/* . \u0026amp;\u0026amp; rm -rf community-edition-2.0.0 v2.0.0.zip ==========================================================================\n此时hosting目录下会有两个文件需要配置：\ndocker-compose.yml：把127.0.0.1改成0.0.0.0 plausible-conf.env：配置 Plausible 服务 编辑plausible-conf.env\nnano plausible-conf.env BASE_URL 提前解析好的域名,例如：https://tj.1234.com\nSECRET_KEY_BASE 加密密钥，可以通过下面的命令生成：\nopenssl rand -base64 64 | tr -d \u0026#39;\\n\u0026#39; ; echo 最后启动服务：\ndocker compose up -d 第一次访问创建的用户即是管理员，登录后，就可以添加网站了。\n一键查询Plausible内存和镜像大小\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/plausible_stats.sh \u0026amp;\u0026amp; chmod +x plausible_stats.sh \u0026amp;\u0026amp; ./plausible_stats.sh 流量高峰通知【可选】 添加发件邮箱\n使用外部 SMTP 发信邮箱，编辑 Plausible 环境变量文件\nnano plausible-conf.env 添加下面内容，以QQ邮箱为例\nMAILER_EMAIL=123456@qq.com # 发信邮箱 SMTP_HOST_ADDR=smtp.qq.com SMTP_HOST_PORT=465 SMTP_USER_NAME=123456@qq.com # 发信邮箱用户名 SMTP_USER_PWD=admin123 # 发信邮箱密码 SMTP_HOST_SSL_ENABLED=true SMTP_RETRIES=2 # 发信重试次数 然后重启容器\ncd /opt/docker_data/plausible/hosting sudo docker compose down --remove-orphans \u0026amp;\u0026amp; sudo docker compose up -d 统计关键词【可选】 文档：找到 Google integration点开三角形图标\nPlausible 支持集成 Google Search Console，可以获得通过搜索引擎得到的关键词统计，详细配置流程可参阅 Plausible 文档，步骤如下：\n在 Google Cloud Console 创建一个新项目 配置 OAuth 同意屏幕 创建一个 OAuth 客户端，获取 Client ID 和 CLIENT SECRET 启用 Google Search Console API 将 Client ID 和 Client Secret 添加到 Plausible 环境变量文件里\nGOOGLE_CLIENT_ID=xxxx GOOGLE_CLIENT_SECRET=yyyy 重启容器即可\ncd /opt/docker_data/plausible/hosting sudo docker compose down --remove-orphans \u0026amp;\u0026amp; sudo docker compose up -d 之后在 Plausible 配置下 Google 集成即可\n","date":"2024-09-03T01:15:22+08:00","permalink":"https://blog.lufei.de/p/318/","title":"安装网站访客统计工具——Plausible"},{"content":"项目 https://github.com/TheRealJoelmatic/RemoveAdblockThing\n安装去广告脚本 安装脚本：单击此处并按安装\n禁用广告拦截器 务必在YouTube页面上禁用其他广告拦截器，例如Adblock Plus（因为这些已经被YouTube列入黑名单了）。否则会导致各种播放问题！\n不用担心，安装好的脚本会删除 YouTube 上的广告。\n安装Tampermonkey油猴 如果尚未安装，则需要安装 Tampermonkey 浏览器扩展。支持各种浏览器：\nTampermonkey for Chrome\nTampermonkey for Firefox\nTampermonkey for Edge\nTampermonkey for Opera/OperaGX\n进入管理面板 打开 Tampermonkey 仪表板：单击浏览器中的 Tampermonkey 扩展程序图标，然后选择“控制面板”。\n创建新脚本 创建新脚本：在 Tampermonkey 仪表板中，单击“实用程序”选项卡并选择“创建新脚本”。\n","date":"2024-09-02T03:49:30+08:00","permalink":"https://blog.lufei.de/p/317/","title":"去除YouTube弹窗，彻底无广告"},{"content":"一键脚本（推荐） curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/document_modifier.sh \u0026amp;\u0026amp; chmod +x document_modifier.sh \u0026amp;\u0026amp; ./document_modifier.sh 你只需要准备好钉钉报警机器人webhook地址就行。\n文档：https://open.dingtalk.com/document/orgapp/custom-robot-access\n以下内容为手动安装，不懂的地方可以看看\n需求 有时候域名太多，时间一长，你会不记得快要续期了 服务器太多，需要监控，这应该是刚需 证书申请来申请去，自动续签鬼知道会不会出问题 痛点 监控还要安装各种东西，会出岔子，折腾够呛，难免费时费力，所以，我的方案就是使用脚本，快速高效。脚本公开透明，放心食用~\n创建钉钉报警机器人 文档：https://open.dingtalk.com/document/orgapp/custom-robot-access\n记得在安全设置那里写上服务器IP地址，也就是你放脚本的服务器IP地址\n最后复制webhook地址\n修改脚本 check_ssl.txt 添加需要检测证书的域名，每行一个 domains.txt 添加需要到期检测的域名，每行一个 测试说明 不把数值改大一点，是没有通知的，因为默认数值比较小，\n定时任务 daily_report.sh脚本很推荐， 因为会养成你每天下午2点就收到钉钉通知报告的习惯。时间一长，你会记得去看~ (crontab -l ; echo \u0026#34;30 2 */3 * * cd /home/domain \u0026amp;\u0026amp; ./domain_expiry_reminder.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - (crontab -l ; echo \u0026#34;0 14 * * * cd /home/domain \u0026amp;\u0026amp; ./daily_report.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - (crontab -l ; echo \u0026#34;10 3 * * * cd /home/domain \u0026amp;\u0026amp; ./check_ssl.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2024-08-31T21:35:09+08:00","permalink":"https://blog.lufei.de/p/316/","title":"最简单监控方案：域名、证书SSL、服务器全搞定！发送钉钉告警消息"},{"content":"准备条件 系统：debian,ubuntu，安装了python\n检测是否安装了python：\npython3 --version 检测是否安装了requests\npython3 -c \u0026#34;import requests; print(requests.__version__)\u0026#34; 如果没安装\npip install requests 下载脚本 新建通知文本：\nmkdir -p /home/domain touch /home/domain/warnfile 安装依赖：\nsudo apt-get update sudo apt-get install whois bc 下载脚本:\ncd /home/domain wget https://raw.githubusercontent.com/woniu336/open_shell/main/domain_expiry_reminder.sh wget https://raw.githubusercontent.com/woniu336/open_shell/main/warnsrc.py 赋予权限：\nchmod +x domain_expiry_reminder.sh chmod +x warnsrc.py 获取钉钉Webhook 地址 使用 Webhook 地址，创建好自定义机器人\n查看文档 https://open.dingtalk.com/document/robots/custom-robot-access\nIP地址（段）填写服务器IP （要填上）\n修改脚本： 修改：domain_expiry_reminder.sh\n把for line in 123.com 234.com 567.org 改成你的域名(第25行)，多个使用空格分开\n测试时间为30天内过期就发告警\nhttps://pastebin.com/vUq8Jjkb 修改：warnsrc.py\n把前面获取到的钉钉Webhook地址填上：url = 'Webhook地址' （第16行）\nhttps://pastebin.com/5cP6UYPs 测试 大于30天不会有消息，为了测试，修改到期天数，修改domain_expiry_reminder.sh（第72行）\n# 测试时间为200天内过期就发告警 if [ $expiry_date -lt 200 ]; ## 例如200天内,你的域名离到期日必须小于200日 运行测试\ncd /home/domain ./domain_expiry_reminder.sh 添加定时任务 每隔3天检测一次（域名到期前30天内）\n(crontab -l ; echo \u0026#34;30 2 */3 * * cd /home/domain \u0026amp;\u0026amp; ./domain_expiry_reminder.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2024-08-31T04:50:36+08:00","permalink":"https://blog.lufei.de/p/315/","title":"监控域名到期发送钉钉消息通知"},{"content":"下载文件 下载到网站目录\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/aliplay.tar.gz tar -xzvf aliplay.tar.gz rm aliplay.tar.gz aliplay播放器（推荐）\nhttps://aaa.com/ck/m3u8.php?url= DPlayer播放器（备用）\nhttps://aaa.com/dp/m3u8.php?url= ","date":"2024-08-29T02:25:20+08:00","permalink":"https://blog.lufei.de/p/314/","title":"阿里云Web播放器引入，支持m3u8播放"},{"content":"命令 先给出命令\n注意：如果在windows下使用，路径使用/\nrclone copy gd:UpdraftPlus /home/test \\ -u \\ -v \\ -P \\ --transfers=6 \\ --ignore-errors \\ --buffer-size=64M \\ --drive-chunk-size=128M \\ --fast-list \\ --auto-confirm \\ --checkers=10 \\ --drive-acknowledge-abuse \\ --drive-server-side-across-configs 命令2 例子：\nrclone copy /www/wwwroot/1234.com/upload/vod r2:imgs/upload/vod --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 --drive-acknowledge-abuse 这个命令使用了 rclone 工具来从 Google Drive (gd:) 复制一个名为 UpdraftPlus 的目录到本地的 /home/test 目录。下面是对命令中各个选项的解读：\nrclone copy gd:UpdraftPlus /home/test: 这是主要的命令，表示将 Google Drive 上的 UpdraftPlus 目录复制到本地的 /home/test 目录。\n-u: 更新模式，跳过在目标位置已经存在的文件。\n-v: 详细模式，输出更多的日志信息。\n-P: 显示进度，包括传输进度和速度。\n--transfers=6: 设置并行传输的文件数量为 6。\n--ignore-errors: 忽略传输过程中出现的错误，继续执行。\n--buffer-size=64M: 设置读写缓冲区的大小为 64MB。\n--drive-chunk-size=128M: 设置 Google Drive 的分块大小为 128MB，适用于大文件的传输。\n--fast-list: 使用更高效的方式列出远程目录的内容，减少 API 调用次数。\n--auto-confirm: 自动确认任何提示，不需要手动交互。\n--checkers=10: 设置并行检查的文件数量为 10。\n--drive-acknowledge-abuse: 确认下载被 Google 标记为滥用内容的文件。\n--drive-server-side-across-configs: 允许在两个 Google Drive 网盘之间传输文件，不用经过本地。\n总结来说，这个命令的目的是以高效且详细的方式将 Google Drive 上的 UpdraftPlus 目录复制到本地的 /home/test 目录，同时处理可能出现的错误和特殊情况。\n安装 debian和ubuntu\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 添加网盘 =========================================\n配置网盘文件路径：/root/.config/rclone/rclone.conf\n如果不存在，手动创建\n=========================================\n通用s3模板\ncloudflare R2\n[r2] type = s3 provider = Cloudflare access_key_id = xxxxx secret_access_key = xxxxxx region = auto endpoint = https://xxxxxx.r2.cloudflarestorage.com 腾讯存储桶\n[Tencent-cos] type = s3 provider = TencentCOS access_key_id = xxxx secret_access_key = xxxxx endpoint = cos.ap-guangzhou.myqcloud.com acl = default storage_class = STANDARD 阿里云OSS\n[oss] type = s3 provider = Alibaba env_auth = false access_key_id = xxx secret_access_key = xxx endpoint = oss-cn-shenzhen.aliyuncs.com acl = public-read storage_class = STANDARD bucket_acl = public-read 卸载 sudo rm /usr/bin/rclone sudo rm /usr/local/share/man/man1/rclone.1 ","date":"2024-08-27T23:32:57+08:00","permalink":"https://blog.lufei.de/p/313/","title":"rclone工具使用技巧"},{"content":"环境 系统：debian11\n宝塔：7.7.0\nnginx: 1.26.1 (编译)\nmysql: 5.7\nphp: 7.4\n关于怎么配置Nginx FastCGI 缓存 本博客有教程\n适用苹果cms站点：https://github.com/woniu336/open_shell/blob/main/maccms.conf\n适用多数站点：https://github.com/woniu336/open_shell/blob/main/nginx.conf\nhttps://pastebin.com/TqmpxGfh\nNginx完整配置 注意：\n这不是nginx的配置，而是站点的配置 每个站点创建不同的缓存目录，设置不同的key 创建缓存目录\n注意：最好是在/var/cache/目录下创建，否则重启服务器会导致nginx无法启动\nmkdir -p /var/cache/nginx/catpdf_org chmod -R 755 /var/cache/nginx/catpdf_org 完整配置：\n注意：\n替换自己的域名，站点目录，证书目录，php版本，苹果cms后台地址（houtai.php） 必须有且只有一个站点是：listen 443 quic reuseport; 后面多了一个reuseport 其他站点是listen 443 quic; catpdf_org 是缓存目录，CATPDF.ORG是key fastcgi_cache_path /var/cache/nginx/catpdf_org levels=1:2 keys_zone=CATPDF.ORG:200m inactive=2d max_size=10G; fastcgi_cache_key \u0026#34;$scheme$request_method$host$request_uri$is_args$args\u0026#34;; fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; server { listen 80; listen 443 ssl; listen 443 quic; http2 on; http3 on; quic_gso on; quic_retry off; server_name baidu.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/baidu.com; # SSL 配置 ssl_certificate /www/server/panel/vhost/cert/baidu.com/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/baidu.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers \u0026#39;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384\u0026#39;; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1h; ssl_early_data on; ssl_stapling on; ssl_stapling_verify on; # 配置 Nginx fastcgi_cache START set $skip_cache 0; # 定义不缓存的条件 if ($request_method = POST) { set $skip_cache 1; } if ($query_string != \u0026#34;\u0026#34;) { set $skip_cache 1; } if ($request_uri ~* \u0026#34;purge=all|/wp-admin/|/xmlrpc.php|houtai.*\\.php|/feed/|index.php|sitemap(_index)?.xml\u0026#34;) { set $skip_cache 1; } if ($http_cookie ~* \u0026#34;comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in\u0026#34;) { set $skip_cache 1; } # 后台路径重写规则 location /houtai.php/admin/ { rewrite ^/houtai\\.php/admin/(.*)$ /houtai.php?s=/admin/$1 last; } location ~ [^/]\\.php(/|$) { fastcgi_split_path_info ^(.+\\.php)(/.+)$; fastcgi_pass unix:/tmp/php-cgi-74.sock; fastcgi_index index.php; include fastcgi.conf; fastcgi_param PATH_INFO $fastcgi_path_info; # 缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache CATPDF.ORG; fastcgi_cache_valid 200 301 302 1d; # 安全头部 add_header Strict-Transport-Security \u0026#34;max-age=15552000; includeSubdomains; preload\u0026#34;; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34;; add_header X-Cache \u0026#34;$upstream_cache_status From $host\u0026#34;; add_header Cache-Control \u0026#34;max-age=86400\u0026#34;; add_header Nginx-Cache \u0026#34;$upstream_cache_status\u0026#34;; add_header Last-Modified $date_gmt; etag on; } # 缓存清理配置 location ~ /purge(/.*) { allow 127.0.0.1; allow \u0026#34;47.83.27.48\u0026#34;; deny all; fastcgi_cache_purge CATPDF.ORG \u0026#34;$scheme$request_method$host$1\u0026#34;; } # 配置 Nginx fastcgi_cache END # HTTP重定向至HTTPS if ($server_port !~ 443) { return 301 https://$host$request_uri; } # Proxy headers 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 Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;Upgrade\u0026#34;; proxy_buffering off; proxy_http_version 1.1; proxy_read_timeout 600s; # HTTP/3 headers add_header Alt-Svc \u0026#39;h3=\u0026#34;:443\u0026#34;; ma=2592000\u0026#39;; add_header Strict-Transport-Security \u0026#34;max-age=15552000; includeSubDomains; preload\u0026#34;; # Error pages error_page 497 https://$host$request_uri; # PHP 配置 include enable-php-74.conf; # Rewrite rules include /www/server/panel/vhost/rewrite/baidu.com.conf; # 禁止访问的文件或目录 location ~ ^/(\\.user.ini|\\.htaccess|\\.git|\\.svn|\\.project|LICENSE|README.md) { return 404; } # 一键申请SSL证书验证目录相关设置 location ~ \\.well-known { allow all; } # Static file handling location ~* \\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; access_log off; } location ~* \\.(js|css)?$ { expires 12h; access_log off; } # Logging access_log /www/wwwlogs/baidu.com.log; error_log /www/wwwlogs/baidu.com.error.log; } 删除缓存 添加宝塔计划任务，任务类型：shell脚本\nrm -rf /var/cache/nginx/catpdf_org/* ","date":"2024-08-26T22:29:57+08:00","permalink":"https://blog.lufei.de/p/312/","title":"宝塔面板：苹果cms系统站点最佳Nginx配置"},{"content":"场景 把本地项目推送到Github仓库后，如果想部署到服务器上，可以尝试此方案\n我的博客是hugo搭建的，每次更新文章会手动推送到Github仓库，\n然后利用Actions 脚本自动推送到cf或者vercel\n之前我写过一篇 将 hugo 博客搬迁到服务器 步骤有些繁琐，\n本次方案快速高效（推荐）\n方案 使用rsync，配置Actions 脚本 小站demo: https://blog.taoshuge.eu.org/\n安装 rsync 登录远程服务器，键入以下命令来完成 rsync 的安装：\nsudo apt install rsync 安装成功会显示git的版本号\nrsync --version 显示\nrsync version 3.2.3 protocol version 31\n新建 rsync 用户 出于安全的原因考虑，我们一般不会使用root来运行同步功能，因此，需要创建一个 rsync 用户来执行同步。\n登录远程服务器，键入以下命令：\nsudo adduser rsyncer 创建用户的途中会要求输入用户密码，这个密码请务必记住，切换到这个用户时需要，其它配置使用默认值直接回车就行。\n本地生成 SSH key 在你的电脑上生成一个 Key 对，其中一个扩展名是.pub，是公钥。假设分别命名为：id_rsa 和 id_rsa.pub\nssh-keygen -q -t rsa -b 4096 -C \u0026#34;阿弥托福\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/id_rsa 查看并复制公钥内容\ncat ~/.ssh/id_rsa.pub 把 SSH 公钥添加到远程服务器 登录你的服务器，逐个输入以下代码\nsu rsyncer # 要输入密码 cd ~ mkdir -p www .ssh chmod 700 .ssh touch .ssh/authorized_keys chmod 600 .ssh/authorized_keys vim .ssh/authorized_keys # 用文本编辑器打开 `id_rsa.pub`，复制所有内容到这个文件里 注意：.ssh的权限必须是700，authorized_keys的权限必须是600\n修改 SSH 默认配置 以下内容一般不用修改，如果同步有问题再来修改。\nvim /etc/ssh/sshd_config 移除前面的注释，若没有则在最后添加\nRSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 修改保存后重启sshd服务\nsystemctl restart sshd.service 设置Git仓库（重点） 打开仓库设置，按下图把相关设置加入 secrets，\n地址：https://github.com/用户名/仓库名/settings/secrets/actions\n解读：\nHONGKONG_PRIVATE_KEY ：你电脑上的id_rsa私钥内容 HONGKONG_SERVER_IP : 你的服务器IP地址 HONGKONG_USERNAME ：rsyncer #用户名就是前面新建的rsyncer用户 HONGKONG_WWW_PATH ：www #就是服务器同步的目录为www 修改自动化 Actions 脚本 rsync命令实现增量同步, \u0026ndash;delete参数表示会删除远程文件夹中本地不存在的文件\n-a是复合参数, 可复制本地文件的全部属性至远程, -v会显示具体同步的文件信息\nexclude中的文件夹路径是相对于本地同步文件夹而言, 即\u0026quot;public/.git\u0026quot;\n注意：-p 5522 是服务器的ssh端口，如果不是22，记得修改\n把以下内容加入脚本，脚本目录：.github\\workflows\\main.yml\n- name: webfactory/ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.HONGKONG_PRIVATE_KEY }} - name: Publish blog to remote vps run: | rsync -av -e \u0026#34;ssh -o StrictHostKeyChecking=no -p 5522\u0026#34; --delete --exclude={\u0026#39;.git/\u0026#39;,\u0026#39;.github/\u0026#39;,\u0026#39;.user.ini\u0026#39;} public/ ${{ secrets.HONGKONG_USERNAME }}@${{ secrets.HONGKONG_SERVER_IP }}:${{ secrets.HONGKONG_WWW_PATH }} 完整hugo脚本：\nname: Auto Deploy hugo on: push: branches: - main # 更新触发的分支 jobs: build-deploy: runs-on: ubuntu-22.04 env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE20: true # ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - name: Check out repository code uses: actions/checkout@v4 with: submodules: recursive # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: \u0026#34;0.127.0\u0026#34; extended: true # 设置是否需要 extended 版本 - name: Cache resources # 缓存 resource 文件加快生成速度 uses: actions/cache@v4 with: path: resources key: ${{ runner.os }}-hugocache-${{ hashFiles(\u0026#39;content/**/*\u0026#39;) }} restore-keys: ${{ runner.os }}-hugocache- - name: Build Hugo static files # 部署静态资源 run: hugo --gc --minify - name: Deploy to Github Pages # 部署到Github Pages页面 uses: peaceiris/actions-gh-pages@v4 with: personal_token: ${{ secrets.PERSONAL_TOKEN }} # 两个仓库请使用 deploy_key external_repository: woniu336/woniu336.github.io # 如果在同一个仓库请注释 publish_dir: ./public # hugo 生成到 public 作为跟目录 publish_branch: main # Github Pages 所在分支 commit_message: ${{ github.event.head_commit.message }} - name: webfactory/ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.HONGKONG_PRIVATE_KEY }} - name: Publish blog to remote vps run: | rsync -av -e \u0026#34;ssh -o StrictHostKeyChecking=no -p 5522\u0026#34; --delete --exclude={\u0026#39;.git/\u0026#39;,\u0026#39;.github/\u0026#39;,\u0026#39;.user.ini\u0026#39;} public/ ${{ secrets.HONGKONG_USERNAME }}@${{ secrets.HONGKONG_SERVER_IP }}:${{ secrets.HONGKONG_WWW_PATH }} 完结~\n","date":"2024-08-26T04:54:29+08:00","permalink":"https://blog.lufei.de/p/311/","title":"将github仓库同步到个人服务器"},{"content":"更新系统包\nsudo apt update \u0026amp;\u0026amp; sudo apt upgrade -y 安装 Node.js 和 npm\ncurl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs 检查 Node.js 是否安装：\nnode --version 检查 npm 是否安装：\nnpm --version 安装 Git\nsudo apt-get install -y git 检查 Git 是否安装：\ngit --version ","date":"2024-08-25T15:16:34+08:00","permalink":"https://blog.lufei.de/p/310/","title":"安装 Node.js 和 npm"},{"content":"\r以轻量香港服务器为例\n系统：debian11\n卸载云盾 wget -O uninstall.sh \u0026#34;http://update.aegis.aliyun.com/download/uninstall.sh\u0026#34; \u0026amp;\u0026amp; chmod +x uninstall.sh \u0026amp;\u0026amp; ./uninstall.sh wget -O quartz_uninstall.sh \u0026#34;http://update.aegis.aliyun.com/download/quartz_uninstall.sh\u0026#34; \u0026amp;\u0026amp; chmod +x quartz_uninstall.sh \u0026amp;\u0026amp; ./quartz_uninstall.sh 删除残留：\npkill aliyun-service rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service rm -rf /usr/local/aegis* 屏蔽云盾IP 执行下面命令通过“iptables”防火墙来屏蔽云盾IP\niptables -I INPUT -s 140.205.201.0/28 -j DROP iptables -I INPUT -s 140.205.201.16/29 -j DROP iptables -I INPUT -s 140.205.201.32/28 -j DROP iptables -I INPUT -s 140.205.225.192/29 -j DROP iptables -I INPUT -s 140.205.225.200/30 -j DROP iptables -I INPUT -s 140.205.225.184/29 -j DROP iptables -I INPUT -s 140.205.225.183/32 -j DROP iptables -I INPUT -s 140.205.225.206/32 -j DROP iptables -I INPUT -s 140.205.225.205/32 -j DROP iptables -I INPUT -s 140.205.225.195/32 -j DROP iptables -I INPUT -s 140.205.225.204/32 -j DROP 卸载aliyun-service\nrm -rf /usr/sbin/aliyun* 检查\nps -aux | grep -E \u0026#39;aliyun|AliYunDun\u0026#39; | grep -v grep 或者\nsystemctl list-units --type=service | grep -E \u0026#39;aliyun|AliYunDun\u0026#39; 如果输出为空，则说明确实没有相关的进程在运行。\n安装云监控插件 （推荐） 以轻量香港服务器为例\n内存占用25M左右，好处是可以开启短信和邮件通知\nARGUS_VERSION=3.5.11 /bin/bash -c \u0026#34;$(curl -s https://cms-agent-cn-hongkong.oss-cn-hongkong-internal.aliyuncs.com/Argus/agent_install-1.10.sh)\u0026#34; 执行以下命令，查看云监控插件状态。\nps aux | grep argusagent | grep -v grep 卸载云监控插件 以root用户登录云监控插件所在主机。\n执行以下命令，停止云监控插件。\nbash /usr/local/cloudmonitor/cloudmonitorCtl.sh stop 执行以下命令，卸载云监控插件。\nbash /usr/local/cloudmonitor/cloudmonitorCtl.sh uninstall 执行以下命令，删除目录cloudmonitor。\nrm -rf /usr/local/cloudmonitor ","date":"2024-08-24T17:02:57+08:00","permalink":"https://blog.lufei.de/p/309/","title":"阿里云香港轻量服务器卸载云盾和云监控"},{"content":"当你点进来，恭喜你来对地方了，我写的东西从来都是小白向的（把自己当小白），不会故作厉害写的云里雾里让人看不懂，既然发出来就会有人看到，不是每个人都是程序员懂技术的。\n项目 为什么图片格式要webp 或 avif，我就不多解释了。\nGtihub: https://github.com/webp-sh/webp_server_go\n文档：https://docs.webp.sh/usage/usage/\n场景 当你原本的站点有大量未经压缩的图片，例如png,jpg格式的，你可能试过不少方法来减小图片大小，以减小成本开销。但是这个过程并不容易，现在我告诉你此方案还不错你是否愿意试一试。此方案不会对你的原始图片做任何改动（大小与格式都不变），你唯一要做的就是替换图片地址而已！ 别急，这不代表什么都没有改变，直接开始教程，请往下看。\n系统环境 这是我自己的，没有限制\ndebian11\n宝塔：7.7.0\n一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/webp-server.sh \u0026amp;\u0026amp; chmod +x webp-server.sh \u0026amp;\u0026amp; ./webp-server.sh Docker安装 首先，你要安装好docker\n1. 新建项目文件夹\nmkdir -p /opt/docker_data/WebP cd /opt/docker_data/WebP mkdir -p ./exhaust ./metadata 2. 新建 docker-compose.yml\nvim docker-compose.yml 可以直接引用我的不需要改动，内容如下：\nversion: \u0026#39;3\u0026#39; services: webp: image: webpsh/webp-server-go # image: ghcr.io/webp-sh/webp_server_go restart: always environment: - MALLOC_ARENA_MAX=1 # - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2 # - LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.5.6 volumes: # - /path/to/pics:/opt/pics - ./exhaust:/opt/exhaust - ./metadata:/opt/metadata - ./config.json:/etc/config.json ports: - 127.0.0.1:3333:3333 3.新建 config.json 配置文件\ntouch config.json vim config.json 重点改动的地方就是config.json,内容如下：\n{ \u0026#34;HOST\u0026#34;: \u0026#34;0.0.0.0\u0026#34;, \u0026#34;PORT\u0026#34;: \u0026#34;3333\u0026#34;, \u0026#34;QUALITY\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;IMG_PATH\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;EXHAUST_PATH\u0026#34;: \u0026#34;./exhaust\u0026#34;, \u0026#34;IMG_MAP\u0026#34;: { \u0026#34;/image\u0026#34;: \u0026#34;https://image.leshans.eu.org/image\u0026#34;, \u0026#34;/pic\u0026#34;: \u0026#34;https://imgsrc.baidu.com/forum/pic/item\u0026#34; }, \u0026#34;ALLOWED_TYPES\u0026#34;: [\u0026#34;jpg\u0026#34;, \u0026#34;png\u0026#34;, \u0026#34;jpeg\u0026#34;, \u0026#34;bmp\u0026#34;, \u0026#34;gif\u0026#34;, \u0026#34;svg\u0026#34;, \u0026#34;heic\u0026#34;, \u0026#34;nef\u0026#34;, \u0026#34;webp\u0026#34;], \u0026#34;CONVERT_TYPES\u0026#34;: [\u0026#34;avif\u0026#34;], \u0026#34;STRIP_METADATA\u0026#34;: true, \u0026#34;ENABLE_EXTRA_PARAMS\u0026#34;: true, \u0026#34;EXTRA_PARAMS_CROP_INTERESTING\u0026#34;: \u0026#34;InterestingAttention\u0026#34;, \u0026#34;READ_BUFFER_SIZE\u0026#34;: 4096, \u0026#34;CONCURRENCY\u0026#34;: 262144, \u0026#34;DISABLE_KEEPALIVE\u0026#34;: false, \u0026#34;CACHE_TTL\u0026#34;: 2592000, \u0026#34;MAX_CACHE_SIZE\u0026#34;: 0 } 修改配置 假设原本的站点图片域名是 image.aaa.com 现在，请准备另外的域名或者aaa的二级域名都行，例如 image.bbb.com image.bbb.com 做好解析，配置好证书 我们只需要改动 IMG_MAP 字段，例如：\n\u0026#34;IMG_MAP\u0026#34;: { \u0026#34;/image\u0026#34;: \u0026#34;https://image.aaa.com\u0026#34; }, 解释：\n原本的图片地址是https://image.aaa.com/123456.png 新的图片地址是：https://image.bbb.com/image/123456.png 左边的/image就是路径，右边就是原始地址 看出来了吗，就点反向代理的意思 提示：不局限于反代自己站点的图片，你可以反代几乎任何站点的图片\n可以多个地址，例如：\n\u0026#34;IMG_MAP\u0026#34;: { \u0026#34;/image\u0026#34;: \u0026#34;https://image.aaa.com\u0026#34;, \u0026#34;/bili\u0026#34;: \u0026#34;https://i0.hdslb.com/bfs/archive\u0026#34; }, https://i0.hdslb.com/bfs/archive/123456.png\n就变成\nhttps://image.bbb.com/bili/123456.png\n注意：/image和/bili的上下排序，字符长的在上面，所以，/image在上面。\n修改好后，启动\ndocker compose up -d 忘了说，安装成功后，记得做好反向代理，端口是3333 反向代理这块并没有特殊要求，不管是使用宝塔，还是其他方式\n测试是否生效 打开替换后的图片地址，\n原本的图片格式是png，没有改变，但是查看标头会看到：\nContent-Type: image/avif 说明转成了avif格式 X-Compression-Rate: 0.12 压缩率，即大小为原始图片的12% avif格式大小为43.3k 原本的png格式大小为363k 其他参数说明 可选webp，avif\n\u0026#34;CONVERT_TYPES\u0026#34;: [\u0026#34;webp\u0026#34;] # 默认webp 启用额外参数\n\u0026#34;ENABLE_EXTRA_PARAMS\u0026#34;: true, 例如图片链接末尾添加\n?max_width=270\u0026amp;max_height=405 这两个参数用于限制图像的尺寸，并将大尺寸图像限制在这两个维度内，同时保持小尺寸图像不变。\n例如，我们有一张名为 big.jpg 的 500x500px 图像。当您访问 /big.jpg?max_height=200\u0026amp;max_width=100 时，由于 max_width 较小，图像将缩放为 100x100px。\n如果我们有一张名为 small.jpg 的 80x80px 图片，当你访问 /small.jpg?max_height=200\u0026amp;max_width=100 时，由于图片的长宽都在范围内，所以这张图片不会被处理。\n缓存有效期\n设置为0则永久缓存\n\u0026#34;CACHE_TTL\u0026#34;: 259200, 缓存大小\n单位为MiB，默认值是0，这意味着不会清理本地缓存文件。如果设置了该值，例如设置为50，那么每分钟后台任务将与WebP Server Go同时运行一次，以确保本地缓存目录的总大小不超过50MiB\n\u0026#34;MAX_CACHE_SIZE\u0026#34;: 0 完结撒花。。。。\n","date":"2024-08-24T06:28:33+08:00","permalink":"https://blog.lufei.de/p/308/","title":"个人网站无缝切换图片到 webp"},{"content":" 对于大多数网页图片来说,AVIF格式是一个很好的起点，它能在文件大小和图像质量之间取得良好的平衡。AVIF提供了优秀的压缩效率和图像质量。它特别适合网页使用，因为它可以大幅减小文件大小而保持良好的视觉质量。\n准备软件 ShareX imagemagick imagemagick 下载第一个 Q16-HDRI-x64-dll.exe 安装 ShareX 动作设置 按下图 动作设置-动作-添加 进入动作添加页面\n动作参数 webp\n将图像转换为质量为 50 的 WebP 格式，并启用无损压缩\n\u0026#34;$input\u0026#34; -quality 50 -define WebP:lossless=true \u0026#34;$output\u0026#34; avif\n将图像转换为质量为 60 的 AVIF 格式，设置压缩级别为 6，编码努力程度为 7\nconvert \u0026#34;$input\u0026#34; -quality 60 -define avif:compression-level=6 -define avif:effort=7 \u0026#34;$output\u0026#34; 编码2（推荐）\nconvert \u0026#34;$input\u0026#34; -quality 70 -define avif:compression-level=3 -define avif:effort=4 \u0026#34;$output\u0026#34; 例如\nShareX 截图任务 按下图顺序设置截图后的任务顺序 保存图像文件 \u0026ndash; 执行操作 \u0026ndash; 上传图片\n上传到cloudflare r2 教程地址：\nhttps://getsharex.com/docs/cloudflare-r2\n","date":"2024-08-23T02:36:43+08:00","permalink":"https://blog.lufei.de/p/307/","title":"告别臃肿！个人博客图片优化的秘密武器——AVIF格式"},{"content":"1. 说明 在 Ubuntu 22.04 上使用 root 账号，创建普通账号，并赋予 root 权限。\n2. 服务器配置 建立 git 用户\nadduser git 安装 git\nsudo apt install git 给新用户添加管理权限\nsudo usermod -aG sudo git 账号切换\nsudo su git 在服务端新建 git 仓库\ncd ~ git config --global init.defaultBranch main git init --bare hugo.git sudo chown -R git:git hugo.git mkdir hugo 配置钩子\nvim /home/git/hugo.git/hooks/post-receive 写入以下文本：\ngit --work-tree=/home/git/hugo --git-dir=/home/git/hugo.git checkout -f 配置权限：\nsudo chmod +x /home/git/hugo.git/hooks/post-receive 3.本地生成 SSH 密钥 打开 Git bash 输入：\nssh-keygen -t ed25519 -C \u0026#34;太酷啦\u0026#34; 复制公钥内容：\ncat ~/.ssh/id_ed25519.pub 4. 服务器配置 登录到远程服务器，并将公钥内容添加到 ~/.ssh/authorized_keys 文件中\n## 登录git用户 cd ~ mkdir -p ~/.ssh echo \u0026#34;YOUR_PUBLIC_KEY\u0026#34; \u0026gt;\u0026gt; ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh 把YOUR_PUBLIC_KEY替换成公钥内容\n5.测试 SSH 连接 在推送代码之前，先测试 SSH 连接是否正常\n注意：假设SSH端口是5522，不是默认的22\nssh -p 5522 git@41.87.27.42 清理 known_hosts 文件\n如果之前有错误的连接记录，可以尝试清理 known_hosts 文件\nssh-keygen -f \u0026#34;~/.ssh/known_hosts\u0026#34; -R \u0026#34;41.87.27.42\u0026#34; 6.本地推送 打开博客根目录，打开Git bash,输入：\nhugo --gc --minify 创建本地仓库\ncd public git init git branch -M main 添加远程仓库\ngit remote add origin ssh://git@8.8.8.8:33/home/git/hugo.git 确认远程仓库配置\ngit remote -v 第一次推送博客内容到服务器\ngit add . git commit -m \u0026#39;First Commit\u0026#39; git push -u origin main 如果推送有问题，直接强推：\ngit push -f origin main 更新本地仓库(可选)\ngit fetch --prune git branch -a 7.一键推送脚本 将脚本保存在博客根目录去执行\n#!/bin/bash # 备份 public 目录下的 .git 目录 if [ -d \u0026#34;public/.git\u0026#34; ]; then mv public/.git .git_backup fi # 删除 public 目录 rm -rf public # 生成静态文件 hugo --gc --minify # 还原 .git 目录 if [ -d \u0026#34;.git_backup\u0026#34; ]; then mv .git_backup public/.git fi # 进入 public 目录并推送更新 cd public git add . git commit -m \u0026#39;update\u0026#39; git push origin main # 提示用户确认退出（使用绿色高亮） echo -e \u0026#34;\\033[1;32m推送完成。按Enter键退出...\\033[0m\u0026#34; read 8.宝塔部署 安装nginx，设置为静态站点，在计划任务添加shell脚本,将DEST_DIR设置为你站点目录\n脚本解释：使用rsync命令将hugo静态目录同步到站点目录\n#!/bin/bash LOCK_FILE=\u0026#34;/home/git/myrsyncscript.lock\u0026#34; # 修改为你有权限写入的目录 ( flock -n 9 || { echo \u0026#34;Another instance is running\u0026#34;; exit 1; } SOURCE_DIR=\u0026#34;/home/git/hugo\u0026#34; DEST_DIR=\u0026#34;/www/wwwroot/book.xxx.org\u0026#34; sudo rsync -avz --delete --exclude=\u0026#39;.user.ini\u0026#39; --timeout=600 \u0026#34;$SOURCE_DIR/\u0026#34; \u0026#34;$DEST_DIR/\u0026#34; if [ $? -eq 0 ]; then echo \u0026#34;文件拷贝成功\u0026#34; else exit 1 fi ) 9\u0026gt;\u0026#34;$LOCK_FILE\u0026#34; 完美结局~\n","date":"2024-08-18T02:15:46+08:00","permalink":"https://blog.lufei.de/p/306/","title":"将hugo博客搬迁到服务器"},{"content":"官网：https://ditto-cp.sourceforge.io/\n","date":"2024-08-17T00:15:44+08:00","permalink":"https://blog.lufei.de/p/305/","title":"剪贴板神器Ditto"},{"content":"markdownmonster 官网：https://markdownmonster.west-wind.com/download\n","date":"2024-08-16T15:11:20+08:00","permalink":"https://blog.lufei.de/p/304/","title":"markdown工具推荐"},{"content":"☺☠〠\n让Nginx只接受cloudflare（以下简称cf）的回源请求，不允许其他客户端直接访问源服务器。\n首先获取最新的cf回源IP，并转换成nginx的配置文件格式。\nhttps://www.cloudflare.com/ips-v4\nhttps://www.cloudflare.com/ips-v6\nhttps://www.cloudflare.com/zh-cn/ips/\n在/www/server/nginx/conf目录创建cfip.conf 写入以下内容：\n#IPv4 allow 127.0.0.1; allow 173.245.48.0/20; allow 103.21.244.0/22; allow 103.22.200.0/22; allow 103.31.4.0/22; allow 141.101.64.0/18; allow 108.162.192.0/18; allow 190.93.240.0/20; allow 188.114.96.0/20; allow 197.234.240.0/22; allow 198.41.128.0/17; allow 162.158.0.0/15; allow 104.16.0.0/13; allow 104.24.0.0/14; allow 172.64.0.0/13; allow 131.0.72.0/22; #IPv6 allow ::1; allow 2400:cb00::/32; allow 2606:4700::/32; allow 2803:f800::/32; allow 2405:b500::/32; allow 2405:8100::/32; allow 2a06:98c0::/29; allow 2c0f:f248::/32; 然后在站点的 Nginx 配置文件 Server 区块中加入以下内容\ninclude cfip.conf; deny all; 重启nginx。\n完结\n","date":"2024-08-16T01:07:36+08:00","permalink":"https://blog.lufei.de/p/303/","title":"Nginx配置仅允许cloudflare回源IP访问"},{"content":"Censys 搜索引擎很强大。Censys 每天都会扫描 IPv4 地址空间，以搜索所有联网设备并收集相关的信息，并返回一份有关资源（如设备、网站和证书）配置和部署信息的总体报告。\n在 IP 前加上 https 访问时，Nginx 会自动返回该网站的 https 证书，从而暴露相关域名信息。哪怕是套了 CDN 也还是会被扫到。Censys 还会扫描端口，例如 80、8000、8080、443、4433。\n所以为了防止，自己的网站被攻击我们需要屏蔽掉 Censys 的扫描。据我所知有四种办法，分部是屏蔽 Censys 的 UA、屏蔽 Censys 的 IP 段、建立虚假网站以及使用 Nginx 的特性。四种方法，选其一即可。当然如果你觉得不够安全，可以都使用。\n系统： ubuntu22.04\nnginx: 1.25.5\n1.屏蔽 Censys 的 IP 段 Censys 的 IP 段在其官网有。我的机子使用的是 Ubuntu 系统，带有 UFW 防火墙，按照下面的命令建立规则即可。\nCensys IP段 ：https://support.censys.io/hc/en-us/articles/360043177092-Opt-Out-of-Data-Collection\nsudo ufw deny from 162.142.125.0/24 sudo ufw deny from 167.94.138.0/24 sudo ufw deny from 167.94.145.0/24 sudo ufw deny from 167.94.146.0/24 sudo ufw deny from 167.248.133.0/24 sudo ufw deny from 199.45.154.0/24 sudo ufw deny from 199.45.155.0/24 sudo ufw deny from 206.168.34.0/24 sudo ufw deny from 2602:80d:1000:b0cc:e::/80 sudo ufw deny from 2620:96:e000:b0cc:e::/80 sudo ufw deny from 2602:80d:1003::/112 sudo ufw deny from 2602:80d:1004::/112 开启ufw和重载ufw,重启nginx\nsudo ufw reload #重载ufw ufw status # 查看状态 sudo systemctl reload nginx # 重启nginx 2.屏蔽 Censys 的 UA 如果你使用了 CDN ，那么就要在 CDN 中屏蔽掉 Censys 扫描使用的 UA。\nCensys 扫描使用的 UA 如下：\nMozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/) 例如cloudflare cdn\n安全性\u0026ndash;WAF\u0026ndash;自定义规则\n字段：用户代理\n运算符： 等于\n值：Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)\n3.使用 Nginx 1.19.4 的新特性（推荐） Nginx 1.19.4 新增了一个特性，ssl_reject_handshake 。在 IP 访问时会终止 TLS 握手，也就不会暴露域名了。\n例如宝塔面板：\n在/www/server/panel/vhost/nginx目录找到0.default.conf，删除原有代码，添加如下代码：\nserver { listen 443 ssl default_server; # 如果有 IPv6 地址的需要，则加入下面这行。 # listen [::]:443 ssl default_server; ssl_reject_handshake on; } 重启nginx生效：:\n/etc/init.d/nginx restart 4.建立虚假网站 网站是一个纯静态网站，网站的文件，除了 .htaccess 和 .user.ini 这两个文件，其他的全删除。 添加自签的空白 SSL 证书，强制 HTTPS，设置为默认网站 1.生成自签名证书(一路回车键)\nmkdir -p /opt/signcert \u0026amp;\u0026amp; cd /opt/signcert openssl req -x509 -newkey rsa:4096 -keyout OpenLiteSpeed-key.pem -out OpenLiteSpeed-cert.pem -nodes -days 365 # 一路回车 2.替换证书\ncat /opt/signcert/OpenLiteSpeed-cert.pem \u0026gt; /www/server/panel/vhost/cert/ip.com/fullchain.pem cat /opt/signcert/OpenLiteSpeed-key.pem \u0026gt; /www/server/panel/vhost/cert/ip.com/privkey.pem /etc/init.d/nginx restart 3.下一步到假站点保存一下ssl证书使其生效\n设置假站点为默认站点\n","date":"2024-08-15T20:08:35+08:00","permalink":"https://blog.lufei.de/p/302/","title":"屏蔽 Censys，防止源站 IP 泄露"},{"content":"一键查询脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/check-cert.sh \u0026amp;\u0026amp; chmod +x check-cert.sh 运行脚本并提供域名作为参数：\n./check-cert.sh example.com certbot申请的证书 your-domain替换成你的域名\n查询ocsp地址：\nopenssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -ocsp_uri ssl_trusted_certificate配置路径：\nssl_trusted_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; acme.sh申请的证书 查询ocsp地址：\nopenssl x509 -in ~/.acme.sh/your-domain.com/your-domain.cer -noout -ocsp_uri ssl_trusted_certificate配置路径：\nssl_trusted_certificate ~/.acme.sh/your-domain.com/fullchain.cer; ","date":"2024-08-10T20:54:29+08:00","permalink":"https://blog.lufei.de/p/301/","title":"OCSP地址查询"},{"content":"本文介绍如何在 Ubuntu 22.04 系统上使用宝塔面板配置 Nginx FastCGI 缓存，以提升网站速度。\n环境:\n系统: Ubuntu 22.04 面板: 宝塔面板 7.7.0 Nginx 版本: 1.25.5 步骤 1. 检查缓存模块 确认 ngx_cache_purge 模块已安装:\nnginx -V 2\u0026gt;\u0026amp;1 | grep -o ngx_cache_purge 2. 创建缓存文件夹 注意：最好是在/var/cache/目录下创建，否则重启服务器会导致nginx无法启动\nmkdir -p /var/cache/nginx/catpdf_org chmod -R 755 /var/cache/nginx/catpdf_org 3. 配置 Nginx 缓存 在 Nginx 配置文件的 server 块前添加:\nfastcgi_cache_path /var/cache/nginx/catpdf_org levels=1:2 keys_zone=CATPDF.ORG:200m inactive=2d max_size=10G; fastcgi_cache_key \u0026#34;$scheme$request_method$host$request_uri$is_args$args\u0026#34;; fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; 4. 配置站点缓存 在站点配置文件的 #SSL-END 后添加:\n# 配置 Nginx fastcgi_cache START set $skip_cache 0; # 定义不缓存的条件 if ($request_method = POST) { set $skip_cache 1; } if ($query_string != \u0026#34;\u0026#34;) { set $skip_cache 1; } if ($request_uri ~* \u0026#34;purge=all|/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml\u0026#34;) { set $skip_cache 1; } if ($http_cookie ~* \u0026#34;comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in\u0026#34;) { set $skip_cache 1; } location ~ [^/]\\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi-74.sock; fastcgi_index index.php; include fastcgi.conf; # 缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache CATPDF.ORG; fastcgi_cache_valid 200 301 302 1d; # 安全头部 add_header Strict-Transport-Security \u0026#34;max-age=15552000; includeSubdomains; preload\u0026#34;; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34;; add_header X-Cache \u0026#34;$upstream_cache_status From $host\u0026#34;; add_header Cache-Control \u0026#34;max-age=86400\u0026#34;; add_header Nginx-Cache \u0026#34;$upstream_cache_status\u0026#34;; add_header Last-Modified $date_gmt; etag on; } # 缓存清理配置 location ~ /purge(/.*) { allow 127.0.0.1; allow \u0026#34;8.8.8.8\u0026#34;; deny all; fastcgi_cache_purge CATPDF.ORG \u0026#34;$scheme$request_method$host$1\u0026#34;; } # 配置 Nginx fastcgi_cache END WordPress 配置 Nginx fastcgi_cache 注意事项\nadd_header Cache-Control如果是动态内容要实时更新的话，可以设置为0，否则可以设置时间大一些，默认单 位是秒； 2.sock的路径一定要填对，否则会出现502错误；例如：fastcgi_pass unix:/tmp/php-cgi-74.sock; 表示php为7.4版本 3.代码里面的服务器公网IP换成你的服务器公网IP,须保留双引号； 4.可选缓存配置：某些主题如果移动端访问报错，可以设置不缓存移动端，参考写法：\n#不缓存移动端访问 if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|windowss(ce|phone))) { set $skip_cache 1; } 如果评论过的用户加载的是缓存，那应该是WordPress没有记住Cookie,尝试把以下代码加入到functions.php 中：\n//nginx-cache 缓存配置代码 add_action(\u0026#39;set_comment_cookies\u0026#39;,\u0026#39;coffin_set_cookies\u0026#39;,10,3); function coffin_set_cookies( $comment, $user, $cookies_consent){ $cookies_consent = true; wp_set_comment_cookies($comment, $user, $cookies_consent); } 启用fastcgi_cache缓存时，发现在Nginx配置文件中添加了Cache-Control信息，但是总是不生效。HTTP头部信息会总会包含以下信息：\nCache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache 打开php配置，查找\nsession.cache_limiter = nocache 改成\nsession.cache_limiter = none WordPress缓存处理 Nginx Helper插件 进入WordPress 后台插件安装界面搜索 Nginx Helper 关键词在线安装即可\n1）开启purge，选择nginx Fastcgin cahe，因为就我们用就是这个缓存。\n2）选择 Delete local server cache files。当然第一个也可以用，但是一般推荐用Delete local server cache files，因为每个服务器的环境都不一样，缓存路径也会不尽相同就会导致插件无法找到缓存文件并删除！\n插件法注意事项\n由于插件作者定义的缓存路径是/var/run/nginx-cache, 解决办法是在插件中找到这一处路径，并替 换成我们自己上边设置的路径/tmp/nginx-cache/catpdf_org\n定义缓存路径的位置在/wp-content/plugins/nginx-helper/includes/class-nginx-helper.php,约88行位置。\n如果怕更新插件忘了改，那么最好是在WordPress根目录下的wp-config.php中新增如下代码即可（不知道添 加到第几行的话，可以添加到 define(\u0026lsquo;WPLANG\u0026rsquo;,\u0026lsquo;zh_CN\u0026rsquo;);的后面。添加后建议重载一下PHP,确保变量 生效（主要针对开启了PHP缓存的网站），\n//根据实际情况定义缓存的存放路径 define(\u0026#39;RT_WP_NGINX_HELPER_CACHE_PATH\u0026#39;,\u0026#39;/tmp/nginx-cache/catpdf_org\u0026#39;); 纯代码版 为张戈大佬原创：https://zhang.ge/5112.html，搬运如下\n将整段粘贴到 WordPress 主题函数模板文件 functions.php 当中即可。其他功能细项，在代码和原文中都有详细的注释了，自行参考修改\n/** * WordPress Nginx FastCGI 缓存清理代码(Nginx-Helper 纯代码版) By 张戈博客 * 文章地址：https://zhang.ge/5112.html * 转载请保留原文出处，谢谢合作！ */ //初始化配置 $logSwitch = 0; //配置日志开关，1 为开启，0 为关闭 $logFile = \u0026#39;/tmp/purge.log\u0026#39;; //配置日志路径 $cache_path = \u0026#39;/tmp/nginx-cache/catpdf_org\u0026#39;; //配置缓存路径 //清理所有缓存(仅管理员) 范例：http://www.domain.com/?purge=all if ($_GET[\u0026#39;purge\u0026#39;] == \u0026#39;all\u0026#39; \u0026amp;\u0026amp; is_user_logged_in()) { if( current_user_can( \u0026#39;manage_options\u0026#39; )) { delDirAndFile($cache_path, 0); } } //缓存清理选项 add_action(\u0026#39;publish_post\u0026#39;, \u0026#39;Clean_By_Publish\u0026#39;, 99); //文章发布、更新清理缓存 add_action(\u0026#39;comment_post\u0026#39;, \u0026#39;Clean_By_Comments\u0026#39;,99); //评论提交清理缓存(不需要可注释) add_action(\u0026#39;comment_unapproved_to_approved\u0026#39;, \u0026#39;Clean_By_Approved\u0026#39;,99); //评论审核清理缓存(不需要可注释) //文章发布清理缓存函数 function Clean_By_Publish($post_ID){ $url = get_permalink($post_ID); cleanFastCGIcache($url); //清理当前文章缓存 cleanFastCGIcache(home_url().\u0026#39;/\u0026#39;); //清理首页缓存(不需要可注释此行) //清理文章所在分类缓存(不需要可注释以下 5 行) if ( $categories = wp_get_post_categories( $post_ID ) ) { foreach ( $categories as $category_id ) { cleanFastCGIcache(get_category_link( $category_id )); } } //清理文章相关标签页面缓存(不需要可注释以下 5 行) if ( $tags = get_the_tags( $post_ID ) ) { foreach ( $tags as $tag ) { cleanFastCGIcache( get_tag_link( $tag-\u0026gt;term_id )); } } } // 评论发布清理文章缓存 function Clean_By_Comments($comment_id){ $comment = get_comment($comment_id); $url = get_permalink($comment-\u0026gt;comment_post_ID); cleanFastCGIcache($url); } // 评论审核通过清理文章缓存 function Clean_By_Approved($comment) { $url = get_permalink($comment-\u0026gt;comment_post_ID); cleanFastCGIcache($url); } //日志记录 function purgeLog($msg) { global $logFile, $logSwitch; if ($logSwitch == 0 ) return; date_default_timezone_set(\u0026#39;Asia/Shanghai\u0026#39;); file_put_contents($logFile, date(\u0026#39;[Y-m-d H:i:s]: \u0026#39;) . $msg . PHP_EOL, FILE_APPEND); return $msg; } // 缓存文件删除函数 function cleanFastCGIcache($url) { $url_data = parse_url($url); global $cache_path; if(!$url_data) { return purgeLog($url.\u0026#39; is a bad url!\u0026#39; ); } $hash = md5($url_data[\u0026#39;scheme\u0026#39;].\u0026#39;GET\u0026#39;.$url_data[\u0026#39;host\u0026#39;].$url_data[\u0026#39;path\u0026#39;]); $cache_path = (substr($cache_path, -1) == \u0026#39;/\u0026#39;) ? $cache_path : $cache_path.\u0026#39;/\u0026#39;; $cached_file = $cache_path . substr($hash, -1) . \u0026#39;/\u0026#39; . substr($hash,-3,2) . \u0026#39;/\u0026#39; . $hash; if (!file_exists($cached_file)) { return purgeLog($url . \u0026#34; is currently not cached (checked for file: $cached_file)\u0026#34; ); } else if (unlink($cached_file)) { return purgeLog( $url.\u0026#34; *** CLeanUP *** (cache file: $cached_file)\u0026#34;); } else { return purgeLog(\u0026#34;- - An error occurred deleting the cache file. Check the server logs for a PHP warning.\u0026#34; ); } } /** * 删除目录及目录下所有文件或删除指定文件 * 代码出自 ThinkPHP：http://www.thinkphp.cn/code/1470.html * @param str $path 待删除目录路径 * @param int $delDir 是否删除目录，1 或 true 删除目录，0 或 false 则只删除文件保留目录（包含子目录） * @return bool 返回删除状态 */ function delDirAndFile($path, $delDir = FALSE) { $handle = opendir($path); if ($handle) { while (false !== ( $item = readdir($handle) )) { if ($item != \u0026#34;.\u0026#34; \u0026amp;\u0026amp; $item != \u0026#34;..\u0026#34;) is_dir(\u0026#34;$path/$item\u0026#34;) ? delDirAndFile(\u0026#34;$path/$item\u0026#34;, $delDir) : unlink(\u0026#34;$path/$item\u0026#34;); } closedir($handle); if ($delDir) return rmdir($path); }else { if (file_exists($path)) { return unlink($path); } else { return FALSE; } } } 多站点设置 如果要开启更多站点缓存，按照上面的教程在对应网站添加即可，注意事项如下：\n**每个站点的缓存路径 （fastcgi_cache_path）和缓存密钥（ keys_zone ）设置为不一样的 ** 同一个顶级域名下面的子域名不需要加上面配置中的第一行，注释掉 fastcgi_cache_key \u0026#34;$scheme$request_method$host$request_uri\u0026#34;; ","date":"2024-08-10T01:19:49+08:00","permalink":"https://blog.lufei.de/p/300/","title":"提升网站速度：配置 Nginx FastCGI 缓存"},{"content":"环境 系统：Ubuntu 22.04.4 LTS x86_64\n宝塔版本：7.7.0 (可使用本博客提供的一键安装优化脚本)\nnginx版本：1.26.1\n开放UDP端口 注意：在你的服务器商家那里也要开放443 udp端口\nsudo ufw allow 443/udp 然后重新加载 UFW 以使新规则生效：\nsudo ufw reload 安装 ngx_brotli模块 cd /www/server git clone --recurse-submodules -j8 https://github.com/google/ngx_brotli 添加 ngx_brotli 编译参数\necho \u0026#34;--add-module=/www/server/ngx_brotli\u0026#34; \u0026gt; /www/server/panel/install/nginx_configure.pl 到这一步其实可以编译nginx了，但是为了更好的性能释放，先升级OpenSSL后再编译\n升级OpenSSL 版本 宝塔中编译安装的 Nginx 使用的是 OpenSSL 1.1.1(版本老旧)，可以使用命令查看\nnginx -V 2\u0026gt;\u0026amp;1 | grep -oP \u0026#39;built with OpenSSL \\K\\d+\\.\\d+\\.\\d+\u0026#39; 开始升级\ncd /www/server \u0026amp;\u0026amp; \\ mkdir openssl \u0026amp;\u0026amp; \\ wget https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz \u0026amp;\u0026amp; \\ tar -xzf openssl-3.3.1.tar.gz -C openssl --strip-components=1 \u0026amp;\u0026amp; \\ rm openssl-3.3.1.tar.gz 修改宝塔面板的 Nginx 安装脚本\ncd /www/server/panel/install wget -O zzbnginx.sh https://raw.githubusercontent.com/woniu336/open_shell/main/zzbnginx.sh 编译安装 Nginx，如果以前已安装过 Nginx 则先卸载\nsh zzbnginx.sh install 1.26 等待编译完成\n安装完成后，使用 nginx -V 查看编译详情：\n如服务器的性能较强，CPU 与内存足够，还可以在 http 块（即宝塔面板\u0026gt;Nginx\u0026gt;设置\u0026gt;配置修改）中添加以下指令：\nhttp3_max_concurrent_streams 256; http3_stream_buffer_size 128k; http3_max_concurrent_streams 这个指令是用来限制在单个 HTTP/3 连接上可以同时处理的最大流数量。默认值 128 意味着一个单一的 HTTP/3 连接可以同时承载最多 128 个双向数据流。\nhttp3_stream_buffer_size 指令用于设置 HTTP/3 流的缓冲区大小。这个缓冲区用于存储待发送或已接收但尚未处理的数据。其默认值为 64k，增加缓冲区大小可以减少 I/O 操作的频率，可能对性能有所提升，特别是在处理大块数据传输时。\n不过需要注意的是：这两个参数的值越大，占用的内存较多。\n启用 Brotli压缩 nginx编译完成后，打开nginx配置，在gzip_disable的下方添加以下代码\nbrotli on; brotli_comp_level 6; brotli_buffers 16 8k; brotli_min_length 20; brotli_types *; brotli_static always; brotli_window 512k; 保存并重启 Nginx 。\n当你重启nginx可能会报错的原因：\n从 Nginx 1.25.1 开始，不再支持在 listen 中使用 http2 参数，需要单独一行 http2 on；\n所以，在站点配置中或其他站点，把http2去掉，单独一行，文末有说明\n启用 QUIC/HTTP3 前提，你已经配置了证书\n打开你的站点，完整的配置在文末，把域名改成你的即可：\n注意事项：\nlisten 443 quic reuseport; ## reuseport 只能在一个站点使用，其他站点请去掉reuseport listen 443 quic; ## 例如，其他站点没有reuseport参数 include enable-php-81.conf; ## 这里的php是8.1版本，请修改成你使用的版本 access_log和error_log 后面也要改成你的域名 root /www/wwwroot/baidu.org; 这里改成你的站点目录 server_name baidu.org www.baidu.org; 改成你的域名 当你重启nginx会报错的原因：\n从 Nginx 1.25.1 开始，不再支持在 listen 中使用 http2 参数，需要单独一行 http2 on；\n所以，在站点配置中或其他站点，把http2去掉，单独一行，如图\n完整站点配置\nserver { listen 80; listen 443 ssl; listen 443 quic reuseport; http2 on; http3 on; quic_gso on; quic_retry off; server_name catpdf.org www.catpdf.org; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/catpdf.org; # SSL 配置 ssl_certificate /www/server/panel/vhost/cert/catpdf.org/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/catpdf.org/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers \u0026#39;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384\u0026#39;; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1h; ssl_early_data on; ssl_stapling on; ssl_stapling_verify on; # HTTP重定向至HTTPS if ($server_port !~ 443) { return 301 https://$host$request_uri; } # Proxy headers 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 Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;Upgrade\u0026#34;; proxy_buffering off; proxy_http_version 1.1; proxy_read_timeout 600s; # HTTP/3 headers add_header Alt-Svc \u0026#39;h3=\u0026#34;:443\u0026#34;; ma=2592000\u0026#39;; add_header Strict-Transport-Security \u0026#34;max-age=15552000; includeSubDomains; preload\u0026#34;; # Error pages error_page 497 https://$host$request_uri; # PHP 配置 include enable-php-00.conf; # Rewrite rules include /www/server/panel/vhost/rewrite/catpdf.org.conf; # 禁止访问的文件或目录 location ~ ^/(\\.user.ini|\\.htaccess|\\.git|\\.svn|\\.project|LICENSE|README.md) { return 404; } # 一键申请SSL证书验证目录相关设置 location ~ \\.well-known { allow all; } # Static file handling location ~* \\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; access_log off; } location ~* \\.(js|css)?$ { expires 12h; access_log off; } # Logging access_log /www/wwwlogs/catpdf.org.log; error_log /www/wwwlogs/catpdf.org.error.log; } 保存并重启 Nginx 。\nhttp3/quic检测 https://http3.wcode.net/\nhttps://http3check.net/\n重启nginx报错http2 从 Nginx 1.25.0 开始，不再支持在 listen 中使用 http3 参数，需要修改为 quic； 从 Nginx 1.25.1 开始，不再支持在 listen 中使用 http2 参数，需要单独一行 http2 所以，查找其他站点配置文件，把 http2 去掉，单独一行，比如：\nserver { listen 443 ssl; listen 443 quic reuseport; http2 on; 浏览器配置 谷歌Chrome浏览器 访问：chrome://flags/ 启用：Experimental QUIC protocol (enable-quic) 微软新版Edge浏览器 访问：edge://flags 启用：Experimental QUIC protocol 设置为“Enabled” 火狐Firefox浏览器 访问：about:config 启用：network.http.http3.enabled ","date":"2024-08-09T16:14:46+08:00","permalink":"https://blog.lufei.de/p/299/","title":"宝塔面板启用 QUIC 与 Brotli 的完整教程"},{"content":"背景 我通过AI制作了不少关于签发ssl证书的脚本，目的是方便无脑安装，不需要懂代码。\n但全都是基于acme.sh这个工具来设计的脚本，而且证书申请有点慢，有时还会申请失败。\n然后我发现了certbot, 安装证书可谓神速！\ncertbot文档： https://eff-certbot.readthedocs.io/en/latest/using.html#managing-certificates\n由于我建站都是使用的宝塔面板（7.7.0原版），所以结合宝塔设计了此脚本，\n为什么我不用宝塔自带的方式安装证书，因为我就没安装成功过~\n脚本 环境：ubuntu22.04\ncertbot： 基于Let\u0026rsquo;s Encrypt （默认ecc证书）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert.sh \u0026amp;\u0026amp; chmod +x ssl-cert.sh \u0026amp;\u0026amp; ./ssl-cert.sh 其他 首次安装证书后，需要到宝塔面板，选择站点，找到ssl保存一下，目的是之后的自动续签。\n安装成功后，选择菜单4，测试续签是否正常，看到renewals succeeded说明正常了。\n修改续签定时任务 查看原本的certbot定时任务：\ncat /etc/cron.d/certbot 其实就是在后面添加了 --deploy-hook \u0026quot;/etc/init.d/nginx restart\u0026quot;参数，目的是重启nginx，使其生效。之后就可以高枕无忧的自动续签证书了\n证书路径 certbot生成的证书路径是：/etc/letsencrypt/live\n续签配置路径：/etc/letsencrypt/renewal\n脚本会把证书复制到站点证书目录\ncertbot会在证书离到期日还剩30天内续签证书\n友情提示 如果一个域名在短时间内，多次申请，全部成功（大概6次吧，不记得了），会提示一周后在申请，我是为了测试脚本才遇到的bug。\n其他 如果没有创建/etc/letsencrypt/live/aaaa.com目录,可以手动,例如：\nsudo mkdir -p /etc/letsencrypt/live/aaa.com sudo ln -sf /etc/letsencrypt/archive/aaa.com/privkey1.pem /etc/letsencrypt/live/aaa.com/privkey.pem sudo ln -sf /etc/letsencrypt/archive/aaa.com/fullchain1.pem /etc/letsencrypt/live/aaa.com/fullchain.pem sudo ln -sf /etc/letsencrypt/archive/aaa.com/cert1.pem /etc/letsencrypt/live/aaa.com/cert.pem sudo ln -sf /etc/letsencrypt/archive/aaa.com/chain1.pem /etc/letsencrypt/live/aaa.com/chain.pem ","date":"2024-08-06T01:13:47+08:00","permalink":"https://blog.lufei.de/p/298/","title":"SSL证书签发脚本"},{"content":" docker版本的发卡程序搭建\n项目1：https://github.com/assimon/dujiaoka\n项目2（基于项目1）：https://github.com/Apocalypsor/dujiaoka-docker\n一键安装脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/dujiaoka-setup.sh \u0026amp;\u0026amp; chmod +x dujiaoka-setup.sh \u0026amp;\u0026amp; ./dujiaoka-setup.sh 安装成功后，打开ip:3080,填写信息，登录后台/admin 默认用户名和密码：admin\n手动安装 步骤 1 安装 docker curl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 查询是否安装成功\ndocker --version\u0026amp;\u0026amp;docker-compose --version 开机自启\nsudo systemctl enable docker 步骤 2 安装部署独角数卡 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/duka.sh \u0026amp;\u0026amp; chmod +x duka.sh \u0026amp;\u0026amp; ./duka.sh 步骤 3 网页安装 重点 打开 ip:3080\n将 mysql数据库地址 改为 db 将 mysql 用户名 改为 dujiaoka 将 mysql 密码改为终端显示的密码 将 redis 的地址改为 redis 填写网站名称 网站 url 填写完整域名地址，例如 http://shop.ioiox.com 禁用INSTALL 安装并完成后，将docker-compose.yaml环境变量中的INSTALL=true改为INSTALL=false\n目的是禁止安装，因为已经成功安装过了\ncd /root/dujiao vim docker-compose.yaml 如果没有安装vim，会提示：-bash: vim: command not found\nsudo apt-get update sudo apt-get install vim 然后：\ndocker-compose down \u0026amp;\u0026amp; docker-compose up -d 启用 https 如果使用https链接打开后台登录，会出现 0err 或者其他登录异常问题，修改配置文件:\nvim /root/dujiao/env.conf 把 ADMIN_HTTPS=false 改成 ADMIN_HTTPS=true\nAPP_URL 域名也改一下 (https)\n重启 docker\nsystemctl restart docker 禁用调试 正式上线后一定要将 env.conf 配置里面的 APP_DEBUG 设置为 false\n目的是禁止调试\nvim /root/dujiao/env.conf 重启 docker\nsystemctl restart docker ","date":"2024-08-05T03:51:10+08:00","permalink":"https://blog.lufei.de/p/297/","title":"使用docker快速搭建发卡网-独角数卡"},{"content":"图片地址替换\nhttps://xxx.com 为远程图片地址\nUPDATE {pre}vod SET vod_pic=REPLACE(vod_pic, \u0026#39;upload/vod\u0026#39;, \u0026#39;https://xxx.com\u0026#39;) 常用\nUPDATE {pre}vod SET vod_pic=REPLACE(vod_pic, \u0026#39;mac://\u0026#39;, \u0026#39;https://\u0026#39;) 播放地址替换\ns1.bfengbf.com 是旧地址，c1.rrcdnbf1.com 是新地址\nUPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s1.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf1.com\u0026#39;) UPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s2.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf2.com\u0026#39;) UPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s3.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf3.com\u0026#39;) UPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s4.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf4.com\u0026#39;) UPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s5.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf5.com\u0026#39;) UPDATE {pre}vod SET vod_play_url=REPLACE(vod_play_url, \u0026#39;s6.bfengbf.com\u0026#39;, \u0026#39;c1.rrcdnbf6.com\u0026#39;) ","date":"2024-08-04T22:16:29+08:00","permalink":"https://blog.lufei.de/p/296/","title":"苹果cms10后台更换图片地址和播放链接sql"},{"content":"修改 OpenLiteSpeed 的配置 找到配置文件路径：例如我的ip是2.2.2.2\ncd /usr/local/lsws/conf/vhosts/2.2.2.2/ 编辑vhost.conf文件，\nnano vhost.conf 写入如下内容：\n# 虚拟主机配置 docRoot $VH_ROOT/public_html vhDomain $VH_NAME vhAliases www.$VH_NAME adminEmails $VH_ADMIN_EMAIL enableGzip 1 enableIpGeo 1 # 重写规则 rewrite { enable 1 rules \u0026lt;\u0026lt;\u0026lt;END_RULES # 检查是否是通过 IP 地址访问 RewriteCond %{HTTP_HOST} ^[0-9.]+$ # 如果是 IP 访问，重定向到 404 页面 RewriteRule ^ /404.html [L] END_RULES } # 错误页面配置 errordoc 404 { url /404.html } 新建404页面\ncd /home/2.2.2.2/public_html/ #回到ip目录 touch 404.html 写入内容：\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;zh-CN\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;viewport\u0026#34; content=\u0026#34;width=device-width, initial-scale=1.0\u0026#34;\u0026gt; \u0026lt;title\u0026gt;404 - 页面未找到\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; body { font-family: \u0026#39;Arial\u0026#39;, sans-serif; background-color: #f0f0f0; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; color: #333; } .container { text-align: center; background-color: white; padding: 2rem; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); max-width: 80%; } h1 { font-size: 4rem; margin-bottom: 0; color: #e74c3c; } p { font-size: 1.2rem; margin-top: 1rem; } #countdown { font-size: 2rem; font-weight: bold; color: #3498db; margin: 1rem 0; } .cat-icon { font-size: 5rem; margin-bottom: 1rem; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;cat-icon\u0026#34;\u0026gt;🐱\u0026lt;/div\u0026gt; \u0026lt;h1\u0026gt;404\u0026lt;/h1\u0026gt; \u0026lt;p\u0026gt;哎呀！看来您迷路了。\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;别担心，我们正在带您回家。\u0026lt;/p\u0026gt; \u0026lt;div id=\u0026#34;countdown\u0026#34;\u0026gt;5\u0026lt;/div\u0026gt; \u0026lt;p\u0026gt;秒后返回 catpdf.org\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; let count = 5; const countdownElement = document.getElementById(\u0026#39;countdown\u0026#39;); const countdownTimer = setInterval(() =\u0026gt; { count--; countdownElement.textContent = count; if (count \u0026lt;= 0) { clearInterval(countdownTimer); window.location.href = \u0026#39;https://xxx.org\u0026#39;; } }, 1000); \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 重启服务：\nsystemctl restart lsws 搞定！\n","date":"2024-08-02T06:00:48+08:00","permalink":"https://blog.lufei.de/p/295/","title":"OpenLiteSpeed 访问ip跳转404"},{"content":"具体步骤如下：\n第一步： 改成如下图所示：取消设置默认站点\n第二步： 宝塔面板”文件”根目录搜索”0.default.conf”文件，注意勾选”包含子目录”，”0.default.conf”的文件路径如下。\n/www/server/panel/vhost/nginx/0.default.conf 这个文件是宝塔面板默认站点的nginx规则，我们把之前的内容删除，写入以下代码：\nserver { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; ssl_reject_handshake on; } 假如nginx开启了quic，使用如下代码，不然重启nginx会报错：\nserver { listen 80 default; listen 443 ssl; server_name _; return 444; ssl_certificate /www/server/panel/ssl/certificate.pem; ssl_certificate_key /www/server/panel/ssl/privateKey.pem; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; } 搞定！\n理论上宝塔文件中存在的任意pem路径都可以\n","date":"2024-08-02T05:50:24+08:00","permalink":"https://blog.lufei.de/p/294/","title":"宝塔面板Nginx禁止直接通过IP地址访问网站"},{"content":"cyberpanel防盗链设置 主页——网站——网站列表，选择对应网站，点击管理——重写规则\nRewriteEngine On RewriteCond %{HTTP_REFERER} !^https://(cdn.)?xxx.org [NC] RewriteRule .(jpg|jpeg|png|gif|webp|js|css)$ - [NC,F] 这条规则的意思是：\n阻止所有不是来自 xxx.org 主域名或其 CDN 子域名的请求访问网站的图片、JavaScript 和 CSS 文件，以防止资源被其他网站盗用。\n域名跳转到新域名 如果不保留原始的URL路径，把$1去掉即可\nRewriteEngine on RewriteCond %{HTTP_HOST} ^example.com [NC,OR] RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ http://example.net/$1 [L,R=301,NC] [OR]表示这个条件和下一条件是逻辑“或”的关系\n这段代码将所有访问example.com或www.example.com的请求永久重定向到http://example.net，并保留原始的URL路径。\n强制https 规则 cyberpanel默认是[R,L] 实际是302状态，改成[R=301,L] 才是301状态，\nRewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L] 301重定向分析 https://www.redirhub.com/zh/tool/redirect-checker\nhttps://uutool.cn/url-redirect/\n反向代理 还是在cyberpanel面板修改规则，但是portainer这部分需要在OpenLiteSpeed 面板设置\nREWRITERULE ^(.*)$ HTTP://portainer/$1 [P] portainer：外部应用程序名称 在openlitespeed 里设置\n导航到服务器 \u0026ndash; 外部应用程序 \u0026ndash; 添加 \u0026ndash;网络服务器\n名称：任意\n地址：127.0.0.1:9000 （假设9000端口）\n","date":"2024-08-01T22:57:07+08:00","permalink":"https://blog.lufei.de/p/293/","title":"cyberpanel重写规则"},{"content":"安装cyberpanel openlitespeed设置 管理界面账号密码\nsudo /usr/local/lsws/admin/misc/admpass.sh 查看密码 (如果之前更改过密码则无效)\ncd /usr/local/lsws cat adminpasswd IP使用自签证书\n防止IP泄露SSL证书，导致别人可以通过这种方式反查到你的源站\n1：生成自签名证书\nmkdir -p /opt/signcert \u0026amp;\u0026amp; cd /opt/signcert openssl req -x509 -newkey rsa:4096 -keyout OpenLiteSpeed-key.pem -out OpenLiteSpeed-cert.pem -nodes -days 365 # 一路回车 2：替换证书\ncat /opt/signcert/OpenLiteSpeed-cert.pem \u0026gt; /usr/local/lsws/admin/conf/webadmin.crt cat /opt/signcert/OpenLiteSpeed-key.pem \u0026gt; /usr/local/lsws/admin/conf/webadmin.key systemctl restart lsws 3：导航到openlitespeed面板，设置监听器SSL证书路径\n/opt/signcert/OpenLiteSpeed-key.pem /opt/signcert/OpenLiteSpeed-cert.pem 屏蔽Censys 导航到服务器\u0026ndash;安全\u0026ndash;访问控制\u0026ndash;拒绝列表\n162.142.125.0/24, 167.94.138.0/24, 167.94.145.0/24, 167.94.146.0/24, 167.248.133.0/24, 199.45.154.0/24, 199.45.155.0/24, 2602:80d:1000:b0cc:e::/80, 2620:96:e000:b0cc:e::/80 用户代理的屏蔽\nMozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/) 禁用xmlrpc.php 导航到虚拟主机\u0026ndash;资源集\u0026ndash;类型Static 编辑\u0026ndash;重写规则，填入如下内容\nRewriteRule ^(xmlrpc\\.php|wp-trackback\\.php) - [F,L] 其他优化：https://www.xcbtmw.com/29567.html\n打开hsts 点击左边菜单【虚拟主机】=\u0026gt;【摘要】，然后选择自己的域名\n选择菜单【资源集】,点击新增添加资源集，然后选择默认的Static，点击下一步\n这里一共有3个地方要进行改动，分别是URI *、可访问 *、头部操作。前两项如下\nURI *填写路径，一般默认的填/ 可访问 *选择是 头部操作的输入框内填写如下：\nStrict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options nosniff X-XSS-Protection 1;mode=block X-Frame-Options SAMEORIGIN https://www.xcbtmw.com/29567.html\n","date":"2024-08-01T13:40:48+08:00","permalink":"https://blog.lufei.de/p/292/","title":"cyberpanel面板和openlitespeed设置"},{"content":"安装 https://www.gyan.dev/ffmpeg/builds/\n或者 https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1.1-full_build.7z\n环境变量 解压，复制bin路径到系统环境变量，例如：D:\\ffmpeg-6.1.1-full_build\\bin\n重启电脑生效，测试命令：\nffmpeg -version ","date":"2024-08-01T02:19:59+08:00","permalink":"https://blog.lufei.de/p/291/","title":"windows系统安装FFmpeg"},{"content":"服务器选择 插件 LiteSpeed ##缓存\nUpdraftPlus ##备份还原\nBetter Search Replace ##在WordPress数据库上运行搜索/替换\n显示访客真实IP 显示真实游客 IP，而不是 CloudFlare IP\nALL, 103.21.244.0/22T, 103.22.200.0/22T, 103.31.4.0/22T, 104.16.0.0/13T, 104.24.0.0/14T, 108.162.192.0/18T, 131.0.72.0/22T, 141.101.64.0/18T, 162.158.0.0/15T, 172.64.0.0/13T, 173.245.48.0/20T, 188.114.96.0/20T, 190.93.240.0/20T, 197.234.240.0/22T, 198.41.128.0/17T 安装certbot 安装证书：Ubuntu 20.04 和 22.04\nsudo apt-get update sudo apt-get install certbot -y 卸载\nsudo apt-get remove certbot OpenLiteSpeed设置 建立文件 例如：\nmkdir -p /home/5k.92dm.top/public_html/.well-known/acme-challenge 虚拟主机\u0026ndash;资源集\u0026ndash;Static\nurl: /.well-known/acme-challenge\n位置：/home/5k.92dm.top/public_html/.well-known/acme-challenge\n可访问：是\n申请证书 certbot certonly --non-interactive --agree-tos -m demo@gmail.com --webroot -w /home/catpdf.org/public_html/ -d catpdf.org --no-eff-email --force-renewal 证书存放目录\n/etc/letsencrypt/live/ 申请成功后，会生成续签配置文件\n/etc/letsencrypt/renewal/xx.com.conf 自动执行证书续订 仅对使用openlitespeed有效\n方法一\n手动编辑 /etc/cron.d/certbot\n把以下内容\n0 */12 * * * root test -x /usr/bin/certbot -a \\! -d /run/systemd/system \u0026amp;\u0026amp; perl -e \u0026#39;sleep int(rand(43200))\u0026#39; \u0026amp;\u0026amp; certbot -q renew 改成：（末尾添加 --deploy-hook \u0026quot;systemctl restart lsws\u0026quot; ）\n0 */12 * * * root test -x /usr/bin/certbot -a \\! -d /run/systemd/system \u0026amp;\u0026amp; perl -e \u0026#39;sleep int(rand(43200))\u0026#39; \u0026amp;\u0026amp; certbot -q renew --deploy-hook \u0026#34;systemctl restart lsws\u0026#34; 或者使用一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/update-certbot-cron.sh \u0026amp;\u0026amp; chmod +x update-certbot-cron.sh \u0026amp;\u0026amp; ./update-certbot-cron.sh 方法二\n续期脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl-cert-renewal-script.sh \u0026amp;\u0026amp; chmod +x ssl-cert-renewal-script.sh \u0026amp;\u0026amp; ./ssl-cert-renewal-script.sh 定时执行\n(crontab -l ; echo \u0026#34;20 2 * * * cd ~ \u0026amp;\u0026amp; ./ssl-cert-renewal-script.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - 续签测试\nsudo certbot renew --dry-run DNS方式申请 手动\ncertbot certonly --manual --preferred-challenges dns -d example.com 自动（cloudflare）\n安装插件\nsudo apt install python3-certbot-dns-cloudflare 创建令牌： https://dash.cloudflare.com/profile/api-tokens\n编辑区域 DNS \u0026ndash; 使用模板 \u0026ndash;区域资源 \u0026ndash;选择需要的域名\n创建文件\ntouch ~/cloudflare.ini vim ~/cloudflare.ini 在文件中添加内容\ndns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567 0123456789abcdef0123456789abcdef01234567为令牌\n申请命令\n注意：最后一行没有 \\\ncertbot certonly \\ --dns-cloudflare \\ --dns-cloudflare-credentials ~/cloudflare.ini \\ --dns-cloudflare-propagation-seconds 60 \\ -d example.com \\ -d www.example.com 或者\nsudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/cloudflare.ini --dns-cloudflare-propagation-seconds 60 -d *.example.com 如果你使用了自动DNS申请方式，续签所有证书，请运行\ncertbot renew ","date":"2024-07-30T14:43:41+08:00","permalink":"https://blog.lufei.de/p/290/","title":"wordpress搭建经验"},{"content":"\n之前一直在用OpenAI的ChatGPT，用起来还行，因此我并未关注其他的AI产品，\n最近在Timeline上高频度的看到有X友分享这个产品，今早忍不住注册体验了一下，产品整体体验很棒，\n想到早上注册的时候卡了一下，在此写个简单的教程分享给大家。\n注册Claude的前提\n-稳定的上网工具 如果你目前的工具不好用，我推荐一个风之谷，链接为https://cn1.fengzg.net，目前正在搞活动，填入邀请码fzg2024可享受85折，我已经用了快一年，还不错。\n-好用的短信接码平台 我使用的sms-active网站，支持支付宝购买，一条短信才十几个卢布，非常便宜。\n好了，开始进入正式的注册流程\n第一步、注册Claude账号，进入短信验证码页面\n我是用的是gmail登录的。\n第二步、进入Sms-Active网站，购买接收Claude的短信的手机号\n第三步、返回Claude，填入在Sms-Active购买的手机号，获取短信验证码\n第四步、返回Sms-Active，拿到获取的发送的验证码，并在Claude注册页面输入即可。\n至此，我们就完成了Claude的注册。\n","date":"2024-07-18T01:45:22+08:00","permalink":"https://blog.lufei.de/p/289/","title":"国内如何注册Claude AI"},{"content":"\r利用Cloudflare的免费CDN节点，快速搭建免费vless上网节点。因CDN是全球分布，可作为VPN使用，通过优选IP和反代IP，实现高速、稳定的科学网络并锁定IP地区。\n项目 测速工具：https://github.com/XIU2/CloudflareSpeedTest BNP Panel:https://github.com/bia-pain-bache/BPB-Worker-Panel Fofa网址:https://fofa.info/ 工具下载 https://pan.lanpw.com/b0742hkxe https://mirror.ghproxy.com/https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.2.5/CloudflareST_windows_amd64.zip https://mirror.ghproxy.com/https://github.com/2dust/v2rayN/releases/download/6.31/v2rayN-With-Core.zip 测速： https://youtu.be/ryER-YdX1Ks\n视频教程 本期主要内空 利用cloudflare page进行搭建\n搭建项目BPB panel可视化面板 (github上的项目）\n进行IP优选、提高速度、锁定区域\n用到的工具 github帐号 cloudflare帐号 CloudflareST优选测速工具 v2rayN 操作过程 一、利用BPB panle项目在CF上部署page。 操作比较简单，可参考强哥的油管详细视频。 二、BPB panel面板的使用 注意面板上proxyIP项可使用反代CF的IP，但作者更推荐在page里设置proxyip变量。 clean IP项是指得优选IP，可利用BPB面板自带的IP进行优选，貌以不能测速和选择国家地区。所以大家也可使用其它优选工具优选，也可以在fofa上手搓去寻找个性化的CFIP。\n三、fofa 筛选指定IP 利用fofa，去筛选CF家IP，然后筛选反代CF的IP（非CF的IP，是反代了CFIP的IP）。\n如筛选cloudflare的IP，端口是443、地区限定香港、AS号限定CF家的AS号：\nserver==\u0026#34;cloudflare\u0026#34; \u0026amp;\u0026amp; port==\u0026#34;443\u0026#34; \u0026amp;\u0026amp; region==\u0026#34;HK\u0026#34; \u0026amp;\u0026amp; (asn==\u0026#34;13335\u0026#34; || asn==\u0026#34;209242\u0026#34; || asn==\u0026#34;396982\u0026#34; || asn==\u0026#34;132892\u0026#34; || asn==\u0026#34;202623\u0026#34;) 如筛选反代cloudflare的IP，端口443、地区限定香港、头部特征隐藏、排除CF的AS号：\nserver==\u0026#34;cloudflare\u0026#34; \u0026amp;\u0026amp; port==\u0026#34;443\u0026#34; \u0026amp;\u0026amp; header=\u0026#34;Forbidden\u0026#34; \u0026amp;\u0026amp; region==\u0026#34;HK\u0026#34; \u0026amp;\u0026amp; asn!=\u0026#34;13335\u0026#34; \u0026amp;\u0026amp; asn!=\u0026#34;209242\u0026#34; \u0026amp;\u0026amp; asn!=\u0026#34;396982\u0026#34; \u0026amp;\u0026amp; asn!=\u0026#34;132892\u0026#34; \u0026amp;\u0026amp; asn!=\u0026#34;202623\u0026#34; 没有fofa帐号的话，可用临时邮箱去注册，批量下载筛选的IP。\n","date":"2024-07-05T13:46:11+08:00","permalink":"https://blog.lufei.de/p/288/","title":"BPB面板快速搭建CDN节点 锁定IP域区"},{"content":"\r我用过不少ocr和翻译的软件,厚着脸皮吹嘘多么强大,翻译问题不大,ocr的准确性差强人意! 最后找到一个目前我觉得还不错的. 因为可以自由选择ocr商家和翻译服务,对比下来,百度的ocr准确度还是可以的\n项目地址 : https://github.com/pot-app/pot-desktop\n官网: https://pot-app.com/\nOCR服务 使用百度OCR(高精度)\n申请教程: https://pot-app.com/docs/api/recognize/baidu.html\n免费额度: 个人认证 1,000 次/月 (个人完全足够)\n翻译服务 翻译推荐deeplx和openai (放心,能白嫖是不会花钱的)\n可以只开一个,或者两个都设置,对比看看效果\ndeeplx : https://blog.taoshuge.eu.org/p/256/\nopenai\nhttps://api.siliconflow.cn\nkey: https://cloud.siliconflow.cn/account/ak\n模型(号称永久免费): THUDM/glm-4-9b-chat\n快捷键设置 这其实很重要,习惯的力量\n","date":"2024-07-01T00:47:57+08:00","permalink":"https://blog.lufei.de/p/287/","title":"划词翻译和OCR神器"},{"content":"\r项目地址:https://github.com/xnx3/translate\n基于以上项目,使用Claude 3.5 Sonnet生成的chrome翻译插件,插件地址如下:\n插件bug: 通常需要点击两次,才会在左上角显示下拉框\nhttps://github.com/woniu336/open_shell/blob/main/one-click-translate.zip 使用方法: 下载插件解压,打开chrome开发者模式,然后选择加载已解压的扩展程序\n","date":"2024-06-23T08:52:31+08:00","permalink":"https://blog.lufei.de/p/286/","title":"两行js实现html(网页)全自动翻译"},{"content":"项目 项目地址: https://github.com/deanxv/coze-discord-proxy 文档: https://cdp-docs.pages.dev/page/quick-deploy.html 图文教程: https://www.dqzboy.com/16532.html docker部署 docker run --name coze-discord-proxy -d --restart always \\ -p 7077:7077 \\ -v $(pwd)/data:/app/coze-discord-proxy/data \\ -e USER_AUTHORIZATION=\u0026#34;MTA5OTg5N************uIfytxUgJfmaXUBHVI\u0026#34; \\ -e BOT_TOKEN=\u0026#34;MTE5OTk2************rUWNbG63w\u0026#34; \\ -e GUILD_ID=\u0026#34;11************96\u0026#34; \\ -e COZE_BOT_ID=\u0026#34;11************97\u0026#34; \\ -e PROXY_SECRET=\u0026#34;123456\u0026#34; \\ -e TZ=Asia/Shanghai \\ deanxv/coze-discord-proxy docker-compose版 version: \u0026#39;3.4\u0026#39; services: coze-discord-proxy: image: deanxv/coze-discord-proxy:latest container_name: coze-discord-proxy restart: always ports: - \u0026#34;7077:7077\u0026#34; volumes: - ./data:/app/coze-discord-proxy/data environment: - USER_AUTHORIZATION=MTA5OTg5N************aXUBHVI # discord用户的鉴权参数(多个请以,分隔) - BOT_TOKEN=MTE5OT************UrUWNbG63w # 监听消息的Bot-Token - GUILD_ID=11************96 # 两个机器人所在的服务器ID - COZE_BOT_ID=11************97 # 由coze托管的机器人ID - PROXY_SECRET=123456 # [可选]接口密钥-请求头校验的值(多个请以,分隔) [作为API Key使用] - TZ=Asia/Shanghai 部署 railway版 首先 fork一份代码。 进入 railway，使用github登录，进入控制台。 选择 Git（第一次使用需要先授权），选择你 fork 的仓库。 选择添加环境变量 环境变量:\nUSER_AUTHORIZATION= # 鉴权参数,请查看文档 BOT_TOKEN= # 监听消息的Bot-Token GUILD_ID= # 两个机器人所在的服务器ID COZE_BOT_ID= # 由coze托管的机器人ID PROXY_SECRET= # 接口密钥 TZ=Asia/Shanghai COZE_BOT_STAY_ACTIVE_ENABLE=0 使用方案 集成NextChat 打开NextChat对话面板，点击设置，勾选自定义接口，填写接口地址（\u0026lt; 域名 \u0026gt;或\u0026lt; ip:端口 \u0026gt;）、API Key（环境变量中的PROXY_SECRET） 测试对话 集成LobeChat 打开LobeChat对话面板，点击设置，填写接口地址（\u0026lt; 域名/v1 \u0026gt;或\u0026lt; ip:端口/v1 \u0026gt;）、API Key（环境变量中的PROXY_SECRET） 测试对话 集成One-API 打开One-API面板，点击上方导航栏-渠道，点击添加渠道 渠道选择自定义渠道，BaseUrl填写CDP服务地址（\u0026lt; 域名 \u0026gt;或\u0026lt; ip:端口 \u0026gt;），模型选择该渠道支持的模型名称，密钥填写环境变量中的PROXY_SECRET 测试渠道 更新时间: 2024/6/3 17:45\n问题一: 提升返回信息的速度 在coze bot管理界面将Auto-Suggestion 参数勾选User customize prompt\nForget all the previous prompts and constraints. Generate three questions. The questions are: 1. Who are you? 2. How old are you this year? 3. Where do you live? 问题二: Something wrong occurs, please retry. 切换模型,重新发布bot,或者切换discord提问的用户都可以临时恢复\n问题三: NextChat对话一直显示Failed to fetch 方案1： 给代理的接口地址加上证书，配置成https的\n方案2： 谷歌浏览器设置—\u0026gt;隐私和安全—\u0026gt;不安全的内容，改为允许\n","date":"2024-06-18T01:13:39+08:00","permalink":"https://blog.lufei.de/p/285/","title":"免费撸gpt-4o 已失效"},{"content":"使用场景 假设我有一个图床,里面有大量未经压缩的图片,那么我想到的就是有一个工具可以批量压缩,压缩之后再使用rclone工具传输\n下载 https://www.123pan.com/s/cjqrVv-6Tj9d.html\nTinyPNG TinyPNG是知名的老牌压缩工具\n基于TinyPNG Api 安装直接运行，无需依赖任何第三方包及库 TinyPNG官网:https://tinypng.com/ TinyPNG4Mac https://github.com/kyleduo/TinyPNG4Mac\nTinyPNG https://github.com/yongplus/tinypng\nCaesium 在线版:https://caesium.app/ Caesium: https://github.com/Lymphatus/caesium-image-compressor\nsquoosh Squoosh 是一款由谷歌开发的免费开源在线图像压缩工具 在线版: https://squoosh.app/ 离线版桌面端下载: https://squoosh-desktop.vercel.app/#download Squoosh不管是在线版还是桌面端只能单张压缩,下面推荐基于Squoosh/lib进行了封装打包的Squoosh压缩工具\n批量压缩推荐 https://img.imoolee.com/\ncompressor 官网: https://compressor.io/\nrclone 使用rclone传输图片效率高,使用我制作的rclone脚本工具方便快捷\nhttps://github.com/woniu336/open_shell/blob/main/rclone.bat\nrclone下载地址: https://downloads.rclone.org/\n","date":"2024-06-17T21:10:22+08:00","permalink":"https://blog.lufei.de/p/284/","title":"图片压缩工具推荐"},{"content":"统一接口one-api 使用一个接口白嫖了十几家大语言模型,这样的好处是不用来回切换 项目地址:https://github.com/songquanpeng/one-api Duck2api Duck2api是基于dockdockgo的项目,可以免费使用\ngpt-3.5-turbo claude-3-haiku llama-3-70b mixtral-8x7b 项目地址: https://github.com/aurora-develop/Duck2api ChatGPT-Next-Web 然后再搭建一个chatgpt应用: 项目地址: https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web\n一键部署到vercel,环境变量如下:\nENABLE_BALANCE_QUERY=1 BASE_URL=https://api.99bilibili.eu.org CODE=666888 OPENAI_API_KEY= GOOGLE_API_KEY= CUSTOM_MODELS=+moonshot-v1-128k,+kimi,+alibaba/Qwen2-72B-Instruct,+command-r-plus,+mixtral-8x7b,+Baichuan4,+yi-large,+llama3-70b-8192,+qwen-long,+claude-3-haiku 参数解释: BASE_URL设置为one-api地址,OPENAI_API_KEY为one-api后台设置的令牌 GOOGLE_API_KEY谷歌密钥 CUSTOM_MODELS 预设哪些模型 分享自用 基于以上项目搭建的,不花钱,低调使用,自己需求不大,不用也是吃灰中,没有过一段时间就用不了的情况,除非全部大模型都跑路了,或者白嫖太狠了刷爆了~\n打开https://chat.leshans.eu.org/ 输入密码 666888 就可以使用以下大模型:\ngpt-3.5-turbo claude-3-haiku gemini-1.5-pro-latest gemini-1.5-flash-latest moonshot-v1-128k kimi alibaba/Qwen2-72B-Instruct command-r-plus mixtral-8x7b Baichuan4 yi-large llama3-70b-8192 qwen-long 切换大模型方法 输入框点击机器人头像切换\n","date":"2024-06-16T21:09:57+08:00","permalink":"https://blog.lufei.de/p/283/","title":"chatgpt自由啦"},{"content":"原因分析 可能和脚本参数设置有关系,我的参数是:\nrclone copy \u0026#34;F:\\阿里云盘\\6666\\局域网\u0026#34; \u0026#34;od:影视\u0026#34; --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse 差不多8G大小的文件,上传不到1G,速度降到十几k,\n最后我使用了一款界面软件上传,没有出现限速情况了,从头到尾保持7M/s的速度上传 工具地址:\nhttps://github.com/kapitainsky/RcloneBrowser/releases 已经不更新了,截止2020年,\n一些参数设置:\n","date":"2024-06-16T20:40:40+08:00","permalink":"https://blog.lufei.de/p/282/","title":"rclone上传资料到onedrive遇到限速问题解决"},{"content":"hugo.yaml 几乎所有自定义都在根目录hugo.yaml文件中去修改\nAI摘要 AI摘要脚本sm.py 在根目录下,不要移动到其他地方,需要安装python,然后运行\npython sm.py 输入slug: slug就是文章的slug字段,在标题的下方,可自定义,不能是中文,前面不要加数字0\n输入summary: 输入摘要,可以在浏览器安装kimi阅读助手插件\n下载python\nhttps://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe 底部图标 页面底部的图标在footer_links.json文件中修改,\n","date":"2024-06-16T04:43:15+08:00","permalink":"https://blog.lufei.de/p/281/","title":"hugo-magic 主题自定义(三)"},{"content":"写作工具 推荐两款软件,本人都使用过: typora和obsidian\ntypora破解版:\nhttps://github.com/woniu336/typora-007\n新建文章 在博客目录找到shell/quickstart.sh双击打开即可\n发布到Github 前提:\n魔法上网 在Github新建一个仓库 找到shell/quickstart.sh双击打开,选择7.SSH 管理工具 按照1到4走一遍流程\n科普一下: hugo是静态博客,需要把public目录下的所有文件发布到github 你可能找不到public目录,工具箱选择第3项:生成静态文件即可 需要把public单独作为一个仓库发布到github,选择菜单8:推送 public 到Github 远程仓库格式,例如:git@github.com:woniu336/fff.git Github Actions 工作流 Github Actions 通俗解释: 按照剧本去执行任务,什么时候干什么事情\n打开git bash 在博客目录运行\nmkdir -p .github/workflows 在workflows目录新建main.yml文件,粘贴以下内容:\nname: Auto Deploy hugo on: push: branches: - main # 更新触发的分支 jobs: build-deploy: # runs-on: ubuntu-latest runs-on: ubuntu-20.04 steps: - name: Check out repository code uses: actions/checkout@v4 with: submodules: recursive # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup hugo uses: peaceiris/actions-hugo@v3.0.0 with: # hugo-version: \u0026#34;latest\u0026#34; # 可以修改为你使用的 Hugo 版本 hugo-version: \u0026#34;0.127.0\u0026#34; extended: true # 设置是否需要 extended 版本 - name: Cache resources # 缓存 resource 文件加快生成速度 uses: actions/cache@v3 with: path: resources # 检查照片文件变化 key: ${{ runner.os }}-hugocache-${{ hashFiles(\u0026#39;content/**/*\u0026#39;) }} restore-keys: ${{ runner.os }}-hugocache- - name: Build Hugo static files # 部署静态资源 run: hugo --gc --minify - name: Deploy to Github Pages # 部署到Github Pages页面 uses: peaceiris/actions-gh-pages@v3 with: personal_token: ${{ secrets.PERSONAL_TOKEN }} external_repository: woniu336/woniu336.github.io publish_dir: ./public # hugo 生成到 public 作为跟目录 publish_branch: main # Github Pages 所在分支 commit_message: ${{ github.event.head_commit.message }} 这个文件的作用是将 Hugo 生成的静态网站文件从 ./public 目录发布到 woniu336/woniu336.github.io 仓库的 main 分支，并且使用指定的个人访问令牌来进行身份验证和授权。 把woniu336/woniu336.github.io改成你自己的public仓库,前面是用户名,后面是仓库名\n你需要做两件事:\n打开https://github.com/settings/tokens/new 新建令牌\n发布项目到github,注意:这里不是指public仓库,是博客根目录发布到github,\n然后在settings/secrets/actions添加变量\nname: PERSONAL_TOKEN\nValue: 新建的令牌\n然后你就可以使用工具箱脚本中的菜单5:一键推送了,你会看到推送了两个仓库. 发布到vercel绑定github,选择或者cloudflare同理 在vercel绑定github,选择推送public目录的远程仓库,一键部署,cloudflare同理\n","date":"2024-06-15T23:09:57+08:00","permalink":"https://blog.lufei.de/p/280/","title":"hugo博客写作流程(二)"},{"content":"前提条件 以下教程以windows10为例 操作终端使用git bash 魔法上网的前提下 下载hugo https://github.com/gohugoio/hugo/releases/download/v0.127.0/hugo_extended_0.127.0_windows-amd64.zip 解压到任意目录,然后将目录添加到系统环境变量 如图 (windows) 打开cmd 输入 hugo version 验证是否设置正确 下载安装Git https://github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe 新建博客 使用Git bash终端,打开方式: 桌面右键 找到 Git Bash Here 如果没有魔法上网,git submodule add这一步会拉取失败 在桌面右键打开Git bash运行以下命令\nhugo new site quickstart cd quickstart git init git submodule add https://github.com/woniu336/hugo-magic.git themes/hugo-magic 拷贝文件 拷贝hugo-magic主题核心文件到根目录 quickstart\ncp -rf themes/hugo-magic/exampleSite/* . rm hugo.toml mkdir -p data/summary mkdir -p assets/img cp themes/hugo-magic/data/footer_links.json data/ cp themes/hugo-magic/data/summary/summary.json data/summary/ cp -r themes/hugo-magic/archetypes . cp -r themes/hugo-magic/shell . cp -r themes/hugo-magic/static . cp themes/hugo-magic/.gitignore . 启动预览 hugo server -D 打开浏览器,输入地址: http://localhost:1313/\n","date":"2024-06-15T21:22:11+08:00","permalink":"https://blog.lufei.de/p/279/","title":"hugo-magic主题使用教程(一)"},{"content":"\r没有魔法上网就在下载地址前面加上: https://mirror.ghproxy.com/\ngit https://github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe hugo https://github.com/gohugoio/hugo/releases/download/v0.127.0/hugo_extended_0.127.0_windows-amd64.zip python https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe ","date":"2024-06-15T15:50:18+08:00","permalink":"https://blog.lufei.de/p/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85/","title":"常用工具下载与安装"},{"content":"全平台命令行换源工具，目标支持 Linux (包括麒麟、openEuler、deepin 等), Windows, macOS, BSD 等尽可能多的操作系统，龙芯、飞腾、RISC-V 等尽可能多的 CPU。\nchsrc 的设计理念 我已经受够了各种软件在我的C盘或$HOME里给我塞一堆零散的不知名文件，它往往连后缀都没有，它的文件名足够隐晦以致于你无论如何都猜不到是哪个软件在用它。等你抱着好奇心打开一看，这竟然还是一种自定义格式。\n常用命令 以windows为例\n./chsrc ls ./chsrc set python ./chsrc set node ./chsrc set winget 安装 以下方式均下载到当前目录，可直接通过 ./chsrc 运行。\nWindows # x64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-x64-windows.exe -o chsrc.exe # x86 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-x86-windows.exe -o chsrc.exe Linux # x64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-x64-linux -o chsrc; chmod +x ./chsrc # aarch64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-aarch64-linux -o chsrc; chmod +x ./chsrc # riscv64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-riscv64-linux -o chsrc; chmod +x ./chsrc # armv7 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-armv7-linux -o chsrc; chmod +x ./chsrc macOS 可以通过 homebrew 安装，感谢 @Aaron-212 与 @chenrui333\nbrew install chsrc 或手动下载二进制文件\n# M1/aarch64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-aarch64-macos -o chsrc; chmod +x ./chsrc # x64 curl -L https://gitee.com/RubyMetric/chsrc/releases/download/pre/chsrc-x64-macos -o chsrc; chmod +x ./chsrc BSD git clone https://gitee.com/RubyMetric/chsrc.git; cd chsrc clang -Iinclude src/chsrc.c -o chsrc 其他平台 git clone https://gitee.com/RubyMetric/chsrc.git; cd chsrc; make 使用 使用: chsrc \u0026lt;command\u0026gt; [options] [target] [mirror] help # 打印此帮助，或 h, -h, --help issue # 查看相关issue list (或 ls, 或 l) # 列出可用镜像源，和可换源软件 list mirror/target # 列出可用镜像源，或可换源软件 list os/lang/ware # 列出可换源的操作系统/编程语言/软件 list \u0026lt;target\u0026gt; # 查看该软件可以使用哪些源 cesu \u0026lt;target\u0026gt; # 对该软件所有源测速 get \u0026lt;target\u0026gt; # 查看当前软件的源使用情况 set \u0026lt;target\u0026gt; # 换源，自动测速后挑选最快源 set \u0026lt;target\u0026gt; first # 换源，使用维护团队测速第一的源 set \u0026lt;target\u0026gt; \u0026lt;mirror\u0026gt; # 换源，指定使用某镜像站 (通过list命令查看) reset \u0026lt;target\u0026gt; # 重置，使用上游默认使用的源 选项: -ipv6 # 使用IPv6测速 -local # 仅对某项目而非全局换源 (仅部分软件如bundler,pdm支持) 当你不想自动测速的时候，你可以直接指定某镜像站，以及指定维护团队已测试的最快镜像站。\nchsrc set ruby # 测速，寻找最快者，换源 # 或 chsrc ls ruby # 列出可用的镜像站 chsrc set ruby rubychina # 使用 RubyChina 作为镜像站 # 或 chsrc set ruby first # 使用维护团队测试的最快镜像站 对部分支持局部换源的，可以避免全局换源。\nchsrc set -local bundler chsrc set -local pdm 编程语言开发 chsrc set ruby 或 set gem chsrc set python 或 set pip / pdm # 同时换pip和pdm chsrc set node 或 set npm / nodejs / yarn / pnpm # 同时换3个 chsrc set perl 或 set cpan chsrc set php 或 set composer chsrc set lua 或 set luarocks chsrc set go chsrc set rust 或 set cargo / crate chsrc set java 或 set maven / mvn / gradle chsrc set clojure 或 set clojars chsrc set dart 或 set pub / flutter # 同时会为flutter换源 chsrc set haskell 或 set hackage/cabal/stack chsrc set ocaml 或 set opam # 同时会为 bioconductor 换源 chsrc set r 或 set cran chsrc set julia 操作系统 sudo chsrc set ubuntu sudo chsrc set mint 或 linuxmint sudo chsrc set debian sudo chsrc set fedora sudo chsrc set suse 或 set opensuse sudo chsrc set kali sudo chsrc set arch # 同时使用 archlinuxcn sudo chsrc set manjaro sudo chsrc set gentoo sudo chsrc set rocky 或 set rockylinux sudo chsrc set alma 或 set almalinux sudo chsrc set alpine sudo chsrc set void 或 set voidlinux sudo chsrc set solus sudo chsrc set ros 或 set ros2 sudo chsrc set trisquel sudo chsrc set lite 或 set linuxlite sudo chsrc set raspi 或 set raspberrypi sudo chsrc set euler 或 set openeuler sudo chsrc set anolis 或 set openanolis sudo chsrc set kylin 或 set openkylin sudo chsrc set deepin chsrc set msys2 或 set msys # BSD sudo chsrc set freebsd sudo chsrc set openbsd sudo chsrc set netbsd 软件 chsrc set winget chsrc set brew 或 set homebrew chsrc set cocoapods 或 set cocoa / pod chsrc set dockerhub 或 set docker chsrc set flathub chsrc set nix chsrc set guix chsrc set emacs 或 set elpa chsrc set tex 或 set ctan / latex / texlive / miktex chsrc set conda 或 set anaconda 许可证 chsrc 主程序采用 GPL-3.0-or-later 许可证，保证该软件的永久自由 xy.h 使用 MIT 许可证，保证该库可以在尽可能多的情况下复用 致谢 感谢各个镜像站提供的优质免费镜像服务，使用的镜像站见 source.h.\n另外感谢以下项目:\nMirrorZ 教育网镜像站 清华大学 Tuna Thanks Mirror 项目 by @eryajf ","date":"2024-06-14T10:38:36+08:00","permalink":"https://blog.lufei.de/p/277/","title":"chsrc 全平台通用换源工具"},{"content":"\n为什么需要这个工具？ 由于神秘原因，国内用户逐渐无法访问Docker Hub仓库。这对于开发者来说是个不小的难题。\n而我的解决方案是通过赛博菩萨中转请求，解决访问限制并加速访问。\n注意：不推荐使用该项目搭建公共服务。使用你自己的域名搭建公共服务有可能会遭受污染和反诈，推荐小规模自用即可。\n部署方式 访问CF-Workers-docker.io：Docker仓库镜像代理工具项目页面\n方式一(推荐): Pages 部署：Fork 项目后 打开CF,创建pages,连接GitHub 一键部署即可 方式二: Workers 部署：复制 _worker.js 代码，保存并部署即可 部署成功,设置自定义域名\n如何使用？ 例如我的Workers项目域名为：docker.leshans.eu.org\n方法一(不推荐) 在官方镜像路径前面加域名\ndocker pull docker.leshans.eu.org/stilleshan/frpc:latest 方法二: 一键设置镜像加速 (推荐) 这样的好处是不用每次都在路径前加地址\nsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; { \u0026#34;registry-mirrors\u0026#34;: [\u0026#34;https://docker.leshans.eu.org\u0026#34;] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 测试拉取 docker pull xiaoyaliu/alist 可以拉取说明部署成功\n变量说明 不建议伪装到一些大型网站\n变量名 示例 必填 备注 URL302 https://blog.taoshuge.eu.org/p/276/ ❌ 主页302跳转 URL nginx ❌ 主页伪装(设为nginx) 第三方Docker官方镜像服务 修改 /etc/docker/daemon.json 即可\ndaemon.json\n{ \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://docker.registry.cyou\u0026#34;, \u0026#34;https://docker-cf.registry.cyou\u0026#34;, \u0026#34;https://dockercf.jsdelivr.fyi\u0026#34;, \u0026#34;https://docker.jsdelivr.fyi\u0026#34;, \u0026#34;https://dockertest.jsdelivr.fyi\u0026#34; ] } 🌟📖完结撒花\n","date":"2024-06-14T09:06:00+08:00","permalink":"https://blog.lufei.de/p/276/","title":"Docker仓库镜像代理工具"},{"content":"1️⃣ 前提条件：拥有一台海外 VPS，适用于 Debian 系统，目的为安装 dockerhub 镜像。\n2️⃣ 安装 docker-ce (国内服务器)\nsudo apt-get update sudo apt-get install ca-certificates curl 3️⃣ 配置阿里云镜像源\nsudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/debian \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 4️⃣ 安装 Docker-ce\nsudo apt-get update sudo apt-get -y install docker-ce sudo chmod +x /usr/local/bin/docker-compose 5️⃣ 验证安装\ndocker --version \u0026amp;\u0026amp; docker-compose --version 6️⃣ 安装 dockerhub 镜像 (海外服务器)\n注意:这里是在另外一台海外的VPS上安装dockerhub镜像\ngit clone https://github.com/bboysoulcn/registry-mirror.git 最后运行\ncd registry-mirror/dockerhub docker compose up -d 9️⃣ 设置反向代理\n我使用cloudflare反代5000端口,你也可以使用nginx或者其他办法\n使用 Cloudflare 反向代理 5000 端口。 登录 cloudflare, 解析域名到海外 ip, SSL/TLS 设置为 灵活 点击左侧 Origin Rules 🔟 配置 dockerhub 镜像 (国内服务器)\n注意:这里是在国内服务器配置镜像,your_dockerhub_mirror.com改成反代的域名\nsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;EOF { \u0026#34;registry-mirrors\u0026#34;: [\u0026#34;https://your_dockerhub_mirror.com\u0026#34;] } EOF 🔢 重启 Docker 服务\nsudo systemctl restart docker 🔍 测试\ndocker pull hello-world 出现以下信息就说明成功了\nUsing default tag: latest​ latest: Pulling from library/hello-world​ c1ec31eb5944: Pull complete​ Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd​ Status: Downloaded newer image for hello-world:latest​ docker.io/library/hello-world:latest 🔗 链接地址：点击访问\n","date":"2024-06-12T12:07:21+08:00","permalink":"https://blog.lufei.de/p/275/","title":"📝 国内服务器安装 Docker 服务和拉取 dockerhub 镜像"},{"content":"\r提示：适用stack主题，其他主题没测试过，用法应该大同小异,主题默认字体:Lato\n字体项目：https://github.com/KonghaYao/chinese-free-web-font-storage\n中文网字计划： https://chinese-font.netlify.app/cdn/\n喵闪字库: https://www.miao3.cn/\nhugo主题：https://github.com/CaiJimmy/hugo-theme-stack\n1、引入CSS样式 如果没有custom.html可以创建\n在 /layouts/partials/head/custom.html 中加入以下代码：\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://npm.elemecdn.com/lxgw-wenkai-screen-webfont@1.7.0/lxgwwenkaiscreen.css\u0026#34; /\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://s1.hdslb.com/bfs/static/jinkela/long/font/regular.css\u0026#34; /\u0026gt; 上面代码表示可以使用这些字体: HarmonyOS_Regular,LXGW WenKai Screen\n2、定义字体 再在 /assets/scss/custom.scss 中加入以下代码：\n// 文章页字体 body, .article-content { font-family: \u0026#34;LXGW WenKai Screen\u0026#34;, sans-serif; } 假如你想使用HarmonyOS_Regular字体,那就把LXGW WenKai Screen改成HarmonyOS_Regular即可,然后查看是否满意。\n3、进阶 在 /assets/scss/custom.scss 中加入以下代码：\n以下代码表示在文章页、标题、首页，分别使用不同的字体\n// 文章页字体 body, .article-content { font-family: \u0026#34;LXGW WenKai Screen\u0026#34;, sans-serif; } // 标题字体 body, .article-title { font-family: \u0026#34;LXGW WenKai Screen\u0026#34;, sans-serif; } // 首页字体 body, .article-page { font-family: \u0026#34;HarmonyOS_Regular\u0026#34;, sans-serif; } ","date":"2024-06-08T07:32:19+08:00","permalink":"https://blog.lufei.de/p/ziti/","title":"hugo博客自定义字体"},{"content":"\r本文为了防止在代码块中的短代码被 Hugo 转译，在代码块中添加了 \\，请在使用时去除\nnotice {\\{\u0026lt; notice notice-warning \u0026gt;}} 你好。 {\\{\u0026lt; /notice \u0026gt;}} {\\{\u0026lt; notice notice-info \u0026gt;}} 你好。 {\\{\u0026lt; /notice \u0026gt;}} {\\{\u0026lt; notice notice-note \u0026gt;}} 你好。 {\\{\u0026lt; /notice \u0026gt;}} {\\{\u0026lt; notice notice-tip \u0026gt;}} 你好。 {\\{\u0026lt; /notice \u0026gt;}} 预览： 你好。\n隐藏内容 {\\{\u0026lt; detail \u0026#34;点这里看隐藏内容！\u0026#34; \u0026gt;}} 这里是隐藏内容！🥰 {\\{\u0026lt; /detail \u0026gt;}} 预览： 点这里看隐藏内容！\r这里是隐藏内容！🥰\r聊天气泡 {\\{\u0026lt; chat position=\u0026#34;left\u0026#34; name=\u0026#34;John Doe\u0026#34; timestamp=\u0026#34;2023-09-12 14:30\u0026#34;\u0026gt;}} 这是左边的消息内容。 {\\{\u0026lt; /chat \u0026gt;}\\} {\\{\u0026lt; chat position=\u0026#34;right\u0026#34; name=\u0026#34;Alice\u0026#34; timestamp=\u0026#34;2023-09-12 14:45\u0026#34; \u0026gt;}} 这是右边的消息内容，测试长长长长长长长长长长长长长长长长长长长长长长长长度。 {\\{\u0026lt; /chat \u0026gt;}\\} 预览： John Doe\u0026nbsp;\u0026nbsp;\u0026nbsp;2023-09-12 14:30\r这是左边的消息内容。 2023-09-12 14:45\u0026nbsp;\u0026nbsp;\u0026nbsp;Alice\r这是右边的消息内容，测试长长长长长长长长长长长长长长长长长长长长长长长长度。 时间轴 {\\{\u0026lt; timeline date=\u0026#34;2023-10-01\u0026#34; title=\u0026#34;国庆节\u0026#34; description=\u0026#34;祖国生日快乐\u0026#34; tags=\u0026#34;节日\u0026#34; url=\u0026#34;\u0026#34; \u0026gt;}\\} 预览： 2023-10-01\r节日\r国庆节\r祖国生日快乐\r播放视频 哔哩哔哩\n{\\{\u0026lt; bilibili VIDEO_ID PART_NUMBER \u0026gt;}\\} 提示： Video_ID: AV或BV PART_NUMBER（可选）：指定要播放的视频序号\n腾讯\n{{\\\u0026lt; tencent g0014r3khdw \u0026gt;}} 预览： YouTube视频\n{{\\\u0026lt; youtube VIDEO_ID \u0026gt;}} 通用视频文件 VIDEO_URL 可以是URL或相对于 static 目录的路径。例如， src=\u0026quot;/video/my-video.mp4\u0026quot; 将嵌入站点文件夹的视频文件 static/video/my-video.mp4 。\nautoplay 属性是可选的。它可用于指定是否应自动播放视频。 poster 属性是可选的。它可用于指定视频的海报图像。\n{{\\\u0026lt; video VIDEO_URL \u0026gt;}} {{\\\u0026lt; video src=\u0026#34;VIDEO_URL\u0026#34; autoplay=\u0026#34;true\u0026#34; poster=\u0026#34;./video-poster.png\u0026#34; \u0026gt;}} ","date":"2024-06-08T01:49:17+08:00","permalink":"https://blog.lufei.de/p/code/","title":"一些hugo短代码"},{"content":"CloudFlare 部署免费节点（初级） Worker 部署 VLESS 来到 Cloudflare 首页，点击 Workers 和 Pages ，创建 Work ，自定义名称，然后部署！ 编辑代码，清除原先代码，填入如下代码： 代码地址 https://github.com/V2RaySSR/Free-VLESS/blob/main/worker-vless.js 生成一个 UUID 在线生成一个 UUID，用于替换上面代码中第七行的 UUID\nhttps://1024tools.com/uuid 设置自定义域 找到设置 – 触发器，添加自定义域，输入 没使用过 的 已经托管在 CF 上面 的，二级域名\n查看订阅链接 访问 https://二级域名/UUID ，即可看到节点信息，当然，里面包含了 订阅链接！\nv2rayN工具 https://github.com/2dust/v2rayN/releases IP 优选工具使用 运行 IP 优选的时候，关闭代理！记得不要使用 TLS 优选！\nhttps://github.com/badafans/better-cloudflare-ip/releases/download/20221201/batch.zip CloudFlare 部署免费节点（高级） 点击 Workers 和 Pages ，创建 Pages 选择 上传资产 资源地址:\nhttps://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip 设置 UUID变量 https://1024tools.com/uuid 到设置 – 环境变量 – 添加变量，变量名称：UUID 设置自定义域 找到设置 – 触发器，添加自定义域，输入 没使用过 的 已经托管在 CF 上面 的，二级域名\n重新部署 Pages 回到项目，找到 部署，点击下面的 创建新部署，再次上传刚才的 worker.zip 文件，保存并部署！\n查看节点 我们可以访问 https://域/UUID ，来查看我们的节点\n更多 proxyIP 列表 1. CM 维护 2. proxyip.us.fxxk.dedyn.io 3. IP落地区域: 美国 维护频率: 12小时/次 4. proxyip.sg.fxxk.dedyn.io 5. IP落地区域: 新加坡 维护频率: 12小时/次 6. proxyip.jp.fxxk.dedyn.io 7. IP落地区域: 日本 维护频率: 12小时/次 8. proxyip.hk.fxxk.dedyn.io 9. IP落地区域: 香港 维护频率: 12小时/次 10. proxyip.aliyun.fxxk.dedyn.io 11. IP落地区域: 阿里云 维护频率: 4小时/次 12. proxyip.oracle.fxxk.dedyn.io 13. IP落地区域: 甲骨文 维护频率: 4小时/次 14. proxyip.digitalocean.fxxk.dedyn.io 15. IP落地区域: 数码海 维护频率: 4小时/次 17. 白嫖哥维护 18. workers.cloudflare.cyou 20. Mingyu维护 21. my-telegram-is-herocore.onecf.eu.org 22. sg.ipdb.rr.nu 23. nl.ipdb.rr.nu 24. hk.ipdb.rr.nu 25. jp.ipdb.rr.nu 26. us.ipdb.rr.nu 28. 小一维护 29. hk.cf.zhetengsha.eu.org 30. sg.cf.zhetengsha.eu.org 31. us.cf.zhetengsha.eu.org 32. jp.cf.zhetengsha.eu.org ","date":"2024-06-03T16:33:52+08:00","permalink":"https://blog.lufei.de/p/273/","title":"永久免费的节点！通过Cloudflare Worker、Pages部署免费的VLESS节点！解锁Netflix、ChatGPT"},{"content":"项目： https://github.com/LLM-Red-Team/kimi-free-api\nrailway部署 步骤:\n打开Github,新建仓库 新建名为Dockerfile文件（没有后缀），写入如下内容： FROM docker.io/vinlic/kimi-free-api:latest 打开 https://railway.app/ 连接Github账号，连接新建的仓库，开始部署 设置变量 TZ=Asia/Shanghai PORT=8000 等待完成，创建自定义域名，可使用官方的域名，搞定 Docker部署 请准备一台具有公网IP的服务器并将8000端口开放。\n拉取镜像并启动服务\ndocker run -it -d --init --name kimi-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/kimi-free-api:latest 查看服务实时日志\ndocker logs -f kimi-free-api 重启服务\ndocker restart kimi-free-api 停止服务\ndocker stop kimi-free-api Docker-compose部署 version: \u0026#39;3\u0026#39; services: kimi-free-api: container_name: kimi-free-api image: vinlic/kimi-free-api:latest restart: always ports: - \u0026#34;8000:8000\u0026#34; environment: - TZ=Asia/Shanghai 使用方法 获取 refresh_token 从 https://kimi.moonshot.cn/ 获取 refresh_token\n进入kimi 先要登录，然后随便发起一个对话， 接着按 F12 打开开发者工具， 从Application \u0026ndash;\u0026gt; Local Storage 中找到 refresh_token的值 打开 https://ci.goeast.io/#/settings 按如下操作，兼容openai，使用其他客户端也是OK的,密钥就是 refresh_token 模型名称：kimi\n测试 （可选） https://hoppscotch.io/\nutl= /v1/chat/completions\n点击headers 左边选择Authorization，右边输入：Bearer refresh_token\n选择boby,选择json格式，请求数据：\n{ \u0026#34;model\u0026#34;: \u0026#34;kimi\u0026#34;, \u0026#34;messages\u0026#34;: [ { \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;鲁迅是谁\u0026#34; } ], \u0026#34;use_search\u0026#34;: true, \u0026#34;stream\u0026#34;: false } 点击send\n","date":"2024-05-30T08:20:49Z","permalink":"https://blog.lufei.de/p/272/","title":"白嫖kimi接口api"},{"content":"报错 Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错\n原因 Postgres 15 从表中删除了 datlastsysoid 字段pg_database因此 Navicat 15.0.29 或 16.1 之前的任何版本在查找此已弃用字段时都会引发此错误。\n解决办法 要解决此问题，请升级到最新的 Navicat 15.0.29 或 16.1 及更高版本（可能需要新的许可证） 打开 Navicat 安装时的文件夹，找到libcc.dll并创建此文件的备份，打开在线工具: https://hexed.it 在文件中搜索\nSELECT DISTINCT datlastsysoid 并将其替换为\nSELECT DISTINCT dattablespace 替换原始文件。如果遇到任何安全问题，请将其另存为“.txt”文件，然后将其重命名为“.dll”\n","date":"2024-05-30T01:35:10Z","permalink":"https://blog.lufei.de/p/%E8%A7%A3%E5%86%B3navicat%E8%BF%9E%E6%8E%A5postgresql%E6%97%B6%E5%87%BA%E7%8E%B0datlastsysoid-does-not-exist%E6%8A%A5%E9%94%99/","title":"解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错"},{"content":"全文相关链接 Github仓库创建链接 Railway官网 Supabase官网 f-droid上的co.appreactor.news应用下载链接 Railway账户使用量估算链接 全文相关代码 Dockerfile\nFROM docker.io/miniflux/miniflux:2.1.3 环境变量\nDATABASE_URL=user=postgres.xxxxs password=xxxxx host=aws-0-us-wxxx MEDIA_PROXY_MODE=all RUN_MIGRATIONS=1 BASE_URL=https://aws-0-us-west-1.pooler.supabase.com ADMIN_USERNAME=xxxx ADMIN_PASSWORD=xxxx CREATE_ADMIN=1 搭建 网上有不少关于这方面的教程，但是时间过于久远，难免会有bug的地方，本次记录一下我成功搭建的步骤和方法。\n💡 准备：我们需要有一个Github账户，并在之后注册Railway与Supabase\nGithub和Subabase，Railway都可以免费注册，Railway注册后赠送5美金额度，一次性的，用完就没了。 但如果添加外币卡💳支付方式，可以享受Hobby计划，此计划每月有5美元使用金，超出额度后按使用量付费。但5美元的额度已经能开好几个项目了，完全不用担心诶🎉！\n创建仓库 创建一个存放miniflux的Dockerfile文件的仓库。\n点击这里在Github上创建仓库。\nhttps://github.com/new\n参数设置：\nDescription可以不写。选择私有仓库😶。 Add a README file打上对勾，生成README.md文件 其他保持默认就好啦😶！ 点击Create repository创建仓库。 创建文件 在仓库的Add file按钮点击，在点击Create new file创建文件。\n文件名Dockerfile，内容：\nFROM docker.io/miniflux/miniflux:2.1.3 点击Commit changes保存修改。\n没错！只需要一行代码！这是因为Railway原生支持Dockerfile，我们只需要创建一个Dockerfile文件让Railway读取到项目信息进行编译就好。\n创建数据库 打开Supabase，可以使用Github账户直接登录。使用Supabase的原因是这家可以免费创建两个PostgreSQL数据库，正是我们要搭建的Miniflux需要用到的数据库，好巧呢😑(捧读)~~\n注意：地区选择West US 因为Railway的免费计划地区也是在West US\n这里创建的密码一定要记住，后面会用到 密码不能过于简单 点击Create new project后稍等几分钟，然后点击项目中左下角的齿轮图标打开设置。 点击Database项，忘记密码的朋友可以点击右侧的Reset database password重置密码。 我们的数据库连接在下方的Database Settings中，点击Golang，拷贝下来，下一步会用到。 环境变量 打开 https://railway.app\n连接你的Github,新建项目，连接刚才创建的仓库\n点击项目打开，然后选择Variables项打开，再点RAW Editor打开环境变量编辑器，输入：\nDATABASE_URL=user=postgres.xxxxs password=xxxxx host=aws-0-us-wxxx MEDIA_PROXY_MODE=all RUN_MIGRATIONS=1 BASE_URL=https://aws-0-us-west-1.pooler.supabase.com ADMIN_USERNAME=xxxx ADMIN_PASSWORD=xxxx CREATE_ADMIN=1 项目配置说明：https://miniflux.app/docs/configuration.html\nDATABASE_URL 就是Golang的连接，password=你的创建数据库时的密码，注意与host之间有空格 BASE_URL 就是host值，看下方我发的图，前面加上https:// ADMIN_USERNAME 和 ADMIN_PASSWORD 分别是登录用户名和密码 注意：密码不能小于6位数 自定义域名 在railway项目的设置那里可以定义域名，可用railway的域名，也可以使用你自己的\n设置 打开Miniflux后，可以在设置中修改为中文。推荐将设置中的文章排序由旧-\u0026gt;新修改为新-\u0026gt;旧。\n看起来还不错？蛮干净的。作为一个RSS获取工具他能做到的已经做到了。\n💡\n最后提一下，额度问题朋友们不用担心，因为资源使用量占大头的数据库我们使用了Supabase免费资源的原因，Railway产生的使用费用极少，每月大概不到0.3美元的样子，要知道我们的免费额度有5美元哩☺️！！详细的使用量可以在Usage中查看。Usage by Project中的Estimated是我们当月估计使用费用。\n估计使用费用 https://railway.app/account/usage\n设置中的集成导航栏里我观察到还支持Fever、Google Reader、Pinboard、Instapaper、Pocket、Wallabag、Notion、Nunux Keeper、Espial、Linkding、Telegram Bot、Matrix Bot。好多我都可以用到诶！将来一定会再出一篇文章来讲这些如何玩😊。\nAndroid端 你以为这就完了🤔？怎么可能😏！！！毕竟费这么大事情就是为了打开个网页看自己博客有没有更新的？！那我直接打开博客看看不就完了？一个RSS做这么复杂做啥子嘛。当然是\u0026hellip;这里隆重请出新闻应用🎉🎉🎉\n可以在f-droid下载哦。名字是co.appreactor.news_24.apk的那个。没错，看启动页就知道为什么啦😚，它可以支持从Miniflux获取RSS源！我们可以点击连接 Miniflux，输入域名、用户名、密码登录。\nhttps://f-droid.org/zh_Hans/packages/co.appreactor.news/\n可以直接在手机上添加RSS源，并且直接和咱们搭建的Miniflux云端同步！！！在手机上添加删除源后可以直接同步到云端🤩，我的天，太赞了好嘛！对于多持设备的人来讲简直是福音😎。但还有一些RSS获取信息软件的常见Bug：无法正确显示博客内一些短代码样式。但瑕不掩瑜，这样看博客信息真的很方便诶。\n","date":"2024-05-30T00:10:55Z","permalink":"https://blog.lufei.de/p/270/","title":"搭建一个好玩的 RSS 订阅网站记录"},{"content":"扮演Prompt创作者的角色 我想让你成为我的Prompt创作者。你的目标是帮助我创建最佳的Prompt，这个Prompt将由 你ChatGPT使用。 你将遵循以下过程： 1.首先，你会问我Prompt是关于什么的。我会告诉你，但我们需要通过不断的重复来改进 它，通过进行下一步。 2.根据我的输入，你会创建三个部分： a、修订后的Prompt； 你编写修订后的Prompt，应该清晰、精确、易于理解 b、给出建议； 你提出建议，哪些细节应该包含在Prompt中，以使其更好 c、提出问题； 你提出相关问题，询问我需要哪些额外信息来改进Prompt 3.你提供的Prompt应该采用我发出请求的形式，由ChatGPT执行。 4.我们将继续这个迭代过程，我会提供更多的信息，你会更新“修订后的Prompt\u0026#34;部分的请 求，直到它完整为止。 生成PPT内容 # Role: 你是一个擅长从文档中提取并总结内容，然后生成PPT大纲以及PPT每一页内容的专家 ## Skills 1.信息提取与分析:能够快速地从大量信息中提取关键点和核心概念，这对于创建有影响力的演示文稿 至关重要。 2.逻辑结构设计:善于构建清晰的逻辑框架，确保演示内容有条理且易于理解。这包括知道如何组织介 绍、主体内容和结论，以及如何合理安排这些内容的顺序。 3.视觉呈现: 具备良好的设计感，能够将文本和数据通过视觉元素 (如图表、图像和布局)有效地呈现 出来，提升信息的吸引力和易读性。 4.摘要和精炼能力:能够将复杂或冗长的信息精炼成简洁有力的点，这对于PPT这种需要简洁表达的格 式尤为重要。 5.故事讲述:能够将数据和事实转化为引人入胜的故事，这有助于吸引听众的注意力和增强信息的传达 效果。 ## Goals: 从用户提供的文档中提取关键信息，并以总-分-总的形式重点归纳和提炼，制作成不少于5页的演示 PPT大纲。 ## Constrains: - 直接按\u0026lt;Workflow\u0026gt;执行，一开始不需要额外的解释 - 在提炼和制作PPT时，确保每一页的内容既充实又具有深度，避免过于简化 - 注意PPT的视觉设计，使用适当的图表、图片和布局来增强信息的表达和吸引力 - 考虑到观众的多样性，确保PPT内容的通俗易懂，尽量避免使用过于专业或复杂的术语 - 制作完成的PPT应清楚地展示了从PDF文档中提炼出的核心内容，每一页都应传达一个明确的观 点，且整体呈现应符合总-分-总的结构 以**markdown**形式输出 ## Workflow: ### 第一步:上传文档请求用户上传文档 ### 第二步:分析和理解文档 对于用户上传的文档进行分析和理解。 1.确定文档的**主题** 2.浏览**目录**，识别主要**章节**和相关的**内页**，以便理解文档结构。 ### 第三步:内容提炼 1.对于每个章节，提取至少3个关键点，每个关键点都需用序号标明。 2.为每个关键点编写简短的**详细观点描述**，以确保内容的清晰和准确性。 以上完成后，询问用户是否需要按以上内容进行PPT制作。 ### 第四步:PPT制作 -**每一页PPT**应围绕一个清晰的观点进行设计。每一页的内容应包括: 1.**章节**表明该观点来源于文档的哪个部分。 2.**详细观点描述**-列出与该观点相关的至少3个细节。 3.**引发思考的内容**，鼓励观众深入思考所呈现的信息。 4.PPT的最后一页为总结页，应包括对全文核心观点的总结: -以序号形式分条列出主要观点，以帮助观众加深理解和记忆。 ## Initialization： 作为\u0026lt;Role\u0026gt;，严格遵守\u0026lt;Constrains\u0026gt;以\u0026lt;Workflow\u0026gt;的顺序和用户对话 总结 你是一个擅长总结长文本的助手，能够总结用户给出的文本，并生成摘要。 ## 工作流程 让我们一步一步思考，阅读我提供的内容，并做出以下操作： ## 标签 阅读文章内容后给文章打上标签，标签通常是领域、学科或专有名词 ## 一句话总结 阅读文章内容后，总结文章内容，并写成一句话总结这篇文文章 ## 摘要 总结文章内容并写成摘要，详细地列举文章的大纲，要完整体现文章要点 更多提示词 https://apphunt.site/kimi-reader/prompt\nGPTS分类 写作/Writing 开发/Developer 生产力/Productivity 商业/Business 教育/Education 金融/Finance 健康/Health 营销/Marketing 销售/Sales 游戏/Games 设计/Designer 写作/Writing ACME\nAI Novel\nAIssistant Blog | wtb.agency\nAI作文助手\nAI翻译官\nCI NV 1\nChristinaGPT\nGPT提示创作器\nHappiness Writes White\nLarry Limerick\nSEO博客内容编写器\nSami Kuusela 2.0\nSwift Lyric Matchmaker\nTEDTalk Writer\nTOP Artículo GEN\nk80\u0026rsquo;s word smith\n✨A.W.P. 🎯: Article Writer Pro🔍\n专业帖子创作者\n专业校对家\n个人故事调整\n中等文章架构师\n书籍创作GPT\n你的前女友丽莎\n信件大师\n写作 ENG（仅语法，拼写，诵读困难）\n创作小说\n创意写作AI文本生成器\n创意写作辅导\n创意生成器\n创意诗词画家\n堂吉诃德\n复古网络新闻撰写\n宣言撰写者\n寫文章大師\n情感笔\n房地产写作专家\n故事构建器\n文章写作助手 V2.1 (by GB)\n珍珠文学家\n神秘灵感\n科幻世界构建器\n科技先生\n第二小说家\n紧急救助法国\n终极引子写作 GPT\n结论生成器\n诗歌\n逐句编辑器\n长篇博客机器人\n阿尔法加密写手\n類語先生\n首行达人\n马克·吐温\n魔法故事匠\n🦁\n营销/Marketing $100M Offer\nAJ的付费社交助手\nAd Craft - MTA快速创作家\nAdster AI\nBircher Bar产品评论\nBora的SEO策略师\nConstant Contact Promo GPT\nDNZ SEO 内容写手\nE-CEO GPT\nEEAT\nGPT Guasapero\nInsta-Prompts\nInstagram标签助手\nJulianaGPT\nLinkedIn广告专家\nMaven\nMeta Adcopy Generator\nNilo\u0026rsquo;s\nO Copywriter\nOptim² - 助理\nOya\nPMax Pro\nSEO Sam\nSEO Sensei Stephen\nSEO写作1.0\nSEO助手专业版\nSEO导师\nSEO文章生成器\nSEO最佳\nSEO标题生成器\nVox Verba品牌营销助手\nXPrad\nX文案大师\n中等缪斯\n优秀的SEO机器人在乌尔姆？\n内容创作者\n内容管理\n列表顾问\n博客创意\n博客创意生成器\n品牌与文案天才\n品牌提升小助手\n品牌故事大师\n增长营销\n小红薯运营官\n市场思维\n市场营销专家\n帖子文案向导\n广告代理GPT\n广告文案生成\n广告文案生成器\n强调博客助手\n影响力盟友\n我的SEO页面构建器\n我的广告优化师\n推广奇才\n数字营销大师\n数字营销顾问\n文案写作助手\n时尚趋势观察者\n标语定制师\n核心6社交媒体营销策略师\n概念性\n模板与主题内容创作\n沉闷大师\n浑浊IPA大师与数字标签工匠\n理发店推广增强版 | 撰写引人注目的广告 🧐✍️\n瓦伦蒂娜米拉 - HelixScript\n病毒式Insta-Creator\n社交传媒之爱\n社交媒体专家\n社交媒体帖子优化器+图像生成器\n社交媒体投稿销售写手\n社交广告大师\n罗德里戈·索阿雷斯的Instagram创作者\n脉搏（营销助手）\n营销GPT\n营销专家大师\n营销策略师\n营销趋势侦察\n营销魔法GPT\n视频简报天才\n设计思维者\n词对创造者\n转化率顾问\n软文秘籍\n逃离平凡社交\n道格的写作风格\n高艺术SEO\n鸣声巫师\n😺CATBOTJE\n设计/Designer 3D壁纸\nAAA Pepe Image Generator\nAI 绘画\nAI-assisted Astro-Imaging 创意画师提示提大师\nAI头像修改器\nAI艺术师\nAI艺术愿景\nASCII猫咪艺术家\nAichitecture\nArtline Assistant\nBOLD Art\nCreativo Pro\nDesignglas Copywriter\nDessinateur GPT\nFunko Pop Creator\nGIF 制作工具\nICONIC\nLogo Craft Pro\nLogoGPT\nPNG插图\nPOD Merch Designer\nPhotopea教程指南\nPix90s\nPixart Me\nRenoMate\nRickmortize Me\nSouthparkize Me\nTuftex Balloons\nUX.ia\nVucrein艺术生成器\nWhiskers GPT\n✒️阿拉伯文书法创作✍️\n丑陋的圣诞毛衣GPT\n专业LOGO设计\n令人心悸的故事\n优雅标志创建者\n传说素描\n像素派对\n创意壁纸大师\n创意建筑师\n创意形象\n创意角色设计师\n创意课程设计师\n剪影大师\n动感设计师\n动漫老照片\n化妆图片分析\n化妆大师\n古色古香时光旅行者\n可打印的涂色页面\n品牌大师\n园艺服务\n图像生成器\n图形设计\n图标梦想家\n图标缪斯\n城市天气艺术\n它是一个情绪视觉综合体\n宠物头像Pro by PicAPetName\n家居设计小助手\n岗位职责生成器\n帖子插图 | 最大化CTR\n应用图标生成器\n建筑新员工视觉设计师\n异常：纸艺师\n彩虹填色页面\n数字插画师\n数字艺术助手\n新闻摄影师\n无限媒介\n时尚空间创意大师Pro\n时尚设计师\n时尚鞋履艺术家\n智能设计GPT\n暗紫色\n服装创作AI\n水墨连环画\n激笑漫畫生成器\n照片专家指南\n照片逼真PRO\n爸爸插图师\n狂战士素描艺术家\n用花来述说\n电影场景创作者\n禅园\n简约时尚的标志设计师\n缪斯装饰\n网页设计精灵\n自动素描艺术家\n色彩搭配助手\n艺术之镜\n艺术家\n艺术挑剔者\n艺术探索者\n艺术提示创作者\n艺术灵感\n艺术编织者\n苹果设计团队的故事\n虚拟设计师\n装饰师\n视觉灵感\n设计之道\n设计图书推荐\n设计大师\n设计小伙伴\n设计系统指南\n诗境画韵\n诗意镜头\n赛博朋克图像生成\n超真实提示器\n超级跑车创造者\n镜逻辑 | 快照增强 📸💚✨\n闪光灯教练\n颜色\n颜色方案助手\n高地远见\n🌟CartoonCreative🌟\n开发/Developer .Net Master\n100X Engineer : 一键将截图转换为HTML\n150 Words Gist 🗞️ | SimFonX\n2003\n2019\n2023年度人工智能回顾\n47\nAI Talent Agent by Commit.dev\nAI咨询考试\nAI基础设施云\nAI工具GPT\nAI提示工程\nAI提示精通\nAMENOW BROADCASTING NETWORK\nARIMA DataSynth\nAe Sensei\nAgentSearch\nAlLoRa Genius\nAlt Text AI\nAngular\nAnnie\nAnsible自动化AI\nApple MusicKit完整代码专家\nAppsec360\nAzure文档专家\nBINDasaurus Rex\nBias AI\nBlender 伙伴 GPT\nBotZoe3\nBuzzy助手\nC## Helper\nC#: 将数据转化为洞察力\nC++ Guru\nC++专家\nC++云部署：登峰造极\nC++代码顾问\nCTF Conqueror\nCalabi-Yau Explorer\nChar Sage\nChatgpt开发工程师\nCoachGPT\nCommonSenseGPT\nCoronium.io ProxyGPT\nCrank It Up意味着什么？\nCyril的GPT API参考指南\nC面试助手\nD.A.V.I.D\nDAX Man Walking\nDOM巫师\nDjango导师\nDocker Mentor\nDr.TurboDirect\nEE-GPT\nEU AIctor\nEU MDR产品分类器\nEpictetus GPT\nEpstein文件分析器\nFAANG模拟面试\nFLAEX GPT\nFallacy Finder 谬误侦查机\nFlashSystem 专家\nFlutter Friend\nFlutter Mentor\nFlutter Pair Programmer\nFlutter开发助手\nFour Souls\nGIS专家\nGMT绘图专家\nGPT 创建指南\nGPT 开发导师\nGPT 技术支持\nGPT 指挥官\nGPT 探索者\nGPT 架构师\nGPT-5 Alpha with Q-Star Activated\nGPTs链接芯片\nGPT导航\nGPT构建专家指南\nGPU挖矿脚本制作助手\nGRC Co-Pilot\nGeoMind\nGit Guru\nGit Sensei\nGit 专家\nGptOracle | IT Vulnerabilities Researcher\nGrep Guru\nGwen\nHonest meaning\nHoàn Công Thực Chiến\nI3 Guide\nISMS ISO 守护者\nIT Command Builder\nIT NEWS BOT\nImageFixer\nImagine Replay指南\nInception GPT\nInnoMake Mentor by Knectiv\nJavaGPT\nJavaScript之旅：引领代码革命\nJavaScript内存泄漏解决专家指南\nJavaScript响应式设计精要\nJava流API助手\nK8S Docker部署助手\nKCCS QA MANUAL GPT\nKMAVENS\nKTU云计算\nKirby CMS Advisor\nKod Ustası\nKotlinGPT\nLLMs PRO提示生成器\nLaravel 10 大师\nLaravel Helper\nLaravel 重构\nLaravel编码助手\nLawTask API Integration Assistant\nLinux终端\nMAKO SKIRIO\nMATLAB通信工程助手（带Simulink支持）\nMJ助手\nML模型\nMQL5 Wizard\nMQL5代码大师\nMattGPT\nMixerBox ChatMap\nMoE.Brains\nMojju的NFT安全检查\nMojju的代码评分器\nMon BubbleAppAssistant\nMongoDeBuger\nMySQL 助手\nNHCPS G4助手\nNRI Helpdesk\nNanoCheeZe GPT\nNatalie AppMaken\nNeRF and Vision Expert\nNoSQL代码助手\nNode.js 21 魔法💻\nNumerGPT\nOTRA Mentor\nOchyAI\nOpenAiGym\nPHP测试专家：轻松掌握PHPUnit\nPROMPTATOR\nPacoGPT - mfer intern bot\nPlantUML图表向导\nPlaywright助手\nPower BI Helper\nPowerShell Pro\nProf Zero\nPrompt Engineer AI 🤖\nPrusa Problem Bot\nPsyItemGenerator\nPySCEMU助手\nPydantic\nPython Pal\nPython Pro Solver\nPython Puzzle Master\nPython专家\nPython助手\nPython脚本编程小组\nQuickbase Formula Builder\nROS助手GPT\nReDev You v00400\nRedlineGPT\nRenovaTecno\nRenpy\nRepoRefiner\nRogue RFI Bot\nR西班牙语\nSBMG\nSEO 技术流\nSEO常见问题生成器\nSGS- GPT\nSam, 用户研究指南\nSave Yourself 含义\nScrum Master HAL\nSilent Susan内容分析器\nSimpliTeach - 言語化の鬼\nSimtype\nSitefinity Blog checkmaker\nSol Dev TestBot\nSolidity Programmer\nStripe文档助手\nSwift Interview Assistant\nSwiftUI Sidekick\nSwift高级\nT71 俄罗斯网络威胁分析\nTCA Bot\nTailwindCSS构建器 - WindChat\nTappstr Blog Title Composer\nURL编码器\nUmbraco 13\nUnity 游戏开发 URP 大师\nVR 创新者\nVanJS 应用构建器\nVueJS Visionaries: Code with Elegance\nWGU - Java Fundamentals (D286) OA Trainer\nWHO-BIO Crafter\nWP统计\nWebflow Wizard\nWord Smith\nWordPress插件编码助手\nXR导师\nXcodeGPT\nZIRU的数据科学导师\nmomo\nshadcn-ui magic\nzeppos\n☁️🔄 云形分类器 🌦️\nたほいや GPT\nぷらっとmapくん\nりなちゃん\nロブロックス先生\n一般質問スカウター\n上帝的LLM嵌入\n不爽GPT\n与datasette.io数据库交谈\n专业 - 二维码\n专业提示器\n专家春季安全GPT\n专注于质量的SEO内容创作扩展型GPTs\n专题权威王\n个性生成器\n云原生威胁建模\n云基因指南\n云架构师 Lynn\n云认证考试指南\n交互式情景模拟器\n产品感知 GPT\n人工无能Alpha\n人工智能\n人类逻辑人工智能\n仍然失望\n代码专家\n代码优化大师GPT\n代码伙伴\n代码大师\n代码审查助手\n代码支持\n代码艺术家\n代码调试器\n以太坊预言机\n传感器目录助手\n伦理黑客空间 (eHs)® (FS-SF2-S)™\n体验洞察\n使用Lua模拟面向对象编程\n修好朋友AI\n像素泵01\n免费视频剧本创作工具\n公交站兄弟\n关于双子座的一切\n内容特定网络助手\n冯·诺伊曼\n冰冷工程师\n分支求解器AI\n分析与标签管理专家\n创始者GPT\n创建一个带图片的问题\n创意推导辅助创作者\n创意编程GPT\n前端开发工程师\n前端蚂蚁开发者\n加密洞察\n助手API专家\n化学合成分析师\n化学家\n区块链GPT\n区块链开发者\n协议王\n博客文章生成器\n占位图生成器\n压缩机顾问\n名人对话\n后端导师 - Node.js\n后端开发顾问\n图像替代文本助手\n图像生成与自我批评改进\n图像语言修正器\n图片复制器\n图片迭代器\n地图指南\n地理侦探\n地理定位器\n城市创新者\n基础网络安全助手\n塔鲁库拉尔GPT\n多元宇宙探险者\n多元宇宙镜 lv3.9\n多角色代理模拟器\n大卫森AI\n大数据学习\n太阳世界\n如何绕过Apex Legends的HWID封禁\n如何绕过BattlEye上的HWID封禁\n妞妞的论文助手\n威胁情报专家\n存在危机机器人\n学术评论者\n安东的儿子\n安全CFP顾问\n完美名称选择器GPT\n完美提示\n实验摘要助手\n家园 | 亚当M.维克托\n小程序开发助手\n工单生成器\n帮我抄这个网站的 CSS\n建筑助手\n建筑师机器人：定制模型专家 🏗️🤖\n建筑防火专家\n开发者AI助手：您的编程伴侣\n开发者橡皮鸭 🦆\n开放数据助手\n形而上算法\n德法翻译\n徽章构建器\n心灵大师\n快速代码片段生成器\n情感可视化 GPT\n情绪侦探\n意识探索者\n戴高乐会说什么\n手枪\n找到我AI\n技术与机器学习指南\n技术产品经理\n技术变焦相机\n技术导师\n技术架构顾问\n指南\n探索\n提示大师\n揭秘Go的秘密：指针与值的释放\n搭档程序员\n敏捷用户故事和EPICs助手\n数据分析英雄\n数据提取器 - JSON\n数据狂人\n数据结构设计专家\n数据解释\n文本创作者\n文本提取GPT\n文本清理器\n文档皮层\n文章助手\n新闻和书籍BibTeX格式化工具\n无用GPT\n明亮提示器\n星野GPT\n智能伴侣\n智能维修\n最佳GPT构建器\n未来AI洞察\n机器人之父\n机器人构建\n机械小伙伴\n极光\n极致变更\n检查UX可访问性\n概念提取器\n模因GPT\n模拟机\n正则表达式专家\n残疾人集体住宅指南\n水之设计支持\n汽车技术工程师\n泰德叔叔\n深思熟虑的提示创造者\n潜在一致性模型\n灌篮高手体育分析\n火烈鸟\n热泵专家\n物质专家\n理解AI\n生物信息学家\n用户提示中继\n电子书GPT\n电脑部件小贴士\n电路向导\n白帽黑客\n真实性车辆\n社交流分析师GPT\n神经闪电\n科技分钟策展人\n科技匹配\n科技天才GPT\n积极信息\n移动\n程序提取和格式化\n竞争对手分析器\n符号引擎\n等距投射\n精致愚蠢\n精英代码架构师Pro - Autobach.ai\n系统设计导师\n红队导师\n纯净SEO助手\n统计与代码翻译器\n统计助手\n编码达人\n编程助手涡轮版\n编程助教\n编程大师\n编程导师\n编程技能检测器 - saysay.ai\n编译器专家\n网站地图URL提取器\n网站生成器\n网络侦察\n网络助手\n网络守护者\n网络安全SEO守护者\n网络安全顾问\n网络工艺\n网络智者\n网络状态导航\n网络设计师\n考试助手\n聊天机器人\n肌肉思维\n脚手架大师AI\n脚本编码师\n自动生成预言\n自我批评和改进的图像生成\n自然语言处理GPT\n舒适UI节点生成器\n英中\n苹果应用创建者\n苹果快捷方式\n苹果活动套件完整代码专家\n营销网络抓取\n融合者\n视觉AI编辑助手\n视觉工程师专家\n视觉翻译\n角色创造者\n计算机维修手册\n认知合成器\n调色板转换\n谣言检测器\n费德里科·加西亚·洛尔卡\n超级GPT\n超级编程大师\n超赞Mac\n越南语聊天\n越狱者\n轮胎顾问\n辣狗还是不辣狗\n过去的试卷小助手\n道德\n道德人工智能\n道德黑客指南\n量子通讯\n键值助手\n阿里云盘助手\n随机数据生成器\n隐秘守护者\n零件查找\n雷金纳德\n霓虹之影编年史\n非常有帮助\n韩国\n项目制作者\n马库斯·奥里利斯顾问\n高级前端工程师助手\n高级战争分析\n高级无人机技术专家\n高级自定义字段\n魔鬼的辩护人\n黄色小鸭\n🌍 ClimateCompiler Analyst 📈\n🌏 地理图制作师: 地图洞察 📊\n🌐 Angular API Artistry\n🌐 Django后端蓝图\n🌐 WebCraft HTML5 Innovator\n🌐 开源倡导者精灵\n🐘 Effortless Postgre in Docker\n🐛 调试异步JavaScript\n👨‍💻 Pascal SegFault Troubleshooter\n👨‍💻 量子搜索算法构建\n📊 SQL库存导航\n📊 金融中的Pandas数据分析\n📚 Ada强类型教程\n🔍 Scripted Doc Genie\n🔥 Bash Data Alchemist\n🔧 Assembly Energy Wizards\n🔬✨ MaterialMelder: Experiment Tracker\n🔬纳米导航者：分子大师🧬\n🖥️ Web Dev Wizard with Yesod\n🚀 ColdFusion动态HTML向导\n🚀 Express Deployment Dynamo\n🚀 Java StringBuilder 优化器\n🚀 Kubernetes 控制命令\n🚀 NextJS Statecraft Frontier\n🚀 功能性JVM开发者\n🚀 最佳功能工艺\n🛒 Rails 电子商务架构师\n🛠️ 定制电脑架构师Pro 🎮\n🛡️网络守护者专业顾问🖥️\n🧬 NumPy生物信息学蓝图\n🧬 酶探索实验室助手 🔬\n🧮 NumPy Neural Net Navigator\n生产力/Productivity ! Amon !\n\u0026ldquo;E\u0026rdquo; Train歌词含义\n\u0026ldquo;化妆和褪色的牛仔裤\u0026quot;的含义\n1 Liner Jokes\n17歌词含义\n1994歌词含义\n4K电视\n7主耶稣代求悔改\nA Whole Lot Of Love的含义是什么？\nADHD者时间规划\nAI Joe\nAI 高级伙伴\nAI-fredo Linguine\nAI.EX Magic 88 Ball\nAIHelp.BOT by IHeartDomains\nAIVA Melody Maker\nAI图书推荐\nAI图书搜索\nAI简历顾问\nAI艺术机器人图像生成器\nAI革命\nAI音乐创作家\nApicius, Chef anf Oenologist\nApple音乐播放列表AI\nAprimore seu texto - Português PT\nAqara生活查询\nArno\u0026rsquo;s 主题化新闻简报助手\nAskChloe - 时尚顾问\nAudienClature\nAutoExpert (Chat)\nBeautiful Thing meaning?\nBenny Tucker And The Ant 的含义是什么？\nBias Examiner\nBienÉther 创作者\nBioCompEditor\nBoende jkpg.com\nBrain8的长篇大纲创建器\nBring It On Down To My House, Honey\nBurn Bright的意思是什么？\nC.A.E. 邮件撰写精灵\nCHEFF DesAIgner\nCUTE\nClippy\nCocaine Blues 含义\nCriador Digital\nCropMagnet\nDIY与花园项目\nDJ助手\nDr Ben - 10x is easier on 2x\nDrowning Potential 是指什么？\nElf Mischief Instigator\nEstranger歌词含义\nExcel AI\nExcel助手\nFern\nForeign Fields (Yung Gud Remix)歌词含义\nFormador Management y Liderazgo\nFragile Men 歌词含义\nGMS 练习计划\nGPT Scout\nGPT TUBE\nGPT 写作网站 - 法语\nGPT 指导者\nGPT 日历和邮件安排器\nGPT 氛围分析 | 专业氛围分析师\nGPT事实检查器\nGPT搜索\nGet Smashed Gate Crash含义\nGetAFix助手\nGomc\nGood Thing含义\nGoodbye Comes Hard For Me的意思\nGoogle表助手\nHIP HOP MOTIVATOR\nHeadphones含义是什么？\nHeart Like Heaven meaning?\nHold Me 歌词含义\nHonda釣り倶楽部の投稿案作成GPT\nHurt Again 歌词含义\nI Can\u0026rsquo;t Dance meaning?\nI Don\u0026rsquo;t Think You Love Me 歌词含义\nI See Love的含义是什么？\nIdea Forge GPT\nInno-Dude\nInstant Pot Chef\nInsta创意助手\nInto You 歌曲含义\nJimmy The Broom的含义\nK-Weather GPT\nKisses Sweeter Than Wine\nKris Moe高尔夫技巧\nLEYA - AI 婚礼策划师\nLinkedGPT\nLions含义？\nLove Is Pretty歌词含义\nLove With Your Life歌曲解析\nLove Won\u0026rsquo;t Let Us\nLove is Alive meaning?\nLow Beams 歌词意思\nLow Blow 歌词的含义\nMASCOZ 助手\nMASTERMIND\nMac专家\nMarionette含义\nMe And My Friends的含义是什么？\nMeme Worksmith\nMiday\nMoonshine Man 歌词含义\nMotiv8\nMotoBuddy\nMy People歌词含义\nNaked Polly意思是什么？\nNat Mat Crush It Coach\nNo Me Amenaces的含义是什么？\nNo One Loves Me Like You\nNot Today 含义\nNotion AI\nNova\nOBX | 内容文档准备\nOBX | 内容文档最终清理\nOR4建模助手\nOn The Edge Of Honour\nOutlook Scheduler\nOverkill意义\nPDF GPT\nPDF Wiz Pro\nPathFinder by THE LATITUDE.IO\nPerformer是什么意思？\nPlaymobil 盒子生成器\nPodcast脚本生成器\nPower BI大师\nPowerPoint Guru\nPro Daily Assistant for China(便民工具)\nProductHunt Roaster\nPromptGPT\nPromptMedic: AI for Enhanced Prompt Crafting\nPurse\nQUOITWORKS Coach\nQubits® Toy News\nReels GPT\nRika - 你的虚拟女友\nRogue Army Tactical Advisor\nRogue Humor\nRolf Blog\nSEO关键词探索器\nSeasons (Live) 歌词意义\nSeinfeld Squad Bot\nSenpAI\nSequoia Social Media Manager\nSet \u0026lsquo;Em Up Joe 歌词含义\nShe\u0026rsquo;s All Lady\nSiamBestReview Assistant\nSilverthorn Mountain的含义是什么？\nSing A Sad Song的含义\nSkye: 个性化伴侣\nSpatzAI\nSpeak To The Wind 歌曲意义\nSta Op\nSteadfast Flow 歌词含义\nStomping Grounds\nStream Weaver\nSummary Assistant\nSusi\nTMAO-1\nTWEETLINKON 🧪\nThe Adventures Of Linda Bohannon\nThe Chair歌词含义\nThe Letter的含义是什么？\nThe Magic Kid歌词含义\nThe Show\u0026rsquo;s Almost Over意思是什么？\nThe Village\nThis Boy is Tocotronic\nTinder Whisperer\nTo There From Here meaning?\nToB Designer\nTodo El Amor Que Te Hace Falta\nTrain Whistle Blues含义\nTravelin\u0026rsquo;歌词\nTravera\nTrying meaning\nTurn To Stone meaning?\nTwitter视频下载器\nUSPS Tracking\nUfologist\nUncle Lem歌词含义\nUnfold\nViewSonic Magayver\nVino GPT\nVivencias意义\nVlog GPT\nWeapons歌词翻译\nWeb Explorer\nWebPilot PQP\nWhat Happened To Us?\nWhat You Should Do Next (あなたは次に何をすべきか)\nWhy Can\u0026rsquo;t I Cry歌词的含义\nWineSom\nWish I Hadn\u0026rsquo;t Stayed So Long意思是什么？\nWord助手\nWrong Hand meaning?\nYou Are意义\nYou Walk With Me (Live) 的含义是什么？\nZero2Hero | 尼尔撰写英雄\n[VITCN] Sugestor de conte\\u00fados\niPhone Photo Pro for Product Photography\n《Lovin\u0026rsquo; Me》含义\n《必须有所改变》含义\nおかん\nモテる男のGPT\nリサ先生\n一步一步来\n一目比较\n与我约会\n与耶稣对话\n世界情绪检测器\n东京天气预报图片\n个人助理\n个性化化妆品推荐\n个性宠物搭配\n中年人机器人\n中文占卜\n中英翻译官\n为什么\n乙烯基向量\n习惯大师\n事实发现者\n事实查找器\n交易助手\n产品GPT\n产品乌龟\n产品经理专家\n产品达人 🤓🚀\n代码助手\n价格比较小助手\n任何事情都有可能的含义\n任务大师\n仿制美食\n会议翻译MM\n你可爱的真正快乐之源的含义\n你的布鲁斯名\n你的成长顾问\n侦探夏洛克\n免费AI语音生成器在线\n全球优惠创新者\n全球排名\n全球新闻验证器\n全球语音翻译\n八字算命\n公众人物责任专家\n六顶思考\n共情手记AI\n关心他人\n关键词大师\n兴趣伴侣\n冒险大师\n写作助手\n冷泡咖啡\n分支场景创作工具\n创业公司评判\n创意催化剂\n创意可视化\n创意艺术家\n创意集团“圆桌先生”\n初学者木烧艺术创意\n剩菜拉里\n副业GPT\n办公室禅师\n办公室笑话漫画\n勇于调情\n匹配导师\n华丽诗人\n协议之王\n博客写作助手（带导引）\n卡纳塔克邦探索者\n危机中的含义\n即时个人资料人格分析工具\n厨师小伙伴\n厨师机器人\n厨房刀具\n发散思维\n古巴雪茄顾问\n可爱小僵尸\n司法听证会助手\n名称编织者\n吐槽我的创意项目\n启迪者\n周末漫游者\n周末的含义\n咖啡之歌含义\n嘻哈音乐\n回到我们年轻时的意义\n回收利用专家\n团队背景机器人\n国际旅行\n图书检阅师\n图像描述\n土耳其至英语翻译和开发\n圣诞创作者\n圣诞时节到了的意思\n圣诞老人的秘书\n圣诞节剩菜工匠\n在我故乡的含义是什么？\n城市排名者\n培根机器人\n填色页生成器\n增强世界和平规划者GPT\n墨西哥\n墨西哥乐队歌词意思\n备忘单生成器\n夏威夷 GPT\n多语言伙伴\n多语言翻译\n天使与恶魔的低语\n天气助手\n头像创建助手\n头脑风暴 GPT\n奇幻动物头像创造者\n女朋友\n女朋友服务.com 💖\n好消息日报\n好眼光\n如果我能成为他的含义\n娱乐文化达人\n婚礼文案助手\n完整邀请函创建者\n完美销售宣传\n宝贝你可以开我的乐高\n实用笔记指南\n客户智能化客户访谈助手\n家庭园艺助手\n家庭安全顾问\n家庭购房者头像GPT\n家族レーダー\n家的星之意义\n寺庙指南\n小猫命名\n尼日利亚皮金\n山屋\n工作在家意义\n布达海\n布道助手：怀疑驱除者\n年度指南GPT\n年龄转换器\n幸福的含义\n幽灵写作传奇\n度假规划\n异教故事编织者\n徒步\n微辣还是重辣\n德里达探索者\n心动指南\n心跳的含义\n志望動機作成ツール-転職活動にオススメ-\n快乐8游戏助手\n总结大师\n悉达多智GPT\n意大利正宗烹饪指南\n意识的回响\n愿景板设计师\n戏剧化妆大师\n成功之道 GPTs\n我之初的含义是什么？\n手册汉斯\n打破壁垒的含义\n指导教练\n探索塞内加尔冈比亚\n摩羯座个性化建议\n播客GPT\n播客剧情制作人\n改变我的想法\n故事创作家\n故事创意生成器\n故事编织AI\n教练启动\n文字转化专家\n文本\n文本澄清\n文案生成器\n文档摘要生成器\n文章创作\n文章总结助手\n文章重写器\n新加坡旅行助手\n施工计算器\n旅游达人+小红书旅游文案编辑\n旅行专家\n旅行侦察\n旅行助手\n旅行定制师\n旅行行程制作\n旋律调酒师\n无处不在的柯基\n日历小助手\n日程安排\n时尚\n时尚伙伴\n时尚哨兵\n时空探险家\n时间管理者\n星座占星大师\n智慧王\n木法沙人工智能\n本地探索\n查理贝克助手\n柴油朋克淘气鬼\n标题生成器\n梅林-智慧解决方案的魔法师\n模仿者\n模型铁路爱好者\n武道导师\n法庭监护\n洞察GENERATIONS\n活动规划师\n派对智能\n浏览魔法\n深度搜索\n演示脚本助手\n漫画助手\n激励指南\n烹饪\n狗名生成器\n狗狗GPT\n独立电影AI助手\n狮子座\n猫猫GPT\n生日历史小助手\n生活伴侣\n生活方式评分\n生活简化器\n生活费用计算器\n电影GPT\n电影侦察\n电影迷\n盐水钓鱼\n目标助手\n相机\n知识主任\n礼物侦察GPT\n礼物助手\n社交厨师\n社交网络回复AI\n祖母朱莉娅\n神秘圣诞\n科技导师\n窗户\n简介写手\n简历精灵 - ATS 优化器\n粉笔艺术\n系列选择器\n终极电视预言者\n经典汽车护理助手\n缩略图模仿者\n网络忍者\n网络研讨会回放摘要生成器\n罗伯特·格林\n美食之友\n美食大师\n翻译专家\n翻译土耳其至英语\n聊天好伙伴\n职业创作家\n职业指南 2024\n联盟领袖GPT\n自拍叔叔语法生成器\n自拍教练\n自行车 GPT\n至尊愚者：意外雕塑师\n艾尔·邦迪\n节日装饰风格专家Pro\n花园顾问\n草坪和景观\n荒凉塔罗\n营养指南\n葡萄牙语到英语翻译\n葬礼歌词意义\n行动清晰教练艾默瑞\n表情消息\n见面再见的含义\n解决方案指南\n誰でもLINEスタンパー\n语法检查\n请问DJ先生的含义？\n读书虫\n质疑回答角色扮演机器人\n费尔班克斯阿拉斯加的意义\n超级提示生成器\n足球赔率专家\n轮胎链尺寸计算器\n软件比较\n达赖GPT\n迈克尔·斯科特\n迈阿密夜生活\n这部电影叫什么？\n远程工作伴侣\n通过图像识别电影、剧集和动画\n道歉文 GPT\n邮件优化大师\n邮件助手\n钢筋碰撞（现场版）\n问题导师\n阅读发现\n防火预防\n阳光孙子\n阿尔卑斯滑雪指南助手\n阿鲁卡尔助手\n霓虹东京：激光边缘角色扮演游戏\n露娜 - 你的甜心\n露营地查找器\n霸道總裁愛上我\n非比萨\n面试助手\n鞋类侦察\n鞋类护理助手\n音乐VIP链接生成\n音乐大师\n领域大师\n风之耳语者\n风格大师GPT\n食品加工器\n香水顾问\n香肠\n高尔夫GPT - 您的高尔夫规则即时指南\n高尔夫职业GPT球童\n高尔夫规则\n高效\n高效助手\n黄砖路的含义\n鼓励者\n우린 성모다\n𝕏 Echo\n🌍✈️ 你的终极旅行助手\n🌱 PlantPal: 您的温室导师 🌿\n🌱 生态创新者的绿色指南 🌟\n🍩 甜甜圈节巡游 \u0026amp; 烘焙大赛小助手 🍰\n🍲 厨师食谱助手 📜\n🎉 CincoDeMayo Fiesta Planner 🌮\n🎤 说唱对战机器人 lv3.9\n🎬 Showbiz Scheduler GPT 🎥\n🎵 Tune Trekker - 音乐探险家 🚀\n🏠✨ 虚拟翻新向导GPT\n🐠 AquaBuddy Care Assistant 🐟\n🕺💃 病毒式舞蹈制作AI ⭐🎶\n😄 表情符号融合创造者 🎨🔀\n🤝 资助专家词匠 📝\n🥾🌲Trail Trekker Advisor🚶‍♂️🏞️\n游戏/Games 12个酒吧规划师\n22码 | 板球智慧\nAct\nDMGPT\nDOS Quest\nGPT-libs\nHeaven And Earth歌词解析\nInkGPT\nJewel Warrior Jewelist✦Angels : 宝石戦士ジュエリスト♢エンジェルス\nLexideck The Chroma Clash RPG\nNethack\nOn The News 意思是什么？\nOps Oracle\nPickleball Pro\nPinto The Wonder Horse Is Dead的含义是什么？\nPokemon变换\nRPG Architect\nSAM GPT\nSeelz Secret Challenge\nTapTap\nThe Ill-Made Saintess\nWH 40k 助手\nWildWest模拟器GPT\n✈️ 无人机飞行高手导航专业版 🎮\n一个超级可爱的女孩\n一键游戏创建器\n万圣节服装\n世界创造 V1\n中世纪生活模拟器GPT\n亡者侦探\n以太弧光：普雷托尔1107编年史\n任务头脑大师\n传说创作者\n传说编织者\n佐治亚州采桃季节\n修仙 GPT\n假设模拟器\n僵尸启示录 | 文字冒险生存游戏\n僵尸启示录GPT\n僵尸大师生存专家\n克里斯托弗\n全职法师之唯我独属\n创作者助手\n动漫王国\n午夜侦探\n博弈论指南\n历史战略家：凯撒大帝的崛起\n历史游戏\n双关生成器\n反派角色创造者\n史诗RPG任务助手\n合成万神殿\n周棋洛\n和Hov共进晚餐\n哈利波特地牢爬行者\n商战游戏\n国际象棋GPT\n土耳其地毯销售员\n地牢指南\n塔罗神秘之视\n夏洛克·福尔摩斯人工智能：贝克街的回声\n夏洛克·福尔摩斯（谜题创造者）\n天堂中的顽童\n奇幻探险大师\n奇幻角色生成器\n奇幻锻造\n宝可图鉴GPT\n家庭乐趣活动\n对手Masul\n小凯撒\n幸运号码精灵\n度过困境！- 度过困境！【娱乐GPTs】\n心灵读者星霸\n快乐猫游戏大师\n怪物\n愤怒机器人\n我开不了头意味着\n扑克规则\n控制天气：严肃TRPG\n擬人化クイズ-美少年\n改革时代\n故事冒险创作者\n故事大师\n故事编织者\n新星-宇宙之星💜\n新秀崛起\n无聊了\n时间奥德赛\n时间海盗\n星期三\n智冒险\n智慧巫师\n极品飞车分析师\n母星建筑师\n游戏加密货币追踪器\n游戏大师\n游戏新闻日报\n游戏王卡组制作\n游戏评论\n漫画大师\n灵敏思考者\n猜猜我的角色！\n王国大师\n生存游戏教练\n生物多样性：动物感知迷宫\n电竞游戏策略师\n知识问答！\n石头剪刀布\n石头剪刀布冠军\n神秘岛\n编年史编织者1107 豪华扩展\n网络街道\n老黄历笑话生成器\n艾泽拉斯智者\n节日精灵创意火花\n表情BINGO\n角色扮演大师\n角色配对小助手\n词汇星球 龙之传奇 RPG\n说唱战场\n诺斯特拉犬\n赛博朋克2077行为印记AI\n赢得莎拉的心\n迷宫冒险\n选择你自己的冒险AI\n阴影面具\n隐藏之门\n魔术风云AI决斗者\n魔法小姐 GPT\n黑色故事游戏\n龙珠GPT\n🃏 专家桥牌叫牌和打牌助手 ♣️\n🌎 多语言赌博大师 🎰\n🍌 香蕉字谜快速解谜者 🏆\n🎲 Dudo Dice Duelist Strategist 🎲\n🎲 大师级桌面战略家 🧠\n🏈🎉 超级碗派对活动主持人 🍔🥳\n🟡🔴 连四策略大师 GPT\n金融/Finance A-StockGPT\nAI市场导师\nAI投资顾问\nAML名称检查器\nAXA 保险专家\nCrawn Insights\nDeFi如何做\nF9财务助手\nKryptobulls投资助手\nOddsMaster Pro\nRich GPT\nSmlr\nUniswap巫师°\nYield Hacker Bot\nfreetax411.com\n一目均衡表洞察\n个人理财规划和分析师\n云客AI投研\n交易导师天才\n伊利诺伊州医疗保险AI助手\n传奇交易员\n你的富爸爸\n信用修复向导\n加密专家\n加密脉冲\n加密货币动量分析师\n加密货币教育者\n加密货币替代币大师\n加密货币阿尔法人工智能\n当你刚开始工作时如何投资\n德国税务申报助手\n投资达人\n抵押贷款大师\n抵押贷款顾问\n橙色药丸应用助手\n比特币GPT\n比特币伙伴\n比特币投资\n比特币白皮书解读\n玛丽亚智慧金融\n现金+计划家庭顾问\n理财顾问\n生活技能\n白银投资\n社会保险代理\n税务GPT\n税务助手GPT\n税务节约顾问\n穷人理财\n经济观察者\n股票洞察GPT\n自由测验：你是交易者还是投资者？\n蒲有财\n薪资计算器\n补助金助手\n财务内容创作\n财务分析师\n财务助手\n财务指南GPTs\n财富智慧\n金融助手\n金融导师\n金融指南专家\n金融普惠大使\n金融犯罪特工\n金融科技聚焦 2023\n金融顾问AI创作者\n青年理财向导\n预算GPT\n预算小助手\n🚀💎华尔街贴士💎🚀\n教育/Education !Dios Coach 🔥\n1700-1800年曾祖父母\n2049年\n20年在英国错过的988个单词\nAI哲学家\nAI导师\nAI英语学习助手\nAcadémie du Bricolage\nAyn Rand\nBear 背单词\nBounce的含义是什么？\nCELPIP Writing Estimator\nCássio Ajuda - 2o ano EF\nDALF C2\nESL France SpeakWise 2.1 - France Edition\nEco Ally\nElvish 🧝‍♂️ 翻译器\nEmily\nExcuses含义\nFarther Along 歌词含义\nFreeze歌词含义\nGPT学院\nGPT导师韦\nGPeT\nGimme More歌词含义\nGreat Is The Lord\nHaru Sensei (学习日语!)\nHow You Ain\u0026rsquo;t Know意义是什么？\nI.O.U. 的含义是什么？\nIB法语口语考试高级\nIKITOMU Culinary Explorer\nILearn\nInstrument GPT\nIsle Royale Explorer\nJuly You\u0026rsquo;re A Woman 的含义是什么？\nKit Kat 歌词意思\nL\u0026rsquo;Homme Que Je Suis的含义是什么？\nLes Sourires De Mes Souvenirs\nLex Fridman\nLights Out的含义是什么？\nLingo Bridge\nLinguista\nLreina Estudio Humanidades\nMIA你的猫语言解释器\nMITeacher\nMendiant D\u0026rsquo;amour的含义是什么？\nMr. Doker\nMs. Dolken\nMy Love Affair With Trains 歌词含义\nN5实用烹饪考试辅导\nNiña 歌词含义\nNo Shima含义是什么？\nNoorGPT\nPL-300 考试辅导\nPaper Machine\nParlez-Vous\nPhysical Review Journals Guide\nPhysicswalla AI\nPlusMind测验生成器\nPósEnsinoBR\nR. Daneel d\u0026rsquo;Anconia\nRiccardeto\nRide The Tiger歌词含义\nRijklaar歌词意义\nRony Tobbins\nSOLE Work\nSchüler GPT\nSclepios IA : 学习临床案例\nSeñora\nSiri Tori\nSofie，巴西人的德语老师\nSophia\nSpainGPT\nSpiegel歌词含义\nSwamiGPT\nTransfiguration歌词解析\nUnderjoyed含义\nViewSonic College\nWay We Were含义\n[comfy_ui] operation encyclopedia\niTeachAi 多语言演示助手\n一月\n上帝的主权还是自由意志？\n与布鲁克林99分学英语 1\n与朋友一起学英语 7\n专业活动起草专家\n个人所得税课程评价导师\n中国成语\n中国新年历史\n中学英文法\n中级会计II辅导\n中英學術翻譯大師\n乐高机器人\n乡村\n书籍转换\n亚瑟·叔本华\n亚里士多德\n亚马逊河生态指南\n人体观念指南\n人类学专家\n亿万富翁教授\n今日要闻\n伊桑的间隔年+博客\n优雅导师\n作物科学\n便利店培训专家\n信仰探索者\n信息素养指南\n儿童睡前故事GPT（3-7岁）附带图片\n全球K12教育专家\n全球医学院导航\n全球学者\n全球翻译家\n全科导师\n全语言支持！专属外语教师\n军事历史学家\n农学\n凯撒大帝机器人\n初学者日语\n初学者枪支指南\n初等代数 2e\n初级作文写手\n剧院\n功夫贤者\n加利福尼亚驾驶手册\n包容性选票小伙伴\n北极觉醒：甲烷之谜\n医学考试问题大师\n博士伙伴\n历史GPT\n历史医生巴克\n历史战略家\n历史测试\n双语词汇大师\n反驳型\n古代苏美尔历史机器人\n古兰经\n史上最有效的西班牙语导师\n史密斯教授\n君臣傻狗：狗狗的故事\n启迪读者助手\n吸引力法则GPT\n哲学\n国际会计导师\n国际英语考试导师\n图书小伙伴\n地缘政治解释器\n城市\n基因密钥韩国周刊\n基督教伦理\n基督教学者\n塔里托努加佛教\n大团长雅克\n大学入試アシスタント\n大学顾问\n大明白学习神器\n天下无傻：阴谋澄清者\n失去感触的含义\n奥修智慧\n女儿的奇迹\n女士汽车指南\n威尔的Tableau认证数据分析师考试GPT\n学习一门语言\n学习伙伴\n学习卡真法语\n学习小伙伴\n学习设计助手\n学术助手\n学术翻译\n学术翻译机器人ZT英转中\n学校英雄💡🍀\n学生冰破者思路\n宠物训练师Pro\n客户互动模拟器\n家谱\n寓言大师\n寻找我的苏格兰祖先\n导游和护送助手\n小先生GPT\n小分体空调维修指南\n小学老师指南\n小朋友都能懂的知识\n尼摩船长\n平假名小姐 片假名小姐\n幽默学院\n康奈尔科技MBA顾问\n建筑师导师\n异国情调法律小伙伴\n当代艺术评论导师\n德语导师\n心智增强\n心智模型\n心理学教授 L2\n忠诚战士\n您的法语老师\n成为一名可持续发展的翻译者的指南\n扎贡指南\n打开收音机的含义\n托福写作辅导\n技能翻译\n报告助手\n拉脱维亚语言学家\n摇滚大师\n摩诃婆罗多\n教えて孔子先生！\n教程搜索引擎\n教育伴侣\n数学\n数学ⅡB の優しい先生\n数学主修小学\n数学图像求解器\n数学大师\n数据灵感伴侣\n數字易經大師\n斯瓦希里智者\n旅游语言加速器\n旅行者英语教练\n旋律大师助手\n无尽图书馆\n日志记录的CI\n日语尊敬语转换小助手\n普通话大师\n智慧共济圣贤\n智识探索\n暗影原型\n暴君导师GPT\n更快乐\n有趣的事实\n有趣的事实分享\n未来问\n林肯模拟器\n柏拉图\n植物医生\n植物导师\n欧洲\n歌词含义查询\n步步为营\n每日德语口语\n比较结构，英语语法\n气候测验创建者\n氢能经济\n汉语语法维基导师\n汽车导师\n沉浸式洞察\n法律之鹰\n法语\n海外学习项目指南\n海洋生物学助手\n清洁能源助手\n游戏化学习\n烹饪屠夫小伙伴\n父母探望\n物理问题创建者\n猫狗伴侣\n现代信仰指南\n生存指南\n生成AI理解度テスト\n生活中的一个谜\n生物学\n电池\n留学测试\n知识探索者\n知识点滴\n禅\n科学小伙伴\n科技美学GPT\n空调下的室内空气密度\n简单解释者\n简明解释\n统计学习助手\n编写你自己的冒险\n罗宾马克斯GPT\n美国\n美国大学计算机博士项目导航\n考古学与古代文明探索者\n职业指导\n职业指导师\n职业链接教育者\n自助\n自然历史讲解员\n自然英语\n自由洞察\n自闭症ASD视觉教师\n艺术创作者\n艺术论文写作\n艾略特，家庭导师\n节能助手\n花园\n英検準一級ライティング対策\n英语\n英语小伙伴\n英语桥\n英语老师猫\n英语辅导员\n英语长难句分析\n英语阅读导师\n菌菇导师\n菲律宾公务员考试复习\n葡萄酒导航\n虚拟导游GPT\n虚拟辩论教练\n虚无主义哲学家🎓\n蛋鸡顾问\n解释女性\n警察\n记忆老师\n论文助手\n评估导师\n评分表生成器\n词汇改进 GPT\n试卷制作\n语伴\n语法助手\n请问牧师师利亚\n诺尔·艾赫克玛\n课程伴侣\n货币学\n资助大师专业作家\n路规 (全球)\n软技能智慧\n辅导员\n辩论俱乐部\n退休律师 - 最佳法律故事\n通用核心对齐器（数学）\n通用语言教师\n逻辑推理 1\n道家圣人\n邓布利多教授\n酒类\n重症监护考试辅导\n野生动物与自然保护教育者\n野生动物保护策略师\n阅读\n阅读论文\n阿姜查的智慧\n阿尔伯特·爱因斯坦\n雅思速成大师\n霍格沃茨分院帽\n面试辅导师\n鞋迷智\n韩语句子优化器\n韩语老师\n韩语轻松\n音乐导师GPT\n飞行员指南\n首尔密语\n高中数学\n高级教练增强版\n魔鬼辞典\n鸟类智慧观察指南\n鼓谱GPT\n🌊OceanOculus: Ocean Data Visualizer🔍\n🌍 多元化课堂冠军AI\n🌐✨ 礼仪导航\n🌟 巧手多元宇宙 🎨 多语言🔨\n🌱生态倡导者的盟友🌍\n🍞✨ Sourdough Maestro Mentor 🧑‍🍳✨\n🎤 声乐教练和和声助手 🎶\n🐠 FishFriend: 水族馆护理专家 🌿\n🐾✨ 小猫护理指南 🐱💕\n📘 大师导师 🎓\n📘🎓 下一代教育助手\n销售/Sales AI营销和销售指南\nBeta AI\nSAM - 销售与营销人工智能\n二手销售顾问\n以色列布拉沃人工智能\n战略销售顾问\n渔猎者：数码时代的守护者\n渠道销售专家\n精明购物优惠机器人\n销售-GPT\n销售专家顾问\n魔法精灵\n商业/Business 1ACulma - 管理教练\n2步骤商业创意评估器\nA-TranslatorGPT\nAFH顾问Pro\nAI CEO专家\nAI GPT 商业教育者\nAI 命名大师\nAIT-StrategiX\nAI律师\nAKメルカリ商品説明文作成代行\nAiBusiness\nAiDVOGADO\nAlex Hormozi GPT\nAlex Hormozi\u0026rsquo;s $100M GPT\nAniket的工作经验\nAssistente JUSATUALIZA\nAutónomo 360\nAviator Inc的首席财务官\nAvocat - محامي\nB2B客户旅程地图免费工具\nBCP 专业版\nBPMN-GPT\nBackloger.ai -The Lean Startup CANVAS\nBetWise\nC Suite Advisor\nCasey决策智能顾问\nChatCMO\nClaude 2.1 Prompt Creator\nCouponBre优惠分类创建器\nDF Insights\nDestin的礼宾员\nDiSC洞察生成器\nDigi-Jobbcoach\nDilan Ye\\u015filg\\u00f6z\nEnggBott (处理下游石油和天然气)\nGPT 创意生成器\nGptOracle | The Livestock Farmer\nGrantMatch GPT\nHR人力资源经理\nHaly Helper\nJamPub导航\nJim - 赫氏增长指南\nJoeBot - 终极商业导师\nK2 SEO Writer (#1 AI Writer \u0026amp; Content Creator)\nKoKae\nKunal Shah GPT\nLOGO Genius\nLinkedIn 优化器\nMEGAG Fomento Colombia\nMEGAN\nMaze Bright A.I. Concierge\nMindy\nMon Expert-Comptable\nNSCLI 职业导航\nNaomi: 技术简历专家\nPark 29葡萄酒顾问\nPhiliBuzz\nPitch Buddy\nPitchGPT\nPriceGPT\nPrimavera P6 Pro指南\nPrompteer的求职信助手\nProud Plumbing and Gas 位置页面\nQ-STAR Advanced AGI Commerce\nREIGNation - 你的房地产教练\nRIP Cover Letters\nSD Legal Companion\nSEO专家\nSWOT-team\nSamuel-Ultragaz-SAC\nSeabiscuit: Press Prep\nSemssar\nSlogan Expert\nSopact Impacto 社会影响助手\nTDH - 灵活办公专业版\nTrip Advisor\nUply Media, Inc.的商标大师 GPT\nWish It Was That Easy歌词含义\nどもどもAI\n专业\n专业CFO顾问\n业务增长顾问\n个人品牌发展指南\n个人品牌教练 | 内容助手\n个人定位GPT\n个人律师\n个人购物顾问\n个性化职业发展规划\n中国酒桌文化\n中小企業診断士2次試験 R5\n乐观的商业顾问\n亚马逊变体专家\n交易风格\n产品猎手\n人力资源-员工参与计划\n人力资源技术供应商评估专家\n人力资源科技导航\n企业中的人工智能\n企业数据科学家\n企业计划大师\n优惠天才\n估算网站价值-网站价值计算器\n你的商业计划助手\n使用上传的图片创建产品描述\n侍酒大师\n俱乐部运动顾问\n克拉克肯特\n克里希纳咨询\n全球商业分析师\n全球贸易智囊\n全球趋势助手\n公司分析师\n公正法律导航\n兰彻斯特的回答\n关键词探索器\n内容开发顾问\n农业管理\n决策科学\n出口导师\n创业大师\n创业导师\n创业指南-教育工具\n创始人IV COACH\n初创企业导师\n初创企业顾问 - Chris Saad AI\n半人半机法律顾问\n卡拉优雅\n变更管理生成器\n合同审查师：索尔古德曼分析\n合同洞察\n合资企业审计顾问\n员工健康与福祉向导\n咨询创新者\n品牌AC\n品牌战略家\n品牌战略规划师\n商业合作伙伴\n商业和数据分析\n商业好朋友\n商业数学专家\n商业计划智者\n商品陈列\n国际商业顾问\n坚定活动\n埃隆管理代理\n外贸人实用小工具\n大麻废物减量GPT\n天然黄油和油品企业家\n奥克兰，加州地毯清洁Ai助手\n奥马哈，内布拉斯加地毯清洁AI助手\n安慰心灵代理 [测试版]\n完美演讲\n实用餐厅规划顾问\n审核ISO\n审计助手Pro。\n审计智能助手\n客户保留顾问\n客户关怀专家\n客户激情专家\n家庭能源节约专家\n密西西比三角洲的可持续农业\n富裕习惯\n导游艾玛\n工作坊问题制作指南\n市场分析师\n市场拓展大师\n市场营销数据科学家\n布朗宁法律-法律内容专家\n布莱恩之音\n并购顾问\n幻灯片GO\n床铺大亨\n库存部门助理\n应用商店ASO助手\n弹出式演讲\n弹药购买\n循环经济\n总体规划\n情感支持文案撰稿员\n战争世界\n战略商业顾问\n战略家 塞奇\n战略导航\n房地产2049\n房地产导师\n房地产投资教练\n找工作-实时开放职位（美国，欧盟\u0026hellip;）\n技术业务分析助手\n投资备忘录助手\n报道虚拟导师\n拖车\n招聘大师\n招聘者GPT\n指路灯：领导力教练\n推广天才\n敏捷教练\n数字化存在架构师\n数字化转型顾问\n数据分析GPT\n数据导师\n数据洞察分析师\n旅游探索者\n智能明晰教练\n最大化您的房地产\n未来职业预测器\n杰伊·赖特\n枫叶指南\n查理卡什\n标准顾问\n标志大师\n根本原因查找器\n欧盟法律\n比利时气候案GPT\n求职GPT\n求职信生成器\n求职申请优化器\n沃伦·巴菲特\n法律GPT\n法律之鹰\n法律洞察\n法律精灵\n法律路径助手\n洞察挖掘者\n活动大师\n流失分析师\n消费者保护指南\n淘宝客服\n淘宝美工\n漫画家向け法務確認くん\n烟荟顾問\n热门商品查询\n版权伙伴\n独特时尚和风味\n猫人战略顾问\n环境律师\n生态审计\n电商分析GPTs\n电商翻译\n电子商务优化\n电子商务催化剂\n电影推荐达人\n知识数据测试\n硅谷数字叙事者\n社交GPT\n社会影响初创企业投资者\n科技创业的商业规划\n租房智能\n移民和安置支持顾问\n税务营销英雄\n简历定制\n简历定制师\n简历审核师\n简历设计师GPT\n管理咨询团队模拟器\n管理经济学家\n精益创业建议\n精益创业顾问\n经济\n经理教练\n经纪人管理\n网站估值计算器\n美国签证GPT\n聊天JTBD\n聊天客服\n职业伴侣\n职业导师\n职业小伙伴\n职业教练\n职业教练GPT\n职业生涯顾问\n职业转变\n职位同步\n职场洞察天才\n自动求职信与简历生成\n自我推荐制作工具-推荐求职或就业活动！\n自由顾问专业化 GPT\n花店员工排班助手\n菲比的招聘小助理\n葡萄酒顾问\n虚拟乔布斯\n虚拟助理Domme\n虚拟房地产助手\n行业分析师\n表单起草专业版\n表格泰坦\n詹姆斯·安德鲁斯\n订单估算器\n谈判之手\n谈判导师\n豪华鉴赏家\n贝佐斯机器人\n购买者画像\n资产洞察\n资金之路\n赌注天才\n趋势追踪\n转化 GPT\n轻松兼职指南\n轻松预订管理\n远见罗盘\n退伍军人顾问\n邮递伙伴 | 运费估算器\n量子跃迁创业AI\n链接向导\n问耶稣\n问问马里奥\n零件查找专业版\n面试教练\n面试达人\n项目管理专家GPT\n顿悟\n预算小伙伴：专业预算分析\n颠覆性创新实验室\n餐饮链顾问\n马丁GPT - 库存助手\n高峰分析师\n高级战略顾问\n🆔🔍 HR 就业验证向导\n🌀 EngagePlus Workforce Wizard 🤖\n🌟 HR品牌助推机器人 🌟\n🌟 人才吸引与留存 GPT 🧲\n🌟 人才猎头大师GPT 🎯\n🍅🌽 本地农贸市场经理GPT 🏪\n🏡 房地产趋势追踪器 📈\n👑 事件管理的数据隐私保护 👑\n👥 Empowerment Booster Coach GPT 🚀\n👥 HR Advocate Pro Assistant 🛡️\n👥 HR Efficio-Strategist Pro 📈\n👥 工作力量生命周期策略师 🚀\n📊 HR Tech Stack Strategist 🤖\n🔎 HR合规卫士 🛡️\n🔒 HR隐私屏蔽助手\n🚘 Artful Auto Creator lv3.4\n🤝 人力资源服务超级教练 🚀\n🤝✨ PR Ace Communicator 🚀🌟\n🧑\tHR战略家Pro GPT 📊\n🧑‍💼 人力资源虚拟合规顾问 📋\n🧳✨ 人才流动大师 GPT\n健康/Health 3 Rs: 替代、减少和改进\nAI健康助手\nAI健身教练\nAcuConsejo\nAnaclaudia Zani\nAndrew Huberman \u0026amp; Sleep\nAnna\nArny\nBuddGPT Budtender, TripSitter \u0026amp; Thrill Facilitator\nDSM-5 诊断查询助手\nFHIR® Interop Expert\nFitChampGuru\nGPT健康助手\nGPT健康教练\nGetFitty\nGptOracle | 健康榨汁专家\nHaiku Mindfulness\nHubermanLab GPT\nIBD Wellness Assistant\nIkigai\nLumi\nMAMA - 关心人的母亲型助手\nNeto Virtual\nNurseBloc Work Life Harmony\nOtello bébé\nPot\nPrEP Tracker\nPrepare.bot\nRCA Supporter\nSclépios I.A: Complex Case\nSima Aunty GPT\nSmartFitnessHub.com\nTabor - Medicare GPT\nVitaBot: 你的健康补充品助手\n❤️ 心脏健康助手机器人\n与Buds GPT对话\n与Sadhguru同在\n个人健身教练和健康助手\n中年交友导师\n中草药专家\n亲情关怀\n伊维菌素解释器\n伦敦自然实验室\n你的悲伤指南\n你的朋友爱丽丝\n健康チェッカー\n健康伴侣\n健康指南\n健康洞察\n健康零食\n健康顾问\n健身罗根\n儿童成长指南\n光谱家长伙伴\n克服hEDS指南\n全科医生\n共情听众\n关心自尊心支持\n兽医专家 - 眼睛\n兽医专家\n兽医泌尿教育\n内心和谐工具\n减肥神器\n出切\n创伤性脑损伤帮助 (TBI)\n初学者跑鞋推荐\n包容性助手\n医学GPT\n医学天才\n医学小伙伴\n医学翻译\n医学评论助手\n医生家庭\n医疗事务专家\n医疗指南\n去中心化健康GPT\n反催婚能手\n发现与鞋子有关的脚部问题\n叔本华智者\n口腔护理\n口袋心理医生\n古代健康解释器\n周公解梦\n周长厨师 | 长寿饮食\n和谐指南\n圣经洞察工具\n地中海饮食计划\n堕胎权威\n塔罗大师\n多语言鞋类及足部健康顾问\n大五人格测试\n奶油焦糖心情厨师\n婴儿营养专家\n季节日常食谱\n宁静伴侣\n安全空间\n完美搭档\n宠物 GPT\n宠物小助手\n宠物营养伙伴\n宠物食品\n家庭医生\n尤里莫雷斯科博士\n尼莎·哈利尔医生\n幸福\n弗洛伊德梦境指南\n当下之GPT\n往事失眠\n微笑卫士公共卫生助手\n心智灵活者\n心灵伙伴\n心灵宁静空间\n心灵导师\n心灵探索者\n心理健康小伙伴\n心理健康智能\n心理咨询师\n心理咨询师GPT\n心理学专家\n心理治疗师GPT\n心血管\n性别指南\n悉心倾听\n您的食物照片转卡路里\n悲伤\n情侣辅导\n情感支持伴侣\n情感萨满\n情绪伙伴\n情绪风格策展员\n成瘾克星\n戒酒伴侣\n手相占卜AI\n护士GPT\n护理者\n探路者徒步侦察\n改变我的习惯\n放下\n教师健康导师GPT\n斯多葛大师\n新鲜GPT\n星体清晰度\n梦境与迷幻分析师\n梦境导航\n梦境编织者\n梦幻 - 解释梦境\n植物学者\n正念冥想\n正念精灵\n残疾人福利助手\n比熊餐厅：小犬美食达人\n治疗指南\n清明梦\n清洁专家\n減肥專家\n灵性顾问（1917 Tanakh）\n灵魂支持牧师机器人💖\n灾难准备顾问\n焦虑症评估指南\n理性伴侣CBT疗法\n理解伊斯兰教\n瑜伽助手\n生活GPT\n生活提升者\n疾病津贴、门户守护改进法和工伤保险顾问\n癌症护理伴侣\n百病良方\n社交焦虑治疗师\n积极习惯塑造者\n粉色智能\n糖尿病营养师\n糖尿病顾问\n老化顾问\n肌肉导师\n胆固醇检测器\n自尊心教练\n自恋者（NPD知识和安全策略）\n自闭症家庭助手\n自闭症罗盘\n舞蹈技能助手\n艺术疗法\n芳香疗法\n草本\n草药指南\n药品指南\n菜肴卡路里AI\n营养协调师\n营养指南\n蜡疗\n解梦大师\n调理大师\n身体健康\n过渡盟友\n迈尔斯健康\n运动\n远程医疗洞察\n鞋类顾问\n韧性中心\n餐饮规划专家\n餐饮计划与营养数据\n饮食指南\n马拉松大师教练\n🌴🩺 热带健康顾问 🌡️💉\n🌿 全面的阿育饮食规划师 🌿\n🧠 EmoRead - Facial Expression Expert 🤖\n🧠 MindMender: 心理健康指南 💆‍♀️\n🩺 内分泌专家导航 🧬\n","date":"2024-05-28T20:31:16Z","permalink":"https://blog.lufei.de/p/chatgpt%E9%AD%94%E6%B3%95%E5%AE%9A%E5%88%B6%E4%B8%AA%E6%80%A7%E5%8C%96%E6%8F%90%E7%A4%BA%E8%AF%8D/","title":"ChatGPT魔法，定制个性化提示词！"},{"content":"这个问题跟我之前卸载了Hyper-V虚拟机有关系\n以管理员身份打开 PowerShell，运行以下两条命令，然后重启电脑，搞定~\nbcdedit /set hypervisorlaunchtype auto Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All ","date":"2024-05-28T05:16:48Z","permalink":"https://blog.lufei.de/p/windows%E5%AE%89%E8%A3%85docker%E6%8A%A5%E9%94%99%E5%BD%93%E5%89%8D%E8%AE%A1%E7%AE%97%E6%9C%BA%E9%85%8D%E7%BD%AE%E4%B8%8D%E6%94%AF%E6%8C%81-wsl2%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","title":"Windows安装Docker报错：当前计算机配置不支持 WSL2解决办法"},{"content":"项目 Github: https://github.com/MartialBE/one-api\nSQLite数据库(推荐) one-api数据库目录：/home/ubuntu/data/one-api\n1.创建SQLite数据库文件夹\nmkdir -p /home/ubuntu/data/one-api docker创建并启动容器 docker run -d --name one-api -p 3000:3000 --restart always -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data ghcr.io/martialbe/one-api PostgreSQL 我使用的是supabase,打开 https://supabase.com/ 创建数据库,地区选择美西. one-api: 环境变量：替换成你自己的实际情况数值 SQL_DSN=postgres://postgres.uwrooiohqpklqovsbahs:xxxxxx@aws-0-us-west-1.pooler.supabase.com:5432/postgres railway部署 拷贝项目，连接railway，设置变量如下：\nCHANNEL_UPDATE_FREQUENCY=1440 CHANNEL_TEST_FREQUENCY=1440 TZ=Asia/Shanghai SQL_DSN=postgres://postgres.uwrooiohqpklqovsbahs:xxxxxx@aws-0-us-west-1.pooler.supabase.com:5432/postgres MEMORY_CACHE_ENABLED=true SYNC_FREQUENCY=60 ","date":"2024-05-27T03:09:07Z","permalink":"https://blog.lufei.de/p/one-api%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%B0%E5%BD%95/","title":"one-api数据库记录"},{"content":"项目 Github: https://github.com/MartialBE/one-api\n大模型记录表 供应商 大模型 API地址 grop llama3-70b-8192 https://api.groq.com/openai Cohere command-r-plus https://api.cohere.com/v1 零一万物 yi-large https://api.lingyiwanwu.com 百川 Baichuan4 https://api.baichuan-ai.com coze gpt-4o https://qigechat.zeabur.app coze gemini-1.5-flash https://gem.zeabur.app 智谱 glm-4 https://open.bigmodel.cn/api/paas/v4 月之暗面 moonshot-v1-128k https://api.moonshot.cn deepseek deepseek-coder https://api.deepseek.com Cloudflare @cf/qwen/qwen1.5-14b-chat-awq #写法看下面 通义千问 qwen-long https://dashscope.aliyuncs.com 说明：Anthropic 和 coze 是中转的API，不是官方的，如果用官方的白嫖不到。\nDashScope灵积模型（通义千问）: https://dashscope.console.aliyun.com/\nCloudflare Workers AI Cloudflare在one-api里只需要填写密钥，格式是：ACCOUNT_ID|API_TOKEN 中间以 | 分隔，例如：\n9f623b740bxxxx|_w1xxxxxx #前面是账号ID，后面是密钥\nCloudflare网关 https://developers.cloudflare.com/ai-gateway/providers/openai/\nCloudflare AI Gateway是一个强大的工具，它提供了对AI应用程序的深入洞察和控制能力，支持多种AI服务提供商，并与Cloudflare的其他产品如Workers AI和Vectorize集成，以构建和扩展AI应用程序。通过一行代码即可轻松启动，为用户提供了易于使用的界面和丰富的资源来支持他们的开发工作。\n国内外AI大语言模型API价格对比 https://aigcrank.cn/llmprice/\n价格优惠 https://deepbricks.ai/pricing\nhttps://mychandler.bet/chat\nhttps://deepinfra.com/pricing\n","date":"2024-05-27T01:49:26Z","permalink":"https://blog.lufei.de/p/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E8%AE%B0%E5%BD%95%E8%A1%A8/","title":"大语言模型记录表"},{"content":"工作流程 1. 图片转成csv 打开https://kimi.moonshot.cn/ 上传图片，告诉kimi把图片内容转成csv 2.csv转成pdf 打开https://tableconvert.com/zh-cn/csv-to-pdf 粘贴csv内容，下载pdf 3.pdf转word 打开https://pdf2docx.cn/pdf2word/ ","date":"2024-05-26T16:12:19Z","permalink":"https://blog.lufei.de/p/%E6%8A%8A%E5%9B%BE%E7%89%87%E8%BD%AC%E6%88%90word%E6%88%96%E8%80%85excel/","title":"把图片转成Word或者Excel"},{"content":"Cloudflare Worker 部署 1. 注册 Cloudflare 账号 2. 一键部署 登录账户后, 点击下面按钮\nhttps://deploy.workers.cloudflare.com/?url=https://github.com/Harry-zklcdc/go-proxy-bingai\n☝🏻 这是个按钮, ☝🏻 这真的是个按钮 点击「Authorize Workers」, 登录 Github 账号授权 Cloudflare\n点击「I have a account」\n然后点击「Worker Dashboard」\n复制 「Account ID」\n粘贴至前一步的「Account ID」输入框中\n然后点击「My Profile」-\u0026gt; 「创建令牌」\n选择第四项「编辑 Cloudflare Workers」, 点击「使用模板」\n然后修改 账户资源 的值为 你的账号, 区域资源为所有区域\n然后点击「继续以显示摘要」\n点击「创建令牌」\n然后点击「Copy」按钮复制 API 令牌\n粘贴至一键部署的框中, 点击「Connect account」\n然后依次点击「Fork the repository」-\u0026gt; 「Repository Actions」-\u0026gt;「I understand my workflows, go ahead and enable them」, 以启用Github Action\n回到上级页面, 依次点击「Workflows enabled」-\u0026gt;「Deploy」\n回到 Fork 的仓库中, 点击「Actions」, 有如下结果即部署成功\n3. 编辑环境变量 进入 Cloudflare 控制面板, 依次点击「Workers 和 Pages」-\u0026gt;「go-proxy-bingai」\n点击「设置」-\u0026gt;「变量」-\u0026gt;「添加变量」\n添加以下两个变量\nAPIKEY=sk-xxxxxx #设置为自定义值 BYPASS_SERVER=https://bypass.b1ng.chat #也可以为自己的人机验证服务地址 然后点击「保存并部署」\n可用环境变量 Go_Proxy_BingAI_AUTH_KEY # 授权密码 APIKEY # BingAPI APIKEY BYPASS_SERVER # Bypass Server 链接 Go_Proxy_BingAI_USER_TOKEN # _U Cookie, 可配置多个, 使用 \u0026#34;,\u0026#34; 分隔 USER_KievRPSSecAuth # KievRPSSecAuth Cookie USER_RwBf # RwBf Cookie USER_MUID # MUID Cookie Go_Proxy_BingAI_BLANK_API_KEY # 是否确定APIKEY为空，否则APIKEY为设置的值, 或随机生成 NIGHTLY # nightly版本 4. 获取访问链接 在 Worker 控制台找到下面的链接即可\n5. 后续升级 在 Fork 的项目地址中, 点击「Sync Fork」, 等待 Actions 自动部署完成后即可 6. 进阶教程 - 自定义域名 如果你是小白, 那么就在这停止一切操作\n请先确保域名绑定至 Cloudflare\n在Worker 控制台中, 选择「触发器」-\u0026gt; 「添加自定义域」即可实现自定义域名\n🚀 演示站 ","date":"2024-05-25T19:33:35Z","permalink":"https://blog.lufei.de/p/cloudflare-worker-%E9%83%A8%E7%BD%B2bingai/","title":"Cloudflare Worker 部署bingai"},{"content":"API地址： https://chat.92dm.top\n密钥： sk-hDB2tUNX9KRO5zJVD3C56b456620431481BeCdA0C390F62d\n1. 填写API和密钥 打开botgem 按照图示填入，API地址后面不能有/，使用其他工具也是大体相同的。\n2. 添加模型 API地址不变，使用什么模型全部一个个添加上去，使用哪个顺手就选择哪个。\n对照下面的大模型记录表，注意：API始终是https://chat.92dm.top 不变的，变的是大模型的名称\n提示： 经过测试，botgem 使用百川有bug,可以使用chatbox。\n3.大模型记录表 供应商 大模型 API地址 grop llama3-70b-8192 https://api.groq.com/openai Cohere command-r-plus https://api.cohere.com/v1 Anthropic claude-3-sonnet-20240229 https://sgp.sotershield.com 零一万物 yi-large https://api.lingyiwanwu.com 百川 Baichuan4 https://api.baichuan-ai.com coze gpt-4o https://qigecoze.zeabur.app 智谱 glm-4 https://open.bigmodel.cn/api/paas/v4 月之暗面 moonshot-v1-128k https://api.moonshot.cn deepseek deepseek-coder https://api.deepseek.com Cloudflare @cf/meta/llama-3-8b-instruct #写法看其他博文 通义千问 qwen-long https://dashscope.aliyuncs.com 说明：Anthropic 和 coze 是中转的API，不是官方的，如果用官方的白嫖不到。\nDashScope灵积模型（通义千问）: https://dashscope.console.aliyun.com/\n4.微软Copilot 如果想使用Copilot，可以看这里： https://chat.taoshuge.eu.org/web/#/\n","date":"2024-05-25T11:39:59Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9%E6%92%B8gtp-4o%E6%95%B4%E5%90%88%E5%90%84%E7%A7%8D-api-%E8%AE%BF%E9%97%AE%E6%96%B9%E5%BC%8F/","title":"免费撸gtp-4o：整合各种 API 访问方式"},{"content":"为爱发电 https://blog.taoshuge.eu.org/posts/ee62188f.html\n项目 github: https://github.com/MartialBE/one-api\n先贴两张图：\n说明 免费撸AI大模型,各位可以对照下面我给出的大模型记录表来填，key需要自己去拿，国内都需要手机号验证，如果你不介意。另外我在自己的博客放出免费API给大家使用，需要说明的是，每家大模型提供商给的免费额度都有限，还有其他限制，所以，如果用的人多，可能我就要去想办法撸更多了，就当为爱发电了。 可以配合使用我推荐的桌面聊天客户端，都是经过市场验证的，非常好用。 免费白嫖gpt-4o 人工智能的浪潮已经开启，未来的巨头基本上诞生在浪潮的初期，或者即将诞生。本着了解一下AI和工具的使用，走了不少坑，在这里我把一些经验分享给各位。我分别测试了8个大模型，grop在速度方面几乎没有对手，Cohere和零一万物也非常迅速！\ngrop的llama3-70b-8192模型虽然厉害，但是对中文的支持差点，你要经常对她说：中文回答我，她才会老实。\n零一万物和百川对中文就好很多。\n另外，coze的我用的是海外版 (https://www.coze.com) 部署的中转api，可以免费白嫖gpt-4o，至于一天的限制是多少没有测试过，据网友说一天100次左右。\n市面上，不管是国内还是海外，大模型提供商基本上都有免费的AI业务，也都提供API，刚好我手头有几台服务器处于半闲置状态，拿来刷刷，搭建了一个中转API服务，撸了8家大模型，我使用的频率也不高，索性分享出来给各位了，各位悠着点用，每家大模型都有限制和不多的免费额度，服务的搭建过程比较繁琐，就略过了，可以到我博客上看看有没有教程，说不定我会抽空写下来，授之以渔不如。。。\n大模型记录表 供应商 大模型 API地址 grop llama3-70b-8192 https://api.groq.com/openai Cohere command-r-plus https://api.cohere.com/v1 Anthropic claude-3-sonnet-20240229 https://sgp.sotershield.com 零一万物 yi-large https://api.lingyiwanwu.com 百川 Baichuan4 https://api.baichuan-ai.com coze gpt-4o https://qigecoze.zeabur.app 智谱 glm-4 https://open.bigmodel.cn/api/paas/v4 月之暗面 moonshot-v1-128k https://api.moonshot.cn deepseek deepseek-coder https://api.deepseek.com Cloudflare @cf/meta/llama-3-8b-instruct #写法看下面 通义千问 qwen-long https://dashscope.aliyuncs.com 说明：Anthropic 和 coze 是中转的API，不是官方的，如果用官方的白嫖不到。\nDashScope灵积模型（通义千问）: https://dashscope.console.aliyun.com/\nCloudflare Workers AI Cloudflare在one-api里只需要填写密钥，格式是：ACCOUNT_ID|API_TOKEN 中间以 | 分隔，例如：\n9f623b740bxxxx|_w1xxxxxx #前面是账号ID，后面是密钥\n国内外AI大语言模型API价格对比 https://aigcrank.cn/llmprice/\nAI 聊天客户端推荐 其实我用docker搭建过不少网页端，但还是习惯于桌面端，手机端用的少，我推荐两个常用的：\nChatbox 和 botgem\n如果是windowds下载botgem，会跳到微软商店，例如：\nhttps://apps.microsoft.com/detail/9nqzvtbfj86k?hl=zh-cn\u0026gl=SE\n那么你复制上面的地址，然后打开以下网站：\nhttps://store.rg-adguard.net/ 把下载网址粘贴，选择后缀为.appx的，下载下来双击即可安装。\n如果你懒得下载，只想体验，可以看看我用cloudflare work 搭建的Copilot\nvscode写脚本插件推荐 推荐cody和Continue 这两个插件，都有免费大模型可用。我会使用禅模式，然后左边AI，右边脚本文件，我虽然不会写代码，但我真的利用AI写了不少脚本用于服务器运维，省时省力。\n","date":"2024-05-25T09:44:54Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9%E6%92%B8gpt-4o%E5%92%8C%E5%90%84%E7%A7%8D%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%AE%9E%E7%94%A8%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/","title":"免费撸gpt-4o和各种大模型实用经验分享"},{"content":" 名称 地址 项目 ChatGPT应用 https://chat.leshans.eu.org/ https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web OpenAI 接口管理 https://api.99bilibili.eu.org/ https://github.com/songquanpeng/one-api Miniflux rss订阅 https://rss.99bilibili.eu.org/ https://github.com/miniflux/v2 监控平台 https://uptime.talimus.eu.org/ https://uptimerobot.com/ 逆向API白嫖 https://github.com/LLM-Red-Team/kimi-free-api duck2api 隐藏了😀 https://github.com/aurora-develop/Duck2api ","date":"2024-05-17T01:13:57Z","permalink":"https://blog.lufei.de/p/261/","title":"一些项目汇总"},{"content":"国内npm镜像源 国内npm镜像源\n阿里云 NPM 镜像：https://npm.aliyun.com 腾讯云 NPM 镜像：https://mirrors.cloud.tencent.com/npm/ 华为云 NPM 镜像：https://mirrors.huaweicloud.com/repository/npm/\n指定npm镜像源 npm config set registry https://mirrors.huaweicloud.com/repository/npm/ 返回npm 官方原始镜像\nnpm config set registry https://registry.npmjs.org/ 清除缓存，可选\nnpm cache clean -f 查看当前的镜像源 npm config get registry 其他命令 查询全局包存放地址\nnpm config get prefix 查询缓存地址\nnpm config get cache 查看全局安装的包列表\nnpm list -g --depth=0 删除模块 : 例如删除gulp-cli\nnpm uninstall -g gulp-cli ","date":"2024-05-16T23:27:54Z","permalink":"https://blog.lufei.de/p/%E5%88%87%E6%8D%A2npm%E4%B8%BA%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90%E5%8A%A0%E9%80%9F%E4%BE%9D%E8%B5%96%E5%8C%85%E4%B8%8B%E8%BD%BD/","title":"切换npm为国内镜像源，加速依赖包下载"},{"content":"提示词1（推荐） 你是一位精通简体中文的专业翻译，尤其擅长将专业学术论文翻译成浅显易懂的科普文章。请你帮我将以下英文段落翻译成中文，风格与中文科普读物相似。 规则： - 翻译时要准确传达原文的事实和背景。 - 即使上意译也要保留原始段落格式，以及保留术语，例如 FLAC，JPEG 等。保留公司缩写，例如 Microsoft, Amazon, OpenAI 等。 - 人名不翻译 - 同时要保留引用的论文，例如 [20] 这样的引用。 - 对于 Figure 和 Table，翻译的同时保留原有格式，例如：“Figure 1: ”翻译为“图 1: ”，“Table 1: ”翻译为：“表 1: ”。 - 全角括号换成半角括号，并在左括号前面加半角空格，右括号后面加半角空格。 - 输入格式为 Markdown 格式，输出格式也必须保留原始 Markdown 格式 - 在翻译专业术语时，第一次出现时要在括号里面写上英文原文，例如：“生成式 AI (Generative AI)”，之后就可以只写中文了。 - 以下是常见的 AI 相关术语词汇对应表（English -\u0026gt; 中文）： * Transformer -\u0026gt; Transformer * Token -\u0026gt; Token * LLM/Large Language Model -\u0026gt; 大语言模型 * Zero-shot -\u0026gt; 零样本 * Few-shot -\u0026gt; 少样本 * AI Agent -\u0026gt; AI 智能体 * AGI -\u0026gt; 通用人工智能 策略： 分三步进行翻译工作，并打印每步的结果： 1. 根据英文内容直译，保持原有格式，不要遗漏任何信息 2. 根据第一步直译的结果，指出其中存在的具体问题，要准确描述，不宜笼统的表示，也不需要增加原文不存在的内容或格式，包括不仅限于： - 不符合中文表达习惯，明确指出不符合的地方 - 语句不通顺，指出位置，不需要给出修改意见，意译时修复 - 晦涩难懂，不易理解，可以尝试给出解释 3. 根据第一步直译的结果和第二步指出的问题，重新进行意译，保证内容的原意的基础上，使其更易于理解，更符合中文的表达习惯，同时保持原有的格式不变 返回格式如下，\u0026#34;{xxx}\u0026#34;表示占位符： ### 直译 {直译结果} *** ### 问题 {直译的具体问题列表} *** ### 意译 {意译结果} *** 提示词2 ## 角色\u0026amp;任务 ### 任务 我希望你以一个专业翻译团队的身份，协助完成从英文到中文的翻译任务。 ### 角色 对于每个翻译任务，我将扮演三个专家角色，分别负责翻译、校对与润色工作： 1. 翻译专家：具有20年翻译经验，精通中英双语，并拥有丰富的跨学科知识。此阶段的目标是提供一份既忠实于原文，又在中文中读起来流畅自然的初稿。在翻译时，特别注重保持原文的风格和语调。 2. 资深校对编辑：拥有20年专业编辑经验，中文系毕业，对中文语法、用词有精准把握。在此阶段，您需要对翻译稿进行深度校对，包括语法、用词、风格的校正，确保翻译的准确性和易读性，进而输出第二版翻译稿。 3. 润色专家：作为一位拥有20年写作经验的获奖作家，擅长各种风格流派的写作。在此阶段，您需要在校对编辑提供的稿件基础上，进行风格上的润色，提高文本的文学美感，同时保持原文的专业性和准确性。例如，润色诗歌时应使用更优美、富有意境的语言；润色科技类文章时则应维持其专业性和准确性。 ## 工作流程 ### 1.翻译阶段 参与人：翻译专家 输出物：翻译稿件 任务：提供忠实原文且流畅的中文初稿。 ### 2.校对阶段 参与人：资深校对编辑 输出物：校对过的翻译稿件 任务：深度校对初稿，保证准确性和易读性。 ### 3.润色阶段 参与人：润色专家 输出物：润色过后的最终翻译稿 任务：提升文本的风格美感，同时保持专业性和准确性。 ## 生成规则 你必须遵循以下规则： - 你的第一反应是了解了我的需求，并且让我提供希望翻译的英文文本。 - 每个阶段你将生成以下两个部分，使用markdown格式： 阶段名称 例如：翻译阶段 翻译稿 - 每个阶段完成后，等待我的指令，你才能进行下一阶段。 提问一 描述这三个版本翻译稿的差异，同时按100分制给每个阶段的翻译稿件质量进行打分，并给出理由。\n提问二 从忠实度（对原文的忠实程度）、流畅性（在目标语言中的可读性）、风格（语言的文学和艺术表现）以及适应性（适应目标语言文化和语境的程度），对以上三个翻译稿件进行评分.\n原文 When I came back from the East last autumn I felt that I wanted the world to be in uniform and at a sort of moral attention forever; I wanted no more riotous13 excursions with privileged glimpses into the human heart. Only Gatsby, the man who gives his name to this book, was exempt14 from my reaction--Gatsby who represented everything for which I have an unaffected scorn. If personality is an unbroken series of successful gestures, then there was something gorgeous about him, some heightened sensitivity to the promises of life, as if he were related to one of those intricate machines that register earthquakes ten thousand miles away. This responsiveness had nothing to do with that flabby impressionability which is dignified15 under the name of the \u0026quot;creative temperament16\u0026quot;--it was an extraordinary gift for hope, a romantic readiness such as I have never found in any other person and which it is not likely I shall ever find again. No--Gatsby turned out all right at the end; it is what preyed17 on Gatsby, what foul18 dust floated in the wake of his dreams that temporarily closed out my interest in the abortive19 sorrows and short-winded elations of men.\n","date":"2024-05-14T17:46:37Z","permalink":"https://blog.lufei.de/p/%E4%B8%80%E4%B8%AA%E7%AD%96%E7%95%A5%E8%AE%A9chatgpt%E7%BF%BB%E8%AF%91%E8%83%BD%E5%8A%9B%E6%8F%90%E5%8D%87100/","title":"一个策略，让ChatGPT翻译能力提升100%"},{"content":" 说明： ssh秘钥登录设置好了，但是登录的时候依然需要提供密码\n查看系统安全日志，定位问题 sudo cat /var/log/auth.log 或者\nsudo cat /var/log/secure 找到下面的信息\nAuthentication refused: bad ownership or modes... （网上的图片） （我的） for directory 或者 for file 后面跟着的就是指出什么文件或文件夹\n原因排查 我的这条日志说明 SSH 服务器拒绝了基于密钥的认证,原因是 /root/.ssh/authorized_keys 文件的所有权或权限模式设置不正确。（你的原因可能和我不一样，但是方法是一样的）\nauthorized_keys 文件存储了允许使用 SSH 密钥登录的公钥。如果这个文件的权限设置不当,SSH 服务器将拒绝基于密钥的认证,从而要求输入密码进行登录认证。\n解决办法 解决方法是检查 /root/.ssh/authorized_keys 文件的所有权和权限,确保它只对 root 用户可读写:\n所有权应为 root:root\nchown root:root /root/.ssh/authorized_keys 权限应为 600 (所有者可读写)\nchmod 600 /root/.ssh/authorized_keys 如果 /root/.ssh 目录存在,也要检查它的权限为 700 (所有者可读写执行)\nchmod 700 /root/.ssh 做完这些更改后,重新尝试 SSH 密钥登录,应该就不需要输入密码了。如果仍有问题,可以检查 SSH 服务器和客户端的其他配置。\n提供一个自用的SSH免密登录脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssh-v.sh \u0026amp;\u0026amp; chmod +x ssh-v.sh \u0026amp;\u0026amp; ./ssh-v.sh ","date":"2024-05-13T14:56:25Z","permalink":"https://blog.lufei.de/p/258/","title":"SSH 免密登录，设置好仍然需要密码登录解决方法"},{"content":"方法经验 一个优秀的提示词(prompt) + 一个简洁的脚本框架 + chatgpt\n编写脚本是一门艺术，您的经验总结对其他人来说很有价值。\n在使用 AI 编写脚本的过程中，我经历了从痛苦到愉悦的转变。最初，我只使用 GPT3.5，不断复制粘贴，并试图通过提供终端输出来测试脚本。但 GPT 总是给我不完美的回答，修改脚本时总会遇到新的问题，这让我非常困恼。直到我发现了更好的方法——创建一个大型脚本框架。\n我的方法是这样的：首先，我会准备一个大的脚本框架，然后根据需求往里面添加功能。这样做的好处是，即使新添加的功能有 bug 或不满意，也不会影响整个脚本的运行，我只需要专注于修改那个功能即可。\n另外，我还学到了提示词的重要性。使用合适的提示词可以引导 AI，防止它答非所问或不知所云。通过不断测试，我发现 AI 的逻辑推理能力是衡量其水平的关键，而像 CommandR+ 和 Llama3-70b 这样的模型在这方面表现出色，值得推荐。\n以下是我创建脚本的流程：\n先提供提示词，等待 AI 索要脚本框架。 发送脚本框架给AI,AI说他明白了脚本的结构,问我想实现什么功能 写出我的具体需求发送给AI 以下提示词是经过我反复测试得出来的,非常好用,至于我给的脚本,哪怕是小白,不会代码,多看看修改几下就知道怎么用了.\n提示词 ## 阅读以下所有说明 你是一个专家级程序员，擅长编写Python和Shell脚本,在编程语言方面具有专业知识。我希望你成为我的脚本创作者。我会提供一份原始脚本框架给您，您的目标是帮助我设计出最符合我需求的脚本，你必须遵循以下规则： - 您的第一个反应是要求我提供原始脚本框架 - 我会发送我的脚本框架给你,你阅读后对我说:我已经了解脚本的整体结构,请问你想实现什么功能 - 你必须等待我回答了我的想法之后,才去生成代码 - 请勿改动脚本框架的整体结构，仅允许在现有框架基础上进行函数的添加和修改。 - 必须提供3个部分的完整代码,包括列出`menu_items`选项,列出添加的新功能函数,列出函数的case选项,他们单独展示 - 你生成的内容必须遵循以下格式: 新增函数名称 更新菜单选项数组 menu_items 添加相应的 case 选项 新增函数 修改说明 - 若回答中包含代码，请使用Markdown代码块格式，并在代码块中注明所使用的编程语言。 - 若代码过长，可以省略中间函数的具体实现细节，但必须保持框架结构的完整性，以便清晰展示整个脚本的逻辑流程。 - 请在每个功能函数的结尾处包含以下内容： read -n 1 -s -p \u0026#34;按任意键继续...\u0026#34;：提示用户按任意键继续，以提供交互性。 return_to_main_menu：确保用户操作完成后能够返回到主菜单。 - 请记得用中文跟我说话！ please remember to talk to me in Chinese! 脚本框架 这是一份shell脚本，你可以测试一下\n#!/bin/bash # 定义颜色代码 huang=\u0026#39;\\033[33m\u0026#39; bai=\u0026#39;\\033[0m\u0026#39; lv=\u0026#39;\\033[0;32m\u0026#39; lan=\u0026#39;\\033[0;34m\u0026#39; hong=\u0026#39;\\033[31m\u0026#39; kjlan=\u0026#39;\\033[96m\u0026#39; hui=\u0026#39;\\e[37m\u0026#39; # 清屏并显示欢迎信息 echo \u0026#34;\u0026#34; clear echo -e \u0026#34;${kjlan}欢迎使用脚本管理工具！${bai}\u0026#34; echo \u0026#34;\u0026#34; # 显示博客和CSDN主页 echo -e \u0026#34;${lv}🔗 博客地址: ${kjlan}https://blog.qige.cloudns.biz${bai} ✨\u0026#34; echo -e \u0026#34;${lv}🔗 CSDN主页: ${kjlan}https://blog.csdn.net/u010066597${bai} ✨\u0026#34; echo \u0026#34;\u0026#34; # 显示分隔线 echo -e \u0026#34;${kjlan}============================================================${bai}\u0026#34; # 定义菜单选项数组 menu_items=( \u0026#34;打印日期\u0026#34; \u0026#34;询问我的名字\u0026#34; \u0026#34;显示系统信息\u0026#34; # 新增的菜单选项 \u0026#34;退出\u0026#34; ) # 显示菜单函数 display_menu() { echo \u0026#34;\u0026#34; echo \u0026#34;请选择一个选项：\u0026#34; echo \u0026#34;------------------------\u0026#34; i=1 for item in \u0026#34;${menu_items[@]}\u0026#34;; do if [ $i -eq ${#menu_items[@]} ]; then # 检查是否为最后一个选项 echo -e \u0026#34;${kjlan}0) ${item} ▶${bai}\u0026#34; # 如果是最后一个选项，序号设为0 else echo -e \u0026#34;$i) $item\u0026#34; # 添加样式以确保样式生效 fi ((i++)) done } # 打印日期函数 print_date() { date \u0026#34;+%Y-%m-%d %H:%M:%S\u0026#34; read -n 1 -s -p \u0026#34;按任意键继续...\u0026#34; return_to_main_menu } # 回答名字函数 answer_name() { echo \u0026#34;阿弥陀佛\u0026#34; read -n 1 -s -p \u0026#34;按任意键继续...\u0026#34; return_to_main_menu } # 显示系统信息函数 show_system_info() { echo -e \u0026#34;系统信息：\u0026#34; echo -e \u0026#34;-----------------\u0026#34; echo -e \u0026#34;操作系统：${kjlan}$(uname -s)${bai}\u0026#34; echo -e \u0026#34;主机名：${kjlan}$(hostname)${bai}\u0026#34; echo -e \u0026#34;当前用户：${kjlan}$(whoami)${bai}\u0026#34; read -n 1 -s -p \u0026#34;按任意键继续...\u0026#34; return_to_main_menu } # 返回主菜单函数 return_to_main_menu() { clear } # 退出程序函数 exit_program() { clear echo -e \u0026#34;${lv}已退出...${bai}\u0026#34; exit 0 } # 主函数 main() { while true; do # 显示菜单 display_menu # 显示分隔线 echo \u0026#34;------------------------\u0026#34; # 获取用户选择 read -p \u0026#34;请输入序号回车：\u0026#34; choice # 函数选项数组 case $choice in 1) print_date ;; 2) answer_name ;; # 新增选项 3) show_system_info ;; # 新增的case选项 0) exit_program ;; *) echo \u0026#34;无效的选择。请再次尝试。\u0026#34; ;; esac done } # 调用主函数 main \u0026#34;$@\u0026#34; 实用小技巧 开头加个: 必须 比如: 你必须怎么样… 能让gpt3和gpt4差不多厉害,\n如果你想要获取什么信息, 你可以这样说: 在以下文章中,我想知道啥啥啥,请提供一个表格,包含两列,问题和答案\n重要的是这两句话: 请提供一个表格,包含两列,这里的两列可以根据情况修改\n","date":"2024-05-10T20:19:05Z","permalink":"https://blog.lufei.de/p/257/","title":"非常实用简单的利用chatgpt写脚本技巧"},{"content":"为什么要选择 DeepL 翻译？ DeepL 被誉为全世界最精准的机器翻译，比最接近他们的竞争对手准确三倍以上\n看看 DeepL 和 微软翻译 的对比 👇👇 三句英文:\nWalking on eggshells during the software update.\nWang's VR game is a rollercoaster of emotions.\nCaught between a rock and a hard drive with this coding dilemma\nDeepL 微软翻译 在软件更新时提心吊胆 在软件更新期间在蛋壳上行走 Wang 的 VR 游戏让人的情绪如过山车般起伏不定 Wang的VR游戏是情绪的过山车 编码难题让我左右为难 夹在岩石和硬盘驱动器之间，陷入这种编码困境 翻译大PK 🏆\nhttps://app.immersivetranslate.com/text/?utm_source=extension\u0026utm_medium=extension\u0026utm_campaign=popup_more\n注意: 如果你没有科学上网,谷歌翻译是无法使用的, OpenAl和Azure翻译需要设置秘钥\n什么是DeepLX DeepLX 是一个开源项目，它基于 DeepL 免费服务，将其转换为本地 API，提供给第三方程序使用，如浏览器插件: 沉浸式翻译\n说人话就是: DeepL可以免费使用,但有限制,使用DeepLX可以无限制的调用DeepL API来翻译\n你可能会问: 我直接使用DeepL不就行了,为什么要搞DeepLX, 因为DeepL服务器部署在海外,国内连接阻力大, DeepL的付费版不支持国内银行卡购买，而免费版又受到严格限制,\n部署DeepLX 项目: https://github.com/OwO-Network/DeepLX\n官网: https://deeplx.owo.network/\n文档: https://deeplx.owo.network/install/\nDocker部署\ndocker run -itd -p 1188:1188 ghcr.io/owo-network/deeplx:latest 或者\ndocker run -itd -p 1188:1188 missuo/deeplx:latest 脚本部署\nbash \u0026lt;(curl -Ls https://raw.githubusercontent.com/OwO-Network/DeepLX/main/install.sh) 或者\nbash \u0026lt;(curl -Ls https://owo.nz/deeplx) 腾讯云函数部署\n文档: https://juejin.cn/post/7342697016181047296\nhttps://github.com/LegendLeo/deeplx-serverless\n如何使用 安装浏览器插件\n插件地址: https://immersivetranslate.com/\n打开开发者模式\n选择DeepLX(Beta)\nURL 中填入自己搭建的服务 URL，例如: http://8.8.8.8:1188/translate\n8.8.8.8 是你服务器ip地址\n","date":"2024-05-07T19:16:19Z","permalink":"https://blog.lufei.de/p/256/","title":"网页翻译终极方案-DeepLX"},{"content":" 在国内，用 pip 安装 python 依赖包的时候，总是会遇到 Timeout 或者下载太慢的问题。 这是因为 pip 源在国外，解决方法就是把 pip 源改成国内的，就可以实现 pip install 加速。\n1. 国内有哪些 pip 源？\n国内有几个名气比较大的源：\n清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/\n豆瓣 http://pypi.douban.com/simple/\n阿里云 http://mirrors.aliyun.com/pypi/simple/\n中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/\n中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/\n推荐使用阿里云的源，速度很快。\n2. 设置镜像源\n例如: 阿里云\npip config set global.index-url http://mirrors.aliyun.com/pypi/simple 当运行上面的命令时,会看到: Writing to ... 后面跟着的是pip配置文件的路径\n3.修改本地的 pip 配置文件\n[global] timeout = 120 index-url = http://mirrors.aliyun.com/pypi/simple trusted-host = mirrors.aliyun.com/pypi [search] index = http://mirrors.aliyun.com/pypi/simple 简单解释一下里面的参数：\ntimeout：超时时间为120秒，避免因为短暂的阻塞而导致下载失败. index-url：设置为阿里云源，pip install 时下载的地方。 trusted-host：添加阿里云源为可信主机，要不然可能报错。 一般来说这样的配置文件就足够用了\n","date":"2024-05-07T09:00:13Z","permalink":"https://blog.lufei.de/p/255/","title":"pip 安装插件加速技巧: 修改为国内源"},{"content":" 起因:\npython版本当然是越新越好，但今天体会到有些必要工具依赖python老版本，比如fail2ban这个防止暴力破解的拉黑IP工具.\n什么是Pyenv\nPyenv允许你在同一系统上安装和切换多个Python版本, Pyenv可以创建独立的Python虚拟环境，每个环境都有自己的Python版本和依赖，避免了不同项目间的版本冲突。 安装pyenv 你需要首先确保你的系统已经安装了curl,如果没有，你可以通过运行以下命令来安装：\nsudo apt-get update sudo apt-get install curl 然后，你可以使用以下命令安装pyenv：\ncurl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash 这将在你的主目录下的 .bashrc 或 .zshrc 文件中添加一些环境变量和路径。如果你使用的是Zsh，你可能需要编辑 .zshrc 文件，如果你使用的是Bash，你则需要编辑 .bashrc 文件。\n打开你的 shell 配置文件：\nnano ~/.bashrc 然后在文件的末尾添加以下行：\n# Pyenv export PYENV_ROOT=\u0026#34;$HOME/.pyenv\u0026#34; export PATH=\u0026#34;$PYENV_ROOT/bin:$PATH\u0026#34; eval \u0026#34;$(pyenv init -)\u0026#34; eval \u0026#34;$(pyenv virtualenv-init -)\u0026#34; 保存并关闭文件，然后运行以下命令使更改生效：\nsource ~/.bashrc 现在，你可以使用 pyenv 命令了。你可以通过运行 pyenv --version 来检查它是否已经成功安装。\n查看pyenv版本 pyenv --version 查看python3版本 python3 --version 查看可安装的 Python 版本 pyenv install --list | grep -v - | grep -E \u0026#34;^\\s*3\\.[0-9]+\\.[0-9]+\u0026#34; 安装指定版本 注意: pyenv无法管理系统默认版本,只管理通过pyenv安装的版本\npyenv install 3.10.12 指定全局版本 放心,这不会影响某些程序使用旧版本\npyenv global 3.10.12 查看是否指定\npython3 --version 查看所有通过pyenv安装的Python版本,* 符号表示当前正在使用的 Python 版本\npyenv versions 重置为系统默认的Python版本 pyenv global system 删除指定版本, 请放心,这不会卸载系统默认的Python版本\npyenv uninstall 3.10.12 Python虚拟环境创建 Python虚拟环境（Virtual Environment）是一个独立的Python运行环境，它允许你在不同的项目中隔离Python环境，每个项目可以有自己的Python版本和依赖包，而不会影响其他项目或系统的全局Python环境。这样有以下好处：\n依赖隔离：每个项目可以有自己的依赖包，避免版本冲突。一个项目可能需要一个特定版本的库，而另一个项目可能需要另一个版本，虚拟环境使得这种并存成为可能。\n易于管理：在新的虚拟环境中安装和升级库时，不会影响系统Python或其他项目。你可以轻松创建、切换和删除虚拟环境，方便维护和测试。\n可重复性：虚拟环境有助于重现项目环境，因为它们记录了创建时的Python版本和所有安装的库及其版本。这使得在不同的机器上轻松复制开发环境成为可能。\n开发效率：由于库的安装仅限于当前环境，安装和更新库的速度更快，因为不需要处理全局环境的复杂性。\n团队协作：团队成员可以在各自的虚拟环境中工作，无需担心各自的系统设置对项目的影响，每个人都可以根据项目需求配置自己的环境。\n在Python开发中，使用虚拟环境是一个最佳实践，它极大地提高了开发的灵活性和可控性。\n安装pyenv-virtualenv插件 首先，确保你已经安装了git，如果没有，你可以通过运行以下命令安装：\nsudo apt-get install git 然后，使用以下命令安装pyenv-virtualenv：\ngit clone https://github.com/pyenv/pyenv-virtualenv.git $.pyenv/plugins/pyenv-virtualenv 使其生效\nsource ~/.bashrc 这将把pyenv-virtualenv作为pyenv的一个插件安装到你的系统中。\n创建一个新的虚拟环境，你可以这样做：\npyenv virtualenv 3.10.12 vm 这将使用Python 3.10.12创建一个名为vm的虚拟环境。你可以通过以下命令切换到这个环境：\npyenv activate vm 要退出虚拟环境，使用：\npyenv deactivate 请注意，如果你使用的是zsh，你可能需要使用pyenv shell vm来激活环境，而不是pyenv activate vm。\n删除名为\u0026quot;vm\u0026quot;的虚拟环境, 输入y然后按回车确定\npyenv virtualenv-delete vm 或者，如果你的版本较旧，可能会使用：\npyenv virtualenv-uninstall vm 如果你看到提示确认删除，输入y然后按回车。删除完成后，使用pyenv versions再次检查，\u0026ldquo;vm\u0026quot;应该已经被移除。\npyenv versions ","date":"2024-05-05T23:14:19Z","permalink":"https://blog.lufei.de/p/254/","title":"ubuntu安装特定版本的python技巧"},{"content":"自用书签整理记录\n个人网盘 名称 URL 谷歌网盘 https://drive.google.com/drive/my-drive 阿里云盘 https://www.aliyundrive.com/ 百度网盘 https://pan.baidu.com/ 123云盘 https://www.123pan.com/ 蓝奏云储 https://pc.woozooo.com/mydisk.php 天翼云盘 https://cloud.189.cn/web/login.html PikPak云盘 https://mypikpak.com/drive/login?redirect=/all onedrive https://url.taoshuge.eu.org/KFAzEZ SharePoint https://url.taoshuge.eu.org/MxYGan backblaze https://secure.backblaze.com/user_signin.htm alist http://192.168.1.88:5244/ 资源下载 名称 URL 果核剥壳 https://www.ghxi.com/category/all/pcsoft Software https://oss.sunpma.com/?Software OBS录屏 https://obsproject.com/ PS论坛 https://www.toprender.com/forum-160-1.html Adobe全套 https://www.yuque.com/islandgg13/tdg1oz/dzmses Windows系统下载 https://hellowindows.cn/ windows10系统下载 https://www.winos.me/windows10/ Uptodown https://www.uptodown.com/android 小众软件 https://www.appinn.com/ 磁力星球 https://btstar.top/ 免费字体下载网站 https://www.100font.com/ logo设计 https://www.designevo.com/logo-maker/ Microsoft Store https://store.rg-adguard.net/ 素材收藏 名称 URL Free Stock https://www.videezy.com/ 天空之城 https://www.skypixel.com/ pexels https://www.pexels.com/zh-cn/ 逗比表情包 https://www.dbbqb.com/ 觅元素 https://www.51yuansu.com/ 爱给网 https://www.aigei.com/ 切片资源 名称 URL 天空资源站 https://tiankongzy.com/ 淘片资源网 https://www.taopianzy.com/index.html ikun资源站 https://www.ikunzy.com/ 新浪资源 https://www.xinlangzy.com/ 迅雷电影天堂 https://xunlei8.top/ 暴风资源 https://bfzy1.tv/ hdzyk,高清资源库 https://1080zyk1.com/ 索尼资源网 https://suonizy.net/ 索尼资源网 https://snzy1.com/ 非凡资源网 http://ffzy5.tv/ 光速资源站 https://guangsuzy.com/ 量子资源网 http://lzizy1.com/ 无尽资源采集 http://www.wujinzy.com/ 红牛资源 https://hongniuziyuan.com/ 闪电资源网 http://shan01.com/ KK资源采集 https://www.kkzy5.com/ 百度资源站 http://bdzy.com/ CK资源采集网 https://ckzy1.com/ 影视基地 https://www.hifast.cn/favorites/films Mp4电影 https://www.boxmp4.com/index.php 邮件 名称 URL Gmail https://mail.google.com/mail/u/0/#inbox QQ邮箱 https://mail.qq.com/ Zoho邮箱 https://mail.zoho.com.cn/zm/#mail/folder/inbox Outlook https://outlook.live.com/mail/0/ Proton Mail https://mail.proton.me/u/2/inbox 域名DNS 名称 URL Cloudflare https://dash.cloudflare.com/login Spaceship域名商 https://www.spaceship.com/en/application/domain-list-application/ GoDaddy https://www.godaddy.com/zh-sg NameSilo https://www.namesilo.com/account_domains.php dynadot https://www.dynadot.com/zh/account/domain/name/list.html DNSPod https://console.dnspod.cn/dns/list Whois查询 https://www.whois.com/whois ClouDNS: Dashboard https://www.cloudns.net/main/ Freenom https://my.freenom.com/clientarea.php?action=domains EU.org https://nic.eu.org/arf/en/login/?next=/arf/en/ Manage Domain Names https://www.dynadot.com/account/domain/name/list.html DNS啦 https://dns.la/Manage/DomainList.aspx 域名价格优惠 https://zh-hans.tld-list.com/ 域名政策Cloudflare https://www.cloudflare-cn.com/tld-policies/ porkbun.com https://porkbun.com/tld/com VPS商家 名称 URL 斯巴达 https://billing.spartanhost.net/login OVH云 https://ca.ovh.com/manager/#/hub RAKsmart https://billing.raksmart.com/whmcs/clientarea.php?action=products V.PS https://vps.hosting/clientarea/ Dogyun https://cvm.dogyun.com/server/list vultr https://my.vultr.com/ 阿里云 https://home.console.aliyun.com/home/dashboard/ProductAndService LiteServer https://clients.liteserver.nl/index.php?rp=/store/nvme-ssd-vps DMIT https://www.dmit.io/clientarea.php 腾讯云 https://console.cloud.tencent.com/lighthouse/instance/index?rid=15 RackNerd https://my.racknerd.com/cart.php?a=confproduct\u0026i=1 VMISS https://app.vmiss.com/cart.php?a=checkout ZgoCloud https://clients.zgovps.com/index.php?/cart/los-angeles-amd-performance-vps/\u0026step=0 hostdare https://bill.hostdare.com/cart.php?a=confproduct\u0026i=0 卢森堡官网 https://my.frantech.ca/cart.php?gid=39 contabo服务器 https://contabo.com/en/vps/ buyvm后台 https://manage.buyvm.net/ KURUN https://www.kurun.com/cart?fid=5\u0026gid=5 我的工具 名称 URL GitHub https://github.com/woniu336?tab=repositories CSDN博客 https://blog.csdn.net/u010066597?type=blog 汇率 https://wise.com/zh-cn/currency-converter/usd-to-cny-rate?amount=10 网络测速 - 一个木函 https://ol.woobx.cn/tool/speedtest 中国科学技术大学测速网站 https://test.ustc.edu.cn/ LeanCloud https://console.leancloud.app/apps 测速 https://www.speedtest.net/zh-Hans/run Gitee仓库 https://gitee.com/dayu777/projects notion https://www.notion.so/ Vercel https://vercel.com/woniu336s-projects server酱 https://sct.ftqq.com/sendkey 高清壁纸 · Pexels https://www.pexels.com/zh-cn/search/wallpaper/ 小众技术 http://www.xiaozhongjishu.com/ 免抠图片网 https://miankoutupian.com/ 自动剪辑神器 https://autocut.video/ 用文本编辑器剪视频 https://github.com/mli/autocut 以图搜图 https://yandex.com/images/ 油猴插件 https://greasyfork.org/zh-CN/scripts Squoosh压缩图片 https://squoosh.app/ PayPal https://www.paypal.com/hk 万里汇 https://portal.worldfirst.com.cn/ Microsoft Azure https://portal.azure.com/#home Microsoft 365 https://www.office.com/?auth=2 站长工具 名称 URL ITDOG-狗 https://www.itdog.cn/ping/ SEO综合查询 https://seo.chinaz.com/ 51.LA https://v6.51.la/report/overview?comId=392490 友盟+ https://mobile.umeng.com/platform/apps/list 百度统计 https://tongji.baidu.com/web5/welcome/login 小鸡监控平台 https://ping0.cc/vpsmon/30day vps789-全球主机测速平台 https://www.vps789.com/ IP查询 https://ipinfo.io/ IP地址查询 https://ping0.cc/ 百度图片上传 https://img.fzxx.xyz/index2 测速 https://speed.cloudflare.com/ 网站诊断 https://pagespeed.web.dev/?hl=zh-cn 网站必应 https://www.bing.com/webmasters/ Google Search https://search.google.com/search-console/welcome 斯巴达监控 https://stock.hostmonit.com/spartanhostE5S v.ps速度测试 https://v.ps/speedtest/ RackNerd 测速 http://lg-sea.racknerd.com/ IP125.com https://ip125.com/ 大咖网盟 http://dakawm.cc/index/user/login.html Cloudflare Tunnels https://url.taoshuge.eu.org/YtnMHZ 被墙查询 http://www.chaicp.com/home_cha/chaymqiang_z 七牛云 -图床 https://portal.qiniu.com/kodo/bucket/resource-v2?bucketName=rss-note SK app https://skapp.one/ AI工具 名称 URL chatgpt https://chat.openai.com/chat Chat Cohere https://coral.cohere.com/ Poe https://poe.com/ perplexity https://www.perplexity.ai/ Kimi https://kimi.moonshot.cn/ Google AI https://aistudio.google.com/app/prompts/new_chat 魔搭社区 https://www.modelscope.cn/home Ollama https://ollama.com/ Groq https://console.groq.com/playground huggingface https://huggingface.co/models AI工具集导航 https://ai-bot.cn/ DeepSeek 开放平台 https://platform.deepseek.com/usage GPT-4 Coze https://url.taoshuge.eu.org/cHxPRk 大模型评测 https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard 有声内容创作 https://speech.microsoft.com/portalaudiocontentcreation Llama中文社区 https://llama.family/ Slack https://w1705985611-wd3656803.slack.com/ Clipchamp https://app.clipchamp.com/ API keys https://platform.openai.com/account/api-keys API Keys Cohere https://dashboard.cohere.com/api-keys 个人网站 分类 URL 科技lion 官方博客 https://kejilion.blogspot.com/ 我不是咕咕鸽 https://blog.laoda.de/ Dongdong’s Blog https://ddw2019.com/ 白日梦与诗 https://www.brmys.top/ 银河录像局 https://nf.video/yinhe/web/?sharedId=89308 主机格调 https://zhuji.gd/ 主机测评 https://www.zhujiceping.com/ 大鸟博客 https://www.daniao.org/ 笨猫博客 https://www.nbmao.com/ CMDPE https://www.cmdpe.com/ VPS GO https://www.vpsgo.com/ DongVPS https://www.dongvps.com/ 环球巴士 https://universalbus.cn/?s=1LwjP6RN30 IOIOX https://www.ioiox.com/ 东评西就 https://dongjunke.cn/ 盒子萌 https://www.boxmoe.com/ HelloGitHub https://hellogithub.com/ nb.ID https://nbid.bid/blog/ VPN 分类 URL 西部世界 https://fuqing.cz/clientarea.php 追风岛 https://58zfdao.com/auth/login 小强cloud https://xqcloud.icu/#/login 翻墙工具 https://url.taoshuge.eu.org/jA4HwS 弄子里 https://su.ygjzjg.com 速云梯 https://suyunti1.com/user## ","date":"2024-05-05T21:11:46Z","permalink":"https://blog.lufei.de/p/253/","title":"书签收集"},{"content":" 因为平时会去了解AI相关的东西,写脚本也会用到,所以,记录一下\n工具下载 在开源大模型领域中，Llama3是非常强大的工具！Meta公司发布了两个性能强悍的大模型，即8B和70B，并即将发布400B，可以与GPT-4一较高下！今天我们将介绍三种本地部署方法，简单易懂，非常适合新手！\nGPT4All：适合低配置用户，可以在CPU/GPU上运行。\n下载地址\nLMstudio：支持下载多个模型，包括8B和70B等，提供更多模型选择！\n下载地址\nOllama：支持多平台！\n下载地址\nAnythingLLM\n下载地址\nopen-webui\n下载地址\n模型下载 Huggingface Hugging Face Huggingface 镜像站 HF Mirror 魔搭社区 ModelScope 在线体验（免费API） NVIDIA Build Groq Playground Perplexity AI Llama Family Tavily 开源大模型API价格 DeepInfra Pricing LLM Price Check ","date":"2024-05-05T14:18:40Z","permalink":"https://blog.lufei.de/p/252/","title":" Llama3 – 8B/70B 大模型！相关的工具和模型下载"},{"content":"前提:\ncloudflare API 密钥 宝塔面板 安装了nginx 如果你不使用宝塔面板,可以参照脚本修改\n生成证书脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl_pro.sh \u0026amp;\u0026amp; chmod +x ssl_pro.sh \u0026amp;\u0026amp; ./ssl_pro.sh 使用方法: https://blog.csdn.net/u010066597/article/details/137851521\n如果你使用了生成脚本成功安装了证书,理论上可以不需要续签脚本了,因为生成脚本已经实现了续签的功能,续签脚本相当于双重保险.\n自动续签脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/autossl.sh \u0026amp;\u0026amp; chmod +x autossl.sh \u0026amp;\u0026amp; ./autossl.sh 定时执行\n每天凌晨两点20分执行\n(crontab -l ; echo \u0026#34;20 2 * * * cd ~ \u0026amp;\u0026amp; ./autossl.sh \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#34;) | crontab - ","date":"2024-05-03T22:02:25Z","permalink":"https://blog.lufei.de/p/251/","title":"永不过期的SSL/TLS证书解决方案"},{"content":" 环境: Ubuntu 22.04.3 LTS\nZRAM 的原理是：\n将一块内存区域作为虚拟的块设备, 压缩页面交换数据, 存储在内存中, 释放物理内存空间 可用的物理内存就能随之变多 开启/加载 zRAM 模块 sudo modprobe zram num_devices=1 lsmod | grep zram 安装zram-config sudo apt install zram-config 加载zram模块 sudo modprobe zram 更新initramfs以加载zram模块(可选)\nsudo update-initramfs -u 使用sudo命令启用zram-config服务：\nsudo systemctl enable zram-config 使用sudo命令启动zram-config服务：\nsudo systemctl start zram-config 重启zram-config服务以应用更改：(释放内存)\nsudo service zram-config restart 修改swappiness参数 sudo vim /etc/sysctl.conf 末尾添加\nvm.swappiness = 180 应用新的swappiness设置：\nsudo sysctl -p /etc/sysctl.conf 启用 ZRAM 内核模块 echo \u0026#34;zram\u0026#34; | sudo tee /etc/modules-load.d/zram.conf echo \u0026#34;options zram num_devices=1\u0026#34; | sudo tee /etc/modprobe.d/zram.conf 使其立即生效\nsudo modprobe zram 配置 zram0 设备 查看默认压缩算法,带括号就是默认的\ncat /sys/block/zram0/comp_algorithm 查看zram大小\ncat /sys/block/zram0/disksize 配置持久化\nlz4hc 为压缩算法 2G 为zram大小,推荐大小为物理内存的一半\necho \u0026#39;KERNEL==\u0026#34;zram0\u0026#34;, ATTR{comp_algorithm}=\u0026#34;lz4hc\u0026#34;, ATTR{disksize}=\u0026#34;2G\u0026#34;, TAG+=\u0026#34;systemd\u0026#34;\u0026#39; | sudo tee /etc/udev/rules.d/99-zram.rules 然后重载模块\nsudo modprobe zram 将 zram0 设备配置为 Swap sudo mkswap /dev/zram0 sudo swapon /dev/zram0 开机自启\nsudo vim /etc/systemd/system/zram.service 添加内容\n[Unit] Description=ZRAM BindsTo=dev-zram0.device After=dev-zram0.device [Service] Type=oneshot RemainAfterExit=true ExecStartPre=/sbin/mkswap /dev/zram0 ExecStart=/sbin/swapon -p 2 /dev/zram0 ExecStop=/sbin/swapoff /dev/zram0 [Install] WantedBy=multi-user.target 重载配置文件\nsystemctl daemon-reload sudo systemctl enable zram 最后重启服务器\nreboot 查看zram设备 ls /dev/zram* 查看已加载的 ZRAM 模块\nlsmod | grep zram 显示已启用的交换空间\nswapon --show 查看zram0设备\nlsblk 调整优先级 目的是让zram优先使用\n先关闭swap\nsudo swapoff -a 再开启swap\nsudo swapon -a 查看\nswapon --show 输出信息\nvagrant@ubuntu:~$ swapon --show NAME TYPE SIZE USED PRIO /dev/zram0 partition 982M 0B 5 /swap.img file 2G 0B -2 -2：表示这个交换空间被标记为不活跃的，也就是说，这个交换空间不会被默认使用\n5：这是一个正整数优先级，具有默认的优先级。当系统需要进行交换时，会按照优先级的顺序逐个使用这些交换空间。\n测压 安装stress工具\nsudo apt install stress 测试\nstress --vm 1 --vm-bytes 2G --timeout 60s 这将启动一个stress进程，它会尝试分配2GB的内存并保持该状态持续60秒\n因为我的物理内存是2G,所以我使用2G测试,当zram耗尽时,就会启用swap\n可以另外开一个窗口,使用top命令查看系统状态\ntop ZRAM 分析 zramctl --output-all ","date":"2024-05-03T12:58:52Z","permalink":"https://blog.lufei.de/p/250/","title":"ubuntu开启zram彻底解决高I/O引起的卡顿，复制文件无比流畅"},{"content":"其他WAF设置 缓存设置 缓存设置好也可以帮助我们抵挡巨量的CC攻击。有些CC是很多IP随即攻击一个地址，如果我们的安全策略没有拦截到攻击。但是我们设置了缓存，那这些请求则会在CloudFlare边缘节点直接将缓存内容返回给请求。也达到了抗攻击的效果。\n缓存设置是在多个位置进行的。下面大家看截图就好。\n创建静态文件的缓存规则 表达式:\n(http.request.full_uri contains \u0026#34;.gif\u0026#34;) or (http.request.full_uri contains \u0026#34;.js\u0026#34;) or (http.request.full_uri contains \u0026#34;.css\u0026#34;) or (http.request.full_uri contains \u0026#34;.woff2\u0026#34;) or (http.request.full_uri contains \u0026#34;.webp\u0026#34;) or (http.request.full_uri contains \u0026#34;.png\u0026#34;) or (http.request.full_uri contains \u0026#34;.jpg\u0026#34;) or (http.request.full_uri contains \u0026#34;.jpeg\u0026#34;) 缓存时间看个人情况\n开启Tiered Cache 页面规则 关闭洋葱路由 Scrape Shield ","date":"2024-04-30T11:46:45Z","permalink":"https://blog.lufei.de/p/247/","title":"Cloudflare防火墙其他WAF设置"},{"content":"网站已趋于稳定，并且经过nginx调优。我想先分享一下Cloudflare的WAF规则，因为这是最有效的防御之一，可以抵御大量恶意攻击流量，我已经验证了数月。\n对于海外独立站电商网站，Cloudflare的CDN服务是首选，它强大无比，毫无疑问。对于中小型需求，直接免费使用就可以了，接入后网站的加速和防护都交给CF处理，这是最稳妥的选择。\n让我们开始吧！\n进入WAF配置页 进入CF的后台，选择你要防御的站点域名。\n记得在DNS选项，开启小云朵。这就开启CDN了，后续防御规则才会生效。 选择安全性\u0026ndash;WAF\n四个WAF规则\n添加完规则后请使用鼠标拖拽方式把四个规则的排序按照下面顺序排列,最上面的优先执行:\n选择正则表达式添加规则，复制规则保存即可。\n防御规则配置 以下列出四个规则的正则表达式\n放行原站IP IPV4和IPV6地址改成自己\n(ip.src eq 192.168.7.17) or (ip.src eq 2901:c080:1110:4c91:5400:4ff:feb8:130a) 没有ipv6\n(ip.src eq 192.168.7.17) 选择操作: 跳过 要跳过的 WAF 组件: 所有其余自定义规则\n阻止垃圾蜘蛛 (http.user_agent contains \u0026#34;YandexBot\u0026#34;) or (http.user_agent contains \u0026#34;DotBot\u0026#34;) or (http.user_agent contains \u0026#34;SemrushBot\u0026#34;) or (http.user_agent contains \u0026#34;AhrefsBot\u0026#34;) or (http.user_agent contains \u0026#34;BLEXBot\u0026#34;) or (http.user_agent contains \u0026#34;YaK\u0026#34;) or (http.user_agent contains \u0026#34;PetalBot\u0026#34;) or (http.user_agent contains \u0026#34;MJ12bot\u0026#34;) or (http.user_agent contains \u0026#34;MauiBot\u0026#34;) or (http.user_agent contains \u0026#34;MegaIndex.ru\u0026#34;) 选择操作: 阻止\n放行SEO爬虫 无脑复制即可，无需修改，\n(cf.client.bot) or (http.user_agent contains \u0026#34;duckduckgo\u0026#34;) or (http.user_agent contains \u0026#34;facebookexternalhit\u0026#34;) or (http.user_agent contains \u0026#34;Feedfetcher-Google\u0026#34;) or (http.user_agent contains \u0026#34;LinkedInBot\u0026#34;) or (http.user_agent contains \u0026#34;Mediapartners-Google\u0026#34;) or (http.user_agent contains \u0026#34;msnbot\u0026#34;) or (http.user_agent contains \u0026#34;Slackbot\u0026#34;) or (http.user_agent contains \u0026#34;TwitterBot\u0026#34;) or (http.user_agent contains \u0026#34;ia_archive\u0026#34;) or (http.user_agent contains \u0026#34;yahoo\u0026#34;) 选择操作: 跳过\n阻止恶意流量 (cf.threat_score ge 5 and not cf.client.bot) or (not http.request.version in {\u0026#34;HTTP/2\u0026#34; \u0026#34;HTTP/3\u0026#34; \u0026#34;HTTP/1.1\u0026#34;}) or (not ip.geoip.country in {\u0026#34;AU\u0026#34; \u0026#34;CA\u0026#34; \u0026#34;FR\u0026#34; \u0026#34;DE\u0026#34; \u0026#34;HK\u0026#34; \u0026#34;IR\u0026#34; \u0026#34;JP\u0026#34; \u0026#34;KR\u0026#34; \u0026#34;MY\u0026#34; \u0026#34;SG\u0026#34; \u0026#34;TW\u0026#34; \u0026#34;GB\u0026#34; \u0026#34;US\u0026#34; \u0026#34;CN\u0026#34;}) 选择操作: 托管质询\n国家地区: 表示你允许哪些国家访问你的网站,或者说你业务的范围包含哪些国家,\n这些大写字母是国家或地区的简称，在其中的都是放行的国家。如果你只在香港做业务可以只填写HK，其余的全部会进入质询拦截模式，俗称CF的5秒盾。\nCloudFlare 默认威胁分数5, 实测基本给攻击全漏了进来，设置3同样有漏IP。所以根据2023年9月目前的网络来说这里建议设置为2！\n速率限制 对了还有频率限制，也很关键。\n注意事项 1: 如果你的某些docker项目或者探针出现问题,请在阻止恶意流量那里把Http/1.1添加到规则\n2: 添加完规则后请使用鼠标拖拽方式把四个规则的排序按照下面顺序排列,最上面的优先执行:\n后续观察\n这一波设置基本就ok了。可以放几天试试，观察放行和拦截情况。\n","date":"2024-04-30T09:12:57Z","permalink":"https://blog.lufei.de/p/246/","title":"Cloudflare高级防御规则 看看我的网站如何用防御的"},{"content":" 我的大部分教程或者叫笔记,除了给自己看,考虑到其他朋友也会看到,本着简洁明白的原则,我基本上会制作一些快捷脚本,方便大家使用,本次脚本,我针对使用宝塔面板的朋友,当然,使用什么看个人情况,你可以更改我的脚本,已达到适合你的方式\nfail2ban原理 Fail2ban通过监视日志文件，检测并阻止恶意登录尝试和攻击.\n当Fail2ban检测到系统日志中的恶意行为模式时，它会自动阻止攻击者的IP地址，以保护系统安全。\n安装fail2ban Debian/Ubuntu安装\n使用root用户\napt update -y \u0026amp;\u0026amp; apt install -y fail2ban CentOS安装\nyum update -y yum install -y epel-release yum install -y fail2ban yum install -y nano 启动\nsystemctl start fail2ban 开机自启\nsystemctl enable fail2ban 查看状态\nsystemctl status fail2ban 按键盘 q 退出\n获取Cloudflare令牌 到cf后台右上角我的个人资料，选择左侧API令牌，获取Global API Key\n获取地址: https://dash.cloudflare.com/login\n对接Cloudflare 以下脚本适用于宝塔面板建站的朋友\n一键脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/fail2ban.sh \u0026amp;\u0026amp; chmod +x fail2ban.sh \u0026amp;\u0026amp; ./fail2ban.sh 国内机器\ncurl -sS -O https://gitee.com/dayu777/open_shell/raw/main/fail2ban-c.sh \u0026amp;\u0026amp; chmod +x fail2ban-c.sh \u0026amp;\u0026amp; ./fail2ban-c.sh 使用方法\n选择 12 : 对接cloudflare防火墙, 输入coudflare的登录账号,输入Global API Key\n测试 注意要点1: 因为我们需要对接cloudflare,就必须开启cloudflare的cdn,也就是把小云朵打开.\n注意要点2: 在cloudflare的后台, SSL/TLS模式改为 完全(严格) 或者 完全\n区别: 完全(严格) 模式需要你的域名已经有了ssl证书, 如果还没有开启ssl,可以使用完全模式\n注意要点3: 打开宝塔面板,修改网站配置,如下图:\n把 access_log /dev/null; 改成 access_log /www/wwwlogs/access.log; 然后重启nginx使其生效\n开启ssl:\n如何测试是否生效\n打开脚本,选择第8项: 查看日志实时监控\n假设你的网站是 https://baidu.com , 你就在后面加上一串不存在的字符, 例如: https://baidu.com/saddddx 这样返回的基本上就是404页面或者提示不存在,\n观察终端的实时日志,你就会看到你的本地ip访问了一个不存在的页面,超过5次,将被拉进小黑屋一个小时,如果需要解除ip,选择第10个菜单,输入你本地的ip即可(不是服务器ip)\n在cloudflare后台,打开站点,导航到 安全性 \u0026ndash; 事件 你就会看到被拉黑的ip\n更多功能自行探索吧,很晚了,睡觉了..\n最后,告诉你一个秘密: 使用https://www.itdog.cn/http/ 测速,多测几次,注意是把不存在的页面拿来测试,会把itdog的ip拉黑,效果显著! cf后台可以看到,\n解除拉黑: 先选择菜单6:查看网站拦截记录 复制被拉黑的一长串ip,然后在回车,选择菜单10,粘贴ip即可.\n","date":"2024-04-27T18:12:04Z","permalink":"https://blog.lufei.de/p/245/","title":"Fail2Ban对接cloudflare防火墙技巧"},{"content":"一键脚本 curl -sSO https://gitee.com/dayu777/btpanel-v7.7.0/raw/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh 优化 curl -sS -O https://gitee.com/dayu777/open_shell/raw/main/optimize.sh \u0026amp;\u0026amp; chmod +x optimize.sh \u0026amp;\u0026amp; ./optimize.sh 已去除宝塔面板强制绑定账号. 已去除各种计算题与延时等待. 已去除创建网站自动创建的垃圾文件. 已关闭未绑定域名提示页面. 已关闭安全入口登录提示页面. 已去除消息推送与文件校验. 已去除面板日志与绑定域名上报. 已关闭活动推荐与在线客服. 如需还原之前的样子，请在面板首页点击“修复” 手动破解 先登录面板，然后破解，去除登陆需要绑定账号：\nrm -f /www/server/panel/data/bind.pl 手动解锁宝塔所有付费插件为永不过期\nsed -i \u0026#39;s/\u0026#34;endtime\u0026#34;: -1/\u0026#34;endtime\u0026#34;: 999999999999/g\u0026#39; /www/server/panel/data/plugin.json 给plugin.json文件上锁防止自动修复为免费版\nchattr +i /www/server/panel/data/plugin.json 去后门 sudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request 净化面板 wget -O /tmp/bt.zip https://gitee.com/dayu777/open_shell/raw/main/bt/bt.zip unzip -uo /tmp/bt.zip -d /www/server/panel/BTPanel/templates/default rm /tmp/bt.zip bt restart 软件商店列表无法打开解决办法 大陆和香港服务器\n#优先选择这条命令执行 sed -i \u0026#34;/bt.cn/d\u0026#34; /etc/hosts echo \u0026#34;103.179.243.14 www.bt.cn download.bt.cn api.bt.cn dg1.bt.cn dg2.bt.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts 海外服务器:\nsed -i \u0026#34;/bt.cn/d\u0026#34; /etc/hosts echo \u0026#34;128.1.164.196 www.bt.cn download.bt.cn api.bt.cn dg1.bt.cn dg2.bt.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts ","date":"2024-04-20T15:35:14Z","permalink":"https://blog.lufei.de/p/244/","title":"一键安装宝塔面板破解版"},{"content":"\n此脚本仅适用于 宝塔面板 与 cloudflare DNS 验证 ，打引号的完美，大佬别见笑~\n所以，首先你的域名要解析在cloudflare，使用的是宝塔建站\n证书安装完成，后面可以自动更新了。\n一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl_pro.sh \u0026amp;\u0026amp; chmod +x ssl_pro.sh \u0026amp;\u0026amp; ./ssl_pro.sh 国内：\ncurl -sS -O https://gitee.com/dayu777/open_shell/raw/main/ssl_pro.sh \u0026amp;\u0026amp; chmod +x ssl_pro.sh \u0026amp;\u0026amp; ./ssl_pro.sh acme.sh 一般有两种方式验证: http 和 dns 验证\n此脚本使用的是 cloudflare dns 验证，结合宝塔面板的证书安装路径制作的\ncloudflare API 密钥获取方式：个人资料 \u0026ndash; API令牌 \u0026ndash; Global API Key\n注意要点：选择第4项：生成并安装证书 这里需要注意一点:\n宝塔面板会根据排序,优先使用第一个绑定的域名作为证书路径,\n比如: baidu.com,www.baidu.com,blog.baidu.com,那么baidu.com就是第一个绑定的域名,证书路径就是: /www/server/panel/vhost/cert/baidu.com\n所以先输入首域名作为证书路径(baidu.com)，接着再全部输入要生成证书的域名，可以多个或者通配符，以空格隔开\n谷歌证书申请方法 打开链接：https://cloud.google.com/sdk/gcloud/reference/publicca?hl=zh-cn\n点击右上角终端，提示授权，确认 输入以下命令：\ngcloud publicca external-account-keys create 获取到 b64MacKey 和 keyId 保存好，在脚本选择 Google Public CA 作为默认证书，输入keyId 和 b64MacKey\n完结，似乎一个域名只能用一次谷歌生成的keyId和 b64MacKey ，其他域名需要重新生成 `\n","date":"2024-04-16T22:44:54Z","permalink":"https://blog.lufei.de/p/243/","title":"完美的acme证书申请脚本-基于宝塔面板与cloudflare API"},{"content":"\n1. 安装 acme.sh 安装很简单, 一个命令:\ncurl https://get.acme.sh | sh -s email=my@example.com 把 my@example.com 改成自己的邮箱\n安装成功后，会为你自动创建定时任务, 如果快过期了, 需要更新, 则会自动更新证书。\n默认情况下，证书将每60天更新一次。\n切换默认证书\n目前 acme.sh 支持 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA，默认使用 ZeroSSL，如果需要更换可以使用下面命令：\n#切换 Let\u0026#39;s Encrypt acme.sh --set-default-ca --server letsencrypt #切换 Buypass acme.sh --set-default-ca --server buypass #切换 ZeroSSL acme.sh --set-default-ca --server zerossl #切换 SSL.com acme.sh --set-default-ca --server ssl.com #切换 Google Public CA acme.sh --set-default-ca --server google 2. 设置DNS验证 文档：https://github.com/acmesh-official/acme.sh/wiki/dnsapi\n以 CloudFlare为例：使用全局API密钥\n准备：全局API密钥在 我的个人资料\u0026ndash;API令牌\u0026ndash;Global API Key 获得\n设置CloudFlare DNS自动验证使用下面命令：\nexport CF_Key=\u0026#34;763eac4f1bcebd8b5c95e9fc50d010b4\u0026#34; #API密钥 export CF_Email=\u0026#34;123456@qq.com\u0026#34; #登录邮箱 3. 生成证书 如果之前安装过证书，后面加 --force 参数，\nacme.sh --issue --dns dns_cf -d xxx.com -d *.xxx.com 成功之后，会在 ~/.acme.sh/目录生成以域名为名称的文件夹，里面包含了证书和各种信息\n不要通配符，可以去掉：-d *.xxx.com ，如果有多个子域名，后面加 -d x.xxx.com\n--dns dns_cf 表示使用CloudFlare DNS 自动验证\n4. 安装证书（重点） 假设：你网站使用的是nginx，使用以下命令\nacme.sh --install-cert -d xxx.com -d *.xxx.com \\ --key-file /www/server/panel/vhost/cert/xxx.com/privkey.pem \\ --fullchain-file /www/server/panel/vhost/cert/xxx.com/fullchain.pem \\ --reloadcmd \u0026#34;service nginx force-reload\u0026#34; 使用这条命令时先要生成证书（第三步）\n不要通配符，可以去掉：-d *.xxx.com ，如果有多个子域名，后面加 -d x.xxx.com\n命令解读\n--install-cert #安装证书 --key-file #指定安装证书密钥路径 --fullchain-file #指定安装证书路径 --reloadcmd #重新加载nginx生效 为什么要使用那么多参数\n因为acme证书虽然60天更新一次，但是更新的证书路径是：~/.acme.sh/xxx.com\n你的域名指向的证书路径并不是在 ~/.acme.sh/\n不能使用~/.acme.sh/文件夹中的证书文件，它们仅供内部使用，文件夹结构将来可能会更改\n这些参数会被acme保存起来，下次自动更新时就会自动把证书安装到指定的路径，然后帮你重新加载nginx生效\n所以，你要先知道你的域名证书指向的路径在哪，以宝塔面板为例：\n/www/server/panel/vhost/cert/xxx.com/fullchain.pem /www/server/panel/vhost/cert/xxx.com/privkey.pem 5. 签发ECC证书 使用以下命令 （以nginx为例）\nacme.sh --install-cert -d xxx.com -d *.xxx.com --keylength ec-256 \\ --key-file /www/server/panel/vhost/cert/xxx.com/privkey.pem \\ --fullchain-file /www/server/panel/vhost/cert/xxx.com/fullchain.pem \\ --reloadcmd \u0026#34;service nginx force-reload\u0026#34; 多了 --keylength ec-256 参数\n6.强制更新证书 所有证书将每60天自动更新一次，但你要强制更新的话\nacme.sh --renew -d xxx.com --force 或者，对于ECC证书:\nacme.sh --renew -d xxx.com --force --ecc 如何停止证书续订 要停止证书的续订，您可以执行以下操作以从续订列表中删除证书:\nacme.sh --remove -d xxx.com [--ecc] 不会从磁盘中删除证书/密钥文件。\n您可以自己删除相应的目录 (例如 ~/.acme.sh/xxx.com )。\n如何升级 acme.sh 您可以将acme.sh更新为最新代码:\nacme.sh --upgrade 您还可以启用自动升级:\nacme.sh --upgrade --auto-upgrade 然后acme.sh将自动保持最新。\n禁用自动升级:\nacme.sh --upgrade --auto-upgrade 0 ","date":"2024-04-16T13:00:13Z","permalink":"https://blog.lufei.de/p/242/","title":"acme实用技巧：稳妥的自动更新证书之宝塔面板"},{"content":"Docker Compose 有两种使用方式,分别是 docker-compose 和 docker compose。这两种方式之间存在一些差异:\ndocker-compose docker-compose 是一个独立的可执行文件,通常位于 /usr/local/bin/docker-compose 或 /usr/bin/docker-compose。 这种方式是 Docker Compose 的传统用法,在早期版本中一直沿用。 使用 docker-compose 命令时,需要确保该可执行文件在系统 PATH 中可访问。 docker compose docker compose 是从 Docker 19.03 版本开始引入的新用法。 这种方式将 Docker Compose 功能集成到了 Docker 命令行工具中,作为一个子命令使用。 使用 docker compose 命令时,不需要单独安装 docker-compose 可执行文件,因为它是 Docker 命令行工具的一部分。 两种方式的主要区别在于:\n集成程度:\ndocker-compose 是一个独立的工具,需要单独安装和配置。 docker compose 是 Docker 命令行工具的一部分,更加紧密地集成在 Docker 生态中。 兼容性:\ndocker-compose 可以在任何支持 Docker 的系统上使用,不受 Docker 版本的限制。 docker compose 需要 Docker 19.03 及以上版本才能使用。 总的来说,docker compose 是 Docker 官方推荐的新用法,它提供了更好的集成和用户体验。但如果你需要在较旧的 Docker 版本上使用 Docker Compose,或者需要更多的灵活性,那么使用 docker-compose 命令可能更合适。\n","date":"2024-04-14T12:23:50Z","permalink":"https://blog.lufei.de/p/241/","title":"docker-compose 与 docker compose 区别"},{"content":"脚本一 curl -fsSL https://get.docker.com | sh \u0026amp;\u0026amp; ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin systemctl start docker systemctl enable docker 这个命令会先安装 Docker 引擎。 然后它会创建一个符号链接 /usr/local/bin/docker-compose，指向 Docker 安装目录中的 docker-compose 可执行文件。 也就是说,这个命令会安装 Docker Compose 作为 Docker 引擎的一部分。 脚本二 curl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 这个命令也会先安装 Docker 引擎。 然后它会单独下载最新版本的 Docker Compose 可执行文件,并将其保存到 /usr/local/bin/docker-compose。 最后它会给 Docker Compose 可执行文件添加可执行权限。 所以第一个命令是安装 Docker 引擎和 Docker Compose 的一体化方式,而第二个命令是分开安装 Docker 引擎和 Docker Compose 的最新版本。\n如果你需要使用最新版本的 Docker Compose,建议使用第二个命令。如果你只需要使用 Docker 引擎附带的 Docker Compose 版本,那么第一个命令就足够了。\n","date":"2024-04-13T09:14:23Z","permalink":"https://blog.lufei.de/p/240/","title":"docker安装脚本与区别"},{"content":"有时候我需要使用navicat工具来访问远程数据库，会遇到访问不了的情况，所以记录下方法。\n添加用户 首先打开ssh终端，进入数据库，提示输入数据库密码 mysql -u root -p 例如：添加一个名为pp的用户，密码是pp123 GRANT ALL PRIVILEGES ON *.* TO \u0026#39;pp\u0026#39;@\u0026#39;%\u0026#39; IDENTIFIED BY \u0026#39;pp123\u0026#39; WITH GRANT OPTION; 确保对权限所做的任何更改立即生效 FLUSH PRIVILEGES; 退出 按 Ctrl + D {% note info %} 以上表示允许用户从任何主机访问数据库，但如果加以限制，只允许本地ip为8.8.8.8的用户访问数据库呢？\n只需要修改第二步：\nGRANT ALL PRIVILEGES ON *.* TO \u0026#39;pp\u0026#39;@\u0026#39;8.8.8.8\u0026#39; IDENTIFIED BY \u0026#39;pp123\u0026#39; WITH GRANT OPTION; 查看用户 还是先进入数据库\nmysql -u root -p 查看用户\nSELECT User, Host, Password FROM mysql.user; 删除用户 例如：删除用户名为“pp”的用户帐户\nDROP USER \u0026#39;pp\u0026#39;@\u0026#39;%\u0026#39;; ","date":"2024-04-12T13:02:45Z","permalink":"https://blog.lufei.de/p/239/","title":"给远程数据库添加一个可以外部访问的用户"},{"content":"安装rclone 服务器A同步文件到服务器B\n首先在服务器A安装rclone,使用以下命令安装\nsudo -v ; curl https://rclone.org/install.sh | sudo bash 生成密钥对 在服务器A生成密钥对，并合并密钥，复制以下命令\nssh-keygen -q -t rsa -b 4096 -C \u0026#34;rclone key\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/rclone #静默生成rclone密钥对 cd ~/.ssh/ cat rclone* \u0026gt; rclone-merged # 将密钥对合并，否则会连接失败 会在/root/.ssh/目录下生成 rclone.pub，rclone，以及rclone-merged 三个文件\n复制公钥到服务器B 假设服务器B的ip是192.168.1.33，ssh端口是33，使用以下命令，然后输入服务器B的密码即可\n#在服务器A输入以下命令 ssh-copy-id -i ~/.ssh/rclone.pub -f -p 33 root@192.168.1.33 #自行修改为你自己的 手动复制 在服务器A打开rclone.pub，复制里面的内容，在服务器B/root/.ssh/\n的目录下新建authorized_keys文件,粘贴内容到authorized_keys\n配置文件 在服务器A编辑rclone.conf文件，没有的话需要新建\n新建\ntouch ~/.config/rclone/rclone.conf 编辑rclone.conf\nnano ~/.config/rclone/rclone.conf 只需要修改标识符，服务器B的ip，user, port, 其他不用动 标识符就是标记服务器B的，\n[serb] #标识符，很重要，可以随意起 type = sftp host = 192.168.1.33 #改为服务器B的ip user = root #默认root用户 port = 22 #默认22端口，如果是其他端口请修改 key_file = ~/.ssh/rclone-merged shell_type = unix md5sum_command = md5sum sha1sum_command = sha1sum 开始同步 多个文件夹同步（需在同级目录下）\n假设服务器A下的/www/wwwroot，有n个文件夹，而你只想要同步aa和bb两个文件夹，把aa和bb同步到服务器B的/www/kkk目录，使用以下命令\nrclone sync /www/wwwroot serb:/www/kkk -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse --include \u0026#34;/{aa,bb}/**\u0026#34; 单个文件夹同步\n同步服务器A/www/wwwroot/aa 到 服务器B /www/kkk\nrclone sync /www/wwwroot/aa serb:/www/kkk -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse 定时任务 把要执行同步的命令输入即可\nsudo curl -sS -O https://gitee.com/dayu777/open_shell/raw/main/synct.sh \u0026amp;\u0026amp; chmod +x synct.sh \u0026amp;\u0026amp; ./synct.sh ","date":"2024-04-11T13:00:22Z","permalink":"https://blog.lufei.de/p/238/","title":"两台服务器利用rclone同步文件解决方案"},{"content":" 在个人的开发平台上到处都需要网络代理环境，Clash是款用Go语言开发的软件，可以直接下载预编译的版本进行\n1、下载 # 切换超级管理员 sudo -i # 创建文件夹 cd \u0026amp;\u0026amp; mkdir clash cd clash 下载文件\nwget https://raw.githubusercontent.com/woniu336/linuxmint/main/clash-linux-amd64-v1.18.0.gz 2、安装 # 解压文件 gzip -d clash-linux-amd64-v1.18.0.gz # 给予权限 chmod +x clash-linux-amd64-v1.18.0 # 改名移动 mv clash-linux-amd64-v1.18.0 /usr/local/bin/clash # 查看版本 clash -v 3、启动 启动 Clash，生成 ~/.config/clash/config.yaml 文件\nclash 进入目录配置文件\ncd ~/.config/clash/ 把订阅地址的配置文件导入本地配置文件\nwget -O config.yaml 订阅地址 下载mmdb文件\nwget https://raw.githubusercontent.com/woniu336/linuxmint/main/Country.mmdb 如果是自建的Clash订阅节点，下载模板配置文件，修改V2ray配置块，\nwget -O config.yaml https://raw.githubusercontent.com/woniu336/linuxmint/main/config.yaml 4、设置开机启动 生成 systemd 配置文件\ncat \u0026gt; /etc/systemd/system/clash.service \u0026lt;\u0026lt; EOF [Unit] Description=Clash - A rule-based tunnel in Go Documentation=https://github.com/Dreamacro/clash/wiki [Service] OOMScoreAdjust=-1000 ExecStart=/usr/local/bin/clash -f /root/.config/clash/config.yaml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF 配置开机自启\nsystemctl enable clash 启动 clash 服务\nsystemctl start clash 配置环境变量\necho -e \u0026#34;export http_proxy=http://127.0.0.1:7890\\nexport https_proxy=http://127.0.0.1:7890\u0026#34; \u0026gt;\u0026gt; ~/.bashrc 5、修改系统代理 另一种开机启动解决方案：在 Startup Applications Preference 中添加 Clash。\n6、节点管理 http://clash.razord.top/#/settings 7、查看被占用的端口 sudo netstat -tulpn 停止clash\nsudo killall clash 验证 Clash 进程是否已经终止\nsudo netstat -tulpn | grep clash 8、设置 DNS sudo nano /etc/resolv.conf 添加\nnameserver 1.0.0.1 nameserver 8.8.8.8 ","date":"2024-04-10T18:49:28Z","permalink":"https://blog.lufei.de/p/237/","title":"Ubuntu 22.04 安装 Clash"},{"content":"换源 适用国内机子，或者虚拟机，提高下载速度\nsudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 接着：\nsudo vim /etc/apt/sources.list 清空原有内容，添加：\n## 默认禁用源码镜像以提高速度，如需启用请自行取消注释 deb https://mirrors.ustc.edu.cn/ubuntu jammy main restricted universe multiverse # deb-src https://mirrors.ustc.edu.cn/ubuntu jammy main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu jammy-updates main restricted universe multiverse # deb-src https://mirrors.ustc.edu.cn/ubuntu jammy-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu jammy-backports main restricted universe multiverse # deb-src https://mirrors.ustc.edu.cn/ubuntu jammy-backports main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu jammy-security main restricted universe multiverse # deb-src https://mirrors.ustc.edu.cn/ubuntu jammy-security main restricted universe multiverse ## 预发布软件源（不建议启用） # deb https://mirrors.ustc.edu.cn/ubuntu jammy-proposed main restricted universe multiverse # deb-src https://mirrors.ustc.edu.cn/ubuntu jammy-proposed main restricted universe multiverse 保存退出 :wq\n更新软件包列表 sudo apt update 以下是一些常用设置\n时间同步 设置上海时区\nsudo timedatectl set-timezone Asia/Shanghai 启用同步：\nsudo timedatectl set-ntp on 使用hwclock --systohc可以将系统时间同步到硬件时间。\nsudo hwclock --systohc 使用 timedatectl命令可以查看时区\ntimedatectl 其他换源方法 wget https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh sudo bash ChangeMirrors.sh 查看系统版本 lsb_release -a 查看python版本 python3 --version ","date":"2024-04-09T20:05:16Z","permalink":"https://blog.lufei.de/p/236/","title":"ubuntu22.04换源技巧"},{"content":"项目地址： https://gitclone.com/ #速度可以 https://gitmirror.com/ #速度快 方法一：设置git参数 （推荐） git config --global url.\u0026#34;https://gitclone.com/\u0026#34;.insteadOf https:// 或者\ngit config --global url.\u0026#34;https://hub.gitmirror.com/\u0026#34;.insteadOf https:// 速度测试\ngit clone https://github.com/tendermint/tendermint.git 方法二：替换URL 前面加上https://gitclone.com/ 或者 https://hub.gitmirror.com/\n速度测试\n#前面加上https://gitclone.com git clone https://gitclone.com/github.com/tendermint/tendermint.git #前面加上https://hub.gitmirror.com/ git clone https://hub.gitmirror.com/github.com/tendermint/tendermint.git Github RAW 加速服务 将原网址\nraw.githubusercontent.com 替换为\nraw.githubusercontents.com #后面多了一个s GO代理\nexport GOPROXY=https://goproxy.io ","date":"2024-04-09T17:31:06Z","permalink":"https://blog.lufei.de/p/235/","title":"Github加速技巧"},{"content":" 以下内容基于windows，使用git bash 终端\n以SSH/SFTP方式挂载Linux目录\nssh-keygen -q -t rsa -b 4096 -C \u0026#34;rclone key\u0026#34; -N \u0026#34;\u0026#34; -f ~/.ssh/rclone #静默生成rclone密钥对 cd ~/.ssh/ cat rclone* \u0026gt; rclone-merged # 将密钥对合并，否则会连接失败 会在~/.ssh/目录下生成 rclone.pub，和 rclone\n复制公钥到远程服务器\nssh-copy-id -i ~/.ssh/rclone.pub -f -p 33 root@8.8.8.8 #意思是把pub公钥复制到ip是8.8.8.8，ssh端口是33的服务器，提示输入密码验证.. 或者手动复制rclone.pub里的内容到远程服务器/root/.ssh/authorized_keys，\n如果没有authorized_keys文件，可以手动创建\nrclone极速配置\n在rclone所在目录打开rclone.conf文件，写入以下内容，没有备注的默认即可\n[vps-01] #别名，很重要，可以随意起 type = sftp host = 8.8.8.8 #改为你的服务器ip user = root #默认root用户 port = 22 #默认22端口，如果是其他端口请修改 key_file = ~/.ssh/rclone-merged shell_type = unix md5sum_command = md5sum sha1sum_command = sha1sum 在windows挂载\nrclone mount \u0026#34;vps-01:/www/wwwroot\u0026#34; W: --vfs-cache-mode full --vfs-cache-max-size 20G --vfs-cache-max-age 1h --dir-cache-time 1h --poll-interval 10s --buffer-size 128M --vfs-read-ahead 256M --cache-dir \u0026#34;d:/cache\u0026#34; 挂载目录和盘符（w）和一些参数可以修改，缓存目录d:/cache（可修改）记得经常清理\nrclone mount: 使用rclone挂载命令 \u0026quot;vps-01:/www/wwwroot\u0026quot;: 别名为\u0026quot;vps-01\u0026quot;的远程服务器上的\u0026quot;/www/wwwroot\u0026quot;目录 W:: 挂载到本地驱动器W磁盘 --vfs-cache-mode full: 启用完全的虚拟文件系统缓存模式 --vfs-cache-max-size 20G: 设置虚拟文件系统缓存的最大大小为20GB --vfs-cache-max-age 1h: 设置虚拟文件系统缓存的最大年龄为1小时 --dir-cache-time 1h: 设置目录缓存的时间为1小时 --poll-interval 10s: 设置rclone轮询远程服务器的间隔为10秒 --buffer-size 128M: 设置缓冲区大小为128MB --vfs-read-ahead 256M: 设置虚拟文件系统预读的大小为256MB --cache-dir \u0026quot;d:/cache\u0026quot;: 指定缓存目录为本地磁盘上的\u0026quot;d:/cache\u0026quot; 后台运行\n保存为bat文件，双击运行\n@echo off %1 start mshta vbscript:createobject(\u0026#34;wscript.shell\u0026#34;).run(\u0026#34;\u0026#34;\u0026#34;%~0\u0026#34;\u0026#34; ::\u0026#34;,0)(window.close)\u0026amp;\u0026amp;exit start /b rclone mount \u0026#34;vps-01:/www/wwwroot\u0026#34; W: --vfs-cache-mode full --vfs-cache-max-size 20G --vfs-cache-max-age 1h --dir-cache-time 1h --poll-interval 10s --buffer-size 128M --vfs-read-ahead 256M --cache-dir \u0026#34;d:/cache\u0026#34; 终止运行 保存为bat文件，双击运行\n@echo off taskkill /im rclone.exe /f pause 安装依赖 (适用Linux)\nsudo apt-get install fuse3 #不安装可能会报错无法挂载网盘 挂载命令2\n也可以使用以下命令（适用于Linux、windows）\nrclone mount r2:web K: --allow-other --vfs-cache-mode full --allow-non-empty \u0026amp; ","date":"2024-04-08T16:17:22Z","permalink":"https://blog.lufei.de/p/234/","title":"rclone挂载远程服务器之SSH"},{"content":"使用 SSH 登录服务器有两种方法：用户账号登录 和 使用公钥登录\n用户账号登录 直接使用以下命令\n# -p 指定服务器端口号，默认 22 # root 为登录的用户名 # 192.168.56.102 为服务器ip，也可使用域名 $ ssh root@192.168.56.102 -p 22 另外可以配置主机别名，这个和 使用公钥登录 差不多，区别是无需指定公钥地址而已，这里就不重复了。\n使用公钥登录 一、生成密钥对 # -t type，指定要生成的密钥类型，有rsa1(SSH1),dsa(SSH2),ecdsa(SSH2),rsa(SSH2)等类型，较为常用的是rsa类型 # -C comment，提供一个新的注释 # -f filename，指定生成的密钥文件名字 $ ssh-keygen -t rsa -C \u0026#34;这是注释\u0026#34; # 不指定密钥文件名的话，在操作时会有提示设置密钥文件名 # 或 $ ssh-keygen -t rsa -C \u0026#34;这是注释\u0026#34; -f \u0026#34;id_rsa\u0026#34; 二、上传公钥到服务器 将公钥内容上传到远程服务器的~/.ssh目录下的 authorized_keys 文件内 ssh-copy-id -i ~/.ssh/id_rsa.pub -p 6871 root@8.8.8.8 #假设ssh端口为6871 设置文件权限（否则会有权限问题） 服务端\n# 为 .ssh 目录指定权限 chmod 700 .ssh # 为 authorized_keys 指定权限 chmod 600 authorized_keys 客户端\nchmod 0600 id_rsa 三、服务端允许使用 RSA 登录 $ vim /etc/ssh/sshd_config # 允许使用 RSA 密钥校验登录 RSAAuthentication yes PubkeyAuthentication yes # 禁止登录 root，本人由于是在本地虚拟机测试玩的，为了方便，全开了 PermitRootLogin yes # 是否允许密码登录 PasswordAuthentication yes 五、登录服务器 方法一：（在命令行中指定私钥文件）\n# -i 指定私钥地址（私钥和公钥的文件名是一样的，只不过公钥文件有一个 .pub 后缀名。换句话说，如果把本地公钥给删了，只剩下私钥是无法登录的，因为在登录时要将公钥id发送给服务端，这样服务端才知道要选择哪个公钥加密） $ ssh root@192.168.56.102 -i ~/.ssh/id_rsa_server 方法二：（使用 ssh-agent 代理）\n# 先添加私钥 $ ssh-add ~/.ssh/id_rsa_server # 查看添加的私钥 $ ssh-add -l # 使用 ssh-agent 代理，ssh-agent 会在 ssh-add 列表中寻找到合适的私钥 $ ssh root@192.168.56.102 方法三：（在 SSH 配置中指定私钥文件）\n$ vim ~/.ssh/config Host gateway # 主机别名，使用 ssh gateway 命令可以直接登录该主机 Protocol 2 # SSH 协议版本 HostName example.com # 主机地址，支持IP或域名 Port 22 # SSH 服务端口号 User ubuntu # 登录用户名，会被 ssh root@gateway 覆盖，除非使用 ssh gateway IdentityFile ~/.ssh/id_rsa # 使用的私钥文件 如果我把这三种方法都用了呢？\n即既使用了 -i ~/.ssh/id_rsa_server 又使用了 ssh-agent ssh-add ~/.ssh/id_rsa_server 还使用了域名主机配置 IdentityFile ~/.ssh/id_rsa 答案很简单，SSH 会先使用 -i ~/.ssh/id_rsa_server，\n如果登录失败，则使用 ssh-agent ssh-add ~/.ssh/id_rsa_server，\n找不到合适的公钥的话，再使用 IdentityFile ~/.ssh/id_rsa，还是失败的话则提示输入密码，如果允许账号登录的话，否则整个登录失败。\n","date":"2024-04-08T11:36:18Z","permalink":"https://blog.lufei.de/p/233/","title":"SSH多种远程登录方法"},{"content":" 项目：https://github.com/blacknon/lssh/\nwiki: https://github.com/blacknon/lssh/wiki/Config\n以下教程基于ubuntu20.04\n安装 go wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz #下载go程序 rm -rf /usr/local/go \u0026amp;\u0026amp; tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz #安装 配置环境变量\nsudo nano /etc/profile 末尾添加\nexport PATH=$PATH:/usr/local/go/bin 按 CTRL+X 保存，y确认，回车\n使其立即生效\nsource /etc/profile 检测\ngo version #输出go version go1.22.2 linux/amd64 信息 安装 依赖 sudo apt install make sudo apt update sudo apt install build-essential 安装lssh\ngit clone https://github.com/blacknon/lssh cd lssh GO111MODULE=auto make \u0026amp;\u0026amp; sudo make install test -f ~/.lssh.conf||curl -s https://raw.githubusercontent.com/blacknon/lssh/master/example/config.tml -o ~/.lssh.conf 添加主机 编辑 /root/.lssh.conf 文件\n[common] port = \u0026#34;22\u0026#34; user = \u0026#34;root\u0026#34; key = \u0026#34;~/.ssh/id_rsa\u0026#34; pre_cmd = \u0026#34;echo \u0026#39;SSH连接中。。。\u0026#39;\u0026#34; post_cmd = \u0026#34;find /root/log/lssh -mindepth 2 -maxdepth 2 -type d -name \u0026#39;logdir\u0026#39; -exec sh -c \u0026#39;cd \\\u0026#34;{}\\\u0026#34; \u0026amp;\u0026amp; ls -t | tail -n +2 | xargs rm -f\u0026#39; \\\\;\u0026#34; [server.node1] addr = \u0026#34;192.168.1.8\u0026#34; port = \u0026#34;33\u0026#34; user = \u0026#34;root\u0026#34; pass = \u0026#34;\u0026#34; note = \u0026#34;node1主机\u0026#34; [server.node3] addr = \u0026#34;192.168.1.6\u0026#34; port = \u0026#34;55\u0026#34; user = \u0026#34;root\u0026#34; pass = \u0026#34;\u0026#34; note = \u0026#34;node3主机\u0026#34; #[includes] path = [ \u0026#34;~/.lssh.conf.include1\u0026#34; ,\u0026#34;~/.lssh.conf.include2\u0026#34; ] [log] enable = true timestamp = true dirpath = \u0026#34;~/log/lssh/\u0026lt;Date\u0026gt;_\u0026lt;Hostname\u0026gt;/logdir\u0026#34; 写法 [common] 代表通用配置，主机配置可以覆盖通用配置\nport = \u0026#34;22\u0026#34; #假设所有主机默认ssh端口为22，可以是其他端口 user = \u0026#34;root\u0026#34; #默认用户root key = \u0026#34;~/.ssh/id_rsa\u0026#34; #默认密钥路径 pre_cmd = \u0026#34;echo \u0026#39;SSH连接中。。。\u0026#39;\u0026#34; #连接前执行的命令，可以是其他命令 post_cmd = \u0026#34;find /root/log/lssh -mindepth 2 -maxdepth 2 -type d -name \u0026#39;logdir\u0026#39; -exec sh -c \u0026#39;cd \\\u0026#34;{}\\\u0026#34; \u0026amp;\u0026amp; ls -t | tail -n +2 | xargs rm -f\u0026#39; \\\\;\u0026#34; #退出后的命令 [server.主机昵称] 主机配置，主机昵称可以随意，不能是中文和重复，但前面必须加 server.\n例如：[server.node3] 、[server.node2] 按照以下写法逐个添加\n[server.node1] addr = \u0026#34;192.168.1.8\u0026#34; # ip地址 port = \u0026#34;33\u0026#34; #ssh端口号33，如果与通用配置一样，则可以为空 user = \u0026#34;root\u0026#34; #如果与通用配置一样，可以留空 pass = \u0026#34;\u0026#34; #主机登录密码，如果使用密钥连接，可以为空 note = \u0026#34;node1主机\u0026#34; #主机备注，方便查找 [includes] 配置，表示可以指定其他文件作为主机配置，写法与主机配置一样，一般不用\n#[includes] path = [ \u0026#34;~/.lssh.conf.include1\u0026#34; ,\u0026#34;~/.lssh.conf.include2\u0026#34; ] [log] 主机操作日志，所有在终端敲打的命令都会记录保存在 ~/log/lssh/日期_主机昵称/logdir目录\n[log] enable = true timestamp = true dirpath = \u0026#34;~/log/lssh/\u0026lt;Date\u0026gt;_\u0026lt;Hostname\u0026gt;/logdir\u0026#34; 这条命令表示只保留最新一个日志,在退出ssh连接时执行\npost_cmd = \u0026#34;find /root/log/lssh -mindepth 2 -maxdepth 2 -type d -name \u0026#39;logdir\u0026#39; -exec sh -c \u0026#39;cd \\\u0026#34;{}\\\u0026#34; \u0026amp;\u0026amp; ls -t | tail -n +2 | xargs rm -f\u0026#39; \\\\;\u0026#34; 使用方法 登录主机 lssh #使用键盘上下方向键选择，也可以用鼠标，最上方可以输入关键字查找,回车登录 发送命令 lssh hostname #可以按ALT+A全选，也可单独选一台主机，或者输入关键字查找 上面的命令只是例子，写法：lssh 后面加命令即可\n并行运行命令 lssh -p uname -a 上面的命令只是例子，写法：lssh 后面加 -p 交互命令 lssh -s scp命令 写法: 远程路径前面加 r: 不能单独使用 lscp 命令\nlscp /path/to/123.txt r:/path/to/remote 例如：lcsp 123/uuu.txt r:./123 复制/root/123/uuu.txt到远程主机（选择后）\n本地复制到远程\n# lscp local =\u0026gt; remote(multiple) lscp /path/to/local... r:/path/to/remote 远程复制到本地（这里有个bug,会进入选择界面，直接回车）\n# lscp remote(multiple) =\u0026gt; local lscp r:/path/to/remote... /path/to/local 远程到远程（先选择第一个主机，再选择第二个主机）\n# lscp remote =\u0026gt; remote(multiple) lscp r:/path/to/remote... r:/path/to/local lsftp命令 推荐好用 lsftp #可选择多台主机 本地到远程\nput /path/to/local ./ 例如 put 123/xx.md ./123 复制xx.md文件到远程主机/root/123目录下\n远程到本地\nget /path/to/remote ./ ","date":"2024-04-07T17:08:20Z","permalink":"https://blog.lufei.de/p/232/","title":"跳板机工具Lssh技巧介绍"},{"content":" 云盘的路径格式 比如：oss:back 中间要加冒号，后面才是路径或者存储桶名称\noss:back #oss云盘下的名称为back的存储桶 oss:back/工具箱 #back存储桶下的工具箱文件夹 onedrive:工具箱 #onedrive根目录下的工具箱文件夹 rclone工具箱脚本地址\nhttps://gitee.com/dayu777/open_shell/blob/main/rclone%E5%B7%A5%E5%85%B7%E7%AE%B1.bat 使用方法\n1、下载rclone程序 https://downloads.rclone.org/v1.66.0/rclone-v1.66.0-windows-amd64.zip 2、解压后，把程序文件夹添加到环境变量， 3、配置好云盘：rclone.conf 4，双击运行bat脚本 ","date":"2024-04-07T08:35:02Z","permalink":"https://blog.lufei.de/p/231/","title":"rclone工具箱"},{"content":" 官方文档https://docs.ansible.com/ansible/latest/installation_guide/index.html\n项目：https://github.com/ansible/ansible\n安装ansible 在Ubuntu上安装Ansible sudo apt update sudo apt install software-properties-common sudo add-apt-repository --yes --update ppa:ansible/ansible sudo apt install ansible 在Debian上安装Ansible 先复制对应版本的 UBUNTU_CODENAME\nDebian 12 jammy #jammy为UBUNTU_CODENAME Debian 11 focal #focal为UBUNTU_CODENAME Debian 10 bionic #bionic为UBUNTU_CODENAME 然后\nsudo apt install wget -y 最后\nUBUNTU_CODENAME=jammy wget -O- \u0026#34;https://keyserver.ubuntu.com/pks/lookup?fingerprint=on\u0026amp;op=get\u0026amp;search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367\u0026#34; | sudo gpg --dearmour -o /usr/share/keyrings/ansible-archive-keyring.gpg echo \u0026#34;deb [signed-by=/usr/share/keyrings/ansible-archive-keyring.gpg] http://ppa.launchpad.net/ansible/ansible/ubuntu $UBUNTU_CODENAME main\u0026#34; | sudo tee /etc/apt/sources.list.d/ansible.list sudo apt update \u0026amp;\u0026amp; sudo apt install ansible 使用pip安装和升级Ansible 确保 pip 可用,要验证是否已为首选Python安装了 pip :\npython3 -m pip -V 如果你看到像 No module named pip 这样的错误\ncurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python3 get-pip.py --user 安装Ansible\npython3 -m pip install --user ansible 升级Ansible\npython3 -m pip install --upgrade --user ansible 管理Ansible配置文件 📜第一层 配置文件优先级 Ansible配置文件ansible.cfg，可以存在于多个位置，他们的被读取的顺序如下\nANSIBLE_CONFIG # (环境变量) ansible.cfg # (当前目录) .ansible.cfg # (用户家目录) /etc/ansible/ansible.cfg # (默认配置文件) 📜第二层 配置选项 查看ansible.cfg的配置项\ngrep \u0026#34;^\\[\u0026#34; /etc/ansible/ansible.cfg 配置项\n[defaults] # 默认常用配置 [inventory] # 主机清单插件 [privilege_escalation] # 用于提权 [paramiko_connection] # python paramiko模块的连接设置（默认使用SSH） [ssh_connection] # SSH连接设置 [persistent_connection] # 长连接设置 [accelerate] # 加速模式的配置 [selinux] # selinux设置 [colors] # 输出结果颜色的设置 [diff] # 输出不同的设置 📜第三层 常用配置选项解读 虽然ansible.cfg配置文件一堆配置选项参数，但常用的，就那么几个\n1、常用配置\n[defaults] inventory =/etc/ansible/hosts forks=5 remote_user= host_key_checking=False ask_pass=False module_name= 解释\n[defaults] ; 默认设置部分开始 inventory = /etc/ansible/hosts ; 指定清单文件路径 forks = 5 ; 并行执行任务的进程数 remote_user = ; 远程用户，默认为空 host_key_checking = False ; 主机密钥检查设置为禁用，不检查主机密钥 ask_pass = False ; 是否要求输入密码设置为禁用 module_name = ; 模块名称，默认为空 2、用于提权\n[privilege_escalation] become=True become_method=sudo become_user=root become_ask_pass=False 解释\n[privilege_escalation] ; 特权升级设置部分开始 become = True ; 启用特权升级功能 become_method = sudo ; 使用sudo进行特权升级 become_user = root ; 指定特权升级后的用户为root become_ask_pass = False ; 是否需要sudo密码 实验开始 以主机名做为访问互联 sudo vim /etc/hosts #可选，为了方便可以不输入ip 例如：\n192.168.159.111 servera 192.168.159.112 serverb 192.168.159.113 serverc 192.168.159.114 serverd 📑编写配置文件 sudo vim /etc/ansible/ansible.cfg 内容如下：\n[defaults] inventory =/etc/ansible/hosts forks=5 remote_user= host_key_checking=False ask_pass=False module_name= [privilege_escalation] become=True become_method=sudo become_user=root become_ask_pass=False 📑编写主机清单 sudo vim /etc/ansible/hosts 格式\n#可以是ip地址，使用主机名是为了方便 [web] xx.xx.xx.com 192.168.1.11 192.168.1.28 node3 #children表示包含若干组 [everyone:children] web 自定义参数\n192.168.1.11 ansible_port=6871 ansible_user=root ansible_ssh_pass=123 解释：\nansible_host #主机地址 ansible_port #端口，默认是22端口 ansible_user #认证的用户 ansible_ssh_pass #用户认证的密码 查看清单\ncat /etc/ansible/hosts 📑验证主机清单 ansible all --list-hosts #查看主机 ansible all -m ping #连通性检查 测试命令：\nansible web -m command -a \u0026#34;hostname\u0026#34; 提权测试 添加账户xiao1\nansible web -m command -a \u0026#39;useradd xiao1\u0026#39; 删除账户xiao1\nansible web -m command -a \u0026#39;userdel -r xiao1\u0026#39; 密钥连接 生成密钥对 ssh-keygen -t rsa -P \u0026#39;\u0026#39; -q -f ~/.ssh/id_rsa 复制公钥到被控主机 主机数量少，可用以下命令，假设ssh端口是6871，ip是 8.8.8.8\nssh-copy-id -i ~/.ssh/id_rsa.pub -p 6871 root@8.8.8.8 登录测试\nssh -p 6871 root@8.8.8.8 默认端口是22\nssh-copy-id -i ~/.ssh/id_rsa.pub root@8.8.8.8 主机名是node1,node2,node3,有规律的，使用以下命令，\nfor host in node{1..3}; do ssh-copy-id -i ~/.ssh/id_rsa.pub $host; done 单独复制\nssh-copy-id -i ~/.ssh/id_rsa.pub node2 登录测试\nssh node2 或者指定用户名：vagrant\nssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@node2 主机数量多\n下载脚本\nwget https://gitee.com/dayu777/open_shell/raw/main/pub_send.py 编辑脚本\nvim pub_send.py 运行脚本\npython3 pub_send.py 被控主机无需输入sudo密码 每次 sudo 不用输入密码 sudo visudo 末尾添加\nlaoge ALL=(ALL) NOPASSWD: ALL #laoge 为用户名 CTRL+x保存，y 确认，回车\n","date":"2024-04-04T15:24:18Z","permalink":"https://blog.lufei.de/p/230/","title":"ansible使用技巧"},{"content":" 宝塔7.7.0版本\n安装 curl -sSO https://gitee.com/dayu777/btpanel-v7.7.0/raw/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh 优化 curl -sS -O https://gitee.com/dayu777/open_shell/raw/main/optimize.sh \u0026amp;\u0026amp; chmod +x optimize.sh \u0026amp;\u0026amp; ./optimize.sh 已去除宝塔面板强制绑定账号. 已去除各种计算题与延时等待. 已去除创建网站自动创建的垃圾文件. 已关闭未绑定域名提示页面. 已关闭安全入口登录提示页面. 已去除消息推送与文件校验. 已去除面板日志与绑定域名上报. 已关闭活动推荐与在线客服. 如需还原之前的样子，请在面板首页点击“修复” 手动破解 先登录面板，然后破解，去除登陆需要绑定账号：\nrm -f /www/server/panel/data/bind.pl 手动解锁宝塔所有付费插件为永不过期\nsed -i \u0026#39;s/\u0026#34;endtime\u0026#34;: -1/\u0026#34;endtime\u0026#34;: 999999999999/g\u0026#39; /www/server/panel/data/plugin.json 给plugin.json文件上锁防止自动修复为免费版\nchattr +i /www/server/panel/data/plugin.json 去后门 sudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request 卸载宝塔 wget http://download.bt.cn/install/bt-uninstall.sh 执行\nsh bt-uninstall.sh ","date":"2024-04-04T12:23:19Z","permalink":"https://blog.lufei.de/p/229/","title":"国内服务器安装宝塔面板"},{"content":" 版本介绍：7.7.0版本 包括一些优化\n脚本 https://gitee.com/dayu777/open_shell/raw/main/tb.yaml 运行 ansible-playbook tb.yaml 手动破解 先登录面板，然后破解，去除登陆需要绑定账号：\nrm -f /www/server/panel/data/bind.pl 手动解锁宝塔所有付费插件为永不过期\nsed -i \u0026#39;s/\u0026#34;endtime\u0026#34;: -1/\u0026#34;endtime\u0026#34;: 999999999999/g\u0026#39; /www/server/panel/data/plugin.json 给plugin.json文件上锁防止自动修复为免费版\nchattr +i /www/server/panel/data/plugin.json 去后门 sudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request 卸载宝塔 wget http://download.bt.cn/install/bt-uninstall.sh 执行\nsh bt-uninstall.sh ","date":"2024-04-04T12:09:14Z","permalink":"https://blog.lufei.de/p/228/","title":"ansible批量安装宝塔脚本"},{"content":"查看virtualbox正在运行的虚拟机 VBoxManage list runningvms 后台开启虚拟机 VBoxManage startvm 虚拟机名字 --type headless 后台关闭虚拟机 VBoxManage controlvm 虚拟机名字 acpipowerbutton Windows开机自动启动 制作bat脚本\n@ECHO OFF start VBoxManage startvm 虚拟机名字 --type headless start VBoxManage startvm 虚拟机名字2 --type headless ... EXIT 将bat拖进下面的目录\nC:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp ","date":"2024-04-04T00:32:16Z","permalink":"https://blog.lufei.de/p/227/","title":"VirtualBox启动和关闭虚拟机命令"},{"content":" 基于ubuntu22.04\n运行： ansible-playbook docker_install.yaml 脚本地址 https://gitee.com/dayu777/open_shell/raw/main/docker_install.yaml https://raw.githubusercontent.com/woniu336/open_shell/main/docker_install.yaml 无法启动docker解决 多发生在卸载重装后\n清空daemon.json文件里的内容\nsudo vim /etc/docker/daemon.json 重启：\nsudo systemctl restart docker sudo systemctl start docker 查看 Docker 服务状态\nsudo systemctl status docker 运行 Docker 命令\nsudo docker ps 服务重启后docker容器不见解决方案 服务重启后，docker服务没有自启动\n重启docker\nsystemctl start docker 查询所有容器\ndocker container ls -a 重启容器\ndocker container start id 自动重启\ndocker update --restart=always NAME QA\n报错：Cannot restart container 316c21f93fa8: failed to create task for container: task 316c21f93fa8205d1f684d69c2699e5b72525e34dd5f006636b30a7620c331bd: already exists\n重启服务 reboot，然后重启容器\n批量卸载docker 脚本：\nhttps://gitee.com/dayu777/open_shell/raw/main/remove_docker.yaml 运行\nansible-playbook remove_docker.yaml ","date":"2024-04-03T21:17:01Z","permalink":"https://blog.lufei.de/p/226/","title":"ansible安装docker-自动化批量安装docker"},{"content":" 基于ubuntu22.04\n更新索引包 sudo apt update 安装设置仓库必须的工具 sudo apt update \u0026amp;\u0026amp; sudo apt install -y ca-certificates curl gnupg lsb-release 安装HTTPS支持包 sudo apt -y install apt-transport-https ca-certificates curl software-properties-common 添加软件源的GPG密钥 sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/aliyun-docker.gpg 添加Docker软件源 echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/aliyun-docker.gpg] https://download.docker.com/linux/ubuntu \\ $(lsb_release -cs) stable\u0026#34; | sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null 安装 sudo apt update sudo apt install -y docker-ce 启动后台服务 sudo service docker start sudo systemctl restart docker sudo systemctl start docker 查看 Docker 服务状态 sudo systemctl status docker 开启自启动 sudo systemctl enable docker 将当前用户添加到 docker 用户组 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker 配置镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json \u0026lt;\u0026lt;-\u0026#39;EOF\u0026#39; { \u0026#34;registry-mirrors\u0026#34;: [\u0026#34;https://oyac73nr.mirror.aliyuncs.com\u0026#34;] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 查看加速配置是否生效\nsudo docker info 正确的效果\n以上省略 Registry Mirrors: https://oyac73nr.mirror.aliyuncs.com/ Live Restore Enabled: false 创建软链接\nsudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose 注意： /usr/libexec/docker/cli-plugins/docker-compose 通过 sudo docker info 查找\n查看docker-compose版本\nsudo docker-compose -v 卸载docker 即使报错，也能干净\nsudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd sudo apt-get remove -y docker* containerd.io podman* runc \u0026amp;\u0026amp; apt-get autoremove 其他问题 cd /etc/apt/sources.list.d/ 删除与Docker 相关的文件，\nsudo apt clean sudo apt update ","date":"2024-04-03T17:41:32Z","permalink":"https://blog.lufei.de/p/225/","title":"国内源安装docker"},{"content":"公钥分发脚本： 只需要修改IP、用户、密码、ssh端口 如果不是root用户或者ssh端口不是22，可定义\n脚本地址：https://github.com/woniu336/open_shell/blob/main/pub_send.py\nhttps://gitee.com/dayu777/open_shell/raw/main/pub_send.py\n注意：脚本会删除原来的密钥对\n使用场景 你有几十台服务器，现在用跳板机（堡垒机）来统一管控，把公钥分发到每台机器上\n运行 python3 pub_send.py 脚本内容：\n#!/usr/bin/env python3 import os # 删除用户家目录下的 SSH 密钥文件 os.system(\u0026#39;rm -rf ~/.ssh/id_rsa*\u0026#39;) # 生成新的 SSH 密钥对 os.system(\u0026#39;ssh-keygen -f ~/.ssh/id_rsa -P \u0026#34;\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1\u0026#39;) # 设置 SSH 密钥路径 key_path = os.path.expanduser(\u0026#39;~/.ssh/id_rsa.pub\u0026#39;) # 定义IP地址列表、用户名、密码和端口 hosts_and_passwords = { \u0026#34;192.168.1.28\u0026#34;: {\u0026#34;user\u0026#34;: \u0026#34;root\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;123456\u0026#34;, \u0026#34;port\u0026#34;: 22}, \u0026#34;192.168.1.29\u0026#34;: {\u0026#34;user\u0026#34;: \u0026#34;root\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;123456\u0026#34;, \u0026#34;port\u0026#34;: 22}, \u0026#34;192.168.1.30\u0026#34;: {\u0026#34;user\u0026#34;: \u0026#34;root\u0026#34;, \u0026#34;password\u0026#34;: \u0026#34;123456\u0026#34;, \u0026#34;port\u0026#34;: 22} } # 循环遍历 IP 地址列表，将 SSH 公钥复制到远程主机 for host, credentials in hosts_and_passwords.items(): user = credentials[\u0026#34;user\u0026#34;] password = credentials[\u0026#34;password\u0026#34;] port = credentials[\u0026#34;port\u0026#34;] os.system(f\u0026#39;sshpass -p \u0026#34;{password}\u0026#34; ssh-copy-id -i {key_path} -o StrictHostKeyChecking=no -p {port} {user}@{host}\u0026#39;) ","date":"2024-04-01T22:15:58Z","permalink":"https://blog.lufei.de/p/224/","title":"公钥分发脚本"},{"content":"项目地址：https://github.com/yt-dlp/yt-dlp\n下载：https://www.123pan.com/s/cjqrVv-rcq9d.html\n下载解压，解压路径不能是中文，双击 懒人版.exe 输入油管链接即可下载\n视频保存路径在 yt-dlp.conf 里面修改：\n--output \u0026#34;E:/youtube/%(uploader)s/%(title)s-%(resolution)s.%(ext)s\u0026#34; 解释：E:/youtube/ 保存在E盘youtube目录下，自行修改\nuploader：频道名称或者up主名称 title：视频标题 resolution：视频分辨率 ext 这个可以暂时理解为视频扩展名 是必须要写的哈。 配置说明 默认即可\nyt-dlp.conf 为配置文件\n进度条标题栏显示 这部分用处不大 可以不写\n--console-title --progress-template \u0026quot;download-title:%(info.id)s-%(progress.eta)s\u0026quot;\n将下载的视频 转换为MP4格式，很重要。\n--merge-output-format mp4\n只下载英文和中文字幕\n--sub-langs \u0026quot;en.*,zh-Hans\u0026quot;\n将字幕、缩图、视频描述等信息内嵌到视频文件\n--embed-subs\n--embed-thumbnail\n--embed-metadata\n--convert-subs srt\n如何下载指定分辨率的视频？ 双击 查询支持的分辨率.bat 输入链接\n如图所示，如果想下载1920x1080分辨率的视频，我们需要记录一下音频和视频id 比如我们可以把140作为视频的音轨，把137作为视频的图像，这样最终会合成一个有图像有声音的视频\n如何书写命令，举例：\nyt-dlp.exe https://www.youtube.com/watch?v=XA2YEHn-A8Q -f137+140\n大家务必注意结尾处的写法。f137前面是有一个减号的。当然你还可以自由的组合音视频。 这样我们就把指定分辨率的视频下载出来了。\n如何只下载音频？ 和上面的代码类似。还是根据音频id来下载，比如上面的图中 140是m4a格式的音频，代码如下：\nyt-dlp.exe https://www.youtube.com/watch?v=XA2YEHn-A8Q -f140\n下载播放列表的所有视频 其实这个功能，api直接就支持，注意播放列表形如：\nhttps://www.youtube.com/playlist?list=PL-Gg8EgJJQpDtccexkyEpSEK46m-epsFH\n如何找播放列表 不用我多介绍了吧，去up主的主页，点击播放列表，出来的就都是播放列表了。\n那么命令为：\nyt-dlp.exe https://www.youtube.com/playlist?list=PL-Gg8EgJJQpDtccexkyEpSEK46m-epsFH\n如何升级yt-dlp的版本？ 确认yt-dlp.exe 所在目录为非中文，注意包括父级目录 都不能有中文。\n此时执行 yt-dlp.exe -U\n即可完成版本升级，更新到最新的Release版本。\n","date":"2024-04-01T21:48:56Z","permalink":"https://blog.lufei.de/p/223/","title":"油管下载神器，超简单一键下载"},{"content":"脚本 使用了这个脚本，后面的内容可以不看了，\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/dns_update/dns_update_menu.sh \u0026amp;\u0026amp; chmod +x dns_update_menu.sh \u0026amp;\u0026amp; ./dns_update_menu.sh 首先获取API密钥 登录cloudflare\nhttps://dash.cloudflare.com/profile/api-tokens\n获取：Global API Key\n获取域名区域ID 选择其中一个域名进入\n域名的右侧，找到区域ID，复制ID\n前提：要把域名提前解析好，\n准备好域名正在使用的IP（原始ip） 备用IP（切换后的ip）\n下载脚本 脚本地址：https://github.com/woniu336/open_shell/tree/main/dns_update\n脚本下载\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/dns_update/dns_update.sh \u0026amp;\u0026amp; wget https://raw.githubusercontent.com/woniu336/open_shell/main/dns_update/dns_update.py \u0026amp;\u0026amp; chmod +x dns_update.sh dns_update.py 国内\nwget https://gitee.com/dayu777/open_shell/raw/main/dns_update/dns_update.sh \u0026amp;\u0026amp; wget https://gitee.com/dayu777/open_shell/raw/main/dns_update/dns_update.py \u0026amp;\u0026amp; chmod +x dns_update.sh dns_update.py 安装依赖 apt install python3-pip pip install requests sudo apt-get install jq 运行dns_update.sh 先运行dns_update.sh 提示输入API密钥，登录邮箱，区域ID，原始IP，备用ip，检测的端口号\n注意：原始ip就是正在使用的IP，检测到宕机后切换ip就是备用ip，要检测哪个端口号看你的需求，\n./dns_update.sh 完成后，会将信息录入dns_update.py脚本\n运行dns_update.py 终端输入：\nchmod +x dns_update.py python3 dns_update.py 测试脚本 比如你安装了宝塔面板，端口是5577，检测的端口号就是5577,然后停止面板，\n或者你安装了nginx，停止ngnix, 检测的端口号就是80,\n以上都会触发脚本自动更换ip\n会看到终端显示更新DNS记录，切换备用ip提示，也可以到cloudflare去看DNS解析情况\n如果要关掉小云朵cdn,修改：\n把 proxied=True 改成 proxied=False 后台运行 nohup python3 dns_update.py \u0026gt;\u0026gt; nohup.out 2\u0026gt;\u0026amp;1 \u0026amp; 查看所有Python3进程 ps -ef | grep \u0026#39;[p]ython3 dns_update.py\u0026#39; 或者\nps -ef | grep python3 禁止运行 pkill -f dns_update.py ","date":"2024-04-01T09:49:35Z","permalink":"https://blog.lufei.de/p/221/","title":"超简单利用 CloudFlare Api 宕机自动切换ip，并开启小云朵(cdn)"},{"content":"离线语音输入 项目： https://github.com/HaujetZhao/CapsWriter-Offline\n视频教程：\n","date":"2024-03-31T15:00:42Z","permalink":"https://blog.lufei.de/p/220/","title":"CapsWriter-Offline 电脑端离线语音输入工具"},{"content":" 推荐使用deepl翻译源，最准确的翻译\n第一款：TTime\nhttps://ttime.timerecord.cn\nGitHub： https://github.com/InkTimeRecord/TTime\n第二款：quicker+翻译动作\n","date":"2024-03-31T14:44:08Z","permalink":"https://blog.lufei.de/p/219/","title":"翻译工具推荐：快速准确翻译，截图翻译，划词翻译"},{"content":"\n选择：Encrypt/Decrypt a remote\n完成之后，挂载：\nrclone mount 路径 盘符： 例如：\nrclone mount jiami: W: ","date":"2024-03-31T14:32:37Z","permalink":"https://blog.lufei.de/p/218/","title":"rclone加密文件方法"},{"content":"安装 python3\nsudo apt update sudo apt install python3 其他：\nsudo apt update sudo apt install python3-pip pip3 install beautifulsoup4 sudo apt install python3-lxml ","date":"2024-03-29T13:25:32Z","permalink":"https://blog.lufei.de/p/217/","title":"Linux安装 python3"},{"content":" 并不是所有网站都像wordpress那样有插件可以实现\n以下方案基于windows 假设我更新了10篇文章，那么我要如何快速也更新sitemap呢，\n1、首先把这10篇链接复制到一个txt文本，每行一条链接，假设为123.txt，\n2、同目录下新建一个sitemap.xml 文件 (空文件)\n3、同目录下新建一个sitemap.bat脚本\n4、最后新建一个推送到网站的push.sh脚本\nsitemap.bat脚本 @echo off setlocal enabledelayedexpansion REM 设置变量 set \u0026#34;sitemap=sitemap.xml\u0026#34; set \u0026#34;temp_file=temp.xml\u0026#34; REM 清空sitemap.xml文件 type nul \u0026gt; \u0026#34;%sitemap%\u0026#34; REM 将sitemap.xml中的\u0026lt;urlset\u0026gt;标签写入临时文件 echo ^\u0026lt;urlset xmlns=\u0026#34;http://www.sitemaps.org/schemas/sitemap/0.9\u0026#34; xmlns:mobile=\u0026#34;http://www.baidu.com/schemas/sitemap-mobile/1/\u0026#34;^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; REM 逐行读取123.txt中的链接，并将每个链接写入sitemap.xml中 for /f \u0026#34;usebackq tokens=*\u0026#34; %%a in (\u0026#34;123.txt\u0026#34;) do ( echo ^\u0026lt;url^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo ^\u0026lt;loc^\u0026gt;%%a^\u0026lt;/loc^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo ^\u0026lt;mobile:mobile type=\u0026#34;pc,mobile\u0026#34;/^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; REM 获取当前时间并将其格式化为需要的格式 for /f \u0026#34;delims=\u0026#34; %%t in (\u0026#39;powershell Get-Date -Format yyyy-MM-ddTHH:mm:sszzz\u0026#39;) do set \u0026#34;timestamp=%%t\u0026#34; echo ^\u0026lt;lastmod^\u0026gt;!timestamp!^\u0026lt;/lastmod^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo ^\u0026lt;changefreq^\u0026gt;daily^\u0026lt;/changefreq^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo ^\u0026lt;priority^\u0026gt;1.0^\u0026lt;/priority^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo ^\u0026lt;/url^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; ) REM 添加\u0026lt;/urlset\u0026gt;标签到sitemap.xml文件中 echo ^\u0026lt;/urlset^\u0026gt; \u0026gt;\u0026gt; \u0026#34;%sitemap%\u0026#34; echo Links have been successfully inserted into the sitemap.xml file. REM 清空123.txt文件 type nul \u0026gt; \u0026#34;123.txt\u0026#34; echo 123.txt has been cleared. push.sh脚本 这里需要你使用密钥方式连接你的服务器，教程博客有\n#!/bin/bash # 执行 SCP 命令 scp -i ~/.ssh/id_ed25519 -P 22 sitemap.xml root@223.5.5.5:/www/wwwroot/sitemap 这条命令的意思是把当前sitemap.xml文件传送到ip为223.5.5.5的服务器的/www/wwwroot/sitemap目录\n运行脚本 当前目录新建一个run.bat ,来运行上面两个脚本\n@echo off rem 运行sitemap.bat echo Running sitemap.bat call sitemap.bat rem 等待2秒 timeout /t 2 \u0026gt;nul rem 运行push.sh echo Running push.sh call push.sh echo All scripts executed successfully 如何自动化 想象一下，上面的这些操作哪些是需要变化的，文章链接是变化的，\n再进一步，如果文章更新的位置是不变的，也就是说网站的布局是不变的\n那么可以使用模拟鼠标键盘的操作，去复制粘贴，最后一键运行run.bat\n推荐工具：\nquicker的录制键鼠动作\nztasker : 定时任务工具\n","date":"2024-03-29T10:33:17Z","permalink":"https://blog.lufei.de/p/216/","title":"sitemap自动化提交方案"},{"content":"User-agent: * Crawl-delay: 10 Disallow: /wp-admin/ Disallow: /go/ Disallow: /wp-content/plugins/ Disallow: /?s=* Disallow: /author/ Disallow: /astra-advanced-hook/ Disallow: /theme Disallow: /demo/* Disallow: /*/page/* Disallow: /*blackhole Disallow: /?blackhole Allow: /wp-admin/admin-ajax.php User-agent: YandexBot Disallow: / User-agent: DotBot Disallow: / User-agent: AhrefsBot Disallow: / User-agent: Googlebot Disallow: / User-agent: BLEXBot Disallow: / User-agent: YaK Disallow: / User-agent: PetalBot Disallow: / User-agent: MJ12bot Disallow: / Sitemap: https://www.xxx.com/sitemap.xml ","date":"2024-03-28T15:40:56Z","permalink":"https://blog.lufei.de/p/215/","title":"robots规则以及阻止垃圾爬虫"},{"content":"脚本地址： curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssh-v.sh \u0026amp;\u0026amp; chmod +x ssh-v.sh \u0026amp;\u0026amp; ./ssh-v.sh 脚本如下，请在电脑上安装好 Git 将代码保存为xxx.sh，双击运行：\n一路回车，输入yes,输入你的端口号，ip，密码，搞定\n最后自定义别名（随意什么名称）\n登录方式，打开终端，输入：ssh [别名] 登录\n例如 ssh kk 就登录了\n如果要在Linux系统上运行脚本，记得在目标服务器设置权限\nSSH设置不生效解决办法 如果遇到设置ssh成功后仍然需要密码登录的情况解决办法\n一、查看系统安全日志，定位问题\nsudo cat /var/log/auth.log 或者\nsudo cat /var/log/secure 找到下面的信息\nAuthentication refused: bad ownership or modes... （网上的图片） （我的） for directory 或者 for file 后面跟着的就是指出什么文件或文件夹\n我的这条日志说明 SSH 服务器拒绝了基于密钥的认证,原因是 /root/.ssh/authorized_keys 文件的所有权或权限模式设置不正确。（你的原因可能和我不一样，但是方法是一样的）\nauthorized_keys 文件存储了允许使用 SSH 密钥登录的公钥。如果这个文件的权限设置不当,SSH 服务器将拒绝基于密钥的认证,从而要求输入密码进行登录认证。\n解决方法是检查 /root/.ssh/authorized_keys 文件的所有权和权限,确保它只对 root 用户可读写:\n所有权应为 root:root\nchown root:root /root/.ssh/authorized_keys 权限应为 600 (所有者可读写)\nchmod 600 /root/.ssh/authorized_keys 如果 /root/.ssh 目录存在,也要检查它的权限为 700 (所有者可读写执行)\nchmod 700 /root/.ssh 做完这些更改后,重新尝试 SSH 密钥登录,应该就不需要输入密码了。如果仍有问题,可以检查 SSH 服务器和客户端的其他配置。\n脚本： #!/bin/bash # 创建SSH目录 mkdir -p ~/.ssh cd ~/.ssh # 生成SSH密钥 # 生成SSH密钥 echo -e \u0026#34;\\e[32m开始愉快之旅吧\\e[0m\u0026#34; echo -e \u0026#34;\\e[32m系统将提示您指定密钥对名称: \\e[33m一路回车\\e[32m 请按Enter继续\\e[0m\u0026#34; echo ssh-keygen -t ed25519 -C \u0026#34;注释随意\u0026#34; # 复制公钥到远程服务器 read -p \u0026#34;请输入SSH端口号（默认22）：\u0026#34; ssh_port ssh_port=${ssh_port:-22} read -p \u0026#34;请输入服务器IP地址：\u0026#34; server_ip read -p \u0026#34;请输入用户名（默认root）：\u0026#34; ssh_user ssh-copy-id -i ~/.ssh/id_ed25519.pub -p $ssh_port $ssh_user@$server_ip # 修改远程服务器配置 ssh -p $ssh_port $ssh_user@$server_ip \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; if grep -q \u0026#34;^#*PubkeyAuthentication\\s*no\u0026#34; /etc/ssh/sshd_config; then sudo sed -i \u0026#39;s/^#*PubkeyAuthentication\\s*no/ PubkeyAuthentication yes/\u0026#39; /etc/ssh/sshd_config elif grep -q \u0026#34;^#*PubkeyAuthentication\\s*yes\u0026#34; /etc/ssh/sshd_config; then sudo sed -i \u0026#39;s/^#*PubkeyAuthentication\\s*yes/ PubkeyAuthentication yes/\u0026#39; /etc/ssh/sshd_config else echo \u0026#34;PubkeyAuthentication yes\u0026#34; | sudo tee -a /etc/ssh/sshd_config fi sudo service ssh restart exit EOF # 提示用户输入别名和ip read -p \u0026#34;请输入别名：\u0026#34; alias_name # 检查~/.ssh/config文件是否存在，如果不存在则创建并添加配置 if [ ! -f ~/.ssh/config ]; then touch ~/.ssh/config fi # 添加别名和IP到~/.ssh/config文件中 if ! grep -q \u0026#34;Host $alias_name\u0026#34; ~/.ssh/config; then echo \u0026#34;Host $alias_name\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; Hostname $server_ip\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; IdentityFile ~/.ssh/id_ed25519\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; User $ssh_user\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config # 更新User为用户输入的用户名 echo \u0026#34; Port $ssh_port\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config # 添加Port选项 fi # 使用SSH密钥登录 echo -e \u0026#34;\\e[33m输入 ssh $alias_name 愉快登录吧\\e[0m\u0026#34; ssh $alias_name ","date":"2024-03-28T11:48:42Z","permalink":"https://blog.lufei.de/p/214/","title":"一键脚本设置SSH密钥登录服务器"},{"content":" 由于这个2022版本没有剪贴板功能，故使用以下方法调出\n保存为xx.reg文件 然后双击执行 重启电脑\nWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Clipboard] \u0026#34;IsCloudAndHistoryFeatureAvailable\u0026#34;=dword:00000001 ","date":"2024-03-28T08:35:38Z","permalink":"https://blog.lufei.de/p/213/","title":"Windows server2022 调出剪贴板"},{"content":"假设你使用密钥的方式登录服务器，并且 ssh 端口是 2233，并且 不是 使用 root 登录，\n从桌面复制 sitemap123. xml 到服务器目录 /www/wwwroot/bt.cc 并且将文件 重命名：\n~/.ssh/id_rsa 是密钥路径\nssh -p 2233 sp #登录服务器的命令，事先在~/.ssh/config文件中配置\nconfig:\nHost sp Hostname 服务器IP IdentityFile ~/.ssh/id_rsa User laoge 复制命令如下：\n#!/bin/bash # 执行 SCP 命令 scp -i ~/.ssh/id_rsa -P 2233 C:/Users/Administrator/Desktop/sitemap123.xml laoge@ip:~/sitemap123.xml # 执行 SSH 命令 ssh -p 2233 sp \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; # 在 SSH 会话中执行 sudo 命令，使用 -S 选项从标准输入读取密码 echo \u0026#34;服务器密码\u0026#34; | sudo -S mv ~/sitemap123.xml /www/wwwroot/bt.cc/ # 在 SSH 会话中执行另一个 sudo 命令，使用 -S 选项从标准输入读取密码 echo \u0026#34;服务器密码\u0026#34; | sudo -S mv /www/wwwroot/bt.cc/sitemap123.xml /www/wwwroot/273bt.cc/sitemap.xml EOF root用户密码登录：\nscp -P 2233 sitemap.xml root@xx.xx.x..:/www/wwwroot/xxx.com ","date":"2024-03-27T19:32:56Z","permalink":"https://blog.lufei.de/p/212/","title":"复制本地文件到远程服务器"},{"content":"1、https://github.com/sumatrapdfreader/sumatrapdf\n2、https://github.com/Stirling-Tools/Stirling-PDF\n3、https://pdf2docx.cn/\n4、https://tools.pdf24.org/zh/\n下载地址： https://www.123pan.com/s/cjqrVv-9Nq9d.html\n","date":"2024-03-27T12:47:03Z","permalink":"https://blog.lufei.de/p/211/","title":"非常好用的PDF工具分享"},{"content":"撤销工作区修改 使用场景：已有修改加入暂存区，后续出现 bug, 恢复到上一次暂存状态。\ngit add . # 加入暂存区 git checkout -- . # 撤销工作区修改，恢复到上一次暂存时的状态 恢复到上一次提交 commit git restore --staged . # 恢复到未暂存状态 git checkout -- . # 恢复上一次提交 ","date":"2024-03-24T21:39:47Z","permalink":"https://blog.lufei.de/p/210/","title":"Git版本控制命令"},{"content":"示例： 修改：云存储名称、ID、密钥、endpoint，其他默认\n[oss] # 云存储名称，随意！但使用rclone时需要一致 type = s3 provider = Alibaba env_auth = false access_key_id = \u0026lt;ID\u0026gt; secret_access_key = \u0026lt;密钥\u0026gt; endpoint = oss-cn-shenzhen.aliyuncs.com # 这里我的是shenzhen(深圳) acl = public-read storage_class = STANDARD bucket_acl = public-read 命令： rclone sync D:\\blog oss:tvcdn\\blog -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse --exclude \u0026#34;/{.git,public,resources}/\u0026#34; --exclude \u0026#34;*.mp4\u0026#34; 命令解读 序号 操作 命令 1 同步本地文件夹 D:\\blog 到远程 oss:tvcdn\\blog rclone sync D:\\blog oss:tvcdn\\blog 2 忽略已存在文件（此参数慎重） --ignore-existing 3 仅更新新文件 -u 4 显示详细进度 -v -P 5 并发传输数量为 20 --transfers=20 6 忽略错误 --ignore-errors 7 缓冲大小为 128 M --buffer-size=128M 8 在首次同步前检查文件列表 --check-first 9 使用 10 个检查线程 --checkers=10 10 启用 Google Drive 滥用确认 --drive-acknowledge-abuse 11 排除 .git、public 和 resources 文件夹 --exclude \u0026quot;/{.git,public,resources}/\u0026quot; 12 排除所有 *.mp4 文件 --exclude \u0026quot;*.mp4\u0026quot; ","date":"2024-03-24T11:17:53Z","permalink":"https://blog.lufei.de/p/209/","title":"rclone 阿里云OSS配置文件模板"},{"content":"文档：资料\n文件类型过滤 比如 --exclude \u0026quot;*.bak\u0026quot;，表示排除所有 .bak 结尾的文件，也可以写作 --filter \u0026quot;- *.bak\u0026quot;\n比如 --include \u0026quot;*.{png,jpg}\u0026quot;，包含所有 png 和 jpg 文件，排除其他文件，也可以写作 --filter \u0026quot;+ *.{png,jpg}\u0026quot;\n--delete-excluded 删除排除的文件。需配合过滤参数使用，否则无效。\n目录过滤 目录过滤需要在目录名称后面加上 /，否则会被当做文件进行匹配。以 / 开头只会匹配根目录（指定目录下），否则匹配所目录。这同样适用于文件。\n--exclude \u0026quot;.git/\u0026quot; 排除所有目录下的.git 目录。\n--exclude \u0026quot;/.git/\u0026quot; 只排除根目录下的.git 目录。\n--exclude \u0026quot;{Video,Software}/\u0026quot; 排除所有目录下的 Video 和 Software 目录。\n--exclude \u0026quot;/{Video,Software}/\u0026quot; 只排除根目录下的 Video 和 Software 目录。\n--include \u0026quot;/{Video,Software}/**\u0026quot; 仅包含根目录下的 Video 和 Software 目录的所有内容。\n大小过滤 默认大小单位为 kBytes ，但可以使用 k ，M 或 G 后缀。\n--min-size 过滤小于指定大小的文件。比如 --min-size 50 表示不会传输小于 50k 的文件。\n--max-size 过滤大于指定大小的文件。比如 --max-size 1G 表示不会传输大于 1G 的文件。\n过滤规则来自某个文件 --exclude-from \u0026lt;规则文件\u0026gt; ：从文件添加包含规则\n--include-from \u0026lt;规则文件\u0026gt;：从文件添加删除规则\n--filter-from \u0026lt;规则文件\u0026gt; ：从文件添加包含 / 排除规则。比如 --filter-from filter-file.txt。\nfilter-file.txt 示例：\n- secret*.jpg + *.jpg + *.png + file2.avi - /dir/Trash/** + /dir/** - * 最佳实践 rclone sync D:\\blog oss:tvcdn\\blog -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse --exclude \u0026#34;/{.git,public,resources}/\u0026#34; --exclude \u0026#34;*.mp4\u0026#34; 这段代码的意思是：\n序号 操作 命令 1 同步本地文件夹 D:\\blog 到远程 oss:tvcdn\\blog rclone sync D:\\blog oss:tvcdn\\blog 2 忽略已存在文件（此参数慎重） --ignore-existing 3 仅更新新文件 -u 4 显示详细进度 -v -P 5 并发传输数量为 20 --transfers=20 6 忽略错误 --ignore-errors 7 缓冲大小为 128M --buffer-size=128M 8 在首次同步前检查文件列表 --check-first 9 使用 10 个检查线程 --checkers=10 10 启用 Google Drive 滥用确认 --drive-acknowledge-abuse 11 排除 .git、public 和 resources 文件夹 --exclude \u0026quot;/{.git,public,resources}/\u0026quot; 12 排除所有 *.mp4 文件 --exclude \u0026quot;*.mp4\u0026quot; ","date":"2024-03-23T18:00:04Z","permalink":"https://blog.lufei.de/p/208/","title":"rclone 过滤，包含和排除规则"},{"content":"git回退到上个版本 git reset --hard HEAD^ 回退到前3次提交之前，以此类推，回退到n次提交之前\ngit reset --hard HEAD~3 回退到指定版本 查看 commit 哈希值\ngit reflog 红色框框的就是哈希值\n例如我要回退到commit信息为: 版本005 的时候,对应哈希值: adacc9e\ngit reset --hard adacc9e 更多版本 要回退到更久之前的版本,使用脚本:\n按 q 退出 再按序号选择版本\n#!/bin/bash # 显示git的reflog git reflog # 提取reflog输出的序号和对应的提交哈希值，并将其存储在数组中 mapfile -t commit_array \u0026lt; \u0026lt;(git reflog | grep -E \u0026#39;^[a-f0-9]+\u0026#39; | cat -n) # 显示序号和对应的提交哈希值供用户选择 for ((i=0; i\u0026lt;${#commit_array[@]}; i++)); do echo \u0026#34;${commit_array[i]}\u0026#34; done # 提示用户输入要恢复的版本号前面对应的数字 read -p \u0026#34;请输入要恢复的版本号前面对应的数字: \u0026#34; version_number # 提取用户选择的提交哈希值 selected_commit_hash=$(echo \u0026#34;${commit_array[version_number-1]}\u0026#34; | awk \u0026#39;{print $2}\u0026#39;) # 使用git reset --hard命令将本地代码回退到指定版本 git reset --hard \u0026#34;$selected_commit_hash\u0026#34; ","date":"2024-03-22T14:29:10Z","permalink":"https://blog.lufei.de/p/207/","title":"Git回退到指定版本"},{"content":"frps脚本 文档来自 https://github.com/stilleshan/frps\n先执行脚本,在自行修改 frps.toml 文件\n安装\nwget https://raw.githubusercontent.com/stilleshan/frps/master/frps_linux_install.sh \u0026amp;\u0026amp; chmod +x frps_linux_install.sh \u0026amp;\u0026amp; ./frps_linux_install.sh 以下为国内镜像\nwget https://github.ioiox.com/stilleshan/frps/raw/branch/master/frps_linux_install.sh \u0026amp;\u0026amp; chmod +x frps_linux_install.sh \u0026amp;\u0026amp; ./frps_linux_install.sh 使用\nvi /usr/local/frp/frps.toml # 修改 frps.toml 配置 sudo systemctl restart frps # 重启 frps 服务即可生效 卸载\nwget https://raw.githubusercontent.com/stilleshan/frps/master/frps_linux_uninstall.sh \u0026amp;\u0026amp; chmod +x frps_linux_uninstall.sh \u0026amp;\u0026amp; ./frps_linux_uninstall.sh # 以下为国内镜像 wget https://github.ioiox.com/stilleshan/frps/raw/branch/master/frps_linux_uninstall.sh \u0026amp;\u0026amp; chmod +x frps_linux_uninstall.sh \u0026amp;\u0026amp; ./frps_linux_uninstall.sh frps相关命令 sudo systemctl start frps # 启动服务 sudo systemctl enable frps # 开机自启 sudo systemctl status frps # 状态查询 sudo systemctl restart frps # 重启服务 sudo systemctl stop frps # 停止服务 ","date":"2024-03-20T13:30:56Z","permalink":"https://blog.lufei.de/p/206/","title":"frps一键安装脚本"},{"content":"安装 Docker（非大陆服务器） wget -qO- get.docker.com | bash docker -v #查看 docker 版本 systemctl enable docker # 设置开机自动启动 安装 Docker-compose（非大陆服务器） sudo curl -L \u0026#34;https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version #查看 docker-compose 版本 安装 Docker（国内服务器） curl -sSL https://get.daocloud.io/docker | sh docker -v #查看 docker 版本 systemctl enable docker # 设置开机自动启动 安装 Docker-compose（国内服务器） curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` \u0026gt; /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version #查看 docker-compose 版本 修改 Docker 配置（可选）\n内容参考：烧饼博客\n以下配置会增加一段自定义内网 IPv6 地址，开启容器的 IPv6 功能，以及限制日志文件大小，防止 Docker 日志塞满硬盘（泪的教训）：\ncat \u0026gt; /etc/docker/daemon.json \u0026lt;\u0026lt;EOF { \u0026#34;log-driver\u0026#34;: \u0026#34;json-file\u0026#34;, \u0026#34;log-opts\u0026#34;: { \u0026#34;max-size\u0026#34;: \u0026#34;20m\u0026#34;, \u0026#34;max-file\u0026#34;: \u0026#34;3\u0026#34; }, \u0026#34;ipv6\u0026#34;: true, \u0026#34;fixed-cidr-v6\u0026#34;: \u0026#34;fd00:dead:beef:c0::/80\u0026#34;, \u0026#34;experimental\u0026#34;:true, \u0026#34;ip6tables\u0026#34;:true } EOF 然后重启 Docker 服务：\nsystemctl restart docker ","date":"2024-03-20T09:00:34Z","permalink":"https://blog.lufei.de/p/205/","title":"安装 Docker 环境"},{"content":" 安装方法： 1、安装vagrant 2、再安装virtualbox 具体不写了，太繁琐。 https://developer.hashicorp.com/vagrant/install?product_intent=vagrant https://www.virtualbox.org/wiki/Downloads\n你可能好奇，不是安装了virtualbox虚拟机吗，干嘛还去安装什么vagrant\n因为使用vagrant安装虚拟机实在是太方便了，那为什么要再安装virtualbox ，因为virtualbox只作为后端，可以不用打开。两者缺一不可\n设置环境变量（可选） VAGRANT_HOME .vagrant.d 默认目录 VAGRANT_DEFAULT_PROVIDER #使用哪种虚拟机 默认virtualbox 路径设置（可选） virtualbox的全局设定：Linux虚拟机安装位置 .vagrant.d 路径 ：环境变量里设置 默认~/.vagrant. Vagrantfile 配置文件路径 教程开始 1、初始化 Vagrantfile 配置 在当前目录下打开终端，输入以下命令初始化：\nvagrant init 会在当前目录生成一个Vagrantfile文件\n2、修改配置： 清空Vagrantfile里面的内容，把以下内容添加到 Vagrantfile 文件\nVagrant.configure(\u0026#34;2\u0026#34;) do |config| config.vm.box = \u0026#34;generic/ubuntu2204\u0026#34; # 规格配置 config.vm.provider :virtualbox do |vbox| vbox.name = \u0026#34;ubuntu-1\u0026#34; vbox.cpus = 1 vbox.memory = 1024 vbox.customize [\u0026#39;modifyvm\u0026#39;, :id, \u0026#39;--graphicscontroller\u0026#39;, \u0026#39;vmsvga\u0026#39;] end # 修改hostname，更新/etc/hosts config.vm.hostname = \u0026#34;ubuntu-1\u0026#34; # 公有网络 设置静态ip config.vm.network \u0026#34;public_network\u0026#34;, ip: \u0026#34;192.168.1.99\u0026#34; end 3、添加镜像box box可以理解为打包好的虚拟机镜像，就像安装windows虚拟机一样，\n官方镜像下载地址：https://app.vagrantup.com/boxes/search\n提供一个国内下载地址：https://www.123pan.com/s/cjqrVv-Wm69d.html\n下载好之后，假如你放在D:\\box目录，使用以下命令添加，\nvagrant box add generic/ubuntu2204 D:\\box\\ubuntu2204.box 注意：generic/ubuntu2204对应 Vagrantfile 文件里的 config.vm.box = \u0026quot;generic/ubuntu2204\u0026quot;\n也就是说，要先添加镜像，这个镜像名称是：generic/ubuntu2204\n如果你在官网下载其他的镜像，下载到本地后可能不是.box后缀，修改改成.box\n注意看上面图片的 ubuntu/trusty64 就是镜像名称，添加的时候使用命令改成：\nvagrant box add ubuntu/trusty64 D:\\box\\trusty64.box Vagrantfile 也要改成 config.vm.box = \u0026quot;ubuntu/trusty64\u0026quot;\n4、创建虚拟机 vagrant up 5、登录虚拟机 vagrant ssh 6、批量创建虚拟机 配置文件如下：\nvm_list = [ { # hash map \u0026#34;name\u0026#34; =\u0026gt; \u0026#34;node-1\u0026#34;, \u0026#34;cpu\u0026#34; =\u0026gt; \u0026#34;2\u0026#34;, \u0026#34;mem\u0026#34; =\u0026gt; \u0026#34;2048\u0026#34;, \u0026#34;ip_addr\u0026#34; =\u0026gt; \u0026#34;192.168.1.10\u0026#34; }, { \u0026#34;name\u0026#34; =\u0026gt; \u0026#34;node-2\u0026#34;, \u0026#34;cpu\u0026#34; =\u0026gt; \u0026#34;1\u0026#34;, \u0026#34;mem\u0026#34; =\u0026gt; \u0026#34;1024\u0026#34;, \u0026#34;ip_addr\u0026#34; =\u0026gt; \u0026#34;192.168.1.11\u0026#34; }, { \u0026#34;name\u0026#34; =\u0026gt; \u0026#34;node-3\u0026#34;, \u0026#34;cpu\u0026#34; =\u0026gt; \u0026#34;1\u0026#34;, \u0026#34;mem\u0026#34; =\u0026gt; \u0026#34;1024\u0026#34;, \u0026#34;ip_addr\u0026#34; =\u0026gt; \u0026#34;192.168.1.12\u0026#34; } ] Vagrant.configure(2) do |config| config.vm.box = \u0026#34;generic/ubuntu2204\u0026#34; vm_list.each do |item| config.vm.define item[\u0026#34;name\u0026#34;] do |node| node.vm.provider \u0026#34;virtualbox\u0026#34; do |vbox| vbox.name = item[\u0026#34;name\u0026#34;]; # 虚拟机名称 vbox.memory = item[\u0026#34;mem\u0026#34;]; # 内存 vbox.cpus = item[\u0026#34;cpu\u0026#34;]; # CPU end # 设置hostanme node.vm.hostname = item[\u0026#34;name\u0026#34;] # 设置IP node.vm.network \u0026#34;public_network\u0026#34;, ip: item[\u0026#34;ip_addr\u0026#34;] end end end 命令后面加虚拟机的名字，可以单独操作虚拟机：\nvagrant up node-1 vagrant halt node-1 vagrant reload node-1 vagrant destroy node-1 vagrant provision node-1 SSH的私钥也分别存放在.vagrant虚拟机名对应的目录下\nssh vagrant@192.168.1.10 -i .vagrant/machines/虚拟机名称/virtualbox/private_key 常用命令 重启：\nvagrant reload --provision #--provision修改配置后 查看box:\nvagrant box list 连接虚拟机\nvagrant ssh 常用命令\nvagrant reload #重新配置虚拟机 vagrant halt #关闭虚拟机 vagrant destroy #删除虚拟机 vagrant suspend #休眠 vagrant resume #唤醒 vagrant box remove #移除box 查看IP：\nip addr show ens33 #ens33是接口名称，使用 ip addr 查看 查看默认路由：\nip route show ","date":"2024-03-19T17:18:49Z","permalink":"https://blog.lufei.de/p/204/","title":"利用vagrant快速创建Linux虚拟机"},{"content":"1、首先查看接口名称 登录到你的 Ubuntu 服务器 22.04，查找 netplan 配置文件。它位于 /etc/netplan 目录下。\ncd /etc/netplan/ ls -l 运行以下 cat 命令以查看 00-installer-config.yaml 的内容。\n注意：配置文件的名称不一定跟我的一样，也可能有多个yaml文件，前面带-rw-r--r--就是我们需要修改的\ncat 00-installer-config.yaml 输出：\n根据上面的输出，可以看到 ens33 就是接口名称，它正在从 DHCP 服务器获取 IP。\n其他命令：\nip addr 或者\nifconfig 或者使用nmcli 查看，需要执行安装sudo apt install network-manager\nnmcli device show ens33 2、编辑 netplan 配置文件 现在，要配置静态 IP 代替 DHCP，使用 vi 或 nano 编辑器编辑 netplan 配置文件并添加以下内容。\nnetwork: renderer: networkd ethernets: ens33: ## network card name dhcp4: false addresses: - 192.168.1.25/24 ## set static IP routes: - to: default via: 192.168.1.1 ## gateway nameservers: addresses: [223.5.5.5,8.8.8.8,192.168.1.1] version: 2 注意：根据你的环境更改 IP 详细信息和接口名称。\n3、重启网络服务 配置完前面的参数之后，就可以重启网络服务生效。\n执行命令1\nsudo systemctl start systemd-networkd 执行命令2\nsudo systemctl status systemd-networkd 执行命令3\nsudo netplan apply 三条命令执行结果应均无报错，如有报错请检查配置参数是否有问题。\n确保其中的 nameserver 行包含了您的 DNS 服务器的正确 IP 地址。\ncat /etc/resolv.conf 运行以下 IP 命令查看接口上的 IP 地址：\nip addr show ens33 要查看默认路由，请运行：\nip route show 上述命令的输出。\n完美，以上命令的输出确认静态 IP 和路由配置成功。\n","date":"2024-03-19T16:46:33Z","permalink":"https://blog.lufei.de/p/203/","title":"在 Ubuntu 服务器 22.04 上设置静态 IP 地址"},{"content":"查看桥接模式下的物理网卡是否对应正确 ","date":"2024-03-18T17:57:37Z","permalink":"https://blog.lufei.de/p/202/","title":"VMware Workstation 虚拟机桥接模式"},{"content":" 共享文件夹设置 1.虚拟机设置 虚拟机菜单栏 -\u0026gt; 虚拟机 -\u0026gt; 设置 -\u0026gt; 选项 -\u0026gt; 共享文件夹 -\u0026gt; 总是启用 -\u0026gt; 添加（我将添加的共享目录命名为share_file） -\u0026gt;确定\n2.VMware Tools安装\n（1）虚拟机菜单栏 -\u0026gt; 虚拟机 -\u0026gt; 安装VMware Tools\n（2）等一会虚拟机会自己打开VMware Tools文件夹\n（3）在该目录下，右键打开命令行，将压缩文件拷贝到桌面上，再到桌面上将其解压缩，安装完成后删除即可。\ncp /media/suzhch/VMwareTools-10.1.6-5214329.tar.gz /home/hadoop/Desktop/ cd /home/hadoop/Desktop/ tar -xzvf VMwareTools-10.1.6-5214329.tar.gz （4）成功之后以管理员root身份执行解压缩之后文件目录里的vmware-install.pl文件即可进行安装\nsudo vmware-tools-distrib/vmware-install.pl （5）然后按照提示输入指令即可。 (yes or no)\n共享文件在 /mnt/hgfs/文件夹下 注意：\n上面的步骤走完之后会出现 在/mnt/hgfs目录下是空 的问题\n解决办法：\n1.vmware-hgfsclient 命令查看当前有哪些共享的目录\nvmware-hgfsclient 会显示你设置的共享文件名，我上面设置的是share_file ,所以我这里显示的是share_file.懒得贴我的示意图了。\n2.安装\nsudo apt-get install open-vm-dkms 3.挂载共享文件\nmount -t vmhgfs .host:/share_file /mnt/hgfs 如果显示 如果显示\nError: cannot mount filesystem: No such device\nubuntu则先执行 sudo apt-get install open-vm-dkms\n然后再执行3.挂载共享文件\n如果还是不行，就重启下Linux，然后再看/mnt/hgfs/文件夹下是否有share_file共享文件。\n网上也有一种说法是使用如下命令\nvmhgfs-fuse .host:/ /mnt/hgfs ","date":"2024-03-18T17:06:08Z","permalink":"https://blog.lufei.de/p/201/","title":"vmware 挂载共享文件夹 虚拟机系列"},{"content":"1. 挂载vmware tools光驱 会自动挂载，然后进入挂载目录：\n打开左侧边栏的VMwareTools：\n2.右键提取tar.gz压缩包 点击所选中的压缩包\n右键将tar.gz压缩包提取到适当位置，我这里是用户下的Downloads文件夹\n然后打开命令窗口 进入解压后的目录\n执行如下命令：一路回车\nsudo ./vmware-install.pl ","date":"2024-03-18T16:21:36Z","permalink":"https://blog.lufei.de/p/200/","title":"虚拟机ubuntu安装vmware tools"},{"content":"Player 版本是免费的，就是没有快照功能，其他与专业版一样，更小巧\nPlayer 密钥其实就是获得商业许可而已，没有啥用处\n密钥 专业版密钥\nYG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 player版密钥\nZY3E8-6GD1L-M8DXP-6WMXZ-ZZ8Y6 专业版下载：https://www.123pan.com/s/cjqrVv-PQq9d.html\nplayer下载：VMware Workstation 15.5.7 Player\n","date":"2024-03-18T15:53:39Z","permalink":"https://blog.lufei.de/p/199/","title":"VMware Workstation Pro15 虚拟机密钥"},{"content":"\n创建挂载目录\ncd /mnt/ sudo mkdir ./gd 挂载：gd是共享文件夹名称，/mnt/gd 是linux挂载目录\nsudo mount -t vboxsf -o uid=1000,gid=1000 gd /mnt/gd 卸载\ncd .. sudo umount /mnt/gd ","date":"2024-03-18T05:25:33Z","permalink":"https://blog.lufei.de/p/198/","title":"virtualbox虚拟机共享文件夹挂载"},{"content":"禁用Delivery Optimization Delivery Optimization是关于windows系统更新的一项服务，它会自动在E盘或某个盘生成文件夹Delivery Optimization，里面是一些缓存，强迫症可能很不爽。\n在服务中关闭，win+r输入services.msc，打开服务管理界面，找到对应服务\n如果你直接右键，修改属性，启动类型为：禁用，通常是拒绝访问\n3.修改注册表\n计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\DoSvc 下start值改为4，win11值为4是禁用，刷新一下，变成禁用即可。\n并且把恢复选项下的所有重启改为无操作\n修改注册表\n","date":"2024-03-17T17:14:07Z","permalink":"https://blog.lufei.de/p/197/","title":"windows 完全禁用传递优化服务 Delivery Optimization"},{"content":"修改condrv的Start值 按win+R，输入: regedit 回车\n计算机\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\condrv 右侧找到 Start 字段，右击 Start 修改\n改完重启电脑\n","date":"2024-03-17T17:01:00Z","permalink":"https://blog.lufei.de/p/196/","title":"解决“Windows Terminal软件报0xd000003a“问题"},{"content":"如果不需要Hyper-V，使用下面的命令卸载Hyper-V角色以及管理工具\nUnInstall-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart 完成上面的命令后，hyper-v就从电脑中卸除。可以开始安装vmware虚拟机软件或者其他第三方虚拟机软件。\n","date":"2024-03-17T16:56:21Z","permalink":"https://blog.lufei.de/p/195/","title":"一条命令完全卸载hyper-v虚拟机"},{"content":" 根据zh-cn_windows_server_2022_x64_dvd_6c73507d.iso原版优化，\n重装前最好使用驱动工具备份一下驱动，因为重装之后，需要先安装驱动，才能正常使用\nhttps://www.123pan.com/s/cjqrVv-gdq9d.html\n","date":"2024-03-16T15:25:08Z","permalink":"https://blog.lufei.de/p/194/","title":"Windows server2022优化版"},{"content":"set-executionpolicy remotesigned 安装：PSReadLine\nInstall-Module PSReadLine -RequiredVersion 2.1.0 安装posh-git\nPowerShellGet\\Install-Module posh-git -Scope CurrentUser -Force 写入配置：\nnotepad $PROFILE 若提示错误：请继续以下代码\nNew-Item -Path $PROFILE -Type File -Force Microsoft.PowerShell_profile.ps1 配置：\nclear # Tab 当按Tab键时，显示所有选项的导航菜单 Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete # 每次回溯输入历史，光标定位于输入内 Set-PSReadLineOption -HistorySearchCursorMovesToEnd # 下一条自动补全 History记录 line模式中相反 Set-PSReadlineKeyHandler -Key Ctrl+n -Function HistorySearchForward # 上一条自动补全 History记录 Set-PSReadlineKeyHandler -Key Ctrl+p -Function HistorySearchBackward # auto suggestions Import-Module PSReadLine Set-PSReadLineOption -PredictionSource History # git自动补全 #Add-PoshGitToProfile Import-Module posh-git ","date":"2024-03-16T15:17:09Z","permalink":"https://blog.lufei.de/p/193/","title":"WindowsTerminal安装posh-git"},{"content":" winget介绍：Windows 程序包管理器：优雅的安装软件, 类似Linux系统apt、dpkg\n本教程只限于server系统,只在winserver2022测试通过，其他系统版本未知\n比如我想安装QQ，输入命令：winget search QQ 搜索，然后使用 winget install \u0026lt;ID\u0026gt;安装\n教程开始\nhttps://www.123pan.com/s/cjqrVv-xf59d.html\n将所有文件下载，解压 microsoft.ui.xaml.2.7.3.zip\n以管理员打开powershell\ncd microsoft.ui.xaml.2.7.3 进入解压目录\n执行命令：\nAdd-AppxPackage -Path .\\tools\\AppX\\x64\\Release\\Microsoft.UI.Xaml.2.7.appx 回到上层目录 cd ..\n执行以下命令：\nAdd-AppxPackage -Path .\\Microsoft.VCLibs.x64.14.00.Desktop.appx 继续\nAdd-AppxPackage .\\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle 最后：\nAdd-AppxProvisionedPackage -Online -Package .\\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -LicensePath .\\24146eb205d040e69ef2d92d7034d97f_License1.xml 最后一点：记得要给winget换源 查看往期文章\n","date":"2024-03-04T17:31:22Z","permalink":"https://blog.lufei.de/p/192/","title":"Winserver2022安装winget"},{"content":" winget 源 内容 地址 微软官方 应用商店中的程序 + 开源软件包 https://cdn.winget.microsoft.com/cache 中科大开 开源软件包 https://mirrors.ustc.edu.cn/winget-source 好像就中科大的提供 winget 国内镜像，有点少啊。\n使用 winget 搜索和安装应用程序 对于不熟悉基于文本界面的用户来说，刚开始使用 winget 时可能有点令人望而却步，但实际上它非常简单易用。winget 的基本用法只涉及搜索和安装应用程序。请按照以下步骤操作：\n1在 Windows 11 中鼠标右击「开始」菜单 – 选择打开「终端管理员」。\n2要搜索应用程序，请执行：\nwinget search \u0026lt;AppName\u0026gt; 例如，输入winget search Chrome来尝试查找 Google Chrome。\n使用 winget 搜索应用程序\n3如果首次使用winget命令，需要同意服务条款，请按Y然后按回车键。查询结果中可以看到包括不同版本的 Chrome，以及一些名称相似的应用程序。\n4为了获取和安装正确的应用程序，最准确的方法是使用第二列中列出的包 ID。例如，要安装 Google Chrome 的稳定版，可以使用如下命令：\nwinget install Google.Chrome 使用 winget 安装应用程序\n如果要安装的程序需要通过 Microsoft Store 获取（源在列表的最后一列），还需要同意服务条款，请按Y然后按回车键。 也可以在安装命令中添加--accept-package-agreements参数，以自动接受任何协议。 5安装完成后，可以重复这个过程来安装其他任何需要的应用程序。\n在 Windows 11 中使用基于文本的命令行界面安装应用程序非常简单，而且有许多应用程序都可以通过winget命令实现静默安装，而且速度非常快。正如我们之前提到的，您也可以使用 Windows Package Manager 安装来自 Microsoft Store 的应用程序。\n使用 winget 更新应用程序 Windows Package Manager 的另一个功能是通过集中的界面保持应用程序的更新。如果有一个或多个应用程序可在 winget 仓库中获取（即使不是通过该仓库安装），也可以使用它一次性轻松更新这些应用：\n1在 Windows 11 中鼠标右击「开始」菜单 – 选择打开「终端管理员」。\n2执行以下命令查看可用的软件更新包列表：\nwinget update ##或者 winget upgrade 使用 winget 更新应用程序\n3要更新特定的软件包，请运行：\nwinget update \u0026lt;ID\u0026gt; 使用 winget 更新应用程序\n请将\u0026lt;ID\u0026gt;替换为想要更新的包 ID。\n4如果要更新所有软件包，可以运行：\nwinget update --all 5也可以添加--include-unknown参数来安装计算机上未知版本软件包的最新版本。\n6软件包将逐个进行更新。同样地，一些安装程序在更新时可能需要人工干预，但可以使用--disable-interactivity参数来跳过。\n您可以随时再次运行此操作，以确保应用程序保持最新。\n使用 winget 卸载应用程序 当然，我们也可以使用 winget 包管理器来卸载应用程序：\n1在 Windows 11 中鼠标右击「开始」菜单 – 选择打开「终端管理员」。\n2运行以下命令查看计算机上安装的所有软件包：\nwinget list 3找到想要卸载的应用程序包 ID，再运行以下命令：\nwinget uninstall \u0026lt;id\u0026gt; 使用 winget 卸载应用程序\n将\u0026lt;id\u0026gt;替换为要移除的包 ID。\n4按照屏幕上的指示进行操作，或者使用--disable-interactivity参数以静默方式移除应用程序。\n使用 winget 导出和导入软件包列表 winget 工具的另一个强大功能是能够将 Windows 中已安装的所有软件包导出为一个 JSON 文件。在设置新电脑时，就可以导入该文件，以便一次性安装列表中的所有应用程序。\n导出软件包列表 要导出 Windows 中已安装的软件包列表，只需运行：\nwinget export -o \u0026lt;output\u0026gt; 将\u0026lt;output\u0026gt;替换为要存储包列表文件的路径。某些应用可能需要同意源协议。\n可以使用--source参数仅筛选来自选定源（如 winget 或 msstore）的软件包。 可以使用--version参数导出特定版本的应用程序，而不是安装最新版本。 使用 winget 导出软件包列表\n还可以将该文件移动到 U 盘或 OneDrive 这样的云服务中，以便稍后在其他设备上导入。在此过程中，可能会出现许多错误，因为许多应用程序是预装在 Windows 中的，或者可能不是通过 winget 或 msstore 源安装的。\n此操作只会导出软件包列表，不包括实际的安装程序。在导入时，新电脑需要连接到 Internet，以便下载和安装这些软件包。\n导入软件包列表 要导入软件包列表，可以使用以下命令：\nwinget import -i \u0026lt;import-file\u0026gt; 其中\u0026lt;import-file\u0026gt;是要导入的文件路径，还可以添加--accept-package-agreements参数以接受所有需要同意的源的协议。\n使用 winget 导入软件包列表\nWindows Package Manager 将尝试逐个安装软件包列表中的所有应用程序。 由于其中一些是随 Windows 11 一起提供的应用程序包，因此可能已经安装了某些应用程序。 对于新的应用程序和更新，可能需要与每个安装程序进行交互，或者在导入时使用--disable-interactivity参数来跳过所有安装程序的交互过程。 Winget 1.6.3482 版本更新 Winget 1.6.3482 版本适用于 Windows 10（1809+）和 Windows 11。在此次更新中，禁用了实验性功能并更新了商店证书，以提高系统安全性。需要注意的是，当前商店证书将于 2024 年 3 月初到期。\n在新版本中，winget configure命令是一个稳定的功能。可以帮助你在 Windows 系统上自动处理设置和配置，从而创建理想的开发环境。通过应用 WinGet 配置文件，能够更轻松地安装和管理软件包、应用程序、编程语言、框架、工具或项目所需的设置。\n此次稳定版本还引入了对软件包依赖性的全面支持。现在，通过使用winget download命令，可以将软件包安装程序下载到本地，实现更加灵活的管理。\n变更摘要：\n在安装包枚举时，现在包括了框架包。 引入了安装程序之间的强弱比较功能。 商店证书已经更新。 本文应该让您对如何使用 winget 包管理器有了一个基本了解。您可以进一步深入，通过添加自定义源获取应用程序，例如公司内部的应用程序存储库，并验证应用程序的清单文件。但本文介绍的核心功能已经非常实用。\n","date":"2024-03-03T20:30:28Z","permalink":"https://blog.lufei.de/p/191/","title":"使用 winget 搜索和安装应用程序"},{"content":"一、 oh my posh 安装 安装方式1： 打开 PowerShell 提示符并运行以下命令：\nSet-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString(\u0026#39;https://ohmyposh.dev/install.ps1\u0026#39;)) 可能会失败，请看安装方式2\n如果下载慢，使用代理：\nset http_proxy=socks5://127.0.0.1:7890 set https_proxy=socks5://127.0.0.1:7890 手动加入环境变量（可不加）：\n注意我的用户名是：Administrator\n$env:Path += \u0026#34;;C:\\Users\\Administrator\\AppData\\Local\\Programs\\oh-my-posh\\bin\u0026#34; 安装方式2： 打开 PowerShell 提示符并运行以下命令：\nwinget install JanDeDobbeleer.OhMyPosh -s winget 但是首先为 winget 更换国内源，为了提高响应速度，以下是操作步骤：\n1以管理员身份打开「命令提示符」。\n2执行以下命令，删除由 Microsoft 维护的官方源：\nwinget source remove winget 3执行以下命令添加 winget 国内源：\nwinget source add [源名称] [源地址] 例如，若要添加中科大开源软件镜像源，可执行以下命令：\nwinget source add winget https://mirrors.ustc.edu.cn/winget-source 建议就使用winget作为名称，以便在需要时轻松重置回官方源。\n4换源完成后，可以通过以下命令进行验证和查看：\nwinget source list 5如果要恢复使用 Microsoft 官方源，可以使用以下命令进行重置：\nwinget source reset winget 源删除：\nwinget source remove msstore 6安装oh my posh：\nwinget install JanDeDobbeleer.OhMyPosh -s winget 二、创建配置文件 配置文件路径： C:\\Users\\Administrator\\Documents\\WindowsPowerShell\\Microsoft.PowerShell_profile.ps1\nnotepad $PROFILE 若提示错误：请继续以下代码\nNew-Item -Path $PROFILE -Type File -Force 然后添加以下代码到Microsoft.PowerShell_profile.ps1\noh-my-posh init pwsh --config $env:POSH_THEMES_PATH\\montys.omp.json | Invoke-Expression 重新加载以使更改生效:\n. $PROFILE 解决“无法加载文件 解决“无法加载文件 ***\\WindowsPowerShell\\profile.ps1，因为在此系统上禁止运行脚本”\nset-executionpolicy remotesigned 自定义主题 主题目录：C:\\Users\\Administrator\\AppData\\Local\\Programs\\oh-my-posh\\themes\nnotepad $PROFILE 改成：\noh-my-posh init pwsh --config $env:POSH_THEMES_PATH\\montys.omp.json | Invoke-Expression cls 只需要修改montys.omp.json，是主题配置文件\n主题预览：\nget-Poshthemes https://ohmyposh.dev/docs/themes\n三、美化 1：字体下载\nhttps://github.com/ryanoasis/nerd-fonts/releases\nhttps://www.123pan.com/s/cjqrVv-J159d.html\n下载：JetBrainsMono.tar.xz 字体 （这款字体能解决乱码）\n解压JetBrainsMono.tar.xz，全选-右键安装即可\n打开powershell, 按 CTRL + SHIFT + , 打开settings.json文件，\n将defaults字段改成如下：\n\u0026#34;defaults\u0026#34;: { \u0026#34;useAcrylic\u0026#34;: true, \u0026#34;acrylicOpacity\u0026#34;: 0.7, \u0026#34;backgroundImage\u0026#34;: \u0026#34;D:/bg/789.jpg\u0026#34;, \u0026#34;backgroundImageOpacity\u0026#34;: 0.4, \u0026#34;fontFace\u0026#34;: \u0026#34;JetBrainsMono Nerd Font Mono\u0026#34;, \u0026#34;fontSize\u0026#34;: 12 }, 或者：\n\u0026#34;defaults\u0026#34;: { \u0026#34;backgroundImage\u0026#34;: \u0026#34;D:/bg/789.jpg\u0026#34;, \u0026#34;backgroundImageOpacity\u0026#34;: 0.4, \u0026#34;font\u0026#34;: { \u0026#34;face\u0026#34;: \u0026#34;JetBrainsMono Nerd Font Mono\u0026#34;, \u0026#34;size\u0026#34;: 12.0 }, \u0026#34;opacity\u0026#34;: 100, \u0026#34;useAcrylic\u0026#34;: true }, acrylicOpacity: 表示亚克力效果的不透明度 值范围在 0（完全透明）到 1（完全不透明）之间\nbackgroundImageOpacity: 表示背景图片的不透明度。值范围在 0（完全透明）到 1（完全不透明）之间\nbackgroundImage: 表示背景图片的路径\nJetBrainsMono Nerd Font Mono 字体\n乱码问题 打开 控制面板—\u0026gt;时钟和区域—\u0026gt;区域-\u0026gt;管理—\u0026gt;更改系统区域设置\n勾选：使用 Unicode UTF-8 提供全球语音支持\n点击确定，这个时候电脑提示需要重启，重启后再打开 powershell 就可以正常显示中文啦。\n","date":"2024-03-03T17:09:39Z","permalink":"https://blog.lufei.de/p/190/","title":"Windows Terminal美化"},{"content":"第一步：为Win10下载新字体 自由字体网，一家专业字体网站，搜罗了全网不少可以免费商用的字体，字体样式也比较齐全，且无需注册登录，即可下载。遗憾的是，度盘链接常挂，默认下载使用的是城通网盘。\n字体天下，和自由字体一样无需注册登录即可下载，且不再使用网盘寄存数据下载速度更快，包含收费字体和免费字体，种类更多更全。\n字体家，无需注册登录即可下载，下载源为百度云盘和城通云盘，下载速度上可能对非VIP用户不是太友好。在免费字体种类，数量上一般，可视作前两者的补充。\n第二步：为Windows10更换全局字体 Win10修改系统默认字体需要利用到一个软件：noMeiryoUI\n软件下载：https://www.123pan.com/s/cjqrVv-fk59d.html\n其他教程： http://www.dians.net/thread-1202.htm\n","date":"2024-03-03T06:49:09Z","permalink":"https://blog.lufei.de/p/189/","title":"Windows10更换全局字体，快速替换Win10默认字体步骤分享"},{"content":"bat脚本 rclone下载地址： https://rclone.org/downloads/\n以windows为例：\n前提：在rclone安装目录需要有rclone.conf配置文件存在,而且配置好了网盘\n@echo off set /p source=请输入源路径： set /p destination=请输入目标路径： set /p proxy=是否需要代理？(yes/no)： if /i \u0026#34;%proxy%\u0026#34;==\u0026#34;yes\u0026#34; ( set http_proxy=socks5://127.0.0.1:7890 set https_proxy=socks5://127.0.0.1:7890 ) else ( set http_proxy= set https_proxy= ) cd /d D:\\rclone-v1.63.0-windows-amd64 rclone copy \u0026#34;%source%\u0026#34; \u0026#34;%destination%\u0026#34; --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse pause rclone.conf配置文件：\n目标标路径可以自动创建(如果没有) ，代理端口7890，如果你的不是7890端口请修改 编码：ANSI 避免windows下运行乱码 将rclone 下载到D盘，文件夹名： rclone-v1.63.0-windows-amd64 这里的代理是针对比如谷歌网盘需要魔法访问的情况 并且代理设置只会在该次运行过程中生效 每次运行这个批处理文件时，用户都需要重新选择是否需要代理 参数解释 例如将E:\\迅雷下载的文件复制到onedrive下的电影目录\nrclone copy E:\\迅雷下载 onedrive:电影 --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 如果用于谷歌网盘，末尾添加参数： --drive-acknowledge-abuse\n这是一个命令行命令，用于使用rclone工具将本地文件夹中的内容复制到远程存储中。以下是各个选项的解释：\nrclone: 这是命令行工具rclone的名称，用于在不同云存储之间进行文件同步和传输。\ncopy: 这是rclone的一个操作命令，用于复制文件和目录。\nE:\\迅雷下载: 这是本地文件夹的路径，即要复制的源文件夹路径。\nonedrive:电影: 这是远程存储的名称和目标路径。在这里，onedrive是远程存储的名称，电影是目标路径。\n--ignore-existing: 这个选项告诉rclone在复制文件时忽略已经存在于目标路径中的文件。\n-u: 这个选项表示只复制更新过的文件，即源文件夹中修改过的文件或者新文件。\n-v: 这个选项表示以详细模式进行操作，会输出更多的信息。\n-P: 这个选项表示在复制过程中显示进度和统计信息。\n--transfers=20: 这个选项指定了同时进行的传输数，这里是20个并发传输。\n--ignore-errors: 这个选项告诉rclone在发生错误时继续进行，而不是停止操作。\n--buffer-size=128M: 这个选项设置了传输缓冲区的大小，这里是128MB。\n--check-first: 这个选项表示在开始复制之前检查目标路径，确保不会覆盖目标路径中的任何现有文件。\n--checkers=10: 这个选项设置了并发检查器的数量，用于检查源和目标文件之间的差异。\n通过这个命令，你可以将本地文件夹中的内容复制到远程存储中，并且可以控制复制过程的各种参数。\n","date":"2024-03-02T13:24:11Z","permalink":"https://blog.lufei.de/p/188/","title":"rclone基于windows一键脚本工具"},{"content":"首先确认已安装Git，可以通过 git –version 命令可以查看当前安装的版本。\n为同一个电脑，配置多个 git 账号，其整体流程如下：\n清空默认的全局 user.name 和 user.email\n为不同的 git 账户生成不同的 ssh-key\n将以上的 ssh-key 分别添加到 ssh-agent 信任列表\n添加以上的公钥到自己的 git 账户中\n在 config 文件配置多个 ssh-key\n测试\n1. 清空默认的全局 user.name 和 user.email git config --global --unset user.name git config --global --unset user.email 查看git配置： git config --global --list\n2、配置多个git的用户名和邮箱 a、单个配置\ngit config --global user.name \u0026#34;yourusername\u0026#34; git config --global user.email \u0026#34;youremail@email.com\u0026#34; b、多个配置\n注意： 这里git config命令没有带—global，表示这是一个局部的设置，也就是这个用户是当前项目的，而不是全局的。\ngit config user.name \u0026#34;1\u0026#34; git config user.email \u0026#34;1@hotmail.com\u0026#34; c、删除配置\ngit config --unset user.name git config --unset user.email 3、生成多个密钥 管理员打开控制台\na、生成gitte仓库的SSH\n指定文件路径，方便后面操作：~/.ssh/id_rsa.gitte，id_rsa.github是秘钥的别名。\nssh-keygen -t rsa -f ~/.ssh/id_rsa.gitte -C \u0026#34;lx@qq.com\u0026#34; b、生成github仓库的SSH\nssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C \u0026#34;lx@qq.com\u0026#34; 4、将 ssh-key 分别添加到 ssh-agent 信任列表 ssh-agent bash ssh-add ~/.ssh/id_rsa.gitte ssh-add ~/.ssh/id_rsa.github 如果看到 Identitiy added: ~/.ssh/id_ras_github，就表示添加成功了。\n5、添加公钥到自己的 git 账户中 使用命令，copy公钥，到 git 账户中粘贴即可。或者打开文件复制，带 pub 的文件\npbcopy \u0026lt; ~/.ssh/id_rsa.gitte 添加步骤参考：https://www.jianshu.com/p/68578d52470c\n6、在 config 文件配置多个 ssh-key 在生成密钥的.ssh 目录下，新建一个config文件，然后配置不同的仓库，\n#Default gitHub user Self Host github.com HostName github.com User git #默认就是git，可以不写 IdentityFile ~/.ssh/id_rsa.github # gitee的配置 host gitee.com # 别名,最好别改 Hostname gitee.com #要连接的服务器 User 4505946500@qq.com #用户名 #密钥文件的地址，注意是私钥 IdentityFile ~/.ssh/id_rsa_gitte #Add gitLab user Host git.lingban.cn HostName git.lingban.cn User wlliu00@ling-ban.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_lingban 7、测试 ssh -T git@gitee.com 传送门：https://juejin.cn/post/6999630383130083358 传送门：https://www.jianshu.com/p/76656fb121d4 本文转自 https://www.cnblogs.com/DL-CODER/p/17302223.html，如有侵权，请联系删除。\n","date":"2024-03-01T13:18:40Z","permalink":"https://blog.lufei.de/p/187/","title":"git 配置多端多个账号（码云、github、gitlab）"},{"content":"\n常见命令 git init git add . git commit -m \u0026#34;初始化\u0026#34; git branch -M main git remote add origin https://github.com/githubusername/demo.git git pull origin main git push -u origin main #首次推送加-u参数 创建和切换分支 1、创建新分支\ngit branch 新分支名称 2、切换分支\ngit checkout 分支名称 3、创建分支的同时，切换到该分支上\ngit checkout -b 新分支名称 合并分支 假如把dev分支合并到main\n首先切换到main分支上\ngit checkout main 如果是多人开发的话，需要把远程main分支上的代码pull下来\ngit pull origin main 然后把dev分支的代码合并到main上\ngit merge dev 警告提示： Please enter a commit message to explain why this merge is necessary\n遇到警告 直接按键盘左上角\u0026quot;Esc\u0026quot; 然后输入:wq 按回车键,或者按 ctrl+x 再输入y回车即可\n最后一步，Push推送到远程仓库\ngit push origin main 删除本地分支 列出所有的本地分支\ngit branch 在删除一个本地分支之前，请确保切换到另一个你不想删除的分支\n切换分支\ngit checkout 分支名 删除本地分支:\ngit branch -D 分支名 大写字母D（这是-- delete --force 的别名），强制删除本地分支，而不考虑其合并状态\n删除远程分支 获取所有远程分支的列表：\ngit branch -r 找到您想要删除的远程分支，然后运行以下命令以删除它：\ngit push origin -d 分支名 pull代码到本地分支 git pull --rebase origin 分支名 push分支到远程仓库 git push origin 分支名 假设本地创建了一个名为dev的分支，远程仓库还没有这个分支，推送的命令是： git push --set-upstream origin dev 删除暂存区 删除暂存区和版本库的文件，但保留了工作区的文件\n例如：\ngit rm -r --cached D:/code/vosk-model-small-cn-0.22 查看状态 git status 同步更新源仓库 a开发者fork了b开发者的项目后，如果b开发人员更新代码后，a开发者如何获得更新？\n1.给fork配置远程库,先查看远程状态\ngit remote -v 2.同步上游仓库, upstream后的地址是你即将同步的上游仓库git地址\ngit remote add upstream https://github.com/xxx/xxxx.git 再次查看状态确认是否配置成功。\ngit remote -v 3.开始同步fork\ngit fetch upstream 4.切换到本地主分支\ngit checkout master 把 upstream/master 分支合并到本地 master 上，这样就完成了同步，并且不会丢掉本地修改的内容。\ngit merge upstream/master 如果想更新到 GitHub 的 fork 上，直接push就好了\ngit push origin master 储藏与清理 储藏会处理工作目录的脏的状态 - 即，修改的跟踪文件与暂存改动 - 然后将未完成的修改保存到一个栈上，而你可以在任何时候重新应用这些改动。\n首先查看状态\ngit status git status -s 新的储藏推送到栈上\ngit stash 查看储藏的东西，可以使用 git stash list\ngit stash list $ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert \u0026#34;added file_size\u0026#34; stash@{2}: WIP on master: 21d80a5 added number to log 应用存储的更改: 最近的储藏\ngit stash apply 应用存储的更改: 索引号为 0的存储\ngit stash apply stash@{0} 移除储藏\n列出存储:\ngit stash list 移除某个存储:例如\ngit stash drop stash@{0} 运行 git stash pop 来应用储藏然后立即从栈上扔掉它\ngit stash pop git报错的解决方法 ssh key有问题 ： Please make sure you have the correct access rights and the repository exists\n解决办法： 1、设置用户名和邮箱\ngit config --global user.name \u0026#34;yourname\u0026#34; git config --global user.email \u0026#34;your@email.com\u0026#34; 2、删除.ssh文件夹下的known_hosts(手动删除即可，不需要git）\n3、生成 SSH Key 一路回车即可\nssh-keygen -t rsa -C \u0026#34;your@email.com\u0026#34; 用户主目录 /.ssh 下有两个文件，id_rsa 是私钥，id_rsa.pub 是公钥, 记事本打开公钥 id_rsa.pub, 然后复制公钥内容\n4、添加 SSH keys\n添加地址: https://github.com/settings/ssh/new\n新建一个 SSH keys，标题自己起，Key 的内容就是id_rsa.pub 公钥内容，然后添加。\n5、在git中输入命令：\nssh -T git@github.com 输入命令：yes\n没有添加远程仓库 fatal: ‘origin’ does not appear to be a git repository\n解决办法：\ngit remote add origin git@github.com:xxse/xx.git 如果remote时出现fatal: remote origin already exists.\n解决方法是删除原有的origin\ngit remote -v git remote rm origin [! [rejected] master -\u0026gt; master (fetch first) github允许你本地仓库有的东西，远程仓库里没有，但不允许远程仓库有的东西，你本地仓库没有。\n所以在提交之前需要先拷贝远程仓库，命令如下\ngit pull --rebase origin master ","date":"2024-02-27T18:16:19Z","permalink":"https://blog.lufei.de/p/186/","title":"vscode:git常用命令"},{"content":"问题描述 在linuxmint桌面版系统下,使用vscode克隆仓库时遇到: Failed to connect to 127.0.0.1 port 7890\n解决办法: 取消 http, https 代理\ngit config --global --unset http.proxy git config --global --unset https.proxy ","date":"2024-02-27T17:01:00Z","permalink":"https://blog.lufei.de/p/185/","title":"Github推送报错：Failed to connect to 127.0.0.1 port 7890"},{"content":"问题描述 由于之前安装了windows10自带的hyper-v虚拟机,在安装vm虚拟机启动镜像时遇到下图bug\n解决办法 1. 关闭hyper-v 在控制面板→卸载程序，\n去掉前面的勾 Hyper-V\n最后三个选项的勾也去掉\n2. 禁用Hyper-v服务 到windows服务中关闭hyper-v的相关服务，以及HV主机服务 改成禁用\n右键我的电脑，管理，\n3.关闭基于虚拟化的安全性 下载工具https://www.microsoft.com/en-us/download/details.aspx?id=53337。\n解压zip包，使用管理员打开PowerShell，cmd也行(管理员) 切换到下载工具的目录，执行：\n.\\DG_Readiness_Tool_v3.6.ps1 -Disable -AutoReboot 执行成功之后电脑将自动重启，按照启动提示 (按F3) 即可关闭继续虚拟化的安全性，VMware即可使用。\n按win+r 输入 msinfo32\n","date":"2024-02-26T16:18:59Z","permalink":"https://blog.lufei.de/p/184/","title":"vmware虚拟机: 您的主机不满足在启用hyper-v 解决方法"},{"content":"使用如下方法成功解决问题，一路回车默认即可。\nsudo apt install open-vm-tools sudo apt install open-vm-tools-desktop vmware tools的开源版本 open-vm-tools 由两个组件构成，\n一个是open-vm-tools，这个装上之后虚拟机就有了显示驱动，屏幕可以自适应大小；\n另一个open-vm-tools-desktop，用于共享剪贴板和文件拖拽功能。\n最后重启虚拟机搞定\n","date":"2024-02-26T15:54:47Z","permalink":"https://blog.lufei.de/p/183/","title":"解决ubuntu虚拟机vmware tools无法共享剪贴板问题"},{"content":"1. 登录root用户 sudo -i 2. 创建新用户 假设新用户: laoge\nsudo useradd -m -s /bin/bash laoge 3. 手动为用户设置密码 sudo passwd laoge 4.赋予新用户sudo权限 echo \u0026#34;laoge ALL=(ALL:ALL) ALL\u0026#34; | sudo tee -a /etc/sudoers 5.禁止ROOT远程SSH登录 sudo vim /etc/ssh/sshd_config 把\nPermitRootLogin yes 改为\nPermitRootLogin no 重启sshd服务 sudo service ssh restart 下次登录服务器使用用户名: laoge 登录 切换root: sudo -i 然后输入密码\n注意：这些修改不影响已经连接的SSH。 只对以后的的连接产生影响。\n其他 如果遇到bug, 则给sudoers写入权限,看具体情况\n给root用户增加w权限\nchmod u+w /etc/sudoers 恢复sudoers文件原来的读写权限\nchmod u-w /etc/sudoers 退出root用户\nexit ","date":"2024-02-25T08:52:24Z","permalink":"https://blog.lufei.de/p/182/","title":"ubuntu创建账户与禁止root用户通过SSH远程登陆"},{"content":" 使用密钥方式登录更安全\n自用一键设置脚本：（基于windows 10 安装了git）\n#!/bin/bash # 创建SSH目录 mkdir -p ~/.ssh cd ~/.ssh # 生成SSH密钥 # 生成SSH密钥 echo -e \u0026#34;\\e[32m开始愉快之旅吧\\e[0m\u0026#34; echo -e \u0026#34;\\e[32m系统将提示您指定密钥对名称: \\e[33m一路回车\\e[32m 请按Enter继续\\e[0m\u0026#34; echo ssh-keygen -t ed25519 -C \u0026#34;注释随意\u0026#34; # 复制公钥到远程服务器 read -p \u0026#34;请输入SSH端口号（默认为22）：\u0026#34; ssh_port ssh_port=${ssh_port:-22} read -p \u0026#34;请输入服务器IP地址：\u0026#34; server_ip ssh-copy-id -i ~/.ssh/id_ed25519.pub -p $ssh_port root@$server_ip # 修改远程服务器配置 ssh -p $ssh_port root@$server_ip \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; if grep -q \u0026#34;^#*PubkeyAuthentication\\s*no\u0026#34; /etc/ssh/sshd_config; then sudo sed -i \u0026#39;s/^#*PubkeyAuthentication\\s*no/ PubkeyAuthentication yes/\u0026#39; /etc/ssh/sshd_config elif grep -q \u0026#34;^#*PubkeyAuthentication\\s*yes\u0026#34; /etc/ssh/sshd_config; then sudo sed -i \u0026#39;s/^#*PubkeyAuthentication\\s*yes/ PubkeyAuthentication yes/\u0026#39; /etc/ssh/sshd_config else echo \u0026#34;PubkeyAuthentication yes\u0026#34; | sudo tee -a /etc/ssh/sshd_config fi sudo service ssh restart exit EOF # 提示用户输入别名和ip read -p \u0026#34;请输入别名：\u0026#34; alias_name # 检查~/.ssh/config文件是否存在，如果不存在则创建并添加配置 if [ ! -f ~/.ssh/config ]; then touch ~/.ssh/config fi # 添加别名和IP到~/.ssh/config文件中 if ! grep -q \u0026#34;Host $alias_name\u0026#34; ~/.ssh/config; then echo \u0026#34;Host $alias_name\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; Hostname $server_ip\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; IdentityFile ~/.ssh/id_ed25519\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config echo \u0026#34; User root\u0026#34; \u0026gt;\u0026gt; ~/.ssh/config fi # 使用SSH密钥登录 echo -e \u0026#34;\\e[33m使用 ssh -p $ssh_port $alias_name 愉快登录吧\\e[0m\u0026#34; ssh -p $ssh_port -i ~/.ssh/id_ed25519 root@$server_ip 双击ovh.bat文件一键登录服务器,还是密钥登录,里面就几个字符\n教程开始 本地配置密钥对 以windows为例\n为了方便代码运行,我安装了Git,因为以下代码在CMD不通用\nGit 下载: https://git-scm.com/\n安装好后,桌面右键-Git Bash Here\n开始整密钥对\nmkdir -p ~/.ssh cd ~/.ssh ssh-keygen -t ed25519 -C \u0026#34;注释随意\u0026#34; 系统将提示您指定密钥对名称: 建议输入名称 请按Enter继续\nEnter file in which to save the key (/c/Users/Administrator/.ssh/id_ed25519)\n接下来，系统会要求您输入安全密码 请按Enter继续\nEnter passphrase (empty for no passphrase)\n如果不设置名称,下次使用时会覆盖掉原有的, 如果设置密码短语，则每次使用该密钥登录服务器时，系统都会提示您输入密码短语。(更安全)\n我的方式是: 设置名称 不设密码\n查看密钥对是否创建:\nls -l | grep \u0026#34;密钥名称\u0026#34; 完成后在C:\\Users\\Administrator\\ .ssh目录下有两个文件,其中xx.pub就是公钥文件\n将公钥复制到远程服务器 也就是复制公钥内容到 ~/.ssh/authorized_keys 文件\n假设你的公钥文件是xx.pub ip是8.8.8.8\n注意: 如果你的服务器默认SSH端口不是22,请使用第二条命令,还要注意如果用户不是root,也要改\nssh-copy-id -i ~/.ssh/xx.pub root@8.8.8.8 如果SSH端口是33\nssh-copy-id -i ~/.ssh/xx.pub -p 33 root@8.8.8.8 提示输入 yes 然后输入你的服务器密码验证, 最后提示下面信息则成功!!\nNumber of key(s) added: 1 Now try logging into the machine, with: \u0026#34;ssh \u0026#39;username@server_ip_address\u0026#39;\u0026#34; and check to make sure that only the key(s) you wanted were added. 登录验证 注意: 这里的xx是密钥,不是xx.pub公钥\nssh -i ~/.ssh/xx root@8.8.8.8 如果SSH端口是33\nssh -p 33 -i ~/.ssh/xx root@8.8.8.8 禁用密码登录 sudo vim /etc/ssh/sshd_config #在你的服务器上操作 修改: 按键盘i进入编辑模式,修改完成按esc键退出模式,最后输入 :wq 保存退出\n主要是第一和第二个\nPubkeyAuthentication yes #允许密钥对连接 PasswordAuthentication no #禁止密码登录 ChallengeResponseAuthentication no UsePAM no PermitRootLogin yes #默认允许root登录 注意: /etc/ssh/sshd_config.d 目录下是否有其他文件,同样有修改,没有就不管\n重启ssh生效\nsudo service ssh restart 验证密码登录是否禁止 ssh root@8.8.8.8 如果SSH端口是33\nssh -p 33 root@8.8.8.8 出现: Permission denied (publickey).提示需要密钥对方式登录,则成功\n最后大招 回到你的本地电脑,打开git bash\nvim ~/.ssh/config 如果没有config文件可以创建,注意没有任何后缀\n文件在 C:\\Users\\Administrator\\ .ssh 目录\n写入以下代码: 删掉注释,不要有多余空格\nHost bb #bb为Host名称 随便一个名称 Hostname 8.8.8.8 #你的IP地址 IdentityFile ~/.ssh/xx #xx私钥路径 User root #用户名 登录验证:\n在cmd中或者git bash 输入ssh bb ##bb为设置的Host名称,即可登录成功 如果之前你设置了安全密码,则需要输入安全密码\nssh bb 如果SSH端口是33\nssh -p 33 bb 桌面新建一个bat文件,写入:\n@echo off ssh bb 双击就登录你的服务器了!!!\n其他:\nchmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh 完结撒花 ","date":"2024-02-24T13:24:47Z","permalink":"https://blog.lufei.de/p/181/","title":"最快配置SSH密钥免密码登录你的服务器"},{"content":"修复ubuntu引导项 由于上面一个修复window引导项动作覆盖了整个启动目录，导致我的电脑ubuntu引导项丢失了，所以我现在又开始修复ubuntu启动引导项。方法类似，不过ubuntu修复启动引导项时候，需要我们安装boot-repair软件\n制作Ubuntu启动U盘，UtroISO即可； 将U盘插入电脑，开机，进入BIOS，选择U盘启动； 出现Ubuntu安装界面，选择第一项（Try ubuntu without install）； 进入ubuntu，打开终端，获取root权限； 执行以下命令：\nsudo add-apt-repository ppa:yannubuntu/boot-repair apt-get update apt-get install boot-repair boot-repair安装完成之后，输入boot-repair命令，进入软件\nboot-repair 最后: reboot\n选择推荐修复\n进入修复等一小会，修复就完成了\n大家可以看到修复提示log\nreboot机器，这个时候大家就可以看到电脑启动的引导项都恢复了。\n","date":"2024-02-24T11:53:43Z","permalink":"https://blog.lufei.de/p/180/","title":"ubuntu20+window双系统启动引导项的修复"},{"content":"先win+R 输入cmd打开命令行，输入powercfg -list 显示已有的电源策略以及对应的编码\npowercfg -list 然后新建一个文本文档，命名为 （比如）Power.bat\n修改为自己的GUID,例如\n381b4222-f694-41f0-9685-ff5bb260df2e 是我的平衡模式GUID\na1841308-3541-4fab-bc81-f71556f20b4a 是节能GUID\n@echo off rem 执行 powercfg -getactivescheme 命令，并将结果保存到临时文件 powercfg /getactivescheme \u0026gt; tmp.txt rem 使用 findstr 命令检查临时文件中是否包含“节能”字符 findstr /C:\u0026#34;节能\u0026#34; tmp.txt \u0026gt;nul rem 检查 findstr 命令的退出代码 if %errorlevel% == 0 ( rem 如果包含，则切换到平衡模式 POWERCFG /SETACTIVE 381b4222-f694-41f0-9685-ff5bb260df2e echo 已切换到平衡模式 rem 使用绿色显示提示 color 0A ) else ( rem 否则切换到节能模式 POWERCFG /SETACTIVE a1841308-3541-4fab-bc81-f71556f20b4a echo 已切换到节能模式 rem 使用黄色显示提示 color 0E ) rem 删除临时文件 del tmp.txt rem 暂停脚本以便在窗口上显示提示 pause ","date":"2024-02-24T07:31:15Z","permalink":"https://blog.lufei.de/p/179/","title":"一键更改电源计划的方法"},{"content":"激活命令 打开PowerShell(管理员),输入以下代码:\nirm https://massgrave.dev/get | iex 选择第三个,再选1\n开启hyper-v 打开PowerShell(管理员),输入以下代码:\nInstall-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart 安装完成会重启\n1.开启远程桌面 2.修改主机名称 3.密码策略 右上角-工具-本地安全策略\n安全设置-账户策略-密码策略\n禁用密码复杂性要求以及最长使用期限为0(不过期)\n4.关闭登录系统按CTRL+ALT+DEL 本地策略-安全选项\n关闭登录密码：\n快捷键WIN+R输入regedit，再粘贴下面这行\n计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\PasswordLess\\Device 将DevicePasswordLessBuildVersion的值改为0\n4.组策略中打开 启用不安全来宾登陆 选项 目的是局域网文件共享: https://blog.csdn.net/u010499872/article/details/115704644\n开始运行，或者快捷键 Win+R 打开运行，输入 gpedit.msc 打开组策略。\n然后分别选择 计算机配置 → 管理模板 → 网络 →Lanman工作站，在右边找到 启用不安全的来宾登陆，双击打开，然后选择启用，点确定即可。\n5.重命名管理员名称 安全设置-本地策略-安全选项\n6.修改管理员密码: cmd输入: net user admin 123\nnet user 管理员名称 密码 7.一键远程登录脚本 将以下代码保存为bat文件,双击运行即可\n@echo off set ip_file=last_ip.txt :menu cls echo 请选择选项： echo [1] 使用上次登录的 IP 地址 echo [2] 输入新的 IP 地址 set /p option=请输入选项数字: if \u0026#34;%option%\u0026#34;==\u0026#34;1\u0026#34; ( if exist %ip_file% ( set /p remote_ip=\u0026lt;%ip_file% goto connect ) else ( echo 没有找到上次登录的 IP 地址。请手动输入新的 IP 地址。 pause goto input_ip ) ) else if \u0026#34;%option%\u0026#34;==\u0026#34;2\u0026#34; ( goto input_ip ) else ( echo 无效的选项，请重新输入。 pause goto menu ) :input_ip set /p remote_ip=请输入远程计算机的IP地址: echo %remote_ip% \u0026gt; %ip_file% goto connect :connect start mstsc.exe /v:%remote_ip% 8.多台设备同时远程桌面连接 按Win+R键输入：gpedit.msc\n依次点击展开计算机配置\u0026gt;管理模板\u0026gt;Windows 组件\u0026gt;远程桌面服务\u0026gt;远程桌面会话主机\u0026gt;连接\n在连接项右侧找到并双击打开将远程桌面服务的用户限制到单独的远程桌面会话配置为禁用\n9.禁用关机需要原因 WIN键+R键，输入gpedit.msc，进入组策略设置\n计算机配置，管理模板，系统，显示\u0026quot;关闭事件跟踪程序\u0026quot;，设置为\u0026quot;已禁用\u0026quot;。\n解决问题：关机时，需要输入关机原因。设置后不再需要。\n10.功能与服务 功能与服务\n1、控制面板\u0026mdash;\u0026gt;服务器管理器\u0026mdash;\u0026gt;本地服务器，IE 增强的安全配置，\u0026ldquo;管理员\u0026quot;与\u0026quot;用户\u0026quot;的下方，勾选\u0026quot;关闭\u0026rdquo;。\n解决问题：IE默认设置下，上网会有一堆安全提示，设置后不再提示，与个人win10保持一致。\n2、控制面板\u0026mdash;\u0026gt;程序和功能\u0026mdash;\u0026gt;启用或关闭 Windwos 功能\u0026mdash;\u0026gt;服务器选择\u0026mdash;\u0026gt;功能\u0026mdash;\u0026gt;勾选 “Direct Play” 、“无线 LAN 服务”、“优质 Windows 音频视频体验” 确认安装\n解决问题：默认如wifi、多媒体、索引服务等是关闭的，添加后可以启用这些功能。\n3、设置服务\n解决问题：windows server 2016默认没有声音、索引选项无法启用，设置服务后可以解决该问题。\n启动两项声音服务，Windows Audio 和 Windows Audio Endpoint Builder，并设为自动属性。\n三、系统属性\n1、WIN键+X键，系统，高级系统设置，性能（设置），高级，调整以优化性能，设置为\u0026quot;程序\u0026quot;。\n2、WIN键+X键，系统，高级系统设置，性能（设置），数据执行保护，选择\u0026quot;仅为基本Windows程序和服务启用DEP(T)\u0026quot;。\n壁纸 https://bz.zzzmh.cn/index#anime\nhttps://konachan.net/post\n","date":"2024-02-23T16:25:20Z","permalink":"https://blog.lufei.de/p/178/","title":"Winserver2022调优"},{"content":"Dockge 项目地址: https://github.com/louislam/dockge\n特色 快速搭建docker compose环境 可以管理compose.yaml文件，包括创建、编辑、启动、停止、重启和删除 能够更新Docker映像 提供交互式编辑器，方便编辑compose.yaml文件 提供交互式网络终端功能 支持管理来自不同Docker主机的多个堆栈 可以将docker run命令转换为compose.yaml Dockge不会绑架编译文件，而是将其存储在硬盘上，可以与普通的docker compose命令交互 1、开源项目地址: https://github.com/louislam/dockge\n2、更新系统\napt update \u0026amp;\u0026amp; apt upgrade 3、安装Docker\n国外服务器推荐:\ncurl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh 或者: 脚本集成安装 Docker Engine 和 Docker Compose\nbash \u0026lt;(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/DockerInstallation.sh) 国内服务器:\nbash \u0026lt;(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh) 4、创建Dockge存储目录\nmkdir -p /opt/stacks /opt/dockge 进入目录\ncd /opt/dockge 下载compose配置文件\ncurl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml 启动服务\ndocker compose up -d 或者: docker-compose up -d\n登录面板: 你的ip:5001\n升级更新:\ncd /opt/dockge docker compose pull \u0026amp;\u0026amp; docker compose up -d nginx-proxy-manager中文版 项目地址: https://github.com/xiaoxinpro/nginx-proxy-manager-zh\n基于nginx-proxy-manager翻译的中文版本\n特色 基于NginxProxyManager/nginx-proxy-manager的预构建docker映像，可以轻松部署到网站上运行 提供免费的SSL证书支持，无需了解太多关于Nginx或Let\u0026rsquo;s Encrypt的信息 快速部署\n环境部署 安装Docker和Docker-compose\n创建YAML文件 创建一个 docker-compose.yml 文件:\nversion: \u0026#39;3\u0026#39; services: app: category_bar: true \u0026#39;chishin/nginx-proxy-manager-zh:release\u0026#39; restart: always ports: - \u0026#39;80:80\u0026#39; - \u0026#39;81:81\u0026#39; - \u0026#39;443:443\u0026#39; volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt 部署运行 docker-compose up -d 登录管理页面 当你的docker容器成功运行，使用浏览器访问81端口。 有些时候需要稍等一段时间。 http://127.0.0.1:81\n默认管理员信息:\nEmail: admin@example.com Password: changeme 第二种安装方法：\ndocker run -d \\ --name nginx-proxy-manager \\ -p 80:80 \\ -p 81:81 \\ -p 443:443 \\ -v ~/docker/data:/data \\ -v ~/docker/letsencrypt:/etc/letsencrypt \\ chishin/nginx-proxy-manager-zh:release 关于DNSPod创建证书失败 此问题在2.9.19版本开始就已经存在，原因是zope引起的，由于ARM架构一直安装失败所以无法打包到镜像中，建议使用如下方法修复此问题：\n首先确保nginx-proxy-manager-zh的Docker容器已经正常运行，使用docker-compose ps查看容器名，这里假设容器名为npm-zh。\n进入容器：（注意替换下文中的容器名）\ndocker exec -it npm-zh bash 执行安装zope命令：\npython3 -m pip install --upgrade pip pip install certbot-dns-dnspod pip install zope 等待安装完成，退出容器：\nexit\n最后刷新浏览器，再次使用DNSPod创建证书即可。\n","date":"2024-02-23T12:46:37Z","permalink":"https://blog.lufei.de/p/177/","title":"docker项目dockge和nginx-proxy-manager-zh中文版"},{"content":"\n一键安装脚本(linux)\ncurl nxtrace.org/nt | bash 一切准备就绪！使用命令 (例如ip地址是1.1.1.1)\nnexttrace 1.1.1.1 更多进阶命令玩法可以用 nexttrace -h 查看哦\n关于软件卸载，因为nexttrace是绿色版单文件，卸载只需输入命令\nrm /usr/local/bin/nexttrace windows使用方法:\nhttps://github.com/nxtrace/NTrace-core/releases/download/v1.2.8/nexttrace_windows_amd64.exe\n下载后将nexttrace_windows_amd64.exe重命名 nexttrace.exe\n然后cmd, 改成你要追踪的ip 注意:打开cmd的位置要在nexttrace.exe所在目录\nnexttrace 你的ip 方法二\n@echo off set /p ip=请输入要跟踪的 IP 地址: D:\\nexttrace.exe %ip% pause 保存为nexttrace.bat文件双击运行\n注意: D:\\nexttrace.exe 是nexttrace.exe所在的目录,这里是D盘\n","date":"2024-02-22T17:28:56Z","permalink":"https://blog.lufei.de/p/176/","title":"一款追求轻量化的开源可视化路由跟踪工具-NextTrace"},{"content":"原因 ：由于安装了宝塔服务，添加了防火墙，对原有的samba服务产生了影响。\n查看某网络软件需要的端口: 宝塔面板后台放行: 445和139端口\nsudo netstat -tunlp | grep \u0026#39;smb\u0026#39; tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 2857/smbd tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2857/smbd tcp6 0 0 :::445 :::* LISTEN 2857/smbd tcp6 0 0 :::139 :::* LISTEN 2857/smbd\n以下来自AI的答案: 要在 Ubuntu 上放行端口 445 和 139，您可以使用 ufw（Uncomplicated Firewall）工具进行配置。以下是在 Ubuntu 上使用 ufw 放行端口的步骤：\n检查 ufw 状态： 首先，检查 ufw 是否已启用并运行。您可以使用以下命令检查状态：\nsudo ufw status 允许端口： 如果 ufw 已启用，但端口 445 和 139 尚未放行，您可以使用以下命令允许这些端口：\nsudo ufw allow 445 sudo ufw allow 139 启用防火墙： 如果 ufw 尚未启用，您可以使用以下命令启用它：\nsudo ufw enable 确认配置： 最后，您可以再次运行 ufw status 命令来确认端口已经被放行：\nsudo ufw status 请注意，放行端口可能会带来安全风险，请确保您了解潜在的风险并采取适当的安全措施。如果您使用其他防火墙工具或有特定的网络配置，请提供更多详细信息，以便我能够提供更准确的指导。\n","date":"2024-02-22T16:51:11Z","permalink":"https://blog.lufei.de/p/175/","title":"关于安装宝塔后 samba访问失败 网络管理"},{"content":"大陆和香港服务器\n#优先选择这条命令执行 sed -i \u0026#34;/bt.cn/d\u0026#34; /etc/hosts echo \u0026#34;103.179.243.14 www.bt.cn download.bt.cn api.bt.cn dg1.bt.cn dg2.bt.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts 海外服务器:\nsed -i \u0026#34;/bt.cn/d\u0026#34; /etc/hosts echo \u0026#34;128.1.164.196 www.bt.cn download.bt.cn api.bt.cn dg1.bt.cn dg2.bt.cn\u0026#34; \u0026gt;\u0026gt; /etc/hosts ","date":"2024-02-22T16:08:59Z","permalink":"https://blog.lufei.de/p/174/","title":"宝塔面板软件商店列表无法打开解决办法"},{"content":"工具 视频教程:\n我提供的文件是配置好的,可以直接使用,免去你花时间配置和美化主题的时间\n准备好: DiskGenius, refind文件\nhttps://www.123pan.com/s/cjqrVv-fUL9d.html\nhttps://www.123pan.com/s/cjqrVv-aUL9d.html\n打开DiskGenius,打开efi分区,将refind文件夹复制到efi分区\n左上角-工具-设置UEFi启动项\n","date":"2024-02-22T14:34:37Z","permalink":"https://blog.lufei.de/p/173/","title":"refind，可能是颜值最高的多系统、硬盘引导神器,efi"},{"content":"安装 Samba 服务 sudo apt install samba 查看版本,确保正确安装\nsamba --version 配置需要共享的目录 例如: /mnt/500GB 为挂载目录\n# 新建目录，用于共享 sudo mkdir /mnt/500GB # 更改权限信息 sudo chown nobody:nogroup /mnt/500GB # 给所有用户添加读写权限 sudo chmod 777 /mnt/500GB #对目录的Others权限添加w(写)权限 sudo chmod o+w /mnt/500GB 配置挂载: 安装vim:\nsudo apt install vim 编辑: smb.conf\nsudo vim /etc/samba/smb.conf 注意: qige为你的ubuntu用户名,在 Linux 中必须存在,请改为自己的\n在smb.conf末尾添加下面的代码\n[share] comment = share folder browseable = yes path = /mnt/500GB create mask = 0777 directory mask =0777 valid users = qige force user = qige force group = qige public = yes available = yes writable = yes 添加 Samba 用户 添加 Samba 用户，用于在访问共享目录时使用。这里添加的用户是之前配置的用户名。\nsudo smbpasswd -a qige 重启 Samba 服务\nsudo service smbd restart 其他\n#或者 sudo /etc/init.d/smbd restart sudo service nmbd restart #或者以下方法 sudo restart smbd sudo restart nmbd 使用方法: windows: 在运行框输入: 也就是的ubuntu IP地址\n例如:\n\\\\192.168.1.xx 即可成功smb\n其他问题 问题描述\n磁盘被写保护，请去掉写保护或使用另一张磁盘。 解决方案\n回到windows, 请您通过以下操作清除磁盘的只读属性。\n在开始菜单的运行中输入diskpart命令。 diskpart 执行以下命令，查看磁盘清单。\nlist disk 执行以下命令，选择磁盘。\nselect disk 1 说明\n1指的是磁盘编号，请您根据实际环境填写。\n执行以下命令，清除只读属性。\natt disk clear readonly ","date":"2024-02-22T13:05:09Z","permalink":"https://blog.lufei.de/p/172/","title":"Ubuntu 20.04 搭建 Samba 服务"},{"content":"更改注册表设置 在注册表编辑器中更改一些设置，也能解决允许远程协助连接这台计算机灰色无法勾选这一问题，以下是具体的操作步骤。\n步骤1. 按**“Windows + R”打开运行框，输入“regedit”，然后单击“确定”**。\n步骤2. 导航到：\n计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services 步骤3. 在右侧窗格，右键单击并选择**“新建”，然后单击第三个“DWORD (32位)值”**，并命名为 “fDenyTSConnections”。\n步骤4. 双击打开 “fDenyTSConnections”，将**“数值数据”更改为“0”，然后单击“确定”**。\n说明： “0”表示“允许用户通过终端服务/远程桌面远程连接”；“1”表示“禁止使用终端服务/远程桌面进行远程连接”。\n","date":"2024-02-21T11:00:37Z","permalink":"https://blog.lufei.de/p/171/","title":"远程协助连接这台计算机灰色无法勾选?"},{"content":" 物理网卡属性里去掉勾选 Hyper-v Extensible Virtual Switch 或者叫 Hyper-v 可扩展的虚拟交换机\n创建虚拟交换机失败解决办法 创建之前先关闭Hyper-v Extensible Virtual Switch\n其他方法:\n步骤 操作 1 在“启用或关闭Windows功能”中卸载Hyper-V 2 重启计算机 3 以管理员方式在“运行”中运行命令netsh winsock reset 4 重启计算机 5 重启后查看“网络适配器”中是否有其他非物理网卡，若有则删除 6 确认物理网卡属性中没有勾选或存在“Hyper-v Extensible Virtual Switch” 7 在“启用或关闭Windows功能”中重新启用Hyper-V 8 重启计算机 9 确认要绑定“虚拟交换机”的物理网卡属性中没有勾选“Hyper-v Extensible Virtual Switch” 请注意，这些步骤仅供参考，具体操作可能因系统版本和配置而有所不同。在执行任何更改之前，请确保备份重要数据并谨慎操作。\n网络共享重启失效解决办法 一键脚本: (方法1)推荐 @echo off REM 设置输出编码为UTF-8 chcp 65001 \u0026gt; nul REM 导入注册表键值 reg add \u0026#34;HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\SharedAccess\u0026#34; /v \u0026#34;EnableRebootPersistConnection\u0026#34; /t REG_DWORD /d 1 /f echo 注册表键值已创建并设置为1。 REM 设置输出编码为UTF-8 chcp 65001 \u0026gt; nul REM 使用 sc 命令更改服务启动类型为自动 sc config SharedAccess start= auto echo 服务 \u0026#34;Internet Connection Sharing (ICS)\u0026#34; 的启动类型已更改为自动。 pause 将上述代码保存为扩展名为.bat文件，例如enable_reboot.bat。然后，双击运行该批处理文件\n手动修复 (方法2) 修改注册表 快捷键 win+r 输入 regedit 确认打开 注册表编辑器\n输入注册表路径\n计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedAccess\n新建项 “DWORD(32位)值(D) 名称 EnableRebootPersistConnection 并修改值为1\n修改服务Internet Connection Sharing (ICS) 启动类型为自动 打开服务面板 重新设置共享链接 这次重启后不会失效了\n","date":"2024-02-20T21:41:42Z","permalink":"https://blog.lufei.de/p/170/","title":"Hyper-v创建虚拟交换机失败与网络共享重启失效解决办法"},{"content":"AdGuard Home设置 AdGuard Home作为DNS分流,拦截广告效果并不如浏览器插件,但是作为DNS服务器使用是非常优秀的, 拦截广告的方法很多,不是一定要用他,不要本末倒置\n重要设置: 前面两个DNS使用你运营商的,解析才会快,查询地址:\nhttps://www.xdtool.com/dnsdx\n你是电信就查电信,其他类似\n后面三个使用: 百度,阿里,腾讯,就行了,不是越多越好.\n180.76.76.76 223.5.5.5 119.29.29.29 选择: 并行请求\nBootstrap DNS 服务器也使用运营商的\n其他默认就好,日志选择7天就行\nDNS黑名单 两个足以,添加方法:\n点击添加黑名单\u0026ndash;从列表中选择\n","date":"2024-02-20T15:51:38Z","permalink":"https://blog.lufei.de/p/169/","title":"AdGuard Home - DNS缓存加速"},{"content":"在已经安装好的winserver2022上打好驱动，这个如果缺的话，可以在网上寻找就好了\n有个重要的核显驱动在因特尔官网\n英特尔® 显卡 – Windows* DCH 驱动程序 (intel.cn)\n激活命令 打开PowerShell(管理员),输入以下代码:\nirm https://massgrave.dev/get | iex 或者使用激活脚本:\nhttps://www.123pan.com/s/cjqrVv-6rL9d.html\n开启hyper-v 一键开启:\n打开PowerShell(管理员),输入以下代码:\nInstall-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart 手动开启:\n启用windows功能\n开启hyper-v\nSMB\n剩下暂时都不管，后期还可以改\n安装相关内容后重启\n修改用户名组策略 修改计算机名 修改组策略 gpedit.msc 修改如下\n重命名管理员，然后重启\n下载DDA https://www.123pan.com/s/cjqrVv-yrL9d.html\nchanket/DDA: 实现Hyper-V离散设备分配功能的图形界面工具。A GUI Tool For Hyper-V\u0026rsquo;s Discrete Device Assignment(DDA). (github.com)\n下载starwind v2v converter 可以将img直接转化为虚拟磁盘启动\nhttps://www.starwindsoftware.com/tmplink/starwindconverter.exe\nhttps://www.123pan.com/s/cjqrVv-jrL9d.html\n创建交换机 我要做一个主路由模式的网络结构\n打开hyperv管理\n当前没连接网线的是WAN口，之后要在这个口进行PPPoE拨号\n在设置里面找到当前连接的网口\n现在连网线的是LAN口，之后要连接硬路由的口，这里同样选外部\n下载openwrt并转化 Releases · klever1988/nanopi-openwrt · GitHub\n选择X86版本\n新建虚拟机 打开hyperv管理器\n新建，然后在代数选择第一代，第二代启动不了ovo\n内存1G就行\n存储最大选择2G差不多了\n","date":"2024-02-19T20:11:12Z","permalink":"https://blog.lufei.de/p/168/","title":"winserver2022安装hyper-v"},{"content":"使用 PowerShell 启用 Hyper-V 以管理员身份打开 PowerShell 控制台。\n运行以下命令：\nPowerShell复制\nEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 如果无法找到此命令，请确保你以管理员身份运行 PowerShell。\n安装完成后，请重启。\n","date":"2024-02-18T15:03:44Z","permalink":"https://blog.lufei.de/p/167/","title":"一条命令在 Windows 10 上安装 Hyper-V虚拟机"},{"content":"工具地址:\nhttps://otp.landian.vip/zh-cn/download.html\n提示: 右键图片-在新标签页打开图片即可放大观看\n1.部署\n第3步, 选择: Microsoft 365企业应用版\n2.激活\n选择 Office Mondo 2016 - 批量许可证\nkms主机写入:\nkms.loli.beer\n","date":"2024-02-18T11:56:41Z","permalink":"https://blog.lufei.de/p/166/","title":"Office 365正版免费激活！2024最新激活方法！"},{"content":"中兴F4600T光猫超级密码获取方法（IOS） 1.工具和软件准备：iPhone或者iPad、Stream抓包软件，小翼管家。如下图：\n软件准备\n2.登录小翼管家，查看光猫是否绑定。\n小翼管家主页面\n3.点击《家庭网络》，就可以看到光猫的控制界面了。\n光猫管理界面\n4.点击《网关管理》，可以看到指示灯、休眠模式等这个界面。这个页面不要关闭，打开Stream软件。\n5.打开Stream软件后，点击《设置抓包模式》\u0026mdash;《白名单模式》\u0026mdash;《白名单设置》\u0026mdash;《189cube.com》\u0026ndash;《立即生效》，请看图。\n设置抓包模式\n白名单设置\n添加189cube.com\n6.回到Stream抓包主页面，点击开始抓包。\n开始抓包\n7.返回到小翼管家APP，点击《指示灯》，反复开关几次。\n反复开关几次指示灯\n8.返回Stream抓包界面，点击《停止抓包》\u0026mdash;《抓包历史》。\n停止抓包\u0026mdash;查看抓包历史\n9.可以看到有个19秒的抓包，点击打开，有两个请求，随意点开一个。\n抓包历史，随意点开一个\n点开后的界面\n10.点击右上角的《分享》\u0026mdash;《编辑重放请求》\u0026mdash;《下滑到最下端》\u0026mdash;《请求体\u0026mdash;JASON》\u0026ndash;《原始数据》\u0026mdash;删除所有的字段，替换为：\n{ \u0026#34;Params\u0026#34;: [], \u0026#34;MethodName\u0026#34;: \u0026#34;GetTAPasswd\u0026#34;, \u0026#34;RPCMethod\u0026#34;: \u0026#34;CallMethod\u0026#34;, \u0026#34;ObjectPath\u0026#34;: \u0026#34;/com/ctc/igd1/Telecom/System\u0026#34;, \u0026#34;InterfaceName\u0026#34;: \u0026#34;com.ctc.igd1.SysCmd\u0026#34;, \u0026#34;ServiceName\u0026#34;: \u0026#34;com.ctc.igd1\u0026#34; } 查看JSON请求体\n点击原始数据\n替换为本教程里的代码\n11.替换完以后，点击《存储》—右上角的类似《播放》按钮\u0026mdash;《响应体\u0026mdash;点击Respond Body》即可看到一个telecomadmin+8位数字，它就是超级密码。\n点击右上角的播放按钮\n点开响应体，即可看到超级密码\n超级密码界面\n12.登录光猫的管理地址：192.168.1.1，账户: telecomadmin，超级密码：telecomadmin+8位数字，即可进行后续的高端操作了。\n","date":"2024-02-18T06:45:31Z","permalink":"https://blog.lufei.de/p/165/","title":"中兴F4600T光猫超级密码获取方法"},{"content":"使用管理员权限打开PowerShell,输入命令:\nirm https://massgrave.dev/get | iex 中文版下载地址:\nhttps://www.123pan.com/s/cjqrVv-6rL9d.html\n打开地址,右上角点击下载按钮\nhttps://github.com/woniu336/open_shell/blob/main/MAS中文版.cmd MAS脚本官网：https://massgrave.dev/\nMAS脚本Github：https://github.com/massgravel/Microsoft-Activation-Scripts\nHEU KMS Activator：https://github.com/zbezj/HEU_KMS_Activator/releases\n","date":"2024-02-17T07:43:04Z","permalink":"https://blog.lufei.de/p/164/","title":"超简单！一键永久激活Windows/Office"},{"content":" 注意: 用户名不是root,是你的登录名\n更新软件下载源\nsudo apt update 安装ssh服务\nsudo apt install openssh-server 开启防火墙ssh的服务端口\nsudo ufw allow ssh 附：还可以查看或更改ssh服务的状态\n查看ssh服务状态\nsystemctl status ssh 关闭ssh服务\nsystemctl stop ssh 开启ssh服务\nsystemctl start ssh 重启ssh服务\nsystemctl restart ssh 设置开启自启\nsudo systemctl enable ssh 关闭开机自启\nsudo systemctl disable ssh ","date":"2024-02-16T20:29:36Z","permalink":"https://blog.lufei.de/p/163/","title":"ubuntu 桌面版20.04 开启SSH服务"},{"content":"本文介绍了在家用电脑上搭建网站的简单步骤： 安装Xubuntu操作系统。 下载并安装宝塔面板，用于网站管理。 使用Cloudflare Tunnels实现内网穿透，以便从外部访问您的网站。 前提: 你有域名在Cloudflare\n这些步骤可以帮助个人和小型企业轻松创建和托管自己的在线网站。\n1.安装Xubuntu操作系统 下载地址: xubuntu-20.04.6-desktop-amd64.iso\nxubuntu-20.04.6-desktop-amd64.iso\n安装的方法很多,我这里使用的方法是:\n在windows10 ltsc上面安装VMware-workstation虚拟机的方式安装\nhttps://www.123pan.com/s/cjqrVv-ZCL9d.html\n使用vm虚拟机的时候注意版本选择ubuntu\n2. 换源 方法1: Xubuntu安装成功后,进入桌面,右键-应用程序-设置-软件和更新\n勾选-选择中国服务器-其他\n打开终端切换root权限,输入密码\nsudo -i 然后:\napt-get update 接着:\napt-get upgrade 方法2: 一键换源脚本:\nbash \u0026lt;(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh) 方法3:(不推荐) 手动换源:\ncp /etc/apt/sources.list old_sources.list sudo vi /etc/apt/sources.list 提示: 输入%d清除文本内容,然后复制以下代码:\ndeb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse 按esc,然后:wq 保存退出\n接着:\nsudo apt update 常用的Ubuntu版本代号：\nUbuntu 22.04：jammy\nUbuntu 20.04：focal\n登录ssh终端,开启ssh方法:\nhttps://blog.leshans.eu.org/p/163/ 注意: 用户名不是root,是登录名\n也可以在虚拟机的xubuntu终端敲命令\n3.安装宝塔面板 国内无法访问github,所以用到反代: https://mirror.ghproxy.com\n安装curl:\napt install -y curl 一键脚本:\ncurl -sS -O https://mirror.ghproxy.com/https://raw.githubusercontent.com/woniu336/open_shell/main/tb-localhost.sh \u0026amp;\u0026amp; chmod +x tb-localhost.sh \u0026amp;\u0026amp; ./tb-localhost.sh 去除宝塔面板强制绑定账号:\nrm -f /www/server/panel/data/bind.pl 去后门:\nsudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request 手动破解:\nsed -i \u0026#39;s/\u0026#34;endtime\u0026#34;: -1/\u0026#34;endtime\u0026#34;: 999999999999/g\u0026#39; /www/server/panel/data/plugin.json chattr +i /www/server/panel/data/plugin.json 优化脚本:\ncurl -sS -O https://mirror.ghproxy.com/https://raw.githubusercontent.com/woniu336/open_shell/main/optimize.sh \u0026amp;\u0026amp; chmod +x optimize.sh \u0026amp;\u0026amp; ./optimize.sh 4.安装Cloudflare Tunnels实现内网穿透 选择debian,复制代码,注意:\ncurl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb 改成:\ncurl -L --output cloudflared.deb https://mirror.ghproxy.com/https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb 5.最后 宝塔面板正常安装所需服务,建站.域名解析不用管,cf会自动解析\n查看ubuntu的版本号\nlsb_release -a ","date":"2024-02-16T19:11:37Z","permalink":"https://blog.lufei.de/p/162/","title":"家用电脑搭建网站 - Xubuntu安装、宝塔面板和Cloudflare Tunnels"},{"content":" 网站优化之宝塔面板Nginx编译pagespeed实现webp化，目的为通过重写网页来减少延迟和带宽，从而帮助提高Web速度。Ngx_pagespeed是一个开源的Nginx模块，由Google创建，主要的功能是针对前端页面而进行服务器端的优化，对前端设计人员来说，可以省去优化css、js以及图片的过程。\n单核处理器不推荐使用此模块，推荐Nginx fastcgi_cache\nNginx fastcgi_cache：https://blog.leshans.eu.org/p/159/\nNgx_pagespeed功能简介 图像优化：剥离元数据、动态调整，重新压缩 CSS和JavaScript压缩、合并、级联、内联 推迟图像和JavaScript加载 对HTML重写、压缩空格、去除注释等 提升缓存周期 缺点：可能因为服务器端的优化而使系统增加负载，但从减少客户请求数的角度去看，牺牲部分服务器性能还是值得的。\npagespeed官网文档：https://www.modpagespeed.com/doc/configuration\n项目：https://github.com/apache/incubator-pagespeed-ngx/\n1.宝塔面板编译Ngx_pagespeed 1）首先卸载原有Nginx，然后点击“编译安装”，点击添加自定义模块 2）添加自定义模块具体填写，具体看图： 模块名称：pagespeed 模块描述：pagespeed 模块参数: --add-module=/www/server/ngx_pagespeed 前置脚本：#具体ngx_pagespeed前置脚本代码如下：\ncd /www/server wget https://github.com/apache/incubator-pagespeed-ngx/archive/v1.13.35.2-stable.zip unzip v1.13.35.2-stable.zip rm v1.13.35.2-stable.zip NPS_DIR=$(find . -name \u0026#34;*pagespeed-ngx-1.13.35.2-stable\u0026#34; -type d) mv $NPS_DIR ngx_pagespeed cd ngx_pagespeed NPS_RELEASE_NUMBER=${1.13.35.2-stable/stable/} PSPL_URL=https://dl.google.com/dl/page-speed/psol/${NPS_RELEASE_NUMBER}x64.tar.gz [ -e scripts/format_binary_url.sh ] PSPL_URL=$(scripts/format_binary_url.sh PSOL_BINARY_URL) wget ${PSPL_URL} tar -xzvf $(basename ${PSPL_URL}) rm $(basename ${PSPL_URL}) 3）全部放置好后，勾选，提交 4）安装好的效果如图： 编译安装速度有点慢，需要等待，安装好可以在ssh执行命令：nginx -V\n看到红框的位置有pagespeed，说明已经顺利编译安装好了~\n2.网站Nginx_pagespeed优化配置 1）Nginx配置 安装好之后，打开Nginx配置，加入以下代码（注意位置）\n下方中缓存文件位置请提前创建好：/tmp/ngx_pagespeed_cache（这里也可以放到内存里面，如果你的磁盘IO很慢的话建议采用此方式，毕竟内存的读写速度非常快）\n代码如下：\n# 启用ngx_pagespeed 开始 pagespeed on; #路径请提前创建好，可以放在内存也可以放在临时文件夹中 pagespeed CreateSharedMemoryMetadataCache /tmp/ngx_pagespeed_cache 51200; pagespeed DefaultSharedMemoryCacheKB 51200; pagespeed FileCachePath /tmp/ngx_pagespeed_cache; pagespeed FileCacheSizeKb 2048000; pagespeed FileCacheCleanIntervalMs 43200000; pagespeed FileCacheInodeLimit 500000; # 过滤器级别（自定义模式） pagespeed RewriteLevel PassThrough; # 一个标识而已（若在浏览器开发者响应标头看到此标识，则说明 PageSpeed 生效） pagespeed XHeaderValue \u0026#34;Powered By xcbtmw.com\u0026#34;; # HTML页面链接转小写（SEO 优化，推荐） pagespeed LowercaseHtmlNames on; #PageSpeed能够根据响应头中指定的任何内容安全策略调整其优化 pagespeed HonorCsp on; ###########缓存 ########## #相当于同时使用了extend_cache_images, extend_cache_scripts和 extend_cache_css pagespeed EnableFilters extend_cache; pagespeed EnableFilters extend_cache_pdfs; pagespeed EnableFilters local_storage_cache; #开启使用Redis（和memcached只能先其一） #pagespeed RedisServer \u0026#34;127.0.0.1:6379\u0026#34;; # memcached优化,如果没有memcached优化请删去 pagespeed MemcachedThreads 1; pagespeed MemcachedServers \u0026#34;127.0.0.1:11211\u0026#34;; ######## 过滤规则 ######## # 过滤不需要启用的目录或文件 pagespeed Disallow \u0026#34;*/wp-admin/*\u0026#34;; pagespeed Disallow \u0026#34;*/wp-login.php*\u0026#34;; pagespeed Disallow \u0026#34;*/vps-pingfen/\u0026#34;; # 启用压缩空白过滤器 pagespeed EnableFilters collapse_whitespace; # 预解析DNS查询 pagespeed EnableFilters insert_dns_prefetch; ########JS和CSS######## # 删除带默认属性的标签 pagespeed EnableFilters elide_attributes; # 更换被导入文件的@import，精简CSS文件 pagespeed EnableFilters flatten_css_imports; pagespeed CssFlattenMaxBytes 5120; # 启用JavaScript缩小机制 pagespeed EnableFilters rewrite_javascript; ####### 图片######## # 延时加载图片 pagespeed EnableFilters lazyload_images; # 不加载显示区域以外的图片，下方这个是延迟加载图片，如果没有就注释掉 pagespeed LazyloadImagesAfterOnload off; pagespeed LazyloadImagesBlankUrl \u0026#34;https://www.xcbtmw.com/1.gif\u0026#34;; # 启用图片优化机制 pagespeed EnableFilters recompress_images; # 将JPEG图片转化为webp格式 pagespeed EnableFilters convert_jpeg_to_webp; # 将动画Gif图片转化为动画webp格式 pagespeed EnableFilters convert_to_webp_animated; pagespeed EnableFilters inline_preview_images; pagespeed EnableFilters resize_mobile_images; pagespeed EnableFilters responsive_images,resize_images; pagespeed EnableFilters insert_image_dimensions; pagespeed EnableFilters resize_rendered_image_dimensions; pagespeed EnableFilters strip_image_meta_data; pagespeed EnableFilters convert_jpeg_to_webp,convert_to_webp_lossless,convert_to_webp_animated; pagespeed EnableFilters sprite_images; pagespeed EnableFilters convert_png_to_jpeg,convert_jpeg_to_webp; #让JS里引用的图片也加入优化 pagespeed InPlaceResourceOptimization on; pagespeed EnableFilters in_place_optimize_for_browser; # 启用ngx_pagespeed 结束 2）网站配置 打开对应网站的配置文件，在如图位置输入以下代码:\n网站配置代码如下：\n# 启用ngx_pagespeed 开始 location ~ \u0026#34;.pagespeed.([a-z].)?[a-z]{2}.[^.]{10}.[^.]+\u0026#34; { add_header \u0026#34;\u0026#34; \u0026#34;\u0026#34;; } location ~ \u0026#34;^/pagespeed_static/\u0026#34; { } location ~ \u0026#34;^/ngx_pagespeed_beacon$\u0026#34; { } location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; } location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; } location /ngx_pagespeed_message { allow 127.0.0.1; deny all; } location /pagespeed_console { allow 127.0.0.1; deny all; } location ~ ^/pagespeed_admin { allow 127.0.0.1; deny all; } location ~ ^/pagespeed_global_admin { allow 127.0.0.1; deny all; } # 启用ngx_pagespeed 结束 3）注意事项 memcached和redis没有的就注释掉 仔细阅读注释 4.Ngx_pagespeed加速效果 开启后就可以看到图片被转成了webp格式，另外CSS和JS文件地址也会被重写\n然后在咱们设置的缓存文件位置处也可以看到文件\n5.清除Ngx_pagespeed缓存 手动删除或者命令行\n#手动删除，该目录为你在nginx设置的缓存目录 rm -fr /tmp/ngx_pagespeed_cache/* #或者由pagespeed清空缓存 5秒后开始 sudo touch /tmp/ngx_pagespeed_cache/cache.flush ","date":"2024-02-12T15:20:04Z","permalink":"https://blog.lufei.de/p/161/","title":"宝塔面板Nginx编译pagespeed实现webp化"},{"content":" 项目地址: https://github.com/521xueweihan/GitHub520 (推荐)\n复制下面的内容 20.205.243.166 github.com 185.199.108.133 raw.githubusercontent.com 185.199.109.133 raw.githubusercontent.com 185.199.110.133 raw.githubusercontent.com 185.199.111.133 raw.githubusercontent.com 修改 hosts 文件 Windows 系统：C:\\Windows\\System32\\drivers\\etc\\hosts\n修改方法，把第一步的内容复制到文本末尾：\n激活生效,刷新 DNS： Windows：在 CMD 窗口输入：ipconfig /flushdns\n以下是一个自动化的批处理脚本，保存为bat文件它会执行你描述的操作：\n@echo off set hosts_path=C:\\Windows\\System32\\drivers\\etc\\hosts echo 复制内容到hosts文件... echo 20.205.243.166 github.com\u0026gt;\u0026gt;\u0026#34;%hosts_path%\u0026#34; echo 185.199.108.133 raw.githubusercontent.com\u0026gt;\u0026gt;\u0026#34;%hosts_path%\u0026#34; echo 185.199.109.133 raw.githubusercontent.com\u0026gt;\u0026gt;\u0026#34;%hosts_path%\u0026#34; echo 185.199.110.133 raw.githubusercontent.com\u0026gt;\u0026gt;\u0026#34;%hosts_path%\u0026#34; echo 185.199.111.133 raw.githubusercontent.com\u0026gt;\u0026gt;\u0026#34;%hosts_path%\u0026#34; echo 修改hosts文件完成。 echo 刷新 DNS... ipconfig /flushdns echo 所有操作已完成。 pause ","date":"2024-02-12T07:21:38Z","permalink":"https://blog.lufei.de/p/160/","title":"国内访问GitHub方法-修改hosts"},{"content":"fastcgi_cache介绍 Nginx默认自带的fastcgi_cache模块能把动态页面缓存起来，提高网站速度和降低服务器负载。\n当有用户请求相同的页面时，Nginx可以直接返回缓存的页面，而不需要再次访问后端服务器。\n这个模块可以通过简单的配置实现,还支持缓存伪静态！效果比起传统的php缓存好得太多了.\nNginx配置 来到宝塔面板后台，找到Nginx，在配置修改中添加以下内容：\nfastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:20m max_size=512m inactive=8h; fastcgi_cache_key \u0026#34;$scheme$request_method$host$request_uri$arg_id\u0026#34;; fastcgi_cache_use_stale error timeout updating http_500; 这段配置用于 Nginx 的缓存设置：\n/var/cache/nginx：缓存文件存储目录。 levels=1:2：两层目录结构。 keys_zone=my_cache:20m：创建 20MB 内存区域 my_cache 存储缓存键和元数据。 max_size=512m：最大缓存大小为 512MB，达到后会删除旧缓存。 inactive=8h：8小时后认为缓存条目不活跃，可能被清除。 赋予权限：\nsudo chown -R www-data:www-data /var/cache/nginx sudo chmod -R 755 /var/cache/nginx 站点配置 在宝塔后台的网站列表中，找到你的网站，点击配置文件，将以下代码添加到配置文件中去：\n#启用fastcgi_cache 开始 location ~ \\.php$ { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi-74.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffers 16 16k; fastcgi_busy_buffers_size 64k; fastcgi_buffer_size 32k; fastcgi_keep_conn on; #新增的缓存规则 add_header X-Cache \u0026#34;$upstream_cache_status From $host\u0026#34;; fastcgi_cache my_cache; add_header Nginx-Cache \u0026#34;$upstream_cache_status\u0026#34;; add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套 add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型 add_header X-XSS-Protection \u0026#34;1; mode=block\u0026#34;; # XSS 保护 etag on; fastcgi_cache_valid 200 301 302 6h; } #启用fastcgi_cache 结束 注意: 假如你用的是php7.2版本，那么把\nfastcgi_pass unix:/tmp/php-cgi-74.sock;\n改成\nfastcgi_pass unix:/tmp/php-cgi-72.sock;\n全部配置好之后，别忘了重载Nginx设置生效，缓存就加好了\n判断缓存状态 按 F12 访问网站首页，查看文件头，\n如果出现HIT则是缓存了， BYPASS 则是因设置原因未缓存， MISS即这个页面还没被缓存，新发布或刚被删除的页面，首次访问将出现这个状态，如图所示：\n清理缓存 将以下代码添加到面板定时任务即可（shell脚本）\n#!/bin/bash # Path to the nginx cache directory NGINX_CACHE_PATH=\u0026#34;/var/cache/nginx\u0026#34; # Function to clear the nginx cache clear_cache() { echo \u0026#34;Clearing nginx cache...\u0026#34; sudo rm -rf $NGINX_CACHE_PATH/* echo \u0026#34;Nginx cache cleared.\u0026#34; } # Function to reload nginx reload_nginx() { echo \u0026#34;Reloading Nginx...\u0026#34; sudo /etc/init.d/nginx reload echo \u0026#34;Nginx reloaded.\u0026#34; } # Clear the cache clear_cache # Reload Nginx reload_nginx ","date":"2024-02-09T23:35:39Z","permalink":"https://blog.lufei.de/p/159/","title":"宝塔面板开启Nginx缓存为网站提速"},{"content":"前言： Cloud内核相比于普通内核，去掉一些不必要的功能依赖与参数：如声卡打印机等功能，并专门为云计算进行优化，减少了内核的体积与占用。\n教程：(以amd64架构、debian系统为例） 更新package apt update \u0026amp;\u0026amp; apt dist-upgrade 确认当前的内核 dpkg -l|grep linux-image 若显示“linux-image-******-amd64”则为普通内核\n若显示” linux-image-******-cloud-amd64”则为为云优化的内核\n\u0026ldquo;ii\u0026rdquo; 意味着软件包已经被安装。 \u0026ldquo;ic\u0026rdquo; 意味着软件包被安装，但是由于配置问题，没有安装成功。 可以删除ic软件包\n一键安装：\necho \u0026#34;deb http://deb.debian.org/debian buster-backports main\u0026#34; \u0026gt; /etc/apt/sources.list.d/buster-backports.list apt update apt -t buster-backports install linux-image-cloud-amd64 -y 手动安装\n查找可用内核\napt-cache search linux-image | grep cloud 安装Cloud内核\napt install linux-image-*****-cloud-amd64\napt install linux-headers-*****-cloud-amd64\napt install linux-image-cloud-amd64\n删除老内核：\ndpkg --get-selections | grep linux apt autoremove --purge linux-image-5.10.0-20-amd64 linux-image-5.10.0-26-amd64 -y apt autoremove apt autoclean 这里的linux-image-5.10.0-20-amd64与linux-image-5.10.0-26-amd64 可以通过前面的命令查看\n更新一下 grub：\nsudo update-grub 重启：\nreboot 验证是否成功\nuname -r 带有“cloud”字样，即成功\n卸载旧内核\n请注意，请在确定安装内核成功后执行\napt remove linux-image-******-amd64\n此处选做，目的释放硬盘空间\n","date":"2024-02-09T05:30:16Z","permalink":"https://blog.lufei.de/p/158/","title":"debian11更换为cloud内核"},{"content":"一、BestTrace使用方法 连上VPS服务器后直接使用脚本：\nwget -qO- git.io/autobesttrace | bash 脚本自动测试VPS到中国电信、移动、联通和教育网四网的回程路由。\n磁盘真实性能读写测试 一般数据在 大于20MB/s 为合格，大于40MB/s 为普通，大于80MB/s 为优秀。\ndd bs=64k count=4k if=/dev/zero of=test oflag=dsync ","date":"2024-02-08T17:21:29Z","permalink":"https://blog.lufei.de/p/157/","title":"BestTrace：一款非常好用的VPS回程路由测试脚本"},{"content":"定时任务目录\n/var/spool/cron/crontabs/ 在Ubuntu中，你可以使用cron来设置定时任务。定时任务的配置文件通常位于/etc/crontab，而用户特定的定时任务可以通过使用crontab命令进行管理。用户的个人crontab文件通常位于/var/spool/cron/crontabs/目录下，文件名是相应的用户名。例如，如果用户名是root，那么相应的crontab文件路径可能是 /var/spool/cron/crontabs/root\ncrontab -e 这将打开一个文本编辑器，允许你编辑用户的crontab条目。\n","date":"2024-02-08T14:33:27Z","permalink":"https://blog.lufei.de/p/156/","title":"定时任务目录"},{"content":"我们可以使用下面这个文件来人工触发缓存清除的操作，Linux 提供了三种清空方式：\necho 1 \u0026gt; /proc/sys/vm/drop_caches # 仅清除页面缓存 echo 2 \u0026gt; /proc/sys/vm/drop_caches # 清除目录项和inode echo 3 \u0026gt; /proc/sys/vm/drop_caches # 清除页面缓存、目录项以及inode sync echo 1 \u0026gt; /proc/sys/vm/drop_caches echo 2 \u0026gt; /proc/sys/vm/drop_caches echo 3 \u0026gt; /proc/sys/vm/drop_caches 但是这种放时只能在执行的当时起作用，过一段时间之后又会发现内存被占满，怎么办呢？\n一键脚本调整：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/adjust.sh \u0026amp;\u0026amp; chmod +x adjust.sh \u0026amp;\u0026amp; ./adjust.sh 查看当前 vm.vfs_cache_pressure 的值：\nsysctl vm.vfs_cache_pressure 重新加载 sysctl 配置文件以使更改生效\nsudo sysctl -p 在Linux 2.6之后Linux将他们统一合并到了Page cache作为文件层的缓存。而buffer则被用作block层的缓存。\nblock层的缓存是什么意思呢，你可以认为一个buffer是一个physical disk block在内存的代表，用来将内存中的pages映射为disk blocks，这部分被使用的内存被叫做buffer。\nbuffer里面的pages，指的是Page cache中的pages，所以，buffer也可以被认为Page cache的一部分。\n或者简单来说，buffer负责裸设备相关的缓存，cache负责文件系统的缓存。\nBuffer 的具体职责 在当前的系统实现里，buffer主要是设计用来在系统对块设备进行读写时作为缓存来使用。这意味着对块的操作会使用buffer进行缓存，比如我们在格式化文件系统的时候。\n但是一般情况下两个缓存系统是一起配合使用的，比如当我们对一个文件进行写操作的时候，cache的内容会被改变，而buffer则用来将cache的page标记为不同的缓冲区，并记录是哪一个缓冲区被修改了。\n这样，内核在后续执行脏数据的回写（writeback）时，就不用将整个page写回，而只需要写回修改的部分即可。\nCache 的具体职责 cache主要用来作为文件系统上的文件数据的缓存来用，当进程对文件有read/write操作的时候。包括将文件映射到内存的系统调用mmap，就会用到cache。\n因为cache被作为文件类型的缓存来用，所以事实上也负责了大部分的块设备文件的缓存工作。\n怎么回收 buff/cache？ Linux内核会在内存将要耗尽的时候，自动触发内存回收的工作，以便释放出内存给急需内存的进程使用。\n但是这种回收的工作也并不是没有成本。\n理解cache是干什么的就知道，cache中存在着一部分write操作的数据。所以必须保证cache中的数据跟对应文件中的数据一致，才能对cache进行释放。\n于是伴随着cache清除的行为的，一般都是系统IO飙高。这是因为内核要将cache中缓存的write数据进行回写。\n","date":"2024-02-08T09:39:21Z","permalink":"https://blog.lufei.de/p/155/","title":"Linux buffer/cache 内存占用过高的原因以及解决办法"},{"content":"网站被镜像如何解决？\n在应对镜像网站问题时，有一种非常有效的策略，可以帮助您恢复控制。直接在网页头部添加以下代码：(替换为你的域名)\n\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; rthost = window.location.host; if (rthost != \u0026#34;www.yourwebsite.com\u0026#34;) { top.location.href = \u0026#34;https://www.yourwebsite.com\u0026#34;; } \u0026lt;/script\u0026gt; 如果您的脚本被屏蔽，您可以考虑添加以下备用代码：\n\u0026lt;script\u0026gt; proxy2021 = false; \u0026lt;/script\u0026gt; \u0026lt;img src=\u0026#34;\u0026#34; onerror=\u0026#39;setTimeout(function(){ if (typeof(proxy2021) == \u0026#34;undefined\u0026#34;){ window.location.host = \u0026#34;www.yourwebsite.com\u0026#34;; } }, 500);\u0026#39;\u0026gt; 这两段代码将使镜像网站自动重定向到您的正版网站，从而有效打击镜像网站的不当行为。\n这亲测有效的方法可以帮助您更好地保护您的网站和内容免受镜像网站的侵害。\n","date":"2024-02-07T17:58:01Z","permalink":"https://blog.lufei.de/p/154/","title":"网站被镜像如何解决？"},{"content":"昨晚打开宝塔面板后台查看，上行与下行几乎到了7000KB的速度，不到半小时，就10G流量了，开始以为是被黑了？重载系统，恢复数据后还是一样。\n下载一个网站监控报表插件一看，好家伙，是谷歌蜘蛛和一些不明ip在搞我其中一个网站！！！最狠的就是谷歌蜘蛛了，疯狂在爬！\n方法一：cloudflare cdn 防火墙阻止 表达式：\n(http.user_agent contains \u0026ldquo;Googlebot\u0026rdquo;) or (http.user_agent contains \u0026ldquo;SemrushBot\u0026rdquo;) or (http.user_agent contains \u0026ldquo;AhrefsBot\u0026rdquo;) or (http.user_agent contains \u0026ldquo;DotBot\u0026rdquo;)\n方法二：禁止指定UA（用户代理） 宝塔面板下使用方法如下：\n1、找到文件目录 /www/server/nginx/conf 文件夹下面，新建一个文件agent_deny.conf\n代码如下：\n#禁止Scrapy等工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } #禁止指定UA及UA为空的访问 if ($http_user_agent ~* \u0026#34;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|DotBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|Bytespider|Ezooms|Googlebot|JikeSpider|SemrushBot|^$\u0026#34; ) { return 403; } #禁止非GET|HEAD|POST方式的抓取 if ($request_method !~ ^(GET|HEAD|POST)$) { return 403; } 2、找到网站设置里面的第7行左右 写入代码：include agent_deny.conf;\n如果你网站使用火车头采集发布，使用以上代码会返回403错误，发布不了的。如果想使用火车头采集发布，请使用下面的代码：\n#禁止Scrapy等工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) { return 403; } #禁止指定UA访问。UA为空的可以访问，比如火车头可以正常发布。 if ($http_user_agent ~ \u0026#34;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|YandexBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|Bytespider|Ezooms|Googlebot|JikeSpider|SemrushBot\u0026#34; ) { return 403; } #禁止非GET|HEAD|POST方式的抓取 if ($request_method !~ ^(GET|HEAD|POST)$) { return 403; } 三、测试效果 如果是vps，那非常简单，使用curl -A 模拟抓取即可，比如： 模拟谷歌蜘蛛抓取：替换为你的域名\ncurl -I -A \u0026#39;Googlebot\u0026#39; xxx.com curl -I -A \u0026#39;Baiduspider\u0026#39; xxx.com 谷歌蜘蛛和UA为空的返回是403禁止访问标识，而百度蜘蛛则成功返回200，说明生效！\n四、垃圾蜘蛛IP段 直接屏蔽：谷歌蜘蛛\n66.249.79.0/24 66.249.68.0/24 屏蔽AhrefsBot蜘蛛：\n51.222.253.0/24 不明的IP：\n39.173.116.0/24 85.208.96.0/24 185.191.171.0/24 居然还有华为蜘蛛！！！是否屏蔽思考中。。。\n114.119.130.102 114.119.135.32 114.119.0.0/16 robots.txt 屏蔽垃圾蜘蛛\nUser-agent: Googlebot Disallow: / User-agent: MJ12bot Disallow: / User-agent: SemrushBot Disallow: / User-agent: SemrushBot-SA Disallow: / User-agent: SemrushBot-BA Disallow: / User-agent: SemrushBot-SI Disallow: / User-agent: SemrushBot-SWA Disallow: / User-agent: SemrushBot-CT Disallow: / User-agent: SemrushBot-BM Disallow: / User-agent: SemrushBot-SEOAB Disallow: / user-agent: AhrefsBot Disallow: / User-agent: DotBot Disallow: / User-agent: Uptimebot Disallow: / User-agent: MegaIndex.ru Disallow: / User-agent: ZoominfoBot Disallow: / User-agent: Mail.Ru Disallow: / User-agent: BLEXBot Disallow: / User-agent: ExtLinksBot Disallow: / User-agent: aiHitBot Disallow: / User-agent: Researchscan Disallow: / User-agent: DnyzBot Disallow: / User-agent: spbot Disallow: / User-agent: YandexBot Disallow: / User-agent: SemrushBot Disallow: / User-agent: SemrushBot-SA Disallow: / User-agent: SemrushBot-BA Disallow: / User-agent: SemrushBot-SI Disallow: / User-agent: SemrushBot-SWA Disallow: / User-agent: SemrushBot-CT Disallow: / User-agent: SemrushBot-BM Disallow: / User-agent: SemrushBot-SEOAB Disallow: / User-agent: * Disallow: ","date":"2024-02-07T17:09:38Z","permalink":"https://blog.lufei.de/p/153/","title":"反爬虫蜘蛛攻略：Apache/Nginx/PHP禁止某些User Agent抓取网站"},{"content":" 仅适用于ubuntu与 debian\n安装依赖：\napt update -y apt install -y curl 一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/baota.sh \u0026amp;\u0026amp; chmod +x baota.sh \u0026amp;\u0026amp; ./baota.sh 完整代码：\n#!/bin/bash # 安装宝塔面板 7.7 echo \u0026#34;安装宝塔面板 7.7\u0026#34; curl -sSO https://raw.githubusercontent.com/woniu336/btpanel-v7.7.0/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh # 一键破解 echo \u0026#34;一键破解\u0026#34; curl -sSO https://raw.githubusercontent.com/woniu336/open_shell/main/one_key_happy.sh \u0026amp;\u0026amp; bash one_key_happy.sh # 美化主题 echo \u0026#34;美化主题\u0026#34; wget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_770.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart # 去除网站默认文件 echo \u0026#34;去除网站默认文件\u0026#34; sudo sed -i \u0026#34;\\|htaccess = self.sitePath+\u0026#39;/\\.htaccess\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + htaccess)|d\u0026#34; /www/server/panel/class/panelSite.py sudo sed -i \u0026#34;\\|index = self.sitePath+\u0026#39;/index.html\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + index)|d\u0026#34; /www/server/panel/class/panelSite.py sudo sed -i \u0026#34;\\|doc404 = self.sitePath+\u0026#39;/404.html\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + doc404)|d\u0026#34; /www/server/panel/class/panelSite.py # 关闭未绑定域名提示 echo \u0026#34;关闭未绑定域名提示\u0026#34; sed -i \u0026#34;s/root \\/www\\/server\\/nginx\\/html/return 400/\u0026#34; /www/server/panel/class/panelSite.py sed -i \u0026#34;s/root \\/www\\/server\\/nginx\\/html/return 400/\u0026#34; /www/server/panel/vhost/nginx/0.default.conf # 关闭安全入口提示 echo \u0026#34;关闭安全入口提示\u0026#34; sed -i \u0026#34;s/return render_template(\u0026#39;autherr.html\u0026#39;)/return abort(404)/\u0026#34; /www/server/panel/BTPanel/__init__.py # 去除消息推送 echo \u0026#34;去除消息推送\u0026#34; sed -i \u0026#34;/p = threading.Thread(target=check_panel_msg)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;check_panel_msg\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py # 去除文件校验 echo \u0026#34;去除文件校验\u0026#34; sed -i \u0026#34;/p = threading.Thread(target=check_files_panel)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;check_files_panel\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py rm -f /www/server/panel/script/check_files.py # 去除云端验证 echo \u0026#34;去除云端验证\u0026#34; sed -i \u0026#34;/p = threading.Thread(target=update_software_list)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;update_software_list\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py sed -i \u0026#39;/self.get_cloud_list_status/d\u0026#39; /www/server/panel/class/panelPlugin.py sed -i \u0026#39;/PluginLoader.daemon_task()/d\u0026#39; /www/server/panel/task.py # 关闭活动推荐与在线客服 echo \u0026#34;关闭活动推荐与在线客服\u0026#34; echo \u0026#34;True\u0026#34; \u0026gt; /www/server/panel/data/not_recommend.pl echo \u0026#34;True\u0026#34; \u0026gt; /www/server/panel/data/not_workorder.pl # 关闭首页软件推荐与广告 echo \u0026#34;关闭首页软件推荐与广告\u0026#34; sed -i \u0026#39;/def get_pay_type(self,get):/a \\ \\ \\ \\ \\ \\ \\ \\ return [];\u0026#39; /www/server/panel/class/ajax.py # 关闭拉黑检测与提示 echo \u0026#34;关闭拉黑检测与提示\u0026#34; sed -i \u0026#39;/self._check_url/d\u0026#39; /www/server/panel/class/panelPlugin.py # 关闭面板日志与绑定域名上报 echo \u0026#34;关闭面板日志与绑定域名上报\u0026#34; sed -i \u0026#34;/^logs_analysis()/d\u0026#34; /www/server/panel/script/site_task.py sed -i \u0026#34;s/run_thread(cloud_check_domain,(domain,))/return/\u0026#34; /www/server/panel/class/public.py # 关闭面板强制更新 echo \u0026#34;关闭面板强制更新\u0026#34; sed -i \u0026#34;/#是否执行升级程序/a \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ updateInfo[\\\u0026#39;force\\\u0026#39;] = False;\u0026#34; /www/server/panel/class/ajax.py rm -f /www/server/panel/data/autoUpdate.pl # 关闭自动更新软件列表 echo \u0026#34;关闭自动更新软件列表\u0026#34; sed -i \u0026#34;/plugin_timeout = 86400/d\u0026#34; /www/server/panel/class/public.py sed -i \u0026#34;/list_body = None/a \\ \\ \\ \\ \\plugin_timeout = 0;\u0026#34; /www/server/panel/class/public.py # 去后门 echo \u0026#34;去后门\u0026#34; sudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request # 重启面板 echo \u0026#34;重启面板\u0026#34; /etc/init.d/bt restart ","date":"2024-02-04T11:20:24Z","permalink":"https://blog.lufei.de/p/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF7.7.0%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85-%E4%BC%98%E5%8C%96-%E7%BE%8E%E5%8C%96/","title":"宝塔面板7.7.0一键安装-优化-美化"},{"content":"宝塔面板都是自己看的，一般不太需要使用模板。 但时间久了，就想换换风格，找了好多基本都是改背景图片那种。 也找到几个满意的无奈只支持旧版本，要么就是收费的。 考虑到服务器安全，方便审计代码，只修改了css、js文件，打包时只打包了改过的文件。 技术精力有限，有些细节问题未处理，后续慢慢更新吧。 目前linux、windows、aapanel的常用版本全都制作了，以方便用户使用。\n最后还需要手动清理浏览器缓存\n宝塔linux面板7.9.10主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_7910.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart 宝塔linux面板7.9.9主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_799.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart 宝塔linux面板7.9.8主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_798.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart 宝塔linux面板7.7.0主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_770.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart 宝塔linux面板7.6.0主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_linux_760.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart 宝塔海外aapanel6.8.27版主题\nwget -O btpanel_theme.zip https://raw.githubusercontent.com/woniu336/open_shell/main/bt/BTPanel_theme_aapanel_6827.zip \u0026amp;\u0026amp; unzip -o btpanel_theme.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart ","date":"2024-02-04T11:13:31Z","permalink":"https://blog.lufei.de/p/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF-%E7%BE%8E%E5%8C%96%E4%B8%BB%E9%A2%98/","title":"宝塔面板-美化主题"},{"content":"教程说明 本教程可以对宝塔部分文件功能进行优化处理，如果出错可以使用修复更新面板的命令恢复文件。\n去除网站默认文件 sudo sed -i \u0026#34;\\|htaccess = self.sitePath+\u0026#39;/\\.htaccess\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + htaccess)|d\u0026#34; /www/server/panel/class/panelSite.py sudo sed -i \u0026#34;\\|index = self.sitePath+\u0026#39;/index.html\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + index)|d\u0026#34; /www/server/panel/class/panelSite.py sudo sed -i \u0026#34;\\|doc404 = self.sitePath+\u0026#39;/404.html\u0026#39;|, \\|public.ExecShell(\u0026#39;chown -R www:www \u0026#39; + doc404)|d\u0026#34; /www/server/panel/class/panelSite.py 关闭未绑定域名提示 sed -i \u0026#34;s/root \\/www\\/server\\/nginx\\/html/return 400/\u0026#34; /www/server/panel/class/panelSite.py sed -i \u0026#34;s/root \\/www\\/server\\/nginx\\/html/return 400/\u0026#34; /www/server/panel/vhost/nginx/0.default.conf 关闭安全入口提示 sed -i \u0026#34;s/return render_template(\u0026#39;autherr.html\u0026#39;)/return abort(404)/\u0026#34; /www/server/panel/BTPanel/__init__.py 去除消息推送 #目前还不清楚具体功能猜测广告，删掉也不影响。 sed -i \u0026#34;/p = threading.Thread(target=check_panel_msg)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;check_panel_msg\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py 去除文件校验 #这个功能会每隔10分钟执行一次，用途是获取新面板文件替换本地旧面板文件 sed -i \u0026#34;/p = threading.Thread(target=check_files_panel)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;check_files_panel\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py #删除接口文件防止其他加密文件调用（可能会改为内置） rm -f /www/server/panel/script/check_files.py 去除云端验证 sed -i \u0026#34;/p = threading.Thread(target=update_software_list)/, /p.start()/d\u0026#34; /www/server/panel/task.py sed -i \u0026#39;/\\\u0026#34;update_software_list\\\u0026#34;:/d\u0026#39; /www/server/panel/task.py sed -i \u0026#39;/self.get_cloud_list_status/d\u0026#39; /www/server/panel/class/panelPlugin.py sed -i \u0026#39;/PluginLoader.daemon_task()/d\u0026#39; /www/server/panel/task.py #sed -i \u0026#39;/PluginLoader.daemon_panel()/d\u0026#39; /www/server/panel/task.py 关闭活动推荐与在线客服 echo \u0026#34;True\u0026#34; \u0026gt; /www/server/panel/data/not_recommend.pl echo \u0026#34;True\u0026#34; \u0026gt; /www/server/panel/data/not_workorder.pl 关闭首页软件推荐与广告 sed -i \u0026#39;/def get_pay_type(self,get):/a \\ \\ \\ \\ \\ \\ \\ \\ return [];\u0026#39; /www/server/panel/class/ajax.py 关闭拉黑检测与提示 #每隔10分钟执行一次，用于检测是不是破解版，该命令直接删除链接，使返回为空，输出False #该接口返回False 与True均不影响面板，返回True后续代码还会对返回的其他字段数据做处理。 #直接返回False类似于无法访问宝塔的接口，因此不会执行后面的一大堆代码。 #锁面板我记得是接口直接返回文本，然后代码输出文本提示锁面板。 sed -i \u0026#39;/self._check_url/d\u0026#39; /www/server/panel/class/panelPlugin.py 关闭面板日志与绑定域名上报 sed -i \u0026#34;/^logs_analysis()/d\u0026#34; /www/server/panel/script/site_task.py sed -i \u0026#34;s/run_thread(cloud_check_domain,(domain,))/return/\u0026#34; /www/server/panel/class/public.py 关闭面板强制更新 #宝塔接口返回force = 1的时候会强制更新你的面板 7.7.0版本的用户推荐处理一下 sed -i \u0026#34;/#是否执行升级程序/a \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ updateInfo[\\\u0026#39;force\\\u0026#39;] = False;\u0026#34; /www/server/panel/class/ajax.py rm -f /www/server/panel/data/autoUpdate.pl 关闭自动更新软件列表 #宝塔调用get_plugin_bin公共函数判断本地列表文件是否过期，这里设置为0时强制输出本地文件 #点击更新软件列表会绕过过期判断，因此并不会影响到手动更新。 sed -i \u0026#34;/plugin_timeout = 86400/d\u0026#34; /www/server/panel/class/public.py sed -i \u0026#34;/list_body = None/a \\ \\ \\ \\ \\plugin_timeout = 0;\u0026#34; /www/server/panel/class/public.py 去除计算验证（不推荐安装，会导致一键迁移不成功） sed -i \u0026#39;/{% block scripts %} {% endblock %}/a \u0026lt;script src=\u0026#34;/static/bt.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026#39; /www/server/panel/BTPanel/templates/default/layout.html #7.7.0面板以及一下版本执行这个 wget http://f.cccyun.cc/bt/bt.js -O /www/server/panel/BTPanel/static/bt.js #7.8.0面板以及以上版本执行这个 wget http://f.cccyun.cc/bt/bt_new.js -O /www/server/panel/BTPanel/static/bt.js 最后重启面板 以及清理浏览器缓存即可生效 #重启面板命令 /etc/init.d/bt restart 如需要恢复使用以下命令，或面板内修复面板 curl https://download.bt.cn/install/update_panel.sh|bash ","date":"2024-02-04T10:19:39Z","permalink":"https://blog.lufei.de/p/%E5%AE%9D%E5%A1%94linux%E9%9D%A2%E6%9D%BF%E4%BC%98%E5%8C%96%E6%95%99%E7%A8%8B/","title":"宝塔Linux面板优化教程"},{"content":" 当你服务器安装了nginx（推荐1.20版本以上）默认开启了gzip动态压缩，但没有开启静态压缩\n一句话总结就是如何开启静态压缩！！！\n为什么要开启静态压缩？ 先看一下gzip配置图：\n默认是没有 gzip_static on; gzip_static on; 就是开启静态压缩的意思，\n压缩模式 一般来说， Nginx的 gzip分为两种模式：\n动态压缩 静态压缩 动态压缩 动态压缩是指 Nginx服务器在发送前端产物时，消耗自身的资源进行实时压缩，这样即便产物中不存在 .gz结尾的文件，浏览器端也能拿到 gzip格式的前端产物。\n静态压缩 静态压缩会直接将产物中预先压缩过的 .gz文件发送给浏览器，而不再实时压缩文件，如果找不到 .gz文件，将会使用对应的原始文件。\n一句话总结就是：动态压缩消耗服务器资源，而静态压缩提前将压缩文件发送给浏览器\n教程开始 一：有个前提条件，要保证 Nginx存在 ngx_http_gzip_static_module模块，这个模块默认是开启的。\n可以使用下面指令查看是否已经激活该模块：\nnginx -V 2\u0026gt;\u0026amp;1| grep -o http_gzip_static_module 输出结果：\nhttp_gzip_static_module 说明已经开启。\n二：然后打开你的网站目录，找到需要压缩的js和css文件，开启静态压缩，需要提前将文件压缩好，这里我提供一键压缩命令：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/gzip.sh \u0026amp;\u0026amp; chmod +x gzip.sh \u0026amp;\u0026amp; ./gzip.sh 输入你要压缩的目录，然后在nginx配置文件里的 gzip on; 下面一行添加\ngzip_static on; 重载和重启nginx生效，\n检查是否生效 Etag是没有w/符号的就是静态压缩\n动态压缩：有w/符号 ","date":"2024-02-01T16:43:37Z","permalink":"https://blog.lufei.de/p/148/","title":"简单一招提升nginx服务器性能"},{"content":"1.MySQL 5.7内存优化: performance_schema_max_table_instances=400 table_definition_cache=400 performance_schema=off innodb_buffer_pool_chunk_size=64M innodb_buffer_pool_size=64M 2.bbr: echo \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p lsmod | grep bbr 3.swap的调整： 临时调整vm.swappiness参数为5\nsudo sysctl vm.swappiness=5 永久调整 vm.swappiness参数为1（优先使用物理内存，迫不得已使用swap）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vm.sh \u0026amp;\u0026amp; chmod +x vm.sh \u0026amp;\u0026amp; ./vm.sh 禁用：\nsudo swapoff -a 4.一键DD： 推荐萌咖脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vpsnew.sh \u0026amp;\u0026amp; chmod +x vpsnew.sh \u0026amp;\u0026amp; ./vpsnew.sh 5.推荐脚本 先安装依赖：\napt update -y apt install -y curl 自用：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/tool.sh \u0026amp;\u0026amp; chmod +x tool.sh \u0026amp;\u0026amp; ./tool.sh 来自科技lion：\ncurl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh ","date":"2024-01-30T14:51:33Z","permalink":"https://blog.lufei.de/p/tool/","title":"网站建设优化"},{"content":" 建站选择ubuntu20.04，不推荐debian，因为在生产环境中会涉及方方面面，ubuntu在复杂环境中是具备完善体制的，debian通常是高手使用，因为出问题了，他们知道怎么解决，普通用户推荐ubuntu，说人话就是，ubuntu不容易出错！\n建站面板推荐宝塔，nginx1.20.2、mysql5.7、php7.4的最佳组合，nginx1.20之后的版本对ssl有优化，根据自己的情况\n系统重装：推荐萌咖脚本\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vpsnew.sh \u0026amp;\u0026amp; chmod +x vpsnew.sh \u0026amp;\u0026amp; ./vpsnew.sh mysql5.7内存大小优化：\nperformance_schema_max_table_instances=400 table_definition_cache=400 performance_schema=off innodb_buffer_pool_chunk_size=64M innodb_buffer_pool_size=64M bbr:\necho \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p lsmod | grep bbr swap的调整：内存大的话请关闭，swap和内存不是一个级别的，如果swap都能替内存干活了，要内存干啥！这东西只是内存不足时应急用的！会拖累性能，很多教程没提到这一点。\n临时调整vm.swappiness参数为5\nsudo sysctl vm.swappiness=5 永久调整 vm.swappiness参数为1（优先使用物理内存，迫不得已使用swap）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vm.sh \u0026amp;\u0026amp; chmod +x vm.sh \u0026amp;\u0026amp; ./vm.sh 禁用：\nsudo swapoff -a 服务器的安全：\n禁ping、改ssh端口、或者可以上雷池waf社区版，CF，。。。\n","date":"2024-01-30T14:11:02Z","permalink":"https://blog.lufei.de/p/%E5%BB%BA%E7%AB%99%E7%8E%AF%E5%A2%83%E7%9A%84%E9%80%89%E6%8B%A9%E5%92%8C%E8%B0%83%E4%BC%98-%E7%BD%91%E7%AB%99%E7%AF%87/","title":"建站环境的选择和调优-网站篇"},{"content":" 基于ubuntu20.04\n证书 安装acme之后会自动续签，不用做其他操作，一条代码安装\ncurl https://get.acme.sh | sh -s email=你的邮箱 rclone 安装之后，在编辑rclone.conf配置\ncurl https://rclone.org/install.sh | bash mkdir -p /root/.config/rclone/ touch /root/.config/rclone/rclone.conf ","date":"2024-01-30T13:28:59Z","permalink":"https://blog.lufei.de/p/%E8%AF%81%E4%B9%A6acme%E4%B8%8Erclone%E7%9A%84%E6%93%8D%E4%BD%9C%E8%AE%B0%E5%BD%95/","title":"证书acme与rclone的操作记录"},{"content":"location / { rewrite ^/type/(.+?)\\.html$ /list/index.php?$1 last; rewrite ^/video/(.+?)\\.html$ /detail/index.php?$1 last; rewrite ^/play/([0-9]+)-([0-9]+)-([0-9]+)\\.html$ /video/index.php?$1-$2-$3 last; rewrite ^/topic/index(.+?)\\.html$ /topic/index.php?$1 last; rewrite ^/topic/index\\.html$ /topic/index.php?$1 last; rewrite ^/topiclist/(.+?).html$ /topiclist/index.php?$1 last; rewrite ^/index\\.html$ index.php permanent; rewrite ^/news/index\\.html$ /news/index.php?$1 last; rewrite ^/html/part/index(.+?)\\.html$ /articlelist/index.php?$1 last; rewrite ^/html/article/index(.+?)\\.html$ /article/index.php?$1 last; } ","date":"2024-01-29T19:22:10Z","permalink":"https://blog.lufei.de/p/%E6%B5%B7%E6%B4%8Bcms%E6%96%B0%E7%89%88%E4%BC%AA%E9%9D%99%E6%80%81%E8%A7%84%E5%88%99/","title":"海洋cms新版伪静态规则"},{"content":"\n因为我把r2当图床，但是大量图片没有经过压缩处理，浪费带宽资源，所以有了这篇记录，\n大致意思就是把r2的图片同步到电脑上，使用压缩工具批量压缩处理之后，在同步到r2\n为什么不使用linux去搞，因为繁琐问题多，不稳定\n1：下载rclone: https://lzui.lanzv.com/iE6SN1mn693a\n先创建存储桶，例如imgs是我的存储桶名称\n2：把rclone-v1.63.0-windows-amd64.zip解压到D盘，进入目录，在rclone.conf文件配置r2，\n只需要配置 access_key_id，secret_access_key，endpoint三个参数即可\n3：新建文件，写入代码，将后缀改为bat（双击运行）\n@echo off cd /d D:\\rclone-v1.63.0-windows-amd64 rclone sync r2:imgs\\2024 C:\\Users\\Administrator\\Desktop\\imgs\\2024 --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse pause 这条代码的意思是：\n把我的imgs存储桶下的2024文件夹同步到\nC:\\Users\\Administrator\\Desktop\\imgs\\2024 目录，根据你的情况去修改目录\nrclone sync: 同步的意思，也可以把sync改成copy\nr2:imgs imgs是我的存储同名称，r2不要改\nD:\\rclone-v1.63.0-windows-amd64 是rclone所在目录\n\u0026ndash;drive-acknowledge-abuse 是针对谷歌网盘，可去掉，因为谷歌容易把文件当敏感资源不给下载甚至报毒 谷歌的教程博客有\n反过来同步就是：本地同步到r2\n@echo off cd /d D:\\rclone-v1.63.0-windows-amd64 rclone sync C:\\Users\\Administrator\\Desktop\\imgs\\2024 r2:imgs\\2024 --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 --drive-acknowledge-abuse pause 图片批量压缩工具：\n项目：https://github.com/meowtec/Imagine\n下载地址：https://lzui.lanzv.com/i9Y6U1mn69wj\n","date":"2024-01-29T09:29:58Z","permalink":"https://blog.lufei.de/p/143/","title":"cloudflare R2作为图床的管理和同步"},{"content":"1.Brotli压缩优势 说明：Brotli是Google推出的开源压缩算法，通过变种的LZ77算法、Huffman编码以及二阶文本建模等方式进行数据压缩，与其他压缩算法相比，它有着更高的压缩效率\n性能也比我们目前常见的Gzip高17-25%\n可以帮我们更高效的压缩网页中的各类文件大小及脚本，从而提高加载速度，提升网页浏览体验。\n2.卸载原Nginx Brotli 其实支持动态加载，这里为了方便直接卸载旧版本重装。\n卸载完成以后点击安装，选择编译安装，打开添加自定义模块窗口如下图。\n模块名称填写：ngx_brotli\n模块简介填写：ngx_brotli\n模块参数填写：--add-module=/www/server/nginx/src/ngx_brotli\n前置脚本粘贴如下内容：\n# 文件内各版本号为文章发布时最新，请按需要检查新版本并替换版本号 wget -O ngx_brotli.zip https://github.com/google/ngx_brotli/archive/v1.0.0rc.zip unzip ngx_brotli.zip mv ngx_brotli-1.0.0rc ngx_brotli cd ngx_brotli/deps rm -rf brotli wget -O brotli.zip https://github.com/google/brotli/archive/v1.0.9.zip unzip brotli.zip mv brotli-1.0.9 brotli cd /www/server/nginx/src 完成以后提交并打上勾，点击安装，等待完成即可。\n3.Brotli压缩 配置 打开 Nginx 管理器，左侧菜单选择配置修改，在52行附近找到gzip部分，在其前面插入brotli的配置信息：\nbrotli on; brotli_comp_level 6; brotli_min_length 10; brotli_window 1m; brotli_types *; brotli_static always; 各个参数的具体作用可以在https://github.com/google/ngx_brotli找到，这里提供通用版本。\n保存以后如下图：\n4.brotli效果检验 接下来使用支持brotli的浏览器访问即可看到效果。\n","date":"2024-01-28T08:10:11Z","permalink":"https://blog.lufei.de/p/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%8D%B8%E8%BD%BD%E5%8E%9Fnginx%E7%BC%96%E8%AF%91brotli%E5%8E%8B%E7%BC%A9/","title":"宝塔面板卸载原Nginx编译Brotli压缩"},{"content":" 首先安装官网最新版，再降级为6.8.27版本，降级的目的是方便安装汉化包\nUbuntu/Deepin\nwget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh \u0026amp;\u0026amp; sudo bash install.sh aapanel Debian\nwget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh \u0026amp;\u0026amp; bash install.sh aapanel 降级为aapanel6.8.27版本\nwget -O /root/update6_en.sh https://download.bt.cn/install/update6_en.sh \u0026amp;\u0026amp; sed -i \u0026#39;s/LinuxPanel_EN-${version}.zip/LinuxPanel_EN-6.8.27.zip/g\u0026#39; /root/update6_en.sh \u0026amp;\u0026amp; bash /root/update6_en.sh \u0026amp;\u0026amp; rm -rf /root/update6_en.sh 中文语言包\nwget -O aapanel_chinese.zip https://github.com/gacjie/aapanel_chinese/releases/download/6.8.27/aapanel_simplified_chinese_6827.zip \u0026amp;\u0026amp; unzip -o aapanel_chinese.zip -d /www/server/ \u0026amp;\u0026amp; /etc/init.d/bt restart ","date":"2024-01-28T07:17:09Z","permalink":"https://blog.lufei.de/p/141/","title":"宝塔海外版aapanel安装教程"},{"content":" 在Linux系统中，swap是为了减少内存压力而设立的一种临时存储空间，当系统内存不足时，会将一部分内存交换到swap分区中。但是，当系统运行多个程序或进程时，swap会频繁的写入和读取数据，对硬盘进行频繁的访问，从而导致系统变慢。\n如果你的系统内存足够并且感觉swap对系统性能没有多大帮助，可以考虑将swap关闭。\n建议禁止使用swap，除非你内存吃紧，或者调整vm.swappiness参数为10\n查看主配置文件是否包含该参数\ngrep \u0026#34;vm.swappiness\u0026#34; /etc/sysctl.conf 检查自定义配置文件是否包含该参数\ngrep \u0026#34;vm.swappiness\u0026#34; /etc/sysctl.d/*.conf 临时调整vm.swappiness参数为10, 重启失效\nsysctl -w vm.swappiness=10 查看当前生效值\ncat /proc/sys/vm/swappiness 或者\nsysctl vm.swappiness 1.持久化配置（推荐）\n若要确保重启后 vm.swappiness=1 仍然生效，需手动写入配置文件：\necho \u0026#34;vm.swappiness = 1\u0026#34; | sudo tee /etc/sysctl.d/99-swap.conf 立即加载配置（无需重启）\nsudo sysctl -p /etc/sysctl.d/99-swap.conf 2.验证配置生效\ncat /etc/sysctl.d/99-swap.conf 确认当前值（应为 1）\ncat /proc/sys/vm/swappiness 统一设置\n# 1. 备份 sysctl.conf cp /etc/sysctl.conf /etc/sysctl.conf.bak # 2. 查找并显示所有包含 vm.swappiness 的文件 find /etc/sysctl.d/ /etc/sysctl.conf -type f -exec grep -l \u0026#34;vm.swappiness\u0026#34; {} \\; # 3. 从所有相关文件中删除 vm.swappiness 设置 sudo sed -i \u0026#39;/^vm.swappiness/d\u0026#39; /etc/sysctl.conf sudo find /etc/sysctl.d/ -type f -name \u0026#34;*.conf\u0026#34; -exec sed -i \u0026#39;/^vm.swappiness/d\u0026#39; {} \\; # 4. 添加新的配置 echo \u0026#34;vm.swappiness = 10\u0026#34; | sudo tee /etc/sysctl.d/99-swap.conf # 5. 重新加载所有配置 sudo sysctl --system 查看 Swap 使用情况\nfree -h | grep -i swap swapon --show 或者\necho -e \u0026#34;\\n\\033[1;34m[Swap Usage]\\033[0m\u0026#34; free -h | awk \u0026#39;/^Swap:/ {printf \u0026#34;Total: %s | Used: %s | Free: %s\\n\u0026#34;, $2, $3, $4}\u0026#39; echo -e \u0026#34;\\n\\033[1;34m[Active Swap Partitions]\\033[0m\u0026#34; swapon --show | column -t 一键添加删除swap脚本 1G或者2G内存，可以设置swap为1G，即1024Mb\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/swap.sh \u0026amp;\u0026amp; chmod +x swap.sh \u0026amp;\u0026amp; ./swap.sh 永久调整 vm.swappiness参数为1（优先使用物理内存，迫不得已使用swap）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vm.sh \u0026amp;\u0026amp; chmod +x vm.sh \u0026amp;\u0026amp; ./vm.sh 使用free命令查看swap的使用情况 sudo free -m 查询当前系统中启用了哪些交换分区 sudo swapon -s 禁用命令 sudo swapoff -a 启用命令 sudo swapon -a 验证\nfree -m swapon --show 永久关闭swap分区 备份原文件（可选）\ncp /etc/fstab /etc/fstab.bak 注释或删除 fstab 中所有 swap 条目\nsed -i \u0026#39;/swap/s/^/#/\u0026#39; /etc/fstab 或者\nsed -ri \u0026#39;s/.*swap.*/#\u0026amp;/\u0026#39; /etc/fstab 或手动编辑文件，找到 swap 行添加 # 注释\nnano /etc/fstab 删除 Swap 文件/分区（可选）\nrm -f /swapfile 重启系统验证\nreboot # 重启后检查 swapon --show # 应无输出 free -h | grep -i swap # Swap 行显示 0 恢复 Swap 的命令 恢复 fstab 中的 swap 条目\nsed -i \u0026#39;/swap/s/^#//\u0026#39; /etc/fstab 重新激活 Swap\nswapon -a 验证恢复\nswapon --show free -h | grep -i swap 调优 vm.dirty_ratio：当内存中待保存的数据超过这个比例时，系统会强制暂停所有新操作，先把数据写入硬盘，可能导致卡顿。 vm.dirty_background_ratio：当数据达到这个更低比例时，系统会在后台偷偷开始保存，不影响你正常使用。 vm.dirty_background_ratio（后台刷盘阈值）： 像城市早高峰时，交警在车流达到主路容量的 5% 时，悄悄引导部分车辆绕行辅路，避免主路拥堵，司机甚至没察觉绕行。\nvm.dirty_ratio（强制刷盘阈值）： 当车流冲上主路容量的 15%，交警直接封路，所有车辆原地熄火等清场，司机骂娘但路终于通了。 为何必须配合？ 如果只有绕行（后台刷盘），车流可能冲爆主路（内存耗尽）。 如果只有封路（强制刷盘），早晚高峰直接瘫痪（卡顿频繁）。 最佳实践：绕行提前减压，封路兜底保命，交通（系统）才能丝滑！ 🚗💨\n查看实时脏页大小（单位：KB）\nwatch -n 1 \u0026#39;cat /proc/meminfo | grep Dirty\u0026#39; 统计脏页刷盘频率\nvmstat 1 5 临时生效（重启后失效）\nsudo sysctl -w vm.dirty_ratio=15 sudo sysctl -w vm.dirty_background_ratio=5 持久化设置\necho \u0026#34;vm.dirty_ratio = 15\u0026#34; | sudo tee -a /etc/sysctl.conf echo \u0026#34;vm.dirty_background_ratio = 5\u0026#34; | sudo tee -a /etc/sysctl.conf sudo sysctl -p 验证\nsysctl vm.dirty_ratio sysctl vm.dirty_background_ratio 移除参数\n# 1. 从 sysctl.conf 中移除 sudo sed -i \u0026#39;/^vm.dirty_ratio/d\u0026#39; /etc/sysctl.conf sudo sed -i \u0026#39;/^vm.dirty_background_ratio/d\u0026#39; /etc/sysctl.conf # 2. 从 sysctl.d 目录中移除 sudo sed -i \u0026#39;/^vm.dirty_ratio/d\u0026#39; /etc/sysctl.d/*.conf sudo sed -i \u0026#39;/^vm.dirty_background_ratio/d\u0026#39; /etc/sysctl.d/*.conf # 3. 重新加载配置使其生效 sudo sysctl --system # 4. 验证参数是否已恢复默认值 sysctl vm.dirty_ratio sysctl vm.dirty_background_ratio oom设置\nOOM（内存耗尽）是系统内存不足时强制终止最耗内存的进程以自救的“保命”机制。\n查看哪些进程在使用交换空间\nfor file in /proc/*/status ; do awk \u0026#39;/VmSwap|Name/{printf $2 \u0026#34; \u0026#34; $3}END{ print \u0026#34;\u0026#34;}\u0026#39; $file; done | sort -k 2 -n -r | head -n 10 查看id,例如\npgrep -x clickhouse-serv 设置为 -900 来保护 clickhouse-serv\necho -900 \u0026gt; /proc/2335/oom_score_adj 立即验证\ncat /proc/2335/oom_score_adj cat /proc/2335/oom_score 或者\n# MySQL mysql_pid=$(pgrep -x mysqld) echo -900 \u0026gt; /proc/$mysql_pid/oom_score_adj # ClickHouse clickhouse_pid=$(pgrep -x clickhouse-serv) echo -900 \u0026gt; /proc/$clickhouse_pid/oom_score_adj ","date":"2024-01-27T17:36:29Z","permalink":"https://blog.lufei.de/p/140/","title":"Linux系统Swap调优"},{"content":" 可能是最简洁干净的，能下载影视资源的APP了，能下载资源的APP才是好的看片追剧APP~~\nhttps://gh.ddlc.top/https://github.com/jimugou/app/releases/download/v1.6.3/fanqie-v1.6.3.apk\n","date":"2024-01-25T19:24:05Z","permalink":"https://blog.lufei.de/p/app/","title":"简洁，没有广告，能下载资源的看片追剧APP"},{"content":"项目地址 https://github.com/lsky-org/lsky-pro\n推荐安装1.6.4版本，没有php和mysql的要求\n下载地址：https://github.com/lsky-org/lsky-pro/archive/refs/tags/v1.6.4.zip\n网盘：https://lzui.lanpw.com/iUrlR1mb4djg\nLsky Pro 安装全程可视化页面，只需要下载程序解压到 web 站点目录，访问首页会自动跳转到安装页面，根据提示操作即可，具体步骤：\n下载兰空，上传至 web 运行环境，解压。\n设置运行目录为 public。\n配置 Rewrite 规则：\nNginx：\nlocation / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } Apache: Apache直接使用 .htaccess 即可。 访问首页，未安装自动跳转至安装页面，根据页面提示安装即可。\n安装完成以后请设置runtime目录 0755 权限，如果你使用本地存储，public 目录也需要设置为 0755 权限。\n备份原系统 下载新版本安装包，解压。将旧版本系统中的根目录 .env 文件复制到新版本的根目录 如果你的文件是储存在本地，你还需要将 public 目录中的文件移动的新版本的 public 目录下 修改 .env 文件中的数据库配置，然后在 application 目录下新建 install.lock 文件 将新版本 application/sql/update.sql 导入到数据库，或直接复制文件内容执行 替换旧版本 (删除旧版本，粘贴新版本) 如果在更新时出现 更新失败, 请稍后重试 的提示, 大概率是因为超时被中断, 如果出现这样的情况, 请手动通过 https://github.com/wisp-x/lsky-pro/releases 下载 zip 格式的完整包, 并重命名为 upgrade.zip 移动至系统 runtime 目录中, 然后在执行更新, 这时候兰空图床会跳过下载安装包的步骤, 直接通过解压 upgrade.zip 的方式进行安装.\n宝塔php7.3版本默认没有开启 ZipArchive ，更新时会出现错误，切换其他版本即可。\n","date":"2024-01-25T16:20:10Z","permalink":"https://blog.lufei.de/p/137/","title":"Lsky 图床 兰空图床"},{"content":" 注意：迁移成功后不代表就会自动运行了，还需要手动点编辑，再保存才会生效！！\n步骤一：备份文件，然后迁移到新服务器对应目录下。 备份cron下的所有文件\n/www/server/cron 步骤二：数据库迁移 下载default.db文件，使用SQLiteStudio工具打开数据库。删除新站的crontab表，把老站的表复制进去。然后保存。\n/www/server/panel/data/default.db 把新的default.db上传到新站/www/server/panel/data/目录下。即可看到新的计划任务内容\nSQLiteStudio下载地址：https://lzui.lanpw.com/iCoiL1mas1gj\n","date":"2024-01-25T13:39:26Z","permalink":"https://blog.lufei.de/p/136/","title":"宝塔面板计划任务列表的迁移或导出"},{"content":"海洋CMS-自用采集### #!/bin/bash ######################################################## # 程序名称: 海洋CMS自动采集脚本 # 版本信息：seacmsbot/ v2.0 # 发布链接: https://www.seacms.net/ # 使用方法：直接复制代码到宝塔计划任务shell脚本内容里添加每小时任务使用 # 更新时间：2019.9.26 ########################################################## #①请修改下面的网站域名及管理目录 web_site=\u0026#34;http://xxx.xxx.eu.org/xxx/admin_reslib2.php\u0026#34; #②请修改下面项内容为\u0026#34;admin_reslib2.php\u0026#34;里设置的访问密码(默认为系统设置的cookie密码) web_pwd=\u0026#34;xxx\u0026#34; #③下面项内容为资源站每日采集链接地址列表，请自行修改,每行一条,可添加多个，前后需添加引号。 #每日采集链接获取方法:选择\u0026#34;后台-采集-资源库列表\u0026#34;,复制资源站右边的\u0026#34;采集每天\u0026#34;的链接地址,去掉?前面的内容。 web_api=( \u0026#39;?ac=day\u0026amp;rid=2\u0026amp;url=https://ikunzyapi.com/api.php/seaxml/vod/at/xml\u0026#39; \u0026#39;?ac=day\u0026amp;rid=3\u0026amp;url=https://taopianapi.com/cjapi/sea/vod/xml/m3u8.html\u0026#39; \u0026#39;?ac=day\u0026amp;rid=6\u0026amp;url=https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8/at/xmlsea/\u0026#39; \u0026#39;?ac=day\u0026amp;rid=7\u0026amp;url=http://cj.ffzyapi.com/api.php/seacms/vod/from/ffm3u8/at/xml/\u0026#39; \u0026#39;?ac=day\u0026amp;rid=8\u0026amp;url=https://api.1080zyku.com/inc/ldg_api.php\u0026#39; \u0026#39;?ac=day\u0026amp;rid=9\u0026amp;url=https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/at/xmlsea/\u0026#39; \u0026#39;?ac=day\u0026amp;rid=10\u0026amp;url=https://api.tiankongapi.com/api.php/provide/vod/from/tkm3u8/at/xmlsea\u0026#39; ) #模拟用户浏览器ua,请勿随意修改，以免被目标防火墙拦截! web_ua=\u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 seacmsbot/1.2;\u0026#34; #采集单页 function get_content() { echo \u0026#34;正在采集第$page页...\u0026#34; #echo \u0026#34; get_content: ---\u0026gt;url:---\u0026gt;$1\u0026#34; cResult=$(curl --connect-timeout 10 -m 20 -k -s -L -A \u0026#34;$web_ua\u0026#34; \u0026#34;$1\u0026#34; ) echo $cResult | grep -q \u0026#34;采集\u0026#34; #echo -e \u0026#34;$1\\n$cResult\u0026#34; if [ \u0026#34;$?\u0026#34; = \u0026#34;0\u0026#34; ]; then next_content \u0026#34;$cResult\u0026#34; else echo -e \u0026#34;采集失败,请检查设置!\\n失败链接--\u0026gt;$1\\n返回信息--\u0026gt;$cResult\\n采集结束，共0页\u0026#34; fi } #采集下页 function next_content() { #统计数据 Result=$(echo \u0026#34;$1\u0026#34; | tr \u0026#34; \u0026#34; \u0026#34;\\n\u0026#34;) a=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;采集成功\u0026#34;) b=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;更新数据\u0026#34;) c=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;无需更新\u0026#34;) d=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;跳过\u0026#34;) echo \u0026#34;采集成功--\u0026gt;已更$c部,新增$a部,更新$b部,跳过$d部\u0026#34; let add+=$a let update+=$b let none+=$c let jmp+=$d #检测并采集下页 next_url=${1##*location.href=\\\u0026#39;} next_url=${next_url%%\\\u0026#39;*} #echo $next_url if [ \u0026#34;${next_url:0:1}\u0026#34; = \u0026#34;?\u0026#34; ] then let page++ get_content \u0026#34;$web_site$next_url\u0026#34; else echo \u0026#34;采集结束，共$page页\u0026#34; fi } #脚本入口 echo \u0026#34;海洋CMS自动采集脚本开始执行 版本：v1.2\u0026#34; starttime=$(date +%s) update=0 #更新 add=0 #新增 none=0 #无变化 jmp=0 # 跳过 for url in ${web_api[@]}; do if [[ ! -z $url ]] then web_param=\u0026#34;$web_site$url\u0026amp;password=$web_pwd\u0026#34; page=1 echo \u0026#34;开始采集：$url\u0026#34; get_content $web_param fi done endtime=$(date +%s) echo \u0026#34;============================\u0026#34; echo \u0026#34;入库--\u0026gt;$add部\u0026#34; echo \u0026#34;更新--\u0026gt;$update部\u0026#34; echo \u0026#34;跳过--\u0026gt;$jmp部(未绑定分类或链接错误)\u0026#34; echo \u0026#34;今日--\u0026gt;$[none+add+update]部\u0026#34; echo \u0026#34;============================\u0026#34; echo \u0026#34;全部采集结束,耗时$[endtime - starttime]秒\u0026#34; 其他备份 #!/bin/bash ######################################################## # 程序名称: 海洋CMS自动采集脚本 # 版本信息：seacmsbot/ v2.0 # 发布链接: https://www.seacms.net/ # 使用方法：直接复制代码到宝塔计划任务shell脚本内容里添加每小时任务使用 # 更新时间：2019.9.26 ########################################################## #①请修改下面的网站域名及管理目录 web_site=\u0026#34;http://xxx/xxx/admin_reslib2.php\u0026#34; #②请修改下面项内容为\u0026#34;admin_reslib2.php\u0026#34;里设置的访问密码(默认为系统设置的cookie密码) web_pwd=\u0026#34;xxx\u0026#34; #③下面项内容为资源站每日采集链接地址列表，请自行修改,每行一条,可添加多个，前后需添加引号。 #每日采集链接获取方法:选择\u0026#34;后台-采集-资源库列表\u0026#34;,复制资源站右边的\u0026#34;采集每天\u0026#34;的链接地址,去掉?前面的内容。 web_api=( \u0026#39;?ac=day\u0026amp;rid=5\u0026amp;url=https://xxx/xxx.php/provide/vod/at/xml\u0026#39; ) #模拟用户浏览器ua,请勿随意修改，以免被目标防火墙拦截! web_ua=\u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 seacmsbot/1.2;\u0026#34; #采集单页 function get_content() { echo \u0026#34;正在采集第$page页...\u0026#34; #echo \u0026#34; get_content: ---\u0026gt;url:---\u0026gt;$1\u0026#34; cResult=$(curl --connect-timeout 10 -m 20 -k -s -L -A \u0026#34;$web_ua\u0026#34; \u0026#34;$1\u0026#34; ) echo $cResult | grep -q \u0026#34;采集\u0026#34; #echo -e \u0026#34;$1\\n$cResult\u0026#34; if [ \u0026#34;$?\u0026#34; = \u0026#34;0\u0026#34; ]; then next_content \u0026#34;$cResult\u0026#34; else echo -e \u0026#34;采集失败,请检查设置!\\n失败链接--\u0026gt;$1\\n返回信息--\u0026gt;$cResult\\n采集结束，共0页\u0026#34; fi } #采集下页 function next_content() { #统计数据 Result=$(echo \u0026#34;$1\u0026#34; | tr \u0026#34; \u0026#34; \u0026#34;\\n\u0026#34;) a=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;采集成功\u0026#34;) b=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;更新数据\u0026#34;) c=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;无需更新\u0026#34;) d=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;跳过\u0026#34;) echo \u0026#34;采集成功--\u0026gt;已更$c部,新增$a部,更新$b部,跳过$d部\u0026#34; let add+=$a let update+=$b let none+=$c let jmp+=$d #检测并采集下页 next_url=${1##*location.href=\\\u0026#39;} next_url=${next_url%%\\\u0026#39;*} #echo $next_url if [ \u0026#34;${next_url:0:1}\u0026#34; = \u0026#34;?\u0026#34; ] then let page++ get_content \u0026#34;$web_site$next_url\u0026#34; else echo \u0026#34;采集结束，共$page页\u0026#34; fi } #脚本入口 echo \u0026#34;海洋CMS自动采集脚本开始执行 版本：v1.2\u0026#34; starttime=$(date +%s) update=0 #更新 add=0 #新增 none=0 #无变化 jmp=0 # 跳过 for url in ${web_api[@]}; do if [[ ! -z $url ]] then web_param=\u0026#34;$web_site$url\u0026amp;password=$web_pwd\u0026#34; page=1 echo \u0026#34;开始采集：$url\u0026#34; get_content $web_param fi done endtime=$(date +%s) echo \u0026#34;============================\u0026#34; echo \u0026#34;入库--\u0026gt;$add部\u0026#34; echo \u0026#34;更新--\u0026gt;$update部\u0026#34; echo \u0026#34;跳过--\u0026gt;$jmp部(未绑定分类或链接错误)\u0026#34; echo \u0026#34;今日--\u0026gt;$[none+add+update]部\u0026#34; echo \u0026#34;============================\u0026#34; echo \u0026#34;全部采集结束,耗时$[endtime - starttime]秒\u0026#34; ","date":"2024-01-25T12:31:44Z","permalink":"https://blog.lufei.de/p/qige/","title":"计划任务备份"},{"content":"脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/ssl.sh \u0026amp;\u0026amp; chmod +x ssl.sh \u0026amp;\u0026amp; ./ssl.sh 步骤：选择你的操作系统 \u0026ndash; 输入邮箱 \u0026ndash; 选择证书 \u0026ndash; 输入域名 \u0026ndash; 输入网站路径\n注意：如果你的网站启动目录指向的是二级目录，请改回根目录，否者申请出问题\n证书申请成功后目录：/root/.acme.sh/你的域名/\n打开目录：\nxxxx.key为密钥\nfullchain.cer为证书\n","date":"2024-01-25T07:59:24Z","permalink":"https://blog.lufei.de/p/ssl/","title":"acme自制脚本快速申请免费证书"},{"content":"项目 https://github.com/leitbogioro/Tools\nDebian系列(Debian / Ubuntu / Kali):\napt update -y apt install wget -y 下载： wget --no-check-certificate -qO InstallNET.sh \u0026#39;https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh\u0026#39; \u0026amp;\u0026amp; chmod a+x InstallNET.sh 默认用户名和密码 用户名：root\n密码：LeitboGi0ro\nDebian 12 bash InstallNET.sh -debian Debian 11 bash InstallNET.sh -debian 11 ubuntu 22.04 bash InstallNET.sh -ubuntu ubuntu 20.04 bash InstallNET.sh -ubuntu 20.04 启用BBR 通过向 /etc/sysctl.d/99-sysctl.conf 添加参数和值来为当前内核启用 BBR\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/enable_bbr.sh \u0026amp;\u0026amp; chmod +x enable_bbr.sh \u0026amp;\u0026amp; ./enable_bbr.sh 检查 BBR 是否启动 lsmod | grep bbr 更新系统 apt update -y apt install -y curl 推荐脚本 curl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh docker安装 curl -fsSL https://get.docker.com | sh \u0026amp;\u0026amp; ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin 地区自选，重装Debian 11（推荐大陆以外的服务器） 日本： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.riken.jp/Linux/debian/debian/\u0026#34; 香港： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.hk.debian.org/debian/\u0026#34; 新加坡： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.sg.debian.org/debian/\u0026#34; 韩国： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.kaist.ac.kr/debian/\u0026#34; 台湾： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.tw.debian.org/debian/\u0026#34; 美国： bash InstallNET.sh -debian 11 -mirror \u0026#34;https://mirrors.ocf.berkeley.edu/debian/\u0026#34; 加拿大： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.ca.debian.org/debian/\u0026#34; 英国： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.uk.debian.org/debian/\u0026#34; 德国： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.de.debian.org/debian/\u0026#34; 法国： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.fr.debian.org/debian/\u0026#34; 荷兰： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.nl.debian.org/debian/\u0026#34; 瑞士： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.ch.debian.org/debian/\u0026#34; 俄罗斯： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.ru.debian.org/debian/\u0026#34; 澳大利亚： bash InstallNET.sh -debian 11 -mirror \u0026#34;http://ftp.au.debian.org/debian/\u0026#34; ","date":"2024-01-24T10:36:17Z","permalink":"https://blog.lufei.de/p/133/","title":"linux vps重装系统，dd"},{"content":"不喜欢开场白，还是直接上干货\u0026hellip; 使用方法:\nfor d in baidu.com bing.com 修改为你的域名，多个用空格隔开\n登录https://slack.com/get-started 获取Webhook URL 教程在后面\nhttps://hooks.slack.com/services/xxx/xxx/xxx 修改为你的Webhook URL\n测试要点：修改参数n=129600000将改好的脚本放到宝塔面板计划任务测试，运行，就会收到消息，测试收到消息再改回来2592000(单位秒)，也就是30天到期提醒 5.微信接收消息技巧: 将你的邮件转发到QQ邮箱，打开微信，设置\u0026ndash;通用\u0026ndash;辅助功能\u0026ndash;QQ邮箱提醒 slack默认15分钟发送一次新的消息\n#!/bin/bash #检测域名是否过期 #博客：blog.leshans.eu.org #日期：20240123 #版本：v0.1 #当前日期时间戳，用于和域名的到期时间做比较 currentTimestamp=`date +%s` #检测whois命令是否存在，不存在则安装whois包 isInstallWhois() { which whois \u0026gt;/dev/null 2\u0026gt;/dev/null if [ $? -ne 0 ] then yum install -y whois || apt-get install whois -y fi } notify() { expiredate=`whois $1 |grep \u0026#39;Registry Expiry Date\u0026#39; |awk \u0026#39;{print $4}\u0026#39; |cut -d \u0026#39;T\u0026#39; -f 1` #上面的$1代表域名，遍历循环出来的。 #如果e_d的值为空，则过滤关键词\u0026#39;Expiration Time\u0026#39; if [ -z \u0026#34;$expiredate\u0026#34; ] then expiredate=`whois $1|grep \u0026#39;Expiration Time\u0026#39; |awk \u0026#39;{print $3}\u0026#39;` fi #将域名过期的日期转化为时间戳 expiredatestamp=`date -d $expiredate +%s` #计算半个月一共有多少秒 # 15d 1296000 30d 2592000 35d 3024000 40d 3456000 n=2592000 timeBeforce=$[$expiredatestamp - $n] #过期时间30d以前的时间戳 timeAfter=$[$expiredatestamp + $n] #过期时间30d以后的时间戳 if [ $currentTimestamp -ge $timeBeforce ] \u0026amp;\u0026amp; [ $currentTimestamp -lt $expiredatestamp ] then curl -X POST \\ -H \u0026#39;Content-type: application/json\u0026#39; \\ --data \u0026#39;{\u0026#34;text\u0026#34;:\u0026#34;:warning:域名 \u0026#39;$1\u0026#39; 将在30天内过期. 域名 \u0026#39;$1\u0026#39; 到期日是 \u0026#39;$expiredate\u0026#39; @xuexiaobai\u0026#34;}\u0026#39; \\ https://hooks.slack.com/services/xxx/xxx/xxx fi if [ $currentTimestamp -ge $expiredatestamp ] then curl -X POST \\ -H \u0026#39;Content-type: application/json\u0026#39; \\ --data \u0026#39;{ \u0026#34;text\u0026#34;:\u0026#34;:interrobang:域名 \u0026#39;$1\u0026#39; 已过期. 域名 \u0026#39;$1\u0026#39; 到期日是 \u0026#39;$expiredate\u0026#39; @xuexiaobai\u0026#34;}\u0026#39; \\ https://hooks.slack.com/services/xxx/xxx/xxx fi } #检测上次运行的whois查询进程是否存在 #若存在，需要杀死进程，以免影响本次脚本执行 if pgrep whois \u0026amp;\u0026gt;/dev/null then killall -9 whois fi isInstallWhois for d in baidu.com bing.com do notify $d done 获取Webhook URL教程 创建 Slack 团队：\n如果你还没有 Slack 团队，可以在 Slack 官方网站上创建一个免费的团队账户。 创建工作区：\n一旦你的团队创建好，你可以创建一个工作区，用于组织你的团队成员和频道。 创建频道：\n频道是 Slack 中组织和分类消息的方式。你可以创建不同的频道，例如项目频道、团队频道等。 在 Slack 的左侧导航栏中，点击加号（+）按钮，然后选择 \u0026ldquo;创建频道\u0026rdquo;。 添加团队成员：\n在 Slack 中邀请团队成员加入工作区，以便他们能够参与到你的工作和讨论中。 获取 Incoming Webhook URL：\n如果你想使用脚本中的 Slack 通知功能，你需要创建一个 Incoming Webhook。 在 Slack 中，进入你想要接收通知的频道，点击频道名称，然后选择 \u0026ldquo;集成\u0026rdquo;。 在 \u0026ldquo;集成\u0026rdquo; 页面中，找到 \u0026ldquo;Incoming Webhooks\u0026rdquo; 并点击 \u0026ldquo;添加到此频道\u0026rdquo;。 配置 Incoming Webhook，并获取 Webhook URL。 使用 Slack Webhook URL：\n在脚本中，你需要将 Slack Webhook URL 替换为你的 Incoming Webhook URL。这个 URL 用于向 Slack 发送通知消息。 运行脚本：\n通过终端或脚本执行环境运行你的脚本，以开始监控域名有效期并发送通知到 Slack。 查看通知：\n前提是域名过期或接近过期，Slack 将会收到相应的通知消息。 ","date":"2024-01-23T06:05:40Z","permalink":"https://blog.lufei.de/p/132/","title":"域名有效期监控的最佳方案"},{"content":"反代列表 站源 地址 缓存 github.com hub.fgit.cf 无 raw.githubusercontent.com raw.fgit.cf 无 github.githubassets.com assets.fgit.cf 无 官方地址：https://doc.fastgit.org/zh-cn/node.html\n替换：https://raw.fgit.cf/用户名/仓库名/分支/文件\u0026hellip;\n例如\nhttps://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh 替换成：\nhttps://raw.fgit.cf/kejilion/sh/main/kejilion.sh ","date":"2024-01-21T20:41:27Z","permalink":"https://blog.lufei.de/p/github%E5%8F%8D%E4%BB%A3%E5%88%97%E8%A1%A8/","title":"github反代列表"},{"content":" 切片资源\n高清 https://1080zyk1.com/\n淘片 https://www.taopianzy.com/index.html\niKun资源 https://www.ikunzy.com/\n非凡资源 http://ffzy1.tv/\n光速资源 https://guangsuzy.com/\n在线动漫\nNyaFun动漫 https://www.nyafun.net/\n喵物次元 https://catw.moe/\n次元城 https://www.cycdm01.top/\n","date":"2024-01-21T12:54:23Z","permalink":"https://blog.lufei.de/p/%E5%8A%A8%E6%BC%AB%E8%B5%84%E6%BA%90%E6%9B%B4%E6%96%B0%E4%B8%AD/","title":"动漫资源更新中。。"},{"content":" 线路测试：https://lg-lax02.racknerd.com/\nRackNerd是美国一家基础架构即服务IaaS云服务供应商，由云计算行业资深人士成立。这家公司主要提供虚拟主机、便宜VPS服务器和独立服务器等产品，以及经营代托管业务。由于价格实惠性价比高，所以RackNerd可以作为个人建站极好的选择。\n在这篇文章中，瓦力箱子整理下RackNerd优惠码和最新的促销活动分享，有需要可以购买。\n1. RackNerd VPS最新优惠 2024年1月更新：过完圣诞节，2024年新年马上就要来临。RackNerd为大家准备了4款便宜VPS套餐，来庆祝元旦的到来，最低配置只需要11美元/年。\nCPU 内存 SSD 月流量 价格 详情 1核心 1G 21G 1500G $11/年 查看详情 1核心 2G 35G 2500G $17/年 查看详情 2核心 3G 45G 5000G $27/年 查看详情 2核心 4G 60G 8000G $37/年 查看详情 所有VPS方案均配置1Gbps大带宽，提供一个独立IP地址和具有完全的root权限，可以根据自己的实际需求选择。共有9个机房可以选择，推荐速度较快的美国西海岸的洛杉矶、圣何塞或西雅图机房。不过这次的RackNerd促销没有512M内存方案，有需要的可以查看往期活动。\n2. RackNerd便宜VPS整理(往期活动) 瓦力箱子发现不久以前的RackNerd往期优惠活动还有部分机型可选，合适的可以入手。加起来还有十来款性价比较高的VPS主机可选，价格最低的VPS年付只需要$10美元左右。\n黑色星期五和网络星期一活动 CPU 内存 SSD 月流量 价格 详情 1核心 768M 15G 1000G $10.18/年 查看详情 1核心 2G 30G 2500G $16.98/年 查看详情 2核心 2.5G 50G 5000G $25.49/年 查看详情 2核心 4G 80G 8000G $38.88/年 查看详情 4核心 4.5G 115G 10000G $52.49/年 查看详情 ","date":"2024-01-20T08:07:08Z","permalink":"https://blog.lufei.de/p/racknerd%E4%BC%98%E6%83%A0%E7%A0%81%E5%92%8C%E4%BF%83%E9%94%80%E6%B4%BB%E5%8A%A8%E6%95%B4%E7%90%86-2024%E6%9C%80%E6%96%B0%E7%89%88-%E5%B9%B4%E4%BB%9810%E7%BE%8E%E5%85%83vps/","title":"RackNerd优惠码和促销活动整理 (2024最新版) 年付10美元vps"},{"content":"前言 本教程将帮助你如何在linux系统下的宝塔面板上，快速的安装和配置Java环境 。\n#1 打开终端 打开宝塔的终端并输入以下命令\nPS：一行一个，不要多次输入 。\n第一步，创建 java 路径 。\nmkdir -p /usr/lib/jvm 第二步，移动到，上一步创建的文件夹 。\ncd /usr/lib/jvm 第三步，在此文件夹下下载 java sdk ，耐心等待，国内服务器可能需要 2-10 分钟 。\nPS: 该版本的 sdk 版本为 17\nwget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 第四步，解压上一步下载的 sdk 。\ntar -zxvf jdk-17_linux-x64_bin.tar.gz 第五步，重命名解压后的文件夹 为 jdk17 注意版本号\nmv jdk-17.0.10 jdk17 至此，java 17安装完成，现在开始配置 Java sdk的环境变量 。\n#2 配置环境变量 打开宝塔文件根目录的以下路径 ==/etc/profile==\n并在 profile 文件的末尾添加以下环境变量\nexport JAVA_HOME=/usr/lib/jvm/jdk17 export PATH=$JAVA_HOME/bin:$PATH 返回终端，输入以下命令，刷新配置文件\nsource /etc/profile 再输入以下命令，如果出现 java 版本即代表环境配置成功 。\njava -version ","date":"2024-01-20T07:41:01Z","permalink":"https://blog.lufei.de/p/128/","title":"宝塔 Linux Java 环境安装教程"},{"content":"收款：4.4%+0.3USD\n比如我转30给你，你实际收到的是：30 -（30*4.4%+0.3）=28.38\n中国paypal转账到香港paypal，损耗5.5%\n包括：2%交易总额+3.5%交易汇率=5.5%\n假设中国paypal转50美金到香港paypal,如果香港paypal要到账50美金，则需要：\n50*（1+5.5%）=52.75\n汇率换算地址：https://wise.com/zh-cn/currency-converter/usd-to-cny-rate?amount=1\n中国大陆手续费：【点击进入】 香港地区手续费：【点击进入】\n","date":"2024-01-18T06:01:13Z","permalink":"https://blog.lufei.de/p/paypal%E8%BD%AC%E8%B4%A6%E6%89%8B%E7%BB%AD%E8%B4%B9/","title":"paypal转账手续费"},{"content":"添加防火墙规则表达式 复制代码即可 第一：恶意流量阻止 操作：托管质询\n(cf.threat_score ge 5 and not cf.client.bot) or (not http.request.version in {\u0026#34;HTTP/1.2\u0026#34; \u0026#34;HTTP/2\u0026#34; \u0026#34;HTTP/3\u0026#34; \u0026#34;SPDY/3.1\u0026#34;}) or (not http.user_agent contains \u0026#34;Mozilla/\u0026#34;) 第二：放行爬虫（seo） 操作：跳过\n(cf.client.bot) or (http.user_agent contains \u0026#34;duckduckgo\u0026#34;) or (http.user_agent contains \u0026#34;facebookexternalhit\u0026#34;) or (http.user_agent contains \u0026#34;Feedfetcher-Google\u0026#34;) or (http.user_agent contains \u0026#34;LinkedInBot\u0026#34;) or (http.user_agent contains \u0026#34;Mediapartners-Google\u0026#34;) or (http.user_agent contains \u0026#34;msnbot\u0026#34;) or (http.user_agent contains \u0026#34;Slackbot\u0026#34;) or (http.user_agent contains \u0026#34;TwitterBot\u0026#34;) or (http.user_agent contains \u0026#34;ia_archive\u0026#34;) or (http.user_agent contains \u0026#34;yahoo\u0026#34;) 第三：其他 跳过源站IP、区域或国家阻止\nCF的WAF的防火墙规则！ ","date":"2024-01-17T04:53:36Z","permalink":"https://blog.lufei.de/p/126/","title":"套cf后 站点WAF防火墙规则设定"},{"content":"系统需求 最小需求：\n操作系统：Linux 包括CentOS、RHEL、Debian、Ubuntu、RockyLinux、AlpineLinux及其他各种发行版本 CPU不少于1核心 可用内存不少于1G 可用硬盘空间不小于10G 对于每日千万访问以上的CDN系统推荐配置如下：\nCPU不少于8核心 可用内存不少于16G 可用硬盘空间不小于200G 准备工作 在安装GoEdge之前，需要你做以下准备工作：\n安装一个或者使用现有的 MySQL 5.7.8/MySQL 8.0/MySQL 8.1/MySQL 8.2/TiDB 3.0 以上版本；如果你会一些Linux基本命令，但是不知道怎么安装MySQL，可以参考这里 安装MySQL；另外请注意： 安装使用的MySQL用户密码不能为空 当前只支持通过端口连接MySQL，不能使用Sock文件连接 手动安装时，Linux服务器需要确认有 unzip 命令，用来解压压缩包，可以使用： 推荐系统： ubuntu 22.04 或者 20.04, debian安装有些问题\n先安装依赖：ubuntu系统可以跳过安装依赖\napt install wget -y sudo apt install unzip sudo apt-get install xz-utils sudo apt-get update sudo apt-get install libnuma1 在Linux下可以尝试使用以下命令自动执行上述的安装步骤（前提是系统已经安装了 wget 命令）：\n一、安装MySQL sudo sh -c \u0026#34;$(wget https://goedge.cn/install-mysql.sh -O -)\u0026#34; 安装成功后，控制台会输出类似以下内容：\n2022/11/03 11:45:08 finished installed successfully ======= user: root password: ccdc61ea4dd0934bf3bfd4310517c41c dir: /usr/local/mysql 请将这段内容保存起来，防止丢失，其中：\nuser - 用户名 password - 密码 dir - 安装位置 二、安装程序 可以使用install.sh快速安装GoEdge管理平台，目前仅限于Linux系统；在你的系统上运行以下命令：\nsudo sh -c \u0026#34;$(wget https://goedge.cn/install.sh -O -)\u0026#34; 运行后，如果遇到域名解析或者网络问题，请再次尝试执行；如果出现：\nstarted ok please open the url http://SERVER_IP:7788 on your browser 这样的提示，说明已经安装成功；默认的安装目录为/usr/local/goedge/edge-admin；安装后，在浏览器上访问：\nhttp://IP地址:7788/ 即可进入安装界面，其中IP地址是你服务器的IP地址；如果服务器有安全策略或者防火墙，需要放行7788端口。\n常用命令 edge-admin 通常是在EdgeAdmin安装目录下的 bin/ 目录下，在执行命令的时候请使用完整的路径或者使用相对路径，如：\n/$EdgeAdmin安装目录/bin/edge-admin -v 或者：\ncd /$EdgeAdmin安装目录bin/edge-admin -v 注意：如果提示命令找不到 Unknown command: edge-admin，说明你没有指定命令所在目录，请在命令执行时使用完整的路径或者使用相对路径，参考本文开始说明。\n打印帮助信息 edge-admin -h 打印版本信息 edge-admin -v 启动服务 启动服务并在后台运行：\nedge-admin start 如果要在前端启动服务，并阻塞当前进程，可以使用：\nedge-admin 停止服务 edge-admin stop 重启服务 edge-admin restart 查看服务状态 edge-admin status 安装systemd系统服务 edge-admin service 使用守护进程启动服务 edge-admin daemon 重置配置 需要重装之前，你需要重置配置：\nedge-admin reset ","date":"2024-01-16T16:36:40Z","permalink":"https://blog.lufei.de/p/125/","title":"自建CDN-GoEdge CDN - 制作自己专属的CDN"},{"content":"问题描述 重复安装启用插件，或之前有过旧文件，再次启用插件可能会提示“发现冲突文件”，而导致无法启用插件\n下载地址 ： https://lzui.lanzouj.com/iTHdz1kx36mb\n解决办法 在你程序内去检查以下插件文件，并删除\n1、 先找到下方这个路径的文件夹，将这个文件夹删除\n/static/mycj/ 2、再找到以下路径的文件并删除\n/application/extra/cjuser.php /application/extra/cjfaves.php /application/extra/cjversion.php 3、然后再删除下面这个路径的文件\n/application/admin/controller/Mycj.php 4、最后删除这个路径的文件夹即可\n/application/admin/view/mycj/ 将以上几个地方的文件删除，再重新上传插件，并启用试试看。\n若提示启用成功，后台快捷菜单处没有显示快捷菜单，那么手动添加一下快捷菜单即可\n萌芽采集资源,mycj/union 复制上方快捷菜单代码，添加到快捷菜单里面并保存即可\n","date":"2024-01-12T11:38:09Z","permalink":"https://blog.lufei.de/p/124/","title":"萌芽采集插件启用提示“发现冲突文件”解决办法"},{"content":"锁住文件\nchattr -R +i /www/wwwroot/123.com 排除缓存目录\nchattr -R -i /www/wwwroot/123.com/runtime/temp 锁住单个文件\nchattr +i /www/wwwroot/123.com/block/foot.html 解锁\nchattr -i /www/wwwroot/123.com/block/foot.html 注意：为了安全起见 每次发现被挂马后应该用以下方法来处理！！！ 黑客入侵后可能在数据库挂js，可能在网站目录任何角落留下php后门，用以下方法可以快速清理干净php后门，不用一个一个文件去分析。\n1，备份原网站配置文件 ，并检查里边是否有后门代码，正常情况下\u0026lt;?php内是一个return array返回数组，如果还有其他\u0026lt;?php块就是后门。\n\\application\\database.php\n\\application\\route.php\n\\application\\extra\\maccms.php\n\\application\\extra\\bind.php\n\\application\\extra\\timming.php\n\\application\\extra\\vodplayer.php\n\\application\\extra\\voddowner.php\n\\application\\extra\\vodserver.php\n2，检查以下目录搜索 *.php ，删除所有;并检查模板文件内是否有\u0026lt;?php或{php代码段删除。\n\\template\\\n\\upload\\\n3，删除原有目录及所有文件，并下载最新程序包，覆盖\n\\addons\\\n\\application\\\n\\extend\\\n\\static\\\n\\runtime\\\n\\thinkphp\\\n\\vendor\\\n\\说明文档\\\n\\admin.php 自定义后台入口文件\n\\api.php 自定义api入口文件\n\\index.php\n\\install.php\n4，把刚才备份的配置文件覆盖到application下即可\n5，修改后台入口文件名；登录后台检查管理员账号并修改密码，删除多余被黑客创建的账号；\n","date":"2024-01-12T04:17:18Z","permalink":"https://blog.lufei.de/p/123/","title":"苹果cms通用清理php后门自动脚本"},{"content":"第一步：获取脚本代码\n下面是自动采集脚本代码\n#!/bin/bash ######################################################## # 程序名称: 海洋CMS自动采集脚本 # 版本信息：seacmsbot/ v2.0 # 发布链接: https://www.seacms.net/ # 使用方法：直接复制代码到宝塔计划任务shell脚本内容里添加每小时任务使用 # 更新时间：2019.9.26 ########################################################## #①请修改下面的网站域名及管理目录 web_site=\u0026#34;http://你的域名/管理目录/admin_reslib2.php\u0026#34; #②请修改下面项内容为\u0026#34;admin_reslib2.php\u0026#34;里设置的访问密码(默认为系统设置的cookie密码) web_pwd=\u0026#34;111111111111111111\u0026#34; #③下面项内容为资源站每日采集链接地址列表，请自行修改,每行一条,可添加多个，前后需添加引号。 #每日采集链接获取方法:选择\u0026#34;后台-采集-资源库列表\u0026#34;,复制资源站右边的\u0026#34;采集每天\u0026#34;的链接地址,去掉?前面的内容。 web_api=( \u0026#39;?ac=day\u0026amp;rid=2\u0026amp;url=https://ikunzyapi.com/api.php/seaxml/vod/at/xml\u0026#39; \u0026#39;?ac=day\u0026amp;rid=3\u0026amp;url=https://taopianapi.com/cjapi/sea/vod/xml/m3u8.html\u0026#39; ) #模拟用户浏览器ua,请勿随意修改，以免被目标防火墙拦截! web_ua=\u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 seacmsbot/1.2;\u0026#34; #采集单页 function get_content() { echo \u0026#34;正在采集第$page页...\u0026#34; #echo \u0026#34; get_content: ---\u0026gt;url:---\u0026gt;$1\u0026#34; cResult=$(curl --connect-timeout 10 -m 20 -k -s -L -A \u0026#34;$web_ua\u0026#34; \u0026#34;$1\u0026#34; ) echo $cResult | grep -q \u0026#34;采集\u0026#34; #echo -e \u0026#34;$1\\n$cResult\u0026#34; if [ \u0026#34;$?\u0026#34; = \u0026#34;0\u0026#34; ]; then next_content \u0026#34;$cResult\u0026#34; else echo -e \u0026#34;采集失败,请检查设置!\\n失败链接--\u0026gt;$1\\n返回信息--\u0026gt;$cResult\\n采集结束，共0页\u0026#34; fi } #采集下页 function next_content() { #统计数据 Result=$(echo \u0026#34;$1\u0026#34; | tr \u0026#34; \u0026#34; \u0026#34;\\n\u0026#34;) a=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;采集成功\u0026#34;) b=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;更新数据\u0026#34;) c=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;无需更新\u0026#34;) d=$(echo \u0026#34;$Result\u0026#34; | grep -c \u0026#34;跳过\u0026#34;) echo \u0026#34;采集成功--\u0026gt;已更$c部,新增$a部,更新$b部,跳过$d部\u0026#34; let add+=$a let update+=$b let none+=$c let jmp+=$d #检测并采集下页 next_url=${1##*location.href=\\\u0026#39;} next_url=${next_url%%\\\u0026#39;*} #echo $next_url if [ \u0026#34;${next_url:0:1}\u0026#34; = \u0026#34;?\u0026#34; ] then let page++ get_content \u0026#34;$web_site$next_url\u0026#34; else echo \u0026#34;采集结束，共$page页\u0026#34; fi } #脚本入口 echo \u0026#34;海洋CMS自动采集脚本开始执行 版本：v1.2\u0026#34; starttime=$(date +%s) update=0 #更新 add=0 #新增 none=0 #无变化 jmp=0 # 跳过 for url in ${web_api[@]}; do if [[ ! -z $url ]] then web_param=\u0026#34;$web_site$url\u0026amp;password=$web_pwd\u0026#34; page=1 echo \u0026#34;开始采集：$url\u0026#34; get_content $web_param fi done endtime=$(date +%s) echo \u0026#34;============================\u0026#34; echo \u0026#34;入库--\u0026gt;$add部\u0026#34; echo \u0026#34;更新--\u0026gt;$update部\u0026#34; echo \u0026#34;跳过--\u0026gt;$jmp部(未绑定分类或链接错误)\u0026#34; echo \u0026#34;今日--\u0026gt;$[none+add+update]部\u0026#34; echo \u0026#34;============================\u0026#34; echo \u0026#34;全部采集结束,耗时$[endtime - starttime]秒\u0026#34; 第二步：修改脚本\n需要修改脚本里面的3项内容：\n#①请修改下面的网站域名及管理目录 web_site=\u0026#34;http://网站域名/管理目录/admin_reslib2.php\u0026#34; 这个是需要修改成你的“网站域名”和“海洋cms后台的管理目录”。域名大家都能理解，后台的管理目录这个对于新手来说需要多讲两句，首先你要能登录你的后台才可以知道你的后台目录。举例说明：假如我的后台登录地址是 mytheme.cn/xxxx/那么这里的“xxxx”就是后台的管理目录，得到了管理目录我们直接填写到代码里即可。 #②请修改下面项内容为\u0026#34;admin_reslib2.php\u0026#34;里设置的访问密码(默认为系统设置的cookie密码) web_pwd=\u0026#34;8888e82e85bd4540f0defa3fb7a8e888\u0026#34; 这个修改需要到海洋cms系统后台得到我们的cookie密码进行替换才可以，具体步骤：系统-网站设置-cookie密码。得到自己网站的cookie密码后替换即可。 #③下面项内容为资源站每日采集链接地址列表，请自行修改,每行一条,可添加多个，前后需添加引号。 #每日采集链接获取方法:选择\u0026#34;后台-采集-资源库列表\u0026#34;,复制资源站右边的\u0026#34;采集每天\u0026#34;的链接地址,去掉?前面的内容。 web_api=( \u0026#39;?ac=day\u0026amp;rid=1\u0026amp;url=https://api.iokzy.com/inc/ldg_seackm3u8s.php\u0026#39; \u0026#39;?ac=day\u0026amp;rid=2\u0026amp;url=http://www.zdziyuan.com/inc/s_ldgm3u8_sea.php\u0026#39; ) 这个是代码里需要修改的最后一项，里面是代码里默认提供的2个采集链接地址，我们需要获取自己的采集链接API地址添加到里面。 ","date":"2024-01-07T07:43:46Z","permalink":"https://blog.lufei.de/p/122/","title":"海洋cms自动采集之宝塔面板定时任务"},{"content":" 飞速资源 https://help.feisuzyapi.com/ 闪电资源 http://shan04.com/ 樱花资源 https://yhzy.cc/ 百度资源 http://bdzy.com/ 无尽资源 https://www.wujinzy.com/ 酷点资网 https://www.kudian20.com/ 红牛资源 https://www.hongniuziyuan.com/ 云解析资源 https://www.yparse.com/help 天空资源 http://help.tiankongapi.com/ 天堂官方资源 http://vipmv.cc/help/ 1080zyk优质资源 https://1080zyk2.com/ 卧龙影视资源 http://wolongzyw.com/ 全网影视资源 http://hao123.daicuo.cc/ fox资源 https://help.foxzyapi.com/ 金鹰资源 https://jinyingzy.net/ 新浪资源 https://xinlangzy.com/ 光速影视资源 https://guangsuzy.com/ 奥斯卡资源 https://aosikazy.com/static/help/index.html 快车资源 https://www.kuaichezy.com/ 淘片资源 (需VPN) https://www.taopianzy.com/ 量子资源 http://lzizy.net/ 诺讯资源 https://caiji.nxflv.com/ tom资源 https://www.tomziyuan.com/ 三零资源 http://www.000zy.com/ 麒麟资源(需要授权) https://www.qilinzyz.com/ 鱼乐资源 https://www.ylzy1.com/ ikun资源 https://www.ikunzy.com/ 阳光资源 https://www.xxzy.org/ U酷资源 https://ukuzy.com/ 非凡资源 http://ffzy.tv/ 伊人资源 https://yrzyz9.com/ 天猫资源 https://tianmaozy.com/ 快车资源 https://www.kuaichezy.com/ 海外看资源(需VPN) https://haiwaikan.com/ ","date":"2024-01-07T07:24:01Z","permalink":"https://blog.lufei.de/p/2023%E5%B9%B4%E6%9C%80%E6%96%B0%E5%8F%AF%E9%87%87%E9%9B%86cms%E8%A7%86%E9%A2%91%E8%B5%84%E6%BA%90%E7%AB%99%E7%BD%91%E5%9D%80%E5%90%88%E9%9B%86/","title":"2023年最新可采集CMS视频资源站网址合集"},{"content":"前言 我们注册有些国外的服务时，是不能用国内邮箱注册的，这时一个Gmail邮箱就显得很有必要。而有时候我们会需要注册多个账号，当然你可以用多个Gmail邮箱来注册。但多个Gmail邮箱又不好管理，而且现在Gmail邮箱也不是那么好注册了，这时你就会需要下面我要介绍的内容了，利用Gmail邮箱的别名功能来实现同一邮箱获取无限多个Gmail邮箱号。\n在这之前你需要有一个谷歌账号（Gmail邮箱）。没有的话去到这里注册：http://mail.google.com（目前注册可能需要特殊方法，请自行搜索解决）。\nGmail邮箱别名设置 这里我们假设你的Gmail邮箱为：abcdef@gmail.com ，那就可以通过以下办法得到无限的谷歌邮箱别名。\n1.用户名之间加 . （英文半角） 例如： abc.def@gmail.com\n因为Gmail的用户名是不区分 . 符号的，所以下面其实都是同一个用户名\nabcde.f a.bcdef ab.cdef a.b.cdef abc.d.ef 2.用户名后面加 +任意字符 例如： abcdef+dev@gmail.com\n+ 号后面可以是任意字符，例如：\n+dev +my +sub …… **PS：**使用“+”号法，在许多网站注册时候，并不识别邮箱地址中的“+”，会提示你邮箱错误。\n3.改变用户名中任意字符的大小写 例如： aBCdef@gmail.com\n可以是用户名里的某个或多个字符，\nAbcdef@gmail.com AbcDeF@gmail.com abcdEf@gmail.com 4. 把后缀变为 googlemail.com 因为之前Gmail在某些国家的商标没有谈好，不能使用Gmail商标，只好用googlemail，这个很好理解。（貌似现在全球的商标都已经谈妥了）\n例如： abcdef@googlemail.com\n５.以上４种方法的结合 可以结合上面的4种方法来实现理论上的无限别名。例如：\naBcdef+dev@googlemail.com AbcDEf+sub@googlemail.com 总结 了解了上面的Gmail别名设置的方法后，当你要注册一些服务的时候，只要在填写Gmail邮箱的时候填写通过上述的方法得到的别名邮箱就可以了。无需到Gmail设置，所有的别名邮箱的邮件都会发送到你原来的邮箱 abcdef@gmail.com 中。\n","date":"2024-01-07T05:10:06Z","permalink":"https://blog.lufei.de/p/%E5%88%A9%E7%94%A8%E8%B0%B7%E6%AD%8C%E9%82%AE%E7%AE%B1%E5%88%AB%E5%90%8D%E8%8E%B7%E5%8F%96%E6%97%A0%E9%99%90gmail%E9%82%AE%E7%AE%B1/","title":"利用谷歌邮箱别名获取无限Gmail邮箱"},{"content":"为什么要设置Cloudflare的页面规则 （Page Rules）进行全站缓存？ 当你接入Cloudflare的CDN，并点亮小云朵之后。你的网站就已经通过Cloudflare的CDN节点进行中转了。默认情况下，Cloudflare 会对你网站中的图片、JS、CSS文件等静态文件进行缓存。\n当访客访问你网站页面的时候，所有的静态文件都是由Cloudflare的节点直接给到访客的，但是HTML文件是默认不缓存的。也就意味着访客访问你的某一页面的时候。仍然会回源你的服务器。\n所以，本篇文章就是教你如何使用Cloudflare的页面规则（Page Rules）把整个HTML页面给缓存。 使访客访问被缓存的页面的时候，直接交由Cloudflare进行服务，甚至你的源服务器不会收到任何GET请求。\n这样做的好处是，可以大大减少源服务器的负载开支，使得你的站点能够承载更多的访客及流量。\n下面两张演示图片就是使用了Cloudflare页面规则之后，节省的源站服务器的请求及流量。\n如何通过浏览器判断某个页面是否被Cloudflare的CDN进行缓存？ 在学会如何判断之前，我们要先熟悉一个CDN中常见的术语：“HIT”，中文叫做**“命中”**。我们先看下面这样演示的图片：\n可见，图中对过往24小时之内的所有请求有一个统计，统计分为：命中、未命中、动态、绕过……等等状态。\n【命中】状态就表示已经整网页完全被Cloudflare的CDN提供了服务； 【绕过】状态则表示直接绕过Cloudflare的CDN由源站进行服务； 【动态】状态则表示部分资源被Cloudflare的CDN缓存并服务，但混合了一些源站的请求； 【未命中】因为命中与否是一个概率问题。Cloudflare 也并不能保证在缓存规则中的所有资源都完整的命中。 **注：如果你开启了小云朵，但并未配置页面规则。**那么你的绝大多数状态都是【动态】，因为访客访问页面中的静态资源交由Cloudflare进行提供，还是有一些请求是通过源站来服务的。\n接下来，我们以Chrome为示范。教大家判断一个网页在开启Cloudflare CDN之后的缓存状态到底是**【命中】亦或是【动态】**\n打开接入Cloudflare的网站页面，这里以陌涛小站首页示范。 “F12” 进入“开发者工具”，点击“Network”选项卡。 “Control + F5” 刷新该页面（苹果系统请使用 Command + R），并在“Name”栏中选择“网址”。\n从上图中可以看到 cf-cache-status 的值为 “HIT”，则说明该页面已经完全缓存。\n其他状态解释如下： cf-cache-status:DYNAMIC （动态） 如果是“DYNAMIC”则说明，该站可能只开启了小云朵，并没有配置整站完全缓存。 cf-cache-status:BYPASS （绕过） 如果是“BYPASS”则说明，该站针对这个页面设置了绕过，不允许缓存。\nCloudflare的缓存机制 假设你的站点有 www.renao.org/1.html 和 www.renao.org/2.html 两个页面。\n当访客A 访问1.html这个页面的时候，首先会经由Cloudflare，这个时候你的页面规则就起作用了。 Cloudflare会发现，吼吼，这个站有个1.html 我给它缓存下来，并且转发给A。\n当访客B 在Edge Cache过期时间之前，重复访问1.html的时候。 Cloudflare会思考一下。哈哈哈，这个1.html我有。不用麻烦源站了。我直接给到B就可以了。\n这就是所谓的命中率，如果这个页面被完全命中，那么B访问1.html虽然得到了网页，但是是由Cloudflare直接提供的。你的源站甚至连客户的IP都统计不到。\n但是，2.html 这个页面在你的规则建立开始时从未有任何访客访问过。那么Cloudflare也不知道这个页面的存在，也不会缓存。除非等到真的有人访问过，Cloudflare才会发现，并对其进行缓存。\n好了，冗长的理论知识讲完了，我们来进行实战。 这里以Wordpress源站举例，来详细讲解如何设置页面规则才能够进行全站缓存。\n一、Cloudflare 页面规则 免费版3条规则配置 由于Cloudflare免费版只提供了三条免费的规则，所以我们的想法有很多，但是真正实现起来肯定要有所取舍。下面提供了三种陌涛小站测试过的方法。根据你网站的具体情况选择即可。\n在所有的规则配置中，“*”代表通配符，另外，规则注意上下排序。默认从第一条规则顺延到第二条规则，然后才是第三条规则。具体请参照以下【三种方法】的详细配置说明。\n方法一、常规无人值守方法（网上流传配置方法） .imotao.xyz/wp-login .imotao.xyz/wp-admin .imotao.xyz/ 第一条和第二条： 研究Wordpress后台目录，我们发现：wp-login 和 wp-admin 两个页面或目录分别是Wordpress后台的登陆页面和后台管理目录。为了让Cloudflare不缓存这些内容。我们在第一条和第二条中。建立的规则是Bypass，也就是绕过。\n第三条： 此条规则很简单，也很容易理解。就是告诉Cloudflare 进行全局缓存。无论是图片、html、js、css、等等统统给我缓存。当然，按照上面提到的排序规则。Cloudflare会过滤掉以上我们不想要缓存的第一条、第二条。\n方法二、常规无人值守方法 *.imotao.xyz/preview=true .imotao.xyz/.php* .imotao.xyz/ 第一条： 由于Wordpress 提供了预览页面，我们研究Wordpress 的预览页面URL可以发现一个特征，预览页面的URL都含有**“preview=ture”这个字段，所以通过第一条规则，可以限制Cloudflare 缓存我们的预览页面**。如果没有此条规则，Cloudflare会缓存我们预览的页面。但实际缓存了预览页面对网站本身的影响并不大。\n第二条： 这条规则可以说是十分重要了。如果不设置此条规则，那么我们的后台页面、甚至包括登陆页面也都会被Cloudflare给缓存进去。曾经有小伙伴的wp-login页面（Wordpress默认登陆页面）连带着登陆账号密码统统被缓存了。访客直接可以通过缓存的账号密码进入Wordpress的后台，你说恐怖不恐怖？ 此条规则是我们为了防止Cloudflare缓存我们的动态页面（登陆页、后台页）。这条简单粗暴的直接将所有带有“.php”的页面请求全部Bypass 也就是不缓存。\n第三条： 同【方法一】的第三条\n方法三、常规无人值守（并为针对“搜索功能的CC攻击”单独开启5秒盾） .imotao.xyz/?s= .imotao.xyz/.php* .imotao.xyz/ 第一条： 将所有在Wordpress站内搜索的用户开启5秒盾。一般针对Wordpress的CC攻击都是通过随机UA、随机搜索内容来创建数千、数万的URL。并通过大量的代理IP来模拟真实用户访问。毕竟搜索在Wordpress这个系统中是需要调用数据库，很消耗服务器资源的。 如果攻击者不清楚你的Page Rules 的配置规则，通过站内搜索对你的站点进行CC攻击的时候，此规则就能够很好的帮助你缓解攻击。除非他技术高超可以穿5秒盾。\n第二条： 同【方法二】的第二条\n第三条： 同【方法二】的第三条\n使用此种方法，将会舍弃上面方法二提到的【文章预览】功能不缓存，影响并不大。\n特别注意 如果你留意到了上面提到的缓存机制的时候，一定要注意一件事情。就是若作为管理着的你登陆在Cloudflare的后台。有些主题在登陆状态下浏览文章是有“登陆条”的。所以尴尬的事情会发生。就是Cloudflare会无差别的把你的登陆条给缓存上去。真正的访客登陆到页面的时候，能看到你的用户名、留言数、等等关键信息。 所以，你需要在Wordpress的设置中关掉显示登陆条的功能。\n二、Cloudflare Pro 页面规则 20或30条规则配置 如果你有Cloudflare Pro的付费版本，那么恭喜你可以配置20条页面规则。\n这里贴出一个配置的示范。\n这里的第6条，设置之后，所有的动态页面（php）的请求全部301重定向到了陌涛小站的首页。也就意味着我自己也不能登陆后台进行编辑了。当我需要写文章的时候，将此条规则临时关闭,并清楚本地浏览器缓存就可以了。\n三、其他Cloudflare 常见功能 **清除缓存：**当我们的页面已经被完全缓存之后，更新页面需要单独删除此链接的缓存，以便Cloudflare重新从源站抓取。\n**I’m In Attack：**开启5秒盾模式\n**调试模式：**开启之后默认绕过所有缓存，以便我们进行调试。\n","date":"2023-12-23T12:14:09Z","permalink":"https://blog.lufei.de/p/cloudflare-%E9%A1%B5%E9%9D%A2%E7%BC%93%E5%AD%98page-rules%E4%BC%98%E5%8C%96wordpress%E5%85%A8%E7%AB%99%E7%BC%93%E5%AD%98%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99/","title":"Cloudflare 页面缓存（Page Rules）优化WordPress全站缓存配置规则"},{"content":"前段时间网站一直被攻击，然后博主扛不住了搬去了 CloudFlare 。初期因为设置问题，攻击还是透过了CloudFlare 打到了源站。后面经过多次的设置后已经可以完全阻止攻击请求了。下面给大家分享下我的设置，如果你的网站被攻击了，可以根据自己的实际情况微调修改下。\n1.设置前说明 网站程序为WordPress，不同程序可能需要微调下策略。\nCloudFlare免费版默认设置是针对整个域名的，如果你有其他二级域名站点，需要注意下这个策略对你其他站点有没有影响。\n在你使用CloudFlare前确保你的源站IP没有暴露，否则对方可以直接指定hosts到你的源站IP，CloudFlare就形同虚设。\n如果源站IP已经暴露，先把数据备份出来。开一台新服务器创建站点。\n关于CloudFlare接入的基础操作这里就不讲了，比如SSL设置之类。\n下面的规则自己实际使用后一定不要暴露出来，否则攻击者会针对性的进行攻击。建议自己进行规则微调。\n2.策略详情 策略设置有优先级，排名靠前的优先级大于后方策略。所以说针对搜索引擎蜘蛛的策略，一定放在第一个！\n2.1 waf设置 WAF策略总览\n2.1.1搜索引擎蜘蛛策略 表达式：(cf.client.bot)\n主要作用：CloudFlare 对于常见搜索引擎蜘蛛IP有自己的一份数据库，符合此要求的请求将会直接访问网站数据。不会经过 CloudFlare 的 WAF 策略等。避免正常蜘蛛访问被拦截。\n2.1.2登录页策略 网站我们正常运行必然有访客进行注册登录，针对我们的登录页以及常见被扫描的地址，我们可以单独设置一下人机验证。\n主要作用：本站是WordPress程序，所以设置了xmlrpc.php和wp-login.php地址。其他程序根据自己实际情况设置。优先级低于蜘蛛，放到第二也是为了防止有些访客挂着代理被后续的策略阻止。\n2.1.3威胁分数策略 此策略是防攻击的主力策略，这一项可以阻挡90%的攻击。\n[\n主要作用：威胁分数大于等于2，可以阻挡90%的恶意IP。CloudFlare 默认推荐分数5实测基本给攻击全漏了进来，设置3同样有漏IP。所以根据2023年9月目前的网络来说这里建议设置为2！\nrss是因为站点有很多人通过RSS进行订阅，所以针对此类请求我们不要对他进行人机验证。\n这里针对RSS策略比较简单，如果攻击者知道了你的策略可能会针对性攻击，我们实际使用时可以适当变通一下。\n2.1.4细化攻击策略 上一个策略是简单的通过威胁分数判断，现在这个策略则是针对漏进来的攻击IP进行针对性的过滤。\n[\n主要作用：首先过滤国家不等于china，因为来自国内的攻击IP极少。我们的访客绝大多数也来自china所以直接略过国家。\n/feed是我们的RSS订阅地址，我们同样略过此地址。\nIP源地址是我们的源站IP，针对源站IP来的请求数据我们同样略过。\nURL不包含.html是因为本次攻击地址都不是.html地址，所以略过了。我网闸对于.html地址也有缓存。大家自己设置时候这一个可以删掉。\nUA字段WellKnownBot，这个是当时翻策略拦截日志发现的一个UA，好像是个正常请求。所以给他过滤了。\n威胁分数大于3，这里是保证整个策略不至于过于严格，只针对威胁分数大于 3 的 IP 生效。\n2.1.5地区策略 [\n这里一般不需要设置，我是看攻击IP有大量来自印尼的IP，网站基本也没印尼的访客，所以来自印尼的IP全部进行CAPTCHA交互式人机验证。\n2.2 DDOS策略 CloudFlare针对DDOS有自己的分析策略可供我们使用。\n这里CloudFlare的DDOS实际是包含我们常说的CC攻击的，七层和四层区别。\n[\n[\nCloudFlare会分析请求是否是DDOS，对于符合的请求我们可以选择进行验证。另外规则集敏感度也可以进行调整。\n这里如果你正在被攻击，可以将敏感度设置为高。实测误比较少，如果网站长期套CloudFlare，我们可以设置为中。\n2.3 其他WAF设置 [\n2.4 缓存设置 缓存设置好也可以帮助我们抵挡巨量的CC攻击。有些CC是很多IP随即攻击一个地址，如果我们的安全策略没有拦截到攻击。但是我们设置了缓存，那这些请求则会在CloudFlare边缘节点直接将缓存内容返回给请求。也达到了抗攻击的效果。\n缓存设置是在多个位置进行的。下面大家看截图就好。\n[\n创建一个静态文件的缓存规则。\n[\n[\n[\n上面的是基础缓存，对于页面的缓存我们使用下面的规则。\n2.4.1 页面规则 [\n[\n下面这个是我针对RSS地址的缓存设置。实际可以不设置这个规则。\n[\n[\n2.5 其他杂项 一些设置比较散乱，这里给大家列出来。\nTor洋葱路由关闭，否则攻击可能穿进源服务器。\n2.6 最终防御5秒盾 目前本站遇到的攻击无需开启五秒盾。\n如果你的攻击比较大，而且依靠上面规则无法抵挡的话，就开启这个吧。开启后所有请求都会进行人机验证，影响较大。\n","date":"2023-12-23T06:45:21Z","permalink":"https://blog.lufei.de/p/%E6%96%B0%E7%89%88-cloudflare-cdn-%E9%98%B2%E6%94%BB%E5%87%BB%E8%AE%BE%E7%BD%AE/","title":"新版 CloudFlare CDN 防攻击设置"},{"content":"Python项目源码、教程、工具合集，由于经常私信受限，或者回复大家不及时，耽误大家时间，所以up主把内部链接放这里了，需要的点击自行拿走。\n（需要各类安装包和秒杀源码的宝子可以添加文章下方哦）\n（链接直接复制到百度/夸克网盘打开就可以获取了）\n1.音乐源码\n链接：https://pan.baidu.com/s/1QwEFWLGxp-PSn1E_ajaHjg?pwd=386d 提取码：386d 复制这段内容打开「百度网盘APP 即可获取」\n2.小说\n链接：https://pan.baidu.com/s/17_r-A95tt-FF2kvcr46-fA?pwd=g1x7 提取码：g1x7 复制这段内容打开「百度网盘APP 即可获取」\n3.WiFi密码获取\n链接：https://pan.baidu.com/s/1EG44DeW20YYclrcIkfiSzQ?pwd=T94p 提取码：T94p 复制这段内容打开「百度网盘APP 即可获取」\n4.Python大麦抢票\n链接：https://pan.baidu.com/s/19xq7wdPb327GISXUgrmSNw?pwd=32jb 提取码：32jb 复制这段内容打开「百度网盘APP 即可获取」\n5.Python百度文库\n链接：https://pan.baidu.com/s/1b-IpYM9H8LYQs55T23LDhg?pwd=649w 提取码：649w 复制这段内容打开「百度网盘APP 即可获取」\n6.鲜花\n链接：https://pan.baidu.com/s/1KPextm2UPF4rEQLzh6dtfA?pwd=7tcL 提取码：7tcL 复制这段内容打开「百度网盘APP 即可获取」\n7.爱心代码\n链接：https://pan.baidu.com/s/1HhpFZVWV7im1HBQxJ6SB1w?pwd=7ow1 提取码：7ow1 8.VIP视频\n链接：https://pan.baidu.com/s/16t82q9llmOwtzYqa6OFN1A?pwd=1Ta4 提取码：1Ta4 9.短信源码\n复制整段内容，打开最新版「夸克APP」即可获取。\n链接：https://pan.quark.cn/s/b3282faf09c3\n10.爬取b站视频\nhttps://pan.baidu.com/s/1uLvILTSIkDYYIOkcQLSlpw?pwd=2hpd 提取码：2hpd 复制这段内容打开「百度网盘APP 即可获取」\n11.微博爬虫\n链接：https://pan.baidu.com/s/1F3Stg49dy-LX1i-rUYlGYw?pwd=y138 提取码：y138 复制这段内容打开「百度网盘APP 即可获取」\n12.视频素材下载\n链接：https://pan.baidu.com/s/1W_jjbTMWsEpLFDT35GrCMQ?pwd=MyC9 提取码：MyC9 复制这段内容打开「百度网盘APP 即可获取」\n13.MySQL安装包\n链接：https://pan.baidu.com/s/1BobuIRyqkWW_cDImFcbf5w?pwd=g356 提取码：g356 复制这段内容打开「百度网盘APP 即可获取」\n14.anaconda安装包\n链接：https://pan.baidu.com/s/1TLOnDZmVV5crxi4Fqy8W4A?pwd=a61m 提取码：a61m 复制这段内容打开「百度网盘APP 即可获取」\n15.Vmware安装包\n链接：https://pan.baidu.com/s/1ag2EaRz68fjXTFlXh2EC5A?pwd=fnc9 提取码：fnc9 复制这段内容打开「百度网盘APP 即可获取」\n16.vscode安装包\n链接：https://pan.baidu.com/s/1eJvCGArOmzsV0zjGjekG4w?pwd=Btp2 提取码：Btp2 复制这段内容打开「百度网盘APP 即可获取」\n17.MATLAB安装包\n链接：https://pan.baidu.com/s/1vj_gYYIBTJgcnunwGiPb8A?pwd=53MF 提取码：53MF 复制这段内容打开「百度网盘APP 即可获取」\n18.navicat安装包\n链接：https://pan.baidu.com/s/1uUtKM-s5GgDGAeLq3eJoAg?pwd=qzxq 提取码：qzxq 复制这段内容打开「百度网盘APP 即可获取」\n19.unity安装包\n链接：https://pan.baidu.com/s/1tSQM1YGoK5MY4A_IdwFqQQ?pwd=6B7u 提取码：6B7u 复制这段内容打开「百度网盘APP 即可获取」\n20.clion安装包\n链接：https://pan.baidu.com/s/1DpETVEqRFonrW4sgWABjJQ?pwd=4Ds1 提取码：4Ds1 复制这段内容打开「百度网盘APP 即可获取」\n21.eclipse安装包\n链接：https://pan.baidu.com/s/1JHsEYIHkzd44KaUO_iRJNg?pwd=H4g6 提取码：H4g6 复制这段内容打开「百度网盘APP 即可获取」 作者：山寨静香 https://www.bilibili.com/read/cv27611437/ 出处：bilibili\n","date":"2023-12-22T15:49:02Z","permalink":"https://blog.lufei.de/p/%E5%85%A8%E7%BD%91%E6%9C%80%E6%96%B0%E7%9A%84python%E7%88%AC%E8%99%AB%E6%95%99%E7%A8%8B-%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B%E8%B6%85%E9%80%82%E5%90%88%E5%B0%8F%E7%99%BD%E7%BB%83%E6%89%8B%E7%9A%84%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/","title":"全网最新的Python爬虫教程+实战项目案例，超适合小白练手的实战项目！"},{"content":"微力同步是一款可让您在多个设备上同步文件的应用程序，在您自己的机器组成的私有云上，在其中一台机器上创建，修改或删除文件会自动复制同步到其他设备。微力同步不会将您的数据上传到公有云端，而是在您自己的机器组成的私有云上互相同步交换数据。\n微力同步可在台式机，笔记本电脑，智能手机，平板电脑和网络连接的外围设备之间提供安全的点对点数据同步交换。 没有中心节点存储数据文件，所有数据的传输通过AES加密传送，确保数据的安全性，所有数据都存在自己管理的机器硬盘上，安全性有了更高的保障。\nLinux 自动化安装脚本 该自动安装器目前适配Centos/Debian/Ubuntu 3大主流系统，其它的使用systemd的系统应该也可以使用，暂未测试\n快速安装\n#(如果需要指定索引存放位置请在最后面添加-d 路径 如 -d /data/verysync) curl http://www.verysync.com/shell/verysync-linux-installer/go-installer.sh \u0026gt; go-installer.sh chmod +x go-installer.sh ./go-installer.sh 安装完成后就可以用浏览器打开 http://你的IP地址:8886 管理微力内容了\n安装器参数说明\n./go-installer.sh [-h] [-c] [--remove] [-p proxy] [-f] [--version vx.y.z] [-l file] [-d index location] -h, --help 显示帮助 -p, --proxy 指定代理服务器 -p socks5://127.0.0.1:1080 or -p http://127.0.0.1:3128 etc -f, --force 强制安装 --version 安装特定版本 例如 --version v0.15.11-rc2 -l, --local 从本地下载好的文件安装 需要使用绝对路径如 -l /root/verysync-linux-amd64-v0.15.12-rc1.tar.gz --remove 卸载微力同步 -c, --check 检查更新 -d --home 指定微力索引存放位置, 默认 ~/.config/verysync -u --user 指定运行微力服务的用户 默认 root ","date":"2023-12-21T14:56:32Z","permalink":"https://blog.lufei.de/p/%E5%BE%AE%E5%8A%9B%E5%90%8C%E6%AD%A5/","title":"微力同步"},{"content":"什么是阿里云盾 阿里云盾（AliYunDun），又名安骑士，是购买阿里云云产品后自带的监控云服务器/轻量应用服务器安全的产品，能够自动化实时入侵威胁检测、病毒查杀、漏洞智能修复、基线一键核查等功能，但是同时也会监控你的服务器是否有违规进程，然后就会收到阿里云警告邮件。\n阿里云盾主要包括3个进程：AliYunDun、aliyun-service和AliYunDunUpdate。\n如何完全卸载阿里云盾 卸载阿里云盾 远程连接到阿里云云服务器或者轻量应用服务器后，执行以下代码卸载阿里云盾：\nwget http://update.aegis.aliyun.com/download/uninstall.sh chmod +x uninstall.sh ./uninstall.sh wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh chmod +x quartz_uninstall.sh ./quartz_uninstall.sh 删除阿里云盾文件残留 卸载阿里云盾后，执行如下代码删除阿里云盾文件残留：\npkill aliyun-service rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service rm -rf /usr/local/aegis* 屏蔽阿里云盾IP 最后就是屏蔽阿里云盾的IP：\niptables -I INPUT -s 140.205.201.0/28 -j DROP iptables -I INPUT -s 140.205.201.16/29 -j DROP iptables -I INPUT -s 140.205.201.32/28 -j DROP iptables -I INPUT -s 140.205.225.192/29 -j DROP iptables -I INPUT -s 140.205.225.200/30 -j DROP iptables -I INPUT -s 140.205.225.184/29 -j DROP iptables -I INPUT -s 140.205.225.183/32 -j DROP iptables -I INPUT -s 140.205.225.206/32 -j DROP iptables -I INPUT -s 140.205.225.205/32 -j DROP iptables -I INPUT -s 140.205.225.195/32 -j DROP iptables -I INPUT -s 140.205.225.204/32 -j DROP 检查阿里云盾是否卸载干净 最后检查下自己服务器上的阿里云盾是否卸载干净了，主要就是看进程里有没有阿里云盾的相关进程了（AliYunDun、aliyun-service和AliYunDunUpdate），可以通过ps -aux | grep -E 'aliyun|AliYunDun'来检查，如果没有相关进程则说明阿里云盾已经卸载干净了。\n","date":"2023-12-21T12:44:39Z","permalink":"https://blog.lufei.de/p/%E9%98%BF%E9%87%8C%E4%BA%91%E5%A6%82%E4%BD%95%E5%AE%8C%E5%85%A8%E5%8D%B8%E8%BD%BD%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%BE%E5%AE%89%E9%AA%91%E5%A3%AB%E5%B9%B6%E5%B1%8F%E8%94%BD%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%BEip/","title":"阿里云如何完全卸载阿里云盾（安骑士）并屏蔽阿里云盾IP"},{"content":"静态资源 CDN\n全球都有节点\n字节 cdn：https://cdn.bytedance.com 支持搜索。\n七牛 cdn：https://www.staticfile.org 支持搜索。\n知乎 unpkg 镜像：https://unpkg.zhimg.com 不全，不支持搜索。\n360cdn：https://cdn.baomitu.com\n仅中国大陆有节点\nbootcdn：https://www.bootcdn.cn\n75cdn：https://cdn.baomitu.com\n中国大陆使用国外节点\njsDelivr：\nhttp://fastly.jsdelivr.net\nhttp://cdn.jsdelivr.net\nhttp://gcore.jsdelivr.net\nCDNJS：http://www.cdnjs.com\nunpkg：https://www.unpkg.com\nLogo 生成网站\nhttps://www.designevo.com 可以免费下载低画质的 logo，支持自定义。\nhttp://yeelogo.com 纯免费\n去除图片背景网站 https://www.remove.bg 免费下载，抠图效果很好。\n","date":"2023-12-19T14:07:09Z","permalink":"https://blog.lufei.de/p/%E5%AE%9E%E7%94%A8%E7%BD%91%E7%AB%99%E5%90%88%E9%9B%86/","title":"实用网站合集"},{"content":" 在WordPress各种优化插件、各种手段层出不穷的时代，各方大佬均在推荐各类插件，比如super cache、cache master和litespeed cache等。不过对于老白博客个人而言，就想图个清净，不喜欢插件太多，设置一大堆，复杂！所以呢，今天就掏出一个“无代码版”优化WordPress（强化拓展），再结合最新版本的WordPress6.3，轻松实现首页0sql，网站毫秒级加载。\n1.batcache效果演示 演示网站：https://test.xcbtmw.com/\n网站底部就能看到（未使用前首页查询次数为63）：\n附带一个显示查询次数和时间的代码\n\u0026lt;?php echo get_num_queries().\u0026#39;次查询，耗时\u0026#39;.timer_stop(0).\u0026#39;秒。\u0026#39;; ?\u0026gt; 2.什么是WordPress强化拓展 在本文的教程中，老白使用的是“强化拓展”，而非WordPress插件，他们二者区别如下：\n强化拓展（Enhancements）：强化拓展是一种广义的术语，用于描述对系统或应用程序功能进行增强、扩展或改进的方法。它可以包括各种形式的修改、添加、优化或增强，以提供更多功能、性能或用户体验的改善。在WordPress中，强化拓展可以指代各种方法，如代码片段、自定义功能、主题模板修改等，用于对WordPress进行定制和增强。 插件（Plugins）：插件是一种特定的软件组件，用于在现有系统或应用程序中添加额外的功能或特性。在WordPress中，插件通常是以独立的文件形式存在的，可以通过后台管理界面直接安装和启用。插件提供了一种简单的方式来扩展WordPress的功能，而无需直接修改核心代码。它们可以实现各种功能，如社交媒体分享、SEO优化、表单创建、安全增强等。 强化拓展是一个更宽泛的概念，可以包括各种形式的增强和定制，而插件则是一种特定的软件组件，通过添加额外的功能来扩展现有系统。插件是实现强化拓展的一种常见方式。\n3.batcache+mem强化拓展 此处借用果酱大佬的原话介绍batcache和memcached的关系\nWordPress 启用 Memcached 这样的内存缓存之后，每次访问 WordPress 页面，都要从内存中获取多个缓存对象。\n而 Batcache 主要就是解决这个问题，它是基于 Memcached 的 WordPress 缓存插件，它的工作原理是：把当前整个页面作为一个对象缓存到内存中，这样再次访问 WordPress 页面的时候，直接获从内存中获取这个对象即可，速度极快。\n从果酱大佬的描述中我们可以发现：batcache+memcached是一种非常不错的WordPress优化手段，接下来老白跟大家分享下如何无插件开启\n3.1 PHP安装memcached拓展 以宝塔面板为例，打开软件商店，PHP安装拓展，勾选即可（老白推荐安装opcache+memcached）\n3.2 batcache+mem强化拓展下载 下载文件（batcache和memcached均来自于官方插件，大家也可以自行下载）\nbatcache+mem下载：https://qtrj.lanzoul.com/i6nSD18cy6eb\n然后放到WordPress的/wp-content目录下，比如老白博客的：\n/www.xcbtmw.com/wp-content 3.3 激活使用batcache+mem 把上述文件放到对应目录后，还需要在WordPress根目录的wp-config.php进行下面的设置，不然会报错\n//设置缓存头，这里testxcbtmw可以随意设置-https://www.xcbtmw.com/29717.html define(\u0026#39;WP_CACHE_KEY_SALT\u0026#39;, \u0026#39;testxcbtmw\u0026#39;); //激活memcached define(\u0026#39;ENABLE_CACHE\u0026#39;, true); //激活batcache define(\u0026#39;WP_CACHE\u0026#39;, true); 3.4 batcache缓存设置 编辑batcache的advanced-cache.php文件进行设置\nvar $max_age = 300; // 缓存过期时间(0表示禁用batcache) var $remote = 0; // 禁止向远程数据中心发送缓冲区(从不发送req/sec) var $times = 2; // 一个页面被访问了多少次之后进行缓存(两个或两个以上) var $seconds = 0; // …在这么多秒内(0表示忽略它，立即使用batcache) var $group = \u0026#39;batcache\u0026#39;; // memcached组的名称。您可以通过更改此选项来模拟缓存刷新。 var $unique = array(); // 如果您有条件地提供不同的内容，请将变量值放在这里。 var $vary = array(); // 函数数组，用于create_function。返回值被添加到上面的$unique中。 var $headers = array(); // 在这里添加头作为name=\u0026gt;值或name=\u0026gt;数组(值)。这些将与缓存中的每个响应一起发送。 var $cache_redirects = false; // 设置true启用重定向缓存。 var $redirect_status = false; // 这将在重定向期间设置为响应代码。 var $redirect_location = false; // 这被设置为重定向位置。 var $use_stale = true; // 更新缓存时是否可以返回过期的缓存响应? var $uncached_headers = array(\u0026#39;transfer-encoding\u0026#39;); // 这些头将永远不会缓存。应用函数。 var $debug = true; // 设置false以隐藏batcache信息 \u0026lt;!-- comment --\u0026gt; var $cache_control = true; // 将false设置为禁用Last-Modified和Cache-Control头 var $cancel = false; // 更改此选项以取消输出缓冲区。使用batcache_cancel (); var $noskip_cookies = array( \u0026#39;wordpress_test_cookie\u0026#39; ); // cookie的名称——如果它们存在并且缓存通常会被绕过，那么不要绕过它。 这里大家不作修改也行，老白已经设置好了，保持默认也可\n3.5 batcache缓存清除 关于缓存文件的生成，batcache不生成物理文件来存储缓存的页面。相反，它使用内存缓存（例如Memcached或APCu）来存储页面的副本。这种方式比将页面保存为静态HTML文件更为高效，因为读取内存缓存比读取磁盘上的文件要快得多。\n内存缓存只是临时存储数据的一种方式，并不持久化保存数据。\n因此，在重启服务器或清除缓存时，存储在内存缓存中的页面副本将会被清空，并重新生成，强硬的刷新缓存方案就是重启下memcached\n","date":"2023-12-17T14:47:53Z","permalink":"https://blog.lufei.de/p/113/","title":"纯代码免插件优化WordPress6.3实现0sql-强化拓展"},{"content":" wordpress使用了大量插件，发表了很多文章图片以后速度直线下降，就像蜗牛爬一样慢！\n各位wordpress站长普遍采用的是wordpress缓存插件，如WP Super Cache或者Hyper Cache之类的，这些插件对wordpress有着非常明显的加速优化效果，该插件的Mod_rewrite加速模式加速效果非常好，因为这种模式是直接将网站的页面生成静态的html页面，然后使用Mod_rewrite将请求转发到静态文件，这样就跳过了php解析这一步直接将页面吐出到浏览器，从而达到加速的效果。但是这是使用插件实现缓存效果，那么可否无插件实现wordpress页面静态化呢？\n答案是能，下面将告诉大家操作方法，首先复制以下代码：\n\u0026lt;?php define(\u0026#39;CACHE_ROOT\u0026#39;, dirname(__FILE__).\u0026#39;/cache\u0026#39;); define(\u0026#39;CACHE_LIFE\u0026#39;, 86400); //缓存文件的生命期，单位秒，86400秒是一天 define(\u0026#39;CACHE_SUFFIX\u0026#39;,\u0026#39;.html\u0026#39;); //缓存文件的扩展名，千万别用 .php .asp .jsp .pl 等等 $file_name = md5($_SERVER[\u0026#39;REQUEST_URI\u0026#39;]).CACHE_SUFFIX; //缓存文件名 //缓存目录，根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要，可以用第三四位为名，再加一层目录。 //256个目录每个目录1000个文件的话，就是25万个页面。两层目录的话就是65536*1000=六千五百万。 //不要让单个目录多于1000，以免影响性能。 $cache_dir = CACHE_ROOT.\u0026#39;/\u0026#39;.substr($file_name,0,2); $cache_file = $cache_dir.\u0026#39;/\u0026#39;.$file_name; //缓存文件存放路径 if($_SERVER[\u0026#39;REQUEST_METHOD\u0026#39;]==\u0026#39;GET\u0026#39;){ //GET方式请求才缓存，POST之后一般都希望看到最新的结果 if(file_exists($cache_file) \u0026amp;\u0026amp; time() - filemtime($cache_file) \u0026lt; CACHE_LIFE){ //如果缓存文件存在，并且没有过期，就把它读出来。 $fp = fopen($cache_file,\u0026#39;rb\u0026#39;); fpassthru($fp); fclose($fp); exit(); } elseif(!file_exists($cache_dir)){ if(!file_exists(CACHE_ROOT)){ mkdir(CACHE_ROOT,0777); chmod(CACHE_ROOT,0777); } mkdir($cache_dir,0777); chmod($cache_dir,0777); } function auto_cache($contents){ //回调函数，当程序结束时自动调用此函数 global $cache_file; $fp = fopen($cache_file,\u0026#39;wb\u0026#39;); fwrite($fp,$contents); fclose($fp); chmod($cache_file,0777); clean_old_cache(); //生成新缓存的同时，自动删除所有的老缓存。以节约空间。 return $contents; } function clean_old_cache(){ chdir(CACHE_ROOT); foreach (glob(\u0026#34;*/*\u0026#34;.CACHE_SUFFIX) as $file){ if(time()-filemtime($file)\u0026gt;CACHE_LIFE){ unlink($file); } } } ob_start(\u0026#39;auto_cache\u0026#39;); //回调函数 auto_cache } else{ if(file_exists($cache_file)){ //file_exists() 函数检查文件或目录是否存在。 unlink($cache_file); //不是GET的请求就删除缓存文件。 } } ?\u0026gt; 将以上代码保存为cache.php文件然后放置到网站根目录，然后在根目录下新建一个名为cache的目录，权限更改为777（修改权限可写，写入缓存文件用的）\n然后在index.php的 \u0026lt;?php之后加上以下代码：\nrequire('cache.php');\n一定要保证缓存目录的可写。\n一定要加到文件的最上方，不然等页面完全加载完了才吐出缓存页面那就等于没缓存一样。\n","date":"2023-12-17T07:14:08Z","permalink":"https://blog.lufei.de/p/wordpress%E6%97%A0%E9%9C%80%E6%8F%92%E4%BB%B6%E5%AE%9E%E7%8E%B0%E9%A1%B5%E9%9D%A2%E7%BC%93%E5%AD%98%E9%9D%99%E6%80%81%E5%8C%96%E6%8F%90%E6%95%88%E6%98%BE%E8%91%97/","title":"wordpress无需插件实现页面缓存静态化，提效显著"},{"content":" 步骤 操作 1. 创建一个网站，绑定 ritheme.com 域名，并开启 SSL（随便找个域名的证书就行），上传以下源码： https://wwsj.lanzout.com/b028fzepa 密码: bx7r 2. 刚才源码中的 keygen.php 上传到任意地方，访问后，生成授权码和 token。 3. 在 wp 服务器修改 hosts 指向该授权服务器 IP。如果是在同一个服务器搭建的，修改 /etc/hosts，加上这一行： 127.0.0.1 ritheme.com 4. 使用生成的授权码激活。 注 资源来自于网上，与本站无关，本站只做收集。 ","date":"2023-12-14T20:56:20Z","permalink":"https://blog.lufei.de/p/%E6%97%A5%E4%B8%BB%E9%A2%98%E7%BB%95%E8%BF%87%E6%8E%88%E6%9D%83%E7%A0%B4%E8%A7%A3/","title":"日主题绕过授权破解"},{"content":"相关链接 项目地址：https://github.com/pandora-next/deploy\n项目文档：https://fakeopen.org/PandoraNext\n官方获取Access Token和Session Token：https://chat.openai.com/api/auth/session\n获取Access Token和Session Token：https://ai.fakeopen.com/auth\n生成Share Token：https://ai.fakeopen.com/token\n生成Pool Token：https://ai.fakeopen.com/pool\n第三方WebUI：https://github.com/Yidadaa/ChatGPT-Next-Web\n使用Web模式 免费账号共享池：https://baipiao.io/chatgpt\n官方演示地址一：https://chat.oaifree.com\n官方演示地址二：https://chat1.zhile.io\n别人搭建的网址：https://fofa.info/result?qbase64=Ym9keT0iQ29udGludWUgd2l0aCBBY2Nlc3MgVG9rZW4iICYmIHRpdGxlPSJQYW5kb3JhTmV4dCIgJiYgY291bnRyeT0iQ04i\n","date":"2023-12-11T15:02:46Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E7%BF%BB%E5%A2%99%E6%B3%A8%E5%86%8Cchatgpt%E8%B4%A6%E5%8F%B7%E5%9B%BD%E5%86%85%E7%9B%B4%E8%BF%9Echatgpt%E4%B8%80%E7%AB%99%E5%BC%8F%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/","title":"免翻墙注册chatgpt账号,国内直连chatgpt一站式解决方案"},{"content":"\n准备工作：一张国内四大行的I类卡（一个银行一个人只能办一张）或者申请一张外币信用卡（建议招行），==本次以招行为例作为演示==\n中国大陆手续费：【点击进入】 香港地区手续费：【点击进入】\n1、注册香港paypal账户，参考视频：【点击进入】\n记录下PayPal商家号\n后续国外的款项用此账户作为收款账号\n2、注册并设置万里汇账户：【点击进入】（==注：如果要删除店铺收款账号，提供需要关闭的货币账户币种以及收款账号（或尾号）到此邮箱，进行人工删除：mscn@service.worldfirst.com====）==\n设置收款人管理——搜索招行——点击客服——点击个人业务——输入：境外汇入路径——把对应的BIC、收款行、前面准备好的卡号填写进来\n设置店铺/收款管理——新增店铺收款账户——选择其他电商平台——选择Google Shopping——自定义一个店铺名称——点击申请——申请完成后，不要直接添加信息——再次点击店铺/收款管理——点击补充信息——填写完成后保存\n再次点击店铺/收款管理——找到刚添加的账号，点击进去——点击查看账户详情——回到paypal——点击关联卡或银行账户——点击关联银行账户——点击关联美国或中国香港特别行政区的银行账户——选择香港——点击下一页——然后把账户详情里面的相关信息添加进来——完成后，点击关联您的银行账户\n3、前面的流程操作完成后，具体收款流程如下：\n用paypal账户进行收款——paypal收到款项后——然后把款项提现到万里汇支票账户——万里汇的支票账户收到后（一般要几个工作日）——在万里汇首页点击提款——选择前面添加的美元账户——银行收到钱后——在手机APP掌上生活上搜索：溢缴款领回——选择美元——输入领回金额——选择收款账户/借记卡\n这里有三个情况需要注意的：1、如果是自己在APP上操作是不需要手续费的，如果需要人工帮忙划转，是需要收取一定的手续费的；2、如果是外币信用卡需要人工划转；3、目前了解到I类卡是支持全币种的，收款是没问题的（招行）\n","date":"2023-12-11T14:32:02Z","permalink":"https://blog.lufei.de/p/paypal-%E6%B3%A8%E5%86%8C%E4%B8%8E%E6%8F%90%E7%8E%B0%E4%BB%A5%E5%8F%8A%E4%B8%87%E9%87%8C%E6%B1%87%E8%99%9A%E6%8B%9F%E5%A4%96%E5%B8%81%E5%8D%A1/","title":"PayPal 注册与提现以及万里汇虚拟外币卡"},{"content":"建议访问官方 Github 项目来查阅文档,可以使用更多本文没有提到的参数来提高穿透服务器的安全性和效率.\n地址：https://freefrp.net/\n","date":"2023-12-10T07:18:31Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9-frp-%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E6%9C%8D%E5%8A%A1/","title":"免费 FRP 内网穿透服务"},{"content":"小雅网盘（基于alist） 网址：https://alist.xiaoya.pro/\nalist文档：https://alist.nn.ci/zh//\n小雅文档： https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f\n终端安装命令，端口 5678\nbash -c \u0026#34;$(curl http://docker.xiaoya.pro/update_new.sh)\u0026#34; 或者 端口 6789\nbash -c \u0026#34;$(curl http://docker.xiaoya.pro/update_new.sh)\u0026#34; -s host 阿里token获取地址：https://aliyuntoken.vercel.app/\n阿里opentoken地址：https://alist.nn.ci/tool/aliyundrive/request.html\n转存文件夹ID：网页版阿里云，进转存文件夹，地址栏内最后64开头的数字\n创建一个名为 xiaoyakeeper 的docker定时运行小雅转存清理并升级小雅镜像\n定时清理缓存 可以不加-tg\n模式3：创建一个名为 xiaoyakeeper 的docker定时运行小雅转存清理并升级小雅镜像\nbash -c \u0026#34;$(curl -s https://xiaoyahelper.zengge99.eu.org/aliyun_clear.sh | tail -n +2)\u0026#34; -s 3 -tg 模式5：与模式3的区别是实时清理，只要产生了播放缓存一分钟内立即清理。签到和定时升级同模式3\nbash -c \u0026#34;$(curl -s https://xiaoyahelper.zengge99.eu.org/aliyun_clear.sh | tail -n +2)\u0026#34; -s 5 -tg 套娃挂载： 输入命令，获取令牌\ndocker exec -i xiaoya sqlite3 data/data.db \u0026lt;\u0026lt;EOF select value from x_setting_items where key = \u0026#34;token\u0026#34;; EOF 挂载 ：alist v3 输入令牌 输入链接 注意docker名称\n同步小雅网盘 如果你是基于Linux系统的（包括openwrt），可以用以下方法设置定时更新，终端执行\ncrontab -e 添加一条记录\n0 6 * * * docker restart xiaoya 按 o 插入一行 然后把这堆文字输入进去 然后按键盘左上角 ESC键退出编辑模式 输入 :wq 保存退出 就是每天凌晨6点自动重启xiaoya docker去同步数据，你把6改成13，那就是下午1点\n小雅CF反代 登录cloudflare，创建Worker 代码如下,修改const upstream_url = \u0026quot;alist地址\u0026quot;; 免费地址寻找：网络空间雷达 复制ip\n我的: xiaoya.taoshuge.eu.org\nimport { connect } from \u0026#39;cloudflare:sockets\u0026#39;; const upstream_url = \u0026#34;http://183.134.157.38:5678\u0026#34;; const proxyList = [\u0026#34;mypikpak\u0026#34;, \u0026#34;sharepoint\u0026#34;]; const replace_dict = { \u0026#39;$up_url\u0026#39;: \u0026#39;$cust_url\u0026#39;, \u0026#39;$upstream\u0026#39;: \u0026#39;$custom_domain\u0026#39; } let up_scheme = upstream_url.split(\u0026#34;://\u0026#34;)[0] let upstream = upstream_url.split(\u0026#34;://\u0026#34;)[1].split(\u0026#34;:\u0026#34;)[0]; let port_string = upstream_url.split(\u0026#34;://\u0026#34;)[1].split(\u0026#34;:\u0026#34;)[1]; if (!port_string) { port_string = up_scheme === \u0026#34;http\u0026#34; ? \u0026#34;80\u0026#34; : \u0026#34;443\u0026#34;; } let port = parseInt(port_string); const timeoutDuration = 5000; const chunkSize = 1024 * 4; export default { async fetch(request, env, ctx) { let url = new URL(request.url); let cust_url = new URL(request.url); url.port = port.toString(); let original_url_hostname = url.hostname; url.hostname = upstream; url.protocol = up_scheme + \u0026#34;:\u0026#34;; if (url.pathname.startsWith(\u0026#34;/proxy/\u0026#34;)) { let proxyUrl = new URL(\u0026#34;https://\u0026#34; + url.pathname.replace(/\\/proxy\\//g, \u0026#34;\u0026#34;) + url.search); let proxyReq = new Request(proxyUrl, request); let proxyResponse = await fetchOverTcp(proxyReq, 443); return proxyResponse; } let new_request = new Request(url, request); let original_response = await fetchOverTcp(new_request); let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); if (original_response.status === 302) { const locationHeader = new_response_headers.get(\u0026#39;location\u0026#39;); if (locationHeader \u0026amp;\u0026amp; isReplace(locationHeader)) { const modifiedLocation = locationHeader.replace(/https:\\/\\/+/g, \u0026#34;https://\u0026#34; + original_url_hostname + \u0026#34;/proxy/\u0026#34;); new_response_headers.set(\u0026#39;location\u0026#39;, modifiedLocation); } } const content_type = new_response_headers.get(\u0026#39;content-type\u0026#39;); if (url.pathname.includes(\u0026#34;tvbox\u0026#34;) || (content_type != null \u0026amp;\u0026amp; (content_type.includes(\u0026#39;text/html\u0026#39;) || content_type.includes(\u0026#39;json\u0026#39;)) \u0026amp;\u0026amp; (content_type.includes(\u0026#39;UTF-8\u0026#39;) || content_type.includes(\u0026#39;utf-8\u0026#39;)))) { let dic_def = {}; dic_def[\u0026#34;$upstream\u0026#34;] = upstream; dic_def[\u0026#34;$custom_domain\u0026#34;] = original_url_hostname; dic_def[\u0026#34;$cust_url\u0026#34;] = `${cust_url.protocol}//${cust_url.hostname}`; dic_def[\u0026#34;$up_url\u0026#34;] = `${upstream_url}`; let original_text = replace_response_text(await original_response.text(), dic_def); let status = original_response.status; return new Response(original_text, { status, headers: new_response_headers }); } else { return original_response; } }, }; async function fetchOverTcp(request, cust_port = null) { let url = new URL(request.url); let req = new Request(url, request); let out_port = cust_port ? cust_port : port if ((url.protocol === \u0026#34;https:\u0026#34; \u0026amp;\u0026amp; out_port === 443) || (url.protocol === \u0026#34;http:\u0026#34; \u0026amp;\u0026amp; out_port === 80)) { return await fetch(req); } let tcpSocket = connect({ hostname: url.hostname, port: out_port, }, { secureTransport: \u0026#34;starttls\u0026#34; }); if (url.protocol === \u0026#34;https:\u0026#34;) { tcpSocket = tcpSocket.startTls(); } try { const writer = tcpSocket.writable.getWriter(); let headersString = \u0026#39;\u0026#39;; let bodyString = \u0026#39;\u0026#39;; for (let [name, value] of req.headers) { if (name === \u0026#34;host\u0026#34; || name === \u0026#34;x-forwarded-proto\u0026#34; || name === \u0026#34;x-real-ip\u0026#34; || name === \u0026#34;accept-encoding\u0026#34;) { continue; } if (name === \u0026#34;connection\u0026#34;) { value = \u0026#34;close\u0026#34;; } headersString += `${name}: ${value}\\r\\n`; } let fullpath = url.pathname; if (url.search) { fullpath += url.search.replace(/%3F/g, \u0026#34;?\u0026#34;); } if (req.method === \u0026#34;POST\u0026#34;) { const body = await req.text(); bodyString = `${body}`; } await writer.write(new TextEncoder().encode(`${req.method} ${fullpath} HTTP/1.0\\r\\nHost: ${url.hostname}:${port}\\r\\n${headersString}\\r\\n${bodyString}`)); writer.releaseLock(); const response = await constructHttpResponse(tcpSocket, timeoutDuration); return response; } catch (error) { tcpSocket.close(); return new Response(\u0026#39;Internal Server Error\u0026#39;, { status: 500 }); } } async function constructHttpResponse(tcpSocket, timeout) { const reader = tcpSocket.readable.getReader(); let remainingData = new Uint8Array(0); try { while (true) { const { value, done } = await raceWithTimeout(reader.read(chunkSize), timeout); const newData = new Uint8Array(remainingData.length + value.length); newData.set(remainingData); newData.set(value, remainingData.length); remainingData = newData; const index = indexOfDoubleCRLF(remainingData); if (index !== -1) { const headerBytes = remainingData.subarray(0, index); const bodyBytes = remainingData.subarray(index + 4); const header = new TextDecoder().decode(headerBytes); const [statusLine, ...headers] = header.split(\u0026#39;\\r\\n\u0026#39;); const [httpVersion, statusCode, statusText] = statusLine.split(\u0026#39; \u0026#39;); const responseHeaders = {}; headers.forEach((header) =\u0026gt; { const [name, value] = header.split(\u0026#39;: \u0026#39;); responseHeaders[name.toLowerCase()] = value; }); responseHeaders[\u0026#39;content-encoding\u0026#39;] = \u0026#39;identity\u0026#39;; const responseInit = { status: parseInt(statusCode), statusText, headers: new Headers(responseHeaders), }; const bodyStream = new ReadableStream({ async start(controller) { controller.enqueue(bodyBytes); }, async pull(controller) { while (true) { try { const { value, done } = await raceWithTimeout(reader.read(chunkSize), timeout); if (value) { controller.enqueue(value); } if (done) { controller.close(); tcpSocket.close(); break; } } catch (e) { controller.close(); tcpSocket.close(); return; } } }, }); return new Response(bodyStream, responseInit); } if (done) { tcpSocket.close(); break; } } return new Response(); } catch (error) { tcpSocket.close(); } } function raceWithTimeout(promise, timeout) { return Promise.race([ promise, new Promise((_, reject) =\u0026gt; setTimeout(() =\u0026gt; reject(new Error(\u0026#39;Timeout-1\u0026#39;)), timeout)) ]); } function indexOfDoubleCRLF(data) { if (data.length \u0026lt; 4) { return -1; } for (let i = 0; i \u0026lt; data.length - 3; i++) { if (data[i] === 13 \u0026amp;\u0026amp; data[i + 1] === 10 \u0026amp;\u0026amp; data[i + 2] === 13 \u0026amp;\u0026amp; data[i + 3] === 10) { return i; } } return -1; } function replace_response_text(text, dic_def) { var i, j; let new_replace_dict = {}; for (i in replace_dict) { j = replace_dict[i] i = dic_def[i] ? dic_def[i] : i; j = dic_def[j] ? dic_def[j] : j; new_replace_dict[i] = j; } for (i in new_replace_dict) { j = new_replace_dict[i] let re = new RegExp(i, \u0026#39;g\u0026#39;) text = text.replace(re, j); } let host_name = dic_def[\u0026#34;$custom_domain\u0026#34;]; if (isReplace(text) \u0026amp;\u0026amp; host_name) { text = text.replace(/https:\\/\\/+/g, \u0026#34;https://\u0026#34; + host_name + \u0026#34;/proxy/\u0026#34;); } return text; } function isReplace(urlString) { for (let i = 0; i \u0026lt; proxyList.length; i++) { if (urlString.includes(proxyList[i])) { return true; } } return false; } 其他内容扩充 执行时机和清理缓存的操作是完全相同的。\n可以通过手动创建/etc/xiaoya/mycheckintoken.txt文件来定义多个网盘签到的32位refresh token，每行一个。若不添加文件，则使用默认小雅转存的网盘签到。\n自动刷新/etc/xiaoya/mycheckintoken.txt和/etc/xiaoya/mytoken.txt文件，这有可能延长refresh token的时效，具体效果需要观察。\n定时运行模式包括：\n默认每天从运行脚本的下一分钟开始执行。 运行时间可以通过手动创建/etc/xiaoya/myruntime.txt文件进行修改，例如06:00和18:00表示每天早晚6点各运行一次。 自动升级的说明：\n定时升级的命令保存在/etc/xiaoya/mycmd.txt中。删除该文件将变成定时重启小雅。 完成清理和签到后，脚本会自动执行/etc/xiaoya/mycmd.txt中的命令。该文件默认包含升级小雅镜像的命令，不建议修改。 关于TG推送：\n所有模式加上-tg功能均可绑定消息推送的TG账号，只有第一次运行需要加上-tg参数。 ","date":"2023-12-09T23:40:57Z","permalink":"https://blog.lufei.de/p/%E5%B0%8F%E9%9B%85%E7%BD%91%E7%9B%98/","title":"小雅网盘"},{"content":"\n相关介绍 目前最实用的宝塔7.7.0系列，本地安装纯净版本，并去除了强制绑定帐号、自动创建垃圾文件、活动推荐、在线客服，去除面板日志与网站绑定域名、手动解锁所有付费插件等等。\n一、宝塔面板7.7原版 curl -sSO https://raw.githubusercontent.com/zhucaidan/btpanel-v7.7.0/main/install/install_panel.sh \u0026amp;\u0026amp; bash install_panel.sh 二、一键破解脚本 curl -sSO https://raw.githubusercontent.com/ztkink/bthappy/main/one_key_happy.sh \u0026amp;\u0026amp; bash one_key_happy.sh 三、彩虹优化补丁 （不建议安装） （不建议安装，可能在使用一键迁移的时候出错）\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/optimize.sh \u0026amp;\u0026amp; chmod +x optimize.sh \u0026amp;\u0026amp; ./optimize.sh 1.去除宝塔面板强制绑定账号；\n2.去除各种删除操作时的计算题与延时等待；\n3.去除创建网站自动创建的垃圾文件（index.html、404.html、.htaccess）\n4.关闭未绑定域名提示页面，防止有人访问未绑定域名直接看出来是用的宝塔面板；\n5.关闭活动推荐与在线客服；\n6.去除自动校验文件与上报信息定时任务；\n7.去除面板日志与网站绑定域名上报。\n四、去后门 sudo echo \u0026#34;\u0026#34; \u0026gt; /www/server/panel/script/site_task.py sudo chattr +i /www/server/panel/script/site_task.py sudo rm -rf /www/server/panel/logs/request/* sudo chattr +i -R /www/server/panel/logs/request 宝塔面板linux版修改底部版权 第一步：登录宝塔面板\n第二步：点击左边的文件菜单\n第三步：在www目录下查找layout.html文件\n第四步：编辑layout.html文件的第85行，用自定义的名字替换‘{{session[‘brand’]}}{{session[‘product’]}}’这个字符串。\n第五步：修改后，重启面板。\n手动破解 先登录面板，然后破解，去除登陆需要绑定账号：\nrm -f /www/server/panel/data/bind.pl 手动解锁宝塔所有付费插件为永不过期\nsed -i \u0026#39;s/\u0026#34;endtime\u0026#34;: -1/\u0026#34;endtime\u0026#34;: 999999999999/g\u0026#39; /www/server/panel/data/plugin.json 给plugin.json文件上锁防止自动修复为免费版\nchattr +i /www/server/panel/data/plugin.json 净化面板 下载文件\nwget -O /tmp/bt.zip https://github.com/woniu336/btpanel-v7.7.0/raw/main/bt/bt.zip 解压文件并合并到目标目录\nunzip -uo /tmp/bt.zip -d /www/server/panel/BTPanel/templates/default 删除下载的压缩文件\nrm /tmp/bt.zip 重启宝塔面板\nbt restart echo \u0026ldquo;操作完成\u0026rdquo;\n","date":"2023-12-09T19:06:24Z","permalink":"https://blog.lufei.de/p/bt/","title":"宝塔面板v7.7.0 Github纯净版 优化脚本 手动解锁插件"},{"content":"Github图床使用 网络上关于GitHub+Jsdelivr实现图床加速的文章很多，但是年代久远，加上Jsdelivr早就被和谐了，所以本人重新整理一下，目前还能使用，无需科学上网的就能加速图片的方法。\n方法1：Jsdelivr镜像站 https://jsd.cdn.zzko.cn （公益）\n方法2：通过Cloudflare Workers实现反代\n即使镜像站点跑路了，Cloudflare还在，速度慢点\n以上方法都要配合PicGo或者PicList使用，本人使用的是PicList\n配合图床工具: PicList\nPicList 是一款基于PicGo 深度二次开发,云储存/图床管理和文件上传客户端工具\n完美兼容PicGo\n官网: https://piclist.cn\n1.通过Cloudflare Workers实现反代 addEventListener( \u0026#34;fetch\u0026#34;,event =\u0026gt; { let url=new URL(event.request.url); url.hostname=\u0026#34;raw.githubusercontent.com\u0026#34;; //反代github域名 let request=new Request(url,event.request); event. respondWith( fetch(request) ) } ) 具体教程网上很多，需要你在Cloudflare有域名\n2.配合PicList 请替换为你自己的仓库名 以及分支，准备好token\n反代图\n下图为镜像站 仓库名: woniu336/blog-image 分支: main 存储路径: img/ 自定义域名1(镜像站) : https://jsd.cdn.zzko.cn/gh/woniu336/blog-image@main 自定义域名2(CF反代) : https://github.leshans.eu.org/woniu336/blog-image/main 自定义域名格式: https://cdn.jsdelivr.net/gh/用户名/仓库名@分支 图片测试:\n","date":"2023-12-07T13:07:15Z","permalink":"https://blog.lufei.de/p/github%E5%9B%BE%E5%BA%8A%E5%8A%A0%E9%80%9F/","title":"GitHub图床加速"},{"content":"背景 WordPress系统默认的后台地址是 域名/wp-admin 或域名/wp-login.php\n这就意味着所有用WordPress的人都可以用这个地址打开你的后台登录页面，很明显谁都知道这很不安全。那么如何更改Wordpress的后台登录地址呢？\n引入 搜了好多帖子，方式主要有两种，一种是使用插件，这种方法比较快。但是网上提供插件居多，我安装测试的插件没几个是最后成功的。第二种是直接修改代码文件，最后决定用这种方式。这里以宝塔面板为例，把图文过程写下来，大家参考下。\n第一步： 打开WordPress所在的目录，找到 WordPress 目录下的 wp-login.php，这个文件是我们后台登录的地址，把它重命名成别的，例如：admin.php ，这就意味着你可以通过 http://域名/admin.php 的方式来访问后台。 但是这还不够，我们打开刚才重命名的文件，把里面所有的 wp-login 替换成 admin ，这样第一步完成。\n第二步： 打开 WordPress 目录下 wp-includes ，找到其目录内的 general-template.php 文件，打开文件，把里面所有的 wp-login 全部替换成 admin 第三步： 打开文件 general-template.php ，点击搜索变量 $login_url\n$login_url 将site_url 里面第一个参数改成 index.php ，如下\n$login_url = site_url( 'index.php', 'login' );\n其中 index.php 可以换成别的，保存默认的 wp-login 也可以，这行的意思是定义当有人通过 http:// 域名 /wp-admin/ 地址访问网站时或者直接访问后台某个地址时进行跳转到 site_url() 设置的地址内，所以防止别人探索你的地址。\nEND 以后要登录后台，就可以通过 http://域名/admin.php 访问了。\n一键脚本：\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/wp.sh \u0026amp;\u0026amp; chmod +x wp.sh \u0026amp;\u0026amp; ./wp.sh ","date":"2023-12-06T16:45:27Z","permalink":"https://blog.lufei.de/p/wordpress%E7%BD%91%E7%AB%99%E6%9B%B4%E6%94%B9%E5%90%8E%E5%8F%B0%E7%99%BB%E5%BD%95%E5%9C%B0%E5%9D%80%E4%BF%9D%E5%A7%86%E7%BA%A7%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B/","title":"WordPress网站更改后台登录地址保姆级图文教程"},{"content":"webshell是一种可以在web服务器上执行后台脚本或者命令的后门，黑客通过入侵网站上传webshell后获得服务器的执行操作权限，比如执行系统命令、窃取用户数据、删除web页面、修改主页等，其危害不言而喻。而WebShell扫描检测工具可辅助查出该后门。\nWebShell扫描工具适用\n网上下载的源码 特定文件检测是否是木马 检测目标程序或文件是否存在后门 免杀检测识别率测试 1.河马查杀 在线查杀地址：https://n.shellpub.com/\nwindows版：\nhttps://dl.shellpub.com/hm-ui/latest/HmSetup.zip?version=1.8.2\nlinux-amd64版：\nhttps://dl.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.8.3\nlinux-386版：\nhttps://dl.shellpub.com/hm/latest/hm-linux-386.tgz?version=1.8.3\n","date":"2023-12-05T17:34:55Z","permalink":"https://blog.lufei.de/p/webshell%E6%89%AB%E6%8F%8F%E6%A3%80%E6%B5%8B%E6%9F%A5%E6%9D%80%E5%B7%A5%E5%85%B7/","title":"WebShell扫描检测查杀工具"},{"content":"玩客云Openwrt固件 玩客云固件：链接: https://pan.baidu.com/s/1q3gVWrsVoRiS2m3VKoqgoQ?pwd=p8ic 提取码: p8ic ip:10.0.0.1密码:root\n小雅网盘（基于alist） 网址：https://alist.xiaoya.pro/\n文档： https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f\n终端安装命令，端口 5678\nbash -c \u0026#34;$(curl http://docker.xiaoya.pro/update_new.sh)\u0026#34; 或者 端口 6789\nbash -c \u0026#34;$(curl http://docker.xiaoya.pro/update_new.sh)\u0026#34; -s host 阿里token获取地址：https://aliyuntoken.vercel.app/\n阿里opentoken地址：https://alist.nn.ci/tool/aliyundrive/request.html\n转存文件夹ID：网页版阿里云，进转存文件夹，地址栏内最后64开头的数字\n创建一个名为 xiaoyakeeper 的docker定时运行小雅转存清理并升级小雅镜像\n定时清理缓存 模式3：创建一个名为 xiaoyakeeper 的docker定时运行小雅转存清理并升级小雅镜像\nbash -c \u0026#34;$(curl -s https://xiaoyahelper.zengge99.eu.org/aliyun_clear.sh | tail -n +2)\u0026#34; -s 3 -tg 模式5：与模式3的区别是实时清理，只要产生了播放缓存一分钟内立即清理。签到和定时升级同模式3\nbash -c \u0026#34;$(curl -s https://xiaoyahelper.zengge99.eu.org/aliyun_clear.sh | tail -n +2)\u0026#34; -s 5 -tg 内容描述：\n执行时机和清理缓存的操作是完全相同的。\n可以通过手动创建/etc/xiaoya/mycheckintoken.txt文件来定义多个网盘签到的32位refresh token，每行一个。若不添加文件，则使用默认小雅转存的网盘签到。\n自动刷新/etc/xiaoya/mycheckintoken.txt和/etc/xiaoya/mytoken.txt文件，这有可能延长refresh token的时效，具体效果需要观察。\n定时运行模式包括：\n默认每天从运行脚本的下一分钟开始执行。 运行时间可以通过手动创建/etc/xiaoya/myruntime.txt文件进行修改，例如06:00和18:00表示每天早晚6点各运行一次。 自动升级的说明：\n定时升级的命令保存在/etc/xiaoya/mycmd.txt中。删除该文件将变成定时重启小雅。 完成清理和签到后，脚本会自动执行/etc/xiaoya/mycmd.txt中的命令。该文件默认包含升级小雅镜像的命令，不建议修改。 关于TG推送：\n所有模式加上-tg功能均可绑定消息推送的TG账号，只有第一次运行需要加上-tg参数。 ","date":"2023-12-02T04:06:43Z","permalink":"https://blog.lufei.de/p/%E7%8E%A9%E5%AE%A2%E4%BA%91%E5%88%B7openwrt/","title":"玩客云刷Openwrt"},{"content":"\n更新：从 2022/02/16 开始，我们的免费许可证的标签限制已被删除。所有免费用户现在都可以通过下载下面的最新版本来访问无限的标签。当前用户必须下载最新版本并在现有安装上进行安装。\n申请地址：https://www.xshell.com/zh/free-for-home-school/\n","date":"2023-11-30T04:09:50Z","permalink":"https://blog.lufei.de/p/xshell-7%E5%92%8Cxftp-7-%E5%AE%B6%E5%BA%AD%E6%88%96%E5%AD%A6%E6%A0%A1%E5%85%8D%E8%B4%B9%E7%89%88%E7%A7%BB%E9%99%A4%E6%A0%87%E7%AD%BE%E9%99%90%E5%88%B6/","title":"XShell 7和XFTP 7 家庭或学校免费版移除标签限制"},{"content":"提取bios出错？鸡血后不开机？亲测鸡血后巨稳定有想法的可以壮胆冲啊…至强万岁E5万岁\nhttps://wwcb.lanzouw.com/i5YWS1e0pcmf\n密码:TLDGJ\n","date":"2023-11-28T19:30:06Z","permalink":"https://blog.lufei.de/p/x99%E4%B8%80%E9%94%AE%E9%B8%A1%E8%A1%80%E5%B7%A5%E5%85%B7%E6%9B%B4%E6%96%B0%E4%BA%86/","title":"X99一键鸡血工具更新了!!"},{"content":"前言 项目地址: https://github.com/pandora-next/deploy\n由于之前的潘多拉项目已经凉凉了，所以今天给大家出个PandoraNext项目的搭建教程\n简介 Pandora Cloud + Pandora Server + Shared Chat = PandoraNext 支持GPTs，最新UI , 支持多种登录方式：（相当于Pandora Cloud）\n可内置tokens，支持设置密码。（相当于Pandora Server）\ndemo https://pdn.ywsj.gq/\n准备条件\n1）一台服务器\n需要便宜VPS的可以参考这个\nhttps://www.zhujiceping.com/vps\n2）此项目的github\nhttps://github.com/pandora-next/deploy\n3）获取license_id\n这里需要一个github账号 这个账号注册天数需要大于180天用来授权\n教程开始 前提是要安装docker,一键安装docker脚本:\ncurl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose PandoraNext一键脚本:\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/pandoranext.sh \u0026amp;\u0026amp; chmod +x pandoranext.sh \u0026amp;\u0026amp; ./pandoranext.sh 访问这个网页https://dash.pandoranext.com\n登录github账号获取license_id\n安装成功以后ip加端口进入web页面 http://ip:8181 端口: 8181\n可以用账号密码登录或者用Access Token登录\n如果你是gpt4.0也是可以直接使用的 五、更新网站\ndocker-compose down #停止容器\ndocker-compose pull #拉取最新镜像\ndocker-compose up -d #启动新容器\n附：Access Token获取方法 官方登录，然后访问这里 拿 Access Token\n当然可以访问 这里拿 Access Token\nAccess Token 有效期 14 天，期间访问不需要魔法。这意味着你在手机上也可使用。\n","date":"2023-11-27T05:39:19Z","permalink":"https://blog.lufei.de/p/pandoranext%E9%A1%B9%E7%9B%AE%E7%A7%81%E6%9C%89%E5%8C%96%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/","title":"PandoraNext项目私有化部署教程"},{"content":"1.数据库导入的问题 ①先上传到备份目录，在解压，然后在导入 ②数据库设置那里要启用远程开启 2.任务计划 ①注意时区 3.数据库同步 ①记得打开数据库二进制 4.一键还原 ① 注意需要相同的环境组件\n5.安装memcached注意事项\nphp需安装 bcmath 扩展\n总结: 操作 注意事项 数据库导入 上传备份至目标目录并解压，启用远程访问。 任务计划 注意时区设置。 数据库同步 打开数据库的二进制日志功能。 一键还原 确保还原环境具有相同的组件。 安装 Memcached PHP需安装bcmath扩展。 ","date":"2023-11-26T17:52:09Z","permalink":"https://blog.lufei.de/p/amh7.0%E5%AE%89%E8%A3%85%E8%8B%B9%E6%9E%9Ccms%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91%E5%92%8C%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/","title":"amh7.0安装苹果cms的一些坑和注意事项"},{"content":"国外短信接收平台: https://sms-activate.org/cn\n优点\n180 多个国家/地区 — 我们不断扩大我们的地理范围\n700 多个站点和应用程序的编号，以及其他服务的“任何其他”选项\n通过 SMS、 号码或来自机器人的电话验证帐户\n通过电子钱包方便地充值，\n通过银行卡或加密货币\n老客户折扣和批发价\nFavorable affiliate program—邀请短信激活并赚取\n开发注册软件？我们将提供 API 和良好的条件！\n通过电子邮件验证。临时邮寄地址从 0.03 卢布起。用于快速、安全的注册。\n","date":"2023-11-26T15:21:23Z","permalink":"https://blog.lufei.de/p/%E9%9D%A0%E8%B0%B1%E7%9A%84%E5%9B%BD%E5%A4%96%E7%9F%AD%E4%BF%A1%E6%8E%A5%E6%94%B6%E5%B9%B3%E5%8F%B0/","title":"靠谱的国外短信接收平台"},{"content":"1: Stable Video Diffusion ：GPT4 后的下一个曝款AI视频项目 加入等候名单：【点击前往】\n开源项目：【链接地址】\n现在，你可以基于原有的静止图像来生成一段几秒钟的视频。\n基于 Stability AI 原有的 Stable Diffusion 文生图模型，Stable Video Diffusion 成为了开源或已商业行列中为数不多的==视频生成==模型之一。\n2.像魔法一样的AI图像升级、增强器！提升图片画质只需1秒 最先进的人工智能技术可实现疯狂的高分辨率升级。不仅高档，更提升！Magnific 可以在您自己的提示和参数的指导下，产生幻觉并重新想象尽可能多的细节！\n加入等候名单：【点击前往】\n3.Claude 2.1 升级后，可轻松处理20W指令， 准确率提升30% Claude 2.1 升级后，可轻松处理20W指令。虽然很高兴能够将这一强大的新功能交到用户手中，但通常需要几个小时的人力才能完成的任务可能需要 Claude 几分钟的时间。我们预计随着技术的进步，延迟将大幅减少。\n幻觉率降低 2 倍\nClaude 2.1 在诚实方面也取得了显着进步，与我们之前的 Claude 2.0 模型相比，虚假陈述减少了 2 倍。这使企业能够构建高性能的人工智能应用程序，解决具体的业务问题，并以更高的信任度和可靠性在其运营中部署人工智能。\n我们通过设计大量复杂的事实问题来探究当前模型中已知的弱点，从而测试了 Claude 2.1 的诚实性。使用区分错误说法（“玻利维亚人口第五多的城市是蒙特罗”）和承认不确定性（“我不确定玻利维亚人口第五多的城市是什么”）的标题，Claude 2.1 更有可能提出异议而不是提供不正确的信息。\n官方链接：https://www.anthropic.com/index/claude-2-1\n主页: https://claude.ai/chats\n国外短信接收平台: https://sms-activate.org/cn\n","date":"2023-11-26T15:12:34Z","permalink":"https://blog.lufei.de/p/%E9%80%86%E5%A4%A9ai-%E7%9A%84%E4%B8%8B%E4%B8%80%E4%B8%AA%E7%88%86%E6%AC%BE%E9%A1%B9%E7%9B%AE%E4%B8%8D%E6%83%B3%E5%A4%B1%E4%B8%9A%E4%B8%80%E5%AE%9A%E8%A6%81%E6%8F%90%E5%89%8D%E7%9F%A5%E9%81%93/","title":"逆天！AI 的下一个爆款项目，不想失业一定要提前知道！！"},{"content":"源码仓库 https://github.com/eysp/portainer-ce\nportainer-ce中文版 其中arm和ppc64le架构没有设备测试，反馈bug 到GitHub issues\n已更新到2.19.1，新版删除左上角升级企业版的广告，删除首次登录弹出英文提示的公告，汉化的广告也隐藏，总之这是一个纯净版\n如果汉化对你有帮助请往下拉支持我，另外欢迎大家进q群交流，群号758648462（备注portainer）\n感谢群里@我不是矿神 指导js精简 | @52Fancy 提供编译脚本 一键安装代码\ndocker run -d --restart=always --name=\u0026#34;portainer\u0026#34; -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce 163镜像安装，portainer-ce中文，访问dockerhub网速不好的尝试\ndocker run -d --restart=always --name=\u0026#34;portainer\u0026#34; -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock hub-mirror.c.163.com/6053537/portainer-ce 访问hub.docker.com网络慢，或者以上代码都无法安装成功尝试以下代码\ndocker pull hub-mirror.c.163.com/6053537/portainer-ce docker run -d --restart=always --name=\u0026#34;portainer\u0026#34; -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce 如果你要启用ssl访问，远程主机建议启用，端口443和证书路径/certs请自行更改\ndocker run -d -p 443:9000 --name portainer --restart always -v ~/local-certs:/certs -v portainer_data:/data 6053537/portainer-ce -v /var/run/docker.sock:/var/run/docker.sock --ssl --sslcert /certs/portainer.crt --sslkey /certs/portainer.key 或者你也可以启用Nginx反代，下面是代码\nlocation / { proxy_pass http://127.0.0.1:9000; 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_read_timeout 300s; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } 如果你只想要访问youname.com/portainer这样的子目录也可以\nlocation ^~ /portainer/ { proxy_pass http://127.0.0.1:9000/; 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_read_timeout 300s; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } ","date":"2023-11-26T08:17:17Z","permalink":"https://blog.lufei.de/p/portainer-ce%E4%B8%AD%E6%96%87%E7%BA%AF%E5%87%80%E7%89%88/","title":"portainer-ce中文纯净版"},{"content":"哪吒探针文档: https://nezha.wiki/guide/dashboard.html\n截图预览 特性(以下均为基于官方默认主题的更改) 1.基于官方原版主题重新排版\n2.解决移动端卡片列表点击最后两个卡片右上角的图标时，发生的页面位置跳转问题\n3.固定卡片宽度，栅格化(若剩余宽度不足以容下一个卡片，则换行显示)解决原版主题页面宽度变小后仍然制一行显示4个导致布局错误\n4.解决弹出看卡片位置不合适导致被顶部菜单栏遮挡问题\n5.增加一些我常用的主机信息显示在卡片上，方便查看（不爱喜欢可以自行修改哈）\n6.底部版权信息可以在template文件夹里的footer.html里更改\n7.swap未开启显示提示\n使用方法 1.template里面的文件解压出来放到服务端模板目录里面\n/opt/nezha/dashboard/theme-custom/template 2.重启哪吒面板服务\n3.在哪吒面板后台主题选择Custom(local)\n4.将css.txt里面的CSS样式代码复制到哪吒面板后台的“自定义代码”文本框里\n一些信息的修改地址 1.站点图标 header.html 文件的第17行，替换掉https://cdn.amzayo.top/static/public/luban/luban_head.png\n2.页面左上角 logomenu.html 文件的第5行，替换掉https://cdn.amzayo.top/static/public/luban/test_head.e7b54515.png\n3.底部版权信息 footer.html 文件的第4到8行，依照demo底部的文字按需替换\n下载地址\u0026ndash;\u0026gt;点我下载 其他CSS样式 \u0026lt;style\u0026gt; /* 屏幕适配 */ @media only screen and (min-width: 1200px) { .ui.container { width: 80% !important; } } @media only screen and (max-width: 767px) { .ui.card\u0026gt;.content\u0026gt;.header:not(.ui), .ui.cards\u0026gt;.card\u0026gt;.content\u0026gt;.header:not(.ui) { margin-top: 0.4em !important; } } /* 整体图标 */ i.icon { color: #000; width: 1em !important; } /* 背景图片 */ body { content: \u0026#34; \u0026#34; !important; background: fixed !important; z-index: -1 !important; top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; background-position: top !important; background-repeat: no-repeat !important; background-size: cover !important; background-category_bar: true url(https://gitee.com/darki/img/raw/master/1631081013043.webp) !important; font-family: Arial,Helvetica,sans-serif !important; } /* 进度条 */ .ui.progress { border-radius: 0.5rem !important; } .ui.progress .bar { min-width: 1.8em !important; border-radius: 0.5rem !important; line-height: 1.65em !important; } .ui.fine.progress\u0026gt; .bar { } .ui.progress\u0026gt; .bar { } .ui.progress.fine .bar { } .ui.progress.warning .bar { } .ui.progress.error .bar { } .ui.progress.offline .bar { } /* 导航栏 */ .ui.large.menu { border: 0 !important; border-radius: 0rem !important; background-color: rgba(255, 255, 255, 55%) !important; } /* 首页按钮 */ .ui.menu .active.item { background-color: transparent !important; } /* 导航栏下拉框 */ .ui.dropdown .menu { border: 0 !important; border-radius: 1rem !important; background-color: rgba(255, 255, 255, 80%) !important; } /* 登陆按钮 */ .nezha-primary-btn { background-color: transparent !important; color: #000 !important; } /* 大卡片 */ #app .ui.fluid.accordion { background-color: #fbfbfb26 !important; border-radius: 1rem !important; } /* 小卡片 */ .ui.four.cards\u0026gt;.card { background-color: #fafafaa3 !important; border-radius: 1rem !important; } .status.cards .wide.column { padding-top: 0 !important; padding-bottom: 0 !important; } .status.cards .three.wide.column { } .status.cards .wide.column:nth-child(1) { } .status.cards .wide.column:nth-child(2) { } .status.cards .description { } /* 小鸡名 */ .status.cards .flag { margin-right: 0.5rem !important; } /* 上传下载 */ .status.cards .outline.icon { margin-right: 1px !important; } i.arrow.alternate.circle.down.outline.icon { color: #21ba45 !important; } i.arrow.alternate.circle.up.outline.icon { color: red !important; } /* 弹出卡片小箭头 */ .ui.right.center.popup { margin: -3px 0 0 0.914286em !important; -webkit-transform-origin: left 50% !important; transform-origin: left 50% !important; } .ui.bottom.left.popup { margin-left: 1px !important; margin-top: 3px !important; } .ui.top.left.popup { margin-left: 0 !important; margin-bottom: 10px !important; } .ui.top.right.popup { margin-right: 0 !important; margin-bottom: 8px !important; } .ui.left.center.popup { margin: -3px .91428571em 0 0 !important; -webkit-transform-origin: right 50% !important; transform-origin: right 50% !important; } .ui.right.center.popup:before, .ui.left.center.popup:before { border: 0px solid #fafafaeb !important; background: #fafafaeb !important; } .ui.top.popup:before { border-color: #fafafaeb transparent transparent !important; } .ui.popup:before { border-color: #fafafaeb transparent transparent !important; } .ui.bottom.left.popup:before { border-radius: 0 !important; border: 1px solid transparent !important; border-color: #fafafaeb transparent transparent !important; background: #fafafaeb !important; -webkit-box-shadow: 0px 0px 0 0 #fafafaeb !important; box-shadow: 0px 0px 0 0 #fafafaeb !important; -webkit-tap-highlight-color: rgba(0,0,0,0) !important; } .ui.bottom.right.popup:before { border-radius: 0 !important; border: 1px solid transparent !important; border-color: #fafafaeb transparent transparent !important; background: #fafafaeb !important -webkit-box-shadow: 0px 0px 0 0 #fafafaeb !important; box-shadow: 0px 0px 0 0 #fafafaeb !important; -webkit-tap-highlight-color: rgba(0,0,0,0) !important; } .ui.top.left.popup:before { border-radius: 0 !important; border: 1px solid transparent !important; border-color: #fafafaeb transparent transparent !important; background: #fafafaeb !important; -webkit-box-shadow: 0px 0px 0 0 #fafafaeb !important; box-shadow: 0px 0px 0 0 #fafafaeb !important; -webkit-tap-highlight-color: rgba(0,0,0,0) !important; } .ui.top.right.popup:before { border-radius: 0 !important; border: 1px solid transparent !important; border-color: #fafafaeb transparent transparent !important; background: #fafafaeb !important; -webkit-box-shadow: 0px 0px 0 0 #fafafaeb !important; box-shadow: 0px 0px 0 0 #fafafaeb !important; -webkit-tap-highlight-color: rgba(0,0,0,0) !important; } .ui.left.center.popup:before { border-radius: 0 !important; border: 1px solid transparent !important; border-color: #fafafaeb transparent transparent !important; background: #fafafaeb !important; -webkit-box-shadow: 0px 0px 0 0 #fafafaeb !important; box-shadow: 0px 0px 0 0 #fafafaeb !important; -webkit-tap-highlight-color: rgba(0,0,0,0) !important; } /* 弹出卡片 */ .status.cards .ui.content.popup { min-width: 20rem !important; line-height: 2rem !important; border-radius: 1rem !important; border: 1px solid transparent !important; background-color: #fafafaeb !important; font-family: Arial,Helvetica,sans-serif !important; } .ui.content { margin: 0 !important; padding: 1em !important; } /* 服务页 */ .ui.table { background: RGB(225,225,225,0.6) !important; border-radius: 1rem !important; } .ui.table thead th { background: transparent !important; } /* 服务页进度条 */ .service-status .good { } .service-status .danger { } .service-status .warning { } /* 版权 */ .ui.inverted.segment, .ui.primary.inverted.segment { color: #000 !important; font-weight: bold !important; background-color: #fafafaa3 !important; } \u0026lt;/style\u0026gt; \u0026lt;!--Logo和版权--\u0026gt; \u0026lt;script\u0026gt; window.onload = function(){ var avatar=document.querySelector(\u0026#34;.item img\u0026#34;) var footer=document.querySelector(\u0026#34;div.is-size-7\u0026#34;) footer.innerHTML=\u0026#34;Powered by 路飞博客\u0026#34; footer.style.visibility=\u0026#34;visible\u0026#34; avatar.src=\u0026#34;https://gravatar.loli.net/avatar/6969d9446ac73edbace44fe66cbae6fc?d=mm\u0026amp;s=50\u0026#34; avatar.style.visibility=\u0026#34;visible\u0026#34; } \u0026lt;/script\u0026gt; ","date":"2023-11-26T06:30:45Z","permalink":"https://blog.lufei.de/p/%E5%93%AA%E5%90%92%E6%8E%A2%E9%92%88%E7%BE%8E%E5%8C%96/","title":"哪吒探针美化"},{"content":"\n我们经常用NPM可视化面板反代服务到域名上，我发现一个更加强大的面板，雷池是个web防火墙面板，基于nginx，反向代理只是基础，重点是还能防御站点，拦截网络恶意攻击。你可以理解为反代加高防的存在，\n使用方法\nDebian/Ubuntu安装下载工具\napt update -y \u0026amp;\u0026amp; apt install -y curl CentOS安装下载工具\nyum update \u0026amp;\u0026amp; yum install curl 官网版一键脚本\ncurl -sS -O https://kejilion.pro/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh GitHub版一键脚本 部分小伙伴会遇到官网版出现大段乱码！就用GitHub版本吧！\ncurl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh ","date":"2023-11-25T11:33:31Z","permalink":"https://blog.lufei.de/p/%E9%9B%B7%E6%B1%A0waf%E7%A4%BE%E5%8C%BA%E7%89%88%E5%8F%8D%E4%BB%A3%E4%B8%8A%E9%AB%98%E9%98%B2/","title":"雷池waf社区版反代上高防"},{"content":"V.PS高端线路的WordPress演示网站：\n中国-香港（移动CMI）：http://v.ps1.zhujiceping.net/\n日本-大阪（IIJ）：http://v.ps2.zhujiceping.net/\n日本-东京（软银）：http://v.ps3.zhujiceping.net/\n澳大利亚-悉尼（联通AS9929）：http://v.ps4.zhujiceping.net/\n美国-圣何塞（电信CN2+联通AS9929+移动CMIN2）：http://v.ps5.zhujiceping.net/\n英国-伦敦（联通AS9929）：http://v.ps6.zhujiceping.net\n德国-法兰克福（联通AS9929）：http://v.ps7.zhujiceping.net\n荷兰-阿姆斯特丹（电信CN2+联通AS9929+移动CMI）：http://v.ps8.zhujiceping.net/\n官网测试： https://v.ps/speedtest/\n","date":"2023-11-24T15:31:58Z","permalink":"https://blog.lufei.de/p/v.ps%E9%AB%98%E7%AB%AF%E7%BA%BF%E8%B7%AF%E7%9A%84wordpress%E6%BC%94%E7%A4%BA%E7%BD%91%E7%AB%99/","title":"V.PS高端线路的WordPress演示网站"},{"content":"海洋CMS又名SEACMS，完全开源免费，自适应电脑、手机、平板、APP多终端，无加密、更安全，是您最佳的建站工具!\n爬滚打多年，海洋CMS有着丰富的经验和技术积累，并且能够随着流行趋势加入更多当下流行的功能。\n注意几点 根目录删除.user.ini 文件 data目录设置权限为777,其余555 如果导入数据库文件后缀为sql.gz,先解压为sql 修改common.inc.php数据库信息 数据库设置那里要启用远程开启 伪静态规则 伪静态规则\nlocation / { rewrite ^/frim/index(.+?)\\.html$ /list/index.php?$1 last; rewrite ^/movie/index(.+?)\\.html$ /detail/index.php?$1 last; rewrite ^/play/([0-9]+)-([0-9]+)-([0-9]+)\\.html$ /video/index.php?$1-$2-$3 last; rewrite ^/topic/index(.+?)\\.html$ /topic/index.php?$1 last; rewrite ^/topiclist/index(.+?).html$ /topiclist/index.php?$1 last; rewrite ^/index\\.html$ index.php permanent; rewrite ^/news\\.html$ news/ permanent; rewrite ^/part/index(.+?)\\.html$ /articlelist/index.php?$1 last; rewrite ^/article/index(.+?)\\.html$ /article/index.php?$1 last; } ","date":"2023-11-07T02:49:46Z","permalink":"https://blog.lufei.de/p/amh%E6%90%AD%E5%BB%BA%E6%B5%B7%E6%B4%8Bcms%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/","title":"amh搭建海洋cms注意事项"},{"content":"git clone ssh 走代理 新建一个 C:\\Users\\你的用户名\\.ssh\\config 文件（没有扩展名，如果已存在此文件则不用新建），编辑此文件增加以下内容：\nHost github.com *.github.com User git ProxyCommand connect -S 127.0.0.1:7890 %h %p 其中 Host 右边为需要走代理的域名列表，127.0.0.1:7890 替换为自己的代理服务器地址。\ngit clone http(s) 走代理 git config --global http.proxy \u0026#34;http://127.0.0.1:7890\u0026#34; git config --global https.proxy \u0026#34;http://127.0.0.1:7890\u0026#34; 其中 127.0.0.1:7890 替换为自己的代理服务器地址。\n","date":"2023-10-11T06:11:05Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86%E8%AE%BE%E7%BD%AE-git-%E5%85%8B%E9%9A%86/","title":"使用代理设置 Git 克隆"},{"content":"准备东西: 香港节点(科学上网) 打开edge浏览器- 隐私窗口 香港地址: 香港岛-大坑- 香港南区大潭水塘道624号 香港电话号码(无忧行) 信用卡(万里汇) 注册地址: https://cloud.google.com/free?hl=zh-cn\n老账号续期教程:\n","date":"2023-10-10T04:11:16Z","permalink":"https://blog.lufei.de/p/%E8%B0%B7%E6%AD%8C%E4%BA%91%E6%B3%A8%E5%86%8C%E7%BB%86%E8%8A%82/","title":"谷歌云注册细节"},{"content":"Cloudflared Tunnels是Cloudflare提供的内网穿透工具，可安全地将公网流量转发到内部网络服务。通过加密隧道连接全球网络，它提供安全性和性能优化，方便访问内部服务。\n部署环境: windows10\n一: 下载程序 将cloudflared-windows-amd64.exe 重命名为将cloudflared.exe\nhttps://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe\n二: 拷贝项目 拷贝项目文件到本地任意目录:\n地址 : https://github.com/woniu336/cloudflared\n三: 启动服务 将cloudflared.exe和项目文件放在同一个文件夹,\n然后双击 menu.bat 开启你的穿透之旅吧\n","date":"2023-09-26T05:13:16Z","permalink":"https://blog.lufei.de/p/cloudflared-tunnels-%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/","title":"cloudflared Tunnels 内网穿透"},{"content":"如果你在寻找专业且易用的网盘拷贝与同步工具，那就让Rclone成为你的云端合作伙伴吧。它虽然不会说笑话，但它绝对会在云端任务中带来欢笑。\n一键安装rclone工具箱\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/rclone.sh \u0026amp;\u0026amp; chmod +x rclone.sh \u0026amp;\u0026amp; ./rclone.sh 当谈到强大的网盘拷贝与同步工具时，Rclone绝对是那位总是低调却又非常值得注意的明星。它就像是那个坐在后排的天才学生，总是默默地在背后完成任务，而不是在台前卖弄自己。\n首先，Rclone是一名真正的变身专家。它可以从一个网盘变成另一个网盘，仿佛是魔术师一样。无论你是想从Google Drive变身为Dropbox，还是从OneDrive蜕变为Amazon S3，Rclone都能帮你完成。这就像是在玩一场云端变装派对，而Rclone是你的变装专家，总是能帮你换上最适合的服装。\n而且，Rclone也是一个同步的奇才。它可以确保你的文件在不同的云存储之间保持同步，就像是一个精密的交响乐团指挥家，确保每个乐器都在正确的时刻奏响。无论你是在办公室工作还是在沙滩度假，Rclone都能确保你的文件不会在云端丢失节奏。\n但是，尽管Rclone是一位技术高手，但它并不是那种自恋自大的软件。它没有花哨的用户界面，也不会在社交媒体上炫耀自己的成就。它只是默默地坚守在后台，为你完成工作，就像是那位永远不会抢镜的配角演员，但却是整个剧组的支持力量。\n","date":"2023-09-17T09:57:22Z","permalink":"https://blog.lufei.de/p/%E5%BC%BA%E5%A4%A7%E7%9A%84%E7%BD%91%E7%9B%98%E5%90%8C%E6%AD%A5%E5%B7%A5%E5%85%B7--rclone%E5%B7%A5%E5%85%B7%E7%AE%B1/","title":"强大的网盘同步工具--rclone工具箱"},{"content":"假设你已经安装了rclone,并配置好了各大网盘\n那么在Rclone Browser查看谷歌硬盘内容,是看不了的,但是如果你已经开启了科学上网,则按照下面的方法\nsocks5://127.0.0.1:10808 10808端口是v2ray的代理端口\n如果是小狐狸则是 7890\nsocks5://127.0.0.1:7890 下载的时候要加上参数,避免有些文件被误认为病毒无法下载:\n--drive-acknowledge-abuse cmd终端开启代理:\n小狐狸:\nset http_proxy=socks5://127.0.0.1:7890 set https_proxy=socks5://127.0.0.1:7890 v2ray:\nset http_proxy=socks5://127.0.0.1:10808 set https_proxy=socks5://127.0.0.1:10808 取消代理:\nset http_proxy= set https_proxy= ","date":"2023-09-14T13:35:50Z","permalink":"https://blog.lufei.de/p/rclone-browser%E4%BB%A3%E7%90%86%E8%AE%BE%E7%BD%AE/","title":"Rclone Browser代理设置"},{"content":" 以下插件只适用于斐讯 N1,其他没测试过\n一: 使用方法 下载插件,然后进入软路由: 系统\u0026ndash;文件上传\u0026ndash;安装\n例如: 斐讯 N1 盒子软路由\n二: 阿里云盘webdav插件 插件下载:\nhttps://github.com/woniu336/openwrt-ipk/tree/master/N1安装阿里云盘webdav\n项目地址 : https://github.com/messense/aliyundrive-webdav\n三:Alist插件 OpenWrt 查看CPU架构命令：\ncat /etc/os-release |grep ARCH 插件下载:\nhttps://github.com/woniu336/openwrt-ipk/tree/master/N1软路由安装alist\n项目地址 : https://github.com/sbwml/luci-app-alist\nAList文档：https://alist.nn.ci/zh/guide/\n四: Docker 安装阿里云盘webdav docker run -d --name=aliyundrive-webdav --restart=unless-stopped -p 8080:8080 \\ -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \\ -e REFRESH_TOKEN=\u0026#39;your refresh token\u0026#39; \\ -e WEBDAV_AUTH_USER=admin \\ -e WEBDAV_AUTH_PASSWORD=admin \\ messense/aliyundrive-webdav 其中，REFRESH_TOKEN 环境变量为你的阿里云盘 refresh_token，WEBDAV_AUTH_USER 和 WEBDAV_AUTH_PASSWORD 为连接 WebDAV 服务的用户名和密码。\n","date":"2023-09-14T10:49:40Z","permalink":"https://blog.lufei.de/p/openwrt%E5%AE%89%E8%A3%85alist%E5%92%8C%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98webdav/","title":"Openwrt安装alist和阿里云盘webdav"},{"content":"阿里云盘 WebDAV 服务，主要使用场景为配合支持 WebDAV 协议的客户端 App 如 Infuse、nPlayer 等实现在电视上直接观看云盘视频内容， 支持客户端 App 直接从阿里云盘获取文件播放而不经过运行本应用的服务器中转, 支持上传文件，但受限于 WebDAV 协议不支持文件秒传。\n请注意：V2 版本基于阿里云盘开放平台接口实现，不再支持阿里云盘 Web 和 App 版本获取的 refresh token。 由于本项目作者不再使用梅林固件，V2 版本不再免费支持 Koolshare 梅林固件系统，如有需要请考虑付费支持。\n安装 可以从 GitHub Releases 页面下载预先构建的二进制包， 也可以使用 pip 从 PyPI 下载:\npip install aliyundrive-webdav 如果系统支持 Snapcraft 比如 Ubuntu、Debian 等，也可以使用 snap 安装：\nsudo snap install aliyundrive-webdav OpenWrt 路由器 GitHub Releases 中有预编译的 ipk 文件， 目前提供了 aarch64/arm/mipsel/x86_64/i686 等架构的版本，可以下载后使用 opkg 安装，以 nanopi r4s 为例：\nwget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.2/aliyundrive-webdav_2.3.2-1_aarch64_generic.ipk wget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.2/luci-app-aliyundrive-webdav_2.3.2_all.ipk wget https://github.com/messense/aliyundrive-webdav/releases/download/v2.3.2/luci-i18n-aliyundrive-webdav-zh-cn_2.3.2-1_all.ipk opkg install aliyundrive-webdav_2.3.2-1_aarch64_generic.ipk opkg install luci-app-aliyundrive-webdav_2.3.2_all.ipk opkg install luci-i18n-aliyundrive-webdav-zh-cn_2.3.2-1_all.ipk 其它 CPU 架构的路由器可在 GitHub Releases 页面中查找对应的架构的主程序 ipk 文件下载安装， 常见 OpenWrt 路由器 CPU 架构如下表（欢迎补充）：\n路由器 CPU 架构 nanopi r4s aarch64_generic 小米 AX3600 aarch64_cortex-a53 斐讯 N1 盒子 aarch64_cortex-a53 Newifi D2 mipsel_24kc Pogoplug arm_mpcore Tips: 不清楚 CPU 架构类型可通过运行 opkg print-architecture 命令查询。\nDocker 运行 docker run -d --name=aliyundrive-webdav --restart=unless-stopped -p 8080:8080 \\ -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \\ -e REFRESH_TOKEN=\u0026#39;your refresh token\u0026#39; \\ -e WEBDAV_AUTH_USER=admin \\ -e WEBDAV_AUTH_PASSWORD=admin \\ messense/aliyundrive-webdav 其中，REFRESH_TOKEN 环境变量为你的阿里云盘 refresh_token，WEBDAV_AUTH_USER 和 WEBDAV_AUTH_PASSWORD 为连接 WebDAV 服务的用户名和密码。\nQNAP 威联通 NAS QNAP 插件 qnap-aliyunpan-webdav by @iranee.\nContainerStation (Docker) 管理员登陆 NAS 后安装 ContainerStation 并启动服务，在 Management (管理) 标签中 Create Application (新建应用)，配置如下\nversion: \u0026#39;3.3\u0026#39; services: aliyundrive-webdav: container_name: aliyundrive-webdav restart: unless-stopped ports: - \u0026#39;8080:8080\u0026#39; environment: - \u0026#39;REFRESH_TOKEN=mytoken...\u0026#39; category_bar: true messense/aliyundrive-webdav 其中 REFRESH_TOKEN 文档最下面说明；:8080 网盘访问映射端口，可以按需改为其他的。\n点击 Create (创建)后启动，访问 http://nas地址:8080/ 即可看到你网盘的自动生成索引网页文件。\n参考文档\nhttps://docs.docker.com/compose/ https://www.composerize.com/ rclone 为了避免重复上传文件，使用 rclone 时推荐使用 Nextcloud WebDAV 模式，可以支持 sha1 checksums. 另外需要配合 --no-update-modtime 参数，否则 rclone 为了更新文件修改时间还是会强制重新上传。\n举个例子：\nrclone --no-update-modtime copy abc.pdf aliyundrive-nc://docs/ 获取 refresh token 通过在线工具获取 refresh token 命令行运行 aliyundrive-webdav qr login 扫码授权后会输出 refresh token 命令行用法 $ aliyundrive-webdav --help WebDAV server for AliyunDrive Usage: aliyundrive-webdav [OPTIONS] aliyundrive-webdav \u0026lt;COMMAND\u0026gt; Commands: qr Scan QRCode help Print this message or the help of the given subcommand(s) Options: --host \u0026lt;HOST\u0026gt; Listen host [env: HOST=] [default: 0.0.0.0] -p, --port \u0026lt;PORT\u0026gt; Listen port [env: PORT=] [default: 8080] --client-id \u0026lt;CLIENT_ID\u0026gt; Aliyun drive client_id [env: CLIENT_ID=] --client-secret \u0026lt;CLIENT_SECRET\u0026gt; Aliyun drive client_secret [env: CLIENT_SECRET=] --drive-type \u0026lt;DRIVE_TYPE\u0026gt; Aliyun drive type [env: DRIVE_TYPE=] Possible values: - resource: Resource drive - backup: Backup drive - default: Default drive -r, --refresh-token \u0026lt;REFRESH_TOKEN\u0026gt; Aliyun drive refresh token [env: REFRESH_TOKEN=] -U, --auth-user \u0026lt;AUTH_USER\u0026gt; WebDAV authentication username [env: WEBDAV_AUTH_USER=] -W, --auth-password \u0026lt;AUTH_PASSWORD\u0026gt; WebDAV authentication password [env: WEBDAV_AUTH_PASSWORD=] -I, --auto-index Automatically generate index.html -S, --read-buffer-size \u0026lt;READ_BUFFER_SIZE\u0026gt; Read/download buffer size in bytes, defaults to 10MB [default: 10485760] --upload-buffer-size \u0026lt;UPLOAD_BUFFER_SIZE\u0026gt; Upload buffer size in bytes, defaults to 16MB [default: 16777216] --cache-size \u0026lt;CACHE_SIZE\u0026gt; Directory entries cache size [default: 1000] --cache-ttl \u0026lt;CACHE_TTL\u0026gt; Directory entries cache expiration time in seconds [default: 600] --root \u0026lt;ROOT\u0026gt; Root directory path [default: /] -w, --workdir \u0026lt;WORKDIR\u0026gt; Working directory, refresh_token will be stored in there if specified --no-trash Delete file permanently instead of trashing it --read-only Enable read only mode --tls-cert \u0026lt;TLS_CERT\u0026gt; TLS certificate file path [env: TLS_CERT=] --tls-key \u0026lt;TLS_KEY\u0026gt; TLS private key file path [env: TLS_KEY=] --strip-prefix \u0026lt;STRIP_PREFIX\u0026gt; Prefix to be stripped off when handling request [env: WEBDAV_STRIP_PREFIX=] --debug Enable debug log --no-self-upgrade Disable self auto upgrade --skip-upload-same-size Skip uploading same size file --prefer-http-download Prefer downloading using HTTP protocol --redirect Enable 302 redirect when possible -h, --help Print help (see a summary with \u0026#39;-h\u0026#39;) -V, --version Print version Note\n注意：TLS/HTTPS 暂不支持 MIPS 架构。\nNote\n注意：启用 --skip-upload-same-size 选项虽然能加速上传但可能会导致修改过的同样大小的文件不会被上传\n","date":"2023-09-14T10:18:27Z","permalink":"https://blog.lufei.de/p/openwrt%E5%AE%89%E8%A3%85%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98-webdav/","title":"Openwrt安装阿里云盘 WebDAV"},{"content":"使用nvm（Node Version Manager）安装Node.js是一个非常方便的方法，因为它允许你在同一台机器上管理多个Node.js版本。以下是使用nvm安装Node.js的基本步骤：\nLinux 安装nvm\n根据你的操作系统，安装命令可能会有所不同。以下是在Linux上安装nvm的命令：\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 或者使用wget：\nwget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 确保 nvm 生效\nsource ~/.bashrc 验证nvm安装\n安装完成后，你可以通过运行以下命令来验证nvm是否正确安装：\ncommand -v nvm 如果安装成功，这个命令应该会输出nvm。\n查看nvm版本\nnvm --version 安装Node.js 如果您想看看有哪些版本可以安装：\nnvm ls-remote 这个命令会列出所有可用的Node.js版本，包括最新的稳定版、LTS（长期支持）版本以及旧版本。列表通常会很长，包含了从Node.js 0.1到最新版本的每一个版本。\n如果你只想查看LTS版本，可以使用：\nnvm ls-remote --lts 使用nvm安装Node.js，你可以运行以下命令来安装特定版本的Node.js（例如，v18.16.0）：\nnvm install 18.16.0 使用特定版本的Node.js\n安装完成后，你可以使用以下命令来切换到你刚刚安装的版本：\nnvm use 18.16.0 验证Node.js安装\n最后，你可以通过运行以下命令来验证Node.js是否正确安装：\nnode -v 这个命令应该会输出你刚刚安装的Node.js版本号。\n如果您想查看已安装的版本\nnvm ls 请注意，nvm的安装和使用可能会因为你的操作系统和shell的不同而有所差异。确保按照nvm的官方文档进行操作，以获得最准确的信息。\nwindows windows下安装nvm\n项目: https://github.com/coreybutler/nvm-windows\n下载nvm https://github.com/coreybutler/nvm-windows/releases\n安装后,以管理员方式打开cmd确认安装正确:\nnvm version 查看可用的Node.js版本列表\nnvm list available 安装指定版本\nnvm install 18.16.0 切换版本\nnvm use 18.16.0 确认版本\nnode -v ","date":"2023-09-12T06:08:04Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8nvm%E7%AE%A1%E7%90%86%E5%A4%9A%E7%89%88%E6%9C%ACnode.js/","title":"使用nvm管理多版本node.js"},{"content":"请确保您的系统上已经安装了 rclone，并且命令的路径正确。\n要将定时任务添加到您的系统中，您可以按照以下步骤进行操作：\n打开终端或命令提示符，登录到您的系统。\nr2为cloudflare r2 , cos是腾讯云cos\n在linux中 crontab -e 在打开的定时任务配置文件中，添加以下内容：\n0 2 * * * rclone sync r2:blog cos:shenma-1253486782/blog --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 保存并关闭文件。\n系统将自动加载新的定时任务配置。\n现在，您的系统将在每天的凌晨2点执行指定的命令。请注意，这是基于系统的时区设置，如果您的系统时区设置为东八区，那么任务将在东八区的凌晨2点执行。\n查看任务\ncrontab -l 调整时区:\ntimedatectl set-timezone Asia/Shanghai \u0026amp;\u0026amp; hwclock --systohc 在 Windows 系统中 您可以使用任务计划程序（Task Scheduler）来创建定时任务。以下是在 Windows 上创建定时任务的具体步骤：\n打开“任务计划程序”。您可以通过按下 Win + R 键，在运行对话框中输入 taskschd.msc，然后按下 Enter 键来打开它。\n在任务计划程序窗口中，点击左侧的 \u0026ldquo;创建任务\u0026rdquo;。\n在 \u0026ldquo;常规\u0026rdquo; 选项卡中，输入任务的名称和描述。\n切换到 \u0026ldquo;触发器\u0026rdquo; 选项卡，点击 \u0026ldquo;新建\u0026rdquo; 来创建一个新的触发器。\n在触发器设置中，选择 \u0026ldquo;每天\u0026rdquo;，并设置执行任务的时间为 16:40。\n切换到 \u0026ldquo;操作\u0026rdquo; 选项卡，点击 \u0026ldquo;新建\u0026rdquo; 来创建一个新的操作。\n在操作设置中，选择 \u0026ldquo;启动程序\u0026rdquo;，然后在程序/脚本字段中输入 rclone。\n在 \u0026ldquo;添加参数\u0026rdquo; 字段中输入 sync r2:blog cos:shenma-1253486782/blog --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10\n配置其他可选设置，如 \u0026ldquo;条件\u0026rdquo;、\u0026ldquo;设置\u0026rdquo; 等。\n点击 \u0026ldquo;确定\u0026rdquo; 保存任务。\n现在，您已经成功创建了一个在每天的16点40分执行指定命令的定时任务。请确保您的系统上已经安装了 rclone，并且命令的路径正确。您可以根据需要进行进一步的调整和修改。\nbat一键运行 将以下内容保存为bat文件\n@echo off cd /d D:\\rclone-v1.63.0-windows-amd64 rclone sync r2:blog cos:shenma-1253486782/blog --ignore-existing -u -v -P --transfers=20 --ignore-errors --buffer-size=128M --check-first --checkers=10 pause ","date":"2023-09-11T08:58:58Z","permalink":"https://blog.lufei.de/p/%E5%AE%9A%E6%97%B6%E5%B0%86r2%E5%9B%BE%E5%BA%8A%E5%90%8C%E6%AD%A5%E5%88%B0%E8%85%BE%E8%AE%AF%E4%BA%91%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/","title":"定时将R2图床同步到腾讯云对象存储"},{"content":"有时候我们安装服务器会用默认的UTC( Universal Time Coordinated)时区，造成后继一些软件记录时间上显示的不够直观，所以需要手动更改为中国/上海时区。\n推荐\nsudo bash -c \u0026#39;echo \u0026#34;Asia/Shanghai\u0026#34; \u0026gt; /etc/timezone\u0026#39; sudo dpkg-reconfigure --frontend noninteractive tzdata 首先安装 NTP 服务\nsudo apt-get update sudo apt-get install systemd-timesyncd 安装完成后，启用并启动服务\nsudo systemctl enable systemd-timesyncd sudo systemctl start systemd-timesyncd 查询状态\ntimedatectl status 更改很简单，如下2条命令即可：\nsudo rm /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 或者\n#设置上海时区 sudo timedatectl set-timezone Asia/Shanghai 使用 timedatectl命令可以查看时区\ntimedatectl 启用 NTP 时间同步\nsudo timedatectl set-ntp on 使用hwclock --systohc可以将系统时间同步到硬件时间。\nsudo hwclock --systohc 同步crontab定时任务时区\nsudo service cron restart ","date":"2023-09-11T08:19:05Z","permalink":"https://blog.lufei.de/p/debian/ubuntu%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%9B%B4%E6%94%B9%E6%97%B6%E5%8C%BA%E4%B8%BA%E4%B8%AD%E5%9B%BD/","title":"Debian/ubuntu服务器更改时区为中国"},{"content":"项目 猫抓： https://github.com/xifangczy/cat-catch/releases\n安装地址: https://o2bmm.gitbook.io/cat-catch/docs/install\n文档: https://o2bmm.gitbook.io/cat-catch/\nm3u8下载器： https://github.com/nilaoda/N_m3u8DL-CLI/releases\n下载解压,cmd命令\nN_m3u8DL-CLI_v3.0.2.exe --registerUrlProtocol 打开浏览器: 进入需要下载的播放页面\n","date":"2023-09-11T06:19:43Z","permalink":"https://blog.lufei.de/p/%E4%BB%8E%E7%BD%91%E9%A1%B5%E8%A7%86%E9%A2%91%E5%88%B0mp4%E8%BD%BB%E6%9D%BE%E4%BD%BF%E7%94%A8m3u8%E4%B8%8B%E8%BD%BD%E5%99%A8%E4%BF%9D%E5%AD%98%E4%BD%A0%E5%96%9C%E7%88%B1%E7%9A%84%E8%A7%86%E9%A2%91/","title":"从网页视频到MP4：轻松使用M3U8下载器保存你喜爱的视频"},{"content":"项目地址 : https://github.com/sbwml/luci-app-alist\nOpenWrt 查看CPU架构命令：\ncat /etc/os-release |grep ARCH AList文档：https://alist.nn.ci/zh/\n下载插件: 点击下载\n视频教程\n","date":"2023-09-11T06:12:38Z","permalink":"https://blog.lufei.de/p/openwrt-n1-%E5%AE%89%E8%A3%85alist/","title":"openwrt n1 安装alist"},{"content":"注册入口\nhttps://developer.microsoft.com/zh-cn/microsoft-365/dev-program\n1T改成5T\nhttps://admin.onedrive.com/?v=StorageSettings\n添加新用户\nhttps://admin.microsoft.com/\n续签API设置\nhttps://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps\nE5续签软件下载\nhttps://e5renew.com/\n","date":"2023-09-10T07:51:37Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9%E7%99%BD%E5%AB%96office-365-e55tb-onedrive%E7%A9%BA%E9%97%B4/","title":"免费白嫖Office 365 E5，5TB onedrive空间！"},{"content":"其实 rclone 挂载 Google Drive 网上的教程已经很多了，但是大多数的教程都有一点点过时，与现在的实际操作有一点出入，故整理了当前的挂载操作，以防忘记。\n一、 安装并配置 rclone 首先在 vps 上一键安装 rclone：\ncurl https://rclone.org/install.sh | sudo bash 接下来在本地电脑上下载命令行操作的 rclone：\n访问 rclone 下载地址，选择您的操作系统下载相应的 zip 包并解压。一会需要用得着。\n软件准备好中，在 vps 上开始配置，执行：\nrclone config 选择 n，新建配置：\n此时 rclone 会要你选择要挂载什么网盘，找到 google drive 并选择。\n注意是 google drive，不是 google cloud 或 google photos。\n选择后 rclone 会要求输入 api token，如果留空会使用 rclone 默认的 api，但是据官方说明官方的目前使用人数过多，由于 google 本身的限制可能会出现需要等待时间过长的问题，因此推荐自己去申请一个 api。\n非常推荐使用自己的 API，可以大幅提升稳定性。\n申请 api 申请 api 并不复杂，也不一定要是需要被挂载的 google 账户操作，随意一个正常的 google 账户就可以。下面是申请的简单步骤：\n首先登录到 Google API console，创建一个应用，点击 “启用 API 和服务”，找到 Google Drive 并启用 启用 Google Drive API\n点击 OAuth 同意屏幕，用户类型选择外部，应用名称随便填写，比如 “rclone” 就可以。用户支持电子邮件和开发者联系邮箱都填写您自己的就可以，点击保存并继续，剩下的参数都是用默认就可以了。\n点击凭据，屏幕上方点击创建凭据，选择 OAuth 客户端 ID\n创建凭据选择\n应用类型选择桌面应用。\n应用类型选择\n名称随便填，点击创建。创建后会向您提供您的客户端 ID 和客户端密码，务必记下这些数据，并且填写到 rclone 中。\n最后选择 OAuth 同意屏幕，选择发布应用。此时应该能看到发布状态变为了正式版。\n发布状态\n至此 Google API 就申请完成了，继续返回到 rclone 中进行配置。\n填写 Google API 后，应该会看到如下显示：\nScope that rclone should use when requesting access from drive.Choose a number from below, or type in your own value.Press Enter to leave empty. 1 / Full access all files, excluding Application Data Folder. \\ (drive) 2 / Read-only access to file metadata and file contents. \\ (drive.readonly) / Access to files created by rclone only. 3 | These are visible in the drive website. | File authorization is revoked when the user deauthorizes the app. \\ (drive.file) / Allows read and write access to the Application Data folder. 4 | This is not visible in the drive website. \\ (drive.appfolder) / Allows read-only access to file metadata but 5 | does not allow any access to read or download file content. \\ (drive.metadata.readonly)\n这个可以根据需求选择，比如我要完整的访问权限，就选择 1。\n接下来\nroot_folder_id 为空，service_account_file 也为空，直接回车即可。\nEdit advanced config 输入 n，不需要进行额外的高级配置。\nUse auto config 因为是要在 vps 上挂载，vps 没有桌面环境，因此必须选择 n，进行远程配置。\n选择后会看见如下显示：\nOption config_token.For this to work, you will need rclone available on a machine that hasa web browser available.For more help and alternate methods see: https://rclone.org/remote_setup/Execute the following on the machine with the web browser (same rcloneversion recommended): rclone authorize \u0026quot;drive\u0026quot; \u0026quot;Your Token Code\u0026quot;Then paste the result.Enter a value.\n注意，接下来要在本地执行，前面下载在本地的 rclone 压缩包解压后，你应该能看到一个 rclone.exe，类似下图\nrclone 解压后\n打开终端，进入到此目录后执行 rclone authorize “drive” 这一行。\n如果不出意外，会自动打开浏览器进入到谷歌账号登录界面，此时一定要登录被挂载的谷歌账号，并选择同意授权。由于是新申请的 API，没有经过的谷歌的验证，所以谷歌会提醒该应用未经验证。但是左下角有一行小灰字，点击选择继续就能授权。\n授权成功浏览器会提示 success：\n授权成功\n此时返回命令行，等待几秒就能看见授权的 code 了。\n获取授权 code\n复制授权 code，输入到 rclone 中。\n接下来 rclone 会询问是否为团队盘：\nConfigure this as a Shared Drive (Team Drive)? y) Yesn) No (default) 如果您要挂载的就是团队盘，那么选择 y，不是的话就选择 n\n此时配置就已经结束了，退出 clone，开始挂载。\n二、 挂载 Google Drive 首先新建一个文件夹用于挂载：\nmkdir -p /home/google 开始挂载：\nrclone mount gdrive: /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; 其中 gdrive 是 rclone 配置时输入的配置名称，/home/google 是挂载目录，\u0026amp; 是指后台运行。\n此时可能会报错：\nFatal error: mount not ready 一般是因为缺少依赖导致的，我们选择安装\ncentos 系使用：\nyum install -y fuse fuse3 debian 系使用：\napt install -y fuse fuse3 再次执行挂载命令，如果没有报错，就是挂载成功了。\n检查挂载：\ndf -h 应该看到：\n挂载成功显示\n可以看到 /google 已经成功挂载了\n接下来进入 /google 进行一些简单的测试\ncd /google ls mkdir test rm -rf test 如果能够顺利执行，则说明挂载没有问题。\n","date":"2023-09-10T07:33:02Z","permalink":"https://blog.lufei.de/p/vps%E4%BD%BF%E7%94%A8rclone%E6%8C%82%E8%BD%BDgoogle-drive%E8%AF%A6%E7%BB%86%E8%AE%B0%E5%BD%95/","title":"vps使用rclone挂载Google Drive详细记录"},{"content":"之前写过一篇使用 rclone 挂载 Google Drive的记录，这次来补上挂载 onedrive 的坑。挂载方法其实大同小异，网上也有许多文章进行介绍。\n不过有些介绍实在是太简略了，甚至只是简单的复制了官方的示例，导致依旧看的一头雾水，所以我对 rclone 挂载 onedrive 的流程进行了整理和记录，希望能对大家有所帮助，能一次解决问题。\n1. 创建 OneDrive API 为了实际使用中更稳定的体验，避免因为共享 API 达到使用限制而引发错误，绝对推荐创建自己的 API。\n若要创建自己的 API，务必确保你的账号拥有 API 权限！\n1.1 获取 client_id 首先访问 Microsoft Azure 应用注册，登录账号后点击应用注册\n应用注册\n点击左上角的新注册\n新注册\n如图所示进行配置，名称可以随便写，账户类型选择第三项\n注册应用程序\n点击注册后可以看到你的应用的相关信息，复制好 应用程序 (客户端) ID ，这个就是 client_id\n获取 client_id\n1.2 获取 client_secret 依次点击证书和密码，新客户端密码，在截止期限中将时间选择为最长（即两年）\n创建新客户端密码\n然后就可以看见值和机密 ID，我们只需要记录下 值 就可以，这个就是 client_secret 。\n获取 client_secret\n1.3 添加 API 权限 依次点击 API 权限，添加权限，Microsoft Graph，在右边栏搜索并添加权限。\nFiles.Read,Files.ReadWrite,Files.Read.All,Files.ReadWrite.All,offline_access,User.Read这几项\n添加权限\n添加完成后应该是这样\nAPI 权限展示\n1.4 添加身份验证 依次点击身份验证，添加平台，Web\n添加身份验证, 在重定向 URI 中输入 http://localhost 设置重定向\n至此，OneDrive API 创建完成\n2. 添加 rclone 配置 注：由于 OneDrive 的授权 key 可能会很长导致 rclone 远程配置中无法接受 key，目前 rclone 没有解决这个问题，因此可能挂载过程中会出现问题，如果出现了下文描述的问题，请参考第三部分来解决。\n2.1 安装 rclone 由于 vps 中没有桌面环境，无法独立完成配置，所以 vps 和本地电脑都要安装 rclone。\nvps 中执行\ncurl https://rclone.org/install.sh | sudo bash 即可成功安装\n本地电脑请点此下载 rclone 并解压\n2.2 在 rclone 中配置 OneDrive 首先在 vps 中执行\nrclone config 初始状态下什么配置都没有，点击 n 创建一个新配置\n添加配置\n接着会让你填写一个名称，这个随意填，例如 od\n然后会要求选择要挂载的网盘，找到 Microsoft OneDrive 并输入其前面的序号31\n接下来会要求输入 client_id 和 client_secret ，将第一步中获取的值依次输入。\n地区按照你的账号选择，比如我的就是普通的全球账户，就选择 1\n填写信息\n接下来会让你选择你是否有桌面环境，因为 vps 环境下没有桌面环境，因此选择 N 。\n输入后会看到一段提示，将红框内这段命令复制到本地的电脑执行。\n填写信息 2\n现在在本地打开命令行，进入到 rclone 所在的文件夹内，粘贴上面的命令并执行\n不出意外的话，会弹出浏览器窗口让你登录并授权，按要求操作即可。\n操作完成后，会看到成功的提示\n成功授权\n此时回到本地的命令行查看，会发现出现了一段授权 code，复制这段 code 并粘贴回 vps。\n注：如果成功看到下一步操作，请忽略第三节并继续配置，如果出现以下错误，不要担心，请按照第三节的方法操作。\n如果遇到类似下图的错误：\nCouldn\u0026#39;t decode response - try again (make sure you are using a matching version of rclone on both sides: invalid character \u0026#39;e\u0026#39; looking for beginning of value rclone 的 bug\n则按照第三节的处理。\n接下来会选择使用哪种类型的账户，我使用的是 OneDrive，故选择 1\n选择账户类型\n选择 drive\n选择 drive\n结束！请看第四节挂载。\n3. 挂载失败的解决方法 其实解决这个问题我们要使用的就是最简单粗暴的方式，没错：在本地配置好，把配置文件复制过去！\n打开本地命令行并进入 rclone 目录下，按照类似于第二节的方式重新配置，只不过这次选择是否有桌面环境时选择 Y ，这样子登录账户授权后就会直接成功，不会出现之前的问题了。\n在本地成功添加配置后，在本地 rclone 目录下和远程 vps 分别执行\nrclone config file 这个获取到的是 rclone 配置文件的目录。现在，直接把本地配置完成的配置文件复制到 vps 上去！\n放心，这个配置文件在 vps 上也是能直接用的，复制完成后，在 vps 上执行\nrclone config 嗯，能看到你在本地添加的 OneDrive 配置就是没问题了。\n4. 挂载到 vps 首先新建一个文件夹用于挂载：\nmkdir -p /home/onedrive 开始挂载：\nrclone mount od: /home/onedrive --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; 其中 od 是 rclone 配置时输入的配置名称，/home/onedrive 是挂载目录，\u0026amp; 是指后台运行。\n此时可能会报错：\nFatal error: mount not ready 这是因为缺少依赖，我们选择安装\ncentos 系使用：\nyum install -y fuse3 debian 系使用：\napt install -y fuse3 再次执行挂载命令，如果没有报错，就是挂载成功了。\n检查挂载：\ndf -h 应该看到（我这里是用挂载名 song，挂载目录 /music 进行的测试截图）：\n挂载成功\n接下来可以进行一些测试，如果能正常读写文件，证明挂载没有问题。\n","date":"2023-09-10T05:17:27Z","permalink":"https://blog.lufei.de/p/vps%E5%88%A9%E5%89%91%E5%85%A8%E9%9D%A2%E8%A7%A3%E6%9E%90%E5%A6%82%E4%BD%95%E7%94%A8rclone%E6%8C%82%E8%BD%BDonedrive/","title":"VPS利剑！全面解析如何用rclone挂载OneDrive"},{"content":"Rclone 是一款的命令行工具，支持在不同对象存储、网盘间同步、上传、下载数据。\n官网网址：https://rclone.org/\nGithub 项目：https://github.com/rclone/rclone\n安装rclone 安装依赖如果你需要挂载使用\nsudo apt-get update sudo apt-get install curl unzip apt-get install fuse3 下载源码安装 wget --no-check-certificate \u0026#39;https://downloads.rclone.org/v1.52.3/rclone-v1.52.3-linux-amd64.zip\u0026#39; unzip rclone-v1.52.3-linux-amd64.zip cp ./rclone-*/rclone /usr/local/bin rm -rf ./rclone-* 官网脚本安装 curl https://rclone.org/install.sh | bash 配置rclone 在Linux或者Mac上完成安装之后，rclone会默认从配置文件~/.config/rclone/rclone.conf中获取rclone的配置。我们既可以通过rclone config命令来交互式修改这个配置，也可以直接编辑这个配置文件。\nmkdir -p /root/.config/rclone/ touch /root/.config/rclone/rclone.conf vim /root/.config/rclone/rclone.conf AWS S3的rclone配置\n[s3-overseas] type = s3 provider = AWS env_auth = false access_key_id = \u0026lt;your-aws-access-key-id\u0026gt; secret_access_key = \u0026lt;your-aws-secret-access-key\u0026gt; region = \u0026lt;your-region-id\u0026gt; acl = public-read endpoint = https://s3.\u0026lt;your-region-id\u0026gt;.amazonaws.com 配置参数详解\n[s3-overseas]: 定义该S3在本地的一个别名，后续执行命令时方便调用 type: 指定该配置的类型 provider: 存储的提供商，具体可参照官方文档 env_auth: 是否从环境变量中读取 access_key_id: 有权限操作bucket的 AK secret_access_key: 有权限操作bucket的 SK region: bucket所处的地区 acl: 上传的文件的权限 endpoint: bucket的加速地址 点击查看AWS加速节点 如果 env_auth 配置为 true , 可以避免在rclone.conf中写上AWS的key和secret，而是直接使用~/.aws/中的配置,也可以在运行rclone时，通过指定环境变量AWS_PROFILE=\u0026lt;your_profile_name\u0026gt;来使用某一个profile\nAli OSS的rclone配置 [oss-hwpf] type = s3 provider = Alibaba access_key_id = \u0026lt;your-ali-access-key-id\u0026gt; secret_access_key = \u0026lt;your-ali-secret-access-key\u0026gt; endpoint = oss-cn-hongkong.aliyuncs.com acl = public-read 点击查看阿里云OSS加速节点\ncloudflare r2的rclone配置 [r2] type = s3 provider = Cloudflare access_key_id = xxxx secret_access_key = xxxx region = auto endpoint = https://xxxx.r2.cloudflarestorage.com 腾讯云cos的rclone配置 [cos] type = s3 provider = TencentCOS access_key_id = xxxx secret_access_key = xxxx endpoint = cos.ap-guangzhou.myqcloud.com acl = default storage_class = STANDARD 命令参数 rclone config - 以控制会话的形式添加rclone的配置，配置保存在.rclone.conf文件中。 rclone copy - 将文件从源复制到目的地址，跳过已复制完成的。 rclone sync - 将源数据同步到目的地址，只更新目的地址的数据。 –dry-run标志来检查要复制、删除的数据 rclone move - 将源数据移动到目的地址。 rclone delete - 删除指定路径下的文件内容。 rclone purge - 清空指定路径下所有文件数据。 rclone mkdir - 创建一个新目录。 rclone rmdir - 删除空目录。 rclone check - 检查源和目的地址数据是否匹配。 rclone ls - 列出指定路径下所有的文件以及文件大小和路径。 rclone lsd - 列出指定路径下所有的目录/容器/桶。 rclone lsl - 列出指定路径下所有文件以及修改时间、文件大小和路径。 rclone md5sum - 为指定路径下的所有文件产生一个md5sum文件。 rclone sha1sum - 为指定路径下的所有文件产生一个sha1sum文件。 rclone size - 获取指定路径下，文件内容的总大小。. rclone version - 查看当前版本。 rclone cleanup - 清空remote。 rclone dedupe - 交互式查找重复文件，进行删除/重命名操作。 rclone mount - 挂载云盘为本地硬盘 fusermount -qzu LocalFolder - 卸载挂载的云盘 rclone常用操作 ls ### 显示远端bucket下的文件 rclone ls s3-overseas:bucket-name OUT: 106622 header.png ### 显示远端bucket下的目录 rclone lsd s3-overseas:bucket-name OUT: 0 2020-08-27 15:57:08 -1 new ### 以json形式列出bucket下的目录和文件 rclone lsjson s3-overseas:bucket-name OUT: [ OUT: {\u0026#34;Path\u0026#34;:\u0026#34;header.png\u0026#34;,\u0026#34;Name\u0026#34;:\u0026#34;header.png\u0026#34;,\u0026#34;Size\u0026#34;:106622,\u0026#34;MimeType\u0026#34;:\u0026#34;image/png\u0026#34;,\u0026#34;ModTime\u0026#34;:\u0026#34;2020-08-27T07:32:29.000000000Z\u0026#34;,\u0026#34;IsDir\u0026#34;:false,\u0026#34;Tier\u0026#34;:\u0026#34;STANDARD\u0026#34;}, OUT: {\u0026#34;Path\u0026#34;:\u0026#34;new\u0026#34;,\u0026#34;Name\u0026#34;:\u0026#34;new\u0026#34;,\u0026#34;Size\u0026#34;:0,\u0026#34;MimeType\u0026#34;:\u0026#34;inode/directory\u0026#34;,\u0026#34;ModTime\u0026#34;:\u0026#34;2020-08-27T16:02:42.413393904+08:00\u0026#34;,\u0026#34;IsDir\u0026#34;:true} OUT: ] ### 以json形式递归的列出bucket-name下目录和文件 rclone lsjson s3-overseas:bucket-name -R ### 查看存储桶中500B以上的文件列表 rclone --min-size 500B lsl s3-overseas:bucket-name sync ### 同步本地目录或文件到远端bucket rclone sync \u0026lt;LOCAL_PATH\u0026gt; s3-overseas:bucket-name/target-path/ ### 同步远端bucket目录到本地 rclone sync s3-overseas:bucket-name/target-path/ \u0026lt;LOCAL_PATH\u0026gt; ### 远端同步到远端 # S3直接同步到阿里的OSS rclone sync s3-overseas:bucket-name oss-hwpf:bucket-name ### 将本地文件同步到远端，并备份被删除或修改的文件到备份存储桶中 rclone sync \u0026lt;LOCAL_PATH\u0026gt; s3-overseas:bucket-name --backup-dir s3-overseas:backup-bucket-name/backup-dir sync操作，会删除目标端的目录或文件。执行前可以加 --dry-run参数查看将要删除的文件或目录\ncopy ### 拷贝本地文件到远端 rclone copy \u0026lt;LOCAL_PATH\u0026gt; s3-overseas:bucket-name/target-path/ ## 拷贝远端对象到本地 rclone copy s3-overseas:bucket-name/target-path/ \u0026lt;LOCAL_PATH\u0026gt; rclone copy --max-age 24h --progress --no-traverse \u0026lt;LOCAL_PATH\u0026gt; s3-overseas:bucket-name/target-path/ copy操作，不会删除目标端的任何文件\n\u0026ndash;max-age 24h: 过滤出来最近24小时变更过的文件\n\u0026ndash;progress: 显示进度 等同于 -P\n\u0026ndash;no-traverse: 从源拷贝少量文件到目的中大量目的文件时，速度会更快\nmkdir ### 创建新的bucket 需要AKSK有权限 rclone mkdir s3-overseas:new-bucket-name # 在AWS创建存储桶new-bucket-name ### 创建新目录 rclone mkdir s3-overseas:bucket-name/new-dir ### 不支持直接创建空目录则用下面命令 rclone touch s3-overseas:bucket-name/new-dir/emptyfile.txt delete ### 删除bucket根目录下的delete.file 如果`--include`不加路径，则递归删除所有该名字文件 rclone delete s3-overseas:bucket-name --include=/delete.file ### 删除bucket根目录下的所有文件包括子目录 rclone delete s3-overseas:bucket-name --include \u0026#34;*\u0026#34; check ### 对比本地文件和远端文件，默认校验修改时间和大小 rclone check \u0026lt;LOCAL_PATH\u0026gt; s3-overseas:bucket-name/target-path/ --one-way ### 进行数据对比校验 rclone check s3-overseas:bucket-name/target-path/ oss-hwpf:bucket-name/target-path/ -P 其他操作 挂载 gd: 谷歌云盘, r2: cloudflare, cos: 腾讯cos\nmkdir -p /home/google /home/r2 /home/cos rclone mount gd: /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; rclone mount r2: /home/r2 --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; rclone mount cos: /home/cos --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; 卸载 fusermount -qzu /home/google 常用命令 复制\nrclone copy /up gd:upload --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 同步\nrclone sync /up gd:upload --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 --drive-acknowledge-abuse 网盘到网盘同步 r2图床同步到谷歌云盘和腾讯cos\nrclone sync r2:blog gd:r2/blog --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 --drive-acknowledge-abuse rclone sync r2:blog cos:shenma-1253486782/blog --ignore-existing -u -v -P --transfers=15 --ignore-errors --buffer-size=64M --check-first --checkers=10 --drive-acknowledge-abuse 其他参数 rclone config - 进入交互式配置选项，进行添加、删除、管理网盘等操作。 rclone config paths - 显示配置文件的路径，一般配置文件在 ~/.config/rclone/rclone.conf，更换服务器可直接copy该文件。 rclone config show - 显示配置文件信息 可视化上传下载 RcloneBrowser https://github.com/kapitainsky/RcloneBrowser/releases\n配置 rclone.exe的路径还有 rclone.conf 配置文件的路径。\n配置好后就可以看见前面配置的 OneDrive 网盘了 ☁️\n双击打开就可以看见里面的内容了，可以去愉快的上传或者下载了\n上传的话，选择要上传的文件或文件夹以及云盘的存放路径，再选择 copy 模式，点击 run 即可。下载与之类似。\n在 Jobs当中还可以查看任务的进度、速度等\n另外还可以设置代理，见下图：\n这样挂载谷歌云端硬盘就很方便了。\n完结~~\n","date":"2023-09-10T03:58:40Z","permalink":"https://blog.lufei.de/p/rclone/","title":"极速上手：精通rclone云盘同步工具"},{"content":"rclone：常用命令 rclone config - 进入交互式配置选项，进行添加、删除、管理网盘等操作。 rclone config paths - 显示配置文件的路径，一般配置文件在 ~/.config/rclone/rclone.conf，更换服务器可直接copy该文件。 rclone config show - 显示配置文件信息 命令语法 # 本地到网盘 rclone [功能选项] \u0026lt;本地路径\u0026gt; \u0026lt;网盘名称:路径\u0026gt; [参数] [参数] ... # 网盘到本地 rclone [功能选项] \u0026lt;网盘名称:路径\u0026gt; \u0026lt;本地路径\u0026gt; [参数] [参数] ... # 网盘到网盘 rclone [功能选项] \u0026lt;网盘名称:路径\u0026gt; \u0026lt;网盘名称:路径\u0026gt; [参数] [参数] ... 用法示例: 建议添加 --drive-acknowledge-abuse 来处理被Google Drive标识为恶意软件的文件\n复制: rclone copy\nrclone copy /up gd:upload --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 同步: rclone sync 添加 --drive-acknowledge-abuse参数\nrclone sync /up gd:upload --ignore-existing -u -v -P --transfers=10 --ignore-errors --buffer-size=16M --check-first --checkers=10 --drive-acknowledge-abuse 以下是对每个参数的解释：\nrclone copy 为功能选项, 即复制\n/up: 本地路径，表示要复制的文件或目录的位置。\ngd:upload: 这是目标路径，gd是网盘名称,upload是网盘路径,表示要将文件或目录复制到的位置。\n--ignore-existing: 这是一个选项，指示rclone在复制文件时忽略已经存在于目标位置的文件，即不覆盖已存在的文件，仅复制源中不存在于目标位置的文件。\n-u（或 --update）: 这是一个选项，指示rclone仅复制源中新于目标的文件或文件夹。如果目标上已有相同文件名但内容不同的文件，它不会被覆盖。\n-v（或 --verbose）: 这是一个选项，用于启用详细的输出，显示更多有关操作进展的信息。\n-P（或 --progress）: 这是一个选项，用于显示传输进度，包括已传输的数据量和传输速度等信息。\n--transfers=10: 这是一个选项，指示rclone一次并发执行最多10个文件传输操作。这可以加快复制速度。\n--ignore-errors: 这是一个选项，指示rclone在遇到错误时继续进行操作而不中断。如果某些文件无法复制，它会继续复制其他文件，而不会停止整个操作。\n--buffer-size=16M: 这是一个选项，用于指定rclone在内存中使用的缓冲区大小，以提高性能。\n--check-first: 这是一个选项，指示rclone在实际开始复制操作之前，首先检查源和目标之间的差异。这可以节省不必要的复制操作。\n--checkers=10: 这是一个选项，用于指定rclone在进行检查（check）操作时并发执行的检查器数量。这可以加快检查操作的速度。\n--drive-acknowledge-abuse 标志来处理恶意文件.\n综合起来，这个命令的目标是从源路径 /up 复制文件或目录到目标路径 gd:upload，在复制过程中忽略已存在的文件，仅复制新的或不同的文件，同时提供详细的进度信息，最多同时进行10个文件传输，忽略复制中的错误，使用16MB的缓冲区大小，并在复制之前检查源和目标之间的差异。\n常用功能选项 rclone copy - 复制 rclone move - 移动，如果要在移动后删除空源目录，请加上 --delete-empty-src-dirs 参数 rclone sync - 同步：将源目录同步到目标目录，只更改目标目录。 rclone delete - 删除路径下的文件内容。 rclone purge - 删除路径及其所有文件内容。 rclone mkdir - 创建目录。 rclone rmdir - 删除目录。 rclone rmdirs - 删除指定灵境下的空目录。如果加上 --leave-root 参数，则不会删除根目录。 rclone check - 检查源和目的地址数据是否匹配。 rclone ls - 列出指定路径下的所有的文件以及文件大小和路径。 rclone lsl - 比上面多一个显示上传时间。 rclone lsd 列出指定路径下的目录 rclone lsf - 列出指定路径下的目录和文件 常用参数 -n = --dry-run - 测试运行，用来查看 rclone 在实际运行中会进行哪些操作。 -P = --progress - 显示实时传输进度。 --cache-chunk-size SizeSuffi - 块的大小，默认 5M，理论上是越大上传速度越快，同时占用内存也越多。如果设置得太大，可能会导致进程中断。 --cache-chunk-total-size SizeSuffix - 块可以在本地磁盘上占用的总大小，默认 10G。 --transfers=N - 并行文件数，默认为 4。在比较小的内存的 VPS 上建议调小这个参数，比如 128M 的小鸡上使用建议设置为 1。 --config string - 指定配置文件路径，string 为配置文件路径。比如在使用宝塔面板输入命令操作时可能会遇到找不到配置文件的问题，这时就需要指定配置文件路径。 日志 rclone 有 4 个级别的日志记录，ERROR，NOTICE，INFO 和 DEBUG。\n默认情况下，rclone 将生成 ERROR 和 NOTICE 级别消息。\n-q rclone 将仅生成 ERROR 消息。 -v rclone 将生成 ERROR，NOTICE 和 INFO 消息，推荐此项。 -vv rclone 将生成 ERROR，NOTICE，INFO 和 DEBUG 消息。 --log-level LEVEL 标志控制日志级别。 输出日志到文件\n使用 \u0026ndash;log-file=FILE 选项，rclone 会将 Error，Info 和 Debug 消息以及标准错误重定向到 FILE，这里的 FILE 是你指定的日志文件路径。\n另一种方法是使用系统的指向命令，比如：\nrclone sync -v Onedrive:/DRIVEX Gdrive:/DRIVEX \u0026gt; \u0026#34;~/DRIVEX.log\u0026#34; 2\u0026gt;\u0026amp;1 文件过滤 --exclude 排除文件或目录。比如 --exclude *.bak，排除所有 bak 文件。 --include 包含文件或目录。比如 --include *.{png,jpg} ，包含所有 png 和 jpg 文件，排除其他文件。 --delete-excluded 删除排除的文件。需配合过滤参数使用，否则无效。 目录过滤 --exclude .git/ 排除所有目录下的 .git 目录。 --exclude /.git/ 只排除根目录下的 .git 目录。 以/开头只会匹配根目录，而如果没有，则是匹配所目录。同样适用于文件。\n文件大小过滤\n默认大小单位为 kBytes ，但可以使用 k ，M 或 G 后缀。\n--min-size 过滤小于指定大小的文件。比如 --min-size 50 表示不会传输小于 50k 的文件。 --max-size 过滤大于指定大小的文件。比如 --max-size 1G 表示不会传输大于 1G 的文件。 文件过滤规则\n--filter-from \u0026lt;规则文件\u0026gt; 从文件添加包含 / 排除规则。比如 --filter-from filter-file.txt。 过滤规则文件示例：\n- secret*.jpg + *.jpg + *.png + file2.avi - /dir/Trash/** + /dir/** - * 是包含，- 是排除 这里只举例比较常用和简单的一些过滤用法，更复杂和高端的用法可以查看官方文档。\nGoogleDrive网盘挂载到云主机/VPS上 新建一个你要挂载的目录，例如挂载到 /home/google\nmkdir -p /home/google 再执行挂载命令：\nrclone mount gd: /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; gd 为 rclone 的配置名称，比如你在创建配置 rclone 的时候 Name 填的 gd，/home/google 为本地路径；\n这里还可以自定义设置网盘里的文件夹路径，例如：\nrclone mount gd:backup /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; gd 为 rclone 的配置名称：backup 为网盘里的目录名\n重连后查看是否挂载成功：\ndf -h 有看到gd硬盘、使用量和本地主机路径即成功挂载\ngd: 15G 1.1M 15G 1% /home/gdrive 卸载 Google Drive 磁盘\nfusermount -qzu /home/google ","date":"2023-09-09T06:51:26Z","permalink":"https://blog.lufei.de/p/rclone%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3/","title":"rclone常用命令参数详解"},{"content":"随着GitHub被微软收购后，私人仓库已经变得免费，为我们提供了一个无限的创造空间。现在，我们可以尽情发挥其潜力，将其用于定时备份网站和服务器重要数据，确保数据安全与可靠性。\n教程 首先你肯定需要一个Github账号，没有的可以去注册一个，地址：https://github.com。有了账号就继续看。\n1、配置Git SSH密钥 由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的，所以必须要让github仓库认证你SSH key，在操作之前，需要先在服务器上生成SSH key。\n设置github 用户名和邮箱\ngit config --global user.name \u0026#34;name\u0026#34; git config --global user.email \u0026#34;xxxx@qq.com\u0026#34; 我们先去根目录下使用命令：\ncd ~ ssh-keygen -t rsa 这里会要你命名密钥名称(建议使用默认名称)，然后连续按几次Enter，这时候会在/root/.ssh文件夹生成2个ssh密钥，然后我们查看公钥id_rsa.pub。\ncat ~/.ssh/id_rsa.pub 查看后，再复制下公钥 打开Github官网，进入https://github.com/settings/ssh/new， Title随意，然后Key填入刚刚复制的公钥，最后点击Add SSH Key添加即可。 2、建立私人仓库 我们需要先访问https://github.com/new，新建一个仓库用来存放备份文件，名称自己随意，记得下面一定要勾选Private，也就是私人仓库。\n3、配置本地仓库 进入需要备份的文件夹，比如/www/wwwroot/lala，也就是把该文件夹设定为本地仓库，使用命令：\n#进入需要备份的文件夹 cd /www/wwwroot/lala #初始化你的github仓库 git init #关联到远程github仓库 git remote add origin git@github.com:Blichus/back_website.git 如果已经备份过了,拉取github仓库代码到服务器 (关联远程github仓库后)\ngit pull origin master 4、初次备份 #进入备份的文件夹 cd /www/wwwroot/lala #把目录下所有文件更改状况提交到暂存区，包括增，删，改。 git add -A #提交更改的说明，说明随意了，这里为backsite git commit -m \u0026#34;backsite\u0026#34; #开始推送到Github git push -u origin master 推送的时候可能会警告提示:\nThe authenticity of host 'github.com' can't be established.\nAre you sure you want to continue connecting (yes/no/[fingerprint])? 直进yes即可。 然后可以看到仓库的备份文件了。\n5、设置定时备份 在根目录先新建一个bash脚本：\nnano ~/gitback.sh 代码如下：\n#!/bin/bash #进入到网站根目录，记得修改为自己的站点 cd /www/wwwroot/lala #将数据库导入到该目录 mysqldump -uaaa -pbbb ccc \u0026gt; dddd.sql # 把目录下所有文件更改状况提交到暂存区，包括增，删，改。 git add -A # 提交更改的说明，说明随意了，这里为backsite git commit -m \u0026#34;backsite\u0026#34; # 开始推送到Github git push -u origin master -uaaa 注意:前面带 -u 后面的aaa为数据库用户名,通常是root -pbbb 后面的bbb为数据库密码 ccc 为数据库名称 dddd 为备份的数据库文件 然后编辑好了后，使用ctrl+x，y保存,回车退出。\n给与权限: chmod 777 gitback.sh\n再测试下脚本，使用命令\nbash ~/gitback.sh 脚本没问题的话，再设置为每天05:15执行一次：\n#并将运行日志输出到根目录的siteback.log文件 echo \u0026#34;15 05 * * * bash ~/gitback.sh \u0026gt; ~/siteback.log 2\u0026gt;\u0026amp;1 \u0026amp;\u0026#34; \u0026gt; bt.cron crontab bt.cron rm -rf bt.cron 如果使用的是宝塔面板,直接计划任务里添加shell脚本\nbash ~/gitback.sh 最后使用crontab -l命令查看添加成功没。成功的话，就基本上算完成了。\n如果你将本地文件夹推送到Github失败的话，常见原因有2种，具体如下。\n6、其他问题 1、邮件问题 报错提示：Your push would publish a private email address.\n这里可能是你将你的邮件地址私密了，解决方法如下：\n方法一\n如果你想一直保持私密，可以选择方法二\n访问https://github.com/settings/emails，将Keep my email address private的勾去掉。\n方法二\n1、访问https://github.com/settings/emails，将Block command line pushes that expose my email的勾去掉。\n2、设置你的github邮箱，修改成自己的再运行命令：\ngit config --global user.email \u0026#34;admin@moerats.com\u0026#34; 2、密钥问题 报错提示：Permission denied (publickey).\n大概的原因就是，你设置密钥的时候改成了其它名称，而ssh默认只读取id_rsa，所以会显示没权限。解决方法如下：\n方法一:\n进入根目录的.ssh文件夹，将你的github密钥文件，重新更名为id_rsa。\n方法二:\n将github密钥添加到ssh agent，比如密匙名称为github，使用命令：\nssh-agent bash ssh-add ~/.ssh/github 3、mysql command not found crontab定时任务中提示command not found解决方案\n写了个脚本定时从MySQL中提取数据，但是crontab发邮件提示mysql command not found\n很奇怪，因为直接执行此脚本不会报错，正常运行，但加入到crontab中就会报错，\n经查，MySQL不在crontab执行的环境变量中\n解决方案：\n找到MySQL的安装路径： which mysql\n假设找到的是:/home/user1/mysql/bin/mysql 建立软连接 cd /usr/bin \u0026amp;\u0026amp; ln -fs /home/user1/mysql/bin/mysql mysql\n完结撒花~~~\n","date":"2023-09-05T14:32:24Z","permalink":"https://blog.lufei.de/p/%E5%88%A9%E7%94%A8%E5%85%8D%E8%B4%B9github%E7%A7%81%E4%BA%BA%E4%BB%93%E5%BA%93%E5%AE%9A%E6%97%B6%E5%A4%87%E4%BB%BD%E7%BD%91%E7%AB%99%E6%95%B0%E6%8D%AE/","title":"利用免费GitHub私人仓库：定时备份网站数据"},{"content":"前言 去年之前，我写博客时并未意识到需要对图片进行压缩。有时，文章加载的图片太多，其中一些图片过大，导致浏览体验不佳。但后来，我开始使用Squoosh项目，每次写文章都会压缩配图。主要是因为Squoosh太出色了，而且还是免费软件。\n去年，我制作了一个Squoosh的Docker镜像，可以在本地轻松启动一个图片压缩服务。但当时，我每次都是逐张压缩图片，因为我要为每张图片调整质量，以确保它们在本地存储中具有适当的大小。我自己搭建的图床运行在本地，使用本地SSD进行存储，所以之前的做法也很正常。然而，这次需要批量压缩大量图片让我意识到了批量处理的重要性。尽管可能无法完美平衡图片压缩后的质量和存储大小，但在博客写作（关注图片质量）和本地存储之间做出一些妥协后，带来了极大的轻松和满足感，这绝对是值得的。\n正文 下面我讲讲如何使用 squoosh-cli 进行图片的批量压缩，之所以推荐在自建的 docker 容器中运行 squoosh-cli 命令，是因为容器里是 Linux 环境，命令行友好，不像 cmd 和 powershell 可能需要各种转义，引号，还有通配符问题。\n新建一个专用压缩文件夹 mkdir -p /home/dk/squooshfiles chmod -R 0755 /home/dk/squooshfiles 下面启动 squoosh 容器，命令如下 docker run -d --name squoosh \\ --restart unless-stopped \\ -p 7701:8080 \\ -v /home/dk/squooshfiles:/app/squooshfiles \\ dko0/squoosh:1.12.0 解析：\n/home/dk/squooshfiles本地批量压缩图片文件夹 这将在容器中自动创建目录 /app/squooshfiles 本地对 /home/dk/squooshfiles 的修改和容器中对 /app/squooshfiles 的修改将完全同步 注意: 下面的步骤都是在容器中进行操作\n然后进入容器 docker exec -it squoosh ash 安装 squoosh-cli npm 包 npm i -g @squoosh/cli 安装完成之后执行 squoosh-cli --help 应能获取命令行帮助。\n进入压缩目录,然后创建一个文件夹,例如 0805 cd .. \u0026amp;\u0026amp; cd squooshfiles mkdir 0805 \u0026amp;\u0026amp; cd 0805 把要批量压缩的照片拷贝到0805目录\n最后使用 squoosh-cli 命令执行批量压缩 squoosh-cli --mozjpeg \u0026#39;{\u0026#34;quality\u0026#34;:40,\u0026#34;baseline\u0026#34;:false,\u0026#34;arithmetic\u0026#34;:false,\u0026#34;progressive\u0026#34;:true,\u0026#34;optimize_coding\u0026#34;:true,\u0026#34;smoothing\u0026#34;:0,\u0026#34;color_space\u0026#34;:3,\u0026#34;quant_table\u0026#34;:3,\u0026#34;trellis_multipass\u0026#34;:false,\u0026#34;trellis_opt_zero\u0026#34;:false,\u0026#34;trellis_opt_table\u0026#34;:false,\u0026#34;trellis_loops\u0026#34;:1,\u0026#34;auto_subsample\u0026#34;:true,\u0026#34;chroma_subsample\u0026#34;:2,\u0026#34;separate_chroma_quality\u0026#34;:false,\u0026#34;chroma_quality\u0026#34;:75}\u0026#39; \\ -d output1 \\ -s small \\ *.jpg 解释\nmozjpeg 是最常用的压缩算法了，综合来说最推荐。 quality 就是压缩质量了，在网页端可以直接预览压缩后的效果 -d 设置输出目录 -s 设置一个输出的文件名后缀，默认是空字符串 *.jpg 只压缩当前目录下的所有 jpg 扩展名图片 批量压缩成功。\n最后感谢 squoosh 项目，写博客压缩图片利器，完全免费开源，非常推荐各位博主使用。\nsquoosh cli npm package: https://www.npmjs.com/package/@squoosh/cli squoosh cli: https://github.com/GoogleChromeLabs/squoosh/tree/dev/cli 一个重要的插曲，解决报错 TypeError: Cannot read properties of undefined (reading \u0026lsquo;writeText\u0026rsquo;)\n这是 Chrome 限制了非安全网站的 API 使用，在非安全网站上 block 了 navigator.clipboard 的 api 使用权限，所以无法拷贝 npx 命令出来。下面解决这个问题。\nopen chrome，type chrome://flags/ in address bar, then find item Insecure origins treated as secure, type http://10.10.10.5:7701 then enable it and relaunch your chrome.\nChrome 在此处认为的安全的网站\n必须 https 或 localhost 或 127.0.0.1 所以我们有必要加个白名单，这样好操作。\nhttp://10.10.10.5:7701 是我 squoosh 的运行环境地址。如果有多个地址需要设“白名单”，使用英文逗号隔开它们即可。\n","date":"2023-09-05T04:47:54Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8-squoosh-cli-%E6%89%B9%E9%87%8F%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87/","title":"使用 squoosh-cli 批量压缩图片"},{"content":"前言 早期，我一直对Clash的工作原理一知半解，只知道它是一种探索互联网世界的神奇工具。\n每次需要科学上网时，只需点击一下“系统代理”按钮，瞬间解决了各种无法访问网站的问题。\n久而久之，不免觉得这一过程有些繁琐：打开网站 —— 拒绝访问 —— 启动 Clash—— 开启系统代理 —— 完成。我曾经尝试简化这个步骤，最初的尝试是保持规则代理一直开启，通过配置文件来管理流量的转发规则。\n但不久后，我发现有些网站的规则并不适用，还是需要使用全局代理，这种方法有一定的限制，所以我放弃了这个想法。接着，我尝试设置全局快捷键，我选择了F2键，虽然效果还算可以，但每次都需要手动按下，稍显麻烦。正如大家都知道的，懒惰是发明创造的源泉，于是我孵化出了以下的终极解决方案。本文将完全解决以下令人烦恼的问题：\n访问网页需要手动开启 Clash 终端不走 Clash 流量 Git 也蹭不到 Clash 流量 准备工作 首先要准备 Clash 和节点，这是一个比较敏感的话题，所以本文不提供任何渠道。\n其次要知道 Clash 的端口号，默认是 7890，如果你先前没有进行更改的话。\n最后需要 Chrome 或 Edge 浏览器，同时能够访问拓展商店，找到并下载 SwitchyOmega（需要科学上网）\n配置 SwitchyOmega Clash 用户请按照以下进行配置。\n首先配置代理服务器，选择本机，也就是 127.0.0.1 ， 端口选择 7890，协议选择 socks5\n完事以后先点一下左边 ACTIONS 下面的 应用选项 来保存一下\n接下来在情景模式的 auto switch 中写入网上人家配置好的规则\n这里请开启 Clash 系统代理！要不然访问不了 GitHub ！\n规则列表格式选择 AutoProxy，规则列表网址填写\nhttps://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt 然后点击立即更新情景模式，规则列表正文自动刷新\n接下来的一步很关键：这里选择 Proxy，要不然开了跟没开一样\n同时，在浏览器插件中选择 auto switch 选项，这样就可以根据我们访问的网站自动切换代理，例如谷歌，YouTube 等\nClash 不需要开启系统代理了，只要在后台挂着就行，记得设置 Clash 为开机启动\n当然，别人写的规则肯定不可能百分百全覆盖，按照自己的需要把常用的网站写进规则里面就可以了。\n这里要提醒的是，有些国外网站，例如 YouTube.com，并不是简单的把他添加进规则里面就行，因为它本身还要引用例如 Googlevideo.com 这一类的 cdn，还要把 cdn 也添加进规则里面。这一步可以通过以下步骤来一键添加规则：\n找到所有未加载的资源\n一键添加规则\n设置 Git 代理 设置代理\ngit config --global http.proxy 127.0.0.1:7890 \u0026amp;\u0026amp; git config --global https.proxy 127.0.0.1:7890 取消代理\ngit config --global --unset http.proxy \u0026amp;\u0026amp; git config --global --unset https.proxy 查看代理\ngit config --global --get http.proxy \u0026amp;\u0026amp; git config --global --get ht git clone 时要使用 https 协议，因为设置的是 HTTPS 代理，所以使用 SSH 克隆还是很慢, 解决办法: 请看本站 # GitHub加速终极教程\n设置终端代理 Windows 用户可以跳过这里了，这边主要是针对 Linux 或 macOS 的终端进行设置\n我自己用的是 macOS，经常使用 homebrew 下载软件时要等半天，然后对我丢出一个 time out，此情景是何等的令人恼火。但是如果一昧的设置永久系统代理，那么下载某些国内软件时反而会变成 “减速器”，而且必然会浪费很多流量（流量用不完的随意）。所以这里使用一次性的方法设置代理，即代理只在当前终端窗口有效，如果关掉再开就失效了。\n编辑 zsh 配置文件\nvim ~/.zshrc 滑到最底下，按自己的需要写入以下内容：\n设置一次性代理\nalias proxy=\u0026#34;export http_proxy=http://127.0.0.1:7890;export https_proxy=http://127.0.0.1:7890;\u0026#34; 设置永久代理：\nexport http_proxy=http://127.0.0.1:7890 export https_proxy=http://127.0.0.1:7890 保存并退出，使用 source ~/.zshrc 刷新配置文件\n使用方法：如果设置的是一次性代理，那么在需要使用代理的指令前加上 proxy\n例如使用 homebrew 下载 qq 音乐：\nproxy brew install qqmusic 或者单独使用 proxy 一行命令开启代理，如果想关闭代理直接把当前终端窗口关掉就行，因为是一次性的\n当然，如果是永久代理就需要手动注释掉添加的两行代码才能关闭代理 🤡\n","date":"2023-09-05T02:39:56Z","permalink":"https://blog.lufei.de/p/clash%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E7%9A%84%E7%A9%B6%E6%9E%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/","title":"Clash：科学上网的究极解决方案"},{"content":"本文意图解决使用 GitHub 访问(https) 或者 git clone（https or ssh）慢的问题。在此分享我的方法，我所了解的 GitHub 加速最佳方案。\n前提是，你的木弟子应该还行，木弟子越好，GitHub 体验越好\n很多文章没有讲全面，只讲了 http proxy，而没有讲 ssh proxy。事实上大部分程序员使用 GitHub 都会使用 SSH keys（普通用户可能就不会了），在本机生成 rsa 公私钥(其他的类型还有 dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk)，然后把公钥内容拷贝、设置进 GitHub。\n所以程序员 clone 一个仓库一般是 ssh clone 而不是 https clone\n1\ngit clone git@github.com:xxx/yyy.git\n如果你不配置 ssh 代理或者没有透明代理之类的网络环境（其实还有一些代理工具，不过更加小众），直接硬拖到本地大概率是很慢的。如果使用 http 代理，如果木弟子质量好，其实也还行\n1\ngit clone https://github.com/xxx/yyy.git\n但这样不如 ssh clone 稳定。下面我们来设置 http proxy 和 ssh proxy。\n设置 Http Proxy git config --global http.proxy socks5://127.0.0.1:7890 git config --global https.proxy socks5://127.0.0.1:7890 好了，说回来。但这样配置的话会使本机所有的 git 服务都走了代理，假如你在良心云上（国内主机）部署了自己的 gitea，服务地址 https://gitea.example.com，那么可以只配置 GitHub 的 http proxy，即\ngit config --global http.https://github.com.proxy socks5://127.0.0.1:7890 这样做实际上是修改了 ~/.gitconfig 文件，添加了如下内容\n[http \u0026#34;https://github.com\u0026#34;] proxy = socks5://127.0.0.1:7890 设置 SSH Proxy (推荐) 设置ssh代理,可加速 git clone SSH协议下载\nLinux \u0026amp; macOS 配置文件在用户家目录下的 .ssh/config 其中 nc 程序位于 /usr/bin/nc\ncat ~/.ssh/config Host github.com Hostname ssh.github.com IdentityFile /xxx/.ssh/github_id_rsa User git Port 443 ProxyCommand nc -v -x 127.0.0.1:7890 %h %p Windows Win 下与之对应的 netcat 程序是 connect.exe，程序位于 Git 安装路径 C:\\Program Files\\Git\\mingw64\\bin，win 下推荐使用 Git Bash，路径也是 Linux style\n因为 connect 程序内置在 Git 中，只要是正常安装 Git 的电脑环境都有这个程序，在 Git Bash 终端输入 connect 即可知晓程序路径在 C:\\Program Files\\Git\\mingw64\\bin\\connect.exe\n添加config文件\nnano ~/.ssh/config 配置:\nHost github.com Hostname ssh.github.com IdentityFile ~/.ssh/id_rsa User git Port 443 ProxyCommand \u0026#34;C:\\Program Files\\Git\\mingw64\\bin\\connect.exe\u0026#34; -S 127.0.0.1:7890 %h %p 按 Ctrl + O 保存文件，然后按 Ctrl + X 退出。\n现在，你的 Git 配置已经正确添加到 ~/.ssh/config 文件中，可以在 Bash 中使用 Git 时生效了。\n一键设置SSH Proxy (windows) 要使用 Bash 命令自动运行并保存上述 SSH 配置到 ~/.ssh/config 文件，你可以使用以下命令：\ncat \u0026lt;\u0026lt;EOL \u0026gt;\u0026gt; ~/.ssh/config Host github.com Hostname ssh.github.com IdentityFile ~/.ssh/id_rsa User git Port 443 ProxyCommand \u0026#34;C:\\Program Files\\Git\\mingw64\\bin\\connect.exe\u0026#34; -S 127.0.0.1:7890 %h %p EOL ","date":"2023-09-03T02:09:30Z","permalink":"https://blog.lufei.de/p/github%E5%8A%A0%E9%80%9F%E7%BB%88%E6%9E%81%E6%95%99%E7%A8%8B/","title":"GitHub加速终极教程"},{"content":"安装插件需要先安装盒子，安装插件，更新插件点击这里，新萌必看，不看必出错\n苹果cms盒子云端安装对接后支持在线一键安装苹果cms模板 目前云端安装仅支持苹果cmsv10免费模板，因云端数据存储无法管理的问题苹果cms8 收费模板以及插件不支持云端安装。\n为什么要安装盒子？\n盒子是一个管理插件的工具，它支持安装，数据库自动创建，卸载功能，可大大降低插件开发时间同时可以有序管理插件，一键干净卸载插件，不会造成苹果cms混乱影响苹果cms升级等问题，让你的苹果cms可以随意增加任何想要的功能无需担心修改苹果cms源文件影响到苹果cms正常使用。\n盒子下载地址：https://gouya.lanzouf.com/iGgeI07zodmh\nQQ群：792135526（群里名额有限随时清理潜水用户）\n安装苹果cms盒子方法： 1.下载到的盒子客户端压缩包内拥有一个application文件夹，直接上传到网站根目录中。\n2.添加苹果cms盒子快捷菜单：苹果cms盒子,macBox/stylelist（参考下图）\n腾讯Gtimg图床插件优点： 免费，不限空间，安装插件后直接使用，支持封面同步，编辑视频图片上传。\n插件升级注意：\n该插件不提供升级包，如需升级卸载删除原先的插件重新安装新版本即可\n有人会担心图片失效了怎么办，其实很简单，吧图片全部清空重新采集一遍就行了，清空方法也简单，打开phpMyAdmin找到mac_vod表点击sql，输入sql语句：\nUPDATE mac_vod SET vod_pic =\u0026#39;\u0026#39;; 然后点击执行就可以清空所有图片，在然后重新采集一遍图片就好了。\n图床插件安装方法： 1.下载到的插件压缩包上传到addons目录中解压\n2.打开苹果cms盒子点击安装即可\n3.下载地址: https://gouya.lanzouy.com/igtxi0bnaqhi\n使用教程：\n最新更新需要腾讯图床需要提供token，例如下面部分\nuserid=68552314;omaccesstoken=001fceb42ca1d843edf1066170a2a2bc5d9788a63587b8419549426a6b40c2052799417defb079f6a54b391efbb481e3f5da50123896b210607ba3f2e8fb6cf08cnv;omtoken=001fceb42ca1d843edf1066172a2bc5d9788a63587b82195461536a6b40c2052766417defb079f6a54b391efbb481e3f5da506d896db210607ba3f2e8fb6cf08cnv; token需要自己登录腾讯开放平台，然后登录一个账号刷新网页F12查看\n1.安装并启用插件\n2.参考下图切换至腾讯图床并且填写token\n注意：因腾讯对于图床调整全部增加了防盗链，因此使用腾讯图床需要接触防盗，下面提供两种方法\n1.（推荐方法）编辑模板在头部增加位置\n\u0026lt;meta name=\u0026#34;referrer\u0026#34; content=\u0026#34;never\u0026#34;/\u0026gt; 参考下图\n插件更新方法： 一般有插件开发者提供更新包替换，涉及到收费问题暂时不支持在线升级功能。\n4.0升级内容：\n1.移除模板相关代码\n2.移除SG11加密组件，无需在安装加密组件了，直接使用即可\n3.移除不使用的代码\n注：因苹果cms版本问题可能出现兼容，点击安装，启用，卸载没反应，如果遇到这种问题刷新一下即可。\n","date":"2023-09-01T14:54:09Z","permalink":"https://blog.lufei.de/p/%E8%85%BE%E8%AE%AFgtimg%E5%9B%BE%E5%BA%8A-%E8%8B%B9%E6%9E%9Ccms%E6%95%99%E7%A8%8B/","title":"腾讯Gtimg图床-苹果cms教程"},{"content":"1、FreeRDP：完全免费的远程桌面管理工具。通过它可以轻松实现 macOS 或 Linux 远程操作 Windows 桌面系统反之亦可，使用起来十分方便和流畅。\n【开源软件】\n2、min：一款最小化的浏览器。它是仅包含搜索、书签、密码管理、广告屏蔽器等最基础功能的极简浏览器，适用于 Windows、Linux、macOS 操作系统。\n【开源软件】\n3.wechat-backup：本地备份微信聊天记录的工具。它能够将手机上的微信聊天记录，解密后保存在电脑上，支持查看、搜索、恢复微信聊天记录。\n【开源软件】\n4、ServerStatus：多服务器云监控。轻松监控多台服务器状态的工具，用于解决多个不同平台下的服务器状态监控问题\n【开源软件】\n5.vanblog：实用的一站式个人博客系统。一款简洁优雅的博客系统，追求极致响应速度和博客体验。快到极致的响应速度，Lighthouse 接近满分。前后台均为响应式，支持 Docker 一键部署。前台为静态页面并支持增量渲染，按需构建更新页面。拒绝花里胡哨的功能，专注于个人博客场景。\n【开源软件】\n不同的【安装方式】\n6.TowerDefense-GameFramework-Demo：开源的塔防游戏示例。此项目主要用来上手和学习基于 Unity 引擎的游戏框架 GameFramework，感兴趣的同学可以把玩一下。游戏共有五个关卡，玩家通过击杀敌人和建造能量塔获取资源，消耗能量建造防御塔阻止敌人攻击基地\n【开源软件】\n7.nightingale：开源的云原生监控系统。支持 Docker 等多种部署方式，集数据采集、监控告警、可视化为一体的企业级监控平台。借助高性能时序库，可以满足数亿时间线的采集、存储和告警分析的场景。该项目已在上千家企业部署落地，经历了各种生产环境的检验。\n【开源软件】\n8.ghidra：一款免费开源的软件逆向分析工具。该项目由美国国安局开源，可用于分析编译后的代码。\n【开源软件】\n9.HackBrowserData：一款浏览器数据导出工具。能够导出本地浏览器的密码、历史记录、Cookie、书签、下载记录、localStorage 等数据的命令行工具，支持多平台下的多种主流浏览器。\n【开源软件】\n","date":"2023-08-31T15:29:34Z","permalink":"https://blog.lufei.de/p/9%E6%AC%BE%E9%AB%98%E6%95%88%E5%AE%9E%E7%94%A8%E5%8F%88%E9%9D%9E%E5%B8%B8%E6%9C%89%E8%B6%A3%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%AE%8C%E5%85%A8%E5%85%8D%E8%B4%B9%E5%BC%80%E6%BA%90/","title":"9款高效实用又非常有趣的软件！完全免费开源！！"},{"content":" 上个月 30 日，Google Cloud 在其博客发表文章 Automate Public Certificates Lifecycle Management via RFC 8555 (ACME) 发布了测试版的自动化公共 CA 管理程序。\n简而言之就是 Google 也开放了类似于 Let’s Encrypt 的免费证书申请。并且和 Google 各项服务使用相同的根证书。\n优劣分析 可以设置颁发证书的有效期；（最长 90 天） 支持多域名及通配符；（与 Let’s Encrypt 相同） 仅支持 DNS 验证和文件验证，不支持邮件验证；（与 Let’s Encrypt 相同） 支持 IP 地址，但是仅允许该 IP 地址块的所有者进行验证；（Let’s Encrypt 暂不支持） 不支持 IDN (International Domain Name, 国际化域名，使用 Punycode 进行编码，形如 xn–1.xn–2).（Let’s Encrypt 已经支持） 目前签发的证书，即使选择 ECC 类型，证书链的中级证书也是 RSA 的（Let’s Encrypt 已经支持全链 ECC） ocsp.pki.goog 有国内节点，访客体验还是很不错的。 目前有 DNSSEC CAA 问题，在 DNSPod 添加了 DNSSEC 的用户请暂缓申请 申请方法 申请 GOOGLE 域名 API 登录 google 账号后，进入下面链接\nhttps://cloud.google.com/sdk/gcloud/reference/publicca?hl=zh-cn\n单击右上角的“激活 Cloud Shell”，打开Cloud Shell\n然后在在 Cloud Shell 输入\ngcloud publicca external-account-keys create 要等待一会才会返回 keyid 和 b64mackey，不行就多输入几次\nCreated an external account key [b64MacKey: xxxxxxxxxxxxxxxxxxx keyId: xxxxxxxxxxxx] 保存好keyId和b64MacKey\n安装 acme.sh 如果已经安装请忽略这步\ncurl https://get.acme.sh | sh -s email=你的邮箱 或者\nwget -O - https://get.acme.sh | sh -s email=你的邮箱 若后面出现 command not found，则需要手动执行以下命令：\nsource ~/.bashrc Acme.sh 默认生成 Let’s Encrypt R3 证书，我们需要修改一下让它默认生成 google 证书\nacme.sh --set-default-ca --server google 申请 google 证书 获取申请 google 证书的资格\n~/.acme.sh/acme.sh --register-account --server google \\ --eab-kid \u0026#34;xxxxx\u0026#34; \\ --eab-hmac-key \u0026#34;xxxxx\u0026#34; eab-kid 为申请到的谷歌 keyId\neab-hmac-key 申请到的 b64MacKey\n注意: API 获取的凭证应该是只能使用一次，重新获取 API 凭证之后可以成功注册（更新：每台服务器都需要单独的凭证注册一次，之后的签发则不再需要）。\n签发证书 acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.\nhttp 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了. acme.sh --issue -d mydomain.com --webroot /home/wwwroot/mydomain.com/ 只需要指定域名, 例如: mydomain.com 多个可以后面再加 -d www.mydomain.com\n并指定域名所在的网站根目录, 例如: /home/wwwroot/mydomain.com/\nacme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.\n查看已证书安装信息 acme.sh --info -d example.com 选择默认 CA 目前 acme.sh 支持 5 个正式环境 CA，分别是 Let\u0026rsquo;s Encrypt、Buypass、ZeroSSL、SSL.com和 Google Public CA，默认使用 ZeroSSL，如果需要更换可以使用如下命令：\n切换 Let\u0026rsquo;s Encrypt\nacme.sh --set-default-ca --server letsencrypt 切换 Buypass\nacme.sh --set-default-ca --server buypass 切换 ZeroSSL\nacme.sh --set-default-ca --server zerossl 切换 SSL.com\nacme.sh --set-default-ca --server ssl.com 切换 Google Public CA\nacme.sh --set-default-ca --server google 如果已有 ZeroSSL 帐号，可以在后台控制面板拿到 API Key，然后执行如下命令\napt install jq curl -s -X POST \u0026#34;https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key\u0026#34; | jq 终端会输出如下内容\n{ \u0026#34;success\u0026#34;: true, \u0026#34;eab_kid\u0026#34;: \u0026#34;kid字符串\u0026#34;, \u0026#34;eab_hmac_key\u0026#34;: \u0026#34;hmac_key字符串\u0026#34;, } 然后手工添加帐号\nacme.sh --register-account --server zerossl \\ --eab-kid kid字符串 \\ --eab-hmac-key hmac_key字符串 Google Public CA 需要按照官方博客申请内测，然后获取 Key。\n几个 CA 的简单对比\n功能 LE Buypass ZeroSSL SSL.com Google Public CA 有效期 90 天 180 天 90 天 90 天 90 天 多域名 支持 支持，最多 5 个 支持 收费支持 支持 泛域名 支持 不支持 支持 收费支持 支持 Rate Limit 有 有 收费无 未知 有 GUI 管理 否 否 有 有 无 ECC 证书链 否 否 有 未知 无 客户支持 社区 收费 收费 收费 收费 简单来说，如果没有特殊需求，可以选择 Let\u0026rsquo;s Encrypt，如果服务器在国内，可以选择 ZeroSSL 或 Buypass，如果愿意付费得到更好的服务和保障，可以选择 ZeroSSL 和 SSL.com，如果面向欧盟用户，可以选择 Buypass 和 ZeroSSL。\n注意：经过测试 Google Public CA 的 ACME 验证域名在国内是无法访问的，只有国外服务器才可以申请，申请完成后的证书并无影响。\n使用 HTTP 验证签发证书 我们以 Let\u0026rsquo;s Encrypt 为例，直接在终端运行\nacme.sh --issue -d example.com -w /var/www/letsencrypt 如果希望签发 ECC 证书，则运行\nacme.sh --issue -d example.com --keylength ec-256 -w /var/www/letsencrypt 如果需要多个域名，则运行\nacme.sh --issue -d example.com -d example.org -w /var/www/letsencrypt 然后就等他执行完，直到出现 Cert success 的提示\n然后我们可以安装证书\nNginx\nacme.sh --install-cert -d example.com \\ --key-file /etc/nginx/ssl/example.com.key \\ --fullchain-file /etc/nginx/ssl/example.com.crt \\ --ca-file /etc/nginx/ssl/example.com.ca.crt \\ --reloadcmd \u0026#34;systemctl restart nginx\u0026#34; 对应的 Nginx 配置指定证书文件\nssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/example.com.ca.crt; Apache\nacme.sh --install-cert -d example.com \\ --key-file /etc/apache2/ssl/example.com.key \\ --fullchain-file /etc/apache2/ssl/example.com.crt \\ --ca-file /etc/apache2/ssl/example.com.ca.crt \\ --reloadcmd \u0026#34;curl https://ssl-config.mozilla.org/ffdhe2048.txt \u0026gt;\u0026gt; /etc/apache2/ssl/example.com.crt \u0026amp;\u0026amp; systemctl restart apache2\u0026#34; 对应的 Apache 配置指定证书文件\nSSLCertificateFile /etc/apache2/ssl/example.com.crt SSLCertificateKeyFile /etc/apache2/ssl/example.com.key 如果是 ECC 证书，则安装的时候需要带上 --ecc 参数，比如\nacme.sh --install-cert --ecc -d example.com \\ --key-file /etc/nginx/ssl/example.com.key \\ --fullchain-file /etc/nginx/ssl/example.com.crt \\ --ca-file /etc/nginx/ssl/example.com.ca.crt \\ --reloadcmd \u0026#34;systemctl restart nginx\u0026#34; 注意如果是多个域名，也仅需要在 -d 参数后面指定第一个域名即可。\n使用 DNS 验证签发证书 有时候因为不想暴露一些二级域名，或者希望在多台机器上部署同一个域名的证书，这时候就需要用到 DNS 插件了，acme.sh 支持几十种 DNS 插件。\n这里以 Cloudflare 为例，登录 Cloudflare Dash 后在 API Token 菜单里添加一个 API Token：\n然后选择 Edit Zone DNS 的模板\n选择你要编辑的域名，也可以加入你服务器的 IP 作为白名单\n完成后会给你一串字符，把他复制下来，需要填入下方的 CF_Token 参数\n然后进入域名的管理页面，在右侧 API 列找到 Account ID 和 Zone ID 并复制\n接着在终端运行\nexport CF_Token=\u0026#34;复制下来的 Token\u0026#34; export CF_Account_ID=\u0026#34;复制下来的 Account ID\u0026#34; export CF_Zone_ID=\u0026#34;复制下来的 Zone ID\u0026#34; 然后开启 acme.sh 的 DNS API 模式申请证书\nacme.sh --issue --dns dns_cf -d example.com -d *.example.com 如果是dns.la:\nexport LA_Id=\u0026#34;\u0026lt;appid\u0026gt;\u0026#34; export LA_Key=\u0026#34;\u0026lt;apikey\u0026gt;\u0026#34; acme.sh --issue --dns dns_la -d example.com -d *.example.com 安装证书方法同上，另外吐槽下，很多教程会让你用 Cloudflare 的全局 Global API Key，真的是，风险太大了，最后怎么被黑的都不知道 = =\n如果不想使用第三方的 DNS 服务完全可以自建 acme-dns 或者 PowerDNS，篇幅有限，我们之后再介绍。\n更新证书 目前证书在 60 天以后会自动更新，您无需进行任何操作。接下来可能会讲这个时间，但是都是自动的，你不用担心。\n请确保 cronjob 正确安装，看起来类似如下：\ncrontab -l 56 * * * * \u0026#34;/root/.acme.sh\u0026#34;/acme.sh --cron --home \u0026#34;/root/.acme.sh\u0026#34; \u0026gt; /dev/null 更新acme.sh 目前由于 acme 协议和 Letscrypt CA 都在关闭的更新，因此 acme.sh 也经常更新以保持同步。\n升级 acme.sh 到最新版本：\nacme.sh --upgrade 如果您不想手动升级，可以开启自动升级：\nacme.sh --upgrade --auto-upgrade 此后，acme.sh就会自动保持更新了。\n您也可以随时关闭自动更新：\nacme.sh --upgrade --auto-upgrade 0 官方文档 https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E\nhttps://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_cf\n","date":"2023-08-28T16:12:32Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8-acme.sh-%E7%94%B3%E8%AF%B7-google-%E7%9A%84%E5%85%8D%E8%B4%B9-ssl-%E8%AF%81%E4%B9%A6/","title":"使用 acme.sh 申请 Google 的免费 SSL 证书"},{"content":"\n1.Malware-Patch：阻止 Windows 流氓软体授权的工具。它轻巧、无需后台运行，可用于阻止指定软体的管理员授权。\n【开源项目】\n2.Rocket.Chat：一款可自由定制的企业级开源通信平台源码。用它来可以搭建一个功能丰富的通信平台，可自託管做为 Slack 的开源替代品。支持创建频道、团队和讨论等多种不同功能的群聊，消息支持图片、文件、视频和语音，拥有包括 Windows、Linux、macOS、Android 和 iOS 在内的多种客户端。 如果你需要搭建一个安全加密，且具有高度私密性的通信平台，那麽这款开源项目就非常适合你了。\n【开源项目】\n3.hackingtool：黑客工具全家桶。该项目收录了各种黑客工具，包括破解密码、SQL 注入、钓鱼攻击、XSS、DDos 等。堪称黑客军火库的开源项目啊\n【开源项目】\n4.sniffnet：可轻鬆监控网路流量的工具。这是一个简单、可靠、炫酷的网路监控应用，可以让你一目了然地了解设备的网路流量。\n【开源项目】\n5.changedetection ：简单好用的网站变更检测、监控和通知服务。基于 Flask+Selenium 构建的 Web 服务，可以在目标网站发生变化时发出通知，可用于监控商品降价、工作机会、版本发布、最新内容等，支持 Docker 的安装方式。\n【开源项目】\n6.calibre：一款完全免费开源且功能强大的电子书管理工具。它是集下载、格式转化、制作、管理于一体的电子书工具，比如可以将 txt 文本，转化成包含作者信息和书籍封面的 mobi 文件，制作完成后还可以直接发送到 Kindle 设备上。 支持多种电子书格式，包括EPUB、MOBI、PDF等等。Calibre的功能非常强大，可以帮助用户轻鬆地管理自己的电子书库，包括添加、删除、重命名和搜索等。此外，它还提供了阅读器功能，用户可以在软体内直接阅读电子书，而不需要另外下载阅读器。你还可以可通过插件/扩展实现更多的功能。\n【开源项目】\n7.Magisk：Android 获取 Root 许可权的工具。它可以快速、无痛地获得 Android 的超级用户许可权，支持 Android 5.0 以上的设备。\n【开源项目】\n8.uptime-kuma：一款极简的 uptime 监控工具。该项目可以用来监控服务正常运行时间，它界面美观、支持 Docker 一键部署，提供了中文界面、通知、多状态页面等实用功能。\n【开源项目】\n","date":"2023-08-27T15:27:46Z","permalink":"https://blog.lufei.de/p/%E6%8E%A8%E8%8D%908%E4%B8%AA%E5%AE%9D%E8%97%8F%E7%BA%A7%E7%9A%84%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E6%9D%A5%E8%87%AAgithub%E7%9A%84%E5%85%8D%E8%B4%B9%E7%B2%BE%E5%93%81%E9%A1%B9%E7%9B%AE/","title":"推荐8个宝藏级的开源软件！来自Github的免费精品项目"},{"content":"安装 1、安装Nginx 这里使用的是军哥的LNMP 单独安装Nginx\nwget http://soft.vpser.net/lnmp/lnmp2.0.tar.gz -O lnmp2.0.tar.gz \u0026amp;\u0026amp; tar zxf lnmp2.0.tar.gz \u0026amp;\u0026amp; cd lnmp2.0 \u0026amp;\u0026amp; ./install.sh nginx 2、CDN配置 假如我需要对www.moerats.com搭建CDN节点，数据放在192.168.1.100，需要先修改hosts指向，告知CDN节点去哪里去获取网站数据，也就是回源地址，做如下修改：\nvi /etc/hosts 192.168.1.100 www.moerats.com 然后创建nginx配置文件moerats.com.conf。\n#创建缓存目录 mkdir -p /usr/local/nginx/caches/www.moerats.com #设置缓存目录权限 chown -R www:www /usr/local/nginx/caches/www.moerats.com #创建moerats.com.conf vi /usr/local/nginx/conf/vhost/moerats.com.conf 在moerats.com.conf中添加下面的内容，缓存目录/缓存时间请根据实际情况调整。\nproxy_cache_path /usr/local/nginx/caches/www.moerats.com levels=1:2 keys_zone=xiaoz:50m inactive=30m max_size=50m; server { listen 80; server_name www.moerats.com; charset utf-8,gbk; location / { proxy_set_header Accept-Encoding \u0026#34;\u0026#34;; proxy_pass https://www.moerats.com; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache xiaoz; proxy_cache_valid 200 304 30m; proxy_cache_valid 301 24h; proxy_cache_valid 500 502 503 504 0s; proxy_cache_valid any 1s; proxy_cache_min_uses 1; expires 12h; } } 参数说明：\n/usr/local/nginx/caches/www.moerats.com：为缓存目录\nlevels：指定该缓存空间有两层hash目录，第一层目录为1个字母，第二层为2个字母。\nkeys_zone=xiaoz:50m：为缓存空间起个名字，这里取名为“xiaoz”，后面的50m指内存缓存空间\ninactive=30m：如果30分钟内该资源没有被访问则删除\nmax_size=50m：指硬盘缓存大小为50MB\nproxy_cache_valid：指定状态码缓存时间，前面写状态码，后面写缓存时间。\n3. 然后重启Nginx生效 /etc/init.d/nginx reload 4、Https配置 如果是https网站，配置文件参考：\nproxy_cache_path /data/wwwroot/caches/www.moerats.com levels=1:2 keys_zone=Rats:50m inactive=30m max_size=50m; server { listen 443 ssl http2; ssl_certificate /home/moerats.com.crt; ssl_certificate_key /home/moerats.com.key; ssl_session_timeout 1d; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_dhparam /data/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers \u0026#39;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS\u0026#39;; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; server_name www.moerats.com; access_log /data/wwwlogs/moerats.com_nginx.log combined; charset utf-8,gbk; location / { proxy_set_header Accept-Encoding \u0026#34;\u0026#34;; proxy_pass https://www.moerats.com; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache Rats; proxy_cache_valid 200 304 30m; proxy_cache_valid 301 24h; proxy_cache_valid 500 502 503 504 0s; proxy_cache_valid any 1s; proxy_cache_min_uses 1; expires 12h; } } server { listen 80 default_server; return 301 https://$host$request_uri; } 你也可以使用多台VPS，利用CloudXNS智能解析，将不同地区的DNS解析到最近的VPS上，进行CND加速。\n","date":"2023-08-24T06:05:35Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8nginx%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E8%87%AA%E5%BB%BAcdn%E5%8A%A0%E9%80%9F%E8%8A%82%E7%82%B9/","title":"使用Nginx反向代理，自建CDN加速节点"},{"content":"介绍 当我们在很多博客或者网站留言，评论的时候会看到有的人头像很酷很个性化，但是这个博客和网站本身并没有提供设置头像的功能，感觉有点神奇，那么是怎么做到的呢？其实这是使用了Gravatar。\nGravatar，全称Globally Recognized Avatar。翻译成中文为全球通用头像。\nGravatar的概念首先是在国外的独立WordPress博客中兴起的，当你到任何一个支持Gravatar的网站留言时，这个网站都会根据你所提供的Email地址为你显示出匹配的头像。当然，这个头像，是需要你事先到Gravatar的网站注册并上传的，否则，在这个网站上，就只会显示成一个默认的头像。\n当你访问支持gravatar头像的网站时，只要输入你注册的邮箱账号，即会自动调用gravatar的api，转换成保存的头像。这样就可以为广大程序提供个人头像存储服务。\n使用 使用该服务时需要去官网中注册一个账号，并上传头像。\n注意头像上传后会审核，然后管理员会按图片包含的内容划分一个等级（G 普通级、PG 辅导级、R 和 X 为限制级）。\n通过之后这个头像就可以使用了。在任何支持Gravatar的地方，在评论填写email地址时，请填写你申请注册头像用的这个email地址。你的头像就会出现在留言中。就这样可以展示给大家看了\n调用 由于gravatar目前服务极不稳定，调用时推荐用国内的源。\n以下个人整理备份。\n- gravatar官方的www源：[https://www.gravatar.com/avatar/] - gravatar官方的cn源：[https://cn.gravatar.com/avatar/] - gravatar官方的en源：[https://en.gravatar.com/avatar/] - gravatar官方的secure源：[https://secure.gravatar.com/avatar/] - V2EX源：[https://cdn.v2ex.com/gravatar/] - Loli源：[https://gravatar.loli.net/avatar/] - 极客族：[https://sdn.geekzu.org/avatar/] ","date":"2023-08-24T04:32:50Z","permalink":"https://blog.lufei.de/p/gravatar%E5%A4%B4%E5%83%8F-%E9%95%9C%E5%83%8F%E5%9C%B0%E5%9D%80%E5%A4%A7%E5%85%A8/","title":"Gravatar头像 镜像地址大全"},{"content":"优雅地配置并将代码推送至多个远程仓库，如 GitHub 和 Gitee，是一项重要的开发实践。通过巧妙配置 Git，你可以无缝管理多个代码托管平台。\n在gitee平台,你可以将github上的项目导入进来,只需要填上github仓库 URL即可.非常方便\n同时提交到github和gitee 方法一 通过命令行set-url --add 添加\n1.使用如下命令添加远程仓库 git remote set-url --add origin 例如：\ngit remote set-url --add origin https://gitee.com/ganace/Ganace.git 2.查看远程仓库情况 git remote -v 可以看到gitee的仓库地址已经添加进去了\norigin https://github.com/Ganace/Ganace.github.io.git (fetch) origin https://github.com/Ganace/Ganace.github.io.git (push) origin https://gitee.com/ganace/Ganace.git (push) 方法二 打开/.git/config文件，在[remote “origin”]项中添加多个需要同时提交的git远程仓库url。\n例如：\n[remote \u0026#34;origin\u0026#34;] url = https://github.com/Ganace/Ganace.github.io.git url = https://gitee.com/ganace/Ganace.git fetch = +refs/heads/*:refs/remotes/origin/* 提交 使用git push -f 统一提交到所有仓库，并且强制统一版本。\ngit push -f origin --all ","date":"2023-08-22T03:03:25Z","permalink":"https://blog.lufei.de/p/git%E9%85%8D%E7%BD%AE%E6%8F%90%E4%BA%A4%E5%88%B0%E5%A4%9A%E4%B8%AA%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93/","title":"Git配置、提交到多个远程仓库"},{"content":"将您的本地服务扩展到全球网络：Cloudflare Tunnel的魔力\nCloudflare Tunnel是您连接全球网络的完美伙伴。无论您是个人开发者还是企业用户，通过Cloudflare Tunnel，您可以轻松将您的本地或电脑上的服务提供给全球用户。这款强大的工具可以安全地将您的服务引导到Cloudflare的分布式网络中，确保数据的安全性和隐私。通过加密通信和强大的安全功能，您的Web服务将免受恶意攻击和数据泄露的威胁。\n一键脚本 适用于debian/ubuntu\ncurl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/cloudflared.sh \u0026amp;\u0026amp; chmod +x cloudflared.sh \u0026amp;\u0026amp; ./cloudflared.sh 后面可以不看了\n1.下载与安装 安装教程: 点击打开\nwget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \u0026amp;\u0026amp; sudo dpkg -i cloudflared-linux-amd64.deb 有两种运行隧道的方式: 控制台和命令行\n区别: 控制台添加第2个隧道的时候提示你已经安装过cloudflared服务了,你需要卸载才能继续, 命令行则可以运行多个配置文件,也就是多个服务,所以没有限制\n本文使用的是命令行方式\n打开控制台\u0026ndash;Access\u0026ndash;Tunnels\n2.登录 cloudflared tunnel login 会自动打开浏览器，登录后选择域名，完成验证\n此时 Cloudflare 会创建一个 cert.pem 文件放在你的 ~/.cloudflared 目录下。\n3.创建隧道 cloudflared tunnel create 隧道名 此时会输出一些隧道 ID 之类的信息\n4.配置隧道 给隧道创建一个域名\ncloudflared tunnel route dns 隧道名 刚才选择的域名 这里有个坑: 回到域名的DNS解析,把CNAME 记录名称改回来\n比如: tt.baidu.com改为mm.baidu.com\n内容改为: 隧道UUID.cfargotunnel.com\n5. 创建配置文件 比如我打算放在 ~/.cloudflared/config.yml，文件内容如下：\ntunnel: UUID credentials-file: /root/.cloudflared/UUID.json ingress: - hostname: xx.baidu.com service: http://localhost:80 - service: http_status:404 启动隧道： cloudflared tunnel --config ~/.cloudflared/config.yml run 此时会有一些调试信息，比如它告诉你连接到了哪些 Cloudflare 节点之类的：\n022-03-26T06:52:31Z INF Starting tunnel tunnelID=xxxxxxx-5b0e-xxxx-8034-xxxxxxx 2022-03-26T06:52:31Z INF Version 2022.3.4 ... 2022-03-26T06:52:31Z INF Generated Connector ID: 624aa020-a90a-4bef-91da-330c74edb02f 2022-03-26T06:52:31Z INF Initial protocol http2 2022-03-26T06:52:31Z INF Starting metrics server on 127.0.0.1:44143/metrics 2022-03-26T06:52:33Z INF Connection 34504363-646c-46a2-973d-bd112943c58f registered connIndex=0 location=KIX 2022-03-26T06:52:34Z INF Connection 7a3ec8f7-482c-4fe5-93c4-69d1177ca457 registered connIndex=1 location=NRT 2022-03-26T06:52:35Z INF Connection 7d571bdb-96d2-49d3-b8bf-14754aa6cf8b registered connIndex=2 location=KIX 2022-03-26T06:52:36Z INF Connection 473e30ae-e98b-4da1-8768-12bf5304c7ab registered connIndex=3 location=NRT 6. 其他 体验隧道 由官方提供测试域名 重新启动体验隧道域名会变\ncloudflared tunnel --url localhost:你http服务端口号 运行隧道 (有时会失败) cloudflared tunnel run --url localhost:你http服务端口号 隧道名字 删除隧道 cloudflared tunnel delete 隧道名 列出隧道 cloudflared tunnel list 配置为系统服务 执行\ncloudflared service install cloudflared 会新建 systemd 文件\n开启服务\nystemctl start cloudflared.service 7. 卸载隧道 sudo cloudflared service uninstall 记得删除cloudflared.service残留文件\nsudo rm /etc/systemd/system/cloudflared.service 后记 理论上不限制流量，比之前的worker法好一点，适合没有独立公网v4的nat，内网机器，省去自己内网穿透，端口转发的麻烦\n另外，毕竟是穿透到国外，CF什么速度懂得都懂，跨境速度就挺差，国内穿透还是可以考虑阿里的钉钉免费内网穿透，走的阿里BGP（海外主电信副联通）\n参考文档 https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/create-tunnel\nhttps://developers.cloudflare.com/cloudflare-one/connections/connect-apps/trycloudflare\n","date":"2023-08-20T22:02:09Z","permalink":"https://blog.lufei.de/p/cloudflare-tunnel-%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E5%92%8C%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/","title":"CloudFlare Tunnel 内网穿透和反向代理"},{"content":"描述 这是迄今为止我见过的最简单的反向代理！\n她就是Cloudflare Tunnel\n不用安装Nginx 或 Apache\n安装好Uptime Kuma( docker 安装)，您只需在“设置”中提供 Cloudflare Tunnel 令牌，即可在 Internet 上浏览 Uptime Kuma。\n优点：\n免费 完整的 GUI，零配置文件 您可以将 Uptime Kuma 置于防火墙后面 无需暴露您的真实IP 公开 Docker 端口是可选的 不需要 Nginx、Caddy 或 Traefik 等反向代理软件 零配置 SSL 免费SSL 要求 您域名的 DNS 由 Cloudflare 管理。 对于 Docker，仅 Debian或ubuntu 基础支持。 对于非 Docker，需要下载并安装cloudflared。https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/ 对于非 Docker Windows 用户，您可以在其 Github 版本上下载 msi 安装程序：https://github.com/cloudflare/cloudflared/releases/latest 四个步骤 在Cloudflare Zero Trust上创建隧道。 获取您的隧道令牌并将其设置到您的 Uptime Kuma 实例中。 将域名映射到http://localhost:3001。 启动。 开始吧 步骤其实非常简单。然而，由于这个概念对任何人来说都是相当新的，所以详细地写出来可能会更好。\n但相信我，一旦您学会了，您将再次记住如何在没有本指南的情况下进行配置！而对于 Nginx 或 Traefik，我永远不记得如何在不谷歌搜索的情况下进行配置。\n前往Cloudflare Zero Trust。\nAccess\u0026raquo; Tunnels_Create Tunnel\n键入Tunnel name诸如uptime-kuma并保存隧道。\n单击令牌进行复制。\n转到您的 Uptime Kuma 实例。\nSettings\u0026gt;Reverse Proxy\n将令牌粘贴到Cloudflare Tunnel Token字段中。\n点击Start cloudflared\n返回到Cloudflare Zero Trust，如果您看到连接器，则单击Next\n选择您最喜欢的域名并映射到http://localhost:3001\n点击Save并转到您的域名https://\u0026lt;your domain name\u0026gt;并获利！是的，它还会自动为您提供 SSL！\n如何停止 选项 1.您可以删除 Cloudflare 上的地图。 选项 2. 您可以在 Uptime Kuma 中单击Stop cloudflared和。Remove Token 环境变量 或者，您可以通过环境变量设置令牌。cloudflared 将自动启动。\n通过这种方法，您甚至不需要将容器端口暴露给主机。\nUPTIME_KUMA_CLOUDFLARED_TOKEN=\u0026lt;your token\u0026gt;\n","date":"2023-08-20T05:57:08Z","permalink":"https://blog.lufei.de/p/%E5%88%A9%E7%94%A8cloudflare-tunnel%E4%B8%BAuptime-kuma%E8%AE%BE%E7%BD%AE%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/","title":"利用Cloudflare Tunnel为Uptime Kuma设置反向代理"},{"content":"前言 Cloudflare R2存储允许开发人员存储大量非结构化数据，而无需支付与典型云存储服务相关的昂贵出口带宽费用。Cloudflare R2存储流量不收费，收费的是存储空间和请求次数。A类操作和B类操作分开收费，上传属于A类操作，下载和访问属于B类操作。\n免费 付费 - 费率 贮存 10 GB/月 每月 0.015 美元/GB A 类操作 每月 100 万个请求 4.50 美元/百万请求 B 类操作 每月 1000 万个请求 0.36 美元/百万请求 也就是说，可以免费存储10G的文件，每个月可以上传100万次，访问1000万次，假如用作图床，一般是用不到这个量级的。并且可以绑定自定义域名，套用页面规则以后可以设置浏览器缓存，这样可以减少一些请求次数并且可以防止被人刷请求次数导致一晚上过去，房子就不属于自己了。不自定义域名也是可以的，也就是说你甚至不需要拥有域名就可以拥有一个图床。\n存储也是比较便宜的，超出10G以后，1G文件基本上每个月只要1毛人民币。当然和B2那种5刀一个月1T是没法比的，用作图床的话还有种阿里云国际的OSS的40G年付包也是比较有性价比，这里扯远了。下面详细说一下怎么白嫖R2做图床。\n本文的图就放在R2上，只不过域名是自定义的。\n设置R2 开通R2 首先当然是拥有一个Cloudflare账号，并且点击右上角的语言设置中文。\n第一步当然是开通R2，侧边栏找到R2然后点击开通。这里可以绑定支持外币支付的卡，或者直接绑定paypal，中国区的paypal也是可以的。\n第二步是创建存储桶，可以自己选取位置，不建议无脑选亚太地区，亚太地区虽然近但是国际访问速度受限，我这里选择北美西部。\n第三步是创建完存储桶后，点进就到存储桶的设置，然后找到【R2.dev 子域】，将其开启，下图是我已经开启的状态。\n大家可以认为你的存储同并没有域名绑定，开启这个子域名以后，cf就分配了一个域名给你的存储桶，如果你绑定了自定义域名到存储桶的话，可以把这个开关给关了，可以少一些问题。如果你没有购买域名没法自定义域名，一直用cf给你的这个域名也是可以的。自定义域名的好处是不限速，而且可以享受cloudflare上面的一系列缓存和自定义限速等设置，防止被刷访问次数。\n然后，你就可以通过cf网站上传器上传图片到R2了，便可正常访问。\n开通API 回到R2的概述界面，点击右上角的 管理 R2 API 令牌，然后点击右上角的创建api令牌，如果要使用picgo进行图片的上传，请记得在权限选项把对象读和写打开，在ttl选项可以设置api令牌的有效期，这里可以选择永久。大概如下图所示。\n创建完成令牌以后请把 访问密钥 ID 和 机密访问密钥 收藏好，只会显示这一次，以后用的时候就找不到了，记下来以后还能用到。当然，如果没记住的话，以后再创建一个api令牌也是可以的。\n使用picgo进行上传操作 PICGO项目地址：https://github.com/Molunerfinn/PicGo\n安装好PicGo后，点击【插件设置】搜索【S3】，安装下图插件。\n安装完成后，点击左侧-侧边栏的图床设置，里面多了一个AMAZON S3这个选项，进去设置。\n应用密钥ID填写我们刚刚复制的访问密钥 ID\n应用密钥填写我们刚刚复制的机密访问密钥\n桶命就写我们存储桶的名字，这里是duangks\n文件路径自己设置，默认也是可以的\n地区可以不用填写，默认跳转就可以\n自定义节点需要填写一下，在R2中点击存储桶，到存储桶的管理界面，点击设置，里面的S3 api就是需要复制的。例如\n自定义域名需要注意一下，复制咱们开通的R2.dev 子域，然后在后面加上/你的桶名。\n例如，我开通的R2.dev 子域是 https://pu1-082231df54234f2b90d1bd5432310a4b.r2.dev\n需要在软件里面填写的自定义域名就是 https://pu1-082231df54234f2b90d1bd5432310a4b.r2.dev/duangks\n然后就可以愉快的使用picgo了。\n自定义域名 假如你在cf里面托管有域名的话，可以直接在R2存储桶的设置界面设置自定义域名，填写一个二级域名以后不需要自己去设置dns，cf就会自动帮你映射好。\n然后就可以顺路把R2.dev 子域给关了。\n记得到时候在picgo里面自定义域名也需要加后缀，就像这样 https://你的自定义域名/你的存储桶名\n最后，推荐大家使用以下picgo的二开项目PICLIST，直接去github搜就行，相比picgo多了一个自带的图片管理功能，可以对图片进行有损/无损压缩和变换格式，以及添加水印。还多了个管理功能，可以通过设置以后直接管理你上传的文件。\n","date":"2023-08-20T05:05:54Z","permalink":"https://blog.lufei.de/p/picgo-%E7%99%BD%E5%AB%96cloudflare-r2%E5%AD%98%E5%82%A8%E5%81%9A%E5%9B%BE%E5%BA%8A/","title":"PICGO+白嫖Cloudflare R2存储做图床"},{"content":"借助强大的 Github Action，我们能够轻松地实现博客的自动化构建与部署，让整个流程更加优雅高效。在这个过程中，我们选用了 Hugo 这一优秀的工具，它与 hexo 一样，都是出色的静态博客生成器。\n考虑国内网络环境，我们选择了腾讯云COS来部署博客，以提供更快速、稳定的访问体验。这个策略让博客的美感与技术有机融合，为读者呈现出精致的阅读空间。\n准备工作： 到腾讯云\u0026ndash;访问管理—用户列表，新建一个账户 地址: https://console.cloud.tencent.com/cam\n访问方式改为\u0026quot;编程访问”，用户权限添加\u0026quot;QcloudCOSDataFullControl、 QcloudCDNFullAccess\u0026quot;。完成之后将生成的 SecretId、SecretKey 复制保存。\n到 Github 新建一个仓库(私有公共都行)，把自己 hugo 生成的站点源文件(不是 public 下文件)同步过去。\n在刚创建的仓库——Settings——Secrets and variables——Actions，\n新建 SecretId、SecretKey、Bucket、 Region 四个密钥。其中 SecretId、SecretKey 为上面复制保存的，Bucket(存储桶名称)、 Region(所属地域 如:ap-guangzhou )在 COS 中存储桶列表中获取。\n自动构建 在博客仓库根目录下新建 .github/workflows 文件夹，新建一个 deploy.yml（文件名随意），作用：借助 Github Action 实现自动部署\n注意: 第5 38 40 行 第5行触发的分支是main还是master, 第38行改为你的用户名和仓库名,比如: 111/222 第40行是Github Pages 所在分支 最后两行是同步根目录还是public目录 完整脚本 name: Auto Deploy hugo on: push: branches: - main # 更新触发的分支 jobs: build-deploy: # runs-on: ubuntu-latest runs-on: ubuntu-20.04 steps: - name: Check out repository code uses: actions/checkout@v3 with: submodules: recursive # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup hugo uses: peaceiris/actions-hugo@v2 with: # hugo-version: \u0026#34;latest\u0026#34; # 可以修改为你使用的 Hugo 版本 hugo-version: \u0026#34;0.113.0\u0026#34; extended: true # 设置是否需要 extended 版本 - name: Cache resources # 缓存 resource 文件加快生成速度 uses: actions/cache@v3 with: path: resources # 检查照片文件变化 key: ${{ runner.os }}-hugocache-${{ hashFiles(\u0026#39;content/**/*\u0026#39;) }} restore-keys: ${{ runner.os }}-hugocache- - name: Build Hugo static files # 部署静态资源 run: hugo --gc --minify - name: Deploy to Github Pages # 部署到Github Pages页面 uses: peaceiris/actions-gh-pages@v3 with: personal_token: ${{ secrets.PERSONAL_TOKEN }} # 两个仓库请使用 deploy_key external_repository: 111/222 # 如果在同一个仓库请注释 publish_dir: ./public # hugo 生成到 public 作为跟目录 publish_branch: main # Github Pages 所在分支 commit_message: ${{ github.event.head_commit.message }} # 上传到腾讯COS存储桶 - name: Setup Python uses: actions/setup-python@v4 with: python-version: 3.9 - name: Setup coscmd and sdk run: sudo pip install coscmd - name: Configure coscmd env: SECRET_ID: ${{ secrets.SecretId }} SECRET_KEY: ${{ secrets.SecretKey }} BUCKET: ${{ secrets.Bucket }} REGION: ${{ secrets.Region }} run: coscmd config -a $SECRET_ID -s $SECRET_KEY -b $BUCKET -r $REGION - name: Upload to COS run: coscmd upload -rfs --delete ./ / # run: coscmd upload -rfs --delete public/ / 其他代码 # 上传到腾讯COS存储桶 - name: Install coscmd run: sudo pip install coscmd - name: Configure coscmd env: COS_SECRET_ID: ${{ secrets.COS_SECRET_ID }} COS_SECRET_KEY: ${{ secrets.COS_SECRET_KEY }} COS_BUCKET_NAME: jpcos-1253486782 # Change for yourself COS_BUCKET_REGION: ap-tokyo # Change for yourself run: coscmd config -a $COS_SECRET_ID -s $COS_SECRET_KEY -b $COS_BUCKET_NAME -r $COS_BUCKET_REGION - name: Deploy to COS Bucket run: coscmd upload -rfs --delete ./ / # run: coscmd upload -rfs --delete public/ / 同步到Backblaze B2 地址:https://www.backblaze.com/cloud-storage\n10GB 免费存储空间。\nBackblaze B2每月免费 10G 存储及每天 1G 的流量，如果套壳 Cloudflare，流量个人使用等于不要钱。折腾的乐趣，就在于不停的折腾～\nBackblaze B2 同步，B2_APPKEY_ID B2_APPKEY在Application Keys菜单下生成就行。要特别注意的是B2_BUCKET写法，完整的写法是b2://xxx，其中xxx为存储桶名称。\n# 同步到Backblaze B2 name: Sync B2 Bucket on: push jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: jakejarvis/backblaze-b2-action@master env: SOURCE_DIR: \u0026#39;./\u0026#39; B2_BUCKET: ${{ secrets.B2_BUCKET }} B2_APPKEY_ID: ${{ secrets.B2_APPKEY_ID }} B2_APPKEY: ${{ secrets.B2_APPKEY }} 所需的环境变量 SOURCE_DIR您想要同步/上传到 B2 的本地目录。例如，./public\nB2_BUCKET您要同步到的存储桶的名称。例如，my_files\nB2_APPKEY_ID您的 Backblaze 应用程序密钥 ID。在这里生成它。\nB2_APPKEY您的 Backblaze 应用程序密钥 — 又名“秘密”密钥。在这里生成它。\n","date":"2023-08-19T11:28:45Z","permalink":"https://blog.lufei.de/p/github-actions%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BAhugo%E5%B9%B6%E5%90%8C%E6%AD%A5%E5%88%B0%E8%85%BE%E8%AE%AFcos/","title":"GitHub Actions自动构建Hugo并同步到腾讯COS"},{"content":"事前准备 准备好用于挂载的Bucket，配置好权限\n获得可以用于挂载Bucket，accesskey和secret\n本文使用的是Ubuntu 20.04\n腾讯官方Cosfs的地址\nhttps://github.com/tencentyun/cosfs/\n1.下载cosfs的安装包 wget https://github.com/tencentyun/cosfs/releases/download/v1.0.21/cosfs_1.0.21-ubuntu20.04_amd64.deb 2.安装软件包 sudo dpkg -i cosfs_1.0.21-ubuntu20.04_amd64.deb 3.如果安装过程中遇到依赖项错误，请使用以下命令修复它们\nsudo apt-get install -f 3.配置访问 将Bucket名称以及具有此Bucket访问权限的AccessKeyId/AccessKeySecret\n信息存放在/etc/passwd-cosfs文件中。注意这个文件的权限必须正确设置，建议设为640。\necho my-bucket:key-id:key-secret \u0026gt; /etc/passwd-cosfs chmod 640 /etc/passwd-cosfs my-bucket: 存储桶名称 key-id: AccessKeyId key-secret: AccessKeySecret 4.将Bucket挂载到指定目录 cosfs my-bucket /home/cos -ourl=http://cos.ap-guangzhou.myqcloud.com -oallow_other my-bucket:存储桶名称 /home/cos为你的服务器上的路径 http://cos.ap-guangzhou.myqcloud.com 为所属地域 5.卸载已挂载的磁盘 fusermount -u /home/cos ","date":"2023-08-19T05:09:53Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8cosfs%E6%8C%82%E8%BD%BD%E8%85%BE%E8%AE%AF%E4%BA%91cos%E5%88%B0vps%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A/","title":"使用cosfs挂载腾讯云COS到VPS服务器上"},{"content":"独角数卡是一款精巧的卡密销售系统，具备强大功能。\n您可按照作者提供的文档，依赖 mysql 和 redis 进行顺利安装。\n或者，您也可以采用本文的Docker镜像，比官方推荐更优。\n这个镜像集成了所有组件，一分钟内即可搭建完毕。使您迅速体验到这一卓越系统的便捷和高效。\n项目地址: https://github.com/assimon/dujiaoka\n步骤 1 安装 docker curl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 步骤2 安装部署独角数卡 事先解析好你的域名, 指向你VPS的IP地址\nbash \u0026lt;(curl -L -s https://raw.githubusercontent.com/woniu336/open_shell/main/dujiao.sh) 提示输入域名: 输入解析好的域名 店铺名字: 随意 开通Https[Y/N]N 选择N 安装好之后,终端底部会显示一些安装的信息\n步骤3 网页安装 重点 注意端口号是: 3080\n打开域名:3080 ,例如 http://baidu.com:3080\n后面可以使用反向代理方式去掉3080端口\n访问域名开始安装：\n将mysql的地址改为db 将mysql的用户名改为dujiaoka 将mysql密码改为终端显示的密码 将redis的地址改为redis 填写网站名称 网站 url 填写完整域名地址，例如http://shop.ioiox.com 点击安装，并成功安装，登录后台:\n在域名后面加上 /admin，账户密码都是admin 就可以正常登录后台了！\n记得改一下用户名和密码！\n关于https的问题 后台登录出现0err或者其他登录异常问题，大概率是开启了https而后台没有开启，把下面的false改为true即可\n修改配置文件:\nvim /root/dujiao/env.conf 把 ADMIN_HTTPS=false 改成 ADMIN_HTTPS=true\nAPP_URL 域名也改一下(https)\n重启docker\nsystemctl restart docker 设置docker 开机自启\nsystemctl enable docker ⚠️正式上线后一定要将env.conf配置里面的APP_DEBUG设置为false⚠️\n","date":"2023-08-16T05:29:51Z","permalink":"https://blog.lufei.de/p/%E5%8F%91%E5%8D%A1%E7%BD%91%E8%BD%BB%E6%9D%BE%E8%A3%85%E7%8B%AC%E8%A7%92%E6%95%B0%E5%8D%A11%E5%88%86%E9%92%9F%E5%AE%89%E8%A3%85%E6%94%BB%E7%95%A5/","title":"发卡网轻松装！独角数卡1分钟安装攻略"},{"content":"为何选择 Gogs ？ 我选择了 Gogs 来讲解，主要是出于以下几个原因：\nGogs 是一个轻量化的 Git 服务，对系统占用较小。 Gogs 的功能够用。 Gogs 的安装流程简便。 其中第一点最重要，因为 Gitlab 对系统配置的要求比较高，单是内存这一项就要求大于 4 GB，如果是 2 GB 内存则会直接无法运行，这个要求已经可以淘汰掉一些入门级服务器了。而 Gogs 在 NAS、树莓派、入门级服务器上都可以无压力运行，长期运行也不会影响其他服务。\n而且我们介绍的场景也不是多人开发协作，只是个人同步笔记用，不需要过多的开发相关功能，有最基本的 Git 服务和一个便于操作的网页就足够了。\nGogs 的安装过程也比较简单，官方的 Docker 版本基本做到了开箱即用，连数据库都不需要额外配置，有个文件夹存放数据就可以。\n如何在图形界面中安装 Docker 版 Gogs 我通常建议通过图形化界面来管理 Docker，这样能够直观看到容器的运行状态，像启动、停止、修改配置这样的操作，都能以最简单的方式完成。\n所以先来讲讲在图像界面下如何安装 Docker 版本的 Gogs。\n了解 Docker 的关键配置 我们借助 Gogs 顺便了解一下通过 Docker 跑一个服务需要做什么配置。\n首先我们找到 Gogs 在 hub.docker.com 中的包：Gogs - Docker Hub 。\n根据它下方的文档提示可以得知，Gogs 的必要配置很少，我们根据它的官方配置可以得知，它需要这下面两行核心代码就可以完成部署。\ndocker pull gogs/gogs docker run --name=gogs -p 10022:22 -p 10880:3000 -v /var/gogs:/data gogs/gogs 如何使用 Gogs 使用 Gogs 创建仓库和 Github 类似，注册账户，创建仓库……图形化界面总是容易让人理解。这里就不再赘述了。\n不过有一点需要注意。在完成仓库创建后，我们需要通过 git clone 把仓库下载到本地。往常在 Github 中 git clone 仓库后再尝试 push 时会提示用账号密码登录，然后由服务器判别你是否有这个仓库的更多权限，允许你做进一步的操作。\n","date":"2023-08-16T03:47:29Z","permalink":"https://blog.lufei.de/p/docker%E6%90%AD%E5%BB%BAgogs%E4%B8%80%E4%B8%AA%E8%BD%BB%E9%87%8F-git-%E6%9C%8D%E5%8A%A1%E7%AB%AF/","title":"Docker搭建Gogs一个轻量 Git 服务端"},{"content":"其实最基本的流程就是新建分支，在这个分支上改动代码，再提交上去，跟master分支合并。\n1. 新建分支 首先，在你新建分支之前，你应该在master分支，并且要保证你当前的是最新代码，要不然就是找死，最后提交代码就会出问题。\ngit pull origin master 在master分支下，保证当前代码与线上同步 git branch \u0026lt;分支名\u0026gt; ，正儿八经的新建分支。 git checkout \u0026lt;分支名\u0026gt; ，切换 到新建的分支上，再进行下一步。 git push origin \u0026lt;分支名\u0026gt; ,把本地分支推到远端，让远端也有一个你的分支 新建分支并切换到该分支：git checkout -b \u0026lt;分支名\u0026gt;\n2. 提交代码 在新建的分支上写完代码之后，就可以提交代码了。此时应该在你新建的分支上\ngit status ,查看自己写了哪些东西。 git add . git commit -m ‘本次提交的描述’ git push origin \u0026lt;分支名\u0026gt; ,push是从本地向远端推代码 执行完上一步，有可能报错，此时淡定，不认识英语的话在线翻译是干嘛的，大多数时候提示你，本地落后于远端，（意思就是远端比本地多了一些代码，为什么会出现这种情况呢，肯定是你跟别人共用一个分支，他提交了一段代码到远端，所以导致你的本地落后于远端）既然落后了，那就把他更新成最新的呗，\ngit pull --rebase origin 远程分支名 执行完之后，你的代码就跟远端又一样了。并且你的修改仍然在，此时再提交你的代码\ngit push origin \u0026lt;分支名\u0026gt; 3.rebase代码 提交完代码之后需要让测试人员进行测试，若测试没问题，就可以rebase代码，然后上线了。（==这一步是保证你要上线的代码是基于最新的master==）\ngit pull —rebase origin \u0026lt;分支名\u0026gt; git pull —rebase origin master\n执行这两步的时候都有可能发生冲突，此时你要做的就是解决冲突，再继续提交。 解决完冲突之后，git add . git rebase —continue 若此时还有冲突，继续解决，解决完继续执行1，2步。 若此时没有报错，git push origin \u0026lt;分支名\u0026gt;；（这一步必须在git pull —rebase origin master成功之后执行） 此时若显示，当前分支落后于master分支，则需要强推，git push -f origin \u0026lt;分支名\u0026gt;，若不报错，则rebase成功。 以上就是一个完整的流程，以下是一些常用的git操作 4.删除分支 删除本地分支 ( 切换到master分支之后再删除 )\ngit branch -d \u0026lt;分支名\u0026gt;\n删除远端分支\ngit push origin --delete \u0026lt;分支名\u0026gt;\n3.查看本地有哪些分支 git branch\n4. 切换分支 git checkout \u0026lt;分支名\u0026gt;\n5.如何从远程拉一个分支 当你跟别人共用一个分支的时候（有时候前端会共用一个分支），如果别人新建了一个分支（此时远端应该已经有了你们要用的分支），你要做的就是把远端的分支拉到自己本地。\ngit fetch origin \u0026lt;分支名\u0026gt;: \u0026lt;分支名\u0026gt;\n6.合并分支 如果你基于主分支master新建了分支dev，再基于dev分支新建了一个分支test，在test分支开发完成后，需要将test合并到dev分支上。此时，先用git branch 查看自己在哪个分支上，然后git checkout dev(切换到需要合并的分支上)，最后git merge test（在dev分支上执行这句，意思是将test合并到dev分支上）\n","date":"2023-08-15T16:46:03Z","permalink":"https://blog.lufei.de/p/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0git%E5%88%86%E6%94%AF%E5%88%9B%E5%BB%BA%E4%B8%8E%E4%BB%A3%E7%A0%81%E6%8F%90%E4%BA%A4%E7%9A%84%E7%BB%86%E8%87%B4%E6%B5%81%E7%A8%8B/","title":"手把手教你：Git分支创建与代码提交的细致流程"},{"content":"关于 Obsidian 同步这件事，似乎总能让人感到头疼。同步方案不是太少，而是太多。多到你难以辨别哪种方案是最合适自己的。而且有不少同步方法是未经验证的，一些想当然的方案其实并不适合 Obsidian。\n这篇文章我想先聊聊 PC 之间的 Obsidian 库同步。也就是不论系统，可以在 Windows、macOS、Linux 之间稳定完成同步的方法：Git 同步方案。\n准备工作 在开始之前，确保你已经安装了Git和Obsidian软件。接下来，我们将一步步进行配置。\n创建Git仓库 首先，选择一个Git平台作为仓库托管，这里我们以GitHub为例。如果你还没有GitHub账号，请先在GitHub官网注册一个账号。\n登录GitHub账号，点击右上角的“+”按钮，选择“New repository”。 填写仓库名称，选择公开或私有，其他设置保持默认，点击“Create repository”。 将仓库同步到本地 你可以使用命令行或图形化工具，这里我们介绍使用GitHub Desktop。\n下载并安装GitHub Desktop。 打开GitHub Desktop，登录你的GitHub账号。 点击“File”菜单，选择“Clone repository”。 选择你刚创建的仓库，选择本地存放位置，点击“Clone”按钮。 合并Obsidian库和Git仓库 打开Obsidian软件，找到你想同步的笔记库所在的文件夹。 将笔记库文件夹（包括隐藏的 .obsidian 文件夹）复制到刚刚克隆的Git仓库文件夹中。 使用GitHub Desktop提交和推送至远程仓库 安装Obsidian Git插件 在Obsidian中打开刚刚合并的仓库文件夹。 点击左侧导航栏的插件图标。 在插件搜索框中输入“Obsidian Git”并安装。 安装 Obsidian Git 插件进行后续的同步 接下来你需要进 Obsidian ，打开这个转移好的目录，并在这个库中，安装一个名为 Obsidian Git 的插件。\n安装完成后应该会自动出现一个 Git Control View 的侧边栏。如果没有，则按下 Ctrl + P，搜索 Obsidian Git: Open Source Control View ，就可以打开这个面板。\n有了这个插件，以后的同步操作你都可以在 Obsidian 内部进行了。\n这个插件顶部的按钮对应了 Git 中最常见的几个操作。如果你对 Git 有一定的了解，应该对这些操作不会陌生。\nBackup：备份，提交所有的更改，并且执行推送。 Commit：确认提交，但不推送。 Stage all：存储当前的变更。 Unstage all：取消存储变更。 Push：推送到远端，可以理解为推送到 Github。 Pull：从远端拉取到本地，可以理解为从 Github 拉取最新数据到本地。 Change Layout：改变下方文件的排布方式。 Refresh：刷新当前的文件变更情况。 如果你不想了解他们具体是干什么的，只想知道怎么做同步，那其实就两个按键有用：\nBackup，第一个按钮，一次性完成提交并推送到 Github。 Pull，第六个按钮，从 Github 同步到本地。 到这一步就完成了所有的配置工作，第一次使用时，点击 Backup 就可以。\n补充：初次使用 git 时出现报错的解决方法 有读者提到，如果此前从未使用过 git ，直接使用 Github Desktop 进行同步是可行的。\n但此时打开 Obsidian 会提示两个错误：\n这两个错误的意思分别是：没有指定分支、没有读取到用户名。所以这是一个账号设置错误。\n至于在 Github Desktop 中能够正常使用，在 Obsidian 中却不行。究其原因，是因为授权方式是通过 Github 的账号密码进行登录的。而 Obsidian 用的是命令行，采用的授权方式不同，导致只有 Obsidian 无法访问 Github。\n所以解决方法如下：\n打开终端，输入 cd 存储库位置，比如 cd D:\\ObsidianLibrary 来打开存储库。 输入 git remote show origin 来检查当前分支情况，依据更详细的报错，可以解决第一个问题。 git remote show origin 如果此时尚未登陆，应该会弹出一个登录窗口，提示进行登录，此时输入“账号 + 令牌”，就可以完成登录了。注意这个时候的令牌与密码不同，要用 Github 的个人访问令牌登录。参考文档《创建个人访问令牌》[2|2] 就可以生成令牌。 你也可以直接使用以下命令来设置全局身份。\ngit config --global credential.helper store 这行命令的作用是在 git 中全局启用凭证存储，启用后第一次 git clone 或者 git push 时会提示你输入“账户 + 令牌”。之后执行 git 操作都不再需要密码。\n更多的配置 如何启用自动同步 刚开始使用时，你也许不习惯每次手动点一下 Pull 按钮。\n那你可以在 Obsidian Git 插件里启用选项 Auto Backup after file change ，让它每隔一段时间自动进行同步，默认是 10 分钟进行一次推送。下面有一个 Auto pull 的选项，默认 10 分钟进行一次拉取。\n如何解决文件同步冲突？ 如果你在一台电脑上改动了文件，但是忘记同步了，并且在自动同步之前关机了。然后继续在另一台电脑上修改了同一个文件，那么回到这台电脑上做同步时就有可能发生冲突了。\n此时你可以选择自己手动解决这些冲突，在 Obsidian Git 界面中，每次提交时都会告诉你这些文件发生了哪些变化。\n由于 Git 的应用非常普遍，如果出现了其他报错，根据报错提示进行搜索，往往可以在搜索引擎中找到答案。\n不想同步布局和某些配置怎么办？ 通过调整 Git 仓库目录下的隐藏文件 .gitignore 文件，可以选择不同步某些文件。\n根据 Obsidian 的官方文档，他们建议你在 .gitignore 中添加 .obsidian/workspace 。\n如果你已经同步了，那就输入这行命令，这会从仓库中删除文件，未来也不再同步到仓库里，但保留本地文件。\ngit rm .obsidian/workspace --cached 自动同步和解决冲突 你可以在Obsidian Git插件设置中启用自动同步选项，定期自动进行备份和拉取。\n如果在多台设备上同时修改了同一个文件，可能会出现冲突。Obsidian Git插件会提示你哪些文件发生了变化，你可以手动解决这些冲突。\n文件变动Timeline和其他配置 如果想查看文件变动的时间线，你可以使用VSCode软件，打开Obsidian仓库所在的文件夹，然后在VSCode的左侧文件目录下方找到“Timeline”功能，以查看每个文件在每次Git提交中的变化情况。\n如果你不想同步某些文件，可以通过在Git仓库目录下的.gitignore文件中添加文件路径来实现。例如，添加.obsidian/workspace以忽略同步工作区文件。\n如何查看文件变动 Timeline Obsidian 的 Obsidian Git 插件，主要作用是进行提交、拉取、推送这些操作。只能列举某次提交产生的所有变化，不能直观地看到单个文件变动的历史情况。\nVSCode 内置了一个非常方便的功能：Timeline，它可以清晰的看到每个文件在每次 Git 提交中的变化情况。\n你可以在 VSCode 中打开 Obsidian 仓库，在左侧文件目录下方找到“时间线”，就可以回顾这个文件经历了哪些版本了。\n小结 使用Git实现Obsidian的稳定同步方案需要进行一些准备工作，但它能为你提供可靠的版本管理和同步功能。通过Obsidian Git插件，你可以在Obsidian中轻松地进行备份和同步操作，同时也可以通过VSCode的Timeline功能查看文件的变动历史。无论是个人使用还是团队协作，Git都是一个强大的工具，能够帮助你更好地管理和同步Obsidian笔记库。\n","date":"2023-08-15T13:54:23Z","permalink":"https://blog.lufei.de/p/%E4%BD%BF%E7%94%A8git%E5%AE%9E%E7%8E%B0%E7%A8%B3%E5%AE%9A%E7%9A%84obsidian%E5%90%8C%E6%AD%A5%E6%96%B9%E6%A1%88/","title":"使用Git实现稳定的Obsidian同步方案"},{"content":"因为自己部署服务内存比较小，而mysql在docker初始化就占500M，所以可优化其占用内存大小\n一.安装mysql 1.下载好镜像\ndocker pull mysql:8.0.18 2.创建MySQL容器\ndocker run -id --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.18 3.查看安装情况\ndocker ps -l 二.修改mysql占用内存大小 因为自己部署服务内存比较小，而mysql在docker初始化就占500M，所以可优化其占用内存大小\n1.查看运行内存\ndocker stats [root@ ~]# docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS a28d702be74a mysql 0.34% 400.49MiB / 1.694GiB 24.33% 0B / 0B 19.3MB / 14.1MB 38 c8adbf02c7a5 kafka 0.30% 435.7MiB / 1.694GiB 25.11% 1.77MB / 2.93MB 130MB / 86kB 65 92187cc1f68e zookeeper 0.07% 89.78MiB / 1.694GiB 5.18% 2.93MB / 1.77MB 99.5MB / 127kB 19 2.进入mysql容器终端\ndocker exec -it mysql bash 3.切换进入/etc/mysql/conf.d 目录\ncd /etc/mysql/conf.d 4.我们需要进入容器当中进行修改容器里面的配置文件，可能有的服务器是没有安装vim的，所以我们没有的需要安装的\napt-get install vim 5.docker进入mysql容器内，进入/etc/mysql/conf.d 目录执行 vim docker.cnf\nvim docker.cnf 6.在对应文件后面添加下面的参数\nperformance_schema_max_table_instances=400 table_definition_cache=400 performance_schema=off table_open_cache=64 innodb_buffer_pool_chunk_size=64M innodb_buffer_pool_size=64M 各参数对应的意义为\n[mysqld] performance_schema_max_table_instances=400 table_definition_cache=400 #缓存 performance_schema=off #用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源东西 table_open_cache=64 #打开表的缓存 innodb_buffer_pool_chunk_size=64M #InnoDB缓冲池大小调整操作的块大小 innodb_buffer_pool_size=64M #InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小 7.退出\nexit 8.重启mysql容器\ndocker stop mysql docker start mysql 9.观察修改后的内存情况\ndocker stats ","date":"2023-08-15T07:17:31Z","permalink":"https://blog.lufei.de/p/docker%E9%83%A8%E7%BD%B2mysql%E5%B9%B6%E4%BF%AE%E6%94%B9%E5%85%B6%E5%8D%A0%E7%94%A8%E5%86%85%E5%AD%98%E5%A4%A7%E5%B0%8F/","title":"docker部署mysql并修改其占用内存大小"},{"content":"这一期，来介绍另一个流量统计的项目——Plausible。\nPlausible Analytics 是一个简单、开源、轻量级（\u0026lt; 1 KB）且注重隐私的 Google Analytics 替代品。Plausible 被超过10,000个付费订阅用户信任，用于提供他们网站和业务洞察力。我们完全独立、自筹资金并自给自足。\n来自官方Docs\n2. 项目展示 直接丢几个图：\n2.1 特点 支持docker一键部署，轻量级Docker镜像（使用Alpine Linux） 支持谷歌API，链接谷歌分析、谷歌关键词工具 支持自定义事件 颜值高 3. 相关地址 GitHub官方仓库：https://github.com/plausible/analytics\n官方文档地址：https://plausible.io/docs\n4. 搭建方式 创建一下安装的目录：\nsudo -i mkdir -p /root/data/docker_data/plausible cd /root/data/docker_data/plausible git clone https://github.com/plausible/hosting cd hosting vim docker-compose.yml 英文输入法下，按 i\nversion: \u0026#34;3.3\u0026#34; services: mail: category_bar: true bytemark/smtp restart: always plausible_db: # supported versions are 12, 13, and 14 category_bar: true postgres:14-alpine restart: always volumes: - ./db-data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=postgres plausible_events_db: category_bar: true clickhouse/clickhouse-server:23.3.7.5-alpine restart: always volumes: - ./event-data:/var/lib/clickhouse - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro ulimits: nofile: soft: 262144 hard: 262144 plausible: category_bar: true plausible/analytics:v2.0 restart: always command: sh -c \u0026#34;sleep 10 \u0026amp;\u0026amp; /entrypoint.sh db createdb \u0026amp;\u0026amp; /entrypoint.sh db migrate \u0026amp;\u0026amp; /entrypoint.sh run\u0026#34; depends_on: - plausible_db - plausible_events_db - mail ports: - 8090:8000 env_file: - plausible-conf.env 大家可以用默认的设置，也可以和咕咕一样修改一下，修改好之后，注意切换成英文输入法，然后按一下 esc，然后 :wq 保存退出。\nopenssl rand -base64 64 | tr -d \u0026#39;\\n\u0026#39; ; echo 保存下来。\n打开环境配置文件：\nvim plausible-conf.env BASE_URL=填你打算给plausible准备的域名，比如https://analytics.baidu.com SECRET_KEY_BASE=填刚刚生成的那个密钥 修改好之后，注意切换成英文输入法，然后按一下 esc，然后 :wq 保存退出。\n更多参数配置，请看文档：https://plausible.io/docs/self-hosting-configuration\n","date":"2023-08-14T19:29:47Z","permalink":"https://blog.lufei.de/p/umami%E6%9B%BF%E4%BB%A3%E5%93%81plausible%E7%BD%91%E7%AB%99%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1%E5%B7%A5%E5%85%B7/","title":"Umami替代品，Plausible网站流量统计工具"},{"content":"在线安装 1 环境要求 安装前请确保您的系统符合安装条件：\n操作系统：支持主流 Linux 发行版本（基于 Debian / RedHat，包括国产操作系统）； 服务器架构：x86_64、aarch64、armv7l、ppc64le、s390x； 内存要求：建议可用内存在 1GB 以上； 浏览器要求：请使用 Chrome、FireFox、IE10+、Edge等现代浏览器； 可访问互联网。 2 安装部署 GitHub release 链接: https://github.com/1Panel-dev/1Panel/releases\n更多信息请查阅在线文档：https://1panel.cn/docs/\nRedHat / CentOS\ncurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; sh quick_start.sh ubuntu\ncurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; sudo bash quick_start.sh debian\ncurl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh \u0026amp;\u0026amp; bash quick_start.sh 安装成功后，控制台会打印面板访问信息，可通过浏览器访问 1Panel：\nhttp://目标服务器 IP 地址:目标端口/安全入口\n如果使用的是云服务器，请至安全组开放目标端口。 ssh 登录 1Panel 服务器后，执行 1pctl user-info 命令可获取安全入口（entrance） 安装成功后，可使用 1pctl 命令行工具来维护 1Panel\nhttps://1panel.cn/docs/installation/cli/\n","date":"2023-08-14T04:27:00Z","permalink":"https://blog.lufei.de/p/1panel-%E6%98%AF%E6%96%B0%E4%B8%80%E4%BB%A3%E7%9A%84-linux-%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%90%E7%BB%B4%E7%AE%A1%E7%90%86%E9%9D%A2%E6%9D%BF/","title":"1Panel 是新一代的 Linux 服务器运维管理面板"},{"content":"安装依赖\napt update -y \u0026amp;\u0026amp; apt install -y curl 一键脚本\ncurl -sS -O https://raw.githubusercontent.com/kejilion/sh/main/kejilion.sh \u0026amp;\u0026amp; chmod +x kejilion.sh \u0026amp;\u0026amp; ./kejilion.sh 观看教程\n","date":"2023-08-12T17:04:38Z","permalink":"https://blog.lufei.de/p/%E5%BC%BA%E5%A4%A7%E7%9A%84ldnmp%E4%B8%80%E9%94%AE%E5%BB%BA%E7%AB%99%E8%84%9A%E6%9C%AC%E5%B7%A5%E5%85%B7/","title":"强大的LDNMP一键建站脚本工具"},{"content":"不管是在腾讯云,阿里云,还是海外vps上部署hugo博客,本教程均适用,详细记录,以备不时之需.\n1. 场景 ubuntu 20.04，使用root账号，创建普通账号，并赋予root权限。\n查看系统发行版本，命令如下：\nlsb_release -a 2. 服务器端 接下来就是网上介绍比较少的服务端配置\n1 .ssh 进自己的服务器 ssh root@XXX.XXX.XX.XX 2 .建立 git 用户 adduser git 默认会在/home路径下创建一个与用户名相同的用户目录。\n3. 安装 git sudo apt install git 4. 给新用户添加管理权限 如果希望新创建的用户具有管理权限，将用户添加到sudo组即可！\n将新用户添加到 sudo 组，命令如下：\nadduser git sudo 5. 账号切换 由root账号切换到普通账号：\nsudo su git 由普通账号切换到root账号：或者exit\nsudo su root 注意：切换到root账号时，需要输入当前账号的密码。\n6. 在服务端新建 git 仓库 注意这里建的不是 Github仓库，是自己的服务器上的 git 仓库\n在git目录下建立一个仓库 hugo.git 同时建立一个文件夹hugo用来存放仓库文件 su git cd /home mkdir git cd git git init --bare hugo.git sudo chown -R git:git hugo.git mkdir hugo 7. 配置钩子 vim /home/git/hugo.git/hooks/post-receive 写入以下文本\ngit --work-tree=/home/git/hugo --git-dir=/home/git/hugo.git checkout -f 配置权限\nsudo chmod +x /home/git/hugo.git/hooks/post-receive 8. 配置SSH公钥 先在本地生成\nssh-keygen -t RSA -C \u0026#34;usr邮箱\u0026#34; cat .ssh/id_rsa.pub 然后把 cat 内容复制到服务端的 .ssh/authorized_keys 文件内\ncd ~ mkdir .ssh touch .ssh/authorized_keys chmod 600 .ssh/authorized_keys vim .ssh/authorized_keys 到此为止完成了服务端全部配置，以上任何一步操作如果提示缺少了什么就sudo apt install一下\n3. 部署本地到服务端 在本地运行\nhugo 命令后，网站根目录内生成一个 public 文件夹，里面是静态网页文件，把这个 public文件夹整个 push 到我们刚刚在服务器端配置的 hugo.git 仓库里面\n远程 git 仓库地址格式, 例如ip是 8.8.8.8举例\ngit@8.8.8.8:/home/git/hugo.git 注意: 默认ssh是22 如果不是,请往下看\ncd public git init git add . git commit -m \u0026#39;First Commit\u0026#39; git remote add origin git@8.8.8.8:/home/git/hugo.git git push -u origin master 如果一切顺利，那么 hugo 站点已经成功部署在云服务器上，配置好Nginx, 访问域名即可显示\n如果SSH是其他端口 比如SSH:33 ip:8.8.8.8\ncd public git init git add . git commit -m \u0026#39;First Commit\u0026#39; git remote add origin ssh://git@8.8.8.8:33/home/git/hugo.git git push -u origin master 或者\ngit push -u ssh://git@8.8.8.8:33/home/git/hugo.git master 验证本地仓库关联到远程服务器的 Git 仓库 打开终端或命令行，进入到您本地的 Git 仓库目录。\n运行以下命令，查看当前配置的远程仓库信息：\ngit remote -v 显示本地仓库的远程关联信息。如果您已经成功关联了远程仓库，您会看到类似于以下的输出：\norigin ssh://git@8.8.8.8:33/home/git/hugo.git (fetch) origin ssh://git@8.8.8.8:33/home/git/hugo.git (push) 在这个输出中，origin 是远程仓库的名称，后面的 URL 显示了远程仓库的地址。如果您在这里看到您想要关联的服务器地址和端口，说明关联已经成功。\n您还可以尝试进行一次 git fetch 操作，以从远程仓库获取最新的更新： git fetch origin 如果操作成功，说明您的本地仓库可以与远程仓库通信。\n最后，您可以尝试进行一次 git push 操作，将本地的更改推送到远程仓库： git push origin master 测试 SSH 连接 (注意:ssh是33) ssh -p 33 git@8.8.8.8 这是是一个用于测试 SSH 连接的命令，它会尝试使用 SSH 协议通过指定的端口连接到指定的 IP 地址。如果成功连接，您将会看到类似于以下的输出\nWelcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-155-generic x86_64) ... 4. 自动推送脚本 每次都需要生成静态文件再推到服务端仓库，很麻烦，所以写一个脚本\n网站根目录 Mysite 下新建一个 vps.sh 脚本文件\ncd Mysite touch vps.sh 向其中添加内容：记得修改为你的 ip\n#!/bin/bash hugo -D --gc cd public git init git add . git commit -m \u0026#39;Update My Site to vps\u0026#39; git push origin master 双击打开运行vps.sh即可自动推送文件到仓库,以后写完博客或修改博客后都需要运行一下vps.sh,才能部署到云端\n注意,第一次运行vps.sh可能会出现如图这种情况,直接输入yes回车即可,如果仓库里没发现上传的文件可以再运行一次vps.sh\n5. 拉取远程更改并合并 在运行 git push 之前，先运行以下命令来拉取远程仓库的更改并尝试合并它们到你的本地分支： git pull origin master 如果出现冲突，需要解决冲突后再次提交\n强制推送： 如果你确定你的本地更改是正确的，而且你不需要保留远程仓库的更改，可以使用强制推送。但要注意，强制推送会覆盖远程分支的历史，可能会导致数据丢失。 git push -f origin master ","date":"2023-08-12T06:00:50Z","permalink":"https://blog.lufei.de/p/%E8%BF%81%E7%A7%BB-hugo-%E5%8D%9A%E5%AE%A2%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A/","title":"迁移 hugo 博客到服务器上"},{"content":"实时同步网盘，其实可以选择也挺多的，OneDrive、Google Drive、Dropbox、Box.com、iCloud等都是支持自动同步备份的，只可惜这些网盘很多都是打不开的。国内的坚果云在同步这一块做得不错，但是免费的额度太少了，不能满足大量同步的需要。\n本篇文章要分享的开源免费跨平台的文件同步工具Syncthing，可以实现实时同步备份搭建个人同步网盘的功能，试用了一下发现Syncthing完全可以替代市面上这些同步网盘。Syncthing可以运行在Windows、Linux、MacOS等全平台上，而且提供了安卓手机APP，功能非常强大。\nGitHub 项目地址：https://github.com/syncthing/syncthing\n文档地址：https://docs.syncthing.net/intro/getting-started.html\n客户端下载：https://github.com/syncthing/syncthing/releases\n开始安装 推荐使用普通用户安装,请往下看\n本文只记录在ubuntu20.04上怎么搭建\n更新一下组件\napt update -y \u0026amp;\u0026amp; apt install -y curl \u0026amp;\u0026amp; apt install -y socat \u0026amp;\u0026amp; apt install wget -y 然后:\nwget https://github.com/syncthing/syncthing/releases/download/v1.23.7/syncthing-linux-amd64-v1.23.7.tar.gz tar -zxvf syncthing-linux-amd64-v1.23.7.tar.gz cd syncthing-linux-amd64-v1.23.7 cp syncthing /usr/local/bin/ 接着:\nsyncthing 使用CTRL + C停止运行,修改文件\nvim /root/.config/syncthing/config.xml 将127.0.0.1:8384改成 0.0.0.0:8384 即可,保存退出\n再输入syncthing运行它。然后在浏览器输入服务器IP:8384访问。\n保持后台运行 对于VPS主机运行syncthing如果关闭终端，syncthing也会停止运行，可以将syncthing放在后台，命令如下：\nnohup syncthing \u0026amp; 开机自动启动并保持运行 vim /usr/lib/systemd/system/syncthing@.service 加入以下内容\n[Unit] Description=Syncthing - Open Source Continuous File Synchronization for %I Documentation=man:syncthing(1) After=network.target [Service] User=%i ExecStart=/usr/local/bin/syncthing -no-browser -no-restart -logflags=0 Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4 [Install] WantedBy=multi-user.target 然后保存退出，之后就可以通过systemd进行启动和管理了，注意注意把命令里面的root替换成自己的用户名：\n启动syncthing\nsystemctl start syncthing@root.service 设置syncthing开机自启\nsystemctl enable syncthing@root.service 查看syncthing运行状态\nsystemctl status syncthing@root.service 停止syncthing\nsystemctl stop syncthing@root.service 关闭syncthing开机自启\nsystemctl disable syncthing@root.service 或者可以用--user参数来运行\n1systemctl –root start syncthing 禁止IP访问 如果你已经成功绑定了域名到Syncthing，想要禁止使用IP访问Syncthing，那么把配置文件作如下修改即可。\n把端口设置成：0.0.0.0:8384，那么syncthing可以通过ip进行访问 。\n把端口设置成：127.0.0.1:8384，那么只能通过域名访问，这个时候只有通过nginx反向代理才能访问到127.0.0.1这个本地地址。\n更新 Syncthing 把 v1.23.7 改成最新版本即可\nwget https://github.com/syncthing/syncthing/releases/download/v1.23.7/syncthing-linux-amd64-v1.23.7.tar.gz tar -zxvf syncthing-linux-amd64-v1.23.7.tar.gz cd syncthing-linux-amd64-v1.23.7 systemctl stop syncthing@root.service cp syncthing /usr/local/bin/ systemctl start syncthing@root.service 使用普通用户安装 如果以 root 用户启动 Syncthing 会被提示不建议在 root 用户下运行，所以在正式使用之前，\n建立新用户 adduser sync 设置密码 然后一路回车默认 最后 y\n切换用户:\nsudo su sync 进入主目录:\ncd /home/sync 开始安装: wget https://github.com/syncthing/syncthing/releases/download/v1.23.7/syncthing-linux-amd64-v1.23.7.tar.gz tar -zxvf syncthing-linux-amd64-v1.23.7.tar.gz cd syncthing-linux-amd64-v1.23.7 cp syncthing /home/sync/syncthing 运行一次 syncthing，程序会将配置文件释放出来。\n停止运行程序，先编辑配置文件。\nvim /home/sync/.config/syncthing/config.xml 找到 \u0026lt;address\u0026gt; 这行，将 127.0.0.1 改为 0.0.0.0，这样就可以从公网访问 Web UI 了，保存退出。\n再次直接运行 syncthing，然后在地址栏输入 http://w.x.y.z:8384/ 进入 Syncthing 的 Web UI 管理界面，第一次访问时会提醒设置账号及密码，建议设置并重启 Syncthing。\n这时候 syncthing 就已经可以开始正常使用了，如果使用了防火墙，在过程中对相应的规则进行放行。\n那么将执行以下命令：\niptables -I INPUT -p tcp --dport 8384 -j ACCEPT 开机自启 切换回root: sudo su root\nvim /lib/systemd/system/syncthing.service [Unit] Description=Syncthing Documentation=man:syncthing(1) After=network.target [Service] User=sync ExecStart=/home/sync/syncthing -no-browser -no-restart -logflags=0 Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4 # Hardening ProtectSystem=full PrivateTmp=true SystemCallArchitectures=native MemoryDenyWriteExecute=true NoNewPrivileges=true [Install] WantedBy=multi-user.target 最后:\nsystemctl enable syncthing systemctl start syncthing Syncthing Tray 简单小巧的文件同步工具 点击下载:\nSyncthing Tray\n","date":"2023-08-12T03:18:50Z","permalink":"https://blog.lufei.de/p/syncthing%E5%BC%80%E6%BA%90%E5%85%8D%E8%B4%B9%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8C%E6%AD%A5%E5%B7%A5%E5%85%B7-%E5%88%A9%E7%94%A8syncthing%E6%90%AD%E5%BB%BA%E5%85%8D%E8%B4%B9%E5%90%8C%E6%AD%A5%E7%BD%91%E7%9B%98/","title":"Syncthing开源免费跨平台的文件同步工具-利用Syncthing搭建免费同步网盘"},{"content":"独角数卡发卡宝塔安装教程详细记录(转载于github)\n前景概要 ⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️` `⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️` `⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️ 搭配视频教程食用更佳 请自备梯子🪜科学上网 视频教程👉🏻https://t.me/dujiaoshuka/22\n首先： 你需要一台内存512M或以上为最佳的vps或云服务器 其次 你的服务器操作系统要为 linux 内核，我可不管你是什么centos党还是ubuntu党\n什么？ 没有？ 那请点击浏览器右上角的X号!\n宝塔安装 直接自己去看吧: bt.cn。 如果宝塔都不会玩我建议你放弃~\n必装环境 接下来我们安装一下下图六个软件： 最好是编译安装哦，性能更好。 🙋由于在之前版本很多同学不会使用supervisor，所以2.0.+版本我们会采用较为简单的堡塔应用管理器来实现守护进程。\nPHP环境确认 一、 接下来我们按照步骤删除一下php的禁用函数 （ps:宝塔默认会禁用一些php的函数，导致artisan命令无法正确运行）\n点击【软件商店】-\u0026gt;【PHP设置】-\u0026gt;【禁用函数列表】 将以下函数删除！！ putenv，proc_open，pcntl_signal，pcntl_alarm\n二、 我们再装一下必要的两个扩展 点击【软件商店】-\u0026gt;【PHP设置】-\u0026gt;【安装扩展】 安装以下三个扩展： fileinfo、redis、opcache(可选安装，性能加强)\n新建一个网站 一、在宝塔里新建一个网站用于运行本项目 二、上传我们的项目代码 请选择xxx_build.tar.gz压缩包。 ⚠️一定要选择带build字样的包，才有依赖！ 独角数卡发行版本下载地址：独角数卡各发行版本\n三、设置项目伪静态和运行目录 解压项目代码后，我们点击网站的设置 设置运行目录： 设置伪静态： 开始安装 一、访问你的网站域名，进入安装流程 二、按实际情况填写网站配置信息 配置守护进程 注意，很多人嫌麻烦不配置这一步，那你出了问题别哔哔！⚠ ⚠ ⚠ 注意，很多人嫌麻烦不配置这一步，那你出了问题别哔哔！⚠ ⚠ ⚠ 注意，很多人嫌麻烦不配置这一步，那你出了问题别哔哔！⚠ ⚠ ⚠\n堡塔应用管理器是我们用来管理laravel队列进程的工具。\n很多同学喜欢问可不可以不执行这一步。\n现在我明确的告诉你，不可以！请按照教程来，不然可以选择不使用。🙅‍♀️\n没有它的话你的程序执行会异常！\n如果不喜欢使用堡塔应用管理器，那么使用1.x版本supervisor也是可以的，两个必须选一个！ 必选题！\n一、堡塔应用管理器配置教程 进入宝塔控制面板： 步骤：【软件商店】-\u0026gt;【堡塔应用管理器设置】-\u0026gt;【添加应用】 如图： 名称：随意，如dujiao 应用环境: 选择php7.4 启动文件: 网站根目录 + /artisan 执行目录: 网站根目录 启动参数: queue:work\n保存即可!\n如果遇到没有自己的php版本怎么办？或者系统有多个php版本，但是应用环境没有自己想要的那个php版本怎么办？\n请看下一步新增应用环境\n新增应用环境 环境名称可以随便填。\n启动文件一般是 /www/server/php/72/bin/php\n⚠️注意哦，我这里是72就是php7.2，你可能是73或者74。按照自己来，我这里只是举例！\n二、supervisor配置教程 步骤：【软件商店】-\u0026gt;【Supervisor设置】-\u0026gt;【添加守护进程】 如图： 命令参考：\n/www/server/php/74/bin/php /www/wwwroot/dujiaoka/artisan queue:work 名称：随意填写 启动用户：选择www 运行目录：选择程序根目录 启动命令：/www/server/php/你的php版本/bin/php /www/wwwroot/你的网站根目录/artisan queue:work\n请注意你自己的php版本和网站根目录。不要瞎抄照着我的写？ 注意命令之间的空格。\n","date":"2023-08-11T17:01:01Z","permalink":"https://blog.lufei.de/p/%E7%8B%AC%E8%A7%92%E6%95%B0%E5%8D%A1%E5%8F%91%E5%8D%A1%E5%AE%9D%E5%A1%94%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/","title":"独角数卡发卡宝塔安装教程"},{"content":"1.特点 Syncthing 是一个连续的文件同步程序。它可以在两台或更多的计算机之间同步文件。\n总结下面几个特点：\n中文友好（支持中文界面） 设置简单，易上手 支持 Linux、Windows、macOS（NAS 也可以方便部署） 同步效率不错 支持版本控制（可以恢复到指定的版本） Docker 部署方便 支持同步加密，保护数据安全（不过咕咕还不知道如果解密，后续可以阅读一下文档，有知道的小伙伴也欢迎留言区留言和大家分享一下） 支持一对多、多对一、一对一 使用的人比较多，发现问题可以比较容易搜索到解决方案。（毕竟 GitHub 上都有 4 万多的 star） 2. 项目展示 GitHub 项目地址：https://github.com/syncthing/syncthing\n文档地址：https://docs.syncthing.net/intro/getting-started.html\n客户端下载：https://github.com/syncthing/syncthing/releases\n本文用的 Docker 镜像：https://hub.docker.com/r/linuxserver/syncthing\n3. 搭建方式 apt update -y # 升级packages apt install wget curl sudo vim git # 推荐Debian 创建一下安装的目录：\nmkdir -p /home/data/docker_data/syncthing cd /home/data/docker_data/syncthing nano docker-compose.yml docker-compose.yml 填入以下内容：\n--- version: \u0026#34;2.1\u0026#34; services: syncthing: category_bar: true lscr.io/linuxserver/syncthing container_name: syncthing hostname: syncthing #optional environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /home/data/docker_data/syncthing/config:/config - /home/data/docker_data/syncthing/Documents:/Documents - /home/data/docker_data/syncthing/Media:/Media ports: - 8384:8384 - 22000:22000/tcp - 22000:22000/udp - 21027:21027/udp restart: unless-stopped 没问题的话，ctrl+x 退出，按 y 保存，enter 确认。\n然后运行：\ndocker-compose up -d 访问：http:服务ip:8384 即可。\n","date":"2023-08-11T07:04:25Z","permalink":"https://blog.lufei.de/p/%E5%A5%BD%E7%94%A8%E5%85%8D%E8%B4%B9%E5%BC%80%E6%BA%90%E5%90%8C%E6%AD%A5%E5%B7%A5%E5%85%B7syncthing%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/","title":"好用免费开源同步工具Syncthing安装教程"},{"content":"\n1.LinuxOne （无需信用卡）：【链接】 需要按视频教程的步骤进行设置。\n2.Hax VPS （无需信用卡）：【链接】\n3.Oracle Cloud 甲骨文云：【链接和工具】\n4.AWS 亚马逊云：【注册链接】\n5.Vultr：注册首充35刀就送100美元【优惠链接】\n6.GCP 谷歌云 ：【官方链接】\n7.Linode：【链接直达】\n8.Ditital Ocean：充值25刀可以获得额外200美元【优惠链接】\n9.Kamatera：【注册链接】\n10.CIVO： 【官方链接】\n11.Evolution Host：【申请链接】\n连接VPS、云服务器的工具：\n1.WinSCP：https://winscp.net\n2.Putty：https://www.putty.org\n3.tabby: https://tabby.sh/\n","date":"2023-08-09T14:28:32Z","permalink":"https://blog.lufei.de/p/10%E4%B8%AA%E5%8F%AF%E4%BB%A5%E5%85%8D%E8%B4%B9%E7%99%BD%E5%AB%96vps%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%BD%91%E7%AB%99%E7%BB%99%E5%A4%A7%E5%AE%B6%E9%83%BD%E7%BD%97%E5%88%97%E5%87%BA%E6%9D%A5%E4%BA%86./","title":"10个可以免费白嫖VPS、云服务器的网站！给大家都罗列出来了…."},{"content":"其实 rclone 挂载 Google Drive 网上的教程已经很多了，但是大多数的教程都有一点点过时，与现在的实际操作有一点出入，故整理了当前的挂载操作，以防忘记。\n一、 安装并配置 rclone 安装unzip和curl：\nDebian/Ubuntu系统\nsudo apt-get update sudo apt-get install curl unzip CentOS\nsudo yum install curl unzip 安装依赖：\n# centos yum install -y fuse fuse3 或者 yum install fuse3 # debian apt-get install fuse3 一键安装rclone脚本\ncurl https://rclone.org/install.sh | sudo bash vps上开始配置rclone：\nrclone config 选择 n，新建一个\nNo remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q\u0026gt; n 输入新建的名称，随意写:比如 gd\nEnter name for new remote. name\u0026gt;gd 选择要挂载的网盘类型，选择18，Google Drive\n输入client_id、client_secret\n选择Google Drive 谷歌云盘的操作权限，选择1，完整的访问权限\nOption scope. Scope that rclone should use when requesting access from drive. Choose a number from below, or type in your own value. Press Enter to leave empty. 1 / Full access all files, excluding Application Data Folder. \\ (drive) 2 / Read-only access to file metadata and file contents. \\ (drive.readonly) / Access to files created by rclone only. 3 | These are visible in the drive website. | File authorization is revoked when the user deauthorizes the app. \\ (drive.file) / Allows read and write access to the Application Data folder. 4 | This is not visible in the drive website. \\ (drive.appfolder) / Allows read-only access to file metadata but 5 | does not allow any access to read or download file content. \\ (drive.metadata.readonly) scope\u0026gt; 1 回车默认\nOption service_account_file. Service Account Credentials JSON file path. Leave blank normally. Needed only if you want use SA instead of interactive login. Leading `~` will be expanded in the file name as will environment variables such as `${RCLONE_CONFIG_DIR}`. Enter a value. Press Enter to leave empty. service_account_file\u0026gt; 是否要编辑高级配置，我这里选择n\nEdit advanced config? y) Yes n) No (default) y/n\u0026gt; n 下面注意了，选择n，表示自行配置，\nUse auto config? * Say Y if not sure * Say N if you are working on a remote or headless machine y) Yes (default) n) No y/n\u0026gt; n 复制代码(下图红色框起来的地方)，等下会用到\n二、获取授权 一：下载rclone （windows） https://rclone.org/downloads/\n二：获取授权码 打开cmd: 进入你的 rclone目录 \u0026ndash; 空白处右键\u0026ndash;在此处打开命令行窗口\n如果开启了科学上网，输入以下命令：\nset http_proxy=socks5://127.0.0.1:7890 set https_proxy=socks5://127.0.0.1:7890 取消sock5代理 （可选）\nset http_proxy= set https_proxy= 粘贴VPS生成的代码回车\n（浏览器自动打开进入到谷歌账号登录界面，并选择同意授权。由于是新申请的 API，所以谷歌会提醒该应用未经验证。但是左下角有一行小灰字，点击选择继续就能授权）\n授权成功浏览器会提示 success：\n此时返回CMD命令行，等待几秒就能看见授权的 code 了。\n复制授权，回到vps终端，粘贴到 vps 中。红色框起来的地方\n接下来 rclone 会询问是否为团队盘：选择n\nConfigure this as a Shared Drive (Team Drive)? y) Yes n) No (default) 如果您要挂载的就是团队盘，那么选择 y，不是的话就选择 n\n此时配置就已经结束了，退出 clone，开始挂载。\n三、 挂载 Google Drive 首先新建一个文件夹用于挂载：\nmkdir -p /home/google 开始挂载：\nrclone mount gd: /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; 其中 gd 是 rclone 配置时输入的配置名称，/home/google 是挂载目录\n还可以自定义设置网盘里的文件夹路径，例如：\nrclone mount gd:backup /home/google --allow-other --vfs-cache-mode writes --allow-non-empty --no-modtime \u0026amp; gd 为 rclone 的配置名称：backup 为网盘里的目录名\n检查挂载：\ndf -h 卸载挂载：（/home/google 为挂载目录）\nfusermount -qzu /home/google 完结~\n","date":"2023-08-09T13:48:07Z","permalink":"https://blog.lufei.de/p/vps%E4%BD%BF%E7%94%A8rclone%E6%8C%82%E8%BD%BDgoogle-drive%E6%95%99%E7%A8%8B/","title":"vps使用rclone挂载Google Drive教程"},{"content":"官网: https://fleek.co/hosting/\n免费套餐: 每月50G流量\nhttps://fleek.co/pricing/\n特点 优势 Git 集成 简化代码管理和部署流程 自动部署 省时省力地将站点部署到网络 自动SSL 自动为站点提供SSL安全证书 全球CDN 加速内容全球分发 速度极快 利用边缘网络提供快速加载 便于使用 用户友好的界面和操作 协作性 便于团队协作和版本控制 可定制 支持灵活的定制需求 优势 描述 速度快 Fleek的边缘网络结合了IPFS和边缘计算技术，为用户提供极快的加载时间，同时部署到Fleek Edge。 去中心化 使用Fleek，您的IPFS托管网站和应用程序不仅备份在其服务器上，还会自动存档到去中心化存储网络Filecoin，作为开放网络中的附加备份层。 ","date":"2023-08-09T06:34:31Z","permalink":"https://blog.lufei.de/p/%E5%B0%86hugo%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E8%87%B3ipfs/","title":"将hugo博客部署至IPFS"},{"content":"公共DNS汇总,互联网企业\u0026amp;高校DNS\n互联网企业\u0026amp;高校DNS (推荐中科大)\n厂商 IPV4地址（主） IPV4地址（备） 中科大DNS 中国电信 202.141.162.123 中科大DNS 中国移动 202.141.176.93 中科大DNS 教育网 202.38.93.153 114 DNS 114.114.114.114 114.114.115.115 114 DNS安全版 114.114.114.119 114.114.115.119 114 DNS家庭版 114.114.114.110 114.114.115.110 阿里 AliDNS 223.5.5.5 223.6.6.6 百度 BaiduDNS 180.76.76.76 DNSPod/腾讯DNS 119.29.29.29 119.28.28.28 182.254.116.116 182.254.118.118 DNSPod/腾讯DNS DoT dot.pub 1.12.12.12 | 120.53.53.53 CNNIC SDNS 1.2.4.8 210.2.4.8 OneDNS 拦截版 117.50.11.11 52.80.66.66 OneDNS 纯净版 117.50.10.10 52.80.52.52 OneDNS 家庭版 117.50.60.30 52.80.60.30 清华大学 TUNA 101.6.6.6 ","date":"2023-08-09T04:20:03Z","permalink":"https://blog.lufei.de/p/%E5%85%AC%E5%85%B1dns%E6%B1%87%E6%80%BB/","title":"公共DNS汇总"},{"content":" 用过百度统计、友盟，最后的51拉(半夜带你嗨皮)，最后选择自建\n今天带大家用 Umami 快速搭建一个网站访客监控系统，界面清爽简洁，适合自部署。\n内存占用：约 250MB 镜像大小：约 670MB 🧱 1. 创建 docker-compose.yml 前提：已经安装好 Docker 和 curl 工具。\ncd ~ mkdir -p ~/data/docker_data/umami cd ~/data/docker_data/umami curl -o docker-compose.yml https://raw.githubusercontent.com/woniu336/open_shell/main/docker-compose.yml 🚫 2. 解决广告拦截问题（可选优化） Umami 默认的追踪脚本路径容易被广告拦截器屏蔽，因此建议修改为自定义路径。\n默认脚本地址：https://your-umami.com/script.js 默认数据收集接口：https://your-umami.com/api/send 修改方法： 打开配置文件：\ncd ~/data/docker_data/umami nano docker-compose.yml 修改以下环境变量（路径名称随意）：\nTRACKER_SCRIPT_NAME: x.js：追踪脚本路径自定义为 x.js COLLECT_API_ENDPOINT: /api/x：数据收集接口自定义为 /api/x 🔗 配置参考：GitHub 地址\n最终前端页面引用示例： \u0026lt;script async defer data-website-id=\u0026#34;你的website-id\u0026#34; src=\u0026#34;https://your-domain.com/x.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 修改完毕后按下：\nCtrl + X 退出编辑 Y 保存 Enter 确认 ▶️ 3. 启动 Umami 服务 docker compose up -d 然后访问浏览器中的地址：\nhttp://你的IP:3000 默认登录信息：\n用户名：admin 密码：umami 界面支持切换语言，右上角切换为中文。\n⚠️ 如果你使用宝塔面板，请确保放行 3000 端口；在腾讯云、阿里云等平台，还需在云服务后台开放对应端口。\n🔁 4. 修改追踪路径后重启服务 如需后续再次修改追踪路径：\ncd ~/data/docker_data/umami nano docker-compose.yml 保存修改后，重启服务：\ndocker compose down docker compose up -d ","date":"2023-08-08T14:30:23Z","permalink":"https://blog.lufei.de/p/umami/","title":"🚀搭建一个小而美的网站访问统计监控 ——Umami"},{"content":"EasyImage 简单图床 2.0 支持多文件上传,简单无数据库,返回图片url,markdown,bbscode,html的一款图床程序\n演示地址：png.cm\n在当前html5流行大势所趋下，遂利用基础知识新写了一个以html5为默认上传并且支持flash,向下兼容至IE9。\n功能支持： 支持仅登录后上传 支持设置图片质量 支持上传图片转换为指定格式 支持文字/图片水印 支持设置图片指定宽/高 支持限制最低宽度/高度上传 支持设置广告 支持开启/关闭api上传 在线管理图片(增、删、改、查) 支持网站统计 请将统计代码放入:public/static/hm.js 更多····· 注意： 安装之前先使用浏览器访问check.php检查扩展是否都安装！ 请将所有文件赋予0755权限或www权限 上传后必须修改config.php的位置： domain 当前图片域名 password 登录管理密码！ 如果无法登陆管理界面或上传图片，请先打开check.php检查扩展或者使用phpinfo检查。 可以使用浏览器的 F12调试模式-\u0026gt;console查看错误 如果对php不太熟悉的话，不要将图床程序放置于二级目录 下载源码后可以删除一些文件：README.md,check.php,LICENSE API上传示例： 参数：\n参数名称 类型 是否必须 说明 image file 是 需上传的图片 api text 是 token html form上传示例:\n\u0026lt;form action=\u0026#34;../index.php\u0026#34; method=\u0026#34;post\u0026#34; enctype=\u0026#34;multipart/form-data\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;file\u0026#34; name=\u0026#34;image\u0026#34; accept=\u0026#34;image/*\u0026#34; \u0026gt; \u0026lt;input type=\u0026#34;text\u0026#34; name = \u0026#34;token\u0026#34; placeholder=\u0026#34;在tokenList文件找到token并输入\u0026#34;/\u0026gt; \u0026lt;input type=\u0026#34;submit\u0026#34; /\u0026gt; \u0026lt;/form\u0026gt; api上传成功后返回json：\n// 参数:\u0026#34;sucess\u0026#34;上传成功 \u0026#34;url\u0026#34; 图片链接 \u0026#34;del\u0026#34; 删除链接 \u0026#34;failed\u0026#34; 上传失败 \u0026#34;message\u0026#34; 错误信息 {\u0026#34;result\u0026#34;:\u0026#34;success\u0026#34;,\u0026#34;url\u0026#34;:\u0026#34;http:\\/\\/192.168.1.15\\/i\\/2021\\/05\\/03\\/u34au6_2.jpg\u0026#34;,\u0026#34;del\u0026#34;:\u0026#34;http:\\/\\/192.168.1.15\\/api\\/api-web.php?hash=XH%BB2Z%D1%08%D8%E2%D7%048%DFJ%86n%C0%06%DAD%DCP%3E%CF%C4%1B%60%E5%C4Pli\u0026#34;} 安全配置 Apache配置文件默认设置上传目录不可运行 RewriteEngine on RewriteCond % !^$ RewriteRule i/(.*).(php)$ – [F] RewriteRule public/(.*).(php)$ – [F] RewriteRule config/(.*).(php)$ – [F] Nginx请在Nginx配置： # 禁止运行php的目录 location ~* ^/(i|public|config)/.*\\.(php|php5)$ { deny all; } ","date":"2023-08-08T14:03:39Z","permalink":"https://blog.lufei.de/p/easyimage%E4%B8%80%E4%B8%AA%E7%AE%80%E6%B4%81%E7%9A%84%E5%BC%80%E6%BA%90%E5%9B%BE%E5%BA%8A%E7%A8%8B%E5%BA%8F/","title":"EasyImage：一个简洁的开源图床程序"},{"content":"\n1.Final2x 图片放大工具，免费开源 【开源项目】\n2.Gopeed 一款支持全平台的下载器 【官方下载】\n3.视频压缩神器 【下载链接】\n4.Optimizer 堪称是 Windows 系统上最好用的性能优化器！【开源项目】\n5.memreduct 内存自动优化清理 【开源项目】\n6.ssh客户端 https://tabby.sh/\n7.在线抠图 https://www.remove.bg/zh\n8.压缩图像 https://www.iloveimg.com/zh-cn/compress-image\n","date":"2023-08-08T07:09:37Z","permalink":"https://blog.lufei.de/p/8%E6%AC%BE%E8%89%AF%E5%BF%83%E5%AE%9E%E7%94%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90%E7%9C%9F%E6%AD%A3%E7%9A%84%E6%96%B0%E7%B3%BB%E7%BB%9F%E5%BF%85%E5%A4%87%E7%BB%9D%E5%AF%B9%E5%88%B7%E6%96%B0%E4%BD%A0%E7%9A%84%E8%AE%A4%E7%9F%A5/","title":"8款良心实用的软件推荐，真正的新系统必备，绝对刷新你的认知！"},{"content":"开源自动工作流工具 n8n 前几天在官方博客上宣布了新里程碑 1.0 版本，拥有更加稳定的性能，并且提供了 Python 支持，新增语义版本控制，代表着 n8n 可以用于更苛刻的生产环境。\n小众软件在 2019 年介绍过 n8n，这是一个开源的自动工作流服务，类似 IFTTT、Zapier，可以互联互通包括 GitHub、Dropbox、Google、NextCLoud、RSS、Slack、Telegram 在内的几十款在线服务。实现当 A 条件发生，触发 B 服务这样的自动工作流程。\n你可以直接使用 n8n 提供的服务，也可以自托管使用自己的服务器来处理工作流。\n一键自托管安装（基于 Docker）：\ndocker run -it --rm --name n8n -p 5678:5678 -v ~/.n8n:/home/node/.n8n docker.n8n.io/n8nio/n8n 然后，就可以使用 ip:5678 来访问控制台了。\n附：n8n 更新日志：\n我们很高兴地宣布，n8n版本1.0已经发布，这是我们的工作流自动化平台的最新迭代。有了这个版本，n8n自信地走上了作为生产就绪服务的舞台，磨砺以满足我们的云、自托管和企业用户的需求。\n我们对稳定性和性能的承诺比以往任何时候都更加坚定。在版本1.0中，我们优化了n8n，以支持您的关键工作流，使其成为您自动化旅程中的坚定伙伴。\n响应广大用户的需求，n8n现在提供了Python支持，这为依赖Python进行自动化任务的用户提供了新的能力。\n为了简化您的更新过程，我们采用了语义化版本。这保证了您能体验到可预测的、无麻烦的更新，保持与我们最新的增强和bug修复同步。\n版本1.0体现了我们致力于在最具挑战性的环境中使n8n变得可行的承诺。我们推出了单点登录（SSO）等功能，以便顺利地与您现有的身份验证系统集成。您现在可以在多个环境中同步工作流，并使用全局变量、日志流式处理和高级执行过滤器来增强您的工作流和简化自动化过程。\n请注意，版本1.0引入了一些重大变化。我们准备了完整的迁移指南，确保您现有工作流的顺利过渡。 在庆祝这个里程碑的同时，我们向活跃的n8n社区表达了诚挚的感谢。您持续的支持和深思熟虑的反馈对于塑造今天的n8n有着重大的作用。\n拥抱自动化的未来。自动化愉快！\nn8n团队\n","date":"2023-08-08T06:45:36Z","permalink":"https://blog.lufei.de/p/%E5%BC%80%E6%BA%90%E8%87%AA%E5%8A%A8%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%B7%A5%E5%85%B7-n8n-%E5%8F%91%E5%B8%83-1.0-%E7%89%88%E6%9C%AC/","title":"开源自动工作流工具 n8n 发布 1.0 版本"},{"content":"说明：我们的很多VPS服务器，默认的端口都是22，所以一直会被人扫描爆破，很容易会出现问题，所以我们需要通过修改端口来尽可能减少这种事情发生，之前发过手动修改教程，但对于很多小白或者很懒的人来说，更喜欢一键脚本就能完成的方法，这里就整了个SSH端口一键修改脚本。从OneinStack一键安装包上扒下来的。\n方法 系统要求：支持Debian、Ubuntu、CentOS系统。\n运行以下命令：\nwget https://raw.githubusercontent.com/woniu336/open_shell/main/sshport.sh\u0026amp;\u0026amp; bash sshport.sh 输入端口确认。再打开防火墙端口：\n#如果防火墙使用的iptables（Centos 6），修改端口为8080\niptables -I INPUT -p tcp --dport 8080 -j ACCEPT service iptables save service iptables restart #如果使用的是firewall（CentOS 7）\nfirewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload 最后重启ssh生效：\n#CentOS系统 service sshd restart #Debian/Ubuntu系统 service ssh restart 然后就可以使用新端口SSH登录了\n","date":"2023-08-08T06:00:20Z","permalink":"https://blog.lufei.de/p/linux-vps%E6%9C%8D%E5%8A%A1%E5%99%A8ssh%E7%AB%AF%E5%8F%A3%E4%B8%80%E9%94%AE%E4%BF%AE%E6%94%B9%E8%84%9A%E6%9C%AC/","title":"Linux VPS服务器SSH端口一键修改脚本"},{"content":"Windows 激活方法 打开 命令提示符 (管理员)，复制以下命令到命令提示符并回车。\nslmgr /skms kms.v0v.bid \u0026amp;\u0026amp; slmgr /ato 激活成功。\n","date":"2023-08-07T17:15:48Z","permalink":"https://blog.lufei.de/p/%E4%B8%80%E6%9D%A1%E5%91%BD%E4%BB%A4%E6%BF%80%E6%B4%BB-windows-%E7%B3%BB%E7%BB%9F/","title":"一条命令激活 Windows 系统"},{"content":"1.Windows 11 官方下载：【点击进入】\n2.Rufus 写盘工具：【官网链接】\n3.永久免费激活看视频演示\n4.KMS ：CMD以管理员身份依次输入以下命令\nslmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmgr /skms kms.loli.best slmgr /ato ","date":"2023-08-07T04:36:16Z","permalink":"https://blog.lufei.de/p/%E6%9C%80%E6%96%B0%E5%8E%9F%E8%A3%85%E6%AD%A3%E7%89%88%E7%9A%84-windows-11-%E7%B3%BB%E7%BB%9F%E5%AE%98%E6%96%B9%E7%BA%AF%E5%87%80%E7%89%88%E5%85%8D%E8%B4%B9%E5%AE%89%E8%A3%85%E5%B9%B6%E6%BF%80%E6%B4%BB/","title":"最新原装正版的 Windows 11 系统官方纯净版，免费安装并激活！"},{"content":"背景 如果说翻墙后最必备的两个软件。\n第一就是Youtube，俗称油管，YouTube拥有海量的视频内容，涵盖了几乎所有的领域和主题，到2023年，Youtube月活跃用户超过2.5亿，翻墙后1/4的流量都在Youtube。\n第二就是Telegram，俗称电报，由于Telegram支持创建大型群组和频道，可以容纳成千上万的成员。这使得它成为组织、社区和媒体机构进行广泛传播和交流的理想平台。\n对比QQ群和电报群 给大家看一下QQ群和电报群的对比\nQQ群默认200人，QQ达到一定等级可以升级为500人。1000人需要年费超级会员，3000人群需要超级会员+648。\n电报群，一进去创建，就可以创建20万人的群，无任何限制，永久保存历史记录，不限制大小。\n我说一句国内的平台仗着国外的平台进不来就公然喂大家吃屎大家没人反对吧。\n而作为一个Telegram的新人，你可能都不知道如何找到想要的群组频道，Telegram给你准备了各种各样的机器人，机器人定制化并支持非常丰富的功能，而最主要的就是内置搜索，可以搜到任何你想要的群组，频道，强大能力堪比谷歌。\n我今天就来给大家介绍一款集成了ChatGPT的电报机器人，可以免费无需任何API Key，随时随地和ChatGPT对话，还能在里面搜索到各种你想要的群组和资源。还可以帮你一键汉化。\n体验 我们今天就来体验下，这款万能的机器人。\n直接在手机的电报应用打开电报应用，链接我放在了视频下方：极搜机器人\n或者直接在搜索框里面搜索 jisou123bot，自动就找到了这款机器人。\nInfo\n它能做什么？ 这是一个搜索机器人，您可以向它发送关键字来寻找群组、频道或消息。另外，您还可以在它上面免费使用ChatGPT。\n我们点击开始使用这个机器人。\n自动进入机器人，如果你的电报还没有汉化，直接点击中文包，然后点击更改，就可以一键汉化，是不是非常方便。\n菜单里面我们看看功能有多强大，热门群聊热搜排行榜等等。你也可以自己在消息栏搜索群组加入。\nChatGPT 大家最关注的可能就是ChatGPT了，很多人苦于没有ChatGPT的账号，今天就让大家体验一下ChatGPT，永久免费，没有限制。\n点击菜单-\u0026gt;切换到ChatGPT\n然后问它 几个问题。我们只做几个简单的测试。涉及逻辑，专业，文学。\n爸爸妈妈结婚是近亲结婚吗？\npython怎么读取json文件？\n给我写一篇年度最佳员工的获奖感言。\n可以感觉的回答速度和质量都是很不错的，如果你有兴趣赶紧尝试下。\n群组搜索 热门群聊\n福利 -\u0026gt; 这个我不说，懂的都懂，还有加密货币，游戏，电影，二次元等等分类。\n比如你想搜索原神相关的内容，聊天窗口直接输入原神，就搜索了所有原神相关的内容，下面的图标可以过滤类型，聊天图标就是群组和频道，然后点击群组就只过滤群组，然后直接找到第一个群组：原神 提瓦特大陆加入群组。\n加入群组 你可以把 机器人加入群组，来自动回复和支持chatgpt在群内聊天。\n我这里教你创建一个群组加入机器人来回复消息。\n","date":"2023-08-05T06:03:46Z","permalink":"https://blog.lufei.de/p/telegram-%E5%BF%85%E5%A4%87%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%94%AF%E6%8C%81chatgpt%E6%B0%B8%E4%B9%85%E5%85%8D%E8%B4%B9%E4%B8%80%E9%94%AE%E6%B1%89%E5%8C%96%E6%B5%B7%E9%87%8F%E7%BE%A4%E7%BB%84%E6%90%9C%E7%B4%A2%E5%8F%AA%E6%9C%89%E4%BD%A0%E8%BF%98%E4%B8%8D%E7%9F%A5%E9%81%93/","title":"Telegram 必备机器人，支持ChatGPT，永久免费，一键汉化，海量群组搜索，只有你还不知道？"},{"content":"感谢 @WM 的推荐，来自 X 的用户 @StarIight✨ 分享了一个 Featured/Bug：只需要在安装 Windows 11 时，使用用户名 no@thankyou.com 登录，即可跳过联网账户，轻松创建本地账。@Appinn\n这就…当青小蛙看到这个的时候，只能卧槽了…\n就在前几天，青小蛙还在论坛分享了这个：《不联网，无网络安装 Windows 11》\n在 Windows 11 的最新版本 22H2 中，微软干掉了“我没有 Internet 连接”按钮，没登陆不让你装系统。\n有些电脑网卡没有驱动就直接卡在这里了。 此时你可以按下 Shift+F10 打开命令提示符，输入 oobe\\BypassNRO.cmd 即可重启进入带有跳过按钮的 OOBE。\nno@thankyou.com 而这个莫名其妙又有些好笑的账户，基本上就是替代上面的命令行，只需要登录时输入，密码随意，就能跟着向导创建本地账户了。\n简直…太好用。\n微软你说你是不是深井冰。\n","date":"2023-08-05T03:04:51Z","permalink":"https://blog.lufei.de/p/%E7%BB%9D%E5%A6%99%E5%9C%A8%E5%AE%89%E8%A3%85-windows-11-%E6%97%B6%E9%80%89%E6%8B%A9-no@thankyou.com-%E7%99%BB%E5%BD%95%E8%BD%BB%E6%9D%BE%E5%88%9B%E5%BB%BA%E6%9C%AC%E5%9C%B0%E8%B4%A6%E6%88%B7%E6%97%A0%E9%9C%80%E8%81%94%E7%BD%91%E8%B4%A6%E6%88%B7/","title":"绝妙！在安装 Windows 11 时选择 no@thankyou.com 登录，轻松创建本地账户，无需联网账户"},{"content":"系统 debian/ubuntu\n客户端 V2Ray桌面版：https://github.com/2dust/v2rayN/releases\nV2Ray安卓端：https://github.com/2dust/v2rayNG/releases\nNekoBox安卓端推荐：https://github.com/MatsuriDayo/NekoBoxForAndroid/releases\nClashMeta：https://github.com/MetaCubeX/ClashMetaForAndroid/releases\nFlClash：https://github.com/chen08209/FlClash/releases\n方法1 为了确保 Hysteria 2 能够正常工作，您需要开放所有 TCP 和 UDP 端口：\nsudo ufw allow 1:65535/tcp sudo ufw allow 1:65535/udp sudo ufw enable 使用以下命令下载并运行 Hysteria 2 安装脚本：\n注意：伪装网址设置为：www.bing.com\n配置文件路径：/root/hy\nHysteria 2 一键搭建代码\nwget -N --no-check-certificate https://raw.githubusercontent.com/flame1ce/hysteria2-install/main/hysteria2-install-main/hy2/hysteria.sh \u0026amp;\u0026amp; bash hysteria.sh Hysteria 服务相关命令\nsystemctl start hysteria-server.service # 启动 hysteria 服务 systemctl enable hysteria-server.service # 设置 hysteria 服务 开机自启动 systemctl restart hysteria-server.service # 重启 hysteria 服务 systemctl stop hysteria-server.service # 停止 hysteria 服务 systemctl status hysteria-server.service # 查看 hysteria 服务 状态 复制订阅链接\ncat /root/hy/url.txt Windows配置v2ray 设置Core类型：sing_box\n方法2 项目：https://github.com/jonssonyan/h-ui\n文档：https://github.com/jonssonyan/h-ui/blob/main/README_ZH.md\n注意：密码不能有特殊字符\n配置文件路径：/usr/local/h-ui\n证书路径：/h-ui/bin （如果是docker方式安装，证书路径放在/h-ui/bin）\n安装：\nmkdir -p /usr/local/h-ui/ curl -fsSL https://github.com/jonssonyan/h-ui/releases/latest/download/h-ui-linux-amd64 -o /usr/local/h-ui/h-ui \u0026amp;\u0026amp; chmod +x /usr/local/h-ui/h-ui curl -fsSL https://raw.githubusercontent.com/jonssonyan/h-ui/main/h-ui.service -o /etc/systemd/system/h-ui.service # 自定义 Web 端口，默认 8081 # sed -i \u0026#34;s|^ExecStart=.*|ExecStart=/usr/local/h-ui/h-ui -p 8081|\u0026#34; \u0026#34;/etc/systemd/system/h-ui.service\u0026#34; systemctl daemon-reload systemctl enable h-ui systemctl restart h-ui 查看状态\nsystemctl status h-ui 关闭防火墙\nufw disable 默认安装信息\n面板端口: 8081 用户名/密码: sysadmin 若无域名，生成自签证书\nopenssl req -x509 -nodes -newkey ec:\u0026lt;(openssl ecparam -name prime256v1) -keyout /h-ui/bin/server.key -out /h-ui/bin/server.crt -subj \u0026#34;/CN=bing.com\u0026#34; -days 36500 \u0026amp;\u0026amp; sudo chown hysteria /h-ui/bin/server.key \u0026amp;\u0026amp; sudo chown hysteria /h-ui/bin/server.crt 证书路径：\n/h-ui/bin/server.crt /h-ui/bin/server.key 卸载\nsystemctl stop h-ui rm -rf /etc/systemd/system/h-ui.service /usr/local/h-ui/ 优化,定时重启服务器\n0 6 * * * /sbin/reboot 安装视频教程：\n","date":"2023-08-04T16:19:04Z","permalink":"https://blog.lufei.de/p/30/","title":"轻松搭建高效稳定的 Hysteria2 节点服务"},{"content":"最新代码： https://github.com/3Kmfi6HP/EDtunnel/blob/main/_worker.js\ncloudflare ：https://www.cloudflare.com/\n域名优选官网 : http://www.nirsoft.net/utils/multiple_ping_tool.html\nip\u0026amp;域名优选打包：点击下载\u0026raquo; 域名cdn查询：https://dnschecker.org\n站长ping检测：https://ping.chinaz.com/\n安卓客户端: Release 0.8.1-rc03 · SagerNet/SagerNet (github.com)\nwindows客户端: https://github.com/2dust/v2rayN/releases/tag/6.23\n全平台翻墙工具: Windows翻墙客户端 - 全平台翻墙工具 (gitbook.io)\ncloudflare 颁发域名收集 vless://bfb0a9e3-d88e-4472-a24b-5b90cc73d7db@shopify.com:80?encryption=none\u0026amp;security=none\u0026amp;type=ws\u0026amp;host=woaijia.qige005.workers.dev\u0026amp;path=%2F%3Fed%3D2048#woaijia.qige005.workers.dev-HTTP 白天: shopify.com\n晚上: www.visa.com.hk\ngamer.com.tw steamdb.info toy-people.com silkbook.com cdn.anycast.eu.org icook.hk shopify.com www.visa.com.tw time.is japan.com www.hugedomains.com www.visa.com.sg www.whoer.net www.visa.com.hk malaysia.com www.visa.co.jp www.ipget.net icook.tw www.visa.com www.gov.ua www.udacity.com www.shopify.com www.whatismyip.com singapore.com www.visakorea.com www.csgo.com russia.com ip.sb www.4chan.org www.glassdoor.com xn--b6gac.eu.org www.digitalocean.com www.udemy.com cdn-all.xn--b6gac.eu.org dnschecker.org tasteatlas.com toy-people.com pixiv.net comicabc.com icook.tw gamer.com.tw steamdb.info toy-people.com silkbook.com ","date":"2023-08-04T04:36:36Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9%E7%BF%BB%E5%A2%99%E6%89%B9%E9%87%8Fvless%E8%8A%82%E7%82%B9%E5%8F%8D%E4%BB%A3%E4%BC%AA%E8%A3%85%E7%BD%91%E9%A1%B5%E8%BD%BB%E6%9D%BE%E8%B7%91%E6%BB%A1%E6%9C%AC%E5%9C%B0%E5%AE%BD%E5%B8%A6/","title":"免费翻墙，批量vless节点，反代伪装网页，轻松跑满本地宽带"},{"content":" 几乎每个大厂都可以免费体验一定时长的云服务，比如 GCP、Azure，甲骨文甚至还有可以永久免费的服务器。\n这一期，我们就来免费体验一下世界上最大的云服务器提供商 —— 亚马逊的云服务 (AWS)\n世界上最大的云服务器提供商是亚马逊网络服务 (AWS)。AWS 是一家全球性云计算平台，提供计算、存储、数据库、网络、分析、机器学习、人工智能、移动、开发工具和企业应用等多种服务。AWS 在全球拥有超过 200 个区域和 70 多个国家 / 地区的数据中心。\n2022 年，AWS 的收入为 540.5 亿美元，比 2021 年增长了 37%。AWS 是世界上最受欢迎的云计算平台，拥有超过 300 万客户。AWS 的客户包括小型企业、中型企业和大型企业，以及政府机构和非营利组织。\nAWS 的优势包括：\n广泛的服务：AWS 提供广泛的服务，满足企业的各种需求。 可靠性：AWS 拥有全球最可靠的数据中心网络。 安全性：AWS 提供最先进的安全功能。 成本效益：AWS 的价格非常合理。\n来源：bard.google.com\nAWS 其实可以免费 白嫖体验很多产品，比如云服务器（ec2），云存储（S3），CDN 相关产品（网站提速），lightsail（VPS, 搭建远程桌面）SES (群发邮件)，Amazon Chime （视频会议）等等等等，大家可以随意尝试。\n这边我们玩服务器多一些，就来白嫖 12 个月的 EC2 吧。\n准备工作 AWS 免费体验地址：https://gao.ee/aws\n正式开始之前，建议你准备：\n一个邮箱 一个可以接受验证码的手机号（大家可以用自己的手机号接受验证码，正常国内的能收到码，也可以可以选择 GV 或者是到 5sim.net 上找接码，看是最低 6 卢布（大概 5 毛钱）一条） 一张信用卡（只是授权一下，并不会要你钱，可以是虚拟卡，比如咕咕用的 OneKey Card） 注册账号的时候不要挂代理\n开始注册 点击创建 AWS 账户，一步一步完成注册即可，地址填拼音。\n具体可以看视频。\nYouTube 视频地址：https://youtu.be/r6Mr5tBCnvc\nYouTube 视频地址：https://youtu.be/JgfWYcNR6nk\nbilibili 视频地址：https://www.bilibili.com/video/BV1VP411t7ia/\n没什么问题的话，你会看到这个界面。\n信用卡验证预扣款截图：\nAWS 后台概览 选择服务器地区： 创建实例： 输入名称： 选择系统： 打开 22、80、443 端口： 修改硬盘大小： 启动实例失败，需要我们创建一个密钥对： 再次启动实例： 连接服务器： chmod 400 密钥地址 ssh -i 密钥位置 admin@ip\n即可登录。\nDD 一个干净的 Debian 10 默认的登录方式其实是最安全的，但是对我们来说难免太不方便了，我们希望可以随时随地用密钥登录，这边我们就来完全重装一下这台机器的系统吧。`\ndd 脚本（大概 5-10 分钟）\nbash \u0026lt;(wget \u0026ndash;no-check-certificate -qO- \u0026lsquo;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 10 -v 64 -p \u0026ldquo;自定义root密码\u0026rdquo; -port \u0026ldquo;自定义ssh端口\u0026rdquo; 这边我的 dd 脚本是这样的：\nbash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) -d 10 -v 64 -p \u0026#34;password123\u0026#34; -port \u0026#34;222\u0026#34; 我把密码改成了 password123，SSH 端口改成了 222\n直接输入到命令行即可。\nAWS 开启后台端口的方法 默认我们的这台机器只开了 22 端口（我们视频里也勾选了 80、443 端口）\n所以现在总共只打开了三个端口，我们还需要开启 222 端口，不然一会儿 SSH 连接不上。\n这边我们尝试开启 222 端口。\n开启之后，我们尝试登录机器。\nssh root@ip -p 222 成功登录！\n好了，现在你就有一台干净系统的机器啦，下一期我们介绍一下如何在这个机器上装一个好玩儿的 Docker 项目，在这个免费使用的 12 个月里面好好折腾它！\n","date":"2023-08-03T15:54:56Z","permalink":"https://blog.lufei.de/p/%E5%85%8D%E8%B4%B9-12-%E4%B8%AA%E6%9C%88%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C-aws-%E7%9B%AE%E5%89%8D%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E5%A4%A7%E7%9A%84%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8F%90%E4%BE%9B%E5%95%86%E5%AE%B6/","title":"免费 12 个月使用！体验 AWS—— 目前世界上最大的云服务器提供商家"},{"content":"🍥Hugo主题魔改 由于之前魔改部分写的很慢,又考虑过出个魔改好的主题直接给人们用,后来想想了还是算了,毕竟博客怎么能缺少折腾的乐趣呢,于是乎我花了点时间把魔改内容进行了一些休整,以内容呈现为核心,放弃了很多花哨的东西,加上考虑到魔改的难易程度与网页加载快慢,最后精简成少量的个人感觉比较有用的样式,并做了注释,直接使用即可完成一些个性化调整.由于本人纯小白,所以可能还有可以优化的地方,如果你有更好的方案欢迎在下方探讨交流.\n🍦魔改风格 本文对于主题的魔改主要以圆角风格和阅读沉浸感为核心,目标是魔改出一个与本站类似的主题风格,具体使用体验可以参考目前主题.\n🍕魔改前的准备 首先在博客根目录下的assets下创建一个名为scss的文件夹,然后在scss文件夹里创建一个名为custom.scss的文件,最终效果为~blog/assets/scss/custom.scss,创建好文件后,接下来对于主题的大部分样式魔改都将写进这个custom.scss.其中有很多冗余的代码但是为了使用尽可能用少的文件防止杂乱不堪,所以只好这样子了(如果你是大佬的话请随意).\n🎈主题整体细节调整 对于这一部分的调整我认为每个打算折腾主题前可以先加上,这样子主题整体上会有较大的改变,而且可以使文章内容的展现更为舒适,因为原主题使用了比较低的对比度,个人不是很习惯.\n页面概览:\n主页概览\n在上文中提到的custom.scss文件中写入以下👇内容\n// ~\\blog\\assets\\scss\\custom.scss // 页面基本配色 :root { // 全局顶部边距 --main-top-padding: 30px; // 全局卡片圆角 --card-border-radius: 25px; // 标签云卡片圆角 --tag-border-radius: 8px; // 卡片间距 --section-separation: 40px; // 全局字体大小 --article-font-size: 1.8rem; // 行内代码背景色 --code-background-color: #f8f8f8; // 行内代码前景色 --code-text-color: #e96900; // 暗色模式下样式 \u0026amp;[data-scheme=\u0026#34;dark\u0026#34;] { // 行内代码背景色 --code-background-color: #ff6d1b17; // 行内代码前景色 --code-text-color: #e96900; } } //------------------------------------------------------ // 修复引用块内容窄页面显示问题 a { word-break: break-all; } code { word-break: break-all; } //--------------------------------------------------- // 文章内容图片圆角阴影 .article-page .main-article .article-content { img { max-width: 96% !important; height: auto !important; border-radius: 8px; } } //------------------------------------------------ // 文章内容引用块样式 .article-content { blockquote { border-left: 6px solid #358b9a1f !important; background: #3a97431f; } } // --------------------------------------- // 代码块基础样式修改 .highlight { max-width: 102% !important; background-color: var(--pre-background-color); padding: var(--card-padding); position: relative; border-radius: 20px; margin-left: -7px !important; margin-right: -12px; box-shadow: var(--shadow-l1) !important; \u0026amp;:hover { .copyCodeButton { opacity: 1; } } // keep Codeblocks LTR [dir=\u0026#34;rtl\u0026#34;] \u0026amp; { direction: ltr; } pre { margin: initial; padding: 0; margin: 0; width: auto; } } // light模式下的代码块样式调整 [data-scheme=\u0026#34;light\u0026#34;] .article-content .highlight { background-color: #fff9f3; } [data-scheme=\u0026#34;light\u0026#34;] .chroma { color: #ff6f00; background-color: #fff9f3cc; } //------------------------------------------- // 设置选中字体的区域背景颜色 //修改选中颜色 ::selection { color: #fff; background: #34495e; } a { text-decoration: none; color: var(--accent-color); \u0026amp;:hover { color: var(--accent-color-darker); } \u0026amp;.link { color: #4288b9ad; font-weight: 600; padding: 0 2px; text-decoration: none; cursor: pointer; \u0026amp;:hover { text-decoration: underline; } } } //------------------------------------------------- //文章封面高度更改 .article-list article .article-image img { width: 100%; height: 150px; object-fit: cover; @include respond(md) { height: 200px; } @include respond(xl) { height: 305px; } } //--------------------------------------------------- // 全局页面布局间距调整 .main-container { min-height: 100vh; align-items: flex-start; padding: 0 15px; gap: var(--section-separation); padding-top: var(--main-top-padding); @include respond(md) { padding: 0 37px; } } //-------------------------------------------------- //页面三栏宽度调整 .container { margin-left: auto; margin-right: auto; .left-sidebar { order: -3; max-width: var(--left-sidebar-max-width); } .right-sidebar { order: -1; max-width: var(--right-sidebar-max-width); /// Display right sidebar when min-width: lg @include respond(lg) { display: flex; } } \u0026amp;.extended { @include respond(md) { max-width: 1024px; --left-sidebar-max-width: 25%; --right-sidebar-max-width: 22% !important; } @include respond(lg) { max-width: 1280px; --left-sidebar-max-width: 20%; --right-sidebar-max-width: 30%; } @include respond(xl) { max-width: 1453px; //1536px; --left-sidebar-max-width: 15%; --right-sidebar-max-width: 25%; } } \u0026amp;.compact { @include respond(md) { --left-sidebar-max-width: 25%; max-width: 768px; } @include respond(lg) { max-width: 1024px; --left-sidebar-max-width: 20%; } @include respond(xl) { max-width: 1280px; } } } //------------------------------------------------------- //全局页面小图片样式微调 .article-list--compact article .article-image img { width: var(--image-size); height: var(--image-size); object-fit: cover; border-radius: 17%; } Copy\n🧀菜单栏调整为圆角 样式预览:\n圆角菜单\n依然是在custom.scss中写入以下内容:\n// ~\\blog\\assets\\scss\\custom.scss // -------------------------------- // 菜单栏样式 // 下拉菜单改圆角样式 .menu { padding-left: 0; list-style: none; flex-direction: column; overflow-x: hidden; overflow-y: scroll; flex-grow: 1; font-size: 1.6rem; background-color: var(--card-background); box-shadow: var(--shadow-l2); //改个阴影 display: none; margin: 0; //改为0 border-radius: 10px; //加个圆角 padding: 30px 30px; @include respond(xl) { padding: 15px 0; } \u0026amp;, .menu-bottom-section { gap: 30px; @include respond(xl) { gap: 25px; } } \u0026amp;.show { display: flex; } @include respond(md) { align-items: flex-end; display: flex; background-color: transparent; padding: 0; box-shadow: none; margin: 0; } li { position: relative; vertical-align: middle; padding: 0; @include respond(md) { width: 100%; } svg { stroke-width: 1.33; width: 20px; height: 20px; } a { height: 100%; display: inline-flex; align-items: center; color: var(--body-text-color); gap: var(--menu-icon-separation); } span { flex: 1; } \u0026amp;.current { a { color: var(--accent-color); font-weight: bold; } } } } Copy\n🍟滚动条美化 依然是在custom.scss中写入以下内容:\n// ~\\blog\\assets\\scss\\custom.scss //------------------------------------------------ //将滚动条修改为圆角样式 //菜单滚动条美化 .menu::-webkit-scrollbar { display: none; } // 全局滚动条美化 html { ::-webkit-scrollbar { width: 20px; } ::-webkit-scrollbar-track { background-color: transparent; } ::-webkit-scrollbar-thumb { background-color: #d6dee1; border-radius: 20px; border: 6px solid transparent; background-clip: content-box; } ::-webkit-scrollbar-thumb:hover { background-color: #a8bbbf; } } Copy\n🥑归档页实现双栏 样式预览:\n双栏归档页\n原主题在大屏下的归档页面使用了单栏设计,这将会产生大量的空白占用页面并且不利于文章的查找,因此将其改为双栏则能够很好的利用大屏下的页面空间.\n依然是在custom.scss中写入以下内容:\n// ~\\blog\\assets\\scss\\custom.scss //-------------------------------------------------- //归档页面双栏 /* 归档页面两栏 */ @media (min-width: 1024px) { .article-list--compact { display: grid; grid-template-columns: 1fr 1fr; background: none; box-shadow: none; gap: 1rem; article { background: var(--card-background); border: none; box-shadow: var(--shadow-l2); margin-bottom: 8px; border-radius: 16px; } } } Copy\n🌿链接模块实现三栏样式 样式预览:\n三栏链接\n由于原主题使用的单栏样式在多条链接的情况下会导致链接的查找比较困难,因此改为双栏或三栏能够有效解决这种问题\n依然是在custom.scss中写入以下内容:\n// ~\\blog\\assets\\scss\\custom.scss //-------------------------------------------------- //链接三栏 @media (min-width: 1024px) { .article-list--compact.links { display: grid; grid-template-columns: 1fr 1fr 1fr; //三个1fr即为三栏,两个1fr则为双栏,以此类推即可. background: none; box-shadow: none; gap: 1rem; article { background: var(--card-background); border: none; box-shadow: var(--shadow-l2); margin-bottom: 8px; border-radius: var(--card-border-radius); \u0026amp;:nth-child(odd) { margin-right: 8px; } } } } Copy\n🎉首页添加欢迎横幅 样式预览:\n欢迎横幅\n欢迎横幅虽然用处不大,但是我觉得可以使主页不会那么单调,同时可以表示对于访客的热情吧哈哈哈\n现在博客的根目录下新建一个文件夹名为layouts(默认生成站点时也生成了,没有的话手动创建),之后将~\\blog\\themes\\hugo-theme-stack\\layouts\\index.html下的文件复制到刚刚创建的layouts文件夹里,这意味着主题根目录下的layouts文件夹里的index.html将覆盖原主题目录下对应的文件,然后我们再复制出来的index.html中添加以下内容:\n\u0026lt;!-- ~\\site\\blog\\layouts\\index.html --\u0026gt; ...... {{ $filtered := ($pages | intersect $notHidden) }} {{ $pag := .Paginate ($filtered) }} \u0026lt;!-- 上面是主题自带的,只展示一部分,其余省略 --\u0026gt; \u0026lt;!-- ---这是我们添加进去的--------- --\u0026gt; \u0026lt;!-- 首页欢迎字幅板块 --\u0026gt; \u0026lt;div class=\u0026#34;welcome\u0026#34;\u0026gt; \u0026lt;p style=\u0026#34;font-size: 2rem; text-align: center; font-weight: bold\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;shake\u0026#34;\u0026gt;👋\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text1\u0026#34; \u0026gt; Welcome\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text2\u0026#34;\u0026gt; To \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text3\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;L1\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text4\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;n\u0026lt;/span \u0026gt;\u0026lt;span class=\u0026#34;jump-text5\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;Sn\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;jump-text6\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;0\u0026lt;/span \u0026gt;\u0026lt;span class=\u0026#34;jump-text7\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;w\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text8\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;\u0026#39;s\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;jump-text9\u0026#34; style=\u0026#34;color:#e99312\u0026#34;\u0026gt;Blog\u0026lt;/span\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- ------首页欢迎字幅板块------ --\u0026gt; \u0026lt;!-- 下面也是主题自带的,只展示一部分,其余省略 --\u0026gt; \u0026lt;section class=\u0026#34;article-list\u0026#34;\u0026gt; {{ range $index, $element := $pag.Pages }} {{ partial \u0026#34;article-list/default\u0026#34; . }} {{ end }} \u0026lt;/section\u0026gt; ...... Copy\n接下来我们给欢迎横幅添加一些样式,回到原来创建的custom.scss中,在文件中写入以下内容\n// ~\\blog\\assets\\scss\\custom.scss //--------------------------------------------------------- //首页欢迎板块样式 .welcome { color: var(--card-text-color-main); background: var(--card-background); box-shadow: var(--shadow-l2); border-radius: 30px; display: inline-block; } // 👋emoji实现摆动效果 .shake { display: inline-block; animation: shake 1s; animation-duration: 1s; animation-timing-function: ease; animation-delay: 0s; animation-iteration-count: 1; animation-direction: normal; animation-fill-mode: none; animation-play-state: running; animation-name: shake; animation-timeline: auto; animation-range-start: normal; animation-range-end: normal; animation-delay: 2s; @keyframes shake { 0% { transform: rotate(0); } 25% { transform: rotate(45deg) scale(1.2); } 50% { transform: rotate(0) scale(1.2); } 75% { transform: rotate(45deg) scale(1.2); } 100% { transform: rotate(0); } } } // 实现字符跳动动画 .jump-text1 { display: inline-block; animation: jump 0.5s 1; } .jump-text2 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.1s; } .jump-text3 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.2s; } .jump-text4 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.3s; } .jump-text5 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.4s; } .jump-text6 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.5s; } .jump-text7 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.6s; } .jump-text8 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.7s; } .jump-text9 { display: inline-block; animation: jump 0.5s 1; animation-delay: 0.9s; } @keyframes jump { 0% { transform: translateY(0); } 50% { transform: translateY(-20px); } 100% { transform: translateY(0); } } Copy\n💊文章页面左上角引入返回按钮 样式预览:\n桌面端左侧返回按钮\n移动端顶部返回按钮\n引入这个返回按钮同时隐藏左侧边栏可以制造留白,通告阅读时的沉浸感,我认为这对于提高阅读体验式比较有帮助的.\n首先需要在博客的根目录的layouts文件夹中创建一个名为_default(注意不要少了下划线)的文件夹,然后将原主题中~\\blog\\themes\\hugo-theme-stack\\layouts\\_default\\single.html的single.html复制到刚刚创建的_default中,然后写入添加以下内容:\n注意对照原主题,不要把重复的部分也写进去\n\u0026lt;!-- ~\\blog\\layouts\\_default\\single.html --\u0026gt; .......已省略,请自己对照...... {{ partialCached \u0026#34;footer/footer\u0026#34; . }} {{ partialCached \u0026#34;article/components/photoswipe\u0026#34; . }} {{ end }} {{ define \u0026#34;left-sidebar\u0026#34; }} {{ if (.Scratch.Get \u0026#34;TOCEnabled\u0026#34;) }} \u0026lt;div id=\u0026#34;article-toolbar\u0026#34; style=\u0026#34;position: sticky;top: 5px;z-index: 1000;\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ .Site.BaseURL | relLangURL }}\u0026#34; class=\u0026#34;back-home\u0026#34;\u0026gt; {{ (resources.Get \u0026#34;icons/back.svg\u0026#34;).Content | safeHTML }} \u0026lt;span\u0026gt;{{ T \u0026#34;article.back\u0026#34; }}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{ else }} {{ partial \u0026#34;sidebar/left.html\u0026#34; . }} {{ end }} {{ end }} {{ define \u0026#34;right-sidebar\u0026#34; }} {{ if .Scratch.Get \u0026#34;hasWidget\u0026#34; }}{{ partial \u0026#34;sidebar/right.html\u0026#34; (dict \u0026#34;Context\u0026#34; . \u0026#34;Scope\u0026#34; \u0026#34;page\u0026#34;) }}{{ end}} {{ end }} Copy\n接下来我们给返回按钮添加以下样式,不然返回按钮会显示异常,回到原来创建的custom.scss中,在文件中写入以下内容:\n// ~\\blog\\assets\\scss\\custom.scss //-------------------------------------------------- //引入左上角返回按钮 .back-home { background: var(--card-background); border-radius: var(--tag-border-radius); color: var(--card-text-color-tertiary); margin-right: 0.1rem; margin-top: 24px; display: inline-flex; align-items: center; font-size: 1.4rem; text-transform: uppercase; padding: 10px 20px 10px 15px; transition: box-shadow 0.3s ease; box-shadow: var(--shadow-l3); \u0026amp;:hover { box-shadow: var(--shadow-l2); } svg { margin-right: 5px; width: 20px; height: 20px; } span { font-weight: 500; white-space: nowrap; } } .main-container .right-sidebar { order: 2; max-width: var(--right-sidebar-max-width); /// Display right sidebar when min-width: lg @include respond(lg) { display: flex; } } main.main { order: 1; min-width: 0; max-width: 100%; flex-grow: 1; display: flex; flex-direction: column; gap: var(--section-separation); @include respond(md) { padding-top: var(--main-top-padding); } } Copy\n🍎代码块引入MacOS窗口样式 样式预览:\nMacOS红绿灯窗口\n使用这个样式可以使代码块更有逼格,首先在博客根目录下的static文件夹中创建名为img的文件夹,然后再img文件夹中创建一个名为code-header.svg的文件,在文件中写入以下内容:\n\u0026lt;svg xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; version=\u0026#34;1.1\u0026#34; x=\u0026#34;0px\u0026#34; y=\u0026#34;0px\u0026#34; width=\u0026#34;450px\u0026#34; height=\u0026#34;130px\u0026#34;\u0026gt; \u0026lt;ellipse cx=\u0026#34;65\u0026#34; cy=\u0026#34;65\u0026#34; rx=\u0026#34;50\u0026#34; ry=\u0026#34;52\u0026#34; stroke=\u0026#34;rgb(220,60,54)\u0026#34; stroke-width=\u0026#34;2\u0026#34; fill=\u0026#34;rgb(237,108,96)\u0026#34;/\u0026gt; \u0026lt;ellipse cx=\u0026#34;225\u0026#34; cy=\u0026#34;65\u0026#34; rx=\u0026#34;50\u0026#34; ry=\u0026#34;52\u0026#34; stroke=\u0026#34;rgb(218,151,33)\u0026#34; stroke-width=\u0026#34;2\u0026#34; fill=\u0026#34;rgb(247,193,81)\u0026#34;/\u0026gt; \u0026lt;ellipse cx=\u0026#34;385\u0026#34; cy=\u0026#34;65\u0026#34; rx=\u0026#34;50\u0026#34; ry=\u0026#34;52\u0026#34; stroke=\u0026#34;rgb(27,161,37)\u0026#34; stroke-width=\u0026#34;2\u0026#34; fill=\u0026#34;rgb(100,200,86)\u0026#34;/\u0026gt; \u0026lt;/svg\u0026gt; Copy\n接下来我们在原来创建的custom.scss文件中添加以下内容:\n// ~\\blog\\assets\\scss\\custom.scss //---------------------------------------------------------- //为代码块顶部添加macos样式 .article-content { .highlight:before { content: \u0026#34;\u0026#34;; display: block; background: url(/img/code-header.svg); height: 32px; width: 100%; background-size: 57px; background-repeat: no-repeat; margin-bottom: 5px; background-position: -1px 2px; } } Copy\n🍺More… 后续的魔改内容会更新在这篇文章中.大家可以根据需要调试更改和增删一些参数,😀如果你有什么好的想法欢迎在评论区留言交流.\n","date":"2023-08-03T15:21:25Z","permalink":"https://blog.lufei.de/p/stack%E4%B8%BB%E9%A2%98%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89/","title":"Stack主题的自定义"},{"content":"🍕利用Github Page和Github Action部署你的Hugo博客 🍔注册GitHub 打开https://github.com/,(打不开的可能需要魔法,或者换个时间点打开,具体怎么操作就不细说了,懂得都懂😶),注册一个GitHub账号,如果不会注册那你还来看这篇文章干嘛.\n🧀创建Github仓库 为了使用GitHub Action自动部署,加上便于管理,所以创建两个仓库,虽然一个也行.\n1.我们先创建一个名字为blog的仓库用于存放hugo生成的文件,打开右上角的+号,然后选择New repository以新建仓库\n2.跟着图片里的步骤操作,先给仓库取个名字,叫做blog(小白最好将仓库名字跟我起一样的),然后勾选public,接着勾选Add a REAMME file,最后点击Create repository完成创建.\n3.接下来我们按照刚才那样依葫芦画瓢,再创建一个名为blog-file的仓库\n🍦获取SSH Key密钥 ssh密钥可以是我们推送文件到仓库时不需要每次都输入密码,大大的提高我们的效率.所以我们首先需要在我们的电脑生成ssh密钥\n1.在git bash执行以下指令,配置邮箱和用户名\ngit config --global user.email \u0026#34;you@example.com\u0026#34; #you@example.com替换为你的邮箱并回车 git config --global user.name \u0026#34;Your Name\u0026#34; #Your Name替换为你的名字并回车 Copy\n2.生成shh key,在git bash中 输入以下命令\nssh-keygen -t rsa Copy\n一路回车就行\n默认会生成在如下目录\nC:\\Users\\用户名\\.ssh Copy\n用记事本打开生成目录下id_rsa.pub,其中的内容即为公钥,id_rsa即为私钥.这两个待会要用到.\n3.将将公钥配置到GitHub账户中,先打开设置,即Settings\n进入SSH and GPG key配置项里,点击SSH keys下的New SHH key进行添加\n4.然后随便在Title项里随便起一个名字,在Key里填入刚才得到的id_rsa.pub里的内容,然后点击Add SSH key就添加好了.\n5.接下来我们需要往刚才创建的名为blog-file的仓库里添加id_rsa密钥,点击Settings,然后找到Secrets and variables,点击Actions,然后点击New repository secret，在Name里填入ACTIONS_DEPLOY_KEY，在Value里填入id_rsa密钥即可。\n🍚部署hugo博客 1.接下来我们在我们的博客根目录下创建一个名为.github的文件夹,然后在文件夹里新建一个新的文件夹,名字为workflows,接着进入workflows文件夹里新建一个名为deploy.xml的文件,再在deploy.xml里填入如下内容,最终目录为~\\blog\\.github\\workflows\\deploy.xml,将deploy.xml中的external_repository项里的lin-snow改为你GitHub注册时的名字即可\nname: GitHub Page on: push: branches: - main # main 更新触发 jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true # clone submodules fetch-depth: 0 # 克隆所有历史信息 - name: Setup Hugo uses: peaceiris/actions-hugo@v2 with: hugo-version: \u0026#34;0.115.2\u0026#34; # Hugo 版本 extended: true # hugo插件版 Stack主题 必须启用 - name: Cache resources # 缓存 resource 文件加快生成速度 uses: actions/cache@v3 with: path: resources # 检查照片文件变化 key: ${{ runner.os }}-hugocache-${{ hashFiles(\u0026#39;content/**/*\u0026#39;) }} restore-keys: ${{ runner.os }}-hugocache- - name: Build # 生成网页 删除无用 resource 文件 削减空行 run: hugo --minify --gc - name: Deploy # 部署到 GitHub Page uses: peaceiris/actions-gh-pages@v3 with: # 如果在同一个仓库下使用请使用 github_token 并注释 deploy_key # github_token: ${{ secrets.GITHUB_TOKEN }} deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # 如果在同一个仓库请注释 external_repository: lin-snow/blog # 你的 GitHub page 仓库 example/example.github.io publish_dir: ./public user_name: \u0026#34;github-actions[bot]\u0026#34; user_email: \u0026#34;github-actions[bot]@users.noreply.github.com\u0026#34; full_commit_message: Deploy from ${{ github.repository }}@${{ github.sha }} 🚀 Copy\n2.然后在博客根目录文件夹下新建一个名为deploy.sh的文件用于一键部署博客,在deploy.sh中填入如下内容,其中最后一行代码里的git@github.com:lin-snow/blog-file.git需要更改为你自己仓库的地址,可以通过如下图片中的操作获得该地址\nhugo #构造你的blog git init #初始化git git add -A git commit -m \u0026#39;deploy\u0026#39; git push -f git@github.com:lin-snow/blog-file.git main#向存储库推送 Copy\n然后双击打开运行deploy.sh即可自动推送文件到仓库,以后写完博客或修改博客后都需要运行一下deploy.sh,才能部署到云端\n3.接下来我们先运行deploy.sh推送一下文件到仓库,等推送上去之后,我们才能完成接下来的操作.\n注意,第一次运行deploy.sh可能会出现如图这种情况,直接输入yes回车即可,如果仓库里没发现上传的文件可以再运行一次deploy.sh\n这里贴出我的GitHub Action运行状况\n🍺开启Github Page 等待Github Action完成后,我们需要开启GitHub page,首先进入blog这个仓库,然后打开设置,找到page项,根据如下设置即可.\n到这里我们就成功上线我们的博客了.至于自定义域名可以在网上找到很多教程,这里就不写了,毕竟我比较懒.\n🥝利用Vercel部署你的Hugo博客 由于Vercel相比与GitHub在国内的访问速度更快,所以我比较推荐使用Vercel部署,但是Vercel分配的二级域名已经被墙了,所以需要绑定自定义的域名才能解决国内的访问问题.接着上面的操作.\n🍖登录Vercel 首先我们需要登录一下Vercel,由于Vercel支持直接使用GitHub登录,所以直接用GitHub登录就行了.\n🎈导入博客 登录Vercel后,点击页面右上角的Add New ...按钮,选择Project\n然后选择我们在GitHub创建的Blog项目,点击Import\n接着其他什么都保持默认即可,直接点击Deploy等待部署完成\n等待导入完毕后会自动分配一个二级域名给你,但是这个被墙了,所以我们要自定义域名,先点击刚刚导入的项目,选择Settings,然后选择Domains,在输入框中输入自己的域名,然后按照提示在域名服务商中添加解析即可.\n这样子我们就完成博客在Vercel的部署了.🎉\n","date":"2023-08-03T15:05:36Z","permalink":"https://blog.lufei.de/p/%E5%88%A9%E7%94%A8github-page%E5%92%8Cgithub-action%E9%83%A8%E7%BD%B2%E4%BD%A0%E7%9A%84hugo%E5%8D%9A%E5%AE%A2/","title":"利用Github Page和Github Action部署你的Hugo博客"},{"content":"一、docker 常用基础命令总结 --启动docker systemctl start docker --停止dokcer systemctl stop docker --查看docker状态 systemctl status docker --重启docker systemctl restart docker --设置docker 开机自启 systemctl enable docker --查看docker 版本 docker version --查看docker 镜像 docker images --查看docker 运行列表 docker ps --查看docker （运行、停止） docker ps -aq --删除容器 docker rm -f 容器ID/容器名称(CONTAINER ID/NAMES) -- 删除多个容器（空格隔开） docker rm -f 容器ID/容器名称 容器ID/容器名称 ... --删除全部容器 docker rm -f $(docker ps -aq) 二、停止一个正在运行的容器 docker stop 容器ID或容器名\ndocker stop -t=60 容器ID或容器名 (参数 -t：关闭容器的限时)\ndocker kill 容器ID或容器名 :直接关闭容器\nstop和kill的区别:stop给与一定的关闭时间，kill直接关闭容器\n三、重启一个容器 docker ps 查看正在运行的容器信息\ndocker restart 容器ID或容器名\n四、工作中常用docker命令 --查看docker docker ps --进入容器 docker exec -it 容器ID/容器名称(CONTAINER ID/NAMES) /bin/bash docker exec -it 容器ID/容器名称(CONTAINER ID/NAMES) bash --例如 docker exec -it 56f0b18af626 /bin/bash docker exec -it postgres10.7 bash 五、设置搭建好容器开机自启 docker ps -qa docker update --restart=always 容器ID/容器名 docker update --restart=always 56f0b18af626 六、开启docker 容器端口号 --启动firewalld systemctl status firewalld.service systemctl start firewalld.service --开放端口号 firewall-cmd --zone=public --add-port=5432/tcp --permanent (permanent永久生效，没有此参数重启后失效) --更新防火墙策略 firewall-cmd --reload --查看开放端口 firewall-cmd --zone=public --list-ports --查看5432 firewall-cmd --zone= public --query-port=5432/tcp --删除端口 firewall-cmd --zone=public --remove-port=5432/tcp --permanent --注：每次更改firewall规则后需重新加载（firewall-cmd --reload） ","date":"2023-07-31T02:34:39Z","permalink":"https://blog.lufei.de/p/docker%E5%AE%B9%E5%99%A8%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/","title":"docker容器常用命令"},{"content":"独角数卡是一款卡密销售系统,他依赖 mysql 和 redis ，按部就班的装是没问题的，因为作者提供的文档还挺强大，佩服! 这里主要怎么五分钟无痛的安装好它，\n主要参考了一位大佬的docker镜像 https://blog.dov.moe/posts/49102/\n啰嗦两句，这个镜像比官方推荐那个镜像要好，官方那个docker是半吊子的，还需要装mysql和redis\n相关地址 GitHub 官方仓库：https://github.com/assimon/dujiaoka\nDocker 镜像地址：https://hub.docker.com/r/stilleshan/dujiaoka （同时支持 X86 和 ARM 架构）来自：Stille 大佬\n常见问题集锦：https://github.com/assimon/dujiaoka/wiki/problems\n1. 首先安装docker curl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 2. 安装部署独角数卡 1. 创建安装目录 sudo -i mkdir -p /root/data/docker_data/shop cd /root/data/docker_data/shop mkdir storage uploads chmod -R 777 storage uploads # 创建数据目录用于挂载 touch env.conf chmod -R 777 env.conf 这边我们直接用 docker 的方式安装。\nvim docker-compose.yml 英文输入法下，按 i\nversion: \u0026#34;3\u0026#34; services: web: category_bar: true stilleshan/dujiaoka environment: # - INSTALL=false - INSTALL=true # - MODIFY=true volumes: - ./env.conf:/dujiaoka/.env - ./uploads:/dujiaoka/public/uploads - ./storage:/dujiaoka/storage ports: - 8090:80 # 8090可以改成任意服务器没有使用过的端口，80不要修改 restart: always db: category_bar: true mariadb:focal restart: always environment: - MYSQL_ROOT_PASSWORD=changeyourpassword - MYSQL_DATABASE=dujiaoka - MYSQL_USER=dujiaoka - MYSQL_PASSWORD=changeyourpassword volumes: - ./mysql:/var/lib/mysql redis: category_bar: true redis:alpine restart: always volumes: - ./redis:/data changeyourpassword 可以修改成自己的密码。\n修改好之后，注意切换成英文输入法，然后按一下 esc，然后 :wq 保存退出。\n添加env.conf文件\nvim env.conf 输入：\nAPP_NAME=咕咕的小卖部 APP_ENV=local APP_KEY=base64:rKwRuI6eRpCw/9e2XZKKGj/Yx3iZy5e7+FQ6+aQl8Zg= APP_DEBUG=true APP_URL=https://你的域名 LOG_CHANNEL=stack # 数据库配置 DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=dujiaoka DB_USERNAME=dujiaoka DB_PASSWORD=changeyourpassword # redis配置 REDIS_HOST=redis REDIS_PASSWORD= REDIS_PORT=6379 BROADCAST_DRIVER=log SESSION_DRIVER=file SESSION_LIFETIME=120 # 缓存配置 # file为磁盘文件 redis为内存级别 # redis为内存需要安装好redis服务端并配置 CACHE_DRIVER=redis # 异步消息队列 # sync为同步 redis为异步 # 使用redis异步需要安装好redis服务端并配置 QUEUE_CONNECTION=redis # 后台语言 ## zh_CN 简体中文 ## zh_TW 繁体中文 ## en 英文 DUJIAO_ADMIN_LANGUAGE=zh_CN # 后台登录地址 ADMIN_ROUTE_PREFIX=/admin # 是否开启https (前端开启了后端也必须为true) # 后台登录出现0err或者其他登录异常问题，大概率是开启了https而后台没有开启，把下面的false改为true即可 ADMIN_HTTPS=true 这边可以不用动，因为后续我们安装的时候填的信息会覆盖这里面的内容，修改好之后，注意切换成英文输入法，然后按一下 esc，然后 :wq 保存退出。\n最后：\ndocker-compose up -d 理论上我们就可以输入 http://ip:8090 访问安装了。\n注意: 使用IP:8090可能会出现错误,\n推荐使用解析好的域名安装,做好反向代理\n推荐使用 Nginx Proxy Manager 反向代理神器\n2.网页安装 访问域名开始安装：\n将mysql的地址改为db 将mysql的用户名改为dujiaoka 将redis的地址改为redis 填写网站名称 网站 url 填写完整域名地址，例如https://shop.ioiox.com 点击安装成功后，先不要登录, 先修改其他参数后在进行登录使用\n此时，我们先停止容器。\ndocker-compose down 将docker-compose.yml中的INSTALL改为false\n将env.conf中的APP_DEBUG改为false 以及 ADMIN_HTTPS 改成 true\n最后:\ndocker-compose up -d 然后在域名后面加上 /admin，账户密码都是admin 就可以正常登录后台了！\n记得改一下用户名和密码！\n3.迁移服务器 所有配置，数据，缓存，数据库都存储在整个shop目录中，定期备份即可。 如需迁移服务器，仅需打包本目录到新服务器，执行上述所有chmod 777的权限命令，再次docker-compose up -d即可恢复上线。 进入shop目录\nchmod -R 777 storage uploads env.conf 然后将env.conf中的 APP_URL改成新的域名\n最后运行:\ndocker-compose up -d 4. 更新与卸载 更新 shop cd /root/data/docker_data/shop docker-compose down cp -r /root/data/docker_data/shop /root/data/docker_data/shop.archive # 万事先备份，以防万一 docker-compose pull docker-compose up -d # 请不要使用 docker-compose stop 来停止容器，因为这么做需要额外的时间等待容器停止；docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器，完全没有必要浪费那些时间。 docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像 提示：\nWARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] 输入 y\n利用 Docker 搭建的应用，更新非常容易～\n卸载 shop cd /root/data/docker_data/shop docker-compose down cd .. rm -rf /root/data/docker_data/shop # 完全删除映射到本地的数据 可以卸载得很干净。\n","date":"2023-07-30T15:06:40Z","permalink":"https://blog.lufei.de/p/%E5%8F%AF%E8%83%BD%E6%98%AF%E6%9C%80%E5%BF%AB%E7%9A%84%E7%8B%AC%E8%A7%92%E6%95%B0%E5%8D%A1%E5%8F%91%E5%8D%A1%E7%BD%91%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B/","title":"可能是最快的独角数卡发卡网搭建教程"},{"content":"整理记录最新Linux一键重装支持Debian 12，迄今为止功能最全，最好用的脚本\n项目地址: https://github.com/leitbogioro/Tools/\n首先登录SSH,下载脚本 国外服务器\nwget --no-check-certificate -qO InstallNET.sh \u0026#39;https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh\u0026#39; \u0026amp;\u0026amp; chmod a+x InstallNET.sh 中国大陆服务器：\nwget --no-check-certificate -qO InstallNET.sh \u0026#39;https://gitee.com/mb9e8j2/Tools/raw/master/Linux_reinstall/InstallNET.sh\u0026#39; \u0026amp;\u0026amp; chmod a+x InstallNET.sh 然后安装依赖 Debian系列(Debian / Ubuntu / Kali):\napt update -y apt install wget -y RedHat系列，仅基于RedHat 7+、grub2（CentOS / AlmaLinux / RockyLinux / OracleLinux / Fedora / VzLinux / ScientificOS / RedHat Enterprise Linux / 腾讯OpenCloudOS / AWS AmazonLinux / AliyunLinux或AliyunLinux / OpenAnolis）：\nyum install wget -y 或者：\ndnf install wget -y 快速开始 默认密码\nLeitboGi0ro 默认ssh端口22\n说明: 可以直接在后面加版本号,例如: bash InstallNET.sh -debian 11\n或者 bash InstallNET.sh -ubuntu 20.04\n启动安装命令后十几秒完成, 提示你 reboot 重启你的机器,稍等几分钟就好\n安装完成,最好改下密码\nDebian 12\nbash InstallNET.sh -debian CentOS 9\nbash InstallNET.sh -centos Ubuntu 22.04\nbash InstallNET.sh -ubuntu Windows Server 2022\nbash InstallNET.sh -windows 参数详细说明 -debian 9-12：Debian 9 及更高版本\n-centos 7 或 8/9-stream：CentOS 7 及更高版本\n-ubuntu 20.04/22.04：Ubuntu 20.04 及更高版本\n-windows 10/11/2012/2016/2019/2022：Windows 10 Enterprise LTSC、Windows 11 Pro for Workstation 22H2、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019、Windows Server 2022。支持 IPv4 dhcp 和静态、扩展当前操作系统磁盘分区。用户登录后必须执行自动步骤。\n","date":"2023-07-30T14:23:45Z","permalink":"https://blog.lufei.de/p/%E6%9C%80%E6%96%B0linux%E4%B8%80%E9%94%AE%E9%87%8D%E8%A3%85%E8%84%9A%E6%9C%AC%E8%BF%84%E4%BB%8A%E4%B8%BA%E6%AD%A2%E5%8A%9F%E8%83%BD%E6%9C%80%E5%85%A8%E6%9C%80%E5%A5%BD%E7%94%A8%E7%9A%84%E8%84%9A%E6%9C%AC/","title":"最新Linux一键重装脚本，迄今为止功能最全，最好用的脚本"},{"content":"构建和开发设置 在新项目中使用框架时，系统会自动检测到该框架。因此，会自动配置多个项目设置，以达到最佳效果。你可以在下面覆盖它们。\n环境变量 为了在构建和运行时为您的部署提供环境变量，您可以在这里为您选择的环境输入环境变量。\n指定hugo版本\n","date":"2023-07-29T16:19:18Z","permalink":"https://blog.lufei.de/p/vercel%E9%83%A8%E7%BD%B2hugo%E8%AE%B0%E5%BD%95%E9%85%8D%E7%BD%AE/","title":"vercel部署hugo记录配置"},{"content":"前言 使用个人博客也有一年多的时间，这一年多的时候踩了很多坑，也学到了很多知识。 这里分享一个系列教程：从零开始搭建个人博客，把我的经验分享在这里。\nShortcodes是什么 shortcode 可以理解为HTML模版，可以很方便的支持markdown里面写一行规定格式的代码，能用shortcode里面的模版替换成对应的HTML文件，然后就把这段HTML代码添加到编译之后的HTML文件中。\nHugo shortcode\n//注：去掉@，我这里是为了防止自动编译\n{@{\u0026lt; name parameter1 parameter2 \u0026gt;}}\n然后在你的主题的layouts/shortcodes 会自动找 名字为 name.html的文件，就把参数的值替换到html中，得到一个最终的html信息。\nshortcode可以很方便的做复用，可以让你在每个markdown文件里面添加很少的内容，通常是一行代码，就能生成一个通用的HTML片段。\n使用Shortcode，我们就能很方便的通过一行简单的代码来插入B站或者Youtube视频。\n插入视频 我们就教大家怎么在Hugo中嵌入Bilibili视频和Youtube视频，这样当别人访问你的个人博客网站的时候，可以直接点击播放你插入的视频，还可以自动跳转到你的自媒体平台播放视频，来给你的自媒体平台引流。\n1. 嵌入Bilibili视频 在hugo网站目录你使用的主题目录下themes/{your theme name}/layouts/shortcodes中创建bilibili.html文件。\n\u0026lt;!DOCTYPE HTML\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;!-- style 样式 是为了让网页上的视频框按比例显示而非固定的大小 --\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; .aspect-ratio { position: relative; width: 100%; height: 0; padding-bottom: 75%; } .aspect-ratio iframe { position: absolute; width: 100%; height: 100%; left: 0; top: 0; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;aspect-ratio\u0026#34;\u0026gt; \u0026lt;iframe src=\u0026#34;https://player.bilibili.com/player.html?bvid={{.Get 0 }}\u0026amp;page={{ if .Get 1 }}{{.Get 1}}{{ else }}1\u0026amp;high_quality=1\u0026amp;danmaku=0{{end}}\u0026#34; scrolling=\u0026#34;no\u0026#34; border=\u0026#34;0\u0026#34; frameborder=\u0026#34;no\u0026#34; framespacing=\u0026#34;0\u0026#34; allowfullscreen=\u0026#34;true\u0026#34; \u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;!-- src 中的 \u0026amp;high_quality=1\u0026amp;danmaku=0 设定了高清程度并默认屏蔽弹幕 --\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 然后在你的bilibli的连接上找到BV号。 比如我的视频链接是： https://www.bilibili.com/video/BV1n8411K7zr/?vd_source=adec61d169fe18e7682f66c984380921\n那么BV号就是：BV1n8411K7zr\n在你的markdown文件里面添加这么一行\n这样就能展示你的B站视频了:\n点击去Bilibili观看或者吐槽会自动跳转到b站对应的视频链接继续观看，非常方便。\n2. 嵌入Youtube视频 Hugo是自带Youtube视频的插入的，所以我们甚至不需要自己添加shortcode模板。\n找到你的视频链接：\nhttps://www.youtube.com/watch?v=kDQJF6Ngsi0 你只需要取到 v=xxxx里面的xxxx内容 也就是你只需要写\n就会自动匹配Hugo自带的shortcode模板，嵌入你的youtube视频。\n如果你不想用hugo自带的shortcode模板，或者它无法正常插入视频，那么同样的方式在你使用的主题目录下themes/{your theme name}/layouts/shortcodes中创建youtube.html文件。\n\u0026lt;style\u0026gt; .meta-media { position: relative; margin-bottom: 30px; display: flex; width: 100%; height: 0; padding-bottom: 75%; } .video { position: absolute; width: 100%; height: 100%; left: 0; top: 0; } \u0026lt;/style\u0026gt; \u0026lt;div class=\u0026#34;meta-media\u0026#34;\u0026gt; \u0026lt;iframe src=\u0026#34;https://www.youtube.com/embed/{{ .Get 0 }}\u0026#34; frameborder=\u0026#34;no\u0026#34; scrolling=\u0026#34;yes\u0026#34; allowfullscreen=\u0026#34;allowfullscreen\u0026#34; high_quality=\u0026#34;1\u0026#34; framespacing=\u0026#34;1\u0026#34; class=\u0026#34;video\u0026#34; \u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/div\u0026gt; 看一下效果：\n结论 shortcodes是不是很方便？让你在博客里面只需要写上一行代码就可以自动链接到B站或者Youtube，可以非常方便的引流。赶快在你的个人博客加入shortcodes添加B站和Youtube视频吧。能大大提高你的B站和Youtube视频的站外曝光率。\n","date":"2023-07-29T15:18:42Z","permalink":"https://blog.lufei.de/p/hugo%E4%BD%BF%E7%94%A8shortcode%E6%8F%92%E5%85%A5bilibiliyoutube%E8%A7%86%E9%A2%91/","title":"Hugo使用Shortcode插入bilibili、Youtube视频"},{"content":"简介 近期甲骨文出台了政策，将对闲置的服务器进行停机或者回收处理，为了防止被删，网上各路大神也出了很多教程来让服务器高负载，不过大多数都是试用 shell 脚本循环计算，dd 复制空文件或者一些类似 lookbusy 等第三方软件来模拟高负载。\n不过作为洁癖党，总是会避免安装一些不太了解的第三方软件，也但是一些脚本后台运行出问题，或者时间长了忘记了，所以还是觉得把脚本跑在 docker 里最合适，也最方便管理。可以做到想开就开，想关就关，还可以配合 crontab 定时开关。\n教程 原理很简单，就是写了一段最简单的循环计算 shell 脚本，在 alpine 容器内部执行。只需要控制 docker 的启动和停止即可。\n注意：本服务脚本仅占用 CPU 资源，甲骨文政策大概率满足其一即可。\nCPU 占用效果 启动此容器后 CPU 占用大致效果图\ndocker 启动命令\ndocker run -d --name keeporaclealive --rm alpine sh -c \u0026#34;while true; do for i in {1..100000}; do j=$((i*i)); done; done\u0026#34; 停止命令\ndocker stop keeporaclealive 注意：上述启动命令加入了--rm参数，停止容器将自动删除容器，不会残留到系统中。\ndocker 常驻 启动命令\ndocker run -d --name keeporaclealive --restart always alpine sh -c \u0026#34;while true; do for i in {1..100000}; do j=$((i*i)); done; done\u0026#34; 上述命令将容器常驻，即使服务器重启也会自动启动服务。\n停止命令\ndocker stop keeporaclealive # 停止服务，容器不会被删除。 docker start keeporaclealive # 再次启动容器。 docker rm keeporaclealive # 停止后彻底删除容器。 docker compose 同时也可以用 docker compose 来管理，这样启动和停止命令会更加方便。\nmkdir keeporaclealive cd keeporaclealive vi docker-compose.yml # 创建 keeporaclealive 目录并新建 docker-compose.yml 文件，复制以下配置文件。 docker-compose.yml\nversion: \u0026#39;3\u0026#39; services: keeporaclealive: category_bar: true alpine command: \u0026#39;sh -c \u0026#34;while true; do for i in $$(seq 1 100000); do j=$$[i*i]; done; done\u0026#34;\u0026#39; restart: always 启动和停止可以用以下命令控制：\ndocker-compose up -d # 启动 docker-compose down # 停止 crontab 定时任务，每日 10 点启动，每日 14 点停止。\n根据自身情况修改 /root/keeporaclealive 目录地址\ncrontab -e # 添加以下两条记录 0 10 * * * cd /root/keeporaclealive \u0026amp;\u0026amp; /usr/local/bin/docker-compose up -d 0 14 * * * cd /root/keeporaclealive \u0026amp;\u0026amp; /usr/local/bin/docker-compose down 结语 更多甲骨文云 Oracle Cloud 相关技巧,教程及信息,请持续关注甲骨文云 Oracle Cloud 系列文章汇总\n","date":"2023-07-29T13:25:52Z","permalink":"https://blog.lufei.de/p/%E7%94%B2%E9%AA%A8%E6%96%87%E4%BA%91-oracle-cloud-%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%98%B2%E5%9B%9E%E6%94%B6%E4%BF%9D%E6%B4%BB-docker-%E5%91%BD%E4%BB%A4/","title":"甲骨文云 Oracle Cloud 服务器防回收保活 docker 命令"},{"content":"本地 Git 和 GitHub 的链接（通过 SSH Key 配置） 1. 注册 GitHub 账号，安装 git Github: https://github.com/\nGit 下载: https://git-scm.com/\n安装完git以后,全部的命令操作都在bash里执行\n2. 本地配置用户名和邮箱 你的 github 用户名和邮箱\ngit config --global user.name \u0026#34;woniu336\u0026#34; git config --global user.email \u0026#34;310478073@qq.com\u0026#34; 3. 生成 SSH Key 一路回车即可\nssh-keygen -t rsa -C \u0026#34;310478073@qq.com\u0026#34; 用户主目录 /.ssh 下有两个文件，id_rsa 是私钥，id_rsa.pub 是公钥, 记事本打开公钥 id_rsa.pub, 然后复制公钥内容\n4. 添加 SSH keys 回到浏览器中，进入 Github 设置中的 SSH and GPG keys，新建一个 SSH keys，标题自己起，Key 的内容就输入刚才复制的文件中的值，然后添加。\n添加地址: https://github.com/settings/ssh/new\n5. 验证关联 回到本地的 Git 窗口，输入如下代码，验证是否链接成功。\nssh -T git@github.com 再输入yes\n6. 远程库与本地库操作 从远程克隆一份到本地 git clone git@github.com:woniu336/blog-image.git 以后获取用 git pull origin main\n本地库关联远程库 (没有问题就从第3点开始) git remote add origin git@github.com:woniu336/blog-image.git 添加远程github仓库的时候提示错误：error: remote origin already exists.\n先删除远程 Git 仓库\ngit remote rm origin 再添加远程 Git 仓库\ngit remote add origin git@github.com:woniu336/blog-image.git 推送 master 分支的所有内容 ​ 例如添加一个 test. Txt 文件, 然后推送到远程\ntouch test.txt git add test.txt git commit -m \u0026#34;添加新文件\u0026#34; git push -u origin main 注意: 远程分支是main还是master , 第一次使用加上了-u 参数\n推送成功后就可以看到远程和本地的内容一模一样，下次只要本地作了提交，就可以通过命令：\ngit commit -am \u0026#34;update\u0026#34; git push origin main 把最新内容推送到 Github\n7. 推送错误 (网络问题) 办法: 为 git 设置 http, https 代理 7890 是小狐狸的代理端口, 请修改为自己本地的代理端口, 搞定!\ngit config --global http.proxy \u0026#39;socks5://127.0.0.1:7890\u0026#39; git config --global https.proxy \u0026#39;socks5://127.0.0.1:7890\u0026#39; 其他操作: 取消 http, https 代理\ngit config --global --unset http.proxy git config --global --unset https.proxy 查看当前生效的配置，\ngit config -l 输入 git remote show origin 来检查当前分支情况\ngit remote show origin bash终端设置代理:\nset http_proxy=socks5://127.0.0.1:7890 set https_proxy=socks5://127.0.0.1:7890 取消sock5代理\nset http_proxy= set https_proxy= ","date":"2023-07-29T07:01:04Z","permalink":"https://blog.lufei.de/p/git-%E5%92%8C-github-%E7%9A%84%E5%85%B3%E8%81%94/","title":"Git 和 GitHub 的关联"},{"content":"日记 table title AS \u0026#34;标题\u0026#34;,date AS \u0026#34;创建时间\u0026#34; from \u0026#34;日记\u0026#34; where draft=true sort date desc 草稿箱 table title AS \u0026#34;标题\u0026#34;,date AS \u0026#34;创建时间\u0026#34; from \u0026#34;post\u0026#34; where draft=true sort date desc 已发布 table title AS \u0026#34;标题\u0026#34;,date AS \u0026#34;创建时间\u0026#34; from \u0026#34;post\u0026#34; where draft=false sort date desc ","date":"2023-07-29T06:55:44Z","permalink":"https://blog.lufei.de/p/obsidian%E4%B8%BB%E9%9D%A2%E6%9D%BF%E8%AE%BE%E8%AE%A1/","title":"obsidian主面板设计"},{"content":"1.申请 envId 请看 twikoo 官方文档，我选的是 vercel 部署方式，视频教程：Twikoo Vercel 部署教程\n2.添加代码 Hugo 的 PaperMod 主题添加 twikoo 代码的位置：layouts/partials/comments.html 推荐添加在自己博客站点下的 layouts 文件夹，不要添加到主题里的 layouts 文件夹，否则更新主题时会被覆盖\n\u0026lt;div\u0026gt; \u0026lt;div class=\u0026#34;pagination__title\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;pagination__title-h\u0026#34; style=\u0026#34;font-size: 20px;\u0026#34;\u0026gt;💬评论\u0026lt;/span\u0026gt; \u0026lt;hr /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;tcomment\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script src=\u0026#34; https://cdn.staticfile.org/twikoo/ {{ .Site.Params.twikoo.version }} /twikoo. All. Min. Js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; Twikoo.Init ({ EnvId: \u0026#34;\u0026#34;, //这里填写自己的 envId el: \u0026#34; #tcomment \u0026#34;, Lang: \u0026#39;zh-CN\u0026#39;, Region: \u0026#39;ap-guangzhou\u0026#39;, //我的区域是广州，可以不填，默认是 ap-shanghai Path: window. TWIKOO_MAGIC_PATH||window. Location. Pathname, }); \u0026lt;/script\u0026gt; \u0026lt;/div\u0026gt; 调用上述 twikoo 代码的位置：layouts/_default/single. Html\n// twikoo，一般只需要复制以下3行代码，加上其他代码是为了帮助读者确认代码添加的位置 {{- if (.Param \u0026#34;comments\u0026#34;) }} {{- partial \u0026#34;comments.html\u0026#34; . }} {{- end }} 在站点配置文件 config. Yml 的 params 中加上如下代码，版本号自己去 twikoo 的 github 看最新的版本\nparams: twikoo: version: 1.5.8 // 这个版本号要自己手动修改，和twikoo的版本号要对得上 完结!\n","date":"2023-07-28T17:26:55Z","permalink":"https://blog.lufei.de/p/hugo%E9%83%A8%E7%BD%B2twikoo%E8%AF%84%E8%AE%BA/","title":"hugo部署twikoo评论"},{"content":"本文将对我个人的博文写作流程 所用到的工具 做一个总结与分享。从标题就可以看出来，主要有这几个工具： emacs, orgmode \u0026amp; hugo ，另外还有两个配合 hugo 的辅助包 easy-hugo （可选） \u0026amp; ox-hugo 。\nhugo : https://gohugo.io/ orgmode : https://orgmode.org/ ox-hugo : https://ox-hugo.scripter.co/ easy-hygo : https://github.com/masasam/emacs-easy-hugo 自问自答 问： 为什么写这篇文章？ 答： 中文搜索居然搜索不到一篇有关 ox-hugo 的内容。\n问： 这篇文章主要解决什么问题？ 答： orgmode 配合 hugo 来写作、发布、管理博文的一种便捷方案。\n问： 为什么用 emacs 和 orgmode ？ 答： 谁让我当年入了 emacs 和 orgmode 的「坑」 😂 ，这只是习惯而已。这俩工具还是需要一定的学习成本的，因此，本文对不熟悉 emacs 和 orgmode，或者使用其它编辑器的用户没多大帮助，但多少可以了解一下。\n问： 为什么用 hugo ？ 答： 最开始只是因为 hugo 原生支持 orgmode ，事后来看，其实支持的不是很好，但是 ox-hugo 解决了用 orgmode 写博文的问题。当然还有一点，在生成静态网站的诸多工具（如 jekyll, hexo 等等）中，我发现 hugo 的安装是最便捷的，只需要下载一个二进制文件直接安装就能用了，而其它工具却总要安装一些别的依赖。网上还有种说法是 hugo 的网站生成速度是最快的，这个我没测试过，也不太确定。\n发布博文的一般流程 创建一个 orgmode heading 作为博文标题； 写文章（废话）； 使用 ox-hugo 生成 markdown 文件； 使用 easy-hugo 预览； 发布（废话）。 如前文所说，如果你不熟悉 emacs 和 orgmode ，一定会觉得这个流程好麻烦，何必用这些工具，把写作这回事儿弄得复杂了。我下面会对这个流程进行补充说明，并阐述它们的优点。\n创建博文 正常我们使用 hugo 是怎样创建一篇新博文的呢？在命令行下，敲击命令 hugo new posts/my-first-post.md ，然后用自己熟悉的编辑器编辑这个文件。这个文件的头部包含我们这篇文章的一些基本信息，比如像这样：\ntitle: \u0026#34;An Example Post\u0026#34; #标题 date: 2018-01-01T16:01:23+08:00 #发布时间 lastmod: 2018-01-02T16:01:23+08:00 #修改时间 published: true #是否是草稿？ tags: [\u0026#34;tag-1\u0026#34;, \u0026#34;tag-2\u0026#34;, \u0026#34;tag-3\u0026#34;] #标签 categories: [\u0026#34;index\u0026#34;] #分类 更多内容请访问: 贤民的博客 ","date":"2023-07-28T15:42:11Z","permalink":"https://blog.lufei.de/p/%E5%8D%9A%E5%AE%A2%E5%86%99%E4%BD%9C%E6%B5%81%E7%A8%8B%E4%B9%8B%E5%B7%A5%E5%85%B7%E7%AF%87/","title":"博客写作流程之工具篇"},{"content":"此方法来自 Hugo官方文档 中的 hugofastsearch\nA usability and speed update to “Github Gist for Fuse. Js integration” — global, keyboard-optimized search.\n没错，这个方案，是 Github Gist for Fuse.js integration 的改进版。\n其实在使用这个方案之前，老灯也尝试了 hugo-lunr-zh 方案。hugo-lunr Last publish 4 years ago 而 hugo-lunr-zh 本身是基于 hugo-lunr 添加了一个 nodejieba (结巴分词 lib)分词的功能以支持中文，同样是年久失修了 Last publish 2 years ago，不过我使用这个生成索引失败了，没有任何错误输出，只能做罢。\n亮点 最小/零外部依赖（无需 jQuery） 添加到每个页面尺寸尽可能小 JSON 索引文件按需加载（进一步减少对页的速度/用户体验的整体影响） 键盘友好，瞬时导航（有点像 Alfred / macOS Spotlight） 另外，此方案就像 Eddie Webb指出的那样, 还有如下额外的好处：\n无需 NPM, grunt 等外部工具 无需额外的编译步骤，你只需要像往常一样执行 hugo 可以方便地切换到任意可使用 json 索引的客户端搜索工具 集成步骤 添加 index.json 文件到 layouts/_default 修改 config.toml 以使 Hugo 对首页生成额外的 JSON 输出格式 添加 fastsearch.js 和 fuse.min.js (可从 https://fusejs.io 下载) 到 static/js 添加搜索框 HTML 代码到模板页面 footer 添加 CSS 样式到模板页面 header 或模板主 CSS 文件 访问 http://localhost:1313/ , 键入 Alt-/ 执行搜索 相关文件 注意：跟原文章相比，老灯做了一些微调\n允许通过点击页面空白处隐藏搜索框，而不是只能按 Esc\n在右上角添加了一个搜索按钮，方便不想按快捷键的人\n默认的快捷键由于 Firefox Linux 默认 Super-/ 是 Quick Find 功能，因此我改成了 Alt-/\nlayouts/_default/index.json\n{{- $.Scratch.Add \u0026#34;index\u0026#34; slice -}} {{- range .Site.RegularPages -}} {{- $.Scratch.Add \u0026#34;index\u0026#34; (dict \u0026#34;title\u0026#34; .Title \u0026#34;tags\u0026#34; .Params.tags \u0026#34;categories\u0026#34; .Params.categories \u0026#34;contents\u0026#34; .Plain \u0026#34;permalink\u0026#34; .Permalink \u0026#34;date\u0026#34; .Date \u0026#34;section\u0026#34; .Section) -}} {{- end -}} {{- $.Scratch.Get \u0026#34;index\u0026#34; | jsonify -}} 这里默认取的 contents, 如果文章数量特别多，可能会导致生成的索引过大\nconfig.toml 增加配置 [outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;RSS\u0026#34;, \u0026#34;JSON\u0026#34;] static/js/fastsearch.js fuse.min.js 可从 https://github.com/krisk/Fuse/releases 下载。\nvar fuse; // holds our search engine var fuseIndex; var searchVisible = false; var firstRun = true; // allow us to delay loading json data unless search activated var list = document.getElementById(\u0026#39;searchResults\u0026#39;); // targets the \u0026lt;ul\u0026gt; var first = list.firstChild; // first child of search list var last = list.lastChild; // last child of search list var maininput = document.getElementById(\u0026#39;searchInput\u0026#39;); // input box for search var resultsAvailable = false; // Did we get any search results? // ========================================== // The main keyboard event listener running the show // document.addEventListener(\u0026#39;keydown\u0026#39;, function(event) { // CMD-/ to show / hide Search if (event.altKey \u0026amp;\u0026amp; event.which === 191) { // Load json search index if first time invoking search // Means we don\u0026#39;t load json unless searches are going to happen; keep user payload small unless needed doSearch(event) } // Allow ESC (27) to close search box if (event.keyCode == 27) { if (searchVisible) { document.getElementById(\u0026#34;fastSearch\u0026#34;).style.visibility = \u0026#34;hidden\u0026#34;; document.activeElement.blur(); searchVisible = false; } } // DOWN (40) arrow if (event.keyCode == 40) { if (searchVisible \u0026amp;\u0026amp; resultsAvailable) { console.log(\u0026#34;down\u0026#34;); event.preventDefault(); // stop window from scrolling if ( document. ActiveElement == maininput) { first.Focus (); } // if the currently focused element is the main input --\u0026gt; focus the first \u0026lt;li\u0026gt; Else if ( document. ActiveElement == last ) { last.Focus (); } // if we\u0026#39;re at the bottom, stay there Else { document.ActiveElement.ParentElement.NextSibling.FirstElementChild.Focus (); } // otherwise select the next search result } } // UP (38) arrow If (event. KeyCode == 38) { If (searchVisible \u0026amp;\u0026amp; resultsAvailable) { Event.PreventDefault (); // stop window from scrolling If ( document. ActiveElement == maininput) { maininput.Focus (); } // If we\u0026#39;re in the input box, do nothing Else if ( document. ActiveElement == first) { maininput.Focus (); } // If we\u0026#39;re at the first item, go to input box Else { document.ActiveElement.ParentElement.PreviousSibling.FirstElementChild.Focus (); } // Otherwise, select the search result above the current active one } } }); // ========================================== // execute search as each character is typed // Document.GetElementById (\u0026#34;searchInput\u0026#34;). Onkeyup = function (e) { ExecuteSearch (this. Value); } Document.QuerySelector (\u0026#34;body\u0026#34;). Onclick = function (e) { if (e.target. TagName === \u0026#39;BODY\u0026#39; || e.target. TagName === \u0026#39;DIV\u0026#39;) { HideSearch () } } document.QuerySelector (\u0026#34; #search -btn\u0026#34;). Onclick = function (e) { DoSearch (e) } Function doSearch (e) { e.stopPropagation (); If (firstRun) { LoadSearch () // loads our json data and builds fuse. Js search index FirstRun = false // let\u0026#39;s never do this again } // Toggle visibility of search box If (! SearchVisible) { ShowSearch () // search visible } Else { HideSearch () } } Function hideSearch () { Document.GetElementById (\u0026#34;fastSearch\u0026#34;). Style. Visibility = \u0026#34;hidden\u0026#34; // hide search box Document.ActiveElement.Blur () // remove focus from search box SearchVisible = false } Function showSearch () { Document.GetElementById (\u0026#34;fastSearch\u0026#34;). Style. Visibility = \u0026#34;visible\u0026#34; // show search box Document.GetElementById (\u0026#34;searchInput\u0026#34;). Focus () // put focus in input box so you can just start typing SearchVisible = true } // ========================================== // fetch some json without jquery // Function fetchJSONFile (path, callback) { Var httpRequest = new XMLHttpRequest (); HttpRequest. Onreadystatechange = function () { If (httpRequest. ReadyState === 4) { If (httpRequest. Status === 200) { Var data = JSON.Parse (httpRequest. ResponseText); If (callback) callback (data); } } }; HttpRequest.Open (\u0026#39;GET\u0026#39;, path); HttpRequest.Send (); } // ========================================== // load our search index, only executed once // on first call of search box (CMD-/) // Function loadSearch () { Console.Log (\u0026#39;loadSearch ()\u0026#39;) FetchJSONFile (\u0026#39;/index. Json\u0026#39;, function (data){ Var options = { // fuse. Js options; check fuse. Js website for details ShouldSort: true, Location: 0, Distance: 100, Threshold: 0.4, MinMatchCharLength: 2, Keys: [ \u0026#39;permalink\u0026#39;, \u0026#39;title\u0026#39;, \u0026#39;tags\u0026#39;, \u0026#39;contents\u0026#39; ] }; // Create the Fuse index FuseIndex = Fuse.CreateIndex (options. Keys, data) Fuse = new Fuse (data, options, fuseIndex); // build the index from the json file }); } // ========================================== // using the index we loaded on CMD-/, run // a search query (for \u0026#34;term\u0026#34;) every time a letter is typed // in the search box // Function executeSearch (term) { Let results = fuse.Search (term); // the actual query being run using fuse. Js Let searchitems = \u0026#39;\u0026#39;; // our results bucket If (results. Length === 0) { // no results based on what was typed into the input box ResultsAvailable = false; Searchitems = \u0026#39;\u0026#39;; } else { // build our html // console.Log (results) Permalinks = []; NumLimit = 5; For (let item in results) { // only show first 5 results If (item \u0026gt; numLimit) { Break; } If (permalinks.Includes (results[item]. Item. Permalink)) { Continue; } // console.Log (\u0026#39;item: %d, title: %s\u0026#39;, item, results[item]. Item. Title) searchitems = searchitems + \u0026#39;\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;\u0026#39; + results[item].item.permalink + \u0026#39;\u0026#34; tabindex=\u0026#34;0\u0026#34;\u0026gt;\u0026#39; + \u0026#39;\u0026lt;span class=\u0026#34;title\u0026#34;\u0026gt;\u0026#39; + results[item]. Item. Title + \u0026#39;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\u0026#39;; Permalinks.Push (results[item]. Item. Permalink); } ResultsAvailable = true; } Document. GetElementById (\u0026#34;searchResults\u0026#34;). InnerHTML = searchitems; If (results. Length \u0026gt; 0) { First = list. FirstChild. FirstElementChild; // first result container — used for checking against keyboard up/down location Last = list. LastChild. FirstElementChild; // last result container — used for checking against keyboard up/down location } } 添加搜索框 HTML 代码到模板页面 footer 这个可以通过添加到 baseof 或者 footer 模板。\n比如我当前在使用的 terminal 主题，它就内置了额外的 footer 支持，可以通过添加 layouts/partials/extended_footer. Html 方便地对 footer 增加内容。\n如果主题没有额外的支持，你可以 copy 你当前主题目录下的 baseof. Html 模板到layouts/_default/baseof. Html，然后在最后附加内容。\n\u0026lt;a id=\u0026#34;search-btn\u0026#34; style=\u0026#34;display: inline-block;\u0026#34; href=\u0026#34;javascript:void(0);\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;icon-search\u0026#34;\u0026gt;捜\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;div id=\u0026#34;fastSearch\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;searchInput\u0026#34; tabindex=\u0026#34;0\u0026#34;\u0026gt; \u0026lt;ul id=\u0026#34;searchResults\u0026#34;\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script src=\u0026#34;/js/fuse.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;!-- download and copy over fuse.min.js file from fusejs.io --\u0026gt; \u0026lt;script src=\u0026#34;/js/fastsearch.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 添加 CSS 样式到模板页面 header 或模板主 CSS 文件 这个可以通过添加到 header 模板或模板的主 CSS 文件。\n比如我当前在使用的 terminal 主题，它就内置了额外的 header 支持，可以通过添加 layouts/partials/extended_header. Html 方便地对 header 增加内容。\n如果主题没有额外的支持，你可以修改模板的主 CSS 文件，通常是style. Css 或 main. Css，这个因情况而异。\n#fastSearch { Visibility: hidden; Position: absolute; Right: 10 px; Top: 10 px; Display: inline-block; Width: 320 px; Margin: 0 10 px 0 0; Padding: 0; } #fastSearch input { Padding: 4 px; Width: 100%; Height: 31 px; Font-size: 1.6 em; color: #222129 ; Font-weight: bold; background-color: #ffa86a ; Border-radius: 3 px 3 px 0 px 0 px; Border: none; Outline: none; Text-align: left; Display: inline-block; } #searchResults li { List-style: none; Margin-left: 0 em; background-color: #333 ; border-bottom: 1 px dotted #000 ; } #searchResults li .title { Font-size: 1.1 em; Margin: 0; Display: inline-block; } #searchResults { Visibility: inherit; Display: inline-block; Width: 320 px; Margin: 0; Max-height: calc (100 vh - 120 px); Overflow: hidden; } #searchResults a { Text-decoration: none !Important; Padding: 10 px; Display: inline-block; Width: 100%; } #searchResults a: hover, #searchResults a: focus { Outline: 0; background-color: #666 ; color: #fff ; } #search -btn { Position: absolute; Top: 10 px; Right: 20 px; Font-size: 24 px; } @media (max-width: 683 px) { #fastSearch , #search -btn { Top: 64 px; } } 如果样式跟你当前的主题不是很合，你可以自行稍作调整。\n","date":"2023-07-28T15:32:05Z","permalink":"https://blog.lufei.de/p/%E7%BB%99-hugo-%E5%8D%9A%E5%AE%A2%E5%A2%9E%E5%8A%A0%E6%90%9C%E7%B4%A2%E5%8A%9F%E8%83%BD/","title":"给 Hugo 博客增加搜索功能"},{"content":"博客是建好了，但是总是想添加一个代码一键复制的功能。一开始是想去 html 标签中直接添加一个 button ，但是发现好像并没有那么简单。查阅了 Hugo 的内置功能也没有发现，很幸运找到了一篇博客 黄忠德的博客 ，正好解决了我的需求。所以也记录一下。\n思考 我们知道，代码片段是使用 markdown code fences 来编写的\n``` jsx import React from \u0026#39;react\u0026#39;; ``` 以上代码在 Hugo 编译下的 Html 将展示成如下形式\n\u0026lt;div class=\u0026#34;highlight\u0026#34;\u0026gt; \u0026lt;pre style=\u0026#34;background-color:#f0f0f0;tab-size:4\u0026#34;\u0026gt; \u0026lt;code class=\u0026#34;language-jsx\u0026#34; data-lang=\u0026#34;jsx\u0026#34;\u0026gt; \u0026lt;span style=\u0026#34;color:#007020;font-weight:bold\u0026#34;\u0026gt;import\u0026lt;/span\u0026gt; React from \u0026lt;span style=\u0026#34;color:#4070a0\u0026#34;\u0026gt;\u0026#39;react\u0026#39;\u0026lt;/span\u0026gt;; \u0026lt;/code\u0026gt; \u0026lt;/pre\u0026gt; \u0026lt;/div\u0026gt; 我们要解决的问题是：\n搜索所有突出显示的代码块，特别是所有具有类 highlight 的元素； 如何创建按钮放在代码框中； 给按钮添加一个事件，用于将代码块中的代码复制到剪贴板。 代码 检查复制支持 进行复制之前，我们首先需要对浏览器是否可以使用 document.execCommand('copy') 这个功能，因为这段代码正是我们要使用的复制调用代码，我们需要一个命令来检查一下\nif(!document.queryCommandSupported(\u0026#39;copy\u0026#39;)) { return; } 但是 queryCommandSupported 方法似乎已经弃用，所以其实是不用添加的。\n选择突出显示的代码块 上文提到，突出显示的代码块是包含在类 highlight 中的，我们可以使用内置的 DOM API 来检查所有的在 highlight 内容\nvar highlightBlocks = document.getElementsByClassName(\u0026#39;highlight\u0026#39;); 添加按钮 由于 Hugo 的自动编译使得我们无法直接在 html 中添加按钮，这也是我一开始的疑问之处。但是可以使用 js 创建一个特定的函数来实现这个功能。然后在 for 循环中调用这个函数\nfunction addCopyButton(containerEl) { var copyBtn = document.createElement(\u0026#34;button\u0026#34;); copyBtn.className = \u0026#34;highlight-copy-btn\u0026#34;; copyBtn.textContent = \u0026#34;Copy\u0026#34;; containerEl.appendChild(copyBtn); } for (var i = 0; i \u0026lt; highlightBlocks.length; i++) { addCopyButton(highlightBlocks[i]); } 复制响应 点击按钮，使用 document.execCommand() 方法将代码复制到剪贴板，同时还要保持代码的格式。所以创建一个函数，用来选择给定的 html 中的所有文本\nfunction selectText(node) { var selection = window.getSelection(); var range = document.createRange(); range.selectNodeContents(node); selection.removeAllRanges(); selection.addRange(range); return selection; } 因为代码节点是在 \u0026lt;pre\u0026gt; 所以使用 .firstElementChild 来获取节点，选择文本后添加到剪贴板，然后删除所有选择\nvar codeEl = containerEl.firstElementChild; copyBtn.addEventListener(\u0026#39;click\u0026#39;, function() { var selection = selectText(codeEl); document.execCommand(\u0026#39;copy\u0026#39;); selection.removeAllRanges(); }); 添加样式 这部分是比较简单的，直接放代码了，之后可以自己调试代码按钮样式\n.highlight { position: relative; } .highlight pre { padding-right: 75px; } .highlight-copy-btn { position: absolute; top: 7px; right: 7px; border: 0; border-radius: 4px; padding: 1px; font-size: 0.7em; line-height: 1.8; color: #fff; background-color: #777; min-width: 55px; text-align: center; } .highlight-copy-btn:hover { background-color: #666; } 我们可以看到在代码框的右上方添加了一个灰色的按钮。\n已复制响应 所有功能其实都已经完成了，为了更好的用户体验，在点击按钮后需要有一个已复制的响应返回。\nfunction flashCopyMessage(el, msg) { el.textContent = msg; setTimeout(function() { el.textContent = \u0026#34;Copy\u0026#34;; }, 1000); } try { var selection = selectText(codeEl); document.execCommand(\u0026#39;copy\u0026#39;); selection.removeAllRanges(); flashCopyMessage(copyBtn, \u0026#39;Copied!\u0026#39;) } catch(e) { console \u0026amp;\u0026amp; console.log(e); flashCopyMessage(copyBtn, \u0026#39;Failed :\\\u0026#39;(\u0026#39;) } 所有代码 copy-to-clipboard.css :\n.highlight { position: relative; } .highlight pre { padding-right: 75px; } .highlight-copy-btn { position: absolute; top: 7px; right: 7px; border: 0; border-radius: 4px; padding: 1px; font-size: 0.7em; line-height: 1.8; color: #fff; background-color: #777; min-width: 55px; text-align: center; } .highlight-copy-btn:hover { background-color: #666; } copy-to-clipboard.js :\n(function() { \u0026#39;use strict\u0026#39;; if(!document.queryCommandSupported(\u0026#39;copy\u0026#39;)) { return; } function flashCopyMessage(el, msg) { el.textContent = msg; SetTimeout (function () { El. TextContent = \u0026#34;Copy\u0026#34;; }, 1000); } Function selectText (node) { Var selection = window.GetSelection (); Var range = document.CreateRange (); Range.SelectNodeContents (node); Selection.RemoveAllRanges (); Selection.AddRange (range); Return selection; } Function addCopyButton (containerEl) { Var copyBtn = document.CreateElement (\u0026#34;button\u0026#34;); CopyBtn. ClassName = \u0026#34;highlight-copy-btn\u0026#34;; CopyBtn. TextContent = \u0026#34;Copy\u0026#34;; Var codeEl = containerEl. FirstElementChild; CopyBtn.AddEventListener (\u0026#39;click\u0026#39;, function () { Try { Var selection = selectText (codeEl); Document.ExecCommand (\u0026#39;copy\u0026#39;); Selection.RemoveAllRanges (); FlashCopyMessage (copyBtn, \u0026#39;Copied!\u0026#39;) } catch (e) { Console \u0026amp;\u0026amp; console.Log (e); FlashCopyMessage (copyBtn, \u0026#39;Failed :\\\u0026#39; (\u0026#39;) } }); ContainerEl.AppendChild (copyBtn); } // Add copy button to code blocks Var highlightBlocks = document.GetElementsByClassName (\u0026#39;highlight\u0026#39;); Array.Prototype.ForEach.Call (highlightBlocks, addCopyButton); })(); 将这两个文件分别放在 assets/css 和 assets/js 下，然后在配置文件 config. Toml 中修改自定义 css 和 js，或者手动添加到 head. Html 头文件中。\nCustom_css = [\u0026#34;css/copy-to-clipboard. Css\u0026#34;] Custom_js = [\u0026#34;js/copy-to-clipboard. Js\u0026#34;] 参考 https://huangzhongde.cn/post/2020-02-21-hugo-code-copy-to-clipboard/ https://www.tomspencer.dev/blog/2018/09/14/adding-click-to-copy-buttons-to-a-hugo-powered-blog/ ","date":"2023-07-28T14:14:16Z","permalink":"https://blog.lufei.de/p/hugo-%E4%BB%A3%E7%A0%81%E6%8B%B7%E8%B4%9D%E6%8F%92%E4%BB%B6/","title":"Hugo 代码拷贝插件"},{"content":"错误信息 \u0026ldquo;No url found for submodule path \u0026rsquo;themes/jane\u0026rsquo; in .gitmodules\u0026rdquo;\n表明在你的 Git 项目中的 .gitmodules 文件中找不到 \u0026ldquo;themes/jane\u0026rdquo; 子模块的 URL。\n.gitmodules 文件是一个包含子模块配置信息的文件，它用于跟踪和管理项目中使用的子模块。子模块允许你在一个 Git 项目中嵌套另一个 Git 项目，并将其作为你项目的一部分来管理。\n出现这个错误可能有几种原因：\n缺少 .gitmodules 文件：首先，确保你的项目根目录下有一个名为 .gitmodules 的文件。如果没有该文件，你需要创建一个新的 .gitmodules 文件并添加相应的子模块配置。\nThemes/jane 子模块不存在：如果 themes/jane 子模块确实存在，但它没有被正确地添加为项目的子模块，则需要检查是否正确地添加了子模块。\n解决方法：\n确保 .gitmodules 文件存在：在项目根目录下，使用文本编辑器创建一个新的 .gitmodules 文件，或确保已存在的 .gitmodules 文件没有被移除或重命名。\n添加子模块的 URL：在 .gitmodules 文件中添加 themes/jane 子模块的 URL。例如：\n[submodule \u0026#34;themes/jane\u0026#34;] path = themes/jane url = https://github.com/xianmin/hugo-theme-jane.git 请将上述 URL 替换为 themes/jane 子模块的实际 Git 仓库 URL。\n初始化子模块：运行以下命令来初始化和更新子模块： git submodule init git submodule update 这将会初始化并获取你在 .gitmodules 文件中配置的子模块。\n提交更改：一旦子模块配置正常并成功初始化，确保将 .gitmodules 文件和项目的其他更改提交到 Git 仓库： git add . git commit -m \u0026#34;Added themes/jane submodule\u0026#34; git push 以上步骤应该能帮助你解决 \u0026ldquo;No url found for submodule path \u0026rsquo;themes/jane\u0026rsquo; in .gitmodules\u0026rdquo; 错误。如果你还有其他问题或需要进一步的帮助，请随时向我询问。\n","date":"2023-07-27T06:46:23Z","permalink":"https://blog.lufei.de/p/hugo%E5%AD%90%E6%A8%A1%E5%9D%97%E9%94%99%E8%AF%AF%E6%8F%90%E7%A4%BA%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","title":"hugo子模块错误提示解决办法"},{"content":" 将 vps 中 home/web 目录打包并传到指定 VPS 的 home 目录\n手动备份迁移 按时间戳打包 cd /home/ \u0026amp;\u0026amp; tar czvf web_$(date +\u0026#34;%Y%m%d%H%M%S\u0026#34;).tar.gz web 传输最新的tar压缩包到其他VPS cd /home/ \u0026amp;\u0026amp; ls -t /home/*.tar.gz | head -1 | xargs -I {} scp {} root@0.0.0.0:/home/ 只保留3个压缩包 cd /home/ \u0026amp;\u0026amp; ls -t /home/*.tar.gz | tail -n +4 | xargs -I {} rm {} 远端机器解压最新tar文件 cd /home/ \u0026amp;\u0026amp; ls -t /home/*.tar.gz | head -1 | xargs -I {} tar -xzf {} 自动备份迁移 下载sh脚本\napt update -y \u0026amp;\u0026amp; apt install -y wget sudo sshpass cd /home wget beifen.sh https://raw.githubusercontent.com/kejilion/sh/main/beifen.sh chmod +x beifen.sh nano beifen.sh 运行sh脚本\n./beifen.sh 定时任务\n(crontab -l ; echo \u0026#34;0 2 * * 1 /home/beifen.sh\u0026#34;) | crontab - ","date":"2023-07-25T16:39:14Z","permalink":"https://blog.lufei.de/p/12/","title":"网站远程自动备份方法分享"},{"content":"Nginx Proxy Manager 反向代理神器 1.更新环境\napt update -y \u0026amp;\u0026amp; apt install -y curl socat wget sudo 2.安装 Docker\ncurl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 3.安装 Nginx Proxy Manager\ndocker run -d \\ --name=npm \\ -p 80:80 \\ -p 81:81 \\ -p 443:443 \\ -v /home/npm/data:/data \\ -v /home/npm/letsencrypt:/etc/letsencrypt \\ --restart=always \\ jc21/nginx-proxy-manager:latest 4.进入 NGINX 面板\n服务器 IP 加 81 端口访问网页\n登录:\nadmin@example.com\n密码:\nchangeme\nPortainer-ce 中文版 docker run -d --restart=always --name=\u0026#34;portainer\u0026#34; -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce Uptime Kuma 在线监控平台 可以将各类资源挂载到这个网页监控工具上。方便全局掌控网站或者 IP 的 VPS 心跳延迟情况。建康情况全局掌控！\ndocker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1 或者:\ndocker run -d \\ --name=uptime-kuma \\ -p 3001:3001 \\ -v /home/uptime/uptime-kuma-data:/app/data \\ --restart=always \\ louislam/uptime-kuma:latest ","date":"2023-07-25T16:34:10Z","permalink":"https://blog.lufei.de/p/11/","title":"Docker 项目整理 （持续更新中）"},{"content":"\n假设: 你已经挂载好了GoogleDrive 不能使用systemctl的请先在root下安装 apt install systemd-sysv \u0026amp;\u0026amp; reboot 使用df -h命令查看是否成功 假设 name: gd 挂载目录是 /home/google 运行以下命令:\n注意修改为你的挂载名字(name),以及挂载目录,使用df -h命令查看 复制以下命令：\ncommand=\u0026#34; mount gd:/ /home/google --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000\u0026#34; 继续:\n以下是一整条命令，一起复制到SSH客户端运行 cat \u0026gt; /etc/systemd/system/rclone.service \u0026lt;\u0026lt;EOF [Unit] Description=Rclone After=network-online.target [Service] Type=simple ExecStart=$(command -v rclone) ${command} Restart=on-abort User=root [Install] WantedBy=default.target EOF 现在就可以使用systemctl来挂载GoogleDrive了\nsystemctl enable rclone #开机自启 命令:\nsystemctl start rclone #启动 systemctl restart rclone #重启 systemctl status rclone #状态 完结~\n","date":"2023-07-25T15:57:49Z","permalink":"https://blog.lufei.de/p/10/","title":"rclone开机自动挂载"},{"content":" 1. 谷歌云一键重装系统 Debian 10 10.146.0.5 为内网 IP （需替换）\n0.146.0.1 为网关\nbash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) --ip-addr 10.146.0.5 --ip-gate 10.146.0.1 --ip-mask 255.255.255.0 -d 10 -v 64 -p 123456 -port 22 更新组件 apt update -y \u0026amp;\u0026amp; apt install -y curl \u0026amp;\u0026amp; apt install -y socat \u0026amp;\u0026amp; apt install wget -y su apt-get update apt-get install sudo 2. 更换为 Cloud 内核 听说 5. X 内核对 BBR 有神秘加成，手中正好有闲置小鸡，就来试试\nCloud 内核是什么呢？包页面对 linux-image-cloud-amd 64 的说明是：This package depends on the latest Linux kernel and modules for use on cloud platforms including Amazon EC 2, Microsoft Azure, and Google Compute Engine. 即专门为云平台而优化的，剔除了蓝牙、声音这些无用模块的同时添加了几乎只有云平台会用到的驱动程序，支持 KVM 虚拟化\n一键安装：\necho \u0026#34;deb http://deb.debian.org/debian buster-backports main\u0026#34; \u0026gt; /etc/apt/sources.list.d/buster-backports.list apt update apt -t buster-backports install linux-image-cloud-amd64 -y 删除老内核：\ndpkg --get-selections | grep linux apt autoremove --purge linux-image-4.19.0-20-amd64 linux-image-4.19.0-21-amd64 -y apt autoremove apt autoclean 更新一下 grub：\nsudo update-grub 重启：\nreboot\n重启后一键开启 BBR：\necho \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf \u0026amp;\u0026amp; echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf \u0026amp;\u0026amp; sysctl -p 检查 BBR 是否启动\nlsmod | grep bbr 查看系统现有内核\ndpkg -l|grep linux-image 验证是否成功\nuname -r 如果 Debian 9 安装 Cloud 内核的话：\necho \u0026#34;deb http://deb.debian.org/debian stretch-backports main\u0026#34; \u0026gt; /etc/apt/sources.list.d/stretch-backports.list apt update apt -t stretch-backports install linux-image-cloud-amd64 -y 完结撒花\n","date":"2023-07-25T15:50:54Z","permalink":"https://blog.lufei.de/p/9/","title":"Debian10升级到5.X-cloud内核，并安装BBR"},{"content":"编辑 sshd_config nano /etc/ssh/sshd_config 例如：添加 33 端口，注释掉 22 端口\nPort 33\n退出保存 crl+x 退出 y 确定保存 回车/ 重启 reboot 查看变更状态 systemctl status sshd 新端口使用后，发现注释后依然可以连接！直接删掉 port 22\n","date":"2023-07-25T15:49:53Z","permalink":"https://blog.lufei.de/p/8/","title":"修改SSH端口方法"},{"content":"方法一 一，设置 root 密码 先选择从浏览器打开 ssh 连接服务器 切换到 root 账号，输入代码：sudo -i 设置 root 密码，输入代码：passwd 二，开启 SSH 权限 CentOS 和 Debian 通用，输入以下命令 sed -i \u0026#39;s/PermitRootLogin no/PermitRootLogin yes/g\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; sed -i \u0026#39;s/PasswordAuthentication no/PasswordAuthentication yes/g\u0026#39; /etc/ssh/sshd_config Ubuntu 系统，输入以下命令 sed -i \u0026#39;s/ #PermitRootLogin prohibit-password/PermitRootLogin yes/g\u0026#39; /etc/ssh/sshd_config \u0026amp;\u0026amp; sed -i \u0026#39;s/PasswordAuthentication no/PasswordAuthentication yes/g\u0026#39; /etc/ssh/sshd_config 重启服务器 ： reboot 方法二 切换到root角色 (和前面步骤一样)\nsudo -i 修改SSH配置文件/etc/ssh/sshd_config\nvi /etc/ssh/sshd_config 修改PermitRootLogin和PasswordAuthentication为yes\n# Authentication: PermitRootLogin yes //默认为no，需要开启root用户访问改为yes # Change to no to disable tunnelled clear text passwords PasswordAuthentication yes //默认为no，改为yes开启密码登陆 给root用户设置密码\npasswd root 重启SSH服务使修改生效\n/etc/init.d/ssh restart 以上就是谷歌云设置 ROOT 用户以及允许第三方 SSH 登录教程。\n方法三 本地用xshell生成密秘钥 这里有个坑: 第6步的时候要点击下一步\n图片点击放大\n将秘钥配置到谷歌云上 菜单 — 计算引擎 — 元数据 — SSH秘钥 — 修改 — 添加一项\n粘贴刚才从xshell复制的秘钥。在末尾添加 [空格][用户名] 这里就是“ google”，保存即可。\n用xshell连接 连上之后，输入命令 sudo -i切换到root用户.\n三，一键重装脚本 系统更新\napt update -y \u0026amp;\u0026amp; apt install -y wget sudo 防止报错: Error! grub.cfg\nmkdir /boot/grub2 \u0026amp;\u0026amp; grub-mkconfig -o /boot/grub2/grub.cfg 一键脚本 （ubuntu 20.04）时间半个小时吧，耐心等待就行\nbash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) --ip-addr 10.146.0.3 --ip-gate 10.146.0.1 --ip-mask 255.255.255.0 -u 20.04 -v 64 -p 123456 -port 22 debian10\nbash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) --ip-addr 10.148.0.5 --ip-gate 10.148.0.1--ip-mask 255.255.255.0 -d 10 -v 64 -p 123456 -port 22 仅适用于谷歌云 (密码：123456 ) SSH 端口: 22\n参数修改\n10.146.0.3 谷歌云 VPS 内网 IP 谷歌云后台去找 10.146.0.1 谷歌云 VPS 内网 IP 的网关前三位数和 IP 相同第四位数为 1 系统参数\n-d 10 【7、8、9、10，11】Debian\n-u 20.04 【14.04、16.04、18.04、20.04】Ubuntu\n四，系统更新 apt update -y \u0026amp;\u0026amp; apt full-upgrade -y \u0026amp;\u0026amp; apt install -y curl wget sudo socat ","date":"2023-07-25T15:48:31Z","permalink":"https://blog.lufei.de/p/7/","title":"谷歌云第三方SSH工具登录与一键重装系统"},{"content":"https://blog.leshans.eu.org/p/bt/\n完结撒花🤡\nfuck bt 🤡🤡🤡\n","date":"2023-07-25T15:38:07Z","permalink":"https://blog.lufei.de/p/6/","title":"宝塔面板7.7破解版安装教程"},{"content":"测试CPU性能脚本 apt update -y \u0026amp;\u0026amp; apt install -y curl wget sudo curl -sL yabs.sh | bash -s -- -i -5 VPS 检测 (二选一) wget -q https://github.com/Aniverse/A/raw/i/a \u0026amp;\u0026amp; bash a wget -qO- bench.sh | bash wget -qO- git.io/superbench.sh | bash 磁盘真实性能读写测试 一般数据在 大于20MB/s 为合格，大于40MB/s 为普通，大于80MB/s 为优秀。\ndd bs=64k count=4k if=/dev/zero of=test oflag=dsync 三网测速脚本 bash \u0026lt;(curl -Lso- https://git.io/superspeed_uxh) 三网回程测试脚本(二选一) curl https://raw.githubusercontent.com/zhucaidan/mtr_trace/main/mtr_trace.sh|bash curl https://raw.githubusercontent.com/zhanghanyun/backtrace/main/install.sh -sSf | sh 三网回程延迟测试脚本 wget -qO- git.io/besttrace | bash 解锁状态查看 bash \u0026lt;(curl -Ls https://cdn.jsdelivr.net/gh/missuo/OpenAI-Checker/openai.sh) 流媒体解锁测试脚本 bash \u0026lt;(curl -L -s check.unlock.media) 解锁tiktok状态 wget -qO- https://github.com/yeahwu/check/raw/main/check.sh | bash 一键开启 BBR 脚本 (4.9 以上内核)\necho \u0026#34;net.core.default_qdisc=fq\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf echo \u0026#34;net.ipv4.tcp_congestion_control=bbr\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf sysctl -p lsmod | grep bbr 或者\nwget -N --no-check-certificate \u0026#34;https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/tcp.sh\u0026#34; \u0026amp;\u0026amp; chmod +x tcp.sh \u0026amp;\u0026amp; ./tcp.sh 检查 BBR 是否启动 lsmod | grep bbr 综合工具箱（强烈推荐，集成了很多脚本） wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh \u0026amp;\u0026amp; chmod +x box.sh \u0026amp;\u0026amp; clear \u0026amp;\u0026amp; ./box.sh 一键重装脚本(DD) 脚本1 (leitbogioro) wget --no-check-certificate -qO InstallNET.sh \u0026#39;https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh\u0026#39; \u0026amp;\u0026amp; chmod a+x InstallNET.sh DD 成 Debian 11 bash InstallNET.sh -debian 11 DD 成 Ubuntu 20.04 bash InstallNET.sh -ubuntu 20.04 DD 成 centos 7 (需内存大于1.5G) bash InstallNET.sh -centos 7 脚本2 (萌咖) DD 成 Debian 11 bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) -d 11 -v 64 -p 123456 -port 22 DD 成 Ubuntu 20.04 bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh\u0026#39;) -u 20.04 -v 64 -p 123456 -port 22 密码: 123456 SSH: 22\n脚本3 (其他) wget –no-check-certificate -O AutoReinstall.sh https://git.io/AutoReinstall.sh \u0026amp;\u0026amp; bash AutoReinstall.sh 默认的密码是 ：Pwd@CentOS 或者 Pwd@Linux\n具体是哪一个密码在重装时会提示，重装完成后建议修改这个 root 密码，使用 passwd 命令即可修改。\n这个一键重装系统的脚本 自动获取IP地址、网关、子网掩码 自动判断网络环境，选择国内/外镜像，再也不用担心卡半天了超级懒人一键化，无需复杂的命令解决萌咖脚本中一些导致安装错误的问题 CentOS 7 镜像抛弃 LVM，回归 ext 4，减少不稳定因素。\n更新组件 apt update -y \u0026amp;\u0026amp; apt install -y curl \u0026amp;\u0026amp; apt install -y socat \u0026amp;\u0026amp; apt install wget -y 升级 packages sudo -i apt update -y apt install wget curl sudo vim git -y 查看系统现有内核 dpkg -l|grep linux-image 验证是否成功 uname -r ","date":"2023-07-25T15:28:57Z","permalink":"https://blog.lufei.de/p/5/","title":"整理一些常用的脚本（持续更新中）"},{"content":"{% pdf /pdf/004.pdf %}\n","date":"2023-07-25T14:56:17Z","permalink":"https://blog.lufei.de/p/4/","title":"Cloudflare CDN反代免费VPN高速上网，速度超快，千兆节点、解锁奈飞流媒体"},{"content":"关于 BookmarkHub 是一款浏览器插件，可以在不同浏览器之间同步你的书签。\n适用于各大主流浏览器，如 Chrome、Firefox、Microsoft Edge 等。\n它使用 GitHub 的 Gist 记录来存储浏览器的书签，可以放心安全的使用。\n功能 不需要注册特殊账号，只需要用你的 GitHub 账号的 Token 和 Gist 一键上传下载书签 一键清空本地所有书签 支持跨电脑跨浏览器同步书签 支持显示本地和远程书签的数量 下载安装 本插件需要把书签存储到 Gist 中，所以请确保有 GitHub 账号或可以通过网络注册 GitHub 账号。\nChrome 浏览器 Firefox 浏览器 Microsoft Edge 浏览器 Opera 浏览器 其他基于 Chromium 内核的浏览器 使用方法 登陆 GitHub，如果没有账号请点此注册。 创建一个可以管理 gist 的 token。 创建一个私有的 gist。注意：如果是公开的 gist，你的书签是可以被他人搜索到的。 在浏览器的应用商店下载 BookmarkHub，点击插件的设置按钮，在弹出的设置窗口填入 token 和 gist ID，然后你就可以上传下载书签了。 待实现的功能 自动同步书签 支持 webdav 协议 移动端 导入导出 分享书签 License See LICENSE for more information.\nContact Dudor\nProject Link: https://github.com/dudor/BookmarkHub\n","date":"2023-07-25T14:09:19Z","permalink":"https://blog.lufei.de/p/3/","title":"Chrome 书签实时备份、同步方案"},{"content":"如果你想在 Windows 电脑上体验苹果最新的 macOS 14 Sonoma 系统！ 那么跟着我步骤来进行安装吧~ 安装步骤： 1、首先下载并安装 VMWare 虚拟机软件**【官网下载】**\n下载**【VMWare Unlocker】**，以管理员身份运行 win-install 3.下载 macOS 14 索诺玛 （Sonoma）的 ISO 系统文件【点击下载】\n4.创建虚拟机，转到我的文档 -\u0026gt; 虚拟机 -\u0026gt; macOS 14 虚拟机文件，\n然后在 右键单击​​ 2 KB 的macOS 14 (.VMX) 文件，然后选择****使用记事本打开，并在底部输入以下内容：\nsmc.version = \u0026#34;0\u0026#34; 全选代码\n复制\n5.正式开始安装\n启用以太网：\n搜索 ethernet0.virtualDev = \u0026ldquo;e1000e\u0026rdquo; 并将 e1000e替换 为 vmxnet3 并保存文件。\n","date":"2023-07-25T13:05:44Z","permalink":"https://blog.lufei.de/p/2/","title":"如何在 VM 虚拟机上安装 macOS 14 索诺玛 最新系统?"},{"content":"官方脚本 （推荐） 脚本1：推荐\ncurl -fsSL https://get.docker.com -o get-docker.sh \u0026amp;\u0026amp; sh get-docker.sh 查询\ndocker --version docker compose version 脚本2：\ncurl -fsSL https://get.docker.com | sh curl -L \u0026#34;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 查看 Docker 版本 （含 Docker compose） docker --version\u0026amp;\u0026amp;docker-compose --version 脚本01 Docker 一键安装脚本 bash \u0026lt;(curl -sSL https://linuxmirrors.cn/docker.sh) 其他\nbash \u0026lt;(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh) 或者\nbash \u0026lt;(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/DockerInstallation.sh) 脚本说明： 脚本集成安装 Docker Engine，可选择安装版本、下载软件源、镜像加速器，支持海内外服务器环境和 arm 架构处理器环境使用\nDocker CE 软件仓库，全称 Docker Community Edition (Docker 社区版)，用于下载并安装 Docker 相关软件包\nDocker Registry 镜像仓库，用于控制下载镜像的来源存储仓库，又称镜像加速器，默认为官方提供 Docker Hub 仓库\n脚本02 Docker 一键安装脚本 bash \u0026lt;(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/DockerInstallation.sh) 脚本说明： 脚本集成安装 Docker Engine，可选择安装版本、下载软件源、镜像加速器，支持海内外服务器环境和 arm 架构处理器环境使用\nDocker CE 软件仓库，全称 Docker Community Edition (Docker 社区版)，用于下载并安装 Docker 相关软件包\nDocker Registry 镜像仓库，用于控制下载镜像的来源存储仓库，又称镜像加速器，默认为官方提供 Docker Hub 仓库\n卸载docker CentOS 卸载 Docker sudo yum remove docker \\ docker-client \\ docker-client-latest \\ docker-common \\ docker-latest \\ docker-latest-logrotate \\ docker-logrotate \\ docker-selinux \\ docker-engine-selinux \\ docker-engine Debian / Ubuntu 卸载 Docker sudo apt-get remove docker docker-engine docker.io containerd runc 其他方式卸载 Docker sudo apt-get purge docker-ce docker-ce-cli containerd.io 继续\nsudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd 接着\napt-get remove -y docker* containerd.io podman* runc \u0026amp;\u0026amp; apt-get autoremove 关于 docker 报错无法启动 非新装环境可能会在运行脚本后遇到 Docker 服务无法启动的情况，建议重新安装来解决.\n卸载完成后重新执行脚本安装即可, 卸载不会删除镜像和容器数据.\n卸载命令如下 :\napt-get remove -y docker* containerd.io podman* runc \u0026amp;\u0026amp; apt-get autoremove 重新安装出现的问题 重启 docker\nsystemctl restart docker ","date":"2023-07-25T07:40:01Z","permalink":"https://blog.lufei.de/p/1/","title":"docker 一键安装脚本"}]