windows10下利用docker安装nextcloud及相关踩坑

终于在家里的windows NAS里用docker装好了nextcloud,写出来纪念下吧!

一、安装docker desktop

在window程序和功能,开启wsl支持,下载官网客户端安装。

(一)更新国内源

不得不说,阿里还是!快!

1
2
3
4
5
6
7
8
9
10
11
12
{
"registry-mirrors" : [
"https://xxx.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"insecure-registries" : [
"registry.docker-cn.com",
],
"debug" : true,
"experimental" : true
}

(二)开启wsl集成!!在WSL2中启动docker

这一步应该是在windows10上正确使用docker最重要的一步了。运行在wsl2下的docker desktop实际上是在使用hyper-v虚拟机,如果直接用GUI配合windows下的compose进行操作,那么在挂载windows目录时,如果这个目录用于多个image交互,可能导致权限及通信等各类错误。

在单独安装的wsl的系统下,比如ubuntu中执行docker命令,实质上还是调用docker desktop,但是相当于在一个linux环境下调用,避免了许多报错,也可以方便的更改权限设置。

具体步骤:

  1. 之前安装docker的时候应该已经启用过WSL了。

  2. 安装windows10下的ubunu。

  3. 在docker desktop中setting-resources-WSLIntegration中启用ubuntu

  4. 在ubuntu中使用docker

此时可使用/mnt/c的挂载方式。

(三)docker-compose.yml设置

使用官方github中的example即可,家用内网强烈建议使用insecure-postgres-fpm,性能最佳。朋友们。。。至少换掉apache啊。。1202年了。

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

services:
db:
image: postgres:alpine
restart: always
volumes:
- db:/var/lib/postgresql/data
env_file:
- db.env

redis:
image: redis:alpine
restart: always

app:
image: nextcloud:fpm-alpine
restart: always
volumes:
- nextcloud:/var/www/html
environment:
- POSTGRES_HOST=db
- REDIS_HOST=redis
env_file:
- db.env
depends_on:
- db
- redis

web:
build: ./web
restart: always
ports:
- 127.0.0.1:8080:80 #只能本地使用,外网需改为80:80
volumes:
- nextcloud:/var/www/html:ro
depends_on:
- app

cron:
image: nextcloud:fpm-alpine
restart: always
volumes:
- nextcloud:/var/www/html
entrypoint: /cron.sh
depends_on:
- db
- redis

volumes:
db:
nextcloud:

初次启动后,可以将数据文件复制到其他盘符,再挂载回去,这样数据库使用系统的固态硬盘,数据则可以使用大容量的机械硬盘。app-volume下增加:

/mnt/d/nextclouddata:/var/www/html/data

启动nextcloud时需等待3-10mins,期间会有502错误

二、各种踩坑

(一)申请免费的ssl证书及内网的使用

内网使用let’s encrypt没有研究怎么实现,有路由器介入的情况下,即使有公网ip也会比较麻烦吧。所以就用一年期的免费ssl证书咯。时至今日,貌似只有阿里腾讯还提供比较便捷的免费服务。如果你有其他好的选择请告知。

使用时可以用官方带有nginx-proxy的样例,但设置比较繁琐,同时一般的国内ISP都会屏蔽公网ip的80和443,折腾了很久,最终还是放弃。。。

有几点在这里记录下:

(1)取消HSTS(严格模式)

docker-compose.yml的proxy容器下增加

1
2
environment:  
- HSTS=off

本来是为了解决android客户端提示严格模式-禁止http连接的,但并没有解决,不过关掉hsts也挺好,这功能是安全,也很麻烦,想让HSTS失效的唯二办法,等待和清楚浏览器缓存。。。

不要直接该proxy的配置文件。。。么有用。。

(2)证书的使用

nginx-proxy使用的crt格式的证书,用aliyun生成的apahce证书中的pulic和chain合并,public在前,换行粘贴chain。

(二)windows下挂在本地路径的写法

2021.11在windows10 21H1,docker desktop v4.1.1下,经过多轮测试,对于windows下的volumes写法主要有两种:

1./c/Users/user/xxx:/var/nginx/html

2.C:\Users\user\xxx:/var/nginx/html

3.//var/run/docker.sock:/tmp/docker.sock:ro在windows下使用反代时的.sock文件写法,否则proxy跑不起来一直重启,当然,这一条在最终的compose中完美避开了。在ubuntu中执行docker compose可以不用修改,直接用样例的格式即可

另外,测试了可以在环境变量或.envdocker-compose.yml文件中增加COMPOSE_CONVERT_WINDOWS_PATHS=1,可能是新版本自己进化了。。

还有,指向文件夹前,先创建那个文件夹。

(三)windows下打开volume

1
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

(四)解决数据目录权限0770提示及http连接问题

外置数据后编辑config.yml解决 :

1
2
'check_data_directory_permissions' => false,
'overwriteprotocol' => 'http',

(五)Too many redirect登录失败,提示多次失败

1
2
3
4
5
6
7
8
进入postgres容器
psql -U nextcloud
输入db.env中的nextcloud密码
show tables;
查看有哪些tables
select * form oc_bruteforce_attempts;
查看什么IP地址被Ban了
DELETE FROM oc_bruteforce_attempts WHERE ip = 'xxx.xx.x.x';

(六)本地连接登录及增加其他域名

在config.php中找到

1
2
3
4
5
6
7
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'server1.example.com',
2 => '192.168.1.50',
3 => '[fe80::1:50]',
),

增加本地ip即可。

(七)限制preview生成图片的大小

nextcloud默认的preview很庞大,不要浪费空间,改一下吧。在config.php中加入:

1
2
'preview_max_x' => 1080,
'preview_max_y' => 1920,

(八)docker container中运行occ命令

1
2
3
4
5
6
docker exec --user www-data <nextcloud-container-name> php occ <your-command>
docker exec --user www-data nextcloud-app-1 php occ files:scan --all
files:scan --all #添加本地文件
files:cleanup
files:scan-app-data #删除preview文件后执行
config:app:set preview jpeg_quality --value="60" #设置jpeg质量

(九)备份nextcloud时的必选项目

  1. The config folder
  2. The data folder
  3. The theme folder
  4. The database

(三)参考链接