博主头像
Q的小站

思想无界,文字有声

vercel部署typecho

前言

网上教程都已经不适用最新版本的部署,抄作业都跑不起来,所以写个自己实际部署过程


准备

· GitHub账号
· railway账号
· typecho源码

创建数据库

点击这里前往railway官网
可以直接使用GitHub登录,登陆后创建MySQL数据库
点击create,选择database

选择MySQL
选择MySQL

记录以下变量值备用
数据库变量
数据库变量

改动代码

  1. 将typecho源码fork至自己的仓库(设置成private),前往Typecho GitHub页面fork
  2. 在根目录下新建api目录,在api/目录下新建index.php文件,并写入以下内容:

    <?php
    $file= __DIR__ . '/..'.$_SERVER["PHP_SELF"];
    
    if(file_exists($file))
    {
    return false;
    }
    else
    {
     require_once __DIR__ . '/../index.php';
    }
  3. 在根目录创建vercel.json文件,写入以下内容:

    {
      "functions": {
     "api/index.php": {
       "runtime": "vercel-php@0.7.3"
     }
      },
      "routes": [
     { "src": "/(.*)", "dest": "/api/index.php" }
      ]
    }
  4. 删除写入检测部分代码

vercel部署的应用程序没有写入权限,Typecho检测到目录没有写入权限无法继续安装,需要将这部分代码删除或注释

在根目录install.php文件中搜索上传目录无法写入字段,将判断写入权限的部分全部删除或注释

    if (!$writeable) {
        $errors[] = _t('上传目录无法写入, 请手动将安装目录下的 %s 目录的权限设置为可写然后继续升级', $uploadDir);
    }
  1. 配置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', 'typecho_');
$db->addServer(array (
  'host' => '数据库地址',
  'user' => '数据库用户名',
  'password' => '数据库密码',
  'charset' => 'utf8mb4',
  'port' => 数据库端口,
  'database' => '数据库名',
  'engine' => 'MyISAM',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

这里的数据库密码等从railway中MySQL数据库Variables中获取,需要注意的是这里的MYSQLHOSTMYSQLPORT是内部地址,需要在Settings页中Networking获取外网的映射地址

正确的host和port
正确的host和port

注意

请将仓库设置成私密,或者使用更安全的环境变量

比如可以这么写config.inc.php

/** 定义数据库参数 */
$dbHost = getenv('DB_HOST');
$dbPort = getenv('DB_PORT') ?: '3306'; // 默认端口
$dbUser = getenv('DB_USER');
$dbPassword = getenv('DB_PASSWORD');
$dbName = getenv('DB_NAME');

if ($dbHost && $dbUser && $dbPassword && $dbName) {
    $db = new Typecho_Db('Pdo_Mysql', 'typecho_');
    $db->addServer([
        'host'     => $dbHost,
        'port'     => $dbPort,
        'user'     => $dbUser,
        'password' => $dbPassword,
        'database' => $dbName,
        'charset'  => 'utf8mb4',
    ], Typecho_Db::READ | Typecho_Db::WRITE);

    Typecho_Db::set($db);
} else {
    die('数据库环境变量未正确配置');
}

然后在vercel平台中配置对应的环境变量即可

或者觉得配置这么多环境变量麻烦,可以自动解析MySQL地址,只需配置MySQL公共地址即可:
假如你的MySQL地址是
mysql://username:password@host:port/database
写入

/** 定义数据库参数 */
$databaseUrl = getenv('DATABASE_URL');

if ($databaseUrl) {
    $dbParts = parse_url($databaseUrl);

    $dbHost = $dbParts['host'];
    $dbPort = isset($dbParts['port']) ? $dbParts['port'] : 3306; // MySQL 默认端口
    $dbUser = $dbParts['user'];
    $dbPassword = $dbParts['pass'];
    $dbName = ltrim($dbParts['path'], '/'); // 去掉路径前的 "/"

    $db = new Typecho_Db('Pdo_Mysql', 'typecho_');
    $db->addServer([
        'host'     => $dbHost,
        'port'     => $dbPort,
        'user'     => $dbUser,
        'password' => $dbPassword,
        'database' => $dbName,
        'charset'  => 'utf8mb4',
    ], Typecho_Db::READ | Typecho_Db::WRITE);

    Typecho_Db::set($db);
} else {
    die('DATABASE_URL 环境变量未配置');
}

部署

将改动push到项目后,在vercel上连接GitHub,部署项目,vercel会给分配免费的二级域名
访问https://分配的二级域名/install.php开始初始化安装

关于主题

目前测试下来只有官方预装的两款主题可以正常使用,其他第三方主题无法显示出图片,原因不明
最初看上了Stack主题移植Typecho版,只能泡汤了

结束

至此就完成了Typecho在vercel上的部署,可以正常发布文章。当然在serverless上装动态博客总归有些小bug,比如更改外观php页面时不能直接改,需要重新部署,比如不能直接上传图片等等。但是都有办法解决,不影响正常使用
一套下来一分钱没花,就不要挑三拣四了👍

发表新评论