diff --git a/src/metric/ftp/Dockerfile b/src/metric/ftp/Dockerfile new file mode 100644 index 0000000..6b79188 --- /dev/null +++ b/src/metric/ftp/Dockerfile @@ -0,0 +1,72 @@ +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 + +USER root + +EXPOSE 21 20 21100-21110 + +ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf", "-n"] diff --git a/src/metric/ftp/README.md b/src/metric/ftp/README.md new file mode 100644 index 0000000..f0cf696 --- /dev/null +++ b/src/metric/ftp/README.md @@ -0,0 +1,169 @@ +# 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 + +# 远程测试连接 +ftp 服务器IP + +# 使用命令行工具测试(直接访问share目录) +curl ftp://ftpuser:ZGClab1234!@服务器IP/ + +# 测试被动模式 +lftp ftp://ftpuser:ZGClab1234!@服务器IP/ + +# 访问特定文件 +curl ftp://ftpuser:ZGClab1234!@服务器IP/文件名 + +curl -fsS 'ftp://ftpuser:ZGClab1234!@172.17.0.2/1' + +curl -fsS 'ftp://ftpuser:ZGClab1234!@172.17.0.2/1.txt' -o 1.txt +``` \ No newline at end of file diff --git a/src/metric/ftp/start-ftp-supervised.sh b/src/metric/ftp/start-ftp-supervised.sh new file mode 100644 index 0000000..fb0a213 --- /dev/null +++ b/src/metric/ftp/start-ftp-supervised.sh @@ -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 diff --git a/src/metric/ftp/supervisord.conf b/src/metric/ftp/supervisord.conf new file mode 100644 index 0000000..29c4b32 --- /dev/null +++ b/src/metric/ftp/supervisord.conf @@ -0,0 +1,27 @@ +[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 + +[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 diff --git a/src/metric/ftp/vsftpd.conf b/src/metric/ftp/vsftpd.conf new file mode 100644 index 0000000..8403b85 --- /dev/null +++ b/src/metric/ftp/vsftpd.conf @@ -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