侧边栏壁纸
博主头像
Wood Chen博主等级

独唱独酬,独行独坐还独卧

  • 累计撰写 233 篇文章
  • 累计创建 166 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

Vercel 托管 Typecho

wood
2024-03-22 / 0 评论 / 0 点赞 / 73 阅读 / 6466 字
* [https://www.fordes.top/posts/tutorials/typecho-vercel/ - fordes123's Blog](https://www.fordes.top/posts/tutorials/typecho-vercel/)
* 记录本身, 即已是反抗
* 2024-03-22 07:26:00

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


准备工作

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

创建路由入口

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

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

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

添加 Vercel 配置文件

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

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

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

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

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

创建 Typecho 配置文件

在项目根目录下创建 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 或 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);

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

导入主题

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

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

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

/** 定义数据库参数 */
$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 会自动部署,后续操作与上述相同。

0

评论区