内网容器部署FTP日志监控服务
- 一、背景说明
- 二、准备工作
- 三、操作步骤
- 1、部署FTP服务
- 2、镜像和文件上传
- 3、部署容器环境
- 3.1 安装docker
- 3.2 安装docker-compose(可选择)
- 4、启动容器服务
- 四、结果展示
一、背景说明
随着AI使用的盛行,运维工作人员也可以使用它开发简单的应用服务,协助完成一些重复化的工作以提高效率。
笔者在公司工作耗时较长的一项任务是:给每台应用服务器,以服务为单位,给应用日志配置定时压缩并删除源文件、定时上传压缩日志到归档服务器的脚本。
生产环境有数百台虚拟机,每台虚拟机至少部署1个应用服务,如果长期把时间用在上面,是极其枯燥的。工作成果只能人工手动记录到excel表格,无法在工作汇报时直观展示实时数据。在和AI聊了很久后,完成了FTP上传日志的实时监控工具部署。
二、准备工作
1、本文的重点是从0到1部署容器服务,而不是编写代码或者FTP日志监控中的需求解析。
2、本文用到的py和html文件打包成镜像,在虚拟机运行容器服务。
3、FTP服务端,ftpuser作为ftp上传文件的用户,家目录是/Logdata,IP是192.168.0.100,主机名是ftp-server,操作系统版本是Red Hat Enterprise Linux release 8.10 (Ootpa)
4、FTP客户端,IP是192.168.0.101,主机名是ftp-client,操作系统版本是Red Hat Enterprise Linux release 8.10 (Ootpa)
三、操作步骤
1、部署FTP服务
创建FTP服务的用户并指定家目录
useradd-d/Logdata-s/sbin/nologin ftpusermkdir/Logdatachownftpuser:ftpuser /Logdata配置好yum源去安装vsftpd服务,请根据实际环境,无论是虚拟机挂载ISO镜像配置本地仓库(file:///) 还是其他某个虚拟机单独作为yum镜像仓库(http://)都可以。
yuminstallvsftpd-y编写配置文件
[root@ftp-server ~]# cat /etc/vsftpd/vsftpd.confanonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_file=/var/log/xferlogxferlog_std_format=YESchroot_local_user=YESchroot_list_enable=NOlisten=YESpam_service_name=vsftpduserlist_enable=NOallow_writeable_chroot=YES配置服务端访问白名单
[root@ftp-server ~]# cat /etc/vsftpd/user_listftpuser启动服务并设置开机自动启动
systemctl start vsftpd systemctlenablevsftpd systemctl status vsftpd以下状态表示服务启动正常
如果服务启动失败,可以检查shells文件,是否存在/sbin/nologin如果没有,则添加,并重启服务。
[root@ftp-server ~]# cat /etc/shells/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /usr/bin/tmux /bin/tmux /sbin/nologin最后记得修改ftpuser用户的密码,如果是测试环境,可以简单设置为123456如果是生产环境,请根据需求配置。
2、镜像和文件上传
新建日志监控服务目录,并将所有安装包和镜像上传于/opt/目录下。
cd/opt/文件如下
ftp-log-monitor-v1.0.tar.gz是镜像ftp-log-monitor-dir-v1.0.tar.gz是源码归档包,包含 Dockerfile、应用代码(app/)、依赖清单(requirements.txt)等所有构建所需的文件。
剩余3个是部署docker环境需要的安装包和配置文件
需要注意的是,ftp-log-monitor-dir-v1.0.tar.gz是笔者自己在构建镜像时准备的文件,在实际从0到1的容器服务部署时,这个文件可以忽略,我们已经拥有了镜像。
为了和其他容器服务区分开,我们把相关文件迁移到/opt/ftp-log-monitor/目录下。笔者的源码归档包直接解压,也是这个目录文件。
[root@ftp-server opt]# tar xf ftp-log-monitor-dir-v1.0.tar.gz[root@ftp-server opt]# ll -htotal 151M -rw-r--r--1root root 67M Oct262023docker-24.0.7.tgz -rw-r--r--1root root 31M Sep2410:37docker-compose-rw-r--r--1root root587Sep2410:05 docker-compose.yaml drwxr-xr-x4root root97Sep2317:33 ftp-log-monitor -rw-r--r--1root root 136K Sep2317:41 ftp-log-monitor-dir-v1.0.tar.gz -rw-r--r--1root root 53M Sep2317:41 ftp-log-monitor-v1.0.tar.gz[root@ftp-server opt]# cd ftp-log-monitor/[root@ftp-server ftp-log-monitor]# tree.├── app │ ├── database.py │ ├── exporter.py │ ├── exporter.py.bad │ ├── __init__.py │ ├── log_parser.py │ ├── main.py │ ├── new_detection.py │ ├── __pycache__ │ │ ├── database.cpython-311.pyc │ │ ├── exporter.cpython-311.pyc │ │ ├── __init__.cpython-311.pyc │ │ ├── log_parser.cpython-311.pyc │ │ ├── main.cpython-311.pyc │ │ ├── new_detection.cpython-311.pyc │ │ ├── script_generator.cpython-311.pyc │ │ ├── script_task_manager.cpython-311.pyc │ │ ├── statistics.cpython-311.pyc │ │ ├── storage.cpython-311.pyc │ │ └── users.cpython-311.pyc │ ├── script_generator.py │ ├── script_task_manager.py │ ├── statistics.py │ ├── storage.py │ ├── templates │ │ ├── cron_config.html │ │ ├── dashboard.html │ │ ├── index.html │ │ ├── login.html │ │ ├── script_generator.html │ │ ├── script_tasks_history.html │ │ ├── script_tasks.html │ │ ├── script_tasks_import.html │ │ ├── storage.html │ │ └── users.html │ └── users.py ├── data │ ├── monitor.db │ └── users.db ├── docker-compose.yml ├── Dockerfile └── requirements.txt理论上,我们在虚拟机上有了镜像和启动命令参数的yaml文件,就可以运行容器了。
3、部署容器环境
由于我们生产环境的日志归档服务器是一台虚拟机,并且也只部署1个FTP日志监控的容器服务,不需要K8S管理调度,只需要简单的docker就可以了。
3.1 安装docker
笔者的docker安装包是个人虚拟机离线下载的,直接执行命令即可。
wgethttps://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz解压安装
tarxzvf docker-24.0.7.tgzcpdocker/* /usr/bin/chmod+x /usr/bin/docker*启动 Docker 守护进程
dockerd&验证版本
[root@ftp-server opt]# docker --versionDocker version24.0.7, build afdd53b为便于启停docker,配置systemd服务
[root@ftp-server opt]# cat /etc/systemd/system/docker.service[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill-sHUP$MAINPIDLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s[Install]WantedBy=multi-user.target由于我们在安装docker时已经启动服务,此时再使用systemd启动时会报错,因此需要先杀掉对应的服务进程。
pkill-9dockerdpkill-9containerdpkill-9containerd-shim此时可以启动docker服务
# 让 systemd 重新加载配置,识别到新服务systemctl daemon-reload# 启动 Docker 服务systemctl startdocker# 设置开机自动启动systemctlenabledocker3.2 安装docker-compose(可选择)
实际上在docker安装完成后,我们就可以直接用docker命令,针对导入系统的镜像,启动容器服务了。但为了保存本地环境的启停参数,笔者使用yaml文件启动容器,为此需要额外部署docker-compose
如果不想安装docker-compose,直接使用docker命令启动容器,请先把镜像导入系统,再执行以下命令即可。
dockerrun-d\--nameftp-log-monitor\--restartunless-stopped\--log-opt max-size=10m\--log-opt max-file=3\-p5021:5000\-eUSER_DB=/app/data/users.db\-eMONITOR_DB=/app/data/monitor.db\-eXFERLOG_PATH=/var/log/xferlog\-eLOGDATA_ROOT=/Logdata\-eTZ=Asia/Shanghai\-v/opt/ftp-log-monitor/data:/app/data\-v/var/log/xferlog:/var/log/xferlog:ro\-v/Logdata:/Logdata:ro\ftp-log-monitor:v1.0同样的,先下载docker-compose的安装包
curl-L"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname-s)-$(uname-m)"-odocker-compose移动为可执行文件并授权
mv/opt/docker-compose /usr/local/bin/docker-composechmod+x /usr/local/bin/docker-compose验证版本
[root@ftp-server opt]# docker-compose --versionDocker Compose version v5.5.14、启动容器服务
首先导入镜像到系统
其次进入yaml文件所在目录,确保没有多余的yaml或者yml文件干扰,直接用docker-compose启动容器。
贴一下我的其他文件内容。
[root@ftp-server ftp-log-monitor]# cat docker-compose.yamlversion:'3.8'services: ftp-log-monitor: image: ftp-log-monitor:v1.0 container_name: ftp-log-monitor restart: unless-stopped ports: -"5021:5000"environment: -USER_DB=/app/data/users.db -MONITOR_DB=/app/data/monitor.db -XFERLOG_PATH=/var/log/xferlog -LOGDATA_ROOT=/Logdata -TZ=Asia/Shanghai volumes: - /opt/ftp-log-monitor/data:/app/data - /var/log/xferlog:/var/log/xferlog:ro - /Logdata:/Logdata:ro logging: driver:"json-file"options: max-size:"10m"max-file:"3"[root@ftp-server ftp-log-monitor]# cat DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt.RUN pipinstall--no-cache-dir-rrequirements.txt-ihttps://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com COPY app/ ./app/# 创建挂载点目录# /var/log - 挂载 xferlog 日志文件# /Logdata - 挂载实际日志存储目录# /app/data - 存放 users.db 和 monitor.db(持久化)RUNmkdir-p/var/log /Logdata /app/data&&\chmod755/var/log /Logdata /app/data EXPOSE5000CMD["python","-m","app.main"][root@ftp-server ftp-log-monitor]# cat requirements.txtFlask==2.3.2 flask-cors==4.0.0openpyxl==3.1.2xlwt==1.3.0检查容器正常启动。
[root@ftp-server ftp-log-monitor]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b331e18fe100 ftp-log-monitor:v1.0"python -m app.main"45seconds ago Up43seconds0.0.0.0:5021->5000/tcp, :::5021->5000/tcp ftp-log-monitor四、结果展示
浏览器访问http://192.168.0.100:5021/login
此处的账密是自己与AI沟通后确定的。
到此结束。