vercel部署typecho
前言
网上教程都已经不适用最新版本的部署,抄作业都跑不起来,所以写个自己实际部署过程
准备
· 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页面时不能直接改,需要重新部署,比如不能直接上传图片等等。但是都有办法解决,不影响正常使用一套下来一分钱没花,就不要挑三拣四了👍