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 或其他方式连接终端，执行下述命令

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

等待安装完成

安装 Docker（后端依赖）

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

Copy
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

Copy
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

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

安装所需模块

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

npm install -g pnpm pm2

部署后端

拉取 Docker 配置文件

Copy
# 新建文件夹
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 进入编辑模式
然后按照下文进行修改:

Copy
# 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

启动后端

Copy
docker compose up -d

使用 curl 测试后端状态

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

Copy
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 等其他风格的前端

Copy
# 拉取源文件
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

Copy
cp .env.example .env

使用 vim 编辑: vim .env

它看起来应该是这样的:

Copy
# 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

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

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

启动 Kami

Copy
pnpm prod:pm2

使用 curl 测试前端状态

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

配置反向代理

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

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

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

代理名字随意

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

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

Copy
#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~

参考资料

mx-space 官方文档: https://mx-space.js.org

超可爱的前后端分离博客 Mix-space 搭建 - 喵二の小博客: https://www.miaoer.xyz/posts/blog/mx-install

哈喽，Mix Space。- 椎名雪的 Blog: https://shiinayuki.me/posts/experiences/hello_mx-space

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