周末折腾了两天服务器,干了两件事:

1、搭建Mastodon实例,个人账号@skyue@m.skyue.com欢迎关注。
2、博客从AWS迁移到阿里云香港,同时将Typecho数据库从MySQL迁移到SQLite3。

源起

去年买AWS的Lightsail搭建Typecho的原因之一是官网说只要3.5刀/月(单核/512M内存/20G SSD),但实际用起来发现平均要7刀/月,显然我被坑了。但是吧,7刀也并非不能接受,考虑到迁移的麻烦,便一直将就用着。

9月AWS的Lightsail账单
9月AWS的Lightsail账单

最近想搭建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的方案。

🔔 Email RSS订阅本博客

已有 9 条评论

  1. 好奇请教拾月兄,在国内搭建 masterdon 这样的服务器是否有合规问题和监管问题?

    1. 我理解没有的。
      但国内服务器无法获取国外实例的嘟文,最后会成为局域网联邦。

  2. SQLite数据库性能不好吧

    1. 还好,现在你看到的就是SQLite数据库的速度,香港的阿里云机房。

  3. 注册了甲骨文免费的,速度还不错,不求一直免费,只求要关停服务提前邮件通知下,这样好及时备份。

    1. 这么爽,你的博客就是在oracle的免费云上搭建的吗?

      1. 是的呢,选择首尔,速度好。

  4. typecho,可以先装宝塔,然后一键安装,配置SS证书很方便。

    1. 这阵子折腾劲过了,下次又想折腾的时候也许能试试,哈哈。

添加新评论