使用NextCloud和COS搭建个人网盘

之前在美国的VPS主机上使用SeaFile搭建过一个网盘,但是用的很少。 在腾讯买了主机之后,正好利用COS一起可以在搭建一个网盘。在网上看了下,NextCloud用的人比较多,所以准备试一下。 官网: https://nextcloud.com/

 

 

一 NextCloud 安装

 

官网上有好几种安装方式,使用Docker或者是Snap安装是最方便的,直接集成好了需要的环境。我还是采用手动安装的方式,这样整个过程是可控的。

 

 

1.环境准备

 

我的主机是Ubuntu16.04的系统,使用NextCloud 需要HTTP服务器、PHP和数据库。 这些我之前已经装好了,如果没有安装请先安装。下面是我服务器上安装的版本,如果版本不同,可能会有一些差别,特别是php版本。

  • nginx:1.10.3
  • php: v7.0.30
  • MySQL:5.7.23

所以在安装nextcloud之前,请保证nginx、php7和MySQL能正常使用。

 

安装PHP插件

nextcloud需要安装一些php插件才能正常工作,下面是我安装时需要用到的。 其中mysql是我之前安装wordpress已经安装了。后续安装过程中如果还提示缺少插件,可以在安装。可以参考:Installation on Linux

sudo apt install php7.0-curl php7.0-gd php7.0-zip php7.0-mbstring php7.0-mysql

 

创建MySQL数据库和用户

nextcloud需要使用到数据库,所以我们可以创建一个数据库和用户。命令行登入到MySQL之后,执行下面命令来创建数据库和用户。

mysql> create database nextcloud; 

mysql> create user 'nextcloud'@'%' identified by '你用户的密码';

mysql> grant all privileges on nextcloud.* to 'nextcloud'@'%';

mysql> flush privileges;

创建网盘数据家目录

指定一个目录存放网盘的数据,建议不要放在www目录下,我这里选择把数据放在了/data/nextcloud目录下, 要把目录的owner修改为www-data

sudo mkdir nextcloud

sudo chown -R www-data:www-data nextcloud/

 

 

 

2.安装NextCloud

 

首先从官网下载最新的安装包

wget https://download.nextcloud.com/server/releases/nextcloud-13.0.6.zip

然后解压到web目录下

/var/www/nextcloud/

给文件夹设置用户和权限

sudo chown -R www-data:www-data nextcloud

sodu chmod 755 nextcloud

配置nginx访问, 编辑/etc/nginx/sites-available/ 下面的文件,默认是default, 也可以是自己指定的文件。 可以参考官网的配置: Nginx configuration

官网给出的是HTTPS的配置,这需要有自己的SSL证书,如果有域名的话,腾讯是可以免费申请DV证书的。同时配置好DNS对二级域名的解析。我们装的是php7-fpm,官网给出的是php5-fpm的,所有需要进行修改。

首先删除下面设置

upstream php-handler {
    server 127.0.0.1:9000;
    #server unix:/var/run/php5-fpm.sock;
}

然后注释掉红色的部分,

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*);
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME document_rootfastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        #fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }


最后添加下面配置


include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;

如果使用HTTP访问,请注释掉上面蓝色的设置,如果使用HTTPS访问,要指定自己证书的路径。完成上面配置就可以从浏览器通过域名或IP进行访问了。如果页面无法打开,请检查nginx配置。保证nginx和php正常工作。如果提示缺少php组件,请用apt命令安装。

如果没有问题就会出现配置页面

主要设置一下管理员的用户名密码、然后指定前面设置的存储目录/data/nextcloud、最后填入前面创建的数据库的名字和用户密码,端口号MySQL是3306。然后点击安装完成

 

 

 

3.配置

 

 

安装完成后,登陆之后界面是这个样子。

 

点击右上角头像–设置,可以设置个人信息。 点击管理–基本设置,可以看到有一些优化提示。

 

HTTPS

如果你的站点不是https,他会有一个提示,我这里已经配置成了HTTPS,所以没有提示。可以按前面nginx设置进行配置。如果使用HTTPS,可能会提示你:The “Strict-Transport-Security” HTTP header is not configured。这个是要设置HSTS。 一般配置了HTTPS之后,我们会配置一个重定向,当HTTP请求转到HTTPS上。

server {
        listen 80;
        listen [::]:80;

        server_name  cloud.nextcloud.com;

        #rewrite http to https
        rewrite ^(.*) https://host1 permanent;
}

但是中间人攻击者可能会攻击拦截初始的http请求,从而控制用户后续的回话。所以HSTS应运而生为了解决这一潜在的安全问题。即时用户输入域名或http连接,浏览器将严格的升级到https连接。所以在nginx中增加配置, 在nextcloud的server下增加

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

 

使用 getenv(\”PATH\”) 测试时仅返回空结果

修改/etc/php/7.0/fpm/pool.d目录下的www.conf, 把下面env前面的注释去掉,然后重启一下php和nginx

; Pass environment variables like LD_LIBRARY_PATH. All VARIABLEs are taken from
; the current environment.
; Default Value: clean env
env[HOSTNAME] =HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

 

OPcache设置

可以安装上面给的进行设置,如果设置的不一样,也会有提示,这个按实际服务器性能来进行设置。 可以参考php官方文档查看每个字段的意义: http://php.net/manual/zh/opcache.configuration.php#ini.opcache.enable

 

NextCloud支持插件,可以在线编辑office文档,浏览PDF等等。 更多的性能优化和服务器设置可以参考官方文档: Server configuration

 

 

 

二 使用腾讯COS作为存储

 

 

完成NextCloud安装之后,所有的文件都存在在了服务器的硬盘上。

cc-cvm:/data/nextcloud$ ls -l
total 12
drwxr-xr-x 10 www-data www-data 4096 Sep  3 21:35 appdata_ochto0ogaykq
drwxr-xr-x  4 www-data www-data 4096 Sep  3 21:31 chengchao
drwxr-xr-x  2 www-data www-data 4096 Sep  3 21:32 files_external
-rw-r--r--  1 www-data www-data    0 Sep  3 21:30 index.html
-rw-r--r--  1 www-data www-data    0 Sep  3 21:29 nextcloud.log

每个用户有自己的目录,进到目录下可以看到和服务器上目录结构完全一样。(注意nextCloud会把目录权限修改为770, 这样是无法进入的,自己可以修改成775。但是会被改回去)

cc-cvm:/data/nextcloud/chengchao/files$ tree
.
├── Documents
│   ├── About.odt
│   └── About.txt
├── Nextcloud Manual.pdf
├── Nextcloud.mp4
├── Photos
│   ├── Coast.jpg
│   ├── Hummingbird.jpg
│   └── Nut.jpg
└── ShadowsocksX-2.6.3.dmg

2 directories, 8 files

云服务器的硬盘空间是有限的,拿来做云盘,数据大的话话空就就比较紧张了。正常腾讯有50G的免费的COS对象存储空间, 所以我们可以用COS来作为云盘的存储。

 

 

1. COS

 

对象存储(Cloud Object Storage,简称:COS)是腾讯云提供的面向非结构化数据,支持 HTTP/HTTPS 协议访问的分布式存储服务,它能容纳海量数据并保证用户对带宽和容量扩充无感知,可以作为大数据计算与分析的数据池。腾讯云 COS 提供网页端管理界面、多种语言的 SDK 以及命令行和图形化工具,并且完全兼容 S3 的 API 接口,方便用户直接使用社区工具和插件,COS 还可以和其他云产品结合,比如利用 CDN 的全球节点提供加速服务,利用数据万象的图片处理能力提供一站式图片解决方案等。

对于分布式存储主要有块存储、文件存储和对象存储。对象存储是无层次结构的数据存储方法,通常用于云中。不同于其他数据存储 方法,基于对象的存储不使用目录树。各个单独的数据(对象)单元存在于存储池中的同一级别。每个对象都有唯一的识别名称,供应用进行检索。此外,每个对象可包含有助于检索的元数据。目前阿里、腾讯、七牛以及亚马逊都在使用。更多信息:块存储、文件存储、对象存储这三者的本质差别是什么?

 

在中国大陆地区,使用 COS 标准存储的用户,每月可享受一定量的免费存储空间、免费流量、和免费请求。计费时,优先抵扣免费额度,超出部分再进行后付费结算。

资源类型 资源子类型 每月免费额度
存储空间 存储空间 50 GB
流量 外网下行流量 10 GB
流量 腾讯云 CDN 回源流量 10 GB
请求 读请求 100 万次
请求 写请求 100 万次

 

使用腾讯云服务器访问对象存储使用的是内网,所以不需要消耗流量, 而且200W次的读写请求正常也用不完,所以我们可以把COS作为nextcloud的后端存储。而COS本身还可以通过API接口进行访问,所以我们使用COS来作为网盘,不到那可以通过nextcloud进行数据存储,也可以直接使用API进行访问,非常的方便。COS相关文档可以查看:https://cloud.tencent.com/document/product/436

 

 

2. 创建存储桶

 

 

在使用对象存储前有一些基本概念需要了解,

存储桶

存储桶即 Bucket ,在 COS 中用于存储对象。一个存储桶中可以存储多个对象。存储桶名由用户自定义的字符串和系统自动生成的数字串用中划线链接而成,以保证该存储桶全球唯一。更多详细信息,请参阅 存储桶管理

对象

对象即 Object,COS 中存储的基本单元。更多详细信息,请参阅 对象管理

 

第一步创建存储桶,可以在云服务后台进行操作。给存储桶起一个名字,然后所属地最好选和云服务器一个地区。

创建完成之后我们就可以象操作网盘一样操作了。查看文件详情还能获取了解和修改文件元数据。 另外可以通过API来操作文件。

具体可以参考:https://cloud.tencent.com/document/product/436/6232

 

 

3. 安装COSFS工具

 

 

到目前为止存储也建好了,现在就需要和nextcloud关联起来。 COS提供了一个COSFS 工具,可以把存储桶挂载到服务器本地,像使用本地文件系统一样直接操作腾讯云对象存储。这样我们可以方便的把nextcloud数据存放在对象存储上了。 详细步骤可以参考:https://cloud.tencent.com/document/product/436/6883

 

下面是一些相关的概念,有兴趣可以多了解一些。

COSFS

cosfs 基于s3fs 构建,具有s3fs 的全部功能。主要功能包括:

  • 支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限,uid/gid
  • 通过COS 的multipart 功能上传大文件。
  • MD5 校验保证数据完整性。

S3FS

S3FS是google开发的一款支持将对象存储中的bucket以文件形式导出的文件系统接口,兼容POSIX语义。S3fs是基于FUSE开发文件系统,允许Linux和Mac Os X挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式

FUSE

用户空间文件系统(Filesystem in Userspace,简称FUSE)是一个面向类Unix计算机操作系统的软件接口,它使无特权的用户能够无需编辑内核代码而创建自己的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如ZFS、glusterfs和lustre使用FUSE实现

 

COSFS工具可以通过源码编译的方式安装,也可以直接使用已有的安装包。我是Ubuntu16.04,正好提供了安装包。不过我还是先安装了一下编译需要的软件

sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config fuse

下载对应的COSFS安装包和安装工具

sudo apt update; 
sudo apt install gdebi-core
wget https://github.com/tencentyun/cosfs/releases/download/v1.0.6/cosfs_1.0.6-ubuntu16.04_amd64.deb

使用gdebi进行安装

$ sudo gdebi cosfs_1.0.6-ubuntu16.04_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading state information... Done

cosfs-v5.1.0.6
Do you want to install the software package? [y/N]:y
Selecting previously unselected package cosfs.
(Reading database ... 140617 files and directories currently installed.)
Preparing to unpack cosfs_1.0.6-ubuntu16.04_amd64.deb ...
Unpacking cosfs (1.0.6-ubuntu16.04) ...
Setting up cosfs (1.0.6-ubuntu16.04) ...

 

 

4. 挂载COS

 

 

成功安装COSFS之后就可以挂载前面创建的存储桶了。但是需要提供API Key和API Secret才能访问。 这个可以从 https://console.cloud.tencent.com/cam/capi  获取到自己的API密钥。然后创建一个配置文件 /etc/passwd-cosfs,在文件中写入前面创建的存储桶的名字和获取的API密钥信息。使用冒号分割,样子如下:

bucketprefix-123456789:AKID8ILGzYjHMG8zhGtnlX7Vi4KOGxRqg1aa:LWVJqIagbFm8IG4sNlrkeSn5DLI3dCYi

然后给文件设置一个权限640

sudo chmod 640 /etc/passwd-cosfs

然后就可以执行挂载了,命令格式

cosfs your-bucketname your-mount-point -ourl=cos-domain-name -odbglevel=info

其中:

  • your-bucketname 需要替换为用户真实的信息;
  • your-mount-point 替换为本地需要挂载的目录(如 /mnt);
  • cos-domain-name 为存储桶对应的访问域名,形式为 http://cos.<Region>.myqcloud.com (适用于XML API),这个可以从对象存储桶的配置信息中获取到。
  • -odbglevel 参数表示信息级别,可选 info、dbg,建议参照示例设置为“info”。

 

上面是官方提供的挂载方式,但是这样十有八九挂载不成功。这里要注意权限和目录为空的的问题。执行cosfs必须加上sudo,否则会报错“Could not determine how to establish security credentials.”  按上面方式挂载到/data/test目录:

chengchao@cc-cvm:/data$ sudo cosfs cc-nextcloud-xxxxxx /data/test -ourl=cc-img-xxxxxx.cos.ap-shanghai.myqcloud.com -odbglevel=info
cosfs: MOUNTPOINT directory /data/test is not empty. if you are sure this is safe, can use the 'nonempty' mount option.

结果报错,提示目录不为空。如果一定要挂载需要加上-ononempty参数。但是要注意文件夹中已经有的文件不能和对象存储中的有相同路径,否则会冲突。所以建议最好在空目录挂载。加上参数后挂载没有报错,但是发现test目录没有用户和权限,所以无法访问。尝试使用chmod和chown命令,但是会报错:Input/output error

chengchao@cc-cvm:/data$ ls -l
ls: cannot access 'test': Permission denied
total 8
drwxrwx--- 5 www-data www-data 4096 Sep  3 21:32 nextcloud
drwxr-x--- 5 root     root     4096 Sep  4 16:16 nextcloud2
d????????? ? ?        ?           ?            ? test

文档上说默认挂载的人有权限,但是实际上是都没有权限,所以在挂载是还要加入 -oallow_other ,允许其他用户访问挂载文件夹。

chengchao@cc-cvm:/datals -l
total 9
drwxrwx--- 5 www-data www-data 4096 Sep  3 21:32 nextcloud
drwxr-x--- 5 root     root     4096 Sep  4 16:16 nextcloud2
drwxrwxrwx 1 root     root        0 Jan  1  1970 test


chengchao@cc-cvm:/data df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            916M     0  916M   0% /dev
tmpfs           188M   22M  166M  12% /run
/dev/vda1        50G  6.4G   41G  14% /
tmpfs           937M   24K  937M   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           937M     0  937M   0% /sys/fs/cgroup
tmpfs           188M     0  188M   0% /run/user/1000
cosfs           256T     0  256T   0% /data/test

挂载完成后,test目录拥有者正确显示了,权限也是有了777的权限。 用df命令看一下,显示已经成功挂载了。看一下里面,已经显示了存储桶中的数据了。我们创建一个文件,存储桶中也可以正常显示了。

chengchao@cc-cvm:/data/testls -l
total 1
drwxrwxrwx 1 root root 0 Sep  4 15:45 ccc
chengchao@cc-cvm:/data/test tree
.
└── ccc
    └── test.txt

1 directory, 1 file

要卸载也非常简单

sudo umount /data/test

 

修改挂载目录的owner和权限

 

上面使用-oallow_other 让所有用户都有了访问权限,但是文档上没有说怎么修改用户和权限。既然是基于S3FS,那我就找了下S3FS相关资料,但是本身github上WIKI中options的也不全。后来还是在issue中找到了。这个和linux中使用mount命令挂载基本一样,uid和gid可以查看/etc/passwd获取。

-oumask=0001 -ouid=33 -ogid=33

更多的参数可以参考:http://manpages.ubuntu.com/manpages/xenial/man1/s3fs.1.html

 

 

5. 挂载NextCloud

 

 

之前我们把nextcloud目录设置为了/data/nextcloud,所以要把对象存储挂载在这个目录下,这个目录除了云盘文件还有一些其他主题配置文件。如果强制挂载上去,新产生的文件可能会和之前文件冲突。所以我先把目录复制一份,然后清空现有目录进行挂载。

chengchao@cc-cvm:/datasudo cosfs cc-nextcloud-xxxxxxxx /data/nextcloud -ourl=cc-img-1251097992.cos.ap-shanghai.myqcloud.com -odbglevel=info -ononempty -oallow_other -oumask=0007 -ouid=33 -ogid=33
chengchao@cc-cvm:/data
chengchao@cc-cvm:/datachengchao@cc-cvm:/data ls -l
total 5
drwxrwx--- 1 www-data www-data    0 Jan  1  1970 nextcloud
drwxr-x--- 5 root     root     4096 Sep  5 00:45 nextcloud_bak
chengchao@cc-cvm:/data$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            916M     0  916M   0% /dev
tmpfs           188M   22M  166M  12% /run
/dev/vda1        50G  6.4G   41G  14% /
tmpfs           937M   24K  937M   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           937M     0  937M   0% /sys/fs/cgroup
tmpfs           188M     0  188M   0% /run/user/1000
cosfs           256T     0  256T   0% /data/nextcloud

这里我把用户和权限设置成和之前一样的,然后吧nextcloud_bak是数据全部拷贝回去。注意隐藏文件也要拷贝过去。然后打开网盘和云储存,搞定!

 

 

 

三 网盘速度

 

 

测试了一下网盘的上传下载速度, 家里电信宽带上行20M。下行300M。上传一个100M左右的文件,然后进行下载

  • NextCloud
    • 上传: 2m/s
    • 下载:120k/s
  • COS控制台
    • 上传:4m/s
    • 下载:目测大概12m/s

所以对象存储应该是没有限速,上限应该是宽带的速度。而nextcloud首先云服务的1M小水管,下载被严格的限速了。用这个小水管来下载大文件还是很头疼啊。用对象存储下载流量可能又不够。所以没有免费的午餐,怎么都得花钱。用COS搭建个网络相册还是不错,对贷款要求不高。 云盘的话还是考虑放到美帝的服务器上吧。起码百兆的大水管和3T流量。

 

 

 

四 相关问题

 

 

1. 从COS控制台上传或手动拷贝到数据文件在nextcloud是看不到

 

因为从网页或app上传的数据是会纪录到数据库的,不纪录到数据库就无法显示。nextcloud没有后台扫描,但是提供了一个occ的工具可以进行文件扫描。默认这个文件是不可以执行的,所以要给予一个权限。

cc-cvm:/var/www/nextcloud$ sudo chmod 744 occ

这个occ工具本身是一个php文件,php不懂,看起来应该是是用了console.php

chengchao@cc-cvm:/var/www/nextcloudcat occ
#!/usr/bin/env php
<?php
/**
 * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file.
 */

//argv = $_SERVER['argv'];
require_once __DIR__ . '/console.php';

occ可以做很多操作,扫描文件只是其中一项目

格式: files:scan [-p|--path="..."] [-q|--quiet] [-v|vv|vvv --verbose] [--all] [user_id1] ... [user_idN]
参数: user_id #扫描所指定的用户(一个或多个,多个用户ID之间要使用空格分开)的所有文件
选项: --path #限制扫描路径 --all #扫描所有已知用户的所有文件 --quiet #不输出统计信息 --verbose #在扫描过程中

这里指定以www-data用户执行occ命令, 扫描指定用户的文件,完成之后刷新网页就能看到手动放置或通过COS上传的文件了。 自己可以做一个定时任务来扫描。

sudo -u www-data php occ files:scan chengchao

Starting scan for user 1 out of 1 (chengchao)
+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 6       | 11    | 00:00:00     |
+---------+-------+--------------+

之前发现上传文件后页面没刷新列表,要手动刷新,现在看好像也好了。

 


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

2 评论

  1. 能不能出个详细点的教程,这个写的难度有点高了,小白看不太懂…..可赞助

  2. 如果能够实现直接输出腾讯云的下载地址,而不是走服务器,这个速度问题就很好解决了啊

周伟进行回复 取消回复

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