SFTPGo 安装篇: 使用 SFTPGo 以便将 S3 协议转成 SFTP 协议提供服务

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日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!