笨蛋ovo

笨蛋ovo

mx-space 搭建过程记录

前言#

如你所见,我的个人主页进行了一点点改动。之前是站长用 MDUI 完全手搓的页面 (存档),但是很明显,这玩意非常的粗糙,而且并没有发布内容的功能。而前不久,看到有朋友在玩 mx-space,看了一下感觉挺不错的,于是乎就花了一点时间部署到了咱的个人主页上。

写这篇文章主要是想记录一下,搭建这玩意把我从晚上折腾到早上六点钟,因为官方文档的坑太多了(这点真的要吐槽,按照文档都不一定能把站建出来),所以还是把自己搭建的过程写出来,一来是让自己的博客上能有点东西(这应该是第一篇文章了),二来也能让后来人少踩点坑

另,本文主要算是对官方文档的补充,所以很多内容都和官方文档一致。由于官方文档在不断更新,遇到本文所述内容与文档存在出入,请优先参考官方文档

环境准备#

笔者这里使用的是 腾讯云轻量新加坡 2C4G,系统是 Debian 10,安装了宝塔面板(当然你也可以不用宝塔,那你得自己会配置反代)

官方文档给的要求是 Linux 内核版本 不小于 4.19,且内存大于 1 GiB

Linux 内核版本可以使用命令 uname -r 检查,如果版本要求不符,请自行更换内核 / 系统,这里不再赘述。

因笔者使用的是 Debian 10 系统,包管理器为 apt,这里的教程可能仅适用于 Debian/Ubuntu 及其衍生发行版,其他发行版请自行解决可能遇到的问题

笔者建议安装过程全程在 root 用户下执行(普通用户可使用 sudo -i 切换 root 用户),在普通用户下安装笔者不保证能够成功

依赖安装#

安装所需软件包#

ssh 或其他方式连接终端,执行下述命令

apt update && apt install git curl vim wget git-lfs -y

等待安装完成

安装 Docker(后端依赖)#

使用 Docker 官方提供的一键脚本可以快速安装

curl -fsSL https://get.docker.com | bash -s docker

# 中国大陆服务器请执行以下命令以使用镜像源
curl -fsSL https://get.docker.com | bash -s docker --mirror AzureChinaCloud

安装完成后,请执行 docker compose version 检查输出内容是否正常

安装 Node.js 及依赖模块(前端依赖)#

这里的话按照 mx-space 官方文档安装 nvm 以便管理 Node.js

如果您和笔者一样使用宝塔面板,请前往宝塔面板 - 软件商店 - 运行环境,安装 PM2管理器

如果您并非宝塔面板用户,请执行以下命令安装 nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

# 中国大陆服务器请执行以下命令以使用镜像源
bash -c "$(curl -fsSL https://gitee.com/RubyKids/nvm-cn/raw/master/install.sh)"

安装完后请重启终端,然后执行 npm -v 检查是否输出内容

接着安装 Node.js

nvm install --lts
# 宝塔面板用户请跳过,安装 PM2管理器 时会自动安装 Node.js

安装所需模块

#中国大陆服务器请先执行以下命令切换镜像源
npm config set registry http://mirrors.cloud.tencent.com/npm/

npm install -g pnpm pm2

部署后端#

拉取 Docker 配置文件#

# 新建文件夹
cd && mkdir -p mx-space/core && cd $_

# 拉取docker-compose.yml 文件
wget https://fastly.jsdelivr.net/gh/mx-space/core@master/docker-compose.yml

# 拉取 Core 配置文件
wget https://fastly.jsdelivr.net/gh/mx-space/core@master/.env.example -O .env

编辑后端 .env 环境配置文件#

使用 vim 编辑: vim .env

按下 i 进入编辑模式
然后按照下文进行修改:

# THIS ENV FILE EXAMPLE ONLY FOR DOCKER COMPOSE
# SEE https://docs.docker.com/compose/environment-variables/#the-env-file

#此处填写一个长度不小于16个字符,不大于32个字符的字符串
JWT_SECRET=7294c34e0b28ad28

# 将这里换成你的前端域名。如果允许多个域名访问,用英文逗号,分隔
ALLOWED_ORIGINS=example.com,www.example.com

# must be 64bit
# ===
# 这里并未被新版的文档定义,不推荐修改,如有需要可以尝试:
# openssl rand -hex 32
# 来生成新的 Encrypt_Key。
# ===
ENCRYPT_KEY=593f62860255feb0a914534a43814b9809cc7534da7f5485cd2e3d3c8609acab

修改完成,按下 ESC 退出编辑模式,然后键入 :wq 并回车离开 vim

启动后端#

docker compose up -d

使用 curl 测试后端状态#

执行命令: curl http://127.0.0.1:2333/api/v2
如果正常,那你会看到输出如下所示

root@mx-space:~/mx-space/core# curl http://127.0.0.1:2333/api/v2
{"name":"@mx-space/core","author":"Innei <https://innei.ren>","version":"3.41.2","homepage":"https://github.com/mx-space/core#readme","issues":"https://github.com/mx-space/core/issues"}

到这里,后端部署完成

部署前端#

拉取 Kami 源码#

Kami 是 mx-space 的默认前端,你也可以使用 mx-web-yun 等其他风格的前端

# 拉取源文件
cd && cd mx-space
git clone https://github.com/mx-space/kami.git --depth 1
git clone https://ghproxy.com/github.com/mx-space/kami.git --depth 1 # 中国大陆服务器请执行此命令以使用镜像源

# 切换到最新的 tag
cd kami && git fetch --tags && git checkout $(git rev-list --tags --max-count=1)

#拉取图片文件
git lfs fetch --all
git lfs pull

注意:如果无法正常拉取,可以到 GitHub 上手动下载文件并放到相应目录。

编辑前端 .env 环境配置文件#

复制 .env.example 为 .env

cp .env.example .env

使用 vim 编辑: vim .env

它看起来应该是这样的:

# API 地址
NEXT_PUBLIC_API_URL=https://server.test.cn/api/v2
# GATEWAY 地址
NEXT_PUBLIC_GATEWAY_URL=https://server.test.cn
#前端使用的配置项名字
NEXT_PUBLIC_SNIPPET_NAME=kami
# 如果使用 CDN, 修改产物前缀;一般留空
ASSETPREFIX=

在 vim 下,我们可以使用查找替换功能进行快速修改,只需输入 :g/server.test.cn/s//你的域名/g 并回车即可替换原域名

完成后按下 ESC 退出编辑模式,然后键入 :wq 并回车离开 vim

构建 Kami#

# 安装必需的模块
pnpm i
# 构建
pnpm build

编译过程需要一段时间,请保持终端正常连接

启动 Kami#

pnpm prod:pm2

使用 curl 测试前端状态#

执行命令: curl http://127.0.0.1:2333/api/v2
如果有返回结果,则认为正常。

配置反向代理#

笔者这里使用的是宝塔面板且安装了 Nginx,如果您使用的是 Caddy 等其他服务端或未使用宝塔面板请自行摸索

进入宝塔面板 — 网站,设置网站地址并自行解析

新建完成站点到设置 - 反向代理 - 添加反向代理

代理名字随意

目标 URL: http://127.0.0.1:2333 发送域名: $host

保存后点击 配置文件 删除全部内容,并将下方配置文件内容复制进去

#PROXY-START/
# generated 2023-01-25
# by bdovo.cc

location ~* \/(feed|sitemap|atom.xml)
{
    proxy_pass http://127.0.0.1:2333/$1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    add_header X-Cache $upstream_cache_status;
     
    add_header Cache-Control max-age=60;
} 

location /socket.io {
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_pass http://127.0.0.1:2333/socket.io;
}

location /api
{
    proxy_pass http://127.0.0.1:2333/api;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache


    set $static_fileJsNv8TWb 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileJsNv8TWb 1;
        expires 12h;
        }
    if ( $static_fileJsNv8TWb = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

location /proxy
{
    proxy_pass http://127.0.0.1:2333/proxy;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache


    set $static_fileJsNv8TWb 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileJsNv8TWb 1;
        expires 12h;
        }
    if ( $static_fileJsNv8TWb = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

location /admin #这里可以改成你想要的后台访问路径
{
    proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache


    set $static_fileJsNv8TWb 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileJsNv8TWb 1;
        expires 12h;
        }
    if ( $static_fileJsNv8TWb = 0 )
    {
    add_header Cache-Control no-cache;
    }
}

location /
{
    proxy_pass http://127.0.0.1:2323;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;

    #Set Nginx Cache


    set $static_fileSw1Jy3nG 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileSw1Jy3nG 1;
        expires 12h;
    }
    if ( $static_fileSw1Jy3nG = 0 )
    {
    add_header Cache-Control no-cache;
    }
}
#PROXY-END/

配置 SSL 证书#

这里和平常网站搭建一样,以你喜欢的方式配置 SSL 证书

使用宝塔面板的话也可以直接使用面板自带的 Let's Encrypt(配置反代后请使用 DNS 验证)

这里不再赘述,需要的可以自行搜索相关教程

后端初始化#

访问后端地址进行初始化

如果您直接使用的笔者在上文提供的 Nginx 反代配置,那么您应该访问 https://你的域名/admin

然后填写相关信息

你的 API 端点是:

  • API 地址:https://你的域名/api/v2
  • Gateway 地址:https://你的域名

而后按照引导,进入初始化流程。如没有顺利进入,尝试刷新 / 退回上一级。

完成#

到这里,你应该可以通过访问域名进入前端页面了。这里部署阶段就告一段落,如果需要进阶设置,请参阅 官方文档

那么,开始使用你的 mx-space 吧。

Enjoy it~

参考资料#

此文由 Mix Space 同步更新至 xLog
原始链接为 https://bdovo.cc/posts/experiences/build_mx-space

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。