Docker 搭建 Nextcloud

引言 Docker 搭建 Nextcloud docker-compose.yml 参考: nextcloud/docker: ⛴ Docker image of Nextcloud Base version - apache This version will use the apache image and add a mariaDB container. The volumes are set to keep your data persistent. This setup provides no ssl encryption and is intended to run behind a proxy. Make sure to pass in values for MYSQL_ROOT_PASSWORD and MYSQL_PASSWORD variables before you run this setup. 注意: 修改了官方的 volumes, 直接挂载到当前目录的 ./nextcloud 文件夹
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
version: '2'


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

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

1
docker-compose up -d
Q&A

1. "Strict-Transport-Security" HTTP 头未设为至少 "15552000" 秒。为了提高安全性,建议启用 HSTS

本人开启了 Cloudflare CDN, 因此才做下方操作, 否者应该是编写 Nginx 配置, 这里是因为 Cloudflare CDN 重写了响应头 实测成功解决

2. 你正通过安全连接访问你的实例,然而你的实例正生成不安全的 URL

参考: Reverse proxy — Nextcloud latest Administration Manual latest documentation NextCloud 使用https反向代理后PC端异常 - mouseleo - 博客园 config/config.php
config.php
1
2
3
4
5
'trusted_domains' => 
array (
0 => 'nextcloud.moeci.com',
),
'overwriteprotocol' => 'https',
实测成功, 无需重启,刷新页面发现即刻生效 现在还可以发现所有 相关 URL 已经替换为 https

3. 您的网页服务器未正确设置以解析“/.well-known/caldav”

参考: Reverse proxy — Nextcloud latest Administration Manual latest documentation General troubleshooting — Nextcloud latest Administration Manual latest documentation TODO: 经过测试, 下方未成功解决, 依然有上方提示 nginx.conf
nginx.conf
1
2
3
4
5
6
7
location /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}

location /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
补充

注意: 不使用 https, 无法登录 安卓app

经过实测, 不对 Nextcloud 服务端 使用 https, 无法使用 安卓app 登录,
注意: Nextcloud 服务端内部需要使用 https, 即需 解决 Q&A: 1,2

Nginx: location ~ /

nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# proxy to 8001
location ~ / {
proxy_pass http://localhost:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
# cache
add_header Cache-Control no-cache;
expires 12h;
# websocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
使用 location ~ / 当匹配上 / 时,就不会再向下搜索其它匹配规则了,
而 使用 location / 则会尝试向下搜索其它匹配规则

配合 rclone 挂载 外部云存储

参考: docker/.examples at master · nextcloud/docker docker/.examples/dockerfiles/full/apache at master · nextcloud/docker Local — Nextcloud latest Administration Manual latest documentation 设置外部储存失败【nextcloud吧】_百度贴吧 linux查看所有用户-百度经验 [Linux]Linux里查看所有用户 - Cookies_L - 博客园 为了方便, 直接将 rclone 打包到 Dockerfile 里, 并在容器启动时, 自动启动挂载 外部云存储 下方镜像添加了 rclone 外部云存储, 以及 官方的 full 示例 (所有可选包和 cron 功能的依赖项) 关联仓库:
- awesome-docker/nextcloud-docker at main · yiyungent/awesome-docker

1. 直接在 /rclone-storage 下

失败, 因此尝试其它文件夹, 让 apache 有权限, 并赋予权限

1.1 经过测试, 解决

加上 --allow-other
1
rclone mount pcloud-1: /rclone-storage/pcloud-1 --vfs-cache-mode full --allow-other

2. 尝试在 /var/www/data 下

TODO: 失败
- rclone 挂载成功
- Nextcloud 添加外部存储没有成功 第一个看似成功, 那是因为使用的 /var/www/data/rclone-storage, 但实际打开文件夹后, 为空
/var/www/data/rclone-storage/pcloud-1 : 直接显示失败 尝试过 权限问题 , 将其挂载到 /var/www/data/rclone-storage/pcloud-1 下,并赋予权限, 结果还是不行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p /var/www/data/rclone-storage/pcloud-1

apt-get install -y screen

screen -S pcloud-1

rclone mount pcloud-1: /var/www/data/rclone-storage/pcloud-1 --vfs-cache-mode full

# 断开当前 terminal, 新开 terminal

screen -ls

chown -R www-data:www-data /var/www/data
chmod -R 0750 /var/www/data
挂载的地方, 权限修改失败

3. 尝试在 /var/www/html/data 下

1
2
3
4
5
6
7
8
mkdir -p /var/www/html/data/rclone-storage/pcloud-1

# 挂住 terminal
rclone mount pcloud-1: /var/www/html/data/rclone-storage/pcloud-1 --vfs-cache-mode full

# 新开 terminal
chown -R www-data:www-data /var/www/html
chmod -R 0750 /var/www/html
目测改权限失败了, 不知道为什么

3.1 经过测试, 解决

参考:
- rclone mount
1
--allow-other                            Allow access to other users (not supported on Windows)
挂载时加一个选项: --allow-other
1
rclone mount pcloud-1: /var/www/html/data/rclone-storage/pcloud-1 --vfs-cache-mode full --allow-other

> 尽管权限仍然没修改成功, 但加上此选项即可成功

Linux 查看所有用户
1
cat /etc/passwd

开启其它扩展文件的预览

参考: docker/.examples at master · nextcloud/docker - 官方 Docker Nextcloud: Install Preview Generator – Allerstorfer.at Configuration Parameters — Nextcloud latest Administration Manual latest documentation - 最新 官方文档 注意: yiyungent/nextcloud 中已经打包完成, 只需要修改 config.php 即可 注意:Dockerfile 不会安装 LibreOffice 包(行已注释),因为它会使生成的镜像大小增加大约 500 MB。为了安装它,只需取消注释 Dockerfile 中的相应行。 注意:默认情况下,仅生成 BMP、GIF、JPEG、MarkDown、MP3、PNG、TXT 和 XBitmap 文件的预览。 预览生成的配置可以在 config.php 中完成,如 管理手册中所述 The following providers are disabled by default due to performance or privacy concerns: OC\Preview\Illustrator OC\Preview\HEIC OC\Preview\Movie OC\Preview\MSOffice2003 OC\Preview\MSOffice2007 OC\Preview\MSOfficeDoc OC\Preview\PDF OC\Preview\Photoshop OC\Preview\Postscript OC\Preview\StarOffice OC\Preview\SVG OC\Preview\TIFF OC\Preview\Font Defaults to the following providers: OC\Preview\BMP OC\Preview\GIF OC\Preview\JPEG OC\Preview\MarkDown OC\Preview\MP3 OC\Preview\PNG OC\Preview\TXT OC\Preview\XBitmap OC\Preview\OpenDocument OC\Preview\Krita 默认 config.php 里压根没这选项, 需要自己添加此配置 ./nextcloud/nextcloud/config/config.php 添加到最后
config.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'enable_previews' => true,
'enabledPreviewProviders' => array(
'OC\Preview\PNG',
'OC\Preview\JPEG',
'OC\Preview\GIF',
'OC\Preview\BMP',
'OC\Preview\XBitmap',
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown',
'OC\Preview\OpenDocument',
'OC\Preview\Krita',
'OC\Preview\PDF',
'OC\Preview\Movie',
'OC\Preview\MP4',
'OC\Preview\MKV',
'OC\Preview\AVI',
),
无需重启, mp4 预览图生成成功

生成 pdf 预览图 失败

参考: PDF Previews are not generated - ℹ️ Support / 📦 Appliances (Docker, Snappy, VM, NCP) - Nextcloud community Can't see PDF thumbnails in new grid view (but works in the demo instance) - 🍱 Features & apps / previewgenerator - Nextcloud community previewgenerator with Nextcloud Preview · Issue #211 · nextcloud/previewgenerator 解决 注意: yiyungent/nextcloud 中已经打包完成, 只需要修改 config.php 即可
    还需要在 Docker 镜像中安装 ghostscript , imagemagick
    还需要修改 imagemagick 的一个配置文件
1
vi /etc/ImageMagick-6/policy.xml
该行 <policy domain="coder" rights="none" pattern="PDF" /> 必须更改为 <policy domain="coder" rights="read|write" pattern="PDF" />
    重启
1
docker-compose restart
成功
PS: 中途尝试:
未测试, 不知道最后成功是否与这个应用有关( 是否缺少此应用还是可行, 大多数教程未涉及此应用 ), 最后成功时, 这个插件是启用状态
安装并启用了这个应用 ( Preview Generator ) , 还是没有 pdf 预览缩略图

X-Forwarded-For 相关

参考: 抓包理解X-Forwarded-For和proxy_add_x_forwarded_for - it610.com Nginx \(remote_addr和\)proxy_add_x_forwarded_for变量详解 - 授客 - 博客园 参考 感谢帮助! NextCloud——结合rclone打造个人私有云存储 - 墨天轮 定制优化Nextcloud镜像 - 知乎 搭建NextCloud私有网盘挂载OneDrive - 云+社区 - 腾讯云 丢掉为知笔记用Nextcloud - 知乎 Setting Up NextCloud on Docker w/ NGINX and CloudFlare for Remote Access! - YouTube 咸鱼先锋 - 修复NextCloud启用CloudFlare后出现的HTTP的请求头安全提示 e-alfred/ocdownloader: ocDownloader - AGPL-licensed multi-protocol download manager for Nextcloud using ARIA2, youtube-dl and Curl (supports Youtube, BitTorrent, HTTP, FTP) 自定义docker实现nextcloud集成离线下载 | LeFer 使用nginx反向代理以实现网站镜像 | LeFer