前言
24年8月,因为Wifi棒子断电重启后无法自动回连Wifi,博客站就迁移到了一块847工控板上。
一开始一切运行正常,但到了25年初,工控板经常异常死机,死机时用手摸一下还会自动重启,怀疑是板子电气性能不佳,遂计划把博客站迁移到其他设备上。
但是开始迁移时却被一些问题卡住了,届时正值找工作比较忙,于是就先作罢,博客站就此荒废了几个月的时间。
这个周末和盒子里的847工控板大眼瞪小眼看了许久,决定把它收拾了,就有了本篇。
预先准备
- 我的博客数据库使用SQLite,所以至少应该保留类似
66ba4f5eec6c5.db这样的数据库文件。文件的路径通常在typecho\usr下。 - 如果你想保留之前的主题,还需要保留整个
typecho\usr\themes文件夹 运行博客的新机器上需要先装好docker,为了方便今后的数据迁移,我们使用docker部署
使用Docker部署时,建议直接使用docker compose,方便后续维护。compose文件如下:services: typecho: image: joyqi/typecho:nightly-php7.4-apache container_name: typecho-server restart: always environment: - TYPECHO_SITE_URL=https://xxx.xxx ports: - 8634:80 volumes: - ./typecho:/app对比文档里的写法,我们去掉了头部过时的版本声明,修改了宿主机端口,并挂载出了整个/app(也就是Typecho应用程序根目录)。
挂载出整个/app的好处有以下两点:如果你的域名使用https,就需要编辑config.inc.php;如果你想迁移主题包,还需要编辑typecho\usr\themes文件夹,那索性就都挂载出来。
开始迁移
将以上docker compose文件保存到你想放置Typecho的目录,文件名为docker-compose.yaml,然后同级运行命令:
docker compose up -d # 如果你不是root,使用sudo docker compose up -d这时docker会从云端仓库把Typecho镜像拉下来,静待一段时间,直到命令行窗口显示:
笔者近期家里没有合适的设备,就选择了Windows上使用Docker Desktop部署,之后买了新设备再迁移。在Linux上的回显也大同小异。
此时,同目录的typecho文件夹下就是容器内部挂载出的/app目录了。
进入typecho\usr,把之前的.db文件(通常类似66ba4f5eec6c5.db)复制过来,然后进入127.0.0.1:8634进行博客初始化。
初始界面直接点击我准备好了,开始下一步即可。随后你会看到下面界面,这里按照之前博客的配置选,比如我之前是SQLite,就选SQLite。pdo驱动和原生驱动都可以正常运行,选哪个都行。
数据库前缀一般没有人会改,如果你记不清了,可以上类似sqlite-viewer的网站查看,比如我这个db文件夹就是以typecho为前缀的:
最下面的数据库文件路径,我们已经把原先的数据库文件放在了正确的地方,所以只要把这里的.db文件的名字改成我们之前名字就好。
配置完成点确认开始安装,此时Typecho会提示安装程序检查到原有数据表已经存在,证明我们配对了。选择使用原有数据即可。
不出意外的话,会出现如下界面。
如果你也到了这里,恭喜你迁移基本成功!
可以进入博客界面看看数据都在不在
常见问题
明明密码正确,但就是登录不进管理界面,点击登录总是被重新定向到登录页,原地tp
问题解析:如果站点是通过HTTPS访问的(比如https://blog.simuoss.cn),但Typecho内部没有正确配置为使用安全连接,会导致登录后Session或Cookie处理异常,从而被重定向回登录页。
解决方案:在Typecho根目录下的 config.inc.php 文件中,添加以下代码并保存:
define('__TYPECHO_SECURE__', true);
这行代码告诉Typecho当前环境是安全的(HTTPS),应该生成安全的Cookie。保存后,运行以下指令重启Typecho:
docker compose restart # 如果你不是root,使用sudo docker compose restart此时重新登录,就能进管理后台了。
进入后台后显示:[升级程序] 检测到新版本!但点升级后报500 SERVER ERROR或DATABASE QUERY ERROR

此时先使用以下指令重启:
docker compose restart # 如果你不是root,使用sudo docker compose restart如果还是报错,再看下面的解决方案。
问题解析:在Docker容器中,Web服务器进程是以特定用户(通常是 www-data)身份运行的,但这个用户不一定有数据库的写入权限,所以升级修改数据库结构时就会失败。
解决方案:使用下方命令进入typecho容器内部,并授予www-data用户所有权:
docker exec -it typecho-server bash # 进入容器内部命令行。如果你不是root,使用sudo docker exec -it typecho-server bash
chown -R www-data /app/usr/ # 将整个目录的所有者设置成`www-data`然后退出容器并重启服务:
exit # 退出容器
docker compose restart # 如果你不是root,使用sudo docker compose restart重启后再点击完成升级按钮,即可安全升级到最新版本。
如果不重启,直接点升级按钮,还是会报500 SERVER ERROR。这时候不用担心,重启后就可以正常进入管理后台了。
如果你在进行这些操作之前已经点过完成升级按钮了,就需要在执行完上述流程之后,先删掉已经损坏的.db文件,重新复制来原先的.db文件,然后使用docker compose restart重启服务,重新进行升级流程。
如何迁移主题?
前文提到,只要把之前的typecho\usr\themes文件夹复制过来即可。复制来后重启服务,主题就回来了。
docker compose restart # 如果你不是root,使用sudo docker compose restart参考链接:
致谢:阿里Qwen:Debug时帮我提供了很多思路
评论 (0)