关于我
~一个热爱火影的业余小提琴玩家~
Joynaruto

Docker容器之Nextcloud搭建

前言

上次写过一篇NextCloud的搭建教程,这么久使用下来感觉非常棒。

从网页端到WebDav端以及手机端的体验行云流水,外加OnlyOffice的在线多人编辑也非常舒服。但这种安装方式在服务器迁移,数据打包备份以及网盘本身日常更新等方面不是很方便。碰巧看到了GuGu这篇文章便跟着试了试,整体安装流程相较传统的安装方式简化了很多,特此记录 ;-)

开始搭建

安装Docker及Docker-Compose

#安装docker
wget -qO- get.docker.com | bash
#查看Docker版本
docker -v
#设置开机启动
systemctl enable docker
#安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#授予执行权限
sudo chmod +x /usr/local/bin/docker-compose
#查看Docker-Compose版本
docker-compose --version

搭建NextCloud

#建立文件夹,参照GuGu的路径,后期很好管理
mkdir -p /root/data/docker_data/nextcloud
#进入目录
cd /root/data/docker_data/nextcloud
#编辑docker-compose.yml文件
nano docker-compose.yml

docker-compose.yml内容如下:

version: "3"

services:
  nextcloud:
    container_name: nextcloud-app
    image: nextcloud:latest
    restart: unless-stopped
    ports:
      - 8080:80
    environment:
      - MYSQL_HOST=mysql
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloud
    volumes:
      - /root/data/docker_data/nextcloud/data:/var/www/html
      - /etc/localtime:/etc/localtime:ro   //让容器使用和服务器相同的时区信息,方便日志查询

  mysql:
    image: mysql:8.0
    container_name: nextcloud-db
    restart: unless-stopped
    environment:
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_ROOT_PASSWORD=nextcloud
    volumes:
      - /root/data/docker_data/nextcloud/db:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro   //同上
    security_opt:
      - seccomp:unconfined                //加上防止数据库报错

运行容器

docker-compose up -d 

反向代理

搭建完后先别急着用ip+端口访问,否则等会儿通过反代访问时就会报错。我使用的是Nginx Proxy Manager来进行反代。

常规操作不提了,记得打开Websockets SupportHTTP/2 SupportHSTS EnabledHSTS Subdomains这几个选项。

经过上述操作后,就能通过域名直接访问NextCloud咯 :idea:

错误解决

Docker版的错误数量比传统方式安装少很多。修改/Nextcloud路径/data/config/config.php的这几条,前几条可永久性解决的参见GuGu

##错误1、你的实例正生成不安全的URL##
'overwrite.cli.url' => 'https://你的域名',
'overwriteprotocol' => 'https',
##错误2、您的安装没有设置默认的电话区域##
'default_phone_region' => 'CN',
##错误3、未正确设置以解析……##
#在NPM的高级中加入
location = /.well-known/carddav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }
location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }

------------------------分割线------------------------

##优化1、通过Redis加快访问速度##
#安装Redis的docker命令
docker run -d \
 --security-opt seccomp:unconfined \   //允许仍被任何容器调用
 --restart=always \
 --name Redis \
 --network nextcloud_default \   //使用与NextCloud同一网络
 --ip 172.20.0.5 \   //与NextCloud同一网段内
 -p 6379:6379 \
  redis:latest
#后台查看Redis是否启动
docker ps -a
#替换"/nextcloud路径/data/config/config.php"头部文件来连接Redis
<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.local' => '\OC\Memcache\Redis',
  'memcache.distributed' => '\OC\Memcache\Redis',
  'memcache.locking' => '\OC\Memcache\Redis',
  'redis' => array(
  'host' => '172.20.0.5',   //同上
  'port' => 6379,
  ),
#退出容器
exit

##优化2、显示PDF和视频的缩略图##
#编辑"/nextcloud路径/data/config/config.php",在最后加入显示缩略图命令
  'enabledPreviewProviders' =>
   array (
     0 => 'OC\\Preview\\PNG',
     1 => 'OC\\Preview\\JPEG',
     2 => 'OC\\Preview\\GIF',
     3 => 'OC\\Preview\\HEIC',
     4 => 'OC\\Preview\\BMP',
     5 => 'OC\\Preview\\XBitmap',
     6 => 'OC\\Preview\\MP3',
     7 => 'OC\\Preview\\TXT',
     8 => 'OC\\Preview\\MarkDown',
     9 => 'OC\\Preview\\Movie',
    10 => 'OC\\Preview\\PDF'
   ),
#重启容器
docker-compose restart

接下来解决的是以后每次更新容器都要操作的,我把代码整合了下,一遍通过系统检查以及完成优化

##错误4、php-imagick 模块不支持 SVG模块不支持SVG##
##优化3、后台任务优化,选择Cron方式##
#进入容器
docker exec -it <docker名字> bash
#更新容器系统以及安装对应插件
apt update -y && apt install libmagickcore-6.q16-6-extra cron nano sudo ffmpeg ghostscript -y
#编辑"/etc/ImageMagick-6/policy.xml"把默认阻止PDF显示缩略图的命令标记掉(靠近最后位置)
<!--  <policy domain="coder" rights="none" pattern="PDF" /> -->
#先执行命令测试看是否报错,*注意必须加上解除PHP内存限制参数,否则会报错*
sudo -u www-data -s /bin/bash -c 'PHP_MEMORY_LIMIT=512M php -f /var/www/html/cron.php'
#若上述任务无报错,则添加每5分钟执行一次
crontab -e
*/5 * * * * sudo -u www-data -s /bin/bash -c 'PHP_MEMORY_LIMIT=512M php -f /var/www/html/cron.php'
#退出容器
exit
#重启容器
docker-compose restart

更新

前言说到普通安装在后续更新上需要更新本体及环境,而docker版在更新上就简单很多了,按下列步骤更新即可

#进入nextcloud的yml目录
cd /root/data/docker_data/nextcloud
#拉取最新镜像
docker-compose pull
#启动容器,即完成更新
docker-compose up -d

更新24.0.0过程

更新24.0.0版本遇到得新报错

##错误5、数据库丢失了一些索引。由于给大的数据表添加索引会耗费一些时间,因此程序没有自动对其进行修复。您可以在 Nextcloud 运行时通过命令行手动执行 "occ db:add-missing-indices" 命令修复丢失的索引。索引修复后会大大提高相应表的查询速度。
在数据表 "oc_direct_edit" 中无法找到索引 "direct_edit_timestamp"。##
#在宿主机执行以下命令
docker exec --user www-data nextcloud-app php occ db:add-missing-indices   //nextcloud-app替换为docker容器名字
#执行命令后会会自动修复索引,看到下图就好了#

多用户下的默认文件

多用户使用情形下,每个新用户都会看到Nextcloud的默认文件,这些文件的路径在/data/core/skeleton下,可以删除来实现不加载默认文件也可以替换成自己需要放置的默认文件

最后

Docker的加持下,Nextcloud在安装及更新的步骤大幅简化。另外希望官方镜像能把那些小问题一起打包,这样后续就不用每次都来一遍啦 :oops:

另外非常感谢GuGu,从他这里学到很多关于Docker 的有趣的知识!

 

 

发表评论

textsms
account_circle
email

Joynaruto

Docker容器之Nextcloud搭建
前言 上次写过一篇NextCloud的搭建教程,这么久使用下来感觉非常棒。从网页端到WebDav端以及手机端的体验行云流水,外加OnlyOffice的在线多人编辑也非常舒服。但这种安装方式在服务器迁…
扫描二维码继续阅读
2022-05-02