测试中文标题的文章

测试中文标题的文章

这是第一段内容。 这是第二段内容。 这是第三段内容。

Alpine Linux 部署 SmokePing 网络监控

本文介绍如何在 Alpine Linux 系统上部署 SmokePing 网络延迟监控工具,使用 Caddy 作为 Web 服务器,FCGIWrap 处理 CGI 脚本。

系统要求

  • Alpine Linux 3.18+
  • 2GB+ RAM(推荐 4GB+)
  • 20GB+ 磁盘空间
  • 网络连接正常

安装步骤

1. 安装必要软件包

# 更新软件包索引
apk update

# 安装 SmokePing 及相关组件
apk add fcgiwrap fcgiwrap-openrc caddy smokeping smokeping-openrc

# 创建 fcgiwrap 服务用户
useradd -r fcgiwrap-openrc

2. 创建数据目录

# 创建 SmokePing 数据目录
mkdir -p /var/lib/smokeping/Ping
mkdir -p /var/lib/smokeping/DNS

# 设置权限
chown smokeping:smokeping /var/lib/smokeping/Ping
chown smokeping:smokeping /var/lib/smokeping/DNS
chmod 777 /var/lib/smokeping/images/Ping
chmod 777 /var/lib/smokeping/images/DNS

3. 配置 Caddy Web 服务器

创建 Caddy 配置文件 /etc/caddy/Caddyfile

{
    log {
        output file /var/log/caddy/access.log {
            roll_size 100MB  # 单个日志文件最大 100MB
            roll_keep 10     # 保留最近 10 个日志文件
            roll_keep_for 720h  # 保留 30 天(720 小时)
        }
        format console  # 易读的格式,也可改用 json 格式(format json)
    }
}

http://192.168.1.100 {
    # 处理静态资源
    handle_path /js/* {
        root * /usr/share/webapps/smokeping/
        file_server
    }
    handle_path /css/* {
        root * /usr/share/webapps/smokeping/
        file_server
    }
    handle_path /imgcache/* {
        root * /usr/share/webapps/smokeping/
        file_server
    }
    handle_path /images/* {
        root * /var/lib/smokeping/images
        file_server browse
    }

    # 处理 CGI 请求
    handle {
        root * /usr/share/webapps/smokeping/
        reverse_proxy unix//run/fcgiwrap/fcgiwrap.sock {
            transport fastcgi {
                env SCRIPT_FILENAME /usr/share/webapps/smokeping/smokeping.cgi
                split ""
            }
        }
    }
}

4. 配置 SmokePing

创建配置文件 /etc/smokeping/config

*** General ***

owner    = Demo User
contact  = admin@example.com
mailhost = mail.example.com
sendmail = /usr/sbin/sendmail
# NOTE: do not put the Image Cache below cgi-bin
# since all files under cgi-bin will be executed ... this is not
# good for images.
imgcache = /var/lib/smokeping/images
imgurl   = /images
datadir  = /var/lib/smokeping
piddir   = /run/smokeping
cgiurl   = http://192.168.1.100/smokeping.cgi
smokemail = /etc/smokeping/smokemail
tmail     = /etc/smokeping/tmail
# specify this to get syslog logging
syslogfacility = local0
# each probe is now run in its own process
# disable this to revert to the old behaviour
# concurrentprobes = no

5. 配置告警规则

*** Alerts ***
to = admin@example.com
from = smokeping@example.com

# 定义各种告警规则
+hostdown
type = loss
# in percent
pattern ==0%,==0%,==0%, ==U
comment = 对端无响应

+bigloss
type = loss
# in percent
pattern ==0%,==0%,==0%,==0%,>20%,>20%,>20%
comment = 连续3次采样-丢包率超过20%

+lossdetect
type = loss
# in percent
pattern ==0%,==0%,==0%,==0%,>0%,>0%,>0%
comment = 连续3次采样-存在丢包

+someloss
type = loss
# in percent
pattern >0%,*12*,>0%,*12*,>0%
comment = 间断性丢包

+rttdetect
type = rtt
# in milli seconds
pattern <100,<100,<100,<100,<100,<150,>150,>150,>150
comment = 连续3次采样延迟增大-超过150ms

6. 配置数据库设置

*** Database ***

step     = 300
pings    = 20

# consfn mrhb steps total

AVERAGE  0.5   1  28800
AVERAGE  0.5  12   9600
    MIN  0.5  12   9600
    MAX  0.5  12   9600
AVERAGE  0.5 144   2400
    MAX  0.5 144   2400
    MIN  0.5 144   2400

7. 配置显示模板

*** Presentation ***

template = /etc/smokeping/basepage.html
htmltitle = yes
graphborders = no
# If enabled, treat all filter menu queries as literal strings instead of regex
literalsearch = no

+ charts

menu = Charts
title = The most interesting destinations

++ stddev
sorter = StdDev(entries=>4)
title = Top Standard Deviation
menu = Std Deviation
format = Standard Deviation %f

++ max
sorter = Max(entries=>5)
title = Top Max Roundtrip Time
menu = by Max
format = Max Roundtrip Time %f seconds

++ loss
sorter = Loss(entries=>5)
title = Top Packet Loss
menu = Loss
format = Packets Lost %f

++ median
sorter = Median(entries=>5)
title = Top Median Roundtrip Time
menu = by Median
format = Median RTT %f seconds

8. 配置探针

*** Probes ***

+ FPing

binary = /usr/sbin/fping

+ DNS
binary = /usr/bin/dig
lookup = g.cn
pings = 5
step = 180

9. 配置主从模式(可选)

*** Slaves ***
secrets=/etc/smokeping/smokeping_secrets
+boomer
display_name=boomer
color=0000ff

+slave2
display_name=another
color=00ff00

10. 配置监控目标

*** Targets ***

alerts = someloss
probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to the SmokePing website of <b>Example Company</b>. \
         Here you will learn all about the latency of our network.

+ Ping
menu = Ping
title = 10.0.0.14 Pings
alerts = hostdown,bigloss,lossdetect,someloss,rttdetect

++ server1
menu = 192.168.1.50
host = 192.168.1.50

++ server2
menu = 192.168.1.51
host = 192.168.1.51

+ DNS
menu = DNS
probe = DNS
alerts = hostdown,bigloss,lossdetect,someloss,rttdetect

++ dns-server
menu = 192.168.1.200
host = 192.168.1.200

启动服务

1. 启动并启用服务

# 启动 Caddy 服务
rc-service caddy start
rc-service caddy add

# 启动 SmokePing 服务
rc-service smokeping start
rc-service smokeping add

# 启动 fcgiwrap 服务
rc-service fcgiwrap start
rc-service fcgiwrap add

2. 检查服务状态

# 检查 Caddy 状态
rc-service caddy status

# 检查 SmokePing 状态
rc-service smokeping status

# 检查 fcgiwrap 状态
rc-service fcgiwrap status

验证部署

访问 http://192.168.1.100/smokeping.cgi 验证 SmokePing 是否正常工作。

Gitea 完整实践指南:从部署到自动化

一、Gitea 概述

1.1 什么是 Gitea

Gitea 是一个轻量级的自托管 Git 服务,采用 Go 语言编写,是 GitHub 和 GitLab 的轻量替代方案。它提供了完整的代码托管功能,包括 Issues、Pull Requests、Wiki、CI/CD 等,同时保持了极低的资源占用。

为什么选择 Gitea?

特性GiteaGitLabGitHub
资源占用极低(100MB RAM)高(2GB+ RAM)SaaS
部署复杂度简单复杂无需部署
数据控制完全自控完全自控依赖第三方
国内访问可部署内网可部署内网需代理

1.2 核心特性

  • 轻量级:单个二进制文件,内存占用极低
  • 易部署:支持二进制、Docker、包管理器多种方式
  • 完整功能:Issues、PR、Wiki、CI/CD、LFS、包管理
  • 插件系统:支持通过 Markdown 插件扩展功能
  • 兼容性强:支持 GitHub/GitLab 导入,API 兼容

1.3 适用场景

  1. 个人/小团队代码托管 - 轻量快速启动
  2. 企业内网 Git 服务 - 数据完全自控
  3. CI/CD 平台基础 - 结合 Actions 构建自动化流水线
  4. 镜像仓库中转站 - 在国内网络环境下加速访问

FRR OSPF Route-MAP 配置指南

概述

Route-Map 是 FRR (FRRouting) 中强大的路由策略工具,用于控制 OSPF 路由的发布和接收。通过 Route-Map,可以实现:

  • 路由过滤
  • 路由属性修改
  • 条件路由发布

基本概念

Route-Map 结构

Route-Map 由一条或多条 sequence 组成,每个 sequence 有:

  • 匹配条件 (match):定义哪些路由会被处理
  • 动作 (action)permit(允许)或 deny(拒绝)
  • 设置语句 (set):修改路由属性

顺序执行

Route-Map 按序列号从小到大依次执行:

  • 一旦匹配成功,执行对应动作并停止
  • 如果所有 sequence 都未匹配,默认拒绝

常用匹配条件

匹配类型说明示例
ip address匹配 IP 地址/前缀match ip address prefix-list LIST
interface匹配出接口match interface eth0
metric匹配路由开销match metric 100
protocol匹配路由协议类型match protocol ospf
next-hop匹配下一跳地址match ip next-hop A.B.C.D
tag匹配路由标签match tag 100
as-path匹配 AS 路径(BGP)match as-path 100

支持的协议类型

  • ospf - OSPF 路由
  • static - 静态路由
  • connected - 直连路由
  • kernel - 内核路由
  • rip - RIP 路由
  • bgp - BGP 路由
  • isis - IS-IS 路由
  • pim - PIM 路由

配置示例

1. 基本路由过滤

场景:只允许特定网段的路由进入 OSPF

router ospf
 # 定义前缀列表
 ip prefix-list INTERNAL_NETS seq 5 permit 10.0.0.0/8 le 24
 ip prefix-list INTERNAL_NETS seq 10 permit 172.16.0.0/12 le 24
 ip prefix-list INTERNAL_NETS seq 15 permit 192.168.0.0/16 le 24
 ip prefix-list INTERNAL_NETS seq 20 deny any

 # 应用到路由重分发
 redistribute connected route-map FILTER_CONNECTED

# 定义 route-map
route-map FILTER_CONNECTED permit 10
 match ip address prefix-list INTERNAL_NETS

场景:过滤掉特定路由

# 定义要过滤的网段
ip prefix-list BLOCK_NETS seq 5 deny 192.168.100.0/24
ip prefix-list BLOCK_NETS seq 10 permit any

# 应用到路由注入
router ospf
 default-information originate route-map FILTER_DEFAULT

route-map FILTER_DEFAULT permit 10
 match ip address prefix-list BLOCK_NETS

2. 修改路由属性

场景:修改路由开销值

route-map SET_METRIC permit 10
 set metric 100

route-map SET_METRIC permit 20
 match ip address prefix-list SPECIAL_NETS
 set metric 50

# 应用
router ospf
 redistribute static route-map SET_METRIC

场景:根据路由类型设置不同开销

route-map METRIC_BY_TYPE permit 10
 match ip address prefix-list CRITICAL_NETS
 set metric 10

route-map METRIC_BY_TYPE permit 20
 match ip address prefix-list NORMAL_NETS
 set metric 100

3. 条件路由发布

场景:只在有特定路由时发布默认路由

# 定义匹配条件
ip prefix-list ISP_ROUTE seq 5 permit 0.0.0.0/0

route-map CONDITIONAL_DEFAULT permit 10
 match ip address prefix-list ISP_ROUTE

router ospf
 default-information originate route-map CONDITIONAL_DEFAULT always

4. 重分发控制

场景:从 BGP 重分发到 OSPF 时过滤路由

# 只允许特定 BGP 路由进入 OSPF
ip prefix-list FROM_BGP seq 5 permit 203.0.113.0/24
ip prefix-list FROM_BGP seq 10 permit 198.51.100.0/24
ip prefix-list FROM_BGP seq 15 deny any

route-map BGP_TO_OSPF permit 10
 match ip address prefix-list FROM_BGP
 set metric 50
 set metric-type type-1

router ospf
 redistribute bgp route-map BGP_TO_OSPF

场景:不同协议间重分发

# 静态路由重分发
route-map STATIC_TO_OSPF permit 10
 match ip address prefix-list STATIC_NETS
 set metric 20

# 直连路由重分发
route-map CONNECTED_TO_OSPF permit 10
 match interface eth0 eth1
 set metric 10

router ospf
 redistribute connected route-map CONNECTED_TO_OSPF
 redistribute static route-map STATIC_TO_OSPF

5. 基于 OSPF 协议的匹配

场景:只处理 OSPF 协议的路由

# 匹配所有 OSPF 路由
route-map ONLY_OSPF permit 10
 match protocol ospf
 set metric 50

# 在重分发时应用
router ospf
 redistribute connected route-map ONLY_OSPF

场景:排除 OSPF 路由,处理其他协议

# 排除 OSPF 路由,只允许其他协议的路由
route-map EXCLUDE_OSPF permit 10
 match protocol static
 match protocol connected
 match protocol kernel
 set metric 20

route-map EXCLUDE_OSPF deny 20
 match protocol ospf

# 或者使用更简洁的方式
route-map FILTER_PROTOCOL permit 10
 match protocol static
 set metric 30
!
route-map FILTER_PROTOCOL permit 20
 match protocol connected
 set metric 10
!
# 默认拒绝其他协议(包括 ospf)

场景:根据 OSPF 路由类型处理

# 区分 OSPF 内部路由和外部路由
route-map OSPF_INTERNAL permit 10
 match protocol ospf
 match ip address prefix-list INTERNAL_PREFIX
 set metric 10

route-map OSPF_EXTERNAL permit 20
 match protocol ospf
 set metric 100

router ospf
 redistribute ospf route-map OSPF_EXTERNAL

6. 区域间路由控制

# 区域间路由过滤
router ospf
 area 1 filter-list prefix IN_AREA1 in
 area 1 filter-list prefix OUT_AREA1 out

ip prefix-list IN_AREA1 seq 5 deny 192.168.10.0/24
ip prefix-list IN_AREA1 seq 10 permit 10.0.0.0/8 le 24
ip prefix-list IN_AREA1 seq 15 permit 172.16.0.0/12 le 24
ip prefix-list IN_AREA1 seq 20 permit 192.168.0.0/16 le 24

常用命令

查看配置

# 显示 route-map 配置
show route-map

# 显示前缀列表
show ip prefix-list

# 显示 OSPF 路由表
show ip ospf route

# 显示 OSPF 数据库
show ip ospf database

# 显示 route-map 统计信息
show ip protocols ospf

调试命令

# 启用 OSPF 调试
debug ospf lsa
debug ospf zebra

# 查看路由重分发情况
show ip ospf redistribute

# 查看各协议路由
show ip route ospf
show ip route static
show ip route connected
show ip route bgp

# 查看 route-map 匹配统计
show ip route-map detail

最佳实践

1. 命名规范

# 使用描述性的名称
route-map FILTER_EXTERNAL_STATIC permit 10
route-map SET_METRIC_INTERNAL permit 10
route-map BGP_TO_OSPF permit 10

2. 序列号规划

# 使用 10 的倍数,方便插入新规则
route-map EXAMPLE permit 10
route-map EXAMPLE permit 20
route-map EXAMPLE permit 30

# 后续可以在 10 和 20 之间插入
route-map EXAMPLE permit 15

3. 默认拒绝策略

# 总是添加最后的拒绝规则
route-map EXAMPLE permit 10
 match ip address prefix-list ALLOW_NETS
!
route-map EXAMPLE deny 20
!
# 隐含的 deny any 在最后

4. 测试配置

# 临时设置为 permit 观察效果
route-map TEMP_DEBUG permit 100
 set metric 999

# 确认无误后调整
no route-map TEMP_DEBUG permit 100

Netbox 迁移到 k3s

本文记录了将 Netbox 从旧环境迁移到 k3s 集群的过程。

迁移步骤

1. 备份数据库

使用 pg_dump 导出 Netbox 数据库,排除变更日志表以减小备份体积:

pg_dump --username netbox --password --host localhost --exclude-table-data=extras_objectchange netbox > netbox.sql

2. 删除旧 Pod

为了避免 Pod 竞争和锁定问题,先删除现有的 Netbox Pod:

kubectl delete po netbox-68cbd8b854-2hvgp

3. 修改 PostgreSQL 认证方式

临时禁用密码认证

# 进入 PostgreSQL Pod
kubectl exec -it netbox-postgresql-0 -- sed -ibak 's/^\([^#]*\)md5/\1trust/g' /opt/bitnami/postgresql/conf/pg_hba.conf

# 重新加载配置
kubectl exec -it netbox-postgresql-0 -- pg_ctl reload

创建新数据库和用户

kubectl exec -it netbox-postgresql-0 -- psql -U postgres

DROP DATABASE netbox;
CREATE DATABASE netbox;
ALTER USER netbox WITH PASSWORD 'balabalabala';
ALTER DATABASE netbox OWNER TO netbox;

-- PostgreSQL 15 及以上版本需要
\connect netbox;
GRANT CREATE ON SCHEMA public TO netbox;

恢复密码认证

kubectl exec -it netbox-postgresql-0 -- sed -i 's/^\([^#]*\)trust/\1md5/g' /opt/bitnami/postgresql/conf/pg_hba.conf
kubectl exec -it netbox-postgresql-0 -- pg_ctl reload

4. 恢复数据库

kubectl exec -it netbox-postgresql-0 -- sh -c "PGPASSWORD=balabalabala psql -U netbox -d netbox < /tmp/netbox.sql"

wget用Content-Disposition字段值为文件名

基本用法

wget可以通过--content-disposition参数使用HTTP响应头中的Content-Disposition字段来设置下载文件的文件名。

wget [--no-check-certificate] --content-disposition 'url'

详细说明

Content-Disposition头字段

Content-Disposition是HTTP响应头中的一个字段,用于指示如何处理响应内容。当服务器希望浏览器下载文件而不是显示时,会使用这个字段。

常见的格式:

Content-Disposition: attachment; filename="example.pdf"
Content-Disposition: attachment; filename*=UTF-8''%E4%BE%8B%E5%AD%90.pdf

参数说明

  • --content-disposition: 启用对Content-Disposition头的支持
  • --no-check-certificate: 跳过SSL证书验证(可选,用于自签名证书)

实际应用场景

1. 动态文件下载

当下载链接指向动态生成的文件时,服务器会通过Content-Disposition指定正确的文件名:

wget --content-disposition "https://example.com/download.php?id=123"

2. 中文文件名处理

对于包含中文字符的文件名,Content-Disposition可能会使用URL编码:

wget --content-disposition "https://example.com/中文文件.pdf"

wget会自动处理URL编码的文件名。

3. 批量下载

结合其他参数使用:

# 后台下载,使用Content-Disposition文件名
wget -b --content-disposition "https://example.com/file.zip"

# 限制下载速度,使用Content-Disposition文件名
wget --limit-rate=100k --content-disposition "https://example.com/large-file.iso"

在线文件共享网站

以下是几个常用的在线文件共享服务,可用于快速分享文件给他人:

📁 文件传输服务

https://easylink.cc/

  • 简洁快速的文件传输服务
  • 无需注册即可使用
  • 支持设置提取码和有效期

文叔叔

https://www.wenshushu.cn/

  • 国内知名的文件传输平台
  • 支持大文件传输(单文件最大支持 5GB)
  • 提供跨端管理功能

Hostize

https://www.hostize.com/

  • 提供临时文件存储服务
  • 支持快速分享链接
  • 界面简洁易用

去文件

https://quwenjian.cc/

  • 免费在线文件传输工具
  • 无需登录,上传即生成分享链接
  • 文件自动过期删除

💡 选择建议

  • 传输小文件:推荐使用 EasyLink 或去文件
  • 大文件传输:推荐使用文叔叔
  • 临时分享:推荐使用 Hostize

⚠️ 注意事项

  • 请勿传输敏感或机密信息
  • 注意文件大小限制和有效期设置
  • 定期清理过期文件链接

在线抠图工具推荐

以下是几款优秀的在线抠图工具,各有特色,可根据需求选择使用:

HTML Zone Background Remover

https://html.zone/background-remover/

  • 特点:免费且操作简单,支持多种图片格式
  • 优点
    • 无需注册,直接上传使用
    • 处理速度快,一般几秒内完成
    • 支持 JPG、PNG、WebP 等格式
    • 自动识别主体和背景,智能抠图
  • 适用场景:快速处理简单图片,适合用户日常使用

Pickwant

https://www.pickwant.com/removebg

  • 特点:AI 驱动的智能抠图,效果精准
  • 优点
    • 采用先进的 AI 算法,识别边缘准确
    • 支持复杂背景和头发丝细节
    • 提供多种抠图模式:自动、手动微调、批量处理
    • 可调整抠图质量,免费版限制图片大小
  • 适用场景:专业级抠图需求,如电商产品图、证件照处理

高定抠图

https://www.gaoding.com/koutu

  • 特点:国产工具,针对中文用户优化
  • 优点
    • 支持中文界面,操作简单直观
    • 提供手绘功能,可手动修复边缘
    • 支持透明背景输出,适合设计需求
    • 免费版有使用次数限制
  • 适用场景:国内用户首选,适合日常使用和简单设计工作

0v0 AI BG Remover

https://0v0.ai/rmbg/

  • 特点:完全免费的开源 AI 抠图工具
  • 优点
    • 基于 AI 模型,处理效果优秀
    • 无需注册,使用流程简单
    • 支持多种图片格式和复杂场景
    • 处理速度快,适合批量处理
  • 适用场景:需要抠图但预算有限的用户,学生和设计师

使用技巧

1. 图片准备

  • 选择主体清晰的图片,避免模糊或过度曝光
  • 尽量使用高质量的原始图片,抠图效果会更好
  • 如果有透明背景需求,建议使用 PNG 格式

2. 处理建议

  • 对于复杂背景(如毛发、树叶边缘),建议使用支持手动微调的工具
  • 批量处理相同类型图片时,可优先选择支持批量功能的工具
  • 重要图片建议保存多个版本,以便对比选择最佳效果

3. 质量控制

  • 检查抠图边缘是否平滑,有无瑕疵
  • 确认主体完整,无遗漏部分
  • 如需重新处理,确保图片分辨率足够

场景应用

电商产品图

  • 适合工具:Pickwant、高定抠图
  • 需求:精准抠图,突出产品细节
  • 建议:使用手动微调功能,确保边缘完美

社交媒体头像

  • 适合工具:0v0 AI、HTML Zone
  • 需求:快速处理,适合头像尺寸
  • 建议:选择自动模式,节省时间

设计素材准备

  • 适合工具:Pickwant、高定抠图
  • 需求:高质量透明背景素材
  • 建议:使用分层输出功能,便于后期编辑

证件照处理

  • 适合工具:高定抠图、Pickwant
  • 需求:人物完整,背景纯净
  • 建议:特别注意头发和边缘处理

注意事项

隐私保护

  • 上传图片前确认工具的隐私政策
  • 避免上传敏感或私人照片
  • 处理完成后及时下载,避免数据泄露

使用限制

  • 免费版通常有图片大小或次数限制
  • 某些工具可能要求注册或订阅才能使用高级功能
  • 注意查看工具的使用条款,了解商用授权

效果优化

  • 抠图效果取决于原始图片质量
  • 复杂场景可能需要手动调整
  • 建议保存源文件,便于后期修改

扩展功能

批量处理

部分工具支持批量上传多张图片同时处理,大大提高工作效率:

  • Pickwant(付费功能)
  • 0v0 AI(免费支持)
  • 高定抠图(免费版有限制)

格式支持

  • 输入格式:JPG、PNG、WebP、GIF 等
  • 输出格式:PNG(透明背景)、JPG(纯色背景)
  • 分辨率支持:大多数工具支持 up to 4000px

高级功能

  • 边缘细化:手动修复复杂边缘
  • 背景替换:自动替换背景为纯色或图片
  • 批量导出:不同格式和质量选项选择

推荐选择

初学者推荐

HTML Zone Background Remover - 界面简洁,操作简单,适合新手快速上手

免费用户推荐

0v0 AI BG Remover - 完全免费,效果优秀,性价比最高

专业用户推荐

Pickwant - AI 算法精准,功能全面,适合专业设计和商业用途

国内用户推荐

高定抠图 - 中文界面优化,本土化服务,响应速度快

总结

在线抠图工具已经达到了相当高的技术水平,AI 算法的应用让普通人也能轻松完成专业级的抠图工作。根据具体需求选择合适的工具,可以大大提高工作效率和图片质量。建议多尝试几款工具,找到最适合自己使用习惯的解决方案。