Vercel 托管 Typecho

Typecho 是一个基于PHP的轻量博客系统,小巧且具备良好的可扩展性。作为动态博客其优点自不必多说,但是却需要部署在服务器, 没法像大部分静态博客一样直接托管在 GitHub Pages 上,运维成本不低。
不过还好,我们还有 Vercel ~


准备工作

既然文章叫做 “Vercel 托管 Typecho” ,那么我们首先就需要一个 Github 账号 👻
fork Typecho,然后 clone 到本地对其进行修改。

创建路由入口

在项目根目录下新建 api 目录,然后在该目录中新建 index.php 文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
$file= __DIR__ . '/..'.$_SERVER["PHP_SELF"];

if(file_exists($file))
{
   return false;
}
else
{
    require_once __DIR__ . '/../index.php';
}

添加 Vercel 配置文件

在项目根目录下新建 vercel.json 文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "functions": {
    "api/index.php": {
      "runtime": "[email protected]"
    }
  },
  "routes": [
    { "src": "/(.*)", "dest": "/api/index.php" }
  ]
}

这里面 [email protected] 是 Vercel 提供的 PHP 运行环境,如果你需要使用其他版本的 PHP, 可以参考 vercel-php 文档。

移除 上传目录写入检测 相关代码

部署在 Vercel 上的项目是无法写入文件的,所以我们需要移除 Typecho 中的上传目录写入检测相关代码。
全局搜索 “上传目录无法写入” ,然后将相关代码注释掉即可。 以 Typecho 1.2.1 为例,分别有 install.php 773-775 行, 和 Upgrade.php 352-363 行。

创建 Typecho 配置文件

在项目根目录下创建 config.inc.php 文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
/**
 * Typecho Blog Platform
 *
 * @copyright  Copyright (c) 2008 Typecho team (http://www.typecho.org)
 * @license    GNU General Public License 2.0
 * @version    $Id$
 */
/** 开启https */ 
define('__TYPECHO_SECURE__',true);

/** 定义根目录 */
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));

/** 定义插件目录(相对路径) */
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');

/** 定义模板目录(相对路径) */
define('__TYPECHO_THEME_DIR__', '/usr/themes');

/** 后台路径(相对路径) */
define('__TYPECHO_ADMIN_DIR__', '/admin/');

/** 设置包含路径 */
@set_include_path(get_include_path() . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . '/var' . PATH_SEPARATOR .
__TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__);

/** 载入API支持 */
require_once 'Typecho/Common.php';

/** 程序初始化 */
Typecho_Common::init();

/** 定义数据库参数 */
$db = new Typecho_Db('数据库驱动名称: Pdo_Mysql 或 Pdo_Pgsql', '表前缀 如: myblog_');
$db->addServer(array (
  'host' => '数据库地址',
  'user' => '数据库用户名',
  'password' => '数据库密码',
  'charset' => '数据库编码, 推荐:utf8mb4',
  'port' => 数据库端口,
  'database' => '数据库名',
  'engine' => '数据库引擎, 对于MySQL为 InnoDB 或 MyISAM',
  'sslCa' => '数据库SSL证书路径',
  'sslVerify' => 启用SSL证书验证 true  false,
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

其中 需要关注的只有 定义数据库参数 部分,根据自己的数据库信息进行修改,替换掉提示的内容即可,注意保留引号。 不需要的部分可以直接删除,比如 sslCasslVerify

导入主题

将想要使用的主题文件夹放入 /usr/themes 目录下。
如果你使用的是开源主题,可以将其直接添加为子模块,以便于更新,终端执行以下命令:

1
2
git submodule add <主题仓库地址> ./usr/themes/<主题文件夹名>
# 例: git submodule add https://github.com/fordes123/gleaner .\usr\themes\gleaner 

完成以上步骤后,提交修改并推送到 Github。

注意: 建议将仓库设为 私有,如果非要公开仓库,建议将 config.inc.php 文件中的数据库密码等敏感信息以环境变量的形式保存, 然后在 Vercel 中进行配置。

部署到 Vercel

登入 Vercel 后,导入上步骤中的仓库,如使用了环境变量可在此时配置进去,最后点击部署即可。

部署完成后,Vercel 会自动为你生成一个域名,域名在后面加上 /install.php 并访问,即可进入安装界面,按照提示进行安装即可。


附录

使用 PlanetScale

既然要托管,一般我们都会选择免费的云数据库,以 PlanetScale 为例,它提供5G免费存储空间并且不限制连接数。 由于 PlanetScale 默认启用了SSL,因此还需要进行一些额外配置。

1. 在 Vercel 中添加 PlanetScale 集成

首先需要保证已经在 PlanetScale 中创建数据库,然后访问 https://vercel.com/integrations/planetscale ,选择 Add Integration,然后为我们的项目添加 PlanetScale 授权,这时候 Vercel 会自动为我们的项目创建一组环境变量:

  • PLANETSCALE_DB: 数据库名
  • PLANETSCALE_DB_USERNAME: 数据库用户名
  • PLANETSCALE_DB_PASSWORD: 数据库密码
  • PLANETSCALE_DB_HOST: 数据库地址
  • PLANETSCALE_SSL_CERT_PATH: SSL证书路径
2. 修改 Typecho 配置文件 config.inc.php

还是关注 定义数据库参数 部分,以上述环境变量替代部分内容,例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql','表前缀');
$db->addServer(array (
  'host' =>  $_ENV["PLANETSCALE_DB_HOST"],
  'user' => $_ENV["PLANETSCALE_DB_USERNAME"],
  'password' => $_ENV["PLANETSCALE_DB_PASSWORD"],
  'charset' => '数据库编码, 推荐:utf8mb4',
  'database' => $_ENV["PLANETSCALE_DB"],
  'engine' => '数据库引擎, 对于MySQL为 InnoDB 或 MyISAM',
  'sslCa' => $_ENV["PLANETSCALE_SSL_CERT_PATH"],
  'sslVerify' => true,
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

修改完成后提交推送,Vercel 会自动部署,后续操作与上述相同。