This page looks best with JavaScript enabled

未落盘的禅道平台迁移与升级

 ·  ☕ 5 min read

更新记录

时间 内容
2021-11-01 初稿
2021-11-02 数据还原 && 添加图片

软件版本

soft Version
CentOS 7.7
zentao 10.0.beta –> 12.4
docker-ce 19.03.5

楔子

最近在接手前同事离职留下的摊子以后,梳理环境的时候发现,我们测试用的禅道平台是跑在单容器里面的。最重要的一点是没有将数据落盘!!!并且这个容器运行的非常不规范!所有的数据,不管是文件也好、数据库也好都存放在这个容器中,并且进程也不是单进程模型,所有的进程都跑在一个容器中。所以我最近就有点担惊受怕的,生怕哪天容器挂掉起不来以后数据就没了。而且最近harbor也碰到一个问题,需要升级一下docker版本才能解决,我在另一篇blog里说了这个问题了。所以在docker升级前,我们需要先把禅道平台数据迁移出来,规范化一下。

数据备份

根据我查阅了一下 禅道官网的说明,禅道平台的所有数据备份都可以在平台上操作,包括文件、SQL、以及代码文件。这个就很方便。

①平台的具体操作入下,登入 –> 后台 –> 备份 –> 备份

禅道备份

备份完成以后

备份完成

②我们看到备份都放在这个路径 /opt/zbox/app/zentao/tmp/backup/ 下了,我们需要将备份从容器中拷贝出来,当然容器中的路径跟这个路径是不一样的,我们需要一点儿步骤找到它。

 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
53
54
55
56
57
58
59
60
# 首先通过 docker命令 查到禅道的 CONTAINER ID
➜  docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                            PORTS                                 
21a25881f926        7698f282e524                         "/bin/bash"              2 years ago         Up 8 hours                        0.0.0.0:2224->22/tcp, 0.0.0.0:8882->80/tcp   charming_zhukovsky

# 根据 CONTAINER ID 查到 overlay2 目录
➜  docker inspect 21a25881f926 | grep overlay2
        "Driver": "overlay2",
                "LowerDir": "/var/lib/docker/overlay2/c8b1b6cc638f9e35e8160307e4d7c9e00eddd0301f6850ae4cfc81d44fde2009-init/diff:/var/lib/docker/overlay2/30a7dec35321d406e2b794014c92065ea23b39a4bd9ebab3d5b6068ffb6af8ed/diff:/var/lib/docker/overlay2/2403186130d5bb34cf9c91d627e51ff032f4f0b1282bfd0543f95dc19af5aba9/diff:/var/lib/docker/overlay2/9bae2111fcf6dc308b6f357605046162ec6a2858a0f2d5c207acb9a758492237/diff",
                "MergedDir": "/var/lib/docker/overlay2/c8b1b6cc638f9e35e8160307e4d7c9e00eddd0301f6850ae4cfc81d44fde2009/merged",
                "UpperDir": "/var/lib/docker/overlay2/c8b1b6cc638f9e35e8160307e4d7c9e00eddd0301f6850ae4cfc81d44fde2009/diff",
                "WorkDir": "/var/lib/docker/overlay2/c8b1b6cc638f9e35e8160307e4d7c9e00eddd0301f6850ae4cfc81d44fde2009/work"
            "Name": "overlay2"

# 进入 Docker Root Dir 下的 overlay2 路径cd /var/lib/docker/overlay2/

# 进入 容器overlaycd c8b1b6cc638f9e35e8160307e4d7c9e00eddd0301f6850ae4cfc81d44fde2009

➜  ll
total 20
drwxr-xr-x 9 root root 4096 Nov  1 14:55 diff
-rw-r--r-- 1 root root   26 Aug 26  2019 link
-rw-r--r-- 1 root root  115 Aug 26  2019 lower
drwxr-xr-x 1 root root 4096 Nov  1 14:55 merged
drwx------ 3 root root 4096 Nov  1 14:59 work

# 进入到diff 目录以后我们发现这个目录 与我们容器中的目录一致了。cd diff
➜  ll
total 11304
drwxr-xr-x 7 root root     4096 Aug 26  2019 etc
drwxr-xr-x 3 root root     4096 May 23  2017 lib
drwxr-xr-x 3 root root     4096 Aug 26  2019 opt
drwx------ 2 root root     4096 Nov  1 17:40 root
drwxrwxrwt 2 root root     4096 Nov  1 15:01 tmp
drwxr-xr-x 7 root root     4096 May 15  2019 usr
drwxr-xr-x 5 root root     4096 May 15  2019 var
-rw-r--r-- 1 root root 11542704 Nov  1 14:55 zentao_20211101.sql

# 现在输入 禅道平台上的备份路径,并将备份文件拷出来。cd opt/zbox/app/zentao/tmp/backup/
➜  ll
total 11139612
-rwxrwxrwx 1 65534 65534    5844197 Oct 30 00:34 202110300030217.code.zip.php
-rwxrwxrwx 1 65534 65534 2821763349 Oct 30 00:34 202110300030217.file.zip.php
-rwxrwxrwx 1 65534 65534   24113572 Oct 30 00:30 202110300030217.sql.php
-rwxrwxrwx 1 65534 65534    5844197 Oct 31 00:34 202110310030230.code.zip.php
-rwxrwxrwx 1 65534 65534 2821763349 Oct 31 00:34 202110310030230.file.zip.php
-rwxrwxrwx 1 65534 65534   24113572 Oct 31 00:30 202110310030230.sql.php
-rwxrwxrwx 1 65534 65534    5844197 Nov  1 00:34 202111010030236.code.zip.php
-rwxrwxrwx 1 65534 65534 2821763349 Nov  1 00:34 202111010030236.file.zip.php
-rwxrwxrwx 1 65534 65534   24113572 Nov  1 00:30 202111010030236.sql.php
-rw-r--r-- 1 65534 65534    5844197 Nov  1 22:36 202111012231212.code.zip.php     #
-rw-r--r-- 1 65534 65534 2821763587 Nov  1 22:35 202111012231212.file.zip.php     # 我们已经看到我们的备份文件了
-rw-r--r-- 1 65534 65534   24114752 Nov  1 22:31 202111012231212.sql.php          #

# 备份数据文件
➜  mkdir -p ~/zentao.backup; mv 202111012231212* ~/zentao.backup

数据还原

我通过官网得知,我当前的禅道版本其实有点低了,而且是有官方的Docker版的,并且数据库支持使用外部数据库,并且数据目录也可以挂载出来。这个就很奈斯,支持一波。

通过查看 DockerHub-禅道平台官方镜像列表,我们选择一个比较新的稳定版12.4.stable

①我们将它拉取到本地

1
➜  docker pull easysoft/zentao:12.4.stable

②将容器运行起来前,我们需要将数据库以及宿主机目录创建好

1
2
➜  mkdir -p /data/zentao.mysql
➜  mkdir -p /data/zentao.pms

③运行容器

1
➜  docker run --name zentao -p 8883:80 -v /data/zentao.pms:/www/zentaopms -v /data/zentao.mysql:/var/lib/mysql -d easysoft/zentao:12.4.stable

④现在我们可以通过访问 http://[宿主机]:8883 来安装禅道了,打开这个网址经过一些列的安装步骤以后,我们成功登陆了禅道平台。这个界面很干净。

12.4首页

⑤文件还原

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 先将文件备份 拷贝至新版禅道的数据目录
➜  cp ~/zentao.backup/*.file.zip.php /data/zentao.pms/www/data

# 将文件备份 中的第一行删除cd /data/zentao.pms/www/data
➜  sed -i '1d' 202111012231212.file.zip.php

# 将文件备份 改为zip文件
➜  mv 202111012231212.file.zip.php 202111012231212.file.zip
➜  ll
total 2755648
-rw-r--r-- 1 root root 2821763572 Nov  2 14:12 202111012231212.file.zip
-rwxrwxrwx 1   33   33          0 Jul 28  2020 index.html
drwxrwxrwx 2   33   33       4096 Jul 28  2020 notify
drwxrwxrwx 3   33   33       4096 Nov  2 14:07 upload
drwxrwxrwx 2   33   33       4096 Jul 28  2020 xuanxuan

# 解压
➜  unzip 202111012231212.file.zip

⑥数据库还原

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 将SQL文件 拷贝至新版禅道的目录
➜  cp ~/zentao.backup/*.sql.php /data/zentao.pms/

# 处理备份文件cd /data/zentao.pms/
➜  sed -i '1d' 202111012231212.sql.php
➜  mv 202111012231212.sql.php 202111012231212.sql

# 进入到容器内部 导入SQL数据
➜  docker exec -it zentao /bin/bash
➜  /usr/bin/mysql -uroot -p'123456' zentao < /www/zentaopms/202111012231212.sql

禅道升级

我本以为将数据导入以后就成功了,但没想到这里有一个小坑,将数据导入以后再打开禅道访问地址,会跳到一个空白页面,访问地址后会自动跳转到 http://172.31.229.139:8883/upgrade.php, 我以为是我导入数据的问题,在这里我尝试了官网以及各篇博文找到的各种导入方式都不成功。

页面无法打开

后来我还是虚心的向开发者求助,才解决了问题。

交流-01
交流-02
交流-03

在www目录下创建upgrade.php

 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 进入到宿主机映射目录 创建upgrade.phpcd /data/zentao.pms/www/
➜  vim upgrade.php

<?php
/**
 * The upgrade router file of ZenTaoPMS.
 *
 * @copyright   Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
 * @license     ZPL (http://zpl.pub/page/zplv12.html)
 * @author      Chunsheng Wang <chunsheng@cnezsoft.com>
 * @package     ZenTaoPMS
 * @version     $Id: upgrade.php 4677 2013-04-26 06:23:58Z chencongzhi520@gmail.com $
 * @link        http://www.zentao.net
 */
/* Judge my.php exists or not. */
define('IN_UPGRADE', true);
$dbConfig = dirname(dirname(__FILE__)) . '/config/db.php';
if(file_exists($dbConfig))
{
    $myConfig = dirname(dirname(__FILE__)) . '/config/my.php';
    if(file_exists($myConfig))
    {
        $myContent = trim(file_get_contents($myConfig));
        $myContent = str_replace('<?php', '', $myContent);
    }

    if(!@rename($dbConfig, $myConfig))
    {
        $configDir = dirname(dirname(__FILE__)) . '/config/';
        echo "请执行命令 chmod 777 $configDir 来修改权限,保证禅道在该目录有操作文件权限" . "<br />";
        echo "Please execute the command 'chmod 777 $configDir' to modify the permissions to ensure that the ZenTao has operating file permissions in this directory";
        exit;
    }

    if(!empty($myContent))
    {
        $myContent = file_get_contents($myConfig) . "\n" . $myContent;
        file_put_contents($myConfig, $myContent);
    }
}

error_reporting(0);

/* Load the framework. */
include '../framework/router.class.php';
include '../framework/control.class.php';
include '../framework/model.class.php';
include '../framework/helper.class.php';

/* Instance the app. */
$app = router::createApp('pms', dirname(dirname(__FILE__)), 'router');
$common = $app->loadCommon();

/* Reset the config params to make sure the install program will be lauched. */
$config->set('requestType', 'GET');
$config->set('default.module', 'upgrade');
$app->setDebug();

/* Check the installed version is the latest or not. */
$config->installedVersion = $common->loadModel('setting')->getVersion();
if(($config->version{0} == $config->installedVersion{0} or (is_numeric($config->version{0}) and is_numeric($config->installedVersion{0}))) and version_compare($config->version, $config->installedVersion) <= 0) die(header('location: index.php'));

/* Run it. */
$app->parseRequest();
$common->checkUpgradeStatus();
$app->loadModule();

现在已经可以进入到升级页面了

升级页面-01

页面提示要创建文件,下面开始创建

1
2
3
# 进入到宿主机映射目录 创建ok文件cd /data/zentao.pms/www/
➜  touch ok.txt

创建以后,点击升级按钮,开始一系列的升级步骤。

升级页面-02
升级页面-03
升级页面-04

终于看到成功的提示了。

升级页面-05

进入到主界面以后发现数据全部恢复回来了。

升级后主界面

Support the author with
alipay QR Code
wechat QR Code

fage
WRITTEN BY
fage
DevOps

What's on this Page