parent
586740a17a
commit
ab44edc22f
72
src/metric/ftp/Dockerfile
Normal file
72
src/metric/ftp/Dockerfile
Normal file
@ -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"]
|
169
src/metric/ftp/README.md
Normal file
169
src/metric/ftp/README.md
Normal file
@ -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
|
||||||
|
```
|
37
src/metric/ftp/start-ftp-supervised.sh
Normal file
37
src/metric/ftp/start-ftp-supervised.sh
Normal 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
|
27
src/metric/ftp/supervisord.conf
Normal file
27
src/metric/ftp/supervisord.conf
Normal file
@ -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
|
56
src/metric/ftp/vsftpd.conf
Normal file
56
src/metric/ftp/vsftpd.conf
Normal 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
|
Loading…
x
Reference in New Issue
Block a user