在云服务器上使用docker搭建ftp服务
碎碎念
打算搞个带热更新+联网(后面也许会加)的植物大战僵尸小游戏。一边学一边做,因为热更新需要一个FTP服务器来存放AB包,因此特地在云服务器上折腾了一下。特此记录。
网上很多教程都是直接在服务器上安装vsftpd,但是我总感觉这样很容易把系统搞得乱七八糟,所以还是用Docker来搞。
主要的实现目的就是,有一个带密码的账号,可以上传、修改、删除文件,用于管理员把AB包放到服务器上。然后匿名账号可以直接登录,仅有可读文件,也就是只能下载AB包,不能修改或者上传。
步骤
服务器
首先在linux云服务器上把端口20122-20140
都开一下,后面要用到。
创建容器
docker run -d -v /root/projects/vsftpd/pvz:/home/vsftpd \
-p 20120:20 -p 20121:21 -p 20122-20140:20122-20140 \
-e FTP_USER=pvz -e FTP_PASS=thePasswordOfPvz \
-e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=20122 -e PASV_MAX_PORT=20140 \
-e FILE_OPEN_MODE=0777 -e LOCAL_UMASK=022 \
--name vsftpd_pvz --restart=always fauria/vsftpd
数据卷,其中
/home/vsftpd
为容器中的用户目录,建立个数据卷以方便访问和保存这些数据。
端口,容器的20和21端口是用于访问的数据端口和控制端口,然后另外指定了
20122-20140
这18个端口用于被动连接的方式。然后分别映射到宿主机的20120-20140
正好20个端口。环境变量,根据实际情况最好更改一下。
PASV_ADDRESS:填写服务器的公网地址,使得被动模式的时候客户端能够按这个地址访问到服务器。
PASV_MIN_PORT、PASV_MAX_PORT:被动模式的端口范围。
FTP_USER、FTP_PASS:用户的账号密码。
FILE_OPEN_MODE、LOCAL_UMASK:设置文件的默认权限,也就是用户上传或者修改的文件默认是755。
访问
可以现在服务器的/root/projects/vsftpd/pvz/data/pvz
中随便创建一个文件(因为用户名称也是pvz,所以是在data里面又自动创建了一个pvz目录)。
然后在电脑的文件管理器(File Explorer)中输入ftp://lxblxb.top:20121/
,根据提示输入用户密码后即可访问(lxblxb.top这个域名映射到了我的服务器公网ip,这里直接写ip也可以)。
然后就可以看到刚才创建的文件了。(按道理在浏览器输入也可以访问,但是不知道为什么我试了不可以)除此之外还可以用WinScp之类的软件访问。
创建匿名用户用于访问
进入容器的/etc/vsftpd/vsftpd.conf
配置文件,修改为如下的配置。
# 启用匿名用户
anonymous_enable=YES
# 设置匿名用户根目录
anon_root=/home/vsftpd/pvz
# 禁止匿名用户上传、创建目录和其他写操作
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
然后保存退出,重启一下容器即可。
如果不设置anon_root
的话,默认是在/var/ftp/pub
,但是这个路径和pvz的不一样,所以修改为同一个路径。这样之后,使用pvz的账号密码登录进去就可以上传文件,而匿名用户登录进去则仅可读。
然后其实现在还有一个问题,目前pvz这个目录的权限是755,有写权限。但是匿名用户不能访问带写权限的目录,所以只能改为555匿名用户才能访问,但是这样pvz用户就不能写入了。所以解决办法是在pvz中再创建一个目录upload,这个upload给写权限,往里面写就可以了,匿名用户则仍然只是可读的。
# 所以在容器中,实际存放文件的目录是upload
/home/vsftpd/pvz/upload/
参考
FTP 基础 与 使用 Docker 搭建 Vsftpd 的 FTP 服务
以及GPT4