前人之述备矣:
- 热心网友的 Migrate Wiki.js from one server to another [INSTRUCTIONS] ✅ · Issue #2403 · Requarks/wiki · GitHub
- 官方整理的 Transfer Wiki.js between servers | Wiki.js
然两位作者都是基于官方教程里 Install on Ubuntu 18.04 / 20.04 LTS | Wiki.js 一步步而来。这部教程里的 Postgres 镜像版本、数据库用户名和密码都和我们使用的、由 docker-compose Docker | Wiki.js 编排的内容不同,因此实际操作起来细节稍有不同(主要是数据库的恢复部分)。
所以基于 docker-compose 的修改如下:
- 保证新旧主机的 docker-compose.yml 相同
- 在新主机使用
docker-compose up -d
建立 wikijs,保证访问 80 端口时可以看到正确的管理员注册页面,wikijs_wiki_1 和 wikijs_db_1 均运行中 - 【旧主机】
docker exec wikijs_db_1 pg_dump wiki -U wikijs -F c > wikibackup.dump
- 把 dump 文件传到新主机
- 【新主机】
docker stop wikijs_wiki_1
把 web 服务的容器停下来 - 【新主机】
docker cp <dump文件> wikijs_db_1:/tmp/.
把 dump 文件传进容器 - 【新主机】
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 文件恢复数据库
- 【新主机】
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