NextCloud 安装填坑

最近想搭个私有云,在群里问了一圈又 Google 了一番选择用 NextCloud。本来以为按照官方文件就肯定稳了喵,谁知道还是被坑了喵。下面随便记录填坑 & 安装过程吧喵。

必须的玩意:

  • Ubuntu 18.04
  • MariaDB
  • Nginx
  • PHP
  • 其他系统不会用的辣鸡

官方文档看这里吧:Admin Manual
如果用Apache2的话就参考文档吧,我比较习惯用Nginx喵。

安装依赖

首先安装所有依赖报

1
2
3
4
# apt-get update
# apt-get install mariadb-server php-gd php-json php-mysql php-curl \
php-mbstring php-intl php-imagick php-xml php-zip php-apcu php-redis \
php-fpm nginx redis-server

配置服务

申请证书

下面是HTTPS,如果不要这玩意直接跳到服务器配置文件喵。

这里我用acme.sh喵,轻便不像 Certbot 那样还要装一堆依赖喵。

  • 安装acme.sh

    1
    # curl https://get.acme.sh | sh
  • 申请证书

    1
    # acme.sh --issue -d example.com --nginx
  • 安装证书到Nginx目录

    1
    2
    3
    4
    # acme.sh --install-cert -d example.com \
    --key-file /etc/nginx/ssl/example.com.key \
    --fullchain-file /etc/nginx/ssl/fullchain.cer \
    --reloadcmd "service nginx force-reload"

HTTPS

先配置好服务器再搞 NextCloud 喵。

1
# nano /etc/nginx/nginx.conf

找到 ssl_protocols 把后面 TLSv1 删掉,不安全的老旧玩意。
在这行下面添加一行

1
ssl_ciphers '$ciphers';

$ciphers 按自己需要写,我直接在 Mozilla 上生成的填上去了喵。
第一列选 Nginx 第二列选 Modern 或者 Intermediate,第三列填你vps上安装的版本号。
如果不需要考虑兼容就设备/软件建议选 Modern 喵。改完按 Ctrl + O 保存, Ctrl + X 退出。
注意目前 18.04 的 NginxOpenSSL 版本都不支持 TLSv1.3 喵。如果你想启用 TLSv1.3 你需要自己下载 OpenSSL 1.1.1 以上版本和 Nginx 自行编译喵。

1
# nano /etc/nginx/sites-enabled/default

找到 server_name 填上自己的域名,然后在下面一行写跳转HTTPS。

1
return 301 https://$server_name$request_uri;

服务器配置文件

新建一个配置文件:/etc/nginx/sites-enabled/nextcloud
下面分两部分喵,如果你可以把 NextCloud 放在服务器根目录 (https://example.com) 或者子目录 (https://example.com/subfolder) 喵,按自己喜欢的写喵。

文件内容如下:
example.com 改成自己的域名,把 subfolder 改成你需要的名字或者删掉。

/etc/nginx/sites-enabled/nextcloud
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
upstream php-handler {
#server 127.0.0.1:9000;
server unix:/var/run/php/php7.2-fpm.sock; # 18.04默认使用unix sock
}

server {
#listen 80; # 不需要HTTPS的把这行前面的#删掉
#listen [::]:80; # 同上,并且把下面两行监听 443 端口的在开头加 # 号
listen 443 ssl http2 fastopen=3;
listen [::]:443 ssl http2 fastopen=3;
server_name example.com;

# 不启用 HTTPS 的话这里到下面一段都不需要
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

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;
add_header Referrer-Policy no-referrer;
# 不启用 HTTPS 的话上面到这里一段都不需要

# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;

# Path to the root of your installation
root /var/www/html/; # Ubuntu 默认路径,不需要子目录把这里改成 NextCloud 的根目录如 /var/www/html/nextcloud

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

location = /.well-known/carddav {
# 如果不需要子目录把下面一行的 "/subfolder" 删掉
return 301 $scheme://$host/subfolder/remote.php/dav;
}

location = /.well-known/caldav {
# 如果不需要子目录把下面一行的 "/subfolder" 删掉
return 301 $scheme://$host/subfolder/remote.php/dav;
}

location /.well-known/acme-challenge { }

# subfolder 改成你放的文件夹名字,放在上面 "root" 里定义的 /var/www/html/ 根目录下
# 如果不需要子目录就这行 "location ^~ /subfolder {" 删掉。注意下面还有一行 "}" 需要删除!
location ^~ /subfolder {
# 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;

# 如果不需要子目录把下面一行的 "/subfolder" 改成 "/"
location /subfolder {
# 如果不需要子目录把下面一行的 "/subfolder/" 删掉
rewrite ^ /subfolder/index.php$request_uri;
}

# 如果不需要子目录把下面一行的 "/subfolder" 改成 "/"
location ~ ^/subfolder/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
# 如果不需要子目录把下面一行的 "/subfolder" 改成 "/"
location ~ ^/subfolder/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

# 如果不需要子目录把下面一行的 "/subfolder" 改成 "/"
location ~ ^/subfolder/(?: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;
}

# 如果不需要子目录把下面一行的 "/subfolder/" 改成 "/"
location ~ ^/subfolder/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

location ~ \.(?:css|js|woff2?|svg|gif)$ {
# 如果不需要子目录把下面一行的 "/subfolder" 删掉
try_files $uri /subfolder/index.php$request_uri;
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;
add_header Referrer-Policy no-referrer;

# Optional: Don't log access to assets
access_log off;
}

location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
# 如果不需要子目录把下面一行的 "/subfolder" 删掉
try_files $uri /subfolder/index.php$request_uri;
# Optional: Don't log access to other assets
access_log off;
}

} # 如果不需要子目录把这行删除
}

下载此配置文件:nextcloud.conf

安装 NextCloud

下载并解压

下载最新版 NextCloud
解压并复制到网站的根目录下:

1
2
3
# wget https://download.nextcloud.com/server/releases/latest.zip
# unzip lastest.zip
# mv nextcloud /var/www/html/

初始化 NextCloud

下面可以运行服务了喵,按照官方的文档到这里就结束了喵,剩下的可以到网站上操作喵,但是其实这里有大坑等着喵。

1
# systemctl restart nginx.service

这时候应该已经可以打开网页看到 NextCloud 了喵,不过还不能在网页上继续配置喵。因为安全规则限制了必须手动添加一个特权用户到数据库里。

输入 root 密码登录。
1
2
3
4
5
6
7
8
9
10
11
# mysql -u root -p -h localhost
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4722
Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

  • 新建特权用户
    username 改成你想要的用户名,下面要用到。password自己填个密码。
    1
    2
    3
    4
    5
    MariaDB [(none)]> create user 'username'@'localhost' identified by 'password';
    MariaDB [(none)]> create database if not exists nextcloud;
    MariaDB [(none)]> grant select, insert,update, delete, create,drop, index, alter, create temporary tables on nextcloud.* to 'username'@'localhost' identified by 'password';
    MariaDB [(none)]> flush privileges;
    MariaDB [(none)]> exit;

然后就可以打开网页继续初始化了

用户名密码不说了,这是登录网页时用到的,初始化新建的这个是管理员。
点开 Storage & Database 的小箭头

Data Folder 按照文档提示最好不要放到 NextCloud 的安装目录内
root 改成上面在数据库里新建的帐号,密码是上面自己设的。
然后点 Finish Setup 等待初始化。

优化 NextCloud

这里可以不做了,继续做下去完全是因为在 NextCloud 的设置里会提示我需要优化我受不了喵。
拒绝看到任何提示喵~

Cron定时任务

NextCloud 有几种模式,默认的需要开网页才会运行,还是换掉吧喵,改用cron。

1
# crontab -u www-data -e

然后在底部粘贴这一行,/var/www/html/nextcloud 改成自己的路径,保存后退出。

1
*/15  *  *  *  * php -f /var/www/html/nextcloud/cron.php

验证:

1
# crontab -u www-data -l

然后在网页端设置里把默认的 AJAX 改成 Cron

缓存优化

先运行 php 看看系统有没有启用 APCu 和 OPCache。

1
# php -m | grep -Ei 'apcu|opcache'

没有 apcu 的话就是刚才没装上,去安装 php-apcu 喵。
然后配置 Redis,默认用的是 TCP 监听但是我这里只需要本地,果断换成 unix sock 去。

1
# nano /etc/redis/redis.conf

  • 找到 bind 127.0.0.1 ::1 这行在行首加 # 注释掉
  • 找到 port 6379 这行注释掉
  • 找到 # unixsocket /var/run/redis/redis-server.sock 这行把 # 删掉,记住这个路径之后还会用到
  • 下面一行 unixsocketperm 700 把 700 改成 777,否则网页会没有权限读写

保存后退出,重启 Redis 服务

1
# systemctl restart redis

下面修改 NextCloud 的配置

1
# nano /var/www/html/nextcloud/config/config.php

从倒数第二行开始加,注意配置文件最后一行结尾必须是 );

1
2
3
4
5
6
7
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
),

保存后退出,然后刷新下网页看看喵,如果看到错误提示看看是不是 APCu 没启用喵,我被 APCu 坑了挺久的喵,Redis 没坑过我喵。

默认语言

还是刚才的配置文件 config.php
在里面加这几行

  • 如果定义了 force_language 的话所有用户都会强制使用 zh_CN 并且无法修改。
    1
    2
    'default_locale' => 'zh_CN',
    'force_language' => 'zh_CN',

完结

差不多就酱了喵,下一步是准备写个一键脚本喵。
当然人类的本质是咕咕咕不用指望很快就会看到喵~

不接受任何打赏喵