虽然搭建后才发觉和自己的需求有点偏差,不过其支持WebDAV协议还是有点用处。

最初的需求是为了解决QFile移动端自动上传照片的各种不便:

  1. QFile移动版(包括安卓和iOS)不像群晖那样能设置自动连接,每次都要手动选择连接,所以做不到后台自动上传新拍照片。
  2. 即便连上后,触发自动上传的时间不定,有时要亮屏放半天才会上传,且没有手动触发检测上传的选项。
  3. 上传时必须保持亮屏,否则会停止。

但搭建好nextcloud后才发觉其软件定位不是备份文件,而是同步与分享。目前暂不支持单向同步,即我需要的手机照片自动上传,但不同步下载服务器的照片。后通过免费的FolderSync解决这个问题。
不过其支持WebDAV协议,故可用来给如Joplin之类的第三方程序做同步用,故仍旧保留了。
本文没用Docker官方脚本的方式安装,因为前者对性能有损失且设置有限、不利于调试,而后者适合新装好的系统只跑nextcloud。

安装配置apache

php设置

编辑/etc/php/7.2/apache2/php.ini

1
2
3
memory_limit = 1024M
post_max_size = 1024M
upload_max_filesize = 1024M

安装mysql

1
2
sudo apt install mariadb-server php7.2-mysql
sudo mysql_secure_installation

输入并记好root用户的密码。注意root权限的用户是通过auth_socket而并非密码来验证的,故通过sudo mysql -u root -p登录时不输入密码或任意密码都能成功登录,而不是密码未设置成功。想取消auth_socket可以看这里
启用4字节字符支持,编辑/etc/mysql/mariadb.cnf

1
2
3
[mysqld]
innodb_file_per_table=1
character-set-server=utf8mb4

重启mysql。

mysql创建nextcloud数据库

以root登录。

1
sudo mysql -u root

创建nextcloud用户和数据库。

1
2
3
4
5
CREATE DATABASE nextclouddb;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON nextclouddb.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
exit

创建数据文件夹

从数据安全和硬盘空间扩展的角度强烈建议将nextcloud的数据放到别的地方,而不是默认的/var/www/html/nextcloud/data,否则后期想做数据迁移时由于官方不支持会很麻烦

1
2
sudo mkdir /srv/hdd1/nextcloud
sudo chown -R www-data:www-data /srv/hdd1/nextcloud

安装nextcloud

下载nextcloud源码,解压并复制到网页服务器位置并修改权限为www-data,否则会报错Internal Server Error

1
2
3
sudo mkdir /var/www/example.com
sudo cp -r nextcloud /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com/nextcloud/

打开安装页面https://example.com/nextcloud并输入数据库相关配置执行安装初始化。

1
2
3
nextcloud
nextclouddb
localhost

如果安装正确则能进入网盘页面。
配置可信任域名。打开/var/www/example.com/nextcloud/config/config.php文件,添加域名和内网IP。

1
2
3
4
5
6
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'example.com',
2 => '192.168.1.2',
),

安装并启用Redis缓存提升性能(可选)

如果只是几个人轻度使用没必要用牛刀。
安装。

1
sudo apt install php-apcu redis-server php-redis

配置Redis。打开/etc/redis/redis.conf

1
2
3
port 0
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

添加Apache用户www-dataredis组。

1
sudo usermod -a -G redis www-data

重启apache服务,开始redis服务。

1
2
sudo service apache2 restart
sudo service redis-server start

修改nextcloud配置文件/var/www/example.com/nextcloud/config/config.php,添加以下内容。

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

启用redis服务。

1
sudo systemctl enable redis-server

测试redis服务。

1
sudo redis-cli -s /var/run/redis/redis-server.sock ping

正常会打印PONG
重启服务器。

Debug

打开nextcloud管理员概览页面(https://example.com/nextcloud/index.php/settings/admin/overview ),确保安全与设置警告测试全部通过。

Your web server is not properly set up to resolve “/.well-known/caldav”

由于之前并未将nextcloud装在网站根目录,故需通过rewrite进行301跳转。
启用rewrite模块。

1
sudo a2enmod rewrite

编辑网站根目录/var/www/example.com/.htaccess文件。

1
2
3
4
5
6
7
8
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L]
RewriteRule ^\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L]
RewriteRule ^\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L]
RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav /nextcloud/remote.php/dav/ [R=301,L]
</IfModule>

注,如果用nginx+apache方式搭建则需把以上RewriteRule全部注释掉,在example.com.conf中设置301跳转。

500 Internal Server Error

先检查redis-server是否正常工作,必要时注释掉config.php中redis的内容来查错。
这多出现于域名改变的情况,若overwrite.cli.url等设置改过仍无法解决,可以考虑重装。

重装nextcloud

config文件夹下重命名config.php并新建CAN_INSTALL文件。
浏览器打开https://example.com/nextcloud会进入安装向导。输入数据库相关配置。
注意这里必须新建一个和旧管理员用户名不一样的新管理员,如果输入旧管理员会报错用户已存在。完成设置后注销登录旧管理员把新建的这个删掉即可。

移除nextcloud

删掉源文件,数据文件,数据库。

1
2
3
sudo rm -rf /var/www/example.com/nextcloud
sudo rm -rf /srv/hdd1/nextcloud
DROP DATABASE nextclouddb;