前言#
你說的對,但是《Mix-Space》是由 Innei 自主研發的一款全新開放源代碼博客項目。項目發生在一個被稱作「Github」的幻想世界,在這裡,被神選中的人將被授予「Node.JS」,導引鍵盤之力。你將扮演一位名為「Developer」的神秘角色,在自由的 Coding 中邂逅性格各異、能力獨特的碼子們,和他們一起擊敗強敵,找回失散的開源協議 —— 同時,逐步發掘「Mix-Space」的真相。
準備材料#
本文演示伺服器由 雨雲 提供計算服務
- VPS / 伺服器一台(本文採用雨雲 美國洛杉磯 8c16g 伺服器,使用 Ubuntu 20.04 已提前安裝好寶塔面板)
- 域名一個
- 智慧的大腦
- 靈巧的雙手
安裝環境#
Docker#
curl -fsSL https://get.docker.com | bash
Node.JS#
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
Redis#
apt install redis
Git#
apt install git
Git LFS#
[!NOTE]
如果你不用 Kami 主題的話可以不用裝這個
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
MongoDB#
請參考 MongoDB 官網
安裝完成後需要手動啟動
systemctl enable mongod
systemctl start mongod
後端搭建#
請先將您的域名解析到你的伺服器(文中用 mxapi.xcnya.cn
作為 後端 API 示例)
Docker(推薦)#
從倉庫獲取 docker-compose.yml
mkdir /opt/mx-space
mkdir /opt/mx-space/core
cd /opt/mx-space/core
wget https://raw.githubusercontent.com/mx-space/core/master/docker-compose.yml
然後在同目錄下創建一個 .env
文件
寫入以下內容
# 隨便寫,要求 16≥ 字符串 ≥32
JWT_SECRET=
# 允許的域名,指的是你的前端域名,用","分開
ALLOWED_ORIGINS=
我的配置如圖,保存並退出後使用以下命令啟動容器
docker compose up -d
等待完成
如圖啟動完成後,使用你喜歡的方式反代 127.0.0.1:2333
並配置好 SSL 證書綁定到你的域名作為 後端 API
我這裡用寶塔面板,配置如圖(已提前配置好 SSL 證書)
完成後訪問你的後端 API 域名測試,出現如圖代表正常
手動搭建#
從倉庫拉取 core
mkdir /opt/mx-space
cd /opt/mx-space
git clone https://github.com/mx-space/core.git
cd core
安裝
npm install -g pnpm pm2
pnpm i
做和放寬,稍安勿躁,好東西馬上就要來了
然後輸入以下命令進行構建
pnpm build
pnpm bundle
然後在 apps/core/
中創建一個 ecosystem.config.js
(如果有就刪掉)
將以下內容粘貼進去,並注意配置 env{}
中的環境變量
const { cpus } = require('os')
const { execSync } = require('child_process')
const nodePath = execSync(`npm root --quiet -g`, { encoding: 'utf-8' }).split(
'\n',
)[0]
const cpuLen = cpus().length
module.exports = {
apps: [
{
name: 'mx-server',
script: 'out/index.js',
autorestart: true,
exec_mode: 'cluster',
watch: false,
instances: cpuLen,
max_memory_restart: '520M',
args: '',
env: {
MX_ENCRYPT_KEY: 'mx-space',
PORT: '2333', // 啟動端口
ALLOWED_ORIGINS: 'mx.xcnya.cn,mxspace.xcnya.cn', // 允許的域名,指的是你的前端域名,用","分開
JWT_SECRET: 'hPf6Rb8KfE6jOgY3cDuM6H6t' // 隨便寫,要求 16 ≥ 字符串 ≥ 32
},
},
],
}
然後使用 pm2 start ecosystem.config.js
啟動後端
如圖啟動完成後,使用你喜歡的方式反代 127.0.0.1:2333
並配置好 SSL 證書綁定到你的域名作為 後端 API
我這裡用寶塔面板,配置如圖(已提前配置好 SSL 證書)
完成後訪問你的後端 API 域名測試,出現如圖代表正常
配置後端#
後端搭建完成後需要進行初始化配置
[!IMPORTANT]
自 core 5.0 版本以來,原 /qaqdmin 被變更到了 /proxy/qaqdmin
訪問 https://你的後端域名/proxy/qaqdmin
然後會出現如圖
[!NOTE]
如果沒有出現初始化界面,請嘗試訪問
https://你的後端域名/proxy/qaqdmin#init
跟著一步步配置就好了
前端搭建#
Kami#
[!IMPORTANT]
Kami 已停止維護,為了更好的使用體驗,請跳過本節並使用下一節中的 Shiro 主題作為替代
Vercel#
點擊 一鍵部署到 Vercel
點進去之後先按照提示將倉庫 fork 到你的個人帳號
然後按圖配置
坐和放寬.ing
然後就好了
這時你用 Vercel 分配給你的域名是用不了的,所以你得綁個自己的域名
然後訪問前端域名,大功告成!
本地搭建#
請先將您的域名解析到你的伺服器(文中用 mx.xcnya.cn
作為 前端域名 示例)
克隆倉庫
cd /opt/mx-space
git clone https://github.com/mx-space/kami.git
cd kami
安裝
npm install -g pnpm pm2
git lfs fetch --all
git lfs pull
pnpm i
然後在同目錄創建一個 .env
文件,寫入以下內容
# API 地址
NEXT_PUBLIC_API_URL=https://你的後端域名/api/v2
# GATEWAY 地址
NEXT_PUBLIC_GATEWAY_URL=https://你的後端域名
#前端使用的配置項名字
NEXT_PUBLIC_SNIPPET_NAME=kami
# 如果使用 CDN, 修改產物前綴;一般留空
ASSETPREFIX=
然後輸入 pnpm build
開始構建
坐和放寬.ing
完成後使用 pnpm prod:pm2
啟動
如圖啟動完成後,使用你喜歡的方式反代 127.0.0.1:2323
並配置好 SSL 證書綁定到你的域名作為 前端 API
我這裡用寶塔面板,配置如圖(已提前配置好 SSL 證書)
然後訪問前端域名,大功告成!
Shiro#
關於 CLERK#
在 Shiro 主題中需要用到 Clerk,所以需要去 Clerk 官網註冊一個帳號
註冊完之後控制台點擊 Add application
名字隨便寫,然後創建
完成之後下滑找到這些,把這兩個東西保存好,請勿洩露
配置後端#
Shiro 前端構建之前需要先在後端進行一些設置
訪問你的後台,找到 附加功能 → 配置雲函數,點擊上面的 "+" 號
然後名稱填寫 shiro
,引用填寫 theme
,數據類型選 JSON
內容根據以下內容修改後覆蓋到右邊的框框中
{
"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:[email protected]",
"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": [
"https://github.com/Innei/static/blob/master/images/F0q8mwwaIAEtird.jpeg?raw=true",
"https://github.com/Innei/static/blob/master/images/IMG_2111.jpeg.webp.jpg?raw=true"
],
"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": [
"https://cdn.jsdelivr.net/gh/Innei/img-bed@master/20191211132347.png",
"https://cdn.innei.ren/bed/2023/0424213144.png"
]
},
"bilibili": {
"liveId": 1434499
}
}
}
}
然後點右上角的保存
Docker(?#
Shiro 文檔裡是沒寫 Docker 用法的,但是倉庫裡確實有 docker-compose.yml
這個文件,主要是我研究了半個小時屬實沒整明白,先挖個坑來年有幸再填吧
Vercel#
點擊 一鍵部署到 Vercel
[!IMPORTANT]
不建議直接點擊上方按鈕進行部署,不然後續沒辦法更新,請手動 fork
Innei/Shiro
倉庫到自己的 Github 帳號底下然後在 VercelNew Project
跟前面一樣的 fork 倉庫
填上環境變量信息然後點部署等會就好了 * *
一樣的綁上自己的域名,就宣布大功告成了!
手動搭建#
克隆倉庫
cd /opt/mx-space
git clone https://github.com/Innei/Shiro.git
cd Shiro
然後在同目錄下創建一個 .env
文件,填入以下內容
# 你的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=
輸入以下命令構建
npm install -g pnpm pm2
pnpm i
pnpm build
如圖完事之後我們可以輸入 pm2 start ecosystem.config.js
來啟動 Shiro
或者安裝為系統服務啟動
輸入 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
啟動完成後,使用你喜歡的方式反代 127.0.0.1:2323
並配置好 SSL 證書綁定到你的域名作為 前端域名(也就是博客域名
我這裡用寶塔面板,配置如圖(已提前配置好 SSL 證書)
然後訪問前端域名,大功告成!
後記#
如果你跟我一樣遇到了類似的問題
請看這篇文章
此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.nekorua.com/posts/build/68.html