前言
网上教程都已经不适用最新版本的部署,抄作业都跑不起来,所以写个自己实际部署过程
准备
- GitHub账号
- railway账号
- typecho源码
创建数据库
最初是想使用vercel提供的postgres数据库,省点力,虽然Typecho是支持postgres的,但是初始化过程中却提示无法加载支持,是个谜。有能力可以尝试解决
点击这里前往railway官网
可以直接使用GitHub登录,登陆后创建MySQL数据库
点击create,选择database
记录以下变量值备用

改动代码
-
将typecho源码fork至自己的仓库(设置成private),前往Typecho GitHub页面fork
-
在根目录下新建
api目录,在api/目录下新建index.php文件,并写入以下内容:
<?php$file= __DIR__ . '/..'.$_SERVER["PHP_SELF"];
if(file_exists($file)){ return false;}else{ require_once __DIR__ . '/../index.php';}- 在根目录创建
vercel.json文件,写入以下内容:
{ "functions": { "api/index.php": { "runtime": "vercel-php@0.7.3" } }, "routes": [ { "src": "/(.*)", "dest": "/api/index.php" } ]}- 删除写入检测部分代码
vercel部署的应用程序没有写入权限,Typecho检测到目录没有写入权限无法继续安装,需要将这部分代码删除或注释
在根目录install.php文件中搜索上传目录无法写入字段,将判断写入权限的部分全部删除或注释
if (!$writeable) { $errors[] = _t('上传目录无法写入, 请手动将安装目录下的 %s 目录的权限设置为可写然后继续升级', $uploadDir); }- 配置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中获取,需要注意的是这里的MYSQLHOST和MYSQLPORT是内部地址,需要在Settings页中Networking获取外网的映射地址

请将仓库设置成私密,或者使用更安全的环境变量
比如可以这么写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开始初始化安装
当然vercel的二级域
*.vercel.app是被墙的,建议使用自己的域名CNAME解析到cname.vercel-dns.com(不要解析到分配的二级域名),然后在Domains页中添加自己的域名,也可以在us.kg上申请免费的域名,托管至cloudflare,可以参考文章免费域名申请
关于主题
目前测试下来只有官方预装的两款主题可以正常使用,其他第三方主题无法显示出图片,原因不明
最初看上了Stack主题移植Typecho版,只能泡汤了
结束
至此就完成了Typecho在vercel上的部署,可以正常发布文章。当然在serverless上装动态博客总归有些小bug,比如更改外观php页面时不能直接改,需要重新部署,比如不能直接上传图片等等。但是都有办法解决,不影响正常使用
一分没花,要求别这么高