讲道理,迁移这玩意比迁移一个 WordPress 麻烦多了。
以下记录仅作为记录,因为迁移配置的环境实在不是很通用。
简单来说,我需要做的一件事是在两台我都没有 root 权限的服务器上迁移一个 MediaWiki 站点。理论上来说,按照官方提供的文档可以很简单地完成这件事,但是其中有一些细节还是需要注意。
从一个比较 high-level 的层面上来说,迁移需要做三件事,导出数据库、移动文件、导入数据库。很简单对吧,然而在两边的 web 环境不一致且不可能完全自己重装的时候,这个问题就不那么简单了。
遇到的第一个问题是,目标环境中的 PHP 没有安装 SQLite 模块,这就意味着必须使用 MySQL 作为数据库后端不能有一个较为 portable 的实现。但是很快就发现,该目标机上没有一个运行的 mysqld 进程,也就意味着我必须在没有 root 权限的情况下运行一个完整的 MySQL session。好在已经有人做过这件事,因此也找到了对应的命令:
首先初始化 MySQL 的环境,这里假定我们所有的文件都保存在 $HOME/mysql 下,使用如下命令运行 mysqld 进行初始化:
MYSQL_HOME=/homes/<user>/mysql
BASE_DIR=$MYSQL_HOME
DATADIR=$BASE_DIR/data
mysqld --user=asset-wiki-admin --datadir=$DATADIR --basedir=$MYSQL_HOME --log-error=$MYSQL_HOME/log/mysql.err --pid-file=$MYSQL_HOME/mysql.pid --socket=$MYSQL_HOME/socket --port=32303 --initialize
之后会生成一个默认的 root 密码在 mysql/log/mysql.err 最后一行,去把它记下来,之后会用到。
然后普通运行 mysqld 可以使用如下命令:
MYSQL_HOME=/homes/<user>/mysql
BASE=$MYSQL_HOME
/usr/sbin/mysqld --datadir=$BASE/data --basedir=$BASE --log-error=$BASE/log/mysql.err --pid-file=$BASE/mysql.pid --socket=$BASE/socket --port=32303 &
停止 mysqld 使用如下命令:
MYSQL_HOME=/homes/<user>/mysql
BASE=$MYSQL_HOME
/usr/bin/mysqladmin --socket=$BASE/socket shutdown -u root -p
如果要不使用交互式密码登录,那么将 -p 命令替换成 -ppassword,这里假定密码就是 password,注意这里不要空格。
如果要启动一个 MySQL 实例,那么这么做:
MYSQL_HOME=/homes/<user>/mysql
BASE=$MYSQL_HOME
/usr/bin/mysql --socket=$BASE/socket --port=32303 -u root -p
注意 32303 是我随便选的本地监听端口,可以换成任意一个可用端口。
在完成本地数据库环境搭建以后,在源服务器上 dump 数据库,在目标服务器上创建数据库和用户并授予权限,之后按照文档中的命令将其导入。
下一步就是在 web server 的目录中放入 MidiaWiki 的文件,然后访问网址进行自动安装,在填写了数据库密码之后,会自动进行数据库的适配过程。之后就会生成当前的 LocalSettings.php 文件。
为了保持原始的设定,我们可以将源服务器上的 LocalSettings.php 拷贝过来,并且将里面的内容根据新的环境做一些修改。需要修改的变量在这里可以看到。主要是修改一些路径相关的文件夹和数据库的连接方式。到这里理论上就可以结束了,但是还要记录一些问题。
关于 PDF 缩略图的生成,MediaWiki 默认通过 PdfHandler 这个插件基于 ImageMagick 和 GhostScript 完成转换和生成工作。这个需要注意的是 $wgMaxShellMemory 这个配置项,可以调整为 ‘unlimited’,以免生成时出现类似
Error creating thumbnail: convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/504. convert: no images defined `/tmp/transform_efffbb473a62.jpg' @ error/convert.c/ConvertImageCommand/3258
这样的错误。
另外一个需要注意的问题是,ImageMagick 可能禁止转换 PDF 文件,具体要查看 /etc/ImageMagick/policy.xml 或者通过 convert -list policy 查看,确认 PDF 格式的权限是 Read|Write 而非 none。如果系统配置为 none,如没有 root 权限,只能编译安装 ImageMagick,注意一定要做一个 module build。
之后在 ~/.config/ImageMagick/policy.xml 中写入对应的配置就可以了。
另外一个错误是:
Notice: Undefined offset: 0 in /home/asset-wiki/htdocs/includes/libs/mime/MimeAnalyzer.php on line 809
这个是 MediaWiki 1.33 和 PHP 兼容性导致的。具体参考这里的改动。主要就是将 809 行最后的 [0] 改成 [1] 就能解决问题。
如果上传一个 pptx 文件的时候 wiki 报错认为 MIME 类型是 application/zip,这个是 PHP fileinfo 模块的锅,可以用 $wgVerifyMimeType = false; 强行关闭 MIME 类型检查。具体看这里。