wikijs 的跨主机迁移

前人之述备矣:

然两位作者都是基于官方教程里 Install on Ubuntu 18.04 / 20.04 LTS | Wiki.js 一步步而来。这部教程里的 Postgres 镜像版本、数据库用户名和密码都和我们使用的、由 docker-compose Docker | Wiki.js 编排的内容不同,因此实际操作起来细节稍有不同(主要是数据库的恢复部分)。

所以基于 docker-compose 的修改如下:

  1. 保证新旧主机的 docker-compose.yml 相同
  2. 在新主机使用 docker-compose up -d 建立 wikijs,保证访问 80 端口时可以看到正确的管理员注册页面,wikijs_wiki_1 和 wikijs_db_1 均运行中
  3. 【旧主机】 docker exec wikijs_db_1 pg_dump wiki -U wikijs -F c > wikibackup.dump
  4. 把 dump 文件传到新主机
  5. 【新主机】docker stop wikijs_wiki_1 把 web 服务的容器停下来
  6. 【新主机】docker cp <dump文件> wikijs_db_1:/tmp/. 把 dump 文件传进容器
  7. 【新主机】docker exec -it wikijs_db_1 /bin/bash 进入 postgres 的容器

   

  • dropdb -U wikijs wiki 把新主机自动建立的数据库删掉

   

  • createdb -U wikijs wiki 建一个干净的相同数据库

   

  • pg_restore -d wiki /tmp/wikibackup.dump -U wikijs 用 dump 文件恢复数据库
  1. 【新主机】docker start wikijs_wiki_1 把 web 服务的容器开起来,观察 docker logs wikijs_wiki_1 有没有报错

   

另外,wikijs 的 Letsencrypt 自动脚本非常赞,在 docker-compose.yml 中设好参数,web 服务拉起来的时候就自动配置完成,巴适!

P.S. docker-compose 使用卷标持久化时,查看本地绝对路径的方法:

# 查看列表
docker volume ls
# 查看详情
docker volume inspect <name>
# 删除
docker volume rm <name> # 使用中的卷标无法删除

我的情况中,绝对路径在 /var/lib/docker/volumes/.

P.P.S. 在另一次 无比傻逼 的操作下,重新部署 wikijs 时,把 nginx 也干脆容器化,坑就来了。

  • 由于在 nginx 中做了反向代理,所以 wikijs 的 letsencrypt 脚本不好用了(之前 wikijs 是 443:3443 的端口因此自带的 httpd 直接挂载证书)。需要手动在 nginx 中添加证书、proxy_pass 以及设定 http->https 的跳转
  • nginx 容器化后,proxy_pass 就不能指向 localhost,而应该是 docker0 网卡所在的 IP。挂载证书时也需要使用容器内的路径
  • 痛定思痛,wikijs 的数据库文件很脆弱,git 上虽然内容都在,但系统配置、用户权限和页面导航都没了…… 所以如果不能迁移到云数据库,postgres 的定期备份必不可少
Comments
Write a Comment
'