
物理主机系统:Windows server 2019 Datecenter (v1809, 17763.805) Docker:Docker for windows 2.1.0.4 (Engine: 19.03.4, Compose: 1.24.1) MySQL:MySQL for win64 8.0.18 Community Server Nginx:Nginx for windows 1.16.1 Nextcloud:17.0.0 (hub.docker.com/_/nextcloud, nextcloud:latest, nextcloud:apache, OS:Linux/amd64) 可选附加: Onlyoffice-document-server: https://hub.docker.com/r/onlyoffice/documentserver, tag:latest redis: https://hub.docker.com/_/redis, tag:latest 总之除了 Nextcloud,附加的 onlyoffice-document-server 和 redis 之外,其余均为基于 windows 的软件
Nextcloud 镜像的选择:在官方 Docker 页面中主要版本有默认的 Apache 版和采用容器化 Nginx 的 FPM 版,在我个人实际搭建过程中 FPM 版的 Nginx 和宿主机 windows 之间隔着一层 NAT,配置调试起来显得十分麻烦,故选择运行起来更简单的 Apache 版
Docker for windows 安装是全自动创建 Docker Host 的 Hyper-V 虚拟机,网络使用 NAT 转发,Host IP 为 10.75.0.1,Container IP 为 10.0.75.0
MySQL Community 创建好供 Nextcloud 使用的 utf8mb4 编码的数据库(database),并设置好相关的用户名和密码,也可以直接使用默认的 root 账户,记得要修改密码
NextCloud 和 Nginx 的搭建后续重点讲述
这个其实百度和谷歌上有一大批的教程,只是个人在实际环境运行中出现了各种各样的小细节问题,还有更多的是这些教程大多数都过时了,当然接下来的所有讲述都是仅供参考,毕竟每个人的运行环境都不同
Compose 文本内包含了 redis 缓存容器和 onlyoffice-document-server 文档服务器容器配置,觉得有用请自取
我个人将一些比较重要的文件和 log 通过 volume 挂载到物理系统 windows server 的 D 盘中,Nextcloud 则是直接将整个 PHP 程序和数据文件夹 /var/www/html 转移到 D:/Docker/nextcloud 中,方便以后直接使用 windows 管理文档
nextcloud 容器用的 “wyxls/nextcloud:full” 镜像是我自建的,Nextcloud 的官方镜像默认不带 smbclient 和 crontab,会影响到外部存储挂载 APP 使用 (因为我主要 windows 的 smb 共享),于是我根据官方提供的 Dockerfile 自建了镜像并上传到 docker hub,不需要的话可以改成 nextcloud 官方的 image ( https://hub.docker.com/_/nextcloud)
Dockerfile example:( https://github.com/nextcloud/docker/blob/master/.examples/dockerfiles/full/apache/Dockerfile)
version: '3' #初始化网络模块,为了让 Nextcloud 和 onlyoffice+redis 协作 networks: nextcloud: #services 以下都是容器 services: #redis 容器,暴露 6379 端口供其他容器使用 redis: image: redis container_name: redis hostname: redis restart: always networks: - nextcloud expose: - 6379 #nextcloud 容器,宿主机 10000 端口转发 80 端口访问 nextcloud: image: wyxls/nextcloud:full container_name: nextcloud restart: always depends_on: - redis environment: - UID=1000 - GID=1000 - UPLOAD_MAX_SIZE=5G - APC_SHM_SIZE=128M - OPCACHE_MEM_SIZE=128 - CRON_PERIOD=15m - TZ=Aisa/Shanghai - NEXTCLOUD_TABLE_PREFIX=oc_ volumes: - D:/Docker/nextcloud:/var/www/html ports: - 10000:80 networks: - nextcloud #onlyoffice 容器,宿主机 10005 端口转发 443 端口访问,在 nextcloud 的 onlyoffice 设置里必须以 https+宿主端口访问 onlyoffice: container_name: onlyoffice image: onlyoffice/documentserver:latest stdin_open: true tty: true restart: always depends_on: - nextcloud volumes: - D:/Docker/onlyoffice/document_data:/var/www/onlyoffice/Data - D:/Docker/onlyoffice/document_log:/var/log/onlyoffice - D:/Docker/onlyoffice/document_fonts:/usr/share/fonts/truetype/custom - D:/Docker/onlyoffice/document_forgotten:/var/lib/onlyoffice/documentserver/App_Data/cache/files/forgotten ports: - 10005:443 networks: - nextcloud 在 Docker 容器中运行的 Nextcloud 默认以 root 权限运行所有程序,所以访问时会提示设置权限 chmod 0770,但在我个人实践中无论是 chown 还是 chmod 都无法解决这个问题,后来还是强行忽略文件权限检查
在 /var/www/html/config/config.php 中加入以下一行:
'check_data_directory_permissions' => false, #检查数据目录权限 此外别忘了还要添加 Trusted_Domains,不然 Nextcloud 的 Web 端无法访问:
'trusted_domains' => array ( 0 => 'example.com', 1 -> 'localhost', ), 由于 Docker for windows 是基于 Hyper-V 虚拟机模拟出的 Linux/amd64 系统,相当于物理 windowsHyper-V 虚拟机( Docker Host 宿主机)Docker Container (容器)两层 NAT 网络,所以需要使用 Nginx 当中间人进行反向代理,下面是我个人配置的 conf,仅供参考
因为我个人的 Windows Server 内网可以直接通过 SMB 访问管理文件,而 Nextcloud 只进行外网访问,所以我只做了 HTTPS 监听+反向代理,有内网 HTTP 访问需求的可以将 SSL 相关部分注释掉
原本在反向代理 proxy_pass 段有 connect, read, send 等 timeout 限制,但后来发现添加后网页访问和 windows 客户端同步变得异常缓慢,而且频繁报错,故删除
server { listen 10002 ssl; #Nginx 监听端口 server_name example.com localhost 192.168.x.x; #域名, IP, 本地地址都可以填写 root D:/nextcloud; #nextcloud 目录 index index.php; ssl_certificate D:/SSL-Certificates/fullchain.cer; ssl_certificate_key D:/SSL-Certificates/private.key; ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; #以下部分为隐藏 header, 为了解决 nextcloud 自检问题 proxy_hide_header Strict-Transport-Security; proxy_hide_header X-Content-Type-Options; proxy_hide_header X-Robots-Tag; proxy_hide_header X-Frame-Options; proxy_hide_header X-Download-Options; proxy_hide_header X-Permitted-Cross-Domain-Policies; proxy_hide_header Referrer-Policy; proxy_hide_header X-XSS-Protection; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Content-Type-Options nosniff; add_header X-Robots-Tag "none"; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Download-Options "noopen"; add_header X-Permitted-Cross-Domain-Policies "none"; add_header Referrer-Policy "no-referrer"; add_header X-XSS-Protection "1; mode=block"; client_max_body_size 10G; fastcgi_buffers 64 4K; fastcgi_hide_header X-Powered-By; location / { proxy_pass http://localhost:10000/; #反向代理地址 proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location = /.well-known/carddav { #解决自检 carddav 未正常配置解析提示问题 return 301 $scheme://$http_host/remote.php/dav; } location = /.well-known/caldav { #解决自检 carddav 未正常配置解析提示问题 return 301 $scheme://$http_host/remote.php/dav; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { deny all; } location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { deny all; } } 在初步搭好 Nextcloud 后实际使用中经常出现访问超时,原因是 Nextcloud 在反向代理中可能会无法侦测正确的协议,需要强行覆写( Nextcloud 默认 latest 镜像用 Apache 作为 Web server 监听 HTTP 80 端口)
'overwriteprotocol' => 'https', Nextcloud 官方提供连接 onlyoffice 服务的 APP,与 onlyoffice 对接后能实现 Nextcloud 内通过 Web 访问直接打开并编辑 office 相关文档 (pptx, xlsx, docs 等),通过 Docker 可以一键配置
version: '3' services: onlyoffice: container_name: onlyoffice image: onlyoffice/documentserver:latest stdin_open: true tty: true restart: always depends_on: - nextcloud volumes: - D:/Docker/onlyoffice/document_data:/var/www/onlyoffice/Data - D:/Docker/onlyoffice/document_log:/var/log/onlyoffice - D:/Docker/onlyoffice/document_fonts:/usr/share/fonts/truetype/custom - D:/Docker/onlyoffice/document_forgotten:/var/lib/onlyoffice/documentserver/App_Data/cache/files/forgotten ports: - 10005:443 networks: - nextcloud 证书安装:在 /var/www/onlyoffice/Data 中建立"certs"文件夹并将 SSL 证书及私钥以"onlyoffice.crt"和"onlyoffice.key"保存,或者直接在 yml 中 environment 环境参数添加,在 Docker-Settings-Shared Drives 设置共享后可以直接使用 windows 物理路径指定,比如:D:\SSL-certificates\onlyoffice.crt
environmnt: - SSL_CERTIFICATE_PATH=证书路径 - SSL_KEY_PATH=私钥路径 通过访问 https://example.com:10005 可以查看 Document Server 运行状况,显示 Document Server is running 表示成功
最后在 Nextcloud 内设置 Document Editing Service address 为 https://example.com:10005,如果页面下方出现 settings 一类选项则表示已成功连接
Nextcloud 官方推荐使用 Redis 缓存 Nextcloud,我自己也不太懂原理,但官方既然推荐了就一起部署上啦
version: '3' services: redis: image: redis container_name: redis hostname: redis restart: always networks: - nextcloud expose: - 6379 记得要在 Nextcloud 对应的 config/config.php 中添加相关内容
'memcache.local' => '\OC\Memcache\APCu', #redis 'memcache.distributed' => '\OC\Memcache\Redis', #redis 'memcache.locking' => '\OC\Memcache\Redis', #redis 'redis' => array( #redis 'host' => 'redis', #如果 redis 部署在物理机上填 localhost,这里由于 redis 和 nextcloud 在同一网络 nextcloud 内,所以可用 redis 代替 'port' => 6379, ), onlyoffice 目前我个人测试只能在 Docker 内部 Nextcloud 使用,详细原因猜测是 onlyoffice 内置的 Nginx 没正确配置监听或允许外部网络域名访问(反正我软路由的另一个 Nextcloud 对接时显示 Connetion refused )
我凭借着记忆将大致的搭建过程写了出来,难免会有所纰漏,烦请各位朋友查漏指正,有什么问题可以回复交流
此外如果对过程中任何一部分有修正改进的建议,请务必告诉我,我对 Nginx、PHP、MySQL 参数调优真的是一窍不通
牢骚话:
有人可能会问为什么不干脆用 Linux 物理系统来搭,没辙啊,老爸只会用 windows,老妈想着吃饭时间连上去看 iqiyi 的电视剧,家里其他人又想摆一台公用的共享 NAS,我自己对 centOS 又不是特别熟悉,最后翻了一大堆的论坛帖子、网站文章自己摸索,目前也就只能这样先用着了
其实最关键是没钱买群晖,而且家里人的要求比较杂,群晖不能很好地满足,于是这份攻略就诞生了
曾经想过 ESXi 6.7 组建 FreeNAS + centOS + Docker (Nextcloud)+ Windows 7 的大虚拟机,把路由 LEDE 也虚拟化,从此就可以把那台软路由也扔掉,但后来发现搞不定 N 卡直通后给 Windows,重启虚拟机就带着 ESXi 一起死机的问题。据谷歌搜索说是因为 ESXi 6.7 在显卡第一次直通给虚拟机后关机时没能正常 reset 显卡状态,导致第二次虚拟机启动时显卡处于正在使用状态而带着宿主机一起 Boom,折腾了两天还是解决不了,随后我就放弃并滚回去用 windows 了
总之……暂时告一段落
1 wyxls OP 自查漏打一个细节问题,windows 系统下的 MySQL 8 默认密码认证插件为 caching_sha2_password,在上面所给的 MySQL for win64 + Nextcloud Container 环境下,给 Nextcloud 创建数据库用户的时候要留意主机名为 host.docker.internal,密码认证插件改为 mysql_native_password |
2 wyxls OP 在实际使用过程中发现 Nextcloud 和 MySQL 对接的效率有点低,上网查了一下参数调优,胡乱一气都给调大了,想着 E3 1230 v3+32G ECC RAM 跑个 Nextcloud 效率应该不会太低吧 ``` # # 性能优化 # # 允许最大连接数 max_cOnnections= 500 # 响应的连接数,一般为最大连接数的 85% max_used_cOnnections= 425 # 索引块( index blocks )缓存的大小 key_buffer_size = 128M # 允许服务器接受的数据包大小 max_allowed_packet = 32M # 块数据插入缓存大小 bulk_insert_buffer_size = 32M # 线程分配内存大小 thread_stack = 256K # 线程缓存数量 thread_cache_size = 16 # 打开表格数量缓存 table_open_cache = 1024 ``` 大佬们如果有更好的优化参数请告诉我,秋梨膏 |
3 wq2016 2019-10-27 18:30:04 +08:00 我一个树莓派 3B+,跑无压力,同步盘使用。。。 |
4 wyxls OP @wq2016 我这个问题出在大量的小文件同步,大概是 1 万 5 千多个 word、excel,用 windows 端的客户端同步的时候“检查远程变更”的效率很慢,不知道应该优化哪里才好 |
5 wq2016 2019-10-27 20:21:34 +08:00 @wyxls sorry 啊,我参考的 https://pimylifeup.com/raspberry-pi-nextcloud-server/ |
7 wyxls OP @wq2016 我看了日志和 I/O 数据,感觉瓶颈是在 MySQL 那,我也翻到了一些用树莓派做 Nextcloud,他们大多都加大了 innodb cache 相关的参数。事实上我犯了个很弱智的错误,我初步搭建测试的时候 MySQL 的数据库放在了 5400 转的 HDD 里,过会我把数据库丢到 SSD 里再看看运行效率 #默认 128M innodb_buffer_pool_size = 512M #默认 1 innodb_buffer_pool_instance = 1 #默认 2 innodb_flush_log_at_trx_commit = 2 #默认 16M innodb_log_buffer_size = 32M #默认 90 innodb_max_dirty_pages_pct = 90 |
9 wyxls OP upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream 运行过程中 nginx 的 log 总是有上述 error,因为在外部网络通过域名访问 Nginx 监听反向代理使用 localhost 作为 host name 时所有网络请求都会走一遍本地 DNS 解析或走 hosts,而 Win10 和 Server 2019 默认开启 IPv6 地址,解析的时候总是会尝试一遍 IPv6 访问,也就是[::1] 解决方法是将 Proxy_pass 直接改成 127.0.0.1 根据相关解释,在 hosts 里加入 127.0.0.1 localhost 应该也是可行的 |
10 wyxls OP 我个人是实在不知道为什么 Nextcloud Windows 客户端远程同步文件夹效率超级低下,甚至各种 Gateway time-out 除了 Nextcloud 的数据保留外,将其余所有文件转移到 SSD 后,将 Docker for windows 的 CPU 数拉到 4,内存拉到 4G 后,2G 的大量小文件总算能正常同步了 docker stats 里内存占用仅有 25%左右,但进到 Nextcloud 容器内 top 看到空闲内存仅剩 200MB,不太懂 |
11 ddup 2019-10-28 08:52:52 +08:00 via Android 我的树莓派 nextcloud 同步时老是系统卡死,是真的卡死不会活过来,在 nginx 里面限制了下并发数,看看后续效果。 |
12 wyxls OP @ddup 我这 x86 的性能倒是不用考虑什么限制,但倒是不知道问题究竟出在哪里 Nextcloud 的容器启动初期同步效率一点问题都没有,但在运行一段时间后就各种超时 504 gateway timeout,Web 访问也是跟着卡 除了 windows 客户端同步之外就一点问题都没有 |
13 GSGUA 2019-11-03 10:38:26 +08:00 请问下是怎么将数据放到 windows 文件夹中的? |
14 wyxls OP @GSGUA 在 compose 中用 volume 将 windows 文件夹路径挂载到 container 里,记得 Docker 客户端需要将对应磁盘共享给 Docker Host |
15 EvineDeng 2019-11-22 09:20:37 +08:00 via Android 我尝试使用 Windows Server 2019 自带的 Linux 子系统搭建 Nextcloud,同样遇到 0770 权限的问题,同样也是 chown chmod 都无法解决。是不是也可以照搬您这条忽略权限的代码? |
16 wyxls OP @EvineDeng 抱歉,太久没逛 v2ex。 按道理来说,可以照搬复制进 NextCloud 的配置文件里,因为这是 NextCloud 自带的文件权限检查,只是针对自身在 PHP 环境下对自己的文件是否符合权限预设值( 0770 ) 比如 Linux 上主用户为 A,组为 root ; php 程序用户为 php,组为 php ; nextcloud 如果不是以 php ( php 组内用户)运行,又或者越权以 A ( root 组内用户)运行都会提示这个问题 另外 Docker 的 Nextcloud 在我的运行环境下有严重效能问题,无论是上传大文件还是大量小文件都会出现 Nginx 或 NextCloud 自身访问超时导致上传、下载(包括客户端同步)频繁失败。NC 的官方论坛有人说是因为 Windows 版的 Nginx 有问题,具体我也不太清楚,反正弃用了。 听大佬说因为 NextCloud 基于 PHP 效率很低,所以目前我已经改用 Seafile docker,满足使用需求并且也有同步客户端,自带配置好的 Nginx,docker 本身各种配置都做了持久化,方便 windows 本地修改。我这边环境只需要反向代理改一改就能用 |
19 wyxls OP @ddup 在非 Linux 系统上跑 NextCloud 确实太累人,多半是 NTFS 文件系统读写上权限什么的各种奇奇怪怪的问题。 我后来在 windows 里跑 seafile-Pro docker,里面用到的 elasticsearch 服务的缓存存储做了外置持久化,log 里一直弹检索错误,导致 log 文件占完了 Hyper-V 分配的硬盘空间。 最后还是把缓存扔回内部的 volume 才正常 |
23 mzDV4TUeHyesLbUQ 2023-05-22 12:59:30 +08:00 @wq2016 同款树莓派,我的 TF 卡为 128GB class 10 ,同步数据最大 5MB ,简直不能用。 |