碎碎念

打算搞个带热更新+联网(后面也许会加)的植物大战僵尸小游戏。一边学一边做,因为热更新需要一个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 服务

DockerHub fauria/vsftpd

以及GPT4