安装nextcloud:搭建一个自己专属的个人网盘

2018-11-01


2019.4.8更新:
nextcloud功能全面,同时也代表这加载速度慢,其中只有少部分功能是我需要的,所以干脆放弃了nextcloud,转投nginx自带的fancyindex,轻量,快速,也没有多余的功能,了解更多可参考:nginx以fancyindex模块搭建轻量极简的网盘

nextcloud是一款开源私有云方案,GitHub开源地址:Nextcloud,也就是说,可以用nextcloud来搭建私有同步网盘。

之前就有搭建私有网盘的需求,毕竟国外网盘容量小,速度慢,国内目前也就只有115和百度云在苟延残喘,115已是半残,百度云限速不说,还会将小姐姐变成8秒教育片,先不论这种偷窥个人网盘隐私的行为是否违法,要知道百度云删除这些东西的时候可没有告知用户,更不用说任何的提醒和交流了,把资料,特别是涉及个人隐私的资料放在百度云实在是放心不下。

总的来看目前公有网盘大都不能满足需求,也就催生了一大批开源私有网盘,nextcloud就是其中之一。

搭建私有网盘,我一开始用的是seafile,毕竟开源,并且是国人开发,感觉本地化工作会做得更好,起码文档会更好读,而且企业版只要3个人以下使用就是免费的,可以说很良心了,当然了,缺点还是有的,就是界面太丑。

起初按照文档搭建seafile,两天时间反反复复看文档查教程也没成功,最后实在没耐心放弃了。

而后准备转战owncloud,不过在了解一番之后,发现有个owncloud的继承者:nextcloud,据说是owncloud的团队脱离出来后开发的一个网盘,不过nextcloud在很大程度上跟owncloud很像,甚至可以说就是owncloud了,不过按照很多人的说法,nextcloud似乎更良心(这是看了这么多对比文章之后给我的感觉),所以就直接用上nextcloud了。

事实上,搭建nextcloud更好的方式是通过docker搭建,不过之前的seafile搭建失败,很大一部分原因就是因为用了以前没接触过的docker,所以这次就直接搭建,等熟悉之后再用docker。

如果可以的话,还是推荐使用docker搭建。

安装lnmp环境

nextcloud存在网页前端,所以可以配置lnmp环境,以启用网页前端。

安装MariaDB

首先需要配置源,进入MariaDB官网定制MariaDB的官方源,选择合适MariaDB版本。如CentOS 7选择:CentOS > CentOS 7 (x86_64) > 10.3 [Stable],配置源的方法在官网页面选择源之后,页面下方会显示出来。

选择版本

之后将官网的配置复制下来,添加为源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 编辑源
vim /etc/yum.repos.d/MariaDB.repo

# 将复制来的配置填入
# MariaDB 10.2 CentOS repository list - created 2018-01-27 07:39 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# 安装MariaDB
yum install MariaDB-server -y

# 启动服务并设置开机启动
systemctl start mariadb
systemctl enable mariadb

之后是设置MariaDB
此步,主要是MariaDB的安全设置,第一次安装mysql需要运行此命令:

1
mysql_secure_installation

因为是初次设置MariaDB,root密码是空的,所以在要求输入密码时直接回车:

1
2
3
4
5
6
7
8
9
10
11
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

# 是否设置root密码,建议设置密码以提高安全性,输入y并回车
Set root password? [Y/n] y

# 设置密码
New password:

# 再次输入密码
Re-enter new password:

接下来是数据库相关设置,可以全都输入y,以下是截取的部分输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
...
Remove anonymous users? [Y/n] y # 删除匿名用户
...

Disallow root login remotely? [Y/n] y # 禁止root远程登录
...

Remove test database and access to it? [Y/n] y # 删除test数据库
...

Reload privilege tables now? [Y/n] y # 刷新权限
...
Thanks for using MariaDB!

安装Php-fpm以及相关组件

安装php用webtatic源,更新较快,且其命名有自己的特色方式,可以避免与其他源的某些冲突

1
2
3
4
5
6
7
8
9
10
11
# 配置PHP源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 安装PHP以及PHP扩展
yum install php71w-fpm -y
yum install php71w-gd php71w php71w-mysqlnd php71w-pdo php71w-mcrypt php71w-mbstring php71w-xmlrpc -y

# 启动服务并设置开机启动
systemctl start php-fpm
systemctl enable php-fpm

安装好后进行配置:

1
2
3
4
5
6
7
# 编辑配置文件
vim /etc/php.ini

# 找到
;cgi.fix_pathinfo=1
# 去掉注释,并将1改成0
cgi.fix_pathinfo=0

安装nginx

官方nginx有两个版本,mainline和stable,即开发版和稳定版,区别是前者引入新特性但可能有新bug,后者足够稳定。事实上,两者均比较稳定,nginx的网站总是运行在mainline版上,不过还是推荐新手选择稳定版。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 编辑repo文件
vim /etc/yum.repos.d/nginx.repo

# 写入如下内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# 安装nginx
yum install nginx -y

# 启动服务并设置开机启动
systemctl start nginx
systemctl enable nginx

这时lnmp环境就安装成功了。

安装Nginx之后存在一个默认配置,只要前面配置没有错误,那么nginx启动之后就可打开默认网页。

直接用浏览器打开主机IP地址或者域名,就可以看到nginx的欢迎页面,说明nginx已经在工作了。

假设IP地址为1.2.3.4,域名为ssrpanel.wenjinyu.me ,能用域名打开的前提是已经设置了解析,不知道怎么设置解析可以移步设置域名解析:给域名设置一些实用有趣的二级域名

nginx安装成功后的欢迎界面

此时lnmp环境就安装完成了。

安装nextcloud

nextcloud可以直接从官网下载,只需要进行简单的配置就可以直接使用。

下载nextcloud

现在(2018年10月22日)的最新版本是14.0.3,也可以从官网获取最新的版本:Nextcloud官网,然后替换掉后面的网址就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入临时文件夹,重启后文件会自动删除,所以相当于自动清理垃圾
cd /tmp

# 下载nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-14.0.3.zip

# 解压下载下来的压缩包
unzip nextcloud-14.0.3.zip

# 移动到网址根目录,个人习惯将跟网站有关的东西都放在/var/www,也可以改为自己想要放的地方
mv nextcloud /var/www/

# 赋予nginx读取nextcloud根目录的权限,nginx是web服务器,也就是打开网站的核心程序
chown -R nginx:nginx /var/www/nextcloud

配置nginx

先添加一个配置文件

1
vim /etc/nginx/conf.d/nextcloud.conf

然后添加下列内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
upstream php-handler {
server 127.0.0.1:9000;
#server unix:/var/run/php5-fpm.sock;
}


server {
listen 443 ssl;
server_name drive.wenjinyu.me; # 改为自己的域名

ssl_certificate /etc/letsencrypt/live/wenjinyu.me/fullchain.pem; # 改为ssl证书存放目录
ssl_certificate_key /etc/letsencrypt/live/wenjinyu.me/privkey.pem; # 改为ssl证书存放目录

# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
add_header Strict-Transport-Security "max-age=15768000;includeSubDomains; preload;";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;

# Path to the root of your installation
root /var/www/nextcloud/; # 如果不是按照本教程的目录存放nextcloud文件夹,就改为自己的文件夹

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
# last;

location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}

# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;

# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;

location / {
rewrite ^ /index.php$request_uri;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

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_root$fastcgi_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;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}

location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$request_uri;
# Optional: Don't log access to other assets
access_log off;
}
}

server
{

listen 80;
server_name drive.wenjinyu.me; # 改为自己的域名
return 301 https://server_name$request_uri;
}

注意要将其中的域名改成自己的域名,如果没有按照本教程的路径放置nextcloud文件夹,还需要修改网站根目录的路径,需要修改的地方已经在上面标出来了。

改完后重载nginx:

1
nginx -s reload

配置MySQL

nextcloud的数据需要使用MySQL数据库程序进行管理,所以需要在MySQL中先新建一个用户和数据库以供nextcloud使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入MySQL
mysql -u root -p

# 创建一个名为nextclud_db的数据库
CREATE DATABASE nextcloud_db;

# 创建一个名为nextcloud、密码也为nextcloud的用户
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud';

# 赋予用户nextcloud对数据库nextcloud_db的所有操作权限
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud'@'localhost';

# 刷新数据库权限
FLUSH PRIVILEGES;

# 退出
exit

配置nextcloud

现在就可以用浏览器打开nextcloud了:

登陆nextcloud.png


点击查看网站打不开的解决办法
如果网页打不开,那么有一个很简单的方法可以排查问题:

先分别运行下面三条命令,查看三个nextcloud所需要的组建的运行状态:

1
2
3
systemctl status nginx
systemctl status mysql
systemctl status php-fpm


如果在运行结果中都能看到绿色的active (running)字样,例如下面这个样子

nginx运行状态.png

那么说明这三个组件的是没问题的,错误的地方就可能是nginx的配置文件/etc/nginx/conf.d/nextcloud.conf,可以直接编辑:

1
vim /etc/nginx/conf.d/nextcloud.conf


然后跟上面的配置文件有何差别,一定要记住修改文中提示的部分,其他的都不要修改,修改完或者查看之后确定没问题,那么就运行下面命令将三个组件重启,因为也有可能是有些修改需要重启生效但是修改后忘了重启:

1
2
3
systemctl restart nginx
systemctl restart mysql
systemctl restart php-fpm


然后再确认一遍网址解析是否有误:如果直接用ip能访问,而网址不能,那么就是网址解析的问题了。

之后再打开网页看看,如果还不行可以在下面留言。

第一次登陆需要创建管理员账号,输完之后点击存储&数据库,接下来的配置可以参照下面的设置:

输入nextcloud配置信息.png

管理员密码任意设置,数据库密码如果是按照本教程的例子设置的,那么就是nextcloud,需要注意的是,配置数据库需要选择第二个MySQL/MariaDB,至于理由也在刚登陆时显示的性能警告中提到了。

如果配置没有什么问题就可以登陆了:

nextcloud登陆成功.png

登陆完可以看到页面上方有一个错误提示:

nextcloud错误提示.png

点开来是这样的:

nextcloud错误列表.png

每个人出现的错误提示都可能不同,部分我也遇到的问题可以参考这篇文章解决:nextcloud安全及设置警告中的一些设置错误提示的解决办法

如果你没有看到这样的错误提示,那么恭喜你可以少费很多工夫了。

使用

按照上面的教程安装完nextcloud之后就可以使用了,可以在官网下载对应的客户端:https://nextcloud.com/install/#install-clients

如果使用的是linux系统,那么可以直接安装:

1
sudo apt-get install nextcloud-desktop nautilus-nextcloud

其中:

以下以Windows客户端为例子。

安装nextcloud后打开,先输入服务器IP地址,如果设置了域名解析,那么可以直接输入网盘的域名。

域名解析设置可以参考这篇文章:设置域名解析:给域名设置一些实用有趣的二级域名

nextcloud登陆界面.png

输入服务器地址之后使用设置的用户密码登陆即可:

登陆nextcloud.png

登陆之后选择同步文件夹,这里需要注意,如果本地需要同步的文件并不是放在一起的,例如我有些文件常用到,就放在桌面,而有些重要但又不常用到的备份文件就放在D盘,这种时候就不要选择同步服务器的所有内容,而要选择下面的跳过文件夹设置,否则就只能同步一个文件夹,无法添加其他文件夹。

跳过文件夹设置.png

此时进入了nextcloud,点击账户名称下面的添加文件夹

添加同步文件夹.png

选择需要同步的文件夹,然后下一步,再新建一个存放在网盘上的同步文件夹,

新建同步文件夹.png

最后确认添加链接就可以开始同步了。

问题解决

如果每次打开nextcloud都需要登录,可以查看:解决linux下每次登录nextcloud都需要重新输入密码的问题

其他

初次使用配置稍微麻烦,上传文件的方式也不只有客户端,还可以直接通过把文件拖入网页版的形式进行上传,不过稳定性就比客户端差了,偶尔会遇到文件传输到一半就不动的情况。

nextcloud自诩为同步云盘,不过作为网盘来说绰绰有余,但是作为同步工具来说却显得鸡肋,因为手机客户端实在很渣,同步功能基本是半废,我也为此另外安装了syncthing这个轻量的同步工具用来同步文件,可参见:[syncthing搭建教程:拥有自己的文件同步服务器,在设备间快速同步文件]



评论