在vercel上部署typecho

TL;DR

通过vercel第三方库来运行php程序

效果展示

展示不了一点,我发现部署几天后开始变得非常卡,不知道为啥

所以我推荐你每天定时deploy一下,会好很多

一,注册需要的账号

你需要注册以下账号

  • github
  • vercel
  • 一个免费或者你自己搭建的mysql数据库> 关于数据库,不推荐使用国内的免费数据库,因为vercel访问太慢了

或许你可以尝试db4free,或者一些免费空间提供的数据库

二,操作步骤

1. 创建git仓库

在github创建一个仓库,注意这个仓库需要是private的,也就是私密的仓库。然后clone到本地。下面为了方便,假设仓库名为blog

2. 下载typecho

下载地址:https://typecho.org/download

3. 把typecho解压到仓库文件夹内

此时文件应该存放在根目录

4. 新建api文件夹,然后在api文件夹下创建index.php文件

其中index.php文件的内容如下

    <?php
    $file= __DIR__ . '/..'.$_SERVER["PHP_SELF"];

    if(file_exists($file))
    {
       return false;
    }
    else
    {
        require_once __DIR__ . '/../index.php';
    }
    #echo $_SERVER["PHP_SELF"];

5. 在仓库中创建vercel.json

内容如下

    {
      "functions": {
        "api/index.php": {
          "runtime": "vercel-php@0.7.3"
        }
      },
      "routes": [{ "src": "/(.*)", "dest": "/api/index.php" }]
    }

6. 在根目录创建config.inc.php

内容如下

    <?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', 'typecho_');
    $db->addServer(array (
      'host' => '数据库地址',
      'user' => '数据库用户',
      'password' => '数据库密码',
      'charset' => 'utf8mb4',
      'port' => '3306',
      'database' => '数据库名',
      'engine' => 'MyISAM',
    ), Typecho_Db::READ ' Typecho_Db::WRITE);
    Typecho_Db::set($db);

7. 注释掉会阻挡操作的内容

打开根目录下的install.php文件,注释或者删除773-775行,注释的内容大概如下。

        // if (!$writeable) {
            // $errors[] = _t('上传目录无法写入, 请手动将安装目录下的 %s 目录的权限设置为可写然后继续升级', $uploadDir);
        // }
> 这里如果没有删除,可能会无法初始化数据库

8. 上传代码,在vercel中编译,注意提前绑定域名

9. 第一次打开会报错

提示Database Query Error。这时你需要在你的域名''vercel提供的免费域名后添加/install.php,然后按照步骤操作。

这里如果你没有执行第7步的操作,可能会报错,建议修改之后重新提交

三,注意事项

  1. 过长的等待时间会触发vercel报错,提示This Serverless Function has timed out. 这时你或许可以考虑更换数据库
  2. 注意看第7点
  3. 一些函数官方说支持,但是会有奇怪的问题
  4. 上传二进制文件和直接修改文件的功能就别想了,在仓库中操作吧
  5. 暂时想不到了