[教程]nextcloud从代码部署迁移到docker部署

写在前面

听说docker方便,很久以前就听说nextcloud有docker版本,但是一直对docker有点怕(不熟练,233)

纯代码部署迁移实在麻烦,以至于我的nextcloud还停留在14版本。

这回感觉nextcloud20版本功能似乎增加了不少。于是想着给它升级一下。

开始吧

一.对原来的数据库文件进行备份,我原料用的是宝塔,备份很方便。

下载下来,是gz压缩包。解压得到.sql的数据库文件

二.在新服务器上进行

1.安装docker:

apt -y update #centos用apt换成yum
apt -y install curl #centos用apt换成yum
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

2.安装docker-compose:

curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 

chmod +x /usr/local/bin/docker-compose

3.docker nextcloud相关内容要存放的位置,我给他设定在/www/docker下

不确定是否需要提前创建好目录,在此,我先建好了相关目录

mkdir -p /www/docker 
mkdir -p /www/docker/config
mkdir -p /www/docker/data
mkdir -p /www/docker/www

4.新建docker-compose配置文件

nano /www/docker/docker-compose.yml

5.粘贴配置文件内容:

version: '2'
services:
db:
image: mariadb
restart: always
volumes:
- /www/docker/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=nextcloud
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud:14.0.14 (备注,括号的都要删除,别留着配置文件中:20.0.0,设置你要的版本号。建议选择和你原来代码部署同版本,nextclud提示,逐级升级,如14->15->16……)
ports:
- 7009:80
links:
- db
volumes:
- /www/docker/www:/var/www/html
- /www/docker/data/:/var/www/html/data
- /www/docker/config:/var/www/html/config
restart: always

6.拉取

docker-compose up -d

到这里,如果不是迁移,只是新玩docker nextcloud的话,已经可以通过ip:7009访问,并新装nextcloud了(数据库位置不是localhost,而是db)

7.导入数据库

把备份的sql数据库文件,先上传到小鸡的某个地方,如,我的,/www/docker/yun.sql

运行一下,看看自己的容器名是啥

docker ps

你docker-compose配置文件yml,放的和我不同名目录下,在此应该能看到你自己的容器名。

然后拷贝数据库备份至容器应用中:

docker cp /www/docker/yun.sql docker_db_1:/opt/yun.sql

进入数据库容器,并恢复数据库:

#进入数据库容器
docker exec -it docker_db_1 /bin/bash
#导入数据
mysql -u root -p
#输入密码 root

mysql> use nextcloud
mysql> source /opt/yun.sql

#退出数据库操作
mysql> exit

#在退出数据库容器
exit

8.进入nextcloud容器,并恢复/config/config.php配置文件

你自己的config.php,如有一下,把他注释掉或删掉,可能会存在问题:

docker exec -it docker_app_1 /bin/bash

#我喜欢用nano,nextcloud容器没有,安装它
apt update
apt install nano -y

#回复配置文件config.php
nano /var/www/html/config/config.php

#把原来代码部署的该文件中内容贴进去,建议用你自己原来的,开了
大致如下:
'passwordsalt' => '一大串文本',
'secret' => '一大串文本',
'datadirectory' => '/var/www/html/data',
'overwrite.cli.url' => 'http://127.0.0.1:7009',
'dbtype' => 'mysql',
'version' => '14.0.14',
'dbname' => 'nextcloud',
'dbhost' => 'db',
'dbport' => '',
'dbtableprefix' => 'oc_',
'dbuser' => 'nextcloud',
'dbpassword' => 'nextcloud',
'installed' => true,
'theme' => '',
'loglevel' => 0,
'maintenance' => false,

8.2还有一种办法,不去docker里搞,直接在/www/docker/config/config.php也可以

但需要更正一下权限

进到docker_app_1容器里去修改的权限

docker exec -it docker_app_1 /bin/bash
chown -R www-data /var/www/html/config/config.php

9.升级数据库,以后,每升级一个版本,都需运行一下下面的命令,一下不行,二下,三下。

版本17->18实在不行,往下看

docker exec -u www-data -ti docker_app_1 php occ upgrade

应该已经能正常访问了ip:7009

更改docker-compose.yml中的nextcloud版本号,逐级,如原14,改成15

运行,即可拉取并运行新一个版本的nextcloud,别忘记升级一下数据库

docker-compose down && docker-compose up -d

docker exec -u www-data -ti docker_app_1 php occ upgrade

10.在升级过程中,有几个版本有报错,再次运行这升级命令,得到解决。

但是在17->18时,再次运行升级命令也无效,放狗搜索了下,得到解决办法

Upgrade fails with – Column name “oc_flow_operations.entity” is “NotNull”, but has empty string or null as default

https://github.com/nextcloud/server/issues/23174

解决办法如下,一条条运行:

 docker exec -u docker_db_1 /bin/bash            
 
mysql -u root -p
 
use nextcloud
 
alter table oc_flow_operations add column entity character varying(256) not null;

再次使用升级命令,成功升级

 docker exec -u www-data -ti docker_app_1 php occ upgrade 

写在下面:

目前,我已经把nextcloud版本14->15->16->17->18->19->20,逐级升级到了20.0