说明

本文内容参考 GitHub官方文档 和 Docker Hub。
在安装 nextcloud 时选用 MySQL 和 Redis 作为数据库,没有使用默认的数据库。

配置 Docker 仓库

配置国内仓库地址提高下砸镜像速度,修改配置文件/etc/docker/daemon.json,没有就新建,添加如下配置(我这里配置了多个地址):

1
2
{"registry-mirrors": ["https://3laho3y3.mirror.aliyuncs.com","https://registry.docker-cn.com","https://mirror.ccs.tencentyun.com"]
}

保存之后重启 docker

1
$ systemctl restart docker

安装 MySQL

拉取镜像

1
$ docker pull mysql

创建持久化数据目录,表示 mysql 运行数据放在这个目录下: /home/mysql/data

1
2
3
$ cd home
$ mkdir mysql
$ mkdir data

启动容器并指定持久化目录、指定root密码、端口映射

1
2
3
4
5
6
7
8
9
10
11
$ docker run -d \
--name nextcloud_db \
--privileged=true \
--name mysql \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=10130331Nxl \ #设置数据库root密码
-e MYSQL_USER=nextcloud \ #新增用户名
-e MYSQL_PASSWORD=10130331Nxl \ #新增用户密码
-e MYSQL_DATABASE=nextcloud \ #新增数据库表
-p 3306:3306 \
mysql:tag

测试连接通过即可

安装 Redis

同样拉取镜像,创建持久化数据目录:/home/redis/data
如果需要 redis 配置文件可以通过以下命令获取:

1
$ wget -P /usr/local/redis http://download.redis.io/redis-stable/redis.conf

启动容器指定配置文件启动、持久化目录、密码

1
2
3
4
5
6
7
$ docker run -d \
--name nextcloud_redis \
--privileged=true \
-p 6379:6379 \
-v /home/redis/redis.conf:/etc/redis/redis.conf \
-v /home/redis/data:/data --name redis \
redis:latest redis-server --requirepass 123456 --appendonly yes #requirepass 123456设置密码

安装 nextcloud

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ docker run -d \
--name nextcloud \
--restart=always \
--privileged=true \
-v /home/nextcloud:/var/www/html \
-e PUID=1000 \
-e PGID=1000 \
-e MYSQL_PASSWORD=10130331Nxl \
-e MYSQL_DATABASE=nextcloud \
-e MYSQL_USER=nextcloud \
-e MYSQL_HOST=nextcloud_db \
-e TZ=Asia/Shanghai \
--link nextcloud_db \
--link nextcloud_redis \
-p 9000:80 \
nextcloud:tag

参数 -v {映射到本地磁盘的目录}:{运行时数据的目录},这样重启容器数据不会丢失
参数 –link 连接到刚才安装的容器,可以将 mysql8 和 redis 作为主机名

初始化配置

通过 docker 启动后,在浏览器输入 http://ip:9000/ 进入初始设置界面
1、设置管理员账号和密码
2、配置数据库,选择 MySQL/MariaDB,分别输入:

  • 用户名:我直接填的 root
  • 密码:root 账号的密码
  • 数据库名:nextcloud
  • 主机:mysql8,因为我在 docker 启动命令中指定了 –link mysql8:mysql
    3、点击完成即可

优化

在 config.php 配置文件中加入如下配置(对应安装时映射路径,文件在 /home/nextcloud/config 下)

1
2
3
4
5
6
'memcache.local' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array('host' => 'redis',
'port' => 6379,
'password' => '123456',

以上内容加在最后一行 ); 内容之前。

另外

使用 docker-compose 会更简洁方便些,在 docker-compose.yml 同级目录下执行

1
docker-compose up -d

docker-compose.yml 文件内容如下:

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
version: '2'

#volumes:
#nextcloud:
#db:

services:
db:
image: mariadb:10.5
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
networks:
- nextcloud_netbridge
volumes:
- /nextcloud/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_PASSWORD=nextcloud
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud

app:
image: nextcloud
restart: always
ports:
- 80:80
networks:
- nextcloud_netbridge
links:
- db
volumes:
- /nextcloud/app:/var/www/html
environment:
- MYSQL_PASSWORD=nextcloud
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db

networks:
nextcloud_netbridge:
driver: bridge

解决自检错误

解决:”Strict-Transport-Security” HTTP 头未设为至少 “15552000” 秒。为了提高安全性,建议启用 HSTS,参考步骤见 安全小贴士 ↗

1
vim /etc/apache2/sites-available/000-default.conf
1
2
3
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; preload"
</IfModule>
1
service apache2 reload

解决:您的网页服务器未正确设置以解析“/.well-known/caldav”。更多信息请参见文档↗。您的网页服务器未正确设置以解析“/.well-known/carddav”。更多信息请参见文档↗。

1
vim .htaccess
1
2
RewriteRule ^\.well-known/carddav http://192.168.2.3:9000/remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav http://your_site_address/remote.php/dav/ [R=301,L]

解决:反向代理头部配置错误,或者您正在通过可信的代理访问 Nextcloud。如果您不是通过可信代理访问 Nextcloud,那这是一个安全问题,它可能允许攻击者通过伪装其IP地址以访问 Nextcloud。更多信息请查看文档↗

1
'trusted_proxies' => ['nginx-proxy_app_1','nginx-proxy_app_2'],
  • 您正通过安全连接访问您的实例,然而您的实例正生成不安全的 URL。这很可能意味着您位于反向代理的后面,覆盖的配置变量没有正确设置。可以阅读有关此问题的文档页 ↗
1
2
3
4
5
6
7
'trusted_proxies' => 
array (
'192.168.2.1',
'192.168.2.3',
),
'overwritehost' => 'sjkhsl.fun:9000',
'overwriteprotocol' => 'https',

解决:您的安装没有设置默认的电话区域。这对验证个人资料页面中缺少国家代码的电话号码而言是必需的。要允许没有国家代码的电话号码,请添加相应的“default_phone_region”到您的配置文件中。允许的国家和地区请参阅 ISO 3166-1 code ↗

1
'default_phone_region' => 'CN',

解决:数据库被用于事务文件锁。为了增强性能,请设置memcache(如果可用)。获取更多信息请参见文档↗

1
'memcache.locking' => '\\OC\\Memcache\\APCu',

解决超时60 秒

进入容器

vi lib/private/App/AppStore/Fetcher/Fetcher.php #找到 options = 找到’timeout’ => 60, 改成600 秒 10分钟 #保存退出

解决onlyoffice连接问题

1
2
3
4
5
6
'onlyoffice =>
array (
"jwt_secret" => "secret",#修改,如果跟你不一样
"jwt_header" => "AuthorizationJwt"
'verify_peer_off' => true,
),