Shiro部署教程(备忘)
1.部署Core
1.必要的准备
- 域名
- 域名所需ssl证书,需要开启全站https
提示,如果需要多个域名访问一个前端,则需要在docker-compse里加上
localhost,127.0.0.1
一.安装Docker
首先,安装一些必要的软件包:
然后加入 Docker 的 GPG 公钥和 apt 源:apt update apt upgrade -y apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates
国内机器可以用清华 TUNA 的国内源:apt update apt upgrade -y apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates
然后更新系统后即可安装 Docker CEcurl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list
我们可以使用 Docker 官方发布的 Github 直接安装最新版本docker-compose:apt update apt install docker-ce docker-ce-cli containerd.io
此时可使用 docker-compose version 命令检查是否安装成功curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
当然可以用1panel点点点,也是可以的,我这里用的就是1panel
二.拉取Core文件
1.拉取配置文件
cd /opt && mkdir -p mx-space/core && cd $_ # 拉取 docker-compose.yml 文件 wget https://fastly.jsdelivr.net/gh/mx-space/core@master/docker-compose.yml
2.修改Core配置文件
cd /opt/mx-space/core vim docker-compose.yml
Warning
默认配置数据库未使用密码,万不可放行数据库端口!若需要密码/或使用远程数据库,可根据官方文档自行配置
- JWT 密钥:需要填写长度不小于 16 个字符,不大于 32 个字符的字符串,用于加密用户的 JWT,务必保存好自己的密钥,不要泄露给他人。
- 被允许的域名:需要填写被允许的域名,通常是前端的域名,如果允许多个域名访问,用英文逗号,分隔。
- 是否开启加密:如果你确定要开启加密,将 false 改为 true,开启加密后,你需要在下方填写加密密钥。
加密密钥:如果你不知道这是什么,那么不建议开启此功能,具体内容可参考 https://mx-space.js.org/usage/security.html
若开启加密,则需注意密钥长度必须为 64 位且只有小写字母和数字,不然会在初始化时报错。注意这是不可逆的,务必保存自己的秘钥。所以并不是非常推荐使用,除非你真的需要加密 API Key. 密钥可以通过
openssl rand -hex 32
命令生成。请务必牢记。启动
docker compose up -d
3.反代与更新
1.反向代理(默认为单域名)
以1Panel+OpenResty为例
- 新建静态网站
- 配置SSL证书开启HTTPS
- 在NGINX配置文件最后一个}的上方另起一行,粘贴如下配置,并保存
## 反向代理开始,直接复制官方文档的
## WebSocket 地址
location /socket.io {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:2333/socket.io;
}
## API 地址
location /api/v2 {
proxy_pass http://127.0.0.1:2333/api/v2;
}
## 简读 render 地址
location /render {
proxy_pass http://127.0.0.1:2333/render;
}
## 前端地址
location / {
proxy_pass http://127.0.0.1:2323;
}
## 后台地址
location /proxy {
proxy_pass http://127.0.0.1:2333/proxy;
}
location /qaqdmin {
proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
}
## RSS 地址
location ~* \/(feed|sitemap|atom.xml) {
proxy_pass http://127.0.0.1:2333/$1;
}
## 反向代理结束
Core初始化
- 反向代理配置完成,访问后端 https://后端域名/proxy/qaqdmin
- 例: https://api.example.cc/proxy/qaqdmin
- 根据页面提示完成初始化, 若完成后未正确跳转后台,
再次进入 https://api.example.cc/proxy/qaqdmin 即可
至此,Core内核已经部署完成
Core更新
cd /opt/mx-space/core
docker-compose pull && docker compose up -d
接下来就是前端的部署了
准备工作
Node.js以及相关环境
刷新系统包缓存与安装常用/必备软件包
apt update && apt install git curl vim wget git-lfs -y
1、安装NVM
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh |bash
2、运行 source ~/.profile 命令将环境变量重新加载到当前会话中。
source ~/.profile
3、列出 Node.JS 的可用版本。
nvm ls-remote
4.确定版本后,运行 nvm install version 命令下载并安装它。例如,安装 Node.JS 20.12.2 ,推荐 V20.12.2 版本(因为别的博主这么说)
# 安装
nvm install 20.12.2
# 检查版本
node -v
5、安装 pnpm pm2
npm install -g pnpm pm2
6. 安装sharp
npm i -g sharp
pnpm add sharp
# 配置sharp环境变量
# export NEXT_SHARP_PATH=/root/node_modules/sharp
Shiro的部署和构建
一.Core后端云函数配置
进入 Mix Space 后台,进入「配置与云函数」页面,点击右上角的新增按钮,在编辑页面中,填入以下设置:
- 名称:shiro
- 引用:theme
- 数据类型:JSON
- 数据:右侧复制以下示例,更改为自己的信息(此处我采用innei的实例)
具体可以查看官方文档
{
"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": [
"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
}
}
}
}
二.拉取 Shiro/Shiroi
cd /opt/mx-space
# 个人习惯在/opt/mx-space目录下部署Mx-Space与前端Shiro/Kami
# 所以此处./mx-space为mx后端/前端项目文件夹
git clone https://github.com/Innei/Shiro.git
三 · 配置 .env
复制 .env.example 为 .env并编辑 .env 文件
cd /opt/mx-space/Shiro
mv .env.template .env
vim .env
.env示例
# 后端API地址
NEXT_PUBLIC_API_URL=https://api.example.com/api/v2
# 后端网关地址
NEXT_PUBLIC_GATEWAY_URL=https://api.example.com
# TMDB信息获取
TMDB_API_KEY=
# GitHub token,用来获取前端版本哈希
GH_TOKEN=
四.开始构建 Shiro/Shiroi项目
cd /opt/mx-space/Shiro
pnpm i && pnpm build
若服务器所在区域无法访问NPM官方源,可能导致依赖安装失败而出现报错
解决:构建前手动修改项目 .npmrc 配置文件
cd /opt/mx-space/Shiro
vim .npmrc
# 1 ↑修改registry为taobao源(https://registry.npmmirror.com)或其他国内镜像源
# nrm use taobao
# 2 ↑若安装有nrm (npm 的镜像源管理工具)也可使用nrm
pnpm i && pnpm build
# 最后重新安装依赖、构建
构建完成后就能准备启动,建议是使用screen后台保活,以下给出screen启动方法
Shiro 启动
apt install screen -y
# Debian/Ubuntu安装Screen
screen -R shiro
# 新建shiro会话
cd /opt/mx-space/Shiro
npx next start -p 2323
# pnpm prod:pm2
# 启动shiroi
启动完成后 按 Ctrl+A+D即可退出并挂起 shiro 对话,完成Shiro后台运行。
Shiro更新
# 进入工作目录
cd /opt/mx-space/Shiro
# 更新
git pull
# git push
screen -R shiroi -X quit
# nrm use taobao (根据服务器 位置 / 网络 情况选择是否换源)
# 安装依赖、构建
pnpm i && pnpm build
# 使用screen实现后台启动
screen -R shiroi
npx next start -p 2323
玖月佬说是试过了,那就是能用!
部分问题
可以参考玖月博客,我放在下面了,这里贴上(照抄)一个比较常见的字体下载错误的解决办法
解决:更改hosts文件,为fonts.googleapis.com / fonts.gstatic.com指定一个服务器可以Ping通的IP
可以用itdog查下字体域名的ip,然后服务器尝试ping一下,哪个ping的通就改哪个
参考资料
致谢
感谢玖月,在我部署遇到问题的时候给我的帮助,犯了很多很蠢的错误,他都帮我耐心的解决了,之后有别的问题也问了他,是一个非常好的人,谢谢玖月哥。