搭建 Mastodon 实例和 Typecho 数据库迁移 —— 博客迁移
周末折腾了两天服务器,干了两件事:
1、搭建 Mastodon 实例,个人账号 @skyue@m.skyue.com 欢迎关注。
2、博客从 AWS 迁移到阿里云香港,同时将 Typecho 数据库从 MySQL 迁移到 SQLite3。
源起
去年买 AWS 的 Lightsail 搭建 Typecho 的原因之一是官网说只要 3.5 刀 / 月(单核 / 512M 内存 / 20G SSD),但实际用起来发现平均要 7 刀 / 月,显然我被坑了。但是吧,7 刀也并非不能接受,考虑到迁移的麻烦,便一直将就用着。

最近想搭建 Mastodon 实例,买了阿里云香港轻量级服务器,单核 2G 内存 50G SSD,比 AWS 配置高多了,却只要 34 元 / 月,于是趁机把博客也迁移了。
搭建 mastodon 实例
教程:《如何利用 Docker 搭建 Mastodon 实例(一):基础搭建篇》
我完全按照上面文章一步步配置的,只有两个小错误已经反馈给原作者修改。
特别留意「安装并配置 Nginx」那一节,有如下一段:
sudo snap install core; sudo snap refresh core #如果没有snap则 apt insall snapd 安装
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d 你的域名
这段应该是安装 SSL 证书,支持 https 访问。我在下文的 Typecho 迁移时,也复用了这段命令,给博客添加 SSL 证书。比我以前申请、下载证书、上传证书,再配置方便多了。
Typecho 博客迁移
MySQL 迁移方案
最开始,我只打算迁移服务器的同时,把 Apache 改为 Nginx,因为 Mastodon 使用了 Nginx,复用比较方便。
所以,我做了两件事:
1、将旧服务器 Apapche 站点主目录文件打包,迁移到新服务器的网站目录,再配置 Nginx 指向该目录。
2、将 MySQL 导出,再导入到新服务器 MySQL,MySQL 导出和导入参考《Typecho 博客迁移 》,新服务器的 MySQL 安装,参考《Ubuntu18.04 安装 MySQL》
服务器之间的文件迁移有个小技巧:如果旧服务器博客还没有关停,可以将文件放在旧服务器的站点根目录,然后到新服务器用 wget
命令获取。
站点文件和数据库均完成迁移,Nginx 也配置好了,我以为一切就绪,但访问时却发生数据库连接错误,查了一些资源,发现是 MySQL 数据库 root 账户的权限问题。参考《解决 MySQL 的 ERROR 1698 (28000): Access denied for user 'root'@'localhost'》得到解决。
这句「得到解决」写起来容易,其实我把 MySQL 卸载重装了 N 次才搞定,每次按网上修改 root 权限后,就不能再使用 root 密码登录 MySQL 了,到最后仍然如此,只是我突然发现可以不用密码登录 MySQL,然后把站点下 config.ini.php
中的密码设为空,成功访问博客数据。
经此一役,让我觉得 MySQL 迁移太麻烦了,所以决定改用 SQLite,SQLite 是个文件,迁移只需要复制文件即可。
MySQL 迁移到 SQLite3
我的博客日访问 UV 很少超过 50,SQLite 数据库足够了。
首先,需要将 MySQL 数据转为 SQLite 数据文件,在网上找到一个 Python 库 mysql-to-sqlite3 可以解决。安装后,执行下面的命令将博客数据库导出为 SQLite 的 DB 数据文件。
mysql2sqlite -f blog.db -d blog -u root
# -f: 导出的SQLite文件名 (必须)
# -d: 需要导出的MySQL数据库,我的是blog,Typecho默认一般是typecho (必须)
# -u: MySQL用户名 (必须)
# -p: MySQL密码 (若有)
然后修改 config.ini.php
,将下面这段
/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'blog_');
$db->addServer(array (
'host' => 'localhost',
'user' => 'root',
'password' => '',
'charset' => 'utf8',
'port' => '3306',
'database' => 'blog',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
修改为:
/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_SQLite', 'blog_');
$db->addServer(array (
'file' => 'SQLite数据库文件绝对地址',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
修改完成后,再访问博客,发现还是有权限问题:
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
这时只是文件权限,改起来比较简单,参考《Typecho 博客搬家后遗症》,执行:
# 将 * 换成SQLite数据文件所在的目录绝对路径
chown -R :www-data *
chmod -R 775 *
再访问,就能打开网站了。
你现在看到的本博客,就是 Typecho + SQLite 的方案。
好奇请教拾月兄,在国内搭建 masterdon 这样的服务器是否有合规问题和监管问题?
我理解没有的。
但国内服务器无法获取国外实例的嘟文,最后会成为局域网联邦。
SQLite 数据库性能不好吧
还好,现在你看到的就是 SQLite 数据库的速度,香港的阿里云机房。
注册了甲骨文免费的,速度还不错,不求一直免费,只求要关停服务提前邮件通知下,这样好及时备份。
这么爽,你的博客就是在 oracle 的免费云上搭建的吗?
是的呢,选择首尔,速度好。
typecho,可以先装宝塔,然后一键安装,配置 SS 证书很方便。
这阵子折腾劲过了,下次又想折腾的时候也许能试试,哈哈。