摘要訊息 : 在伺服器上配置 Nextcloud 實現私有雲.

0. 前言

Seafile 是国内开发者的产品, NextCloud 是国外开发者的产品, 对于个人来说两者除了界面以外没有太大的区别. 界面来说, 个人更喜欢 NextCloud. 另外有必要说一下的是, NextCloud 和 OwnCloud 出自于同一个团队, 不过 OwnCloud 被收购了之后, 这个团队跳槽出来另外做了一个, 现在 OwnCloud 仍然是有人维护的. 但是个人不建议用 OwnCloud, 因为 Seafile 和 NextCloud 如果只是个人和家庭用户去用的话, 都是完全免费的, 也就是个人和家庭用户都能用到企业版或者专业版的功能, 而 OwnCloud 个人只能用到免费版的功能, 企业版也有, 不过只有 30 天的免费试用 (我在 2022 年发现 OwnCloud 也有免费版本了), 对于个人来说, 没有这个必要去购买.

本文建立在阁下已经为伺服器配置 PHP 7+ 和 MySQL 的情况下进行教学.

本文在 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 下载

首先我们进入 NextCloud 官方网站 https://nextcloud.com/, 右上角有个 Get Nextcloud, 选择 Nextcloud server, 然后再选择 Archive File 就可以看到下载地址. 我们复制下载地址之后便可以开始安装.

2. 安装

我们准备把 Nextcloud 放到 /www/drive 档案夹中 : cd /www. 然后通过 wget 下载地址 这个指令下载. 然后解压 : unzip nextcloud*.zip 并且重新命名 mv nextcloud* drive. 如果 unzip 指令出现问题, 那么可以通过 yum install -y unzip 来安装这个套件. 进入目录浏览文件之后, 你会发现 NextCloud 是用 PHP 写的, 而 Seafile 是用 Python 写的, 这就导致 Seafile 的安装比 NextCloud 要复杂的多. NextCloud 的是通过网页安装的.

接下来需要配置 Nginx, 这里给出一份 Nginx 配置示例, 使用中文的地方都需要修改 :

upstream php-handler {
    server 127.0.0.1:9000;    # FastCGI 端口, 如果你采用 socket 方式进行连结, 那么可以改为 socket 档案位置. 如果使用连接埠, 那么一般为 127.0.0.1:9000
}
server {
    listen 80;
    server_name 你的网域名称;
    rewrite ^(.*) https://$host$1 permanent;
}
server {
    listen 443 ssl http2;
    root 改为 Nextcloud 档案夹位置;
    server_name 你的网域名称;
    ssl on;
    ssl_certificate 网域名称的 SSL crt 证书;
    ssl_certificate_key 网域名称的 SLL key 档案;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    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;
    location / {
        index index.php index.html index.htm;
        rewrite ^ /index.php$uri;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    location = /.well-known/carddav {
        return 301 $scheme://$host/nextcloud/remote.php/dav;
    }
    location = /.well-known/caldav {
        return 301 $scheme://$host/nextcloud/remote.php/dav;
    }
    location /.well-known/acme-challenge { }
    client_max_body_size 8192M;
    fastcgi_buffers 64 4K;
    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;
    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;
        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;
    }
    location ~ \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=15778463";
        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;
        access_log off;
    }
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /nextcloud/index.php$uri$is_args$args;
        access_log off;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;    # FastCGI 端口, 这里和第二行一样
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

保存后注意用 nginx -t 命令检测一下是否有错误, 有时候不小心多出一个空格就会导致网站无法访问.

配置完 Nginx 后需要为 NextCloud 目录设置权限 : chown nginx:nginx -R /www/file. 配置完成之后直接访问你的 NextCloud 网站, 就会出现安装向导 :

Figure 1. 安装页面

第一行和第二行是创建管理员账号与密码, 默认是采用 SQLite 安装的, 但是这里我们采用 MySQL. 点击一下 Storage & database, 然后选择 MySQL/MariaDB. 第一行是数据库用户名, 第二行是数据库用户名对应的密码, 第三行是数据库名称, 第四行是数据库服务器地址 (变更了数据库端口直接在后面加上就可以了).

都确定没有问题之后, 点击 Finish setup. 之后会卡一下, 这是因为正在安装, 不要慌, 安装完成之后会自动跳转 :

Figure 2. 安装完成

这是 2017 年的图像, 现在的 Nextcloud 可能有所更改, 大家看到的画面不太一样.