撰于 阅读 54

Vless+Vision+Reality 服务下的 Typecho 博客搭建

前言

好不容易搞到一台 VPS,光是搭个出海的服务实在不过瘾,因此考虑在上面继续搭个博客+图床。考虑到 443 端口被 Xray-core 给占用了,想要继续在域名上做文章就只能通过 Xray 转发到 Caddy 再进行反向代理了。因此这篇博客的主要工作就是把这个 Caddy 配置文件和这个Caddy 配置文件结合起来,各取需要的部分并调通。

主要步骤

第一步 利用 docker-compose 安装 Minio 和 Mysql

Minio 能够提供对象存储服务,搭配上 Picgo 以及 Typora 就是一个相当好用的图床。Mysql 为 Typecho 博客提供存储。这二者能够通过 docker-compose 相当轻松的进行安装。

操作系统:Debian 11

  1. 安装 docker-compose

    sudo apt install docker docker-compose
  2. 编写 docker-compose.yml 配置文件

    cd ~mkdir Storage && cd Storagesudo nano docker-compose.yml
    version: '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
  3. 启动服务

    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 的步骤:

  1. 侧边栏 Buckets -> 右上角 Create Bucket

    image-20241014111611572

  2. 填写 Buckets 名称,完成创建

    image-20241014111704717

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

    image-20241022172331181

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

    image-20241014111804171

创建 Access Key 的步骤:

  1. 在相应位置输入名称、描述,然后设置过期时间为1年

    image-20241022170554840

  2. 限制只能访问对应的桶

    image-20241022170737355

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

    image-20241022170822533

第四步 配置 picgo 并测试 minio 是否部署成功

  1. 下载一个 picgo ,对于 Arch Linux 来说,可以一键安装

    paru -S picgo
  2. picgo 安装 minio 的插件

    picgo install minio
  3. picgo 配置 minio 的相关信息

    picgo config uploader

    按下⬆️选择 minio,然后填写信息即可

    image-20241022171641367

  1. 测试 picgo 能否正常上传

    picgo upload <用于测试的本地图片路径>

image-20241022171930929

出现 [PicGo SUCCESS] 的字样就说明图床搭建完毕

  1. typora 配置 picgo 实现图片的自动上传

    按照下图的配置进行填写即可,不知道 picgo 在哪儿的可以用命令

whereis picgo

image-20241022172050054

第五步 Mysql 创建相应的数据库

  1. 进入 docker 中的 mysql 容器

    sudo docker exec -it mysql /bin/bash
  2. 登入 mysql

    mysql -u root -p

    并输入你在第一步中设置的密码

  3. 为 typecho 创建数据库

    create database typecho;

    出现类似下面的字样就说明创建成功,可以一路 exit 退出了

    image-20241022172645250

第六步 服务器中下载 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 网站

  1. 安装 php-fpm

    sudo apt install php-fpm
  2. 安装 php 的 mbstring 拓展

    sudo apt install php-mbstring
  3. 安装 mysql 的 php 拓展,即 mysqli

    sudo apt install php-mysqli
  4. 配置 /usr/uploads 的目录权限为可写

    sudo chmod -R 0777 /var/www/typecho/usr/uploads/
  5. 完善第二步里的 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 网站的安装

  1. 填写数据库的相关信息

    image-20241022175852918

  2. 手动创建 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);
  3. 访问页面,开始博客之旅

    image-20241022181034566