一、前言

家里部署 Nas 已经好几年了,但是基本只有我一个人再用,总想让老爸放弃他的 360 企业云盘,但是没成功,说 QNAP 默认的 webUI 太难操作了。之前有试过应用商店自带的 nextcloud,但是默认存储路径在系统盘,我的系统盘只有 500g,本身就不够用了,只能作罢。最近在对手上使用的各种服务进行容器化改造方便未来迁移,故而撰写这篇文章记录 nextcloud 的构建过程。

二、部署

2.1 compose 文件配置

关于威联通系统的 container station 就不必过多介绍,唯一的缺点就是不支持 ipv6,希望以后会改进。为了方便部署也为了整合,这里直接使用 docker compose 的方式进行部署,数据库采用PostgreSQL,中间件采用Redis.

配置文件参考了官方文档,但是将数据库实现改为了postgresql,并增加了redis作为缓存组件.其中postgres的数据库目录,nextcloud的数据目录做了挂载卷映射,以便数据的持久化管理,具体路径可根据需求修改,同时加上了时区信息.以下为 compose 文件内容:

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
version: "3.2"

services:
db:
image: postgres
container_name: nextcloud_db
restart: unless-stopped
volumes:
- /path/to/yourdir:/var/lib/postgresql/data # 自行修改
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: your_database_password # 自行修改
TZ: Asia/Shanghai
networks:
- network_nextcloud

redis:
image: redis
container_name: nextcloud_redis
environment:
TZ: Asia/Shanghai
restart: unless-stopped
networks:
- network_nextcloud

app:
image: nextcloud
restart: unless-stopped
container_name: nextcloud
ports:
- 25001:80 # 自行修改
volumes:
- /path/to/yourdir:/var/www/html # 自行修改
environment:
POSTGRES_HOST: db
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
POSTGRES_PASSWORD: your_database_password # 自行修改
NEXTCLOUD_ADMIN_PASSWORD: your_admin_account # 自行修改
NEXTCLOUD_ADMIN_USER: your_admin_password # 自行修改
REDIS_HOST: redis
TZ: Asia/Shanghai
networks:
- network_nextcloud
depends_on:
- db
- redis

networks: # 加上network的原因是qnap会默认为每个compose文件提供分离的网络栈,显式指定后方便后续共享
network_nextcloud:

2.2 部署流程

2.2.1 目录准备

通过控制台-共享文件夹-创建,构建新的共享文件夹,文件夹名称设置为nextcloud,磁盘自行选择,本文使用了一块 16T 的西数 HC550 硬盘作为存储路径.

共享文件夹

随后通过File station文件总管在该共享目录中创建datapostgresql/data两个目录,在 QNAP 系统中的相对路径分别为/share/nextcloud/data/share/nextcloud/postgresql/data,最后的目录结构如下所示:

1
2
3
4
.
├── postgresql
│ └── data
└── data

2.2.2 创建容器

通过Container Station 容器工作站,在创建选项卡中选择右侧的+创建应用程序即可使用前文提供的 compose 文件,将其中用户名密码以及存储路径和端口进行相应替换即可.注意删去文件中的注释,否则无法通过自带的校验功能.

新建容器

2.2.3 (option)配置反向代理

如果你使用了威联通自带的 ddns 服务并配置了 ssl 证书,则可以通过控制台-网络访问-反向代理功能为 nextcloud 服务添加 ssl 代理,此处协议为HTTPS,开启HSTS,假定 compose 文件中配置的端口为 25001,反向代理所用端口为 21443.建议对容器端口和代理端口有一个统一的规划

反向代理

在配置完反向代理后,需要修改nextcloud可信域名配置dav 配置,以适配反向代理.可以首先通过Container Station 容器工作站的总览找到 nextcloud 所在容器,点击右侧的终端机按钮,输入/bin/bash进入终端.

进入终端

进入终端后,执行如下命令修改配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apt update
apt install vim # 安装文本编辑器
vi /var/www/html/config/config.php # 执行修改命令,添加以下内容到文件尾部(可信代理)

'trusted_proxies' =>
array (
0 => '233.233.233.233.1/24', # 将IP修改为你的nas所对应的静态地址网段
),
'overwritehost' => 'example.domain:21443', # 修改为前文自行设置的域名和端口
'overwriteprotocol' => 'https',

# 保存退出时,在英文输入环境下,使用`shift+:`调出命令行,然后输入`wq`并回车

vi /var/www/html/.htaccess # 执行修改命令,找到并修改以下内容(dav)

# 修改前
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L] # 修改为前文自行设置的域名和端口
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L] # 修改为前文自行设置的域名和端口
# 修改后
RewriteRule ^\.well-known/carddav https://example.domain:21443/remote.php/dav/ [R=301,L] # 修改为前文自行设置的域名和端口
RewriteRule ^\.well-known/caldav https://example.domain:21443/remote.php/dav/ [R=301,L] # 修改为前文自行设置的域名和端口

2.2.4 修改配置默认

nextcloud 默认地区和语言均为美国,并且未设置电话区域,需要进行修改,参考官方管理手册的language_configurationdefault-phone-region).

参考上一节进入容器的命令行,并执行如下命令:

1
2
3
4
5
6
7
vi /var/www/html/config/config.php # 执行修改命令

#添加以下内容到文件尾部(语言区域)
'default_language' => 'zh_CN',
'default_locate' => 'zh',
#添加以下内容到文件尾部(电话区域)
'default_phone_region' => 'CN',

2.2.5 (option)修改定时策略

nextcloud 默认的定时策略为ajax,官方推荐修改为Cron.官方手册的修改方式存在问题,无法使用.

首先参考 2.2.3 节进入终端,执行如下命令:

1
2
3
4
5
6
apt install cron # 安装定时任务工具
apt install vim # 如果没有执行2.2.3节内容,则需要安装文本编辑器
service cron start # 启动定时任务服务

crontab -e # 修改定时任务,添加以下内容
*/5 * * * * su www-data -s /bin/bash -c "/usr/local/bin/php /var/www/html/cron.php"

接下来通过之前设置的网页和端口进入 nextcloud 网页,登录后点击右上方头像,在管理设置-基本设置-后台任务中将方式改为cron.

2.2.6 (option)配置邮件服务

同样在在管理设置-基本设置中,可以对电子邮件服务进行配置,这里推荐使用阿里云的邮件推送服务,我尝试使用企业邮箱的 smtp 代理时,总提示连接失败.

2.2.7 (option)添加外部存储服务

nextcloud 可以通过 smb 等方式连接外部存储,这样就不需要将 NAS 中的每个需要的目录都映射到 docker 中,只需要以 smb 的形式进行挂载,就可以动态的配置文件.

具体配置过程如下:

  • 进入 nextcloud 网页,登录后点击右上方头像,在应用中找到精选应用,在应用列表中选择下载并启用External storage support.
  • docker 中默认未安装smbclient,需要参考前文进入容器命令行,执行apt install smbclient.
  • 重新进入 nextcloud 网页,登录后点击右上方头像,,在管理设置-外部存储中添加 smb 目录.

三、总结

nextcloud 作为一款发行多年的开源私人存储管理软件,提供了多平台的客户端,同时上手难度远低于 qnap 自带的文件管理体系,配置好服务以后只需要简单的安装 app 或访问网页就可以管理文件.

参考