前言
好不容易搞到一台 VPS,光是搭个出海的服务实在不过瘾,因此考虑在上面继续搭个博客+图床。考虑到 443 端口被 Xray-core 给占用了,想要继续在域名上做文章就只能通过 Xray 转发到 Caddy 再进行反向代理了。因此这篇博客的主要工作就是把这个 Caddy 配置文件和这个Caddy 配置文件结合起来,各取需要的部分并调通。
主要步骤
第一步 利用 docker-compose 安装 Minio 和 Mysql
Minio 能够提供对象存储服务,搭配上 Picgo 以及 Typora 就是一个相当好用的图床。Mysql 为 Typecho 博客提供存储。这二者能够通过 docker-compose 相当轻松的进行安装。
操作系统:Debian 11
安装 docker-compose
sudo apt install docker docker-compose编写 docker-compose.yml 配置文件
cd ~mkdir Storage && cd Storagesudo nano docker-compose.ymlversion: '3.7' services: minio: image: minio/minio:latest container_name: miniox ports: - 127.0.0.1:9000:9000 # api 端口,限定本地回环才能访问 - 127.0.0.1:9001:9001 # 控制台端口,限定本地回环才能访问 environment: - MINIO_ACCESS_KEY=admin # 管理员名称 - MINIO_SECRET_KEY=12345678 # 管理员密码 # - MINIO_SERVER_URL=https://minio.example.com:9000 # 开启 https 需要用到 # - MINIO_BROWSER_REDIRECT_URL=https://ioconsole.example.com:9001 # 开启 https 需要用到 volumes: - ./Minio/data:/data - ./Minio/config:/root/.minio command: server --address ':9000' --console-address ':9001' /data restart: unless-stopped privileged: true mysql: user: "1000:50" image: mysql container_name: mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 12345678 # Mysql root 管理员的密码 ports: - "3306:3306" volumes: - ./Mysql/conf.d:/etc/mysql/conf.d - ./Mysql/logs:/logs - ./Mysql/sql:/sql - ./Mysql/data:/var/lib/mysql启动服务
sudo docker-compose up -d
第二步 Caddy 相关配置中配置反向代理到 minio 相关端口
附一份完整的 caddy.json 在下方,可以通过 caddy 来自动申请证书以达到 https 访问的目的
{
"admin": {
"disabled": true,
"config": {
"persist": false
}
},
"logging": {
"logs": {
"default": {
"writer": {
"output": "file",
"filename": "/var/log/caddy/error.log"
},
"encoder": {
"format": "console"
},
"level": "ERROR",
"exclude": ["http.log.access.log0"]
},
"log0": {
"writer": {
"output": "file",
"filename": "/var/log/caddy/access.log"
},
"encoder": {
"format": "console"
},
"include": ["http.log.access.log0"]
}
}
},
"storage": {
"module": "file_system",
"root": "/home/tls"
},
"apps": {
"http": {
"servers": {
"srvh1": {
"listen": [":80"],
"routes": [{
"handle": [{
"handler": "static_response",
"headers": {
"Location": ["https://{http.request.host}{http.request.uri}"]
},
"status_code": 301
}]
}],
"protocols": ["h1"]
},
"srvh3": {
"listen": ["127.0.0.1:2153"],
"listener_wrappers": [
{ "wrapper": "proxy_protocol" },
{ "wrapper": "tls" }
],
"routes": [
{
"match": [{
"host": ["ioconsole.noteikoh.top"]
}],
"handle": [{
"handler": "subroute",
"routes": [{
"handle": [{
"handler": "reverse_proxy",
"upstreams": [{
"dial": "localhost:9001"
}]
}]
}]
}]
},
{
"match": [{
"host": ["minio.noteikoh.top"]
}],
"handle": [{
"handler": "subroute",
"routes": [{
"handle": [{
"handler": "reverse_proxy",
"upstreams": [{
"dial": "localhost:9000"
}]
}]
}]
}]
}
],
"tls_connection_policies": [{
"match": {
"sni": ["minio.noteikoh.top", "ioconsole.noteikoh.top"]
},
"cipher_suites": ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"],
"curves": ["x25519","secp521r1","secp384r1","secp256r1"],
"alpn": ["h3","h2","http/1.1"]
}],
"automatic_https": {
"disable": true
},
"logs": {
"default_logger_name": "log0"
},
"protocols": ["h1","h2","h3"]
}
}
},
"tls": {
"certificates": {
"automate": ["minio.noteikoh.top", "ioconsole.noteikoh.top"]
},
"automation": {
"policies": [{
"issuers": [{
"module": "acme",
"ca": "https://acme.zerossl.com/v2/DV90",
"email": "test@test.com"
}]
}]
}
}
}
}第三步 Minio 上创建桶和 Access Key 为搭建图床做准备
创建 Bucket 的步骤:
侧边栏 Buckets -> 右上角 Create Bucket

填写 Buckets 名称,完成创建

设置桶为 private,限制陌生人写入

设置所有用户只读(Add Access Rule)添加 / 为只读

创建 Access Key 的步骤:
在相应位置输入名称、描述,然后设置过期时间为1年

限制只能访问对应的桶

最后记得把密钥下载保存,免得忘了

第四步 配置 picgo 并测试 minio 是否部署成功
下载一个 picgo ,对于 Arch Linux 来说,可以一键安装
paru -S picgopicgo 安装 minio 的插件
picgo install miniopicgo 配置 minio 的相关信息
picgo config uploader按下⬆️选择 minio,然后填写信息即可

测试 picgo 能否正常上传
picgo upload <用于测试的本地图片路径>

出现 [PicGo SUCCESS] 的字样就说明图床搭建完毕
typora 配置 picgo 实现图片的自动上传
按照下图的配置进行填写即可,不知道 picgo 在哪儿的可以用命令
whereis picgo
第五步 Mysql 创建相应的数据库
进入 docker 中的 mysql 容器
sudo docker exec -it mysql /bin/bash登入 mysql
mysql -u root -p并输入你在第一步中设置的密码
为 typecho 创建数据库
create database typecho;出现类似下面的字样就说明创建成功,可以一路 exit 退出了

第六步 服务器中下载 Typecho 源码
方法很多,下面给一个我用的
wget https://github.com/typecho/typecho/releases/latest/download/typecho.zipsudo mkdir /var/www/typecho -psudo unzip -x typecho.zip -d /var/www/typecho第七步 下载相关工具并配置 caddy 搭建 typecho 网站
安装 php-fpm
sudo apt install php-fpm安装 php 的 mbstring 拓展
sudo apt install php-mbstring安装 mysql 的 php 拓展,即 mysqli
sudo apt install php-mysqli配置 /usr/uploads 的目录权限为可写
sudo chmod -R 0777 /var/www/typecho/usr/uploads/完善第二步里的 caddy.json 配置文件,在合适的地方添加下面的内容,并补充 sni 条目以及 automate 条目
{ "match": [{ "host": ["blog.noteikoh.top"] }], "handle": [{ "handler": "subroute", "routes": [ { "handle": [{ "handler": "headers", "response": { "set": { "Strict-Transport-Security": ["max-age=31536000; includeSubDomains; preload"], "Alt-Svc": ["h3=\":443\"; ma=2592000"] } } }] }, { "handle": [{ "handler": "vars", "root": "/var/www/typecho" }] }, { "handle": [{ "handler": "static_response", "headers": { "Location": [ "{http.request.orig_uri.path}/" ] }, "status_code": 308 }], "match": [{ "file": { "try_files": [ "{http.request.uri.path}/index.php" ] }, "not": [{ "path": [ "*/" ] }] }] }, { "handle": [{ "handler": "rewrite", "uri": "{http.matchers.file.relative}" }], "match": [{ "file": { "split_path": [ ".php" ], "try_files": [ "{http.request.uri.path}", "{http.request.uri.path}/index.php", "index.php" ] } }] }, { "handle": [{ "handler": "reverse_proxy", "transport": { "protocol": "fastcgi", "split_path": [ ".php" ] }, "upstreams": [ { "dial": "unix//run/php/php7.4-fpm.sock" }] }], "match": [{ "path": [ "*.php" ] }] }, { "handle": [{ "handler": "file_server", "hide": [ "./Caddyfile" ] }] } ] }] }
第八步 完成 Typecho 网站的安装
填写数据库的相关信息

手动创建
config.inc.php文件cd /var/www/typechotouch config.inc.phpsudo nano config.inc.php并填入下面的信息
<?php // site root path define('__TYPECHO_ROOT_DIR__', dirname(__FILE__)); // plugin directory (relative path) define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins'); // theme directory (relative path) define('__TYPECHO_THEME_DIR__', '/usr/themes'); // admin directory (relative path) define('__TYPECHO_ADMIN_DIR__', '/admin/'); // register autoload require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php'; // init \Typecho\Common::init(); // config db $db = new \Typecho\Db('Pdo_Mysql', 'typecho_'); $db->addServer(array ( 'host' => 'localhost:3306', 'port' => 3306, 'user' => 'root', 'password' => 'pswd-mysql', 'charset' => 'utf8mb4', 'database' => 'typecho', 'engine' => 'InnoDB', 'sslCa' => '', 'sslVerify' => true, ), \Typecho\Db::READ | \Typecho\Db::WRITE); \Typecho\Db::set($db);访问页面,开始博客之旅
