注:本篇博文可能会动态更新,持续记录 Typecho 使用中的问题。

本来使用的是 Gcorelab 的伯力 VPS,北方联通电信延迟和网速都很理想,8 RMB 一个月可谓白菜价了,但是这家后台经常上不去,而且我的信用卡被拒付,导致无法续费,只好迁移博客。

折腾了半天,本来以为可以白嫖 GCP 、Azure、Oracle,结果信用卡验证都通不过,而 Azure 的学生认证又将大陆学校排除在外...只有 AWS 让我用信用卡拿到了一个月的 Lightsail 体验机会,但是这东京节点的线路也太差了吧...

最后还是使用钞能力,买了腾讯云的轻量应用服务器,这篇博客就记录一下我迁移 Typecho 博客遇到的问题和收获的经验。

概要

这篇博客主要涉及几个部分:

  • VPS:我从之前用的 Ubuntu 迁移到 Debian,遇到了一些配置方面的问题。
  • 腾讯云有自带的监控软件,需要卸载;
  • Typecho:版本升级、数据备份;
  • Docker:安装和配置镜像加速等。

由于这次迁移使用了 docker-compose, 所以迁移本身其实很简单,主要的问题都集中在新系统 / 新 VPS 的使用上。

Debian 常见问题

sudo 不存在

不同于 Ubuntu,sudo 命令貌似并没有安装。

解决方法:

su - root
apt install sudo
visudo

此时会用 nano 打开 sudo 用户的配置文件,在里面加入:

user ALL=(ALL) NOPASSWD: ALL

这里的 user 替换为你想要给予 sudo 权限的用户。

部分命令提示 command not found

当我使用非 root 用户时,正常情况下,在 usermod, useradd 之类的命令前面加上 sudo 就能正常使用。但是我不管 sudo 还是 su 切换 root 运行之后都提示 command not found。而 重新用 root 用户 登陆之后,这些命令又可以正常执行。

原因

至于为什么找不到命令,原因有两个:

  1. 这些程序所在的位置没有被添加到当前用户的环境变量里面,所以无法找到。
  2. Debian 仓库里的 sudo 编译时加入了 –with-secure-pathsudo 时的环境变量还是原用户的 。参考:

    –with-secure-path[=PATH]
    Path used for every command run from sudo(8). If you don’t trust the people running sudo to have a sane PATH environment variable you may want to use this. Another use is if you want to have the “root path” be separate from the “user path.” You will need to customize the path for your site. NOTE: this is not applied to users in the group specified by –with-exemptgroup. If you do not specify a path, “/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc” is used.   

同时又有一个问题,为什么 su 切换到 root 之后仍然无法运行这些命令?

原因是 su 切换到 root 用户下,也只是获得 root 用户的权限,依然找不到命令。必须用 su - root 获得权限的同时执行 root 的 profile 来切换成 root 的环境变量才能运行。

总结来说就是:

  1. sudo : 获取临时的 root 权限执行命令。
  2. su root : 以 root 的名义开启了一个 shell,通过 root 执行命令。只会 source .bashrc,即只有权限无环境变量。
  3. su - root : 就像使用 root 登陆一样,source .bashrc .bash_profile,有权限也有环境变量。

解决方案

有三种思路:

  • 第一个是直接修改全局环境变量(貌似不太安全?)。

    打开 /etc/profile, 这里控制系统全局环境变量,可以发现,有一个 if-else 语句使得 root 用户和其他用户的环境变量不同,我们只要把 if-else 删掉,只留第五行即可实现 root 用户和其他用户的环境变量相同。

    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
    # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
    
    if [ "`id -u`" -eq 0 ]; then
      PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    else
      PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
    fi
    export PATH
  • 第二个是为普通用户创建 alias,例如:

    alias sudo='sudo env PATH=$PATH:/usr/local/sbin:/sbin'

    这样普通用户使用 sudo 时就会自动追加环境变量。

  • 第三个是重新编译 sudo,不加 –with-secure-path

参考资料

这部分涉及很多 Linux 环境变量的知识,我打算另写一篇博文介绍。

卸载腾讯云监控

腾讯云的监控软件不止一个,但都自带有卸载脚本的,我们可以一个个手动运行,也可以用下面这个脚本自动卸载。

wget -qO- https://raw.githubusercontent.com/littleplus/TencentAgentRemove/master/remove.sh | sudo bash

卸载完毕之后运行:

ps -A | grep agent

输出里可能仍然有一个 tat_agent 进程,这个是负责从腾讯云后台网页执行指令用的,不是监控程序。

腾讯云 Docker 部署

Typecho 相关问题

版本升级

删除以下文件/目录:

/admin/
/var/
/index.php
/install.php

下载最新版解压即可。

数据备份与迁移

Typecho 后台左上角 -> 备份,可以备份和恢复网站文章内容,但不包括网站设置、主题、插件等。

直接 tar 打包 Typecho 目录,可以备份网站主题和插件,如果使用的是 SQLite 数据库,就会把所有的网站设置和文章内容都备份下来,但如果使用其他的数据库软件,这样做无法保留网站设置和文章内容。

如果想要整个网站完整备份下来,或者网站文章内容过大,可以考虑通过数据库的备份工具来实现,而不是使用 Typecho 内置的工具。数据库备份虽然完整,但是遇到更换数据库软件就很难办了,例如我本次从 SQLite 迁移到 PostgreSQL 就很痛苦。

总得来说,只要不涉及更换数据库软件,备份和恢复还是很简单的。

老生常谈的其他问题

之前提过的问题,这里总结一下: