3464 字
17 分钟
Mx Space部署记录
2025-06-15

后端部署#

mx-space官方文档:引言 - Mix Space 文档

我这里使用了docker部署的方式,详细步骤参考官方文档啊,大概流程如下:

安装docker#

这个直接参考官方文档里的教程即可,我这里的比较复杂。

  1. 检查卸载老版本docker

    注:docker的旧版本不一定被称为docker,docker.io 或 docker-engine也有可能,所以我们卸载的命令为:

    Terminal window
    sudo apt-get remove docker docker-engine docker.io containerd runc
  2. 更新软件包

    Terminal window
    sudo apt update
    sudo apt upgrade
  3. 安装docker依赖 Docker在Ubuntu上依赖一些软件包。执行以下命令来安装这些依赖:

    Terminal window
    sudo apt-get install ca-certificates curl gnupg lsb-release
  4. 添加Docker官方GPG密钥 旧方法,已废弃:

    Terminal window
    # 旧方法,已废弃
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

apt-key 命令已被弃用,并且推荐使用新的方法管理 APT 密钥。具体来说,应该将 GPG 密钥放入 trusted.gpg.d 目录中,而不是使用 apt-key。

新的方法,以符合新规范的方式将 Docker 的 GPG 密钥添加到 APT 的密钥管理中

Terminal window
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/trusted.gpg.d/docker.asc
···
5. 添加Docker软件源
```bash
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  1. 安装Docker

    Terminal window
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  2. 配置用户组(可选) 默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo。命令如下:

    Terminal window
    sudo usermod -aG docker $USER

    注:重新登录才能使更改生效。

    配置后可以查看通过以下命令查看docker用户组成员:

    Terminal window
    getent group docker
  3. 安装工具

    Terminal window
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
  4. 重启Docker

    Terminal window
    service docker restart

如果您成功安装了 Docker 和 Docker-Compose,可以通过以下命令查看版本:

docker -v
docker compose version

拉取配置文件#

Terminal window
cd && mkdir -p mx-space/core && cd $_
# 拉取 docker-compose.yml 文件
wget https://fastly.jsdelivr.net/gh/mx-space/core@master/docker-compose.yml

配置Core启动配置文件#

官方文档中填入对应配置

PixPin_2025-06-09_19-33-10

填好后,复制配置,粘贴到教程指定的docker-compose.ymlenvironment 字段中

启动Core#

Terminal window
docker compose up -d

建议先确认一下docker hub的账号是否登录,或者可以直接退出再重登一下:

Terminal window
docker logout # 退出登录
docker login -u <用户名> # 登录

我这里服务器开vpn也没法拉取镜像,所以选择本地拉取镜像并保存为.tar文件,然后传输到服务器中

  1. 本地通过vpn拉取镜像:

    Terminal window
    docker compose up -d
  2. 查看镜像:

    Terminal window
    sudo docker compose images

    这里输出如下:

    Terminal window
    CONTAINER REPOSITORY TAG IMAGE ID SIZE
    mongo mongo latest 15fb53a5160e 292MB
    mx-server innei/mx-server latest 906326c82174 164MB
    redis redis alpine 48501c5ad00d 24.3MB
  3. 将所需镜像打包为.tar文件:

    Terminal window
    sudo docker save -o mongo.tar mongo
    sudo docker save -o mx-server.tar innei/mx-server
    sudo docker save -o redis.tar redis
  4. 传到服务器,文件夹没有要求,我直接放到mx-space/core路径下了

  5. 加载镜像

    Terminal window
    sudo docker load -i mongo.tar
    sudo docker load -i mx-server.tar
    sudo docker load -i redis.tar
  6. 验证是否成功加载

    Terminal window
    sudo docker images
  7. 启动

    Terminal window
    sudo docker compose up -d

启动后可以在浏览器中访问服务器IP+2333端口来测试后端是否正常运行:

Terminal window
http://<服务器IP>:2333

如果正常运行会显示如下界面:

PixPin_2025-06-09_19-41-35

docker相关指令#

exec进入容器

Docker 原生支持直接进入容器:

Terminal window
docker exec -it <容器ID或名称> /bin/bash

例如:docker exec -it mx-server bash

ps查看容器

Terminal window
# 查看所有容器(包括运行中和已停止的)
docker ps -a
# 仅查看正在运行的容器
docker ps

退出终端

  1. 直接退出

    Terminal window
    exit

    或者Ctrl+D也可以

  2. 保持容器运行但断开连接

    如果不想终止容器内的进程,可以按以下组合键:

    Terminal window
    Ctrl + P, Ctrl + Q
  3. 强制终止连接(不推荐)

    如果终端卡死或无响应,可以强制关闭终端窗口或使用:

    Terminal window
    kill -9 <终端进程ID> # 极端情况下使用

配置反向代理#

这里使用宝塔面板配置反向代理

安装宝塔面板#

  1. 更新系统软件包

    Terminal window
    sudo apt update && sudo apt upgrade -y
  2. 安装宝塔面板

    Terminal window
    if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec
  3. 安装完成后会输出信息,需要记录一下 PixPin_2025-06-10_20-10-56

    Terminal window
    请选择以下其中一种方式解决不安全提醒
    1、下载证书,地址:https://dg2.bt.cn/ssl/baota_root.pfx,双击安装,密码【www.bt.cn】
    2、点击【高级】-【继续访问】或【接受风险并继续】访问
    教程:https://www.bt.cn/bbs/thread-117246-1-1.html
    mac用户请下载使用此证书:https://dg2.bt.cn/ssl/mac.crt
    ========================面板账户登录信息==========================
    【云服务器】请在安全组放行 22622 端口
    外网ipv4面板地址: https://120.26.143.148:8888/cbba2002
    内网面板地址: https://172.26.165.49:8888/cbba2002
    username: 169017267@qq.com
    password: General@0609
    浏览器访问以下链接,添加宝塔客服
    https://www.bt.cn/new/wechat_customer
    ==================================================================
  4. 登录面板后就可以将面板地址、账号、密码等修改掉了

    我这里出现了一个小问题,面板设置中修改面板端口后无法访问,在命令行中使用bt命令(8)再次修改为8888才能正常使用

配置反向代理#

我这里已经安装过Nginx了,但是宝塔面板中显示未安装Nginx,我搜了一下,论坛中说宝塔面板不推荐在已有环境的上进行安装使用,且无法接入管理自行安装的环境服务。所以只能手动将nginx卸载掉,重新用宝塔安装一个了

Terminal window
# 彻底卸载原有 Nginx(谨慎操作!)
sudo apt purge nginx nginx-common nginx-core -y
sudo rm -rf /etc/nginx /var/log/nginx

然后在宝塔面板中重新安装nginx

进入「宝塔面板」>「网站」>「设置后端网站地址」,设置为060010.xyz

主机名随意填,记得解析

新建完站点后,「站点」>「设置」>「反向代理」>「添加反向代理」

代理名字这里方便管理就设置为 后端

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

PixPin_2025-06-10_21-15-34

保存后点击 配置文件 将下方配置文件文本复制复制进去,记得全选删掉以前的配置

#PROXY-START/
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 /
{
proxy_pass http://127.0.0.1:2333/;
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;
}
}
#PROXY-END/

该配置是按照官方文档的双域名配置的,具体参考拓展内容 - Mix Space 文档的双域名部分

测试能否访问后端#

上面反向代理是按照双域名(前端和后端有自己单独的域名)配置的,则后台地址就是<后端域名>/proxy/qaqdmin(也可以临时用<服务器IP>:2333/proxy/qaqdmin来访问后台)

域名解析#

在域名提供商那里配置DNS解析 PixPin_2025-06-10_21-33-14

我这里配置了两个:

  • 记录类型:A,解析名称:@,内容:<服务器IP地址>。这个就是060010.xyz
  • 记录类型:A,解析名称:www,内容:<服务器IP地址>。这个就是www.060010.xyz

设置好域名解析后,我们在浏览器中访问这两个链接,页面会是空白或者提示”您的请求在Web服务器 中没有找到对应的站点”,这是因为我们还没有设置服务器绑定 PixPin_2025-06-10_21-37-20

配置SSL证书#

这里申请了Let’s Encrypt的免费证书,需要手动配置TXT解析来验证

PixPin_2025-06-10_22-01-42

以060010.xyz的解析为例,这里给出以下内容:

PixPin_2025-06-10_22-03-14

  • 解析域名:060010.xyz
  • 文件路径:/www/wwwroot/060010.xyz.well-known/acme-challenge/LvnEq8aat……
  • 文件内容:LvnEq8aata……

只需要到域名提供商那里配置对应的TXT解析即可,这个就是填加一条解析,解析类型选TXT,名称填_acme-challenge.060010.xyz,内容填上面的文件内容,然后保存

PixPin_2025-06-10_22-06-09

PixPin_2025-06-10_22-08-44

1panel配置反向代理#

新的服务器安装的是1panel,所以整理了一下1panel的配置过程

首先默认已经安装了OpenResty

PixPin_2025-08-12_18-12-58

「网站」>「创建网站」>「反向代理」>「填写域名」,创建成功后,点击新建的域名右侧「操作」>「配置」>「配置文件」,打开该域名的配置文件,需要在原配置文件的基础上添加以下内容:

location /socket.io {
proxy_pass http://127.0.0.1:2333/socket.io;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}
location / {
proxy_pass http://127.0.0.1:2333;
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;
}

这个在宝塔面板中添加是没有问题的,但是在1panel中添加后发现了一个问题,报错大概内容是这样的(非直接复制,上下文顺序可能有问题,仅供参考):

location / in /www/sites/mx_cbba_top/proxy/root.conf:1 nginx: [emerg] 服务内部错误:stderr.2025/08/1217:46:23[emerg]379#379 configuration file /usr/local/openresty/nginx/conf/nginx.conf test failedduplicate location ”/ in /www/sites/mx_ cbba_ top/proxy/root.conf:1 nginx:

说明我在 Nginx 配置中添加了 location / 反向代理规则,但是和/www/sites/mx_ cbba_ top/proxy/root.conf中的 location / 冲突了

大概有两个解决思路:

  1. 删掉root.conf中冲突的 location / 部分内容
  2. root.conf中冲突的 location / 部分内容合并到主配置文件中,然后注释掉include

我选择将冲突部分合并到主配置文件中,不修改原本的root.conf

root.conf中内容主要是 location / 这部分,我直接写进这个文件的 location / 部分了,合并后内容如下:

server {
listen 80 ;
listen [::]:80 ;
listen 443 ssl ;
listen [::]:443 ssl ;
server_name mxserver.cbba.top;
index index.php index.html index.htm default.php default.htm default.html;
# 全局代理头设置
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 日志
access_log /www/sites/mxserver_cbba_top/log/access.log main;
error_log /www/sites/mxserver_cbba_top/log/error.log;
# 静态文件
location ^~ /.well-known {
allow all;
root /usr/share/nginx/html;
}
# HTTP强制跳转HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# SSL配置
ssl_certificate /www/sites/mxserver_cbba_top/ssl/fullchain.pem;
ssl_certificate_key /www/sites/mxserver_cbba_top/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
proxy_set_header X-Forwarded-Proto https;
add_header Strict-Transport-Security "max-age=31536000";
http2 on;
# WebSocket支持(Socket.IO)
location /socket.io {
proxy_pass http://127.0.0.1:2333/socket.io;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
}
# 默认反向代理
location / {
proxy_pass http://127.0.0.1:2333;
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;
# 从root.conf补充的配置
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_http_version 1.1;
add_header Cache-Control no-cache;
proxy_ssl_server_name off;
proxy_ssl_name $proxy_host;
}
# 其它代理配置(暂时禁用,与当前配置文件的location /冲突,选择将root.conf中的内容写到当前文件中)
# include /www/sites/mxserver_cbba_top/proxy/*.conf;
}

保存并重载Nginx后,可以通过<域名>/proxy/qaqdmin访问后端页面

⚠️注意:该配置是按照官方文档的双域名配置的,具体参考拓展内容 - Mix Space 文档的双域名部分

PixPin_2025-08-12_19-26-37

前端部署#

我这里部署的是Shiro主题,官方文档如下:部署 - Mix Space 文档

前提要求#

  • 你已安装 Mix Space 后端并且已启动
  • (选择 Vercel 部署)已注册 VercelGitHub 账号

设置主题配置#

进入 Mix Space 后台,后台链接如下:

服务器IP:2333/proxy/qaqdmin

填写站点配置

PixPin_2025-06-10_18-57-19

进入「配置与云函数」页面,点击右上角的新增按钮,在编辑页面中,填入以下设置:

  • 名称:shiro
  • 引用:theme
  • 数据类型:JSON
  • 数据:(点击下方的按钮复制)

请注意,这份配置你需要自行修改成符合你的需求的配置。直接使用下面的配置可能会导致你的博客无法按照你的预期运行。

下面的配置可能不全,更多配置项的信息请移步 配置项 了解。

此外,配置也可写成 yaml 格式,此时数据类型应选择 YAML

{
"footer": {
"otherInfo": {
"date": "2020-{{now}}",
"icp": {
"text": "萌 ICP 备 20236136 号",
"link": "https://icp.gov.moe/?keyword=20236136"
}
},
"linkSections": [
{
"name": "关于",
"links": [
{
"name": "关于本站",
"href": "/about-site"
},
{
"name": "关于我",
"href": "/about"
},
{
"name": "关于此项目",
"href": "https://github.com/innei/Shiro",
"external": true
}
]
},
{
"name": "更多",
"links": [
{
"name": "时间线",
"href": "/timeline"
},
{
"name": "友链",
"href": "/friends"
},
{
"name": "监控",
"href": "https://status.innei.in/status/main",
"external": true
}
]
},
{
"name": "联系",
"links": [
{
"name": "写留言",
"href": "/message"
},
{
"name": "发邮件",
"href": "mailto:i@innei.ren",
"external": true
},
{
"name": "GitHub",
"href": "https://github.com/innei",
"external": true
}
]
}
]
},
"config": {
"color": {
"light": [
"#33A6B8",
"#FF6666",
"#26A69A",
"#fb7287",
"#69a6cc",
"#F11A7B",
"#78C1F3",
"#FF6666",
"#7ACDF6"
],
"dark": [
"#F596AA",
"#A0A7D4",
"#ff7b7b",
"#99D8CF",
"#838BC6",
"#FFE5AD",
"#9BE8D8",
"#A1CCD1",
"#EAAEBA"
]
},
"bg": [
"/static/images/F0q8mwwaIAEtird.jpeg",
"/static/images/IMG_2111.jpeg.webp.jpg"
],
"custom": {
"css": [],
"styles": [],
"js": [],
"scripts": []
},
"site": {
"favicon": "/innei.svg",
"faviconDark": "/innei-dark.svg"
},
"hero": {
"title": {
"template": [
{
"type": "h1",
"text": "Hi, I'm ",
"class": "font-light text-4xl"
},
{
"type": "h1",
"text": "Innei",
"class": "font-medium mx-2 text-4xl"
},
{
"type": "h1",
"text": "👋。",
"class": "font-light text-4xl"
},
{
"type": "br"
},
{
"type": "h1",
"text": "A NodeJS Full Stack ",
"class": "font-light text-4xl"
},
{
"type": "code",
"text": "<Developer />",
"class": "font-medium mx-2 text-3xl rounded p-1 bg-gray-200 dark:bg-gray-800/0 hover:dark:bg-gray-800/100 bg-opacity-0 hover:bg-opacity-100 transition-background duration-200"
},
{
"type": "span",
"class": "inline-block w-[1px] h-8 -bottom-2 relative bg-gray-800/80 dark:bg-gray-200/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 group-hover:animation-blink"
}
]
},
"description": "An independent developer coding with love."
},
"module": {
"activity": {
"enable": true,
"endpoint": "/fn/ps/update"
},
"donate": {
"enable": true,
"link": "https://afdian.net/@Innei",
"qrcode": [
"/static/images/20191211132347.png",
"/static/images/0424213144.png"
]
},
"bilibili": {
"liveId": 1434499
}
}
}
}

点击按钮保存配置,随后继续进行下面的步骤。

准备Clerk账号#

此部分参考教程:Mix Space博客系统搭建 - 哔哩哔哩

在 Shiro 主题中需要用到 Clerk,所以需要去 Clerk 官网(https://clerk.com)注册一个账号 注册完之后保存好控制台中的信息

PixPin_2025-06-11_13-57-39

安装npm

Terminal window
sudo apt install npm

安装pnpm

Terminal window
npm install -g pnpm

部署#

Vercel构建#

进入https://github.com/innei/Shiro

Fork这个仓库到自己账号下

进入Vercel-New Project,选择刚才Fork的仓库

等待构建

本地#

在终端输入

Terminal window
cd ~/mx-space
git clone https://github.com/Innei/Shiro.git
cd Shiro

然后

Terminal window
vim .env

将之前保存的这些内容输入到.env文件里,api地址和域名是启动后端时填的,CLERK公钥和私钥在上面准备Clerk账号时保存了,注释删掉

# 你的API地址
NEXT_PUBLIC_API_URL=
# 你的API域名
NEXT_PUBLIC_GATEWAY_URL=
# CLERK 公钥
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
# CLERK 私钥
CLERK_SECRET_KEY=
# OpenAI Key(不多说了,自己看着整吧)
OPENAI_API_KEY=

然后输入:

Terminal window
pnpm i
pnpm build

结束后终端里输出的内容如下

PixPin_2025-06-11_14-33-08

我们把它作为系统服务启动

vim /etc/systemd/system/mx-shiro.service

然后输入以下内容

[Unit]
Description=MX-Space Shiro Theme Daemon
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
WorkingDirectory=/opt/mx-space/Shiro
ExecStart=npx next start -p 2323
Restart=always

使用以下命令启动

systemctl enable mx-shiro
systemctl start mx-shiro
Mx Space部署记录
https://fuwari.cbba.top/posts/mx-space部署记录/
作者
Chen_Feng
发布于
2025-06-15
许可协议
CC BY-NC-SA 4.0