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

改动代码
-
将typecho源码fork至自己的仓库(设置成private),前往Typecho GitHub页面fork
-
在根目录下新建
api目录,在api/目录下新建index.php文件,并写入以下内容:
1<?php2$file= __DIR__ . '/..'.$_SERVER["PHP_SELF"];3
4if(file_exists($file))5{6 return false;7}8else9{10 require_once __DIR__ . '/../index.php';11}- 在根目录创建
vercel.json文件,写入以下内容:
1{2 "functions": {3 "api/index.php": {4 "runtime": "vercel-php@0.7.3"5 }6 },7 "routes": [8 { "src": "/(.*)", "dest": "/api/index.php" }9 ]10}- 删除写入检测部分代码
vercel部署的应用程序没有写入权限,Typecho检测到目录没有写入权限无法继续安装,需要将这部分代码删除或注释
在根目录install.php文件中搜索上传目录无法写入字段,将判断写入权限的部分全部删除或注释
1 if (!$writeable) {2 $errors[] = _t('上传目录无法写入, 请手动将安装目录下的 %s 目录的权限设置为可写然后继续升级', $uploadDir);3 }- 配置Typecho初始化设置
在项目根目录下创建config.inc.php文件,写入:
1<?php2/**3 * Typecho Blog Platform4 *5 * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)6 * @license GNU General Public License 2.07 * @version $Id$8 */9/** 开启https */10define('__TYPECHO_SECURE__',true);11
12/** 定义根目录 */13define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));14
15/** 定义插件目录(相对路径) */16define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');17
18/** 定义模板目录(相对路径) */19define('__TYPECHO_THEME_DIR__', '/usr/themes');20
21/** 后台路径(相对路径) */22define('__TYPECHO_ADMIN_DIR__', '/admin/');23
24/** 设置包含路径 */25@set_include_path(get_include_path() . PATH_SEPARATOR .26__TYPECHO_ROOT_DIR__ . '/var' . PATH_SEPARATOR .27__TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__);28
29/** 载入API支持 */30require_once 'Typecho/Common.php';31
32/** 程序初始化 */33Typecho_Common::init();34
35/** 定义数据库参数 */36$db = new Typecho_Db('Pdo_Mysql', 'typecho_');37$db->addServer(array (38 'host' => '数据库地址',39 'user' => '数据库用户名',40 'password' => '数据库密码',41 'charset' => 'utf8mb4',42 'port' => 数据库端口,43 'database' => '数据库名',44 'engine' => 'MyISAM',45), Typecho_Db::READ | Typecho_Db::WRITE);46Typecho_Db::set($db);这里的数据库密码等从railway中MySQL数据库Variables中获取,需要注意的是这里的MYSQLHOST和MYSQLPORT是内部地址,需要在Settings页中Networking获取外网的映射地址

请将仓库设置成私密,或者使用更安全的环境变量
比如可以这么写config.inc.php:
1/** 定义数据库参数 */2$dbHost = getenv('DB_HOST');3$dbPort = getenv('DB_PORT') ?: '3306'; // 默认端口4$dbUser = getenv('DB_USER');5$dbPassword = getenv('DB_PASSWORD');6$dbName = getenv('DB_NAME');7
8if ($dbHost && $dbUser && $dbPassword && $dbName) {9 $db = new Typecho_Db('Pdo_Mysql', 'typecho_');10 $db->addServer([11 'host' => $dbHost,12 'port' => $dbPort,13 'user' => $dbUser,14 'password' => $dbPassword,15 'database' => $dbName,16 'charset' => 'utf8mb4',17 ], Typecho_Db::READ | Typecho_Db::WRITE);18
19 Typecho_Db::set($db);20} else {21 die('数据库环境变量未正确配置');22}然后在vercel平台中配置对应的环境变量即可
或者觉得配置这么多环境变量麻烦,可以自动解析MySQL地址,只需配置MySQL公共地址即可:
假如你的MySQL地址是
mysql://username:password@host:port/database
写入
1/** 定义数据库参数 */2$databaseUrl = getenv('DATABASE_URL');3
4if ($databaseUrl) {5 $dbParts = parse_url($databaseUrl);6
7 $dbHost = $dbParts['host'];8 $dbPort = isset($dbParts['port']) ? $dbParts['port'] : 3306; // MySQL 默认端口9 $dbUser = $dbParts['user'];10 $dbPassword = $dbParts['pass'];11 $dbName = ltrim($dbParts['path'], '/'); // 去掉路径前的 "/"12
13 $db = new Typecho_Db('Pdo_Mysql', 'typecho_');14 $db->addServer([15 'host' => $dbHost,16 'port' => $dbPort,17 'user' => $dbUser,18 'password' => $dbPassword,19 'database' => $dbName,20 'charset' => 'utf8mb4',21 ], Typecho_Db::READ | Typecho_Db::WRITE);22
23 Typecho_Db::set($db);24} else {25 die('DATABASE_URL 环境变量未配置');26}部署
将改动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页面时不能直接改,需要重新部署,比如不能直接上传图片等等。但是都有办法解决,不影响正常使用
一分没花,要求别这么高