SFTPGo:随时随地传输文件——功能齐全、高度可配置的 SFTP 服务器,配备 HTTP/S Web UI 以及可选的 FTP/S 和 WebDAV 协议。存储后端:本地文件系统、加密本地文件系统、S3(兼容)、Google Cloud、Azure Blob 以及其他 SFTP 服务器。
序言
事情起因是因为当前使用的其中一个 CDN 的日志需要发送到第三方存储,虽然其有多种发送方式(多种接收源)可供选择,但是此时我较为熟悉且方便的就只有 S3 、 FTP 、 SFTP 等这三种。 FTP是明文传输的,至于 S3 暂时还没能吃透直接传输到 S3 的配置方法,为此只有先选择 SFTP 的方式了。
虽然创建一个新用户走一下 SSH 的 SFTP 是最简单的方法,但是这样难免不由得觉得过于简单的说,于是就决定找一找有什么 S3 转 SFTP 的软件,这不在一番搜索后找到了 SFTPGo 这个开源软件。
抽调出一台 VPS 用作本次安装部署 SFTPGo 的功能节点,因为预计对接第三方的对象存储作为存储后端,所以本次选用的机器硬盘资源无需太大,因此选择其中一台普通的廉价 VPS 足以。
安装部署
安装准备工作
1、通过 SSH 登陆到对应服务器
2、切换到工作目录,并创建文件夹
cd /opt mkdir sftpgo
3、在线下载 SFTPgo 软件包,离线机器可以在其他机器上下载后再上传到该机器
wget https://github.com/drakkan/sftpgo/releases/download/v2.6.6/sftpgo_v2.6.6_linux_x86_64.tar.xz
根据机器的相应架构下载当前最新的二进制软件包。
4、解压软件压缩包
tar xvJf sftpgo_v2.6.6_linux_x86_64.tar.xz -C sftpgo/
5、列出解压后的文件/文件夹(以供参考)
ls sftpgo bash_completion init LICENSE man NOTICE openapi README.txt sftpgo sftpgo.json sqlite static templates zsh_completion
创建用户
1、创建一个用户sftpgo
专用给 SFTPGo 使用
useradd -M -s /sbin/nologin sftpgo
2、修改 SFTPGo 的文件/文件夹所属用户
chown -R sftpgo:sftpgo /opt/sftpgo
配置 SFTPGo 配置文件
1、创建配置文件夹
mkdir -pv /etc/sftpgo
2、切换到配置文件夹目录
cd /etc/sftpgo/
3、复制配置文件
cp /opt/sftpgo/sftpgo.json ./
4、配置 SFTPGo 的数据库
如果需要使用其他数据库,可以在data_provider
节点进行相应的配置。由于我是自用的,就使用默认的driver
,这里只要复制默认数据库过来即可
cp /opt/sftpgo/sqlite/sftpgo.db ./
5、修改四处指向的静态文件
5.1、httpd
节点
"templates_path": "/opt/sftpgo/templates", "static_files_path": "/opt/sftpgo/static", "openapi_path": "/opt/sftpgo/openapi",
5.2、smtp
节点
"templates_path": "/opt/sftpgo/templates",
6、修改配置文件夹所属用户
chown -R sftpgo:sftpgo /etc/sftpgo/
配置成service服务
1、复制service文件
cp /opt/sftpgo/init/sftpgo.service /usr/lib/systemd/system/
2、添加sftpgo
运行命令到/usr/bin/
ln -s /opt/sftpgo/sftpgo /usr/bin
管理服务
1、配置文件有变,重载
systemctl daemon-reload
2、启动
systemctl start sftpgo
3、查看运行状态
systemctl status sftpgo
4、查看端口状态
netstat -antupl|grep sftpgo
5、查看进程
ps -aux | grep sftpgo
FQA
启动失败
一开始启动失败但是在systemctl status sftpgo
没输出有用的错误信息,尝试几次都无效后面才想起有对应的日志文件的。
一直败后我就手动执行过/usr/bin/sftpgo serve
这一启动命令,其直接输出一个文件不存在的错误(/templates/email/reset-password.html
),没有指出绝对路径当时我想着要不把整个文件夹复制到/etc/sftpgo
要不就是到/opt/sftpgo
再次执行,当时我选择了后者。发现可以执行成功但是无法访问那就是后话了。
手动执行命令可以执行就回到了service服务的问题中来,通过修改service文件配置日志路径Environment=SFTPGO_LOG_FILE_PATH=/etc/sftpgo/sftpgo.log
,由于反复调试太多已经忘记没配置前是否有日志文件输出到此处。后面通过输出的日志也是定位到/templates/email/reset-password.html
文件不存在的问题,我特意去查看了有对应的文件存在的,还把httpd
节点下三个都配着成绝对路径依旧是启动失败。后面在细看错误日志之下才定位到是smtp
节点的模板路径没有配置正确(之前没仔细看日志,日志其实是有之处错误所在的),配置好该节点的路径后就能正常启动 SFTPgo 了。
无法访问
启动后无法访问,查看端口都已经监听状态。这个更简单了,一开始我还往监听的IP地址处折腾,没想到就是防火墙没放行对应的端口。
放行端口即可
ufw allow 8443/tcp ufw allow 2022/tcp
WEB GUI 默认端口:8080
SFTP SERVER 默认端口:2022
启用HTTPS
其自带 ACME 客户端,通过配置可以自动申请SSL证书。但是对于我的需求来说,需要走一层 Cloudflare 的 CDN 来套一下,于是我就没有进行 ACME 的配置。事实也该如此,我没有配置 ACME 账户信息也不怪我单纯的将"enable_https": false,
改成"enable_https": true,
也无法走 HTTPS 协议。
眼看传输的数据涉及到账号、密码乃至 S3 的密钥,想了想还是配置全一点启用 HTTPS吧。
... "enable_https": true, "certificate_file": "/etc/sftpgo/ssl/ssl.pem", "certificate_key_file": "/etc/sftpgo/ssl/ssl.key", "min_tls_version": 12, ...
其中/etc/sftpgo/ssl/ssl.pem
、/etc/sftpgo/ssl/ssl.key
这两个文件是手动上传的证书与私钥文件。
ChiuYut
2025年07月24日