由于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容器,就可以登录原来的账号,也可以看到之前的文档内容了。