CodiMD迁移到HedgeDoc

由于CodiMD已经近一年没更新了,更新频率远不如HedgeDoc(虽然现在的功能也够用),于是我迁移到了HedgeDoc。

创建容器

根据官方文档,写一个docker-compose.yaml:

version: '3'
services:
  app:
    # Make sure to use the latest release from https://hedgedoc.org/latest-release
    image: quay.io/hedgedoc/hedgedoc:latest
    environment:
      - CMD_DB_URL=postgres://USERNAME:PASSWORD@172.17.0.1:5432/hedgedoc
      - CMD_DOMAIN=codimd.domain
      - CMD_URL_ADDPORT=false
      - CMD_PROTOCOL_USESSL=true
      - CMD_LOGLEVEL=debug
      - CMD_ALLOW_ANONYMOUS=false
      - CMD_ALLOW_ANONYMOUS_EDITS=false
      - CMD_ALLOW_EMAIL_REGISTER=false
      
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3001:3000"
    restart: always
volumes:
  uploads:

其中,CMD_DOMAIN指向我现在的CodiMD的域名,同时关闭匿名功能与注册功能。宿主系统的3000端口目前被CodiMD的端口转发占用着,于是使用3001。

接下来,启动容器。根据容器log中的输出内容,可能会出现数据库转换脚本运行错误的情况,可以根据 https://docs.hedgedoc.org/guides/migration-troubleshooting/ 的方法,在SequelizeMeta表中加入一行对应的js文件名。

反向代理

根据https://docs.hedgedoc.org/guides/reverse-proxy/的写法,修改原有的CodiMD域名的nginx配置,反向代理至HedgeDoc的3001端口。

此时访问域名,应该能够正常进入HedgeDoc的页面。

迁移数据库

现在,HedgeDoc的数据库的内容还是空的,需要将原先CodiMD的数据库迁移过来。开始迁移之前,先关掉HedgeDoc的容器。

我将CodiMD的数据库放在MySQL中,而现在HedgeDoc的数据库则放在PostgreSQL中。

迁移需要使用pgloader。

pgloader mysql://myuser:password@172.17.0.1/codimd pgsql://pguser:password@172.17.0.1/hedgedoc

进入PostgreSQL数据库,可以看到多了一个名为codimd的模式,其中的表就是原本CodiMD数据库中的表,而HedgeDoc的表则放在public模式中。codimd模式中的表与public模式中的表可以一一对应,主要区别只有两个:
1. codimd模式中的表的名称是全小写(例如users),而public模式中的表的名称是大写开头(例如Users);
2. 部分字段的数据类型有区别,例如codimd.users.id是bpchar(36)类型,而public.Users.id是uuid类型,在迁移时需要进行转换。

以codimd.users迁移到public.Users为例,sql语句可以这么写:

TRUNCATE TABLE public."Users";
INSERT INTO public."Users"
SELECT id::text::uuid, profileid, profile, history, createdat, updatedat, accesstoken, refreshtoken, email, "password", deletetoken::text::uuid
FROM codimd.users;;

第一条语句是清空public.Users表中的数据,第二条语句是从codimd.users选择所有数据并插入到public.Users中,其中的id和deletetoken两个字段需要转换为uuid类型。

除了sequelizemeta表和sessions表以外,其他表都需要进行如此迁移。尤其不能迁移sequalizemeta表,否则会导致HedgeDoc启动错误。

再次打开HedgeDoc容器,就可以登录原来的账号,也可以看到之前的文档内容了。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注