dev_1.0.0_sundp 完成Metric模块及模块e2e测试 (#18)

Co-authored-by: sundapeng.sdp <sundapeng@hashdata.cn>
Reviewed-on: #18
Reviewed-by: xuxt <xuxt@zgclab.edu.cn>
Reviewed-by: yuyr <yuyr@zgclab.edu.cn>
Reviewed-by: huhy <husteryezi@163.com>
This commit was merged in pull request #18.
This commit is contained in:
2025-10-11 17:15:06 +08:00
parent 1e5e91b193
commit c098f1d3ce
65 changed files with 10172 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
FROM ubuntu:22.04
USER root
ARG USE_INTRANET=false
# 内网 apt 源配置
RUN if [ "$USE_INTRANET" = "true" ]; then \
echo "Configuring intranet apt sources..." && \
cp /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb [trusted=yes] http://10.68.64.1/ubuntu2204/ jammy main" > /etc/apt/sources.list && \
echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99disable-ssl-check && \
echo 'Acquire::https::Verify-Host "false";' >> /etc/apt/apt.conf.d/99disable-ssl-check; \
fi
# 安装常用工具和FTP服务
RUN apt-get update && \
apt-get install -y supervisor net-tools inetutils-ping vim vsftpd && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 如果是部署环境替换 apt 源
RUN if [ "$USE_INTRANET" = "true" ]; then \
echo "deb [trusted=yes] https://10.92.132.52/mirrors/ubuntu2204/ jammy main" > /etc/apt/sources.list; \
fi
# supervisor 日志目录
RUN mkdir -p /var/log/supervisor
# 设置 FTP 基础路径环境变量
ENV FTP_BASE_PATH=/private/argus/ftp
# 设置域名环境变量
ENV DOMAIN=prom.ftp.argus.com
# 设置FTP用户密码环境变量
ENV FTP_PASSWORD=ZGClab1234!
# 设置用户和组ID环境变量
ARG FTP_UID=2133
ARG FTP_GID=2015
ENV FTP_UID=${FTP_UID}
ENV FTP_GID=${FTP_GID}
# 创建FTP用户和目录结构
RUN groupadd -g ${FTP_GID} ftpuser && \
useradd -u ${FTP_UID} -g ${FTP_GID} -d ${FTP_BASE_PATH}/share -s /bin/bash ftpuser && \
mkdir -p ${FTP_BASE_PATH}/share \
&& mkdir -p /private/argus/etc \
&& mkdir -p /var/log/vsftpd \
&& mkdir -p /var/run/vsftpd/empty \
&& chown -R ftpuser:ftpuser ${FTP_BASE_PATH}
# 创建vsftpd配置目录和用户列表文件
RUN mkdir -p /etc/vsftpd && \
echo "ftpuser" > /etc/vsftpd.userlist
# supervisor 配置
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 启动脚本
COPY start-ftp-supervised.sh /usr/local/bin/start-ftp-supervised.sh
RUN chmod +x /usr/local/bin/start-ftp-supervised.sh
# vsftpd 配置文件
COPY vsftpd.conf /etc/vsftpd/vsftpd.conf
COPY dns-monitor.sh /usr/local/bin/dns-monitor.sh
RUN chmod +x /usr/local/bin/dns-monitor.sh
USER root
EXPOSE 21 20 21100-21110
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf", "-n"]

View File

@@ -0,0 +1,159 @@
# FTP 镜像配置
## 环境变量配置
### FTP_BASE_PATH
设置 FTP 数据的基础路径。
**默认值**: `/private/argus/ftp`
**用途**:
- 共享目录路径: `${FTP_BASE_PATH}/share` (用于版本发布)
- 配置文件存储路径: `/private/argus/etc/`
### DOMAIN
设置 FTP 服务的域名。
**默认值**: `ftp.metric.argus.com`
**用途**:
- 容器IP记录文件: `/private/argus/etc/${DOMAIN}`
### FTP_PASSWORD
设置 ftpuser 用户的密码。
**默认值**: `ZGClab1234!`
**用途**:
- ftpuser 用户的登录密码
## 使用示例
### 1. 使用默认配置
```bash
docker run -d \
--name ftp-server \
-p 21:21 \
-p 21100-21110:21100-21110 \
-v /host/ftp/data:/private/argus/ftp \
argus-metric-ftp:1.0.0
```
### 2. 自定义配置(运行时环境变量)
```bash
docker run -d \
--name ftp-server \
-p 21:21 \
-p 21100-21110:21100-21110 \
-e FTP_BASE_PATH=/custom/ftp/path \
-e DOMAIN=custom.ftp.domain.com \
-e FTP_PASSWORD=MySecurePassword123! \
-v /host/ftp/data:/custom/ftp/path \
argus-metric-ftp:1.0.0
```
## 目录结构
容器启动后会在 `${FTP_BASE_PATH}` 下创建以下目录结构:
```
${FTP_BASE_PATH}/
└── share/ # FTP根目录(直接挂载)
└── (用户上传的文件)
/private/argus/etc/
└── ${DOMAIN} # 容器IP记录文件
```
## vsftpd 配置说明
### 核心配置参数
根据README中的推荐配置,vsftpd.conf包含以下关键设置:
```bash
# 基本设置
local_enable=YES # 允许本地用户登录
write_enable=YES # 允许写操作(上传/删除/修改)
chroot_local_user=YES # 限制用户在自己目录中
allow_writeable_chroot=YES # 防止 chroot 错误(重要!)
# 被动模式配置
pasv_enable=YES # 启用被动模式
pasv_min_port=21100 # 被动模式最小端口
pasv_max_port=21110 # 被动模式最大端口
# 用户访问控制
userlist_enable=YES # 启用用户列表
userlist_file=/etc/vsftpd.userlist # 用户列表文件
userlist_deny=NO # 只允许列表中的用户登录
```
### 用户管理
#### 默认用户
- **用户名**: ftpuser
- **密码**: ZGClab1234! (可通过 FTP_PASSWORD 环境变量修改)
- **UID**: 2133 (与prometheus用户保持一致,可通过 FTP_UID 环境变量修改)
- **GID**: 2015 (与prometheus用户保持一致,可通过 FTP_GID 环境变量修改)
- **主目录**: ${FTP_BASE_PATH}/share (直接指向挂载目录)
- **Shell**: /bin/bash
- **用户列表**: 已添加到 `/etc/vsftpd.userlist`
#### 添加新用户
```bash
# 进入容器
docker exec -it ftp-server bash
# 添加新用户
useradd -d ${FTP_BASE_PATH}/share/newuser -s /bin/bash newuser
echo "newuser" >> /etc/vsftpd.userlist
passwd newuser
# 创建用户目录
mkdir -p ${FTP_BASE_PATH}/share/newuser
chown newuser:newuser ${FTP_BASE_PATH}/share/newuser
```
## 端口配置
- **21**: FTP 控制端口
- **20**: FTP 数据端口 (主动模式)
- **21100-21110**: 被动模式数据端口范围
### 日志文件位置
- **vsftpd 日志**: `/var/log/vsftpd/vsftpd.log`
- **supervisor 日志**: `/var/log/supervisor/`
- `supervisord.log`: supervisor 主日志
- `vsftpd.log`: vsftpd 标准输出
- `vsftpd_error.log`: vsftpd 错误输出
```bash
# 在宿主机上配置 logrotate
cat > /etc/logrotate.d/ftp-docker << EOF
/var/lib/docker/containers/*/ftp-server-*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
EOF
```
### FTP连接测试
```bash
# 本地测试连接
ftp localhost
curl -fsS 'ftp://ftpuser:ZGClab1234!@177.177.70.200/setup.sh' -o setup.sh
# root用户直接执行,非root用户需要使用sudo
chmod +x setup.sh
bash setup.sh --server {$域名} --user ftpuser --password 'ZGClab1234!'
```

View File

@@ -0,0 +1,68 @@
#!/bin/bash
# DNS监控脚本 - 每10秒检查dns.conf是否有变化
# 如果有变化则执行update-dns.sh脚本
DNS_CONF="/private/argus/etc/dns.conf"
DNS_BACKUP="/tmp/dns.conf.backup"
UPDATE_SCRIPT="/private/argus/etc/update-dns.sh"
LOG_FILE="/var/log/supervisor/dns-monitor.log"
# 确保日志文件存在
touch "$LOG_FILE"
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [DNS-Monitor] $1" >> "$LOG_FILE"
}
log_message "DNS监控脚本启动"
while true; do
if [ -f "$DNS_CONF" ]; then
if [ -f "$DNS_BACKUP" ]; then
# 比较文件内容
if ! cmp -s "$DNS_CONF" "$DNS_BACKUP"; then
log_message "检测到DNS配置变化"
# 更新备份文件
cp "$DNS_CONF" "$DNS_BACKUP"
# 执行更新脚本
if [ -x "$UPDATE_SCRIPT" ]; then
log_message "执行DNS更新脚本: $UPDATE_SCRIPT"
"$UPDATE_SCRIPT" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
log_message "DNS更新脚本执行成功"
else
log_message "DNS更新脚本执行失败"
fi
else
log_message "警告: 更新脚本不存在或不可执行: $UPDATE_SCRIPT"
fi
fi
else
# 第一次检测到配置文件,执行更新脚本
if [ -x "$UPDATE_SCRIPT" ]; then
log_message "执行DNS更新脚本: $UPDATE_SCRIPT"
"$UPDATE_SCRIPT" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
log_message "DNS更新脚本执行成功"
# 第一次运行,创建备份并执行更新
cp "$DNS_CONF" "$DNS_BACKUP"
log_message "创建DNS配置备份文件"
else
log_message "DNS更新脚本执行失败"
fi
else
log_message "警告: 更新脚本不存在或不可执行: $UPDATE_SCRIPT"
fi
fi
else
log_message "警告: DNS配置文件不存在: $DNS_CONF"
fi
sleep 10
done

View File

@@ -0,0 +1,37 @@
#!/bin/bash
set -euo pipefail
echo "[INFO] Starting FTP server under supervisor..."
FTP_BASE_PATH=${FTP_BASE_PATH:-/private/argus/ftp}
DOMAIN=${DOMAIN:-ftp.metric.argus.com}
FTP_PASSWORD=${FTP_PASSWORD:-ZGClab1234!}
echo "[INFO] FTP base path: ${FTP_BASE_PATH}"
echo "[INFO] Domain: ${DOMAIN}"
echo "[INFO] Setting ftpuser password..."
# 设置ftpuser密码
echo "ftpuser:${FTP_PASSWORD}" | chpasswd
# 确保目录存在
mkdir -p ${FTP_BASE_PATH}/share
mkdir -p /private/argus/etc
mkdir -p /var/run/vsftpd/empty
# 直接使用挂载目录作为FTP根目录,无需软链接
echo "[INFO] Using ${FTP_BASE_PATH}/share as FTP root directory"
# 生成vsftpd配置文件
echo "[INFO] Generating vsftpd.conf with base path: ${FTP_BASE_PATH}"
sed "s|\${FTP_BASE_PATH}|${FTP_BASE_PATH}|g" \
/etc/vsftpd/vsftpd.conf > /tmp/vsftpd.conf
# 记录容器 IP
IP=$(ifconfig eth0 | awk '/inet /{print $2}' || hostname -i)
echo "current IP: ${IP}"
echo "${IP}" > /private/argus/etc/${DOMAIN}
# 启动vsftpd
echo "[INFO] Starting vsftpd..."
exec /usr/sbin/vsftpd /tmp/vsftpd.conf

View File

@@ -0,0 +1,39 @@
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
user=root
[program:vsftpd]
command=/usr/local/bin/start-ftp-supervised.sh
user=root
stdout_logfile=/var/log/supervisor/vsftpd.log
stderr_logfile=/var/log/supervisor/vsftpd_error.log
autorestart=true
startretries=3
startsecs=10
stopwaitsecs=30
killasgroup=true
stopasgroup=true
[program:dns-monitor]
command=/usr/local/bin/dns-monitor.sh
user=root
stdout_logfile=/var/log/supervisor/dns-monitor.log
stderr_logfile=/var/log/supervisor/dns-monitor_error.log
autorestart=true
startretries=3
startsecs=5
stopwaitsecs=10
killasgroup=true
stopasgroup=true
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

View File

@@ -0,0 +1,111 @@
# vsftpd 配置
配置 vsftpd FTP 服务器。
# 安装deps下 vsftpd 的离线安装包
sudo dpkg -i vsftpd_3.0.5-0ubuntu1.1_amd64.deb
# 有依赖问题,修复依赖
sudo apt-get install -f
## 启动服务
sudo service vsftpd start
# 重启服务
sudo service vsftpd restart
# 查看状态
sudo service vsftpd status
## 备份配置文件
先备份默认配置,出问题能恢复:
```bash
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
```
## 修改配置文件
编辑配置:
```bash
sudo vim /etc/vsftpd.conf
```
### 基本配置参数
```bash
# 允许本地用户登录
local_enable=YES
# 允许写操作(上传/删除/修改)
write_enable=YES
# 限制用户在自己目录中,不能访问整个系统
chroot_local_user=YES
# 防止 chroot 错误(重要!)
allow_writeable_chroot=YES
# 被动模式配置
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
```
## 创建 FTP 目录和用户
### 创建共享目录
```bash
sudo mkdir -p /srv/ftp/share
sudo chmod 755 /srv/ftp/share
```
### 创建专用用户
```bash
sudo adduser ftpuser
# 修改用户主目录
sudo usermod -d /srv/ftp/share ftpuser
```
## 重启服务
```bash
sudo service vsftpd restart
```
## 防火墙配置
### 开放基本端口
```bash
sudo ufw allow 21/tcp
```
### 开放被动模式端口
```bash
sudo ufw allow 30000:31000/tcp
```
## 测试连接
```bash
# 本地测试
ftp localhost
# 远程测试
ftp 你的服务器IP
```
用户名:ftpuser
密码:设置的密码

View File

@@ -0,0 +1,49 @@
#!/bin/bash
# vsftpd 离线安装脚本
# 使用方法:./vsftpd-offline-install.sh
set -e
echo "开始 vsftpd 离线安装..."
# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
echo "请使用 root 权限运行此脚本"
exit 1
fi
# 定义离线包目录
OFFLINE_DIR="./vsftpd-offline"
DEB_DIR="$OFFLINE_DIR/debs"
# 检查离线包是否存在
if [ ! -d "$OFFLINE_DIR" ]; then
echo "错误:找不到离线包目录 $OFFLINE_DIR"
echo "请先准备离线包,方法:"
echo "1. 在有网络的机器上运行:"
echo " mkdir -p $DEB_DIR"
echo " cd $DEB_DIR"
echo " apt download vsftpd"
echo " apt download \$(apt-cache depends vsftpd | grep Depends | cut -d: -f2 | tr -d ' ')"
echo "2. 将整个 $OFFLINE_DIR 目录拷贝到目标机器"
exit 1
fi
# 安装 deb 包
echo "安装 vsftpd 及依赖包..."
cd "$DEB_DIR"
dpkg -i *.deb || apt-get install -f -y
# 检查安装状态
if systemctl is-active --quiet vsftpd; then
echo "vsftpd 安装成功并已启动"
else
echo "启动 vsftpd 服务..."
systemctl start vsftpd
systemctl enable vsftpd
fi
echo "vsftpd 离线安装完成!"
echo "配置文件位置: /etc/vsftpd.conf"
echo "服务状态: $(systemctl is-active vsftpd)"

View File

@@ -0,0 +1,56 @@
# vsftpd 配置文件
# 基本设置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
# 安全设置
chroot_local_user=YES
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
# 用户设置
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
# 目录设置
local_root=${FTP_BASE_PATH}/share
# 被动模式设置
pasv_enable=YES
pasv_min_port=21100
pasv_max_port=21110
pasv_address=0.0.0.0
# 日志设置
xferlog_file=/var/log/vsftpd/vsftpd.log
log_ftp_protocol=YES
# 其他设置
hide_ids=YES
tcp_wrappers=YES
# 文件上传设置
file_open_mode=0666
local_umask=022
# 超时设置
idle_session_timeout=300
data_connection_timeout=300
# 限制设置
max_clients=50
max_per_ip=5