Strapi 04 :: Strapi数据的Migration

2,223 阅读3分钟

1. 概览

在本系列的第一篇文章中,已经提到过,截止到现在Strapi的最新版本还不支持自动migration数据,所以我们需要手动migration数据到目标机。

那么什么是Migration?

简单来说,就是把现有的整个网站的数据从一台服务器移植到另一台服务器上。

E.g. 假如,按照我们先前的介绍,我们在ServerA上setup了一套Strapi的app,然后在ServerA上进行了一系列的开发,之后由于某些需求的改变,或者是部署环境的改变,我们需要把整个已有的Strapi系统移植到ServerB上,这个整个的过程称之为Migration。

基于MongoDB的现有方案

既然Strapi现在没有提供成熟的解决方案,那么只有自己动手丰衣足食。根据前面几篇文章的介绍,整个Strapi的App有两部分组成:Stapi网站和mongoDB(我们之前使用了MongoDB),所以我们的方案就是migrate这两部分的数据。

注意:本文基于您是使用linux操作系统的假设编写的,而且您最好是follow我们本系列前几篇文章来搭建整个Strapi系统。

如果有疑问的话,可以直接联系我,我很愿意帮您解决您在实际应用过程中遇到的问题。

2. 先决条件

  • MongoDB Database Tools
  • mongodump —— 用于dump整个数据库的数据
  • mongorestore —— 用于restore整个数据库的数据

3. Dump原有服务器上的数据

3.1 执行下面代码,dump整个MongoDB

mongodump --uri="mongodb://localhost:27017" -u=strapi -p=strapi --authenticationDatabase=admin -d=strapi -o="./dump"

3.2 打包已经dump的MongoDB的数据

tar -czvf dump.tar.gz ./dump

3.3 备份Strapi网站的必要数据

  • 删除node-modules文件夹
    # 进入Strapi网站所在文件夹,我的系统中,这个文件夹是strapistrapi-app
    cd strapistrapi-app
    rm -fr node_modules
    cd ..
    
  • 打包整个网站
    # strapistrapi-app是strapi网站所在的文件夹
    tar -czvf strapi.tar.gz ./strapistrapi-app
    

4. 在目标机器上restore数据

4.1 使用docker-compose启动Strapi

您可以follow前几篇文章,通过docker-compose启动整个strapi,或者通过git获取这个repo,执行其中的start.sh

4.2 暂停Strapi的container

# 您需要首先运行docker ps查看strapi container的id
docker stop <strapi container id>

4.3 在mongo container中删除strapi的数据库

# 您需要首先运行docker ps查看mongo container的id
docker exec -it <mongo container id>
# 在repo中,docker-compose文件中指定了mongoDB的默认用户名密码均为strapi
mongo -u strapi -p strapi
use strapi
db.dropDatabase()

4.4 Copy strapi.tar.gz & dump.tar.gz到目标机器

strapi.tar.gz & dump.tar.gz是3.3中生成的strapi网站和mongoDB的dump数据。

4.5 解压上述两个文件

# 解压strapi
tar -xzvf strapi.tar.gz
# 解压mongoDB
tar -xzvf dump.tar.gz

4.6 执行restore命令

# 如果您clone了之前提到的repo,可以直接执行其中的restore文件
./restore.sh

# 否则,您需要执行以下命令
mongorestore --uri="mongodb://localhost:27017" -u=strapi -p=strapi --authenticationDatabase=admin dump/

4.7 重新启动整个Strapi网站

# 如果您clone了之前提到的repo,可以直接执行其中的start文件
./start.sh

# 否则,您需要执行以下命令
docker-compose up -d