【Notes/经验】腾讯云SCF云函数搭建TCShare文件目录详细教程

2020/04/26更新

原作者因为一些原因暂时停止更新,现提供fork备份镜像:

  1. https://gitee.com/MoeWang/TCShare/
  2. https://github.com/ds19991999/TCShare

同时提醒,未升级到3.2.0的务必升级到3.2.0,因为修复了一个可能会造成越权查看的bug。

早就在酷安上看到了搭建的教程,是针对宝塔面板下安装的,然后 @shiro 的网盘搭建起来之后,我才想起网盘有这么一个玩法。不过暂时没啥需求需要文件直链,就是单纯玩玩,因此也不用担心不够用。

昨天闲得无聊看了看TCShare官方的教程,发现新版本支持了对腾讯云云函数的使用。不过他原来的教程实在是过于精简,整个SCF安装教程文档就五句话,让我这种小白很是捉摸不透。折腾了两三个小时,期间翻阅了无数论坛和blog,摸索着总算是在腾讯云云函数上跑了起来。请注意本文不会分享Key和Token,请自行想办法,但是本文会教你如何使用腾讯云云函数服务+网盘搭建一个漂亮的文件目录。

本教程理论上支持所有支持PHP7云函数的服务商,比如LeanCloud、阿里云、CloudRaft(云筏)、IBM云等,如有需要可以根据实际情况自由变通。

搭建好之后注意保护好根目录下的 .env 文件,最好使用腾讯云的自带变量设置而不是添加 .env 文件,以防被某些别有用心之人读取到你的网站设置。在文章教程中我会进行逐一进行教学。有些步骤可能略有繁琐,大神轻喷。

注:本文建议搭配 原作者的文档以及评论食用,配合本文腾讯云教程效果更佳。  https://xylog.cn/2020/03/03/tcshare.html(原作者的安装文档)

Demo演示:

  1.  Shiro的网盘
  2. 测试网盘[基于腾讯云SCF]

写给想搭建的但没有任何准备的

使用SCF最大的好处就是不必需要自己拥有专有的VPS/服务器/虚拟主机,而且因为没有自己的VPS参与进来,所以不用担心这个目录站被打,也不用担心土豆熟了(除非腾讯云云函数出问题,概率极小),自带腾讯云的全球CDN buff加成(未北岸只能用大陆以外节点,除非你愿意使用腾讯云分配的一串又臭又长的随机域名)。如果你的域名已经北岸,可以使用国内节点免费搭建;但是,如果你没有域名或者你的域名没有北岸,腾讯云依然会有提供速度不错的香港节点供你选择。

腾讯云的免费额度很给力,具体详情如下:

计费项 每月免费额度
资源使用量 40万GBs
调用次数 100万次

下表标明在配置为不同内存时,函数可免费运行的时长:

内存(MB) 免费时长(秒)
128 3,200,000
256 1,600,000
512 800,000
1024 400,000
1536 266,667
3072 133,333

数据来自: 云函数 免费额度 使用指南 - 腾讯云

提示:64MB足够此解析程序运行。从上图可看出,若选择128MB的套餐,每月可免费运行的额度为37天多点,都超出一个月了。。。唯一限制的的就是这个40万GBs;资源使用的话,若选择64MB,我算了一下,以我的访问流量来看,每天占用2.25G左右,自用够了。

搭建之前

域名问题
如果你没有一个域名,可以去试试申请免费域名,详情可以使用搜索引擎搜索"freenom 免费域名申请",不过需要注意的是,可能会申请不成功,有时候你申请成功了也不一定就稳了,freenom这个注册局也不是很厚道,在你网站有流量之后可能会被freenom以各种理由收回你的域名。这个需要留意。如果你愿意,而且准备长期搭建,最好购买一个首年仅1块的 top 域名。再不济你就是做着自己玩玩,那样的话你用腾讯分配的那串也行,默认还支持HTTPS。

腾讯云需要实名认证,而实名认证需要你支付0.01元的实名认证费用(可退)。

如果使用自己的域名,可以考虑申请一张SSL证书给这个网盘使用。具体自己百度。

如果你明白了,请带着一个域名(也可不用)和一个已经通过实名认证的腾讯云账号(这个必须)继续阅读:

下载发行版本并添加composer支持库

这里我提供我构建好的(基于3.1.1 Release):  本地下载

或者你也可以去GitHub下载最新的发布版本:github.com/xytoki/TCShare/releases

下载下来后解压,在解压后的程序主目录下新建".env"文件,按以下方式把文本粘贴进去,这里以189Cloud为例,OneDrive和和彩云等请使用Github页面作者提供的其他配置文件:

#   XS 是前缀
#   | -KEY 是配置种类,可选KEY,APP,SEC
#   | | - -ct是key的ID(类似config.php)
#   | | - | - something是配置名称
#   | | - | - | - - - - value在等号右边
#   XS_KEY_ct_something=value

    XS_KEY_ct=ctyun   #必填,值为ctyun
    XS_KEY_ct_FD=     #应用文件夹名,请自行获取
    XS_KEY_ct_AK=     #AK,请自行获取
    XS_KEY_ct_SK=     #SK,请自行获取

#   这里APP后面的可以是任意值,一般就123456下去
#          ↓
    XS_APP_1=/              #挂载路径
    XS_APP_1_NAME=Tencent-SCF   #网盘名称,注意不能有空格,否则会报错
    XS_APP_1_THEME=mdui     #界面主题
    XS_APP_1_BASE=/         #网盘内路径
    XS_APP_1_KEY=ct         #对应上面Key的ID
    scf_base=/              #腾讯云声明path初始位置,绑定自定义域名和路径必须要用到,否则会出现各种奇奇怪怪的问题,比如首页可进,但是点击文件/文件夹会404

添加完成后打包上传到你VPS上或者直接拖到VPS里(这里不一定非要宝塔+VPS,在本地应该也可,但我没试过)

GitHub上下载的Releases是不带composer的版本,按照官方教程的意思,在本地配置PHP和composer环境并添加到TCShare程序中来(为了更好的偷懒,我是在白嫖1812z的VPS上添加好的)。如果你和我一样,比较懒,也可以用我弄好的现成的。链接在上面。

如果你想自己动手,可以按照下面教程为TCShare添加composer支持库(只在宝塔+PHP7.2.2+CentOS7.3上测试成功了(7.0会提示不支持),不过估计你有Linux机器的话自己手动配置环境也能成)。宝塔安装PHP7.2.2并设为默认PHP命令行版本,注意取消禁止这两个函数(在软件管理>PHP 7.2>左侧设置>禁用函数>找到下面两个取消禁止):

Itab.webp

  1. php-zip
  2. proc_open
  3. putenv

如果你不是宝塔面板,请尝试以下命令:

CentOS:
yum install zip unzip php7.2-zip  #这里的PHP7.2按照实际情况修改,我用的是7.2

Ubuntu/Debian:
apt-get install zip unzip php7.2-zip #这里的PHP7.2按照实际情况修改,我用的是7.2

取消禁止之后,SSH连接到你的机器(单机的话打开console),将TCShare放到一个位置并解压(文件夹权限为避免出现问题,请设为0755),cd到你解压TCShare的位置,比如cd /www/tcshare/ ,待命令行前面中括号的路径变成/tcshare/(或者你设置的路径)之后,就可以继续了。若未安装或第一次使用composer,请执行:

CentOS:
yum update
yum -y install composer
Ubuntu/Debian:
apt-get update
apt-get install composer

若中途出现Y/N/C这种选项,一律y回车。
等出现Sucess字样的时候你就成功了。

I4yX.webp

如果完成上述步骤之后你什么也没做,现在应该还是保持切换在/www/tcshare/的目录下。输入composer install回车,为TCShare添加composer。等待出现Sucess之后,你可以添加一个网站,路径绑定为你的TCShare程序路径,并添加好伪静态,测试一下添加成功没有。注意网站运行时PHP运行环境要和命令行环境对应。
本地测试伪静态内容:

Nginx/Tengine等
try_files $uri $uri/ /index.php$is_args$args;
location ~ /\.env {
    deny all;
}

Apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<FilesMatch "^\.">
Order allow,deny
Deny from all
</FilesMatch>

打开浏览器,输入你的VPS网站地址,如果出现账号授权页面的话就说明你成功了。你可以现在点击绑定,也可以上传到云函数上再绑定。本地测试出现404不用慌,检查伪静态或检查目录是否按规定新建了.env文件,若没有出现绑定页面请检查你是否完全按照教程走的,导出时记得把宝塔生成的.user.ini删了,不删可能会出问题。实在不行多次失败还是使用我提供的吧。

如果你构建成功或者使用了我构建的版本,请继续(我构建的版本为Release 3.1.1,随缘更新,有能力最好还是自己搞):

将整个目录导出(使用我构建的跳过)。放到桌面备用。

新建云函数并部署文件

登录到你的腾讯云控制台,在产品目录搜索"SCF云函数",点进去,有个立即使用,初次使用需要微信小程序扫码绑定授权。我这里绑定过了,因此不再重复。

初次登陆你的云函数首页应该是这样的:

IkJc.webp

单击左侧菜单的"函数服务",如下图:

I55v.webp

初次使用请根据实际情况选择节点,如果你的网站没有北岸,建议使用中国香港节点。我这里北岸已完成,且根据我的地理位置,选择华北-北京作为我使用的节点。

I8AO.webp

地域选好之后,接下来新建函数。选择:模板函数,往下翻选择"PHP7 /HelloWorld空白模板函数",点击下一步。

IoKa.webp

在继续创建的页面往下翻,展开高级设置,将运行内存改为64MB,超时时间改为15或30秒,如下图所示。修改后点击完成以保存设置。

IEmo.webp

点击完成后腾讯云默认会跳转到云函数的配置属性页面。切换到"函数代码"选项卡,这时候会出现Cloud Studio Lite的编辑页面,点击提交方法呼出下拉菜单,选择文件夹,将本地构建好Composer的TCShare程序上传上去,注意上传的时候只上传TCShare目录下的文件,不要包含TCShare目录本身。此时代码目录应该是这个样子的:

Ix9I.webp

上传完成后,点击保存按钮。使其生效。

至此,我们已经基本完成了对SCF的部署工作。剩下的就是域名绑定和解析了。

为云函数绑定自己的域名

登录到你的云函数控制台,切换到"函数服务"选项卡,点击"触发方式",进入触发方式编辑。初次使用是没有任何触发方式的,需要你自己手动建立一个新的。只需要点击"新建触发方式"即可。

IvzT.webp

点击之后,在"添加触发方式"里将"触发方式"改为"API网关触发器",API服务名称随意,注意勾选最下方的"启用集成响应",如下图所示:

I0Uk.webp

点击保存生效。页面会自动刷新。你会发现你创建的API服务名已经出来了,这时候你就可以通过下方的"访问路径"来访问你的网盘文件试试啦,如果之前安装过会出现你的文件列表的话说明程序已经跑起来了。如果你不使用自定义域名,那么你到这一步已经可以算完成了,接下来要做的就是进行下一个章节——保护.env文件来防止别有用心的人恶意读到。要绑定域名的请继续:

点击"API服务名"后面的那串超链接,跳转到腾讯云的API 网关,将"公网域名"后面的字段复制下来,进入到你的域名解析服务商,提前添加解析。比如你要解析"pan"为前缀的话请添加一条前缀解析为pan,类型为CNAME的记录,内容为你要添加的公网域名。对于如何选择解析商等等不在本文讨论范围。

ICvQ.webp

切换到"自定义域名"选项卡,点击"新建",域名为你起的域名解析,如果你有HTTPS证书,可以去腾讯云SSL控制台添加证书,用文本编辑器打开申请的证书全选复制到腾讯云的证书内容里。fullchain.crt/fullchain.pem对应证书内容;private.key对应私钥内容,分别打开全选粘贴即可,然后回到API网关增加自定义域名这里刷新网页就可以选择HTTPS指定证书了。

使用纯HTTP或HTTPS已配置的,将下面的"默认路径映射"修改为"自定义路径映射",然后添加路径映射环境修改为发布,路径修改为"/"(不包含引号),最后点击提交按钮,如果你的设置无误,那么就会保存成功。

Ilas.webp

切换到"管理API"选项卡,在"通用API"下点击编辑按钮,进入编辑界面:

I2Jn.webp

待界面刷新后,将路径修改为"/",如图所示:

I98V.webp

然后下一步,进入后端配置,后端配置按图中配置即可,注意一定要勾选响应集成

IRA9.webp

完成后点击下一步,进入最终的响应结果,将返回类型修改为"HTML",其他选项保持默认即可。配置完成后点击完成。

IhPg.webp

修改完成后回到主界面,点击"发布"按钮将API开放到互联网,发布环境选择"发布",备注内容可以乱填。

Isnz.webp

这时候,你可以访问你的自定义域名试试了,如果成功显示文件列表,那就说明安装成功。若没有请检查步骤是否正确。请一定要进行下面的.env文件保护操作。

保护配置文件不被读取

虽然现在能用了,不过你的配置内容由于是文件形式,因此会公之于众,人人可访问。SCF云函数没有NGINX或APACHE那样自由,无法设置某类文件禁止读,因此需要对其进行保护,防止被别有用心之人访问到配置文件内容。不然别人拿走了你的TOKEN的话后果会很严重,相当于拿走了你网盘的管理权限。因此需要对其进行保护。SCF下的保护方法主要是使用变量,彻底杜绝.env文件。

下面将介绍腾讯云下的变量添加。

桌面新建一个文本文档,名称随意,目的是为了方便交换文本数据;

打开腾讯云SCF控制台,进入你的创建的函数配置页面,切换到"函数代码"选项卡,将左侧的".env"文件内的所有内容复制到你创建的文本文档去。注意两个文件之间多换几行以表区分。复制完成后,将SCF上的两个文件".env"文件删掉,".env.runtime"文件剪切"XS_KEY_ct_ACCESS_TOKEN"这一行到你的文本文档中,确保SCF上的".env.runtime"文件只保留了lastUpdateAt字段,然后点击保存,应用到SCF上。粘贴文本文档的时候注意两个文件之间多换几行以表区分。

I79C.webp

你的文本文档应该像这样:

IL3N.webp

这时候你会发现,文件目录废了,啥都不显示,直接报错。不过莫慌,继续切换到"函数配置"选项卡,点击"编辑"按钮,添加SCF变量。

ITb1.webp

运行角色选择SCF_QcsRole,超时时间酌情修改为15或30秒,环境变量按你文本文档里面那些不带#的文本,一一复制并粘贴,左侧对应key,右侧对应value,完成后点击保存,如图所示(这里对应的是天翼云,其他云盘请自行变通,道理相同):

Iqvx.webp

保存完成后,你会发现列表程序又能访问了,且/.env和/.env.runtime会直接报错404,你的隐私信息已经彻底隐藏。

个人搭建时遇到的问题和解决办法

Q:使用腾讯云分配的域名可以访问,但是部署到自定义域名就报错

A:检查API网关的自定义域名字段和应用请求字段是否相同,如果相同请检查scf_base变量是否存在,若无,则需要添加scf_base=/到变量中。具体参考上文保护的段落。

Q:部署之后本地测试不通过,提示404 Not Found

A:检查网站目录是否存在.env文件,若无则需要添加,安装测试通过后若要部署在SCF上,最好使用上文所介绍的设置变量而不是使用.env文件。若还是不行,请考虑删掉腾讯云的.env文件和.env.runtime文件,改为直接使用变量(详见上文的:"保护配置文件不被读取"段落),当全部不行的话请考虑更换release的版本。

其他问题暂未发现,欢迎留言探讨。

点赞
  1. 1812z说道:
    看了也不会系列 :huaji:
    1. MoeWang说道:
      看起来挺复杂,其实感觉海星,配置之后也就那样[doge],不用担心土豆熟了才是最香的 :huaji2: :huaji:
  2. ixuner说道:
    已成功,非常详细的教程,感谢大佬 :huaji:
    1. MoeWang说道:
      嗯,能帮到你最好啦 :huaji6:

发表评论

电子邮件地址不会被公开。必填项已用 * 标注