[TOC]

0x00 前言简述

描述:由于个人家里的NAS以及公司团队对私有网盘的进行日常工作文件同步以及协同办公的需求,所以有了这篇文章,讲解记录从选项到安装以及同步使用等相关操作;

最近这几年国内的网盘市场,如今只剩下百度网盘、腾讯网盘了,虽然国内还有一些稳定的网盘但是往往针对于企业对于个人来说不划算;同时在国外也有一些稳定的网盘,但是国内访问并不友好,如 OneDrive、DropBox、Google Drive 等;

此时私有云和 NAS 这种完全掌握在自己手中的云端存储方案就体现其优势了,下文主要介绍利用NextCloud快速搭建个人专属的私有云同步网盘;

私有云同步网盘的优势与不足:
1.优势

  • 私密,自己全权管理所有文件;
  • 稳定,不存在服务商关闭网盘服务的问题;
  • 高速,直链下载,不限速;
  • 功能丰富,可安装插件实现各种云端功能。

2.不足

  • 需要定期进行维护备份
  • 需要用硬件设备的支持
  • 对于VPS这种存储容量小的,不适合做仓库盘,建议NAS或者本地服务器中搭建;

不用您问我先来回答了,这么多网盘为何偏偏用NextCloud?
答:自建网盘方案选择Nextcloud 、 ownCloud 、Seafile,适合个人和企业使用,基础版免费都是成熟方案,主体功能上大同小异,且都支持在线查看/播放文件、插件扩展等功能。
下面一张谷歌趋势图可以看见当前开源网盘的热度情况;

WeiyiGeek.google趋势

WeiyiGeek.google趋势

NextCloud简述
描述:Nextcloud是一个开源、免费、专业的私有云存储项目,他可以帮您简单快速在个人,公司电脑、服务器甚至是树莓派等设备上架设一套属于自己或者团队专属的云同步网盘,所以它是一款开源网盘的绝佳解决方案;

版本说明:

  • Home 家庭版本 (免费试用即社区版本)
  • Enterprises 企业版本

特点:

  • Nextcloud跨平台支持微软 Windows、macOS 和 Linux 的客户端应用程序,以及适用于 Android 和 Apple iOS 操作系统的移动客户端下载地址
  • Nextcloud文件提供了一个内置的通用文件访问和同步平台,具有强大的协作分享功能和桌面、移动和web界面以及WebDAV形式访问。
  • Nextcloud群件集成了日历、联系人、邮件和其他生产力特性,帮助团队更快、更容易地按照您的条件完成工作。
  • Nextcloud Talk通过集成的屏幕共享和SIP集成,通过浏览器和移动接口提供现场、私人音频/视频会议和文本聊天(默认安装不带该插件)。
  • Nextcloud上的文件存储在一般的目录结构中,并可透过WebDAV访问。
  • Nextcloud可以透过OpenID或者LDAP来实现用户群组或组群间的读写权限调整,以达到分享文件的目的和利用第三方平台的OAuth2进行接入;
  • Nextcloud上用户可以使用基于浏览器文本编辑器、书签服务、缩放网址服务、相册以及RSS阅读器与文本查看器;
  • Nextcloud具有良好的扩展性,可以将文件轻松连线到DropBox、Google云端与Amazon S3中;

Tips:


0x01 安装实践

NextCloud安装所需组件php-fpm / mysql / nginx / nextcloud / APCu + Redis;

NextCloud安装方式大约有三种:


1.手动安装

环境准备:CentOS Linux release 7.7.1908 (Core):

Step1.自行关闭或放行防火墙和selinux规则

1
2
3
4
5
6
7
8
9
#主机名称设置与hosts绑定
hostnamectl set-hostname nextcloud
echo "127.0.0.1 nextcloud" >> /etc/hosts

#Selinux与防火墙设置
blanc="\033[1;37m"; gris="\033[0;37m"; magenta="\033[0;35m"; rouge="\033[1;31m"; vert="\033[1;32m"; jaune="\033[1;33m"; bleu="\033[1;34m"; rescolor="\033[0m"
echo -e "\n${jaune}SELinux disable and firewall settings ...${rescolor}" && sleep 1
sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config && setenforce 0
firewall-cmd --add-service=http --permanent && firewall-cmd --add-service=https --permanent && firewall-cmd --reload

Step2.安装wlnmp一键安装包源与EPEL源

1
2
3
4
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm 
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache fast

Step3.基础lnmp环境安装与php依赖安装

1
2
3
4
5
6
#此处以php7.4与mysql5.7.x版本安装
yum install unzip
yum install wphp74 wnginx wmysql57

#安装php依赖相关(安装redis及redis模块扩展,默认安装的redis密码为空,建议添加redis密码 )
yum install wphp74-fileinfo wphp74-imagick wphp74-apcu wphp74-redis wredis5

Step4.Nginx配置
建议使用https,我这里为了方便就直接使用http方式了(请在以下两个配置文件中任选其一),如果你想使用https,请自行申请证书和生成赫尔曼密钥。

  • http配置文件:(需替换server_name的地址)

    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
    cat > /usr/local/nginx/conf/vhost/demo.conf <<END
    server {
    #需要修改的地方
    listen 80;
    server_name 192.168.50.194;
    index index.html index.htm index.php;
    root html/nextcloud;

    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    fastcgi_hide_header X-Powered-By;

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

    location = /.well-known/carddav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location /.well-known/acme-challenge { }
    location / {
    rewrite ^ /index.php;
    }
    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\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
    fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
    set $path_info $fastcgi_path_info;
    try_files $fastcgi_script_name =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $path_info;
    #fastcgi_param HTTPS on;
    # Avoid sending the security headers twice
    fastcgi_param modHeadersAvailable true;
    # Enable pretty urls
    fastcgi_param front_controller_active true;
    fastcgi_pass unix:/tmp/php-fpm74.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
    }
    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
    try_files $uri/ =404;
    index index.php;
    }
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
    try_files $uri /index.php$request_uri;
    add_header Cache-Control "public, max-age=15778463";
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    access_log off;
    }
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
    try_files $uri /index.php$request_uri;
    access_log off;
    }

    access_log /data/logs/nginx/nextcloud_access.log;
    error_log /data/logs/nginx/nextcloud_error.log;
    }
    END
  • https配置文件:请删除原有的/usr/local/nginx/conf/vhost/demo.conf内容,将以下内容复制进来,并替换server_name的地址!

    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
    cat > /usr/local/nginx/conf/vhost/demo.conf <<END
    server {
    listen 80;
    server_name 192.168.50.194;
    return 301 https://$server_name:443$request_uri;
    }
    server
    {
    listen 443 ssl http2;
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
    ssl_certificate /usr/local/nginx/conf/ssl/xxx.pem;
    ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.key;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
    add_header X-Content-Type-Options nosniff;
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    fastcgi_hide_header X-Powered-By;

    ssl_session_cache shared:SSL:10m;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 223.5.5.5 223.6.6.6 valid=300s;
    resolver_timeout 5s;

    server_name 192.168.50.194;
    index index.html index.htm index.php;
    root html/nextcloud;

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

    location = /.well-known/carddav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
    return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location /.well-known/acme-challenge { }
    location / {
    rewrite ^ /index.php;
    }
    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\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
    fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
    set $path_info $fastcgi_path_info;
    try_files $fastcgi_script_name =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param HTTPS on;
    # Avoid sending the security headers twice
    fastcgi_param modHeadersAvailable true;
    # Enable pretty urls
    fastcgi_param front_controller_active true;
    fastcgi_pass unix:/tmp/php-fpm74.sock;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
    }
    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
    try_files $uri/ =404;
    index index.php;
    }
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
    try_files $uri /index.php$request_uri;
    add_header Cache-Control "public, max-age=15778463";
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;

    access_log off;
    }
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
    try_files $uri /index.php$request_uri;
    access_log off;
    }

    access_log /data/logs/nginx/nextcloud_access.log;
    error_log /data/logs/nginx/nextcloud_error.log;
    }
    EOF

Step5.配置php-fpm.conf与启用php-opcache

1
2
3
4
5
6
7
8
9
10
11
12
echo 'zend_extension=opcache.so' >> /usr/local/php/etc/php.ini
sed -i 's/;opcache.enable=1/opcache.enable=1/' /usr/local/php/etc/php.ini
sed -i 's/;opcache.interned_strings_buffer=8/opcache.interned_strings_buffer=8/' /usr/local/php/etc/php.ini
sed -i 's/;opcache.max_accelerated_files=10000/opcache.max_accelerated_files=10000/' /usr/local/php/etc/php.ini
sed -i 's/;opcache.memory_consumption=128/opcache.memory_consumption=128/' /usr/local/php/etc/php.ini
sed -i 's/;opcache.save_comments=1/opcache.save_comments=1/' /usr/local/php/etc/php.ini
sed -i 's/;opcache.revalidate_freq=2/opcache.revalidate_freq=1/' /usr/local/php/etc/php.ini
sed -i 's/memory_limit = 128M/memory_limit = 512M/' /usr/local/php/etc/php.ini

#如果不配置此项可能会导致Nextcloud安装警告:PHP的安装似乎不正确,无法访问系统环境变量。
#getenv("PATH") 函数测试返回了一个空值。
echo 'env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/php/bin' >> /usr/local/php/etc/php-fpm.conf

Step6.重启nginx/php-fpm/mysql服务

1
2
3
4
5
6
7
8
9
10
#nginx
nginx -t
/etc/init.d/nginx restart

#php
/etc/init.d/php-fpm74 configtest
/etc/init.d/php-fpm74 restart

#mysql
/etc/init.d/mysql restart

Step7.配置mysql建立Nextcloud的数据库与数据库账号;

1
2
3
4
5
6
mysql -uroot -p
mysql> set password = password('Root密码修改');
mysql> create database nextcloud character set=utf8;
mysql> create user 'nextcloud'@'localhost' identified by 'NextCloud';
mysql> grant nextcloud.* on databasename.tablename to 'nextcloud'@'localhost'
mysql> quit

Step8.下载与安装nextcloud
官方下载:wget https://download.nextcloud.com/server/releases/nextcloud-18.0.4.zip 速度确实感人

1
2
3
4
5
6
7
#安装解压
cd /usr/local/nginx/html/
curl -L http://down.whsir.com/downloads/nextcloud-18.0.4.zip
unzip nextcloud-18.0.4.zip

#权限设置
chown -R www.www /usr/local/nginx/html/nextcloud

Step9.安装与配置Nextcloud
访问http://SERVER_NAME,请选择MySQL/MariaDB数据库,默认会在网站根目录下创建一个data目录用来存放数据,该目录可根据情况进行更改,我这里保持默认状态进行安装!

WeiyiGeek.

WeiyiGeek.

Step10.如果完成上一步基本都可以正常使用nextcloud了,如果不行请查看错误日志并解决,但是往往为了提升使用体验,我们需要对其配置内存缓存;

Nextcloud官方提供了几种缓存配置方案APCu、Memcached及Redis:

  • 如果你是小型/私人家庭用途,可以仅使用APCu进行缓存。
  • 如果你是用于公司集群用途,可以使用APCu+redis方式进行缓存。
  • memcached缓存方案,它不适合与事务性文件锁定一起使用(关于事务性文件锁定可以查看官方文档,因为它不存储锁,而且数据可以随时从缓存中消失。

因此官方建议的最佳缓存方案是redis, 对于Redis和APCu内存缓存的说明:APCu在本地缓存中比Redis更快。如果您有足够的内存, 请使用APCu进行内存缓存,并使用Redis进行文件锁定。如果内存不足,请同时使用Redis。

(1)最佳缓存配置APCu+Redis(推荐): 前面我们已经安装了APCu+Redis模块扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#修改nextconfig配置文件
vi /usr/local/nginx/html/nextcloud/config/config.php
......
'dbpassword' => '59iSA7XDJciDTXsmR4BU174k95Wijg',
'installed' => true,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
],
);


(2) 纯Redis作为缓存与仅使用APCu作为缓存对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#纯Redis
vi /usr/local/nginx/html/nextcloud/config/config.php
......
'dbpassword' => '59iSA7XDJciDTXsmR4BU174k95Wijg',
'installed' => true,
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
],
);

#使用APCu
echo 'apc.enable_cli=1' >> /usr/local/php/etc/php.ini
/etc/init.d/php-fpm74 restart
vi /usr/local/nginx/html/nextcloud/config/config.php
......
'dbpassword' => '59iSA7XDJciDTXsmR4BU174k95Wijg',
'installed' => true,
'memcache.local' => '\OC\Memcache\APCu',
);


(3) 使用memcached作为缓存:APC用于本地缓存,将memcached作为分布式缓存

1
2
3
4
5
6
7
8
9
10
11
#yum install wphp74-memcached wmemcached
vi /usr/local/nginx/html/nextcloud/config/config.php
......
'dbpassword' => '59iSA7XDJciDTXsmR4BU174k95Wijg',
'installed' => true,
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => [
[ '127.0.0.1', 11211 ],
],
);


2.Docker安装 (推荐)

描述:此处推荐采用Docker进行安装 NextCloud 网盘相关依赖服务。

步骤 01.Docker 环境安装

1
2
3
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

步骤 02.安装Docker版MySQL与Nextcloud以及onlyoffice在线编辑插件

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
mkdir -vp /app/nextcloud/{mysql,data}  /app/onlyoffice/{logs,data,front}

# 部署 MySQL 8.0 数据库
docker run -d --name mysql \
-v /app/nextcloud/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Password \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_PASSWORD=Password \
-p 3306:3306 \
--restart=always \
mysql:8.0

# 部署 onlyoffice/documentserver 支持 office 在线编辑
sudo docker run -d --restart=always \
--name onlyoffice -p 9000:80 -p 9001:443 \
-v /app/onlyoffice/logs:/var/log/onlyoffice \
-v /app/onlyoffice/data:/var/www/onlyoffice/data \
-v /app/onlyoffice/front:/usr/share/fonts/truetype/custom \
-it onlyoffice/documentserver

# 安装 nextcloud 网盘
docker run -d --name nextcloud \
-v /app/nextcloud/data:/var/www/html \
--link mysql:mysql \
--link onlyoffice:onlyoffice \
--restart=always \
-p 80:80 nextcloud:latest

步骤 03.安装初始化访问 宿主机IP:80 进行NextCloud初始化相关配置,即管理员账号密码,以及nextcloud数据库连接相关设置。

步骤 04.安装配置完成后我们还需一些常规配置。

  • 从商城仓库中下载onlyoffice连接插件,Nextcloud与其对应版本如下 (https://apps.nextcloud.com/apps/onlyoffice):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Downloads
    Nextcloud 24 7.3.4 All releases
    Nextcloud 23 7.3.4 All releases # 当前环境选择。

    # 下载当前最新版本
    wget https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v7.3.4/onlyoffice.tar.gz

    # 解压到指定nextcloud app目录之中。
    tar -zxvf /onlyoffice.tar.gz -C /app/nextcloud/data/apps

    # 最后登陆管理员账户,启动该组件即可。
  • 您的安装没有设置默认的电话区域。这是在没有国家代码的情况下验证配置文件设置中的电话号码所必需的。如果号码没有国家代码,请添加“默认电话区域”,并加上希望使用的区域对应的ISO 3166-1代码。

    1
    2
    3
    4
    5
    6
    7
    8
    # 进入Docker
    docker exec -it nextcloud bash

    # 编辑config文件
    nano /config/config.php

    # 在倒数第二行添加
    'default_phone_region' => 'CN',
  • 此实例中的 php-imagick 模块不支持 SVG。为了获得更好的兼容性,建议安装它。

    1
    2
    3
    4
    5
    #进入Docker 
    docker exec -it nextcloud bash

    #安装libmagick
    apt install libmagickcore-6.q16-6-extra


3.Snap安装

描述:什么是Snap?
答:它的安装包扩展名是.snap类似于一个容器,完全独立于系统,它包含一个应用程序需要用到的所有文件和库(Snap包含一个私有的root文件系统里面包含依赖的软件包),他们安装在独立的目录中且各个应用之间相互隔离,互不影响,而且安装快捷简单,运行容易管理;主要支持的主流发行版Ubuntu和Debian;

Snap安装的优缺点:

  • 优点:安装简单、稳定、自动升级以及自带配置环境无需自行配置;
  • 缺点:配置不灵活、最新版本的NextCloud可能不兼容以前的插件;

特别说明:建议国外的VPS采用此种方式安装,因为国内速度真的感人;

安装环境&版本说明:

1
2
3
4
5
6
7
8
9
10
#cat /etc/issue
Ubuntu 20.04 LTS : 5.4.0-26-generic

#NextCloud组件版本
Nextcloud 18.0.4
Apache 2.4
PHP 7.3
MySQL 5.7
Redis 5.0
mDNS for network discovery

基础流程:

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
#1.设置主机名与防火墙设置
hostnamectl set-hostname nextcloud
echo "127.0.0.1 nextcloud" >> /etc/hosts
ufw allow 80,443/tcp
# Rules updated
# Rules updated (v6)


#2.检测是否安装snap(Ubuntu从16.04默认自带)
snap --version
# snap 2.44.3+20.04
# snapd 2.44.3+20.04
# series 16
# ubuntu 20.04
# kernel 5.4.0-26-generic


#3.验证查找是否有nextcloud可用包
snap find nextcloud
# Name Version Publisher Notes Summary
# nextcloud 18.0.4snap1 nextcloud✓ - Nextcloud Server - A safe home for all your data
snap info nextcloud #查询软件详细信息
# snap-id: njObIbGQEaVx1H4nyWxchk1i8opy4h54
# channels:
# latest/stable: 18.0.4snap1 2020-04-25 (20498) 243MB -


#4.采用snap安装Nextcloud
snap install nextcloud
nextcloud 18.0.4snap1 from Nextcloud✓ installed


# 5.启动停止
snap start nextcloud
snap stop nextcloud

如下:您只需要输入创建的管理员及密码就可以使用了

WeiyiGeek.安装完成之后效果

WeiyiGeek.安装完成之后效果


专有命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@k8s:~# nextcloud.[tab]
#1.安装Nextcloud,使用提供的创建admin用户凭证。
nextcloud.manual-install <username> <password>

#2.SSL 启用
nextcloud.disable-https
nextcloud.enable-https

#3.数据导入导出
nextcloud.export -abcd #导出适合于迁移服务器的数据
nextcloud.import -abcd #导入从另一个Nextcloud snap实例导出的数据

#4.数据库
nextcloud.mysql-client
nextcloud.mysqldump

#5.模块管理
nextcloud.occ

基础设置:

  • 使用SSL证书加密Nextcloud,执行以下命令可以从Let's Encrypt申请证书,申请成功后将重启容器内的Apache实例以立即实施SSL

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #方式1:let's加密SSL
    nextcloud.enable-https lets-encrypt
    Have you met these requirements? (y/n) y
    Please enter an email address (for urgent notices or key recovery): master@weiyigeek.top
    Please enter your domain name(s) (space-separated): cloud.weiyigeek.top #注意:域名需要绑定A记录否则会申请是吧
    Attempting to obtain certificates...

    #方式2:自签证书会导致警告(此处以此方式为例)
    nextcloud.enable-https self-signed
    Generating key and self-signed certificate... done
    Restarting apache... done

    #方式3:使用由其他方法生成的证书即自定义已经申请好的的证书
    nextcloud.enable-https custom [OPTIONS]
    WeiyiGeek.SSL证书

    WeiyiGeek.SSL证书

  • 通过snap安装的nextcloud目录与数据位置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #0.snap安装目录
    $pwd
    /var/snap/nextcloud/current/nextcloud
    $ls
    config extra-apps

    #1.云盘文件
    /var/snap/nextcloud/common/nextcloud/data/

    #2.nextcloud网页文件(注意路径后的目录名是变化的)
    /var/snap/nextcloud/common/nextcloud/data/appdata_oc4i0bev5wdu/

    #3.依赖应用所安装目录
    /var/snap/nextcloud/20498/{apache/ certs/ mysql/ nextcloud/ php/ redis/}

    #3.云盘数据库
    /var/snap/nextcloud/20498/mysql/

Tips:

  • 相关snap管理nextcloud命令参考地址
  • 通过snap安装的Nextcloud备份可以将上述云盘文件和云盘数据库打包,然后可以在另外一台新安装的Nextcloud将上述解压包解压到相同路径覆盖即可;

0x02 基础配置

文件加密配置

描述:可以通过Nextcloud后台直接开启服务端加密当然也可以通过occ命令行进行开启Nextcloud的服务端加密功能。

基础操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
#1.获取当前加密功能状态和加密模块情况:
sudo -u www occ encryption:status
# - enabled: false
# - defaultModule: OC_DEFAULT_MODULE


#2.服务端加密(效果可以在后台看见服务端加密功能已被开启。)
sudo -u www occ encryption:enable


#3.但是,已经上传的文件此时还是未加密的,Nextcloud只会加密以后上传的文件。
#如果要加密所有文件,需要在保证无文件改动的情况下,执行下面的命令然后需要输入y确认开启加密。:
sudo -u www occ encryption:encrypt-all

在线文档配置

描述:我们可以在Nextcloud像Office软件一样编辑文档、表格、以及PPT;

环境说明&安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
#前提:需要安装有 Docker 环境上运行按照需求
CPU:2核心2GHz及以上
内存:2GB及以上
硬盘:至少40GB的可用空间
系统:Ubuntu/Debian或其他兼容系统,内核在3.13版本以上

#1.镜像拉取
sudo docker pull onlyoffice/documentserver

#2.运行容器
sudo docker run -d --restart=always --name onlyoffice -p 9000:80 -p 9001:443 -v /app/onlyoffice/logs:/var/log/onlyoffice -v /app/onlyoffice/data:/var/www/onlyoffice/data -it onlyoffice/documentserver

#3.访问页面http://10.10.10.245:9001/welcome/如下图所示即可

WeiyiGeek.

WeiyiGeek.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#4.如何需要添加SSL的情景下,将证书文件密钥等加入到`/app/onlyoffice/data`目录之中;
cp onlyoffice.key /app/onlyoffice/DocumentServer/data/certs/
cp onlyoffice.crt /app/onlyoffice/DocumentServer/data/certs/
cp dhparam.pem /app/onlyoffice/DocumentServer/data/certs/
chmod 400 /app/onlyoffice/DocumentServer/data/certs/onlyoffice.key

#5.补充OnlyOffice SSL 配置示例文件如下
## Strong SSL Security
## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
ssl on;
ssl_certificate /etc/nginx/cert/214212938360415.pem;
ssl_certificate_key /etc/nginx/cert/214212938360415.key;
ssl_verify_client off;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_prefer_server_ciphers on;

#6.重启容器
docker restart onlyoffice

设置流程:
Step1.管理员登陆后转到应用(·可能有些许延迟)然后找到并点击 Office & Test ->> 之后下载OnlyOffice插件即可(输入安装密码

WeiyiGeek.

WeiyiGeek.

Step2.安装启用后,在设置>管理>ONLYOFFICE进行相应的配置,需要继续输入Document Service 服务器IP和端口(http://10.10.10.245:9001)

WeiyiGeek.

Step3.至此在线文档编辑功能完成,通过可以在分享文档文件设置可读、可写等;

Step4.补充自定义中文字体添加,下载字体将解压得到*.tff文件,然后用scp工具把字体文件上传到/usr/share/fonts/

1
2
3
4
5
6
7
8
9
#1.执行documentserver-generate-allfonts.sh导入字体文件
root@d415211e52da:/usr/share/fonts/truetype# documentserver-
documentserver-generate-allfonts.sh documentserver-prepare4shutdown.sh documentserver-static-gzip.sh documentserver-update-securelink.sh

# sudo bash documentserver-generate-allfonts.sh

#2.然后清除浏览器缓存!清除浏览器缓存!清除浏览器缓存!重说三!

#3.重新打开原先的文档就可以看见安装的字体了

注意事项:

  • 如果当前nextcloud启用的https,此时onlyoffice也必须采用https否则设置连接失败;


离线安装应用

描述:当您在服务器中下载应用时候,常常由于网络问题下载到一半的时候突然就失败了,类似如下(此时可能您需要进行离线安装

WeiyiGeek.

WeiyiGeek.

流程步骤:
Step1.下载应用从https://apps.nextcloud.com/ 网站搜寻您要下载的nextcloud应用

Step2.找到下载链接下载对应版本即可,然后上传到nextcloud安装的服务器上(注意:版本的对应);

WeiyiGeek.

WeiyiGeek.

Step3.解压文件并移动至extra-apps目录(snap环境,原版是apps)

1
2
3
4
5
6
#Snap环境为例
tar -xvf onlyoffice.tar.gz -C /var/snap/nextcloud/20498/nextcloud/extra-apps/
root@k8s:/var/snap/nextcloud/20498/nextcloud/extra-apps$ ls
notes onlyoffice
# /nextcloud-18.0.4.2/apps/
# 不同安装方式可能app扩展路径不一样

Step4.之后您将会在应用中看见安装的Onlyoffice
WeiyiGeek.

WeiyiGeek.

Step4.采用安装的应用进行打开docx文档

WeiyiGeek.

WeiyiGeek.

手动上传文件同步

描述: 在上传文件时选择了直接SFTP上传,遂记录需要在NC中同步数据库的代码:

1
2
3
4
5
6
7
8
9
10
11
# 同步全部ID下文件:
docker exec --user www-data nextcloud php occ files:scan --all

# 同步指定ID下文件:
docker exec --user www-data nextcloud php occ files:scan 指定ID

# 同步指定ID的指定文件夹:
docker exec --user www-data nextcloud php occ files:scan --path="/指定ID/files/指定文件夹"

# 列出全部ID
docker exec --user www-data nextcloud php occ user:list

同步以后,还需要递归修改文件夹权限,否则无法再NextCloud中删除文件。

1
2
3
4
5
# 方法一:进入Docker赋权
docker exec -it nextcloud chown -R www-data:www-data /var/www/html/data/指定ID/files/指定文件夹

# 方法二:直接赋权
chown -R www-data:www-data /文件夹绝对路径


0x03 基础使用

描述:用户使用官方文档:https://docs.nextcloud.com/server/latest/user_manual/index.html


组件(Groupware)

Nextcloud Groupware 是一组应用程序,由邮件客户端 (IMAP/POP3) 和日历和联系人服务器 (CalDAV/CardDAV) 组成,其中包含相应的 Web 界面。

例如:与Windows 10中 的日期同步

  • 在浏览器中,导航到下一个云日历应用。在”设置和导入”下,将”iOS/macOS CalDAV 地址”复制到剪贴板中。
  • 启动 Windows 10 日历应用。然后,单击设置图标(齿轮图标)并选择”管理帐户”。
  • 单击”添加帐户”并选择”iCloud”。
  • 输入电子邮件、用户名和密码。这些信息都不得有效,所有信息都将在后续步骤中更改。
  • 单击”完成”。应显示一条消息,指示已成功保存设置。
  • 在”管理帐户”菜单中,单击以前步骤中创建的 iCloud 帐户,然后选择”更改设置”。然后,单击”更改邮箱同步设置”。
  • 滚动到对话框的底部,选择”高级邮箱设置”。将您的 CalDAV URL 粘贴在标记为”日历服务器 (CalDAV)”的字段中。
  • 单击”完成”。在相应字段中输入您的 Nextcloud 用户名和密码,并将帐户名称更改为您喜欢的任何帐户名称(例如”下一个云日历”)。单击”保存”。
  • 执行所有这些步骤后,下一个云日历应同步。如果没有,请检查您的用户名和密码。否则,请重复这些步骤。

如何设置参考Reddit用户帖子:
https://www.reddit.com/r/Nextcloud/comments/5rcypb/using_the_windows_10_calendar_application_with/


OCC 命令

描述:occ命令是ownCloud/Nextcloud的命令行界面。您可以使用occ执行许多常见的服务器操作,例如安装和升级ownCloud/Nextcloud,管理用户,加密,密码,LDAP设置等。

1
2
3
4
5
6
7
8
9
10
11
# user
user:add 添加一个用户
user:delete 删除特定用户
user:disable 禁用特定用户
user:enable 激活特定用户
user:info 显示用户信息
user:lastseen 显示用户最后登陆了时间
user:list 列出所有用户
user:report 显示有多少用户访问
user:resetpassword 为一个用户重置密码
user:setting 读取和修改用户设置

基础实例:

1
2
3
4
# 查看nextcloud用户
sudo -u www-data php occ user:list
# 重置密码
sudo -u www-data php occ user:resetpassword admin


0x04 入坑解决

问题1.需要修复Nextcloud数据库

描述:如果不执行以上命令,可能会在Nextcloud中出现安全警告,看到以下警告内容!
错误信息:

1
2
3
- 数据库丢失了一些索引。由于给大的数据表添加索引会耗费一些时间,因此程序没有自动对其进行修复。
- 在数据表 "oc_calendarobjects_props" 中无法找到索引 "calendarobject_calid_index"
- 在数据表 "oc_schedulingobjects" 中无法找到索引 "schedulobj_principuri_index"

错误原因:数据库中的一些列由于进行长整型转换而缺失,由于在较大的数据表重改变列类型会耗费一些时间,因此程序没有自动对其更改,所以此时我们需要修复丢失的索引,索引修复后会大大提高相应表的查询速度。
解决方法:
1
2
3
4
#修复丢失的索引
sudo -u www php /usr/local/nginx/html/nextcloud/occ db:add-missing-indices
#应用挂起的更改
sudo -u www php /usr/local/nginx/html/nextcloud/occ db:convert-filecache-bigint


问题2.nextcloud账号密码忘记

描述:可以采用occ命令进行修改用户的账号密码;

1
2
# 重置密码
sudo -u www php occ user:resetpassword admin


问题3.snap安装nextcloud所遇问题
  • 错误信息:docker: Error response from daemon: error while creating mount source path '/app/onlyoffice/logs': mkdir /app: read-only file system.
    `
  • 问题原因:现在用snap安装的docker有一个bug,不能挂在/home之外的地方比如/data下面
  • 解决版办法
    1
    sudo docker run -d --restart=always --name onlyoffice -p 9000:80 -p 9001:443 -v /home/public/logs:/var/log/onlyoffice -v /home/public/data:/var/www/onlyoffice/data -it onlyoffice/documentserver
  • 参考连接:https://github.com/Microsoft/vscode-docker/issues/749


问题4.NextCloud的MySQL的binlog文件过大造成的监控报警
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
1、进入MySQL的Docker,并激活mysql命令行
docker exec -it mysql bash mysql -uroot -p

2、查看日志的相关配置
show variables like 'log_%';

应该会看到
+----------------------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------------------+----------------------------------------+
| log_bin | ON |


3、清除已保存的日志
PURGE MASTER;

4、禁止保存二进制日志,先退出mysql命令行,接着编辑my.cnf文件
nano /etc/mysql/my.cnf

5、在[mysqld]后添加一行【skip-log-bin】,如:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
skip-log-bin

6、重启Mysql后,检查是否配置成功 off
show variables like 'log_%';