Getting Started: Docker Deployment#
Recommendation Index: ★★★★★
Difficulty Index: ★
Using Docker for deployment, without separating the front and back ends, the deployment requirements are as follows:
- 1 server, with memory > 1G
- 1 domain name (domestic servers need to be filed)
Note: The backend does not come with a theme by default. After running the service, you need to log in to the backend management interface https://www.blog.com/proxy/qaqdmin
to configure the theme according to Cloud Functions.
Configuration Files#
The directory structure is as follows, .env
and docker-compose.yml
need to be created by the user, and the data directory will be automatically generated after the container runs.
📂 ~/mix-space
│
├── 📜 .env
├── 📜 docker-compose.yml
└── 📂 data
├── 📂 mongo
├── 📂 redis
└── 📂 core
.env#
Note: API-related configurations generally do not need to be modified.
# 💻 Frontend Configuration
# 🌐 API Related Configuration
NEXT_PUBLIC_API_URL=http://core:2333/api/v2
NEXT_PUBLIC_GATEWAY_URL=http://core:2333/
# 🔑 Authentication & API Keys
TMDB_API_KEY=
GH_TOKEN=
# 🖥️ Backend Configuration
# 🔐 Security Configuration
JWT_SECRET=G7xJpQzW8mV4L2YfK9N6T1RbX3dMC0H(32 characters)
ALLOWED_ORIGINS=
ENCRYPT_KEY=593f62860255feb0a914534a43814b9809cc7534da7f5485cd2e3d3c8609acab(64 characters)
ENCRYPT_ENABLE=false
# 🚀 Cache Related Configuration
CDN_CACHE_HEADER=true
FORCE_CACHE_HEADER=false
# 🛢 Database Configuration
MONGO_CONNECTION=
# ⚡ Request Throttling
THROTTLE_TTL=10
THROTTLE_LIMIT=20
docker-compose.yml#
services:
shiro:
container_name: shiro
image: innei/shiro:latest
volumes:
- ./.env:/app/.env
restart: always
environment:
- NEXT_SHARP_PATH=/usr/local/lib/node_modules/sharp
ports:
- "127.0.0.1:2323:2323"
depends_on:
- core
networks:
- mix-space
core:
container_name: core
image: innei/mx-server:latest
environment:
- TZ=Asia/Shanghai
- NODE_ENV=production
- DB_HOST=mongo
- REDIS_HOST=redis
volumes:
- ./data/core:/root/.mx-space
ports:
- "127.0.0.1:2333:2333"
depends_on:
- mongo
- redis
networks:
- mix-space
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:2333/api/v2/ping"]
interval: 1m30s
timeout: 30s
retries: 5
start_period: 30s
mongo:
container_name: mongo
image: mongo
volumes:
- ./data/mongo:/data/db
networks:
- mix-space
restart: unless-stopped
redis:
image: redis:alpine
container_name: redis
volumes:
- ./data/redis:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
networks:
- mix-space
restart: unless-stopped
networks:
mix-space:
driver: bridge
Nginx Reverse Proxy#
Please add an A record pointing to the server IP in the domain name (using www.blog.com
as an example), and then add the following server block.
server {
listen 80;
listen 443 ssl http2 ;
server_name www.blog.com;
index index.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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
error_log /www/sites/www.example.com/log/error.log;
access_log /www/sites/www.example.com/log/access.log;
location /socket.io {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
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;
}
location /api/v2 {
proxy_pass http://127.0.0.1:2333/api/v2;
}
location /render {
proxy_pass http://127.0.0.1:2333/render;
}
location / {
proxy_pass http://127.0.0.1:2323;
}
location /qaqdmin {
proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
}
location /proxy {
proxy_pass http://127.0.0.1:2333/proxy;
}
location ~* \/(feed|sitemap|atom.xml) {
proxy_pass http://127.0.0.1:2333/$1;
}
ssl_certificate /www/sites/www.example.com/ssl/fullchain.pem;
ssl_certificate_key /www/sites/www.example.com/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
limit_conn perserver 300;
limit_conn perip 25;
limit_rate 512k;
}
Advanced: Traditional Method Deployment#
Recommendation Index: ★★★
Difficulty Index: ★★★
Build and deploy with front and back ends separated, the deployment requirements are as follows:
- Simple Deployment/Automatic Deployment:
- 1 server, with memory > 1G
- 2 domain names, which can be subdomains
- Manual Deployment
- 1 server, with memory > 2G
- 2 domain names, which can be subdomains
Note: The backend does not come with a theme by default. After running the service, you need to log in to the backend management interface https://backend.blog.com/proxy/qaqdmin
to configure the theme according to Cloud Functions.
Build Backend#
Prepare Environment#
-
Install nodejs, version 20.12.2 is recommended.
sudo apt-get install curl curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash nvm install 20.12.2
-
Install redis
sudo apt-get install redis-server
-
Install mongodb, taking Ubuntu 24.04 as an example.
sudo apt-get install gnupg curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \ sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \ --dearmor echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list sudo apt-get update sudo apt-get install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod sudo systemctl status mongod
For installation on other systems, refer to: MongoDB Official Documentation.
Simple Deployment#
Backend repository: Mix Space/core
-
Directly download the built Linux version.
mkdir ~/mix-space/core && cd $_ curl -L -O https://github.com/mx-space/core/releases/latest/download/release-linux.zip unzip release-linux.zip rm release-linux.zip
-
Generate 32-bit and 64-bit characters.
openssl rand -base64 24 | cut -c1-32 # for jwt_secret openssl rand -base64 48 | cut -c1-64 # for encrypt key
-
Edit
ecosystem.config.js
.const { cpus } = require('os'); const { execSync } = require('child_process'); const nodePath = execSync(`npm root --quiet -g`, { encoding: 'utf-8' }).trim(); const cpuLen = cpus().length; module.exports = { apps: [ { name: 'mix-space', script: 'index.js', autorestart: true, exec_mode: 'cluster', watch: false, instances: cpuLen, max_memory_restart: '500M', args: [ '--color', '--encrypt_enable', '--encrypt_key ********************************(64 characters)', '--port 2333', '--allowed_origins example1.com,example2.com,localhost', '--jwt_secret ********************(16~32 characters)', ].join(' '), env: { NODE_ENV: 'production', NODE_PATH: nodePath, }, }, ], };
-
Start the backend service.
npm install -g pm2 pm2 start ecosystem.config.js
Manual Deployment#
-
Install the backend service.
mkdir ~/mix-space && cd $_ git clone https://github.com/mx-space/core.git --depth=1 cd core npm install -g pnpm pnpm i
-
Build the backend service.
pnpm build pnpm bundle
-
Create a symbolic link and modify
ecosystem.config.js
according to Simple Deployment.ln -s ./app/core/ecosystem.config.js ecosystem.config.js
-
Start the backend service.
npm install -g pm2 pm2 start ecosystem.config.js
Build Frontend#
Prepare Environment#
-
Install dependencies.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash nvm install 20.12.2 npm install -g pnpm pm2 npm i -g sharp
Simple Deployment#
-
Frontend repository: Innie/Shiro
-
Directly download the built Linux version.
mkdir ~/mix-space/shiro && cd $_ curl -L -O https://github.com/Innei/Shiro/releases/latest/download/release.zip unzip release.zip rm release.zip
-
Edit
ecosystem.config.js
.module.exports = { apps: [ { name: 'shiro', script: 'server.js', autorestart: true, watch: false, max_memory_restart: '500M', env: { PORT: 2323, NODE_ENV: 'production', NEXT_SHARP_PATH: process.env.NEXT_SHARP_PATH, NEXT_PUBLIC_API_URL: 'http://127.0.0.1:2323/api/v2', NEXT_PUBLIC_GATEWAY_URL: 'http://127.0.0.1:2323' }, log_date_format: 'YYYY-MM-DD HH:mm:ss', }, ], }
-
Start the frontend service.
pm2 start ecosystem.config.js
Automatic Deployment#
-
Create the frontend directory.
mkdir -p ~/mix-space/shiro && cd $_
Edit the environment variable
.env
.NEXT_PUBLIC_API_URL=https://example.net/api/v2 NEXT_PUBLIC_GATEWAY_URL=https://example.net TMDB_API_KEY= GH_TOKEN=
-
Fork the frontend repository, wait for it to complete, then go to the Actions tab to enable the Workflow. Next, go to the Settings tab, click on [Secrets and variables] - [Actions] - [New repository secret] to add the following variables.
Name | Secret | Description |
---|---|---|
HOST | example.com | SSH login address |
PORT | 22 | SSH login port |
USER | admin | SSH login username |
PASSWORD | P@ssw0rd | SSH login password, either this or KEY |
KEY | ssh-rsa***** | SSH private key, either this or PASSWORD |
-
Switch to the Code tab, create
.github/workflows/deploy.yml
.name: Deploy on: push: branches: [main] permissions: contents: write concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: name: Build artifact runs-on: ubuntu-latest strategy: matrix: node-version: [20.x] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 lfs: true - name: Checkout LFS run: git lfs checkout - uses: pnpm/action-setup@v2 with: version: 9.x.x - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'pnpm' - uses: jongwooo/next-cache@v1 - name: Install & Build run: | pnpm install sh ./ci-release-build.sh - uses: actions/upload-artifact@v4 with: name: release.zip path: assets/release.zip deploy: name: Deploy artifact runs-on: ubuntu-latest needs: build steps: - uses: actions/download-artifact@v4 with: name: release.zip - name: SCP Transfer uses: appleboy/[email protected] with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.KEY }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} source: release.zip target: /tmp/shiro - name: Remote Deployment uses: appleboy/[email protected] with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.KEY }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} script: | set -ex source $HOME/.bashrc basedir=$HOME/mix-space/shiro workdir=$basedir/${{ github.sha }} mkdir -p $workdir mkdir -p $basedir/.cache mv /tmp/shiro/release.zip $workdir/release.zip rm -r /tmp/shiro cd $workdir unzip -qq -o $workdir/release.zip rm -rf $workdir/standalone/.env ln -s $HOME/shiro/.env $workdir/standalone/.env export NEXT_SHARP_PATH=$(npm root -g)/sharp # copy workdir ecosystem.config.js to basedir if not exists if [ ! -f $basedir/ecosystem.config.js ]; then cp $workdir/standalone/ecosystem.config.js $basedir/ecosystem.config.js fi # https://github.com/Unitech/pm2/issues/3054 # symlink workdir node entry file to basedir ln -sf $workdir/standalone/server.js $basedir/server.js mkdir -p $workdir/standalone/.next rm -rf $workdir/standalone/.next/cache ln -sf $basedir/.cache $workdir/standalone/.next/cache cd $basedir pm2 reload ecosystem.config.js --update-env rm $workdir/release.zip pm2 save echo "Deployed successfully"
-
Click Sync fork to sync updates from the official repository, which will trigger automatic deployment.
-
Additionally, you can [click to create](https://vercel.com/new/clone?repository-url=https://github.com/Innei/Shiro&env=NEXT_PUBLIC_API_URL,NEXT_PUBLIC_GATEWAY_URL&envDescription=Mix-Space backend configuration) to deploy to Vercel with one click, making sure to add environment variables. Syncing the repository will also automatically update.
Configure Nginx#
-
Frontend configuration.
location ~* \.(gif|png|jpg|css|js|woff|woff2|svg|webp)$ { 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-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; expires 30d; } 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-Proto $scheme; 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 / { 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-Proto $scheme; 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 no-cache; proxy_intercept_errors on; }
-
Backend configuration.
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; }
Special Part One: Render Deployment#
Recommendation Index: ★★★★
Difficulty Index: ★★★★
Preparations#
- Register for MongoDB
- Register for GitHub
- Register for Render
- Register for Vercel
Build Framework#
- MongoDB Database
- Render Deploy Redis Cache
- Vercel Hosted Frontend Theme Shiro
- Render Deploy Backend Mix Space
📦 Project Structure
├── 🗄️ Database (MongoDB)
│ ├── 📂 User Data
│ ├── 📂 Article Data
│ ├── 📂 Other Business Data
│
├── 🔥 Cache Layer (Redis - Render Deployment)
│ ├── ⚡ Store Session Information
│ ├── ⚡ Store Hot Data
│ ├── ⚡ Reduce Database Query Pressure
│
├── 🎨 Frontend (Shiro Theme - Vercel Hosted)
│ ├── 📦 Dependencies: Next.js / React
│ ├── 🎨 UI Components
│ ├── 🔗 Call Backend API
│ ├── ⚙️ State Management
│
├── 🚀 Backend (Mix Space - Render Deployment)
│ ├── 📦 Dependencies: Nest.js
│ ├── 🔗 Connect to MongoDB
│ ├── 🔗 Connect to Redis Cache
│ ├── 🔒 Authentication & Authorization
│ ├── 📡 API Handling
│
└── 🌐 Deployment
├── 📤 Frontend deployed to Vercel
├── 📤 Backend & Redis deployed to Render
├── 🛠️ CI/CD Automation
Note: The backend does not come with a theme by default. After running the service, you need to log in to the backend management interface https://www.blog.com/proxy/qaqdmin
to configure the theme according to the tutorial at the end of Cloud Functions.
Start Building#
-
Database: MongoDB
Refer to the steps in Deploy LibreChat Tutorial for guidance, which will not be repeated here.
-
Cache: Redis
- Log in to Render, click the upper right corner + → Key Value
- Fill in Name as redis
- Select Project as Production
- Select Region as Singapore
- Select Instance Type as Free
- Click Create Key Value Instance to create
- Scroll down and copy the Internal Key Value URL under Connections, which looks like
redis://red-cvdd4eofnakc738i3f00:6379
, paste it to the clipboard and keep only the middle partred-cvdd4eofnakc738i3f00
asREDIS_HOST
.
-
Frontend: Shiro
-
[Click to create](https://vercel.com/new/clone?repository-url=https://github.com/Innei/Shiro&env=NEXT_PUBLIC_API_URL,NEXT_PUBLIC_GATEWAY_URL&envDescription=Mix-Space backend configuration), name it
shiro
, modify the environment variables, and then click Deploy.Name Value Description NEXT_PUBLIC_API_URL https://backend.blog.com/api/v2
Backend API address NEXT_PUBLIC_GATEWAY_URL https://backend.blog.com/
Backend domain -
Change the region in Settings - Functions - Function Region to Asia - Hong Kong, making sure to uncheck and then select.
-
For custom domains, note that the domain assigned by Vercel cannot be directly accessed in China, so you need to add a custom domain:
- Add an A record pointing to
76.223.126.88
in the domain you want to bind in Cloudflare. - Go to the Vercel Shiro project, click Settings - Domains - Add.
- Enter the bound domain, then click Add Domain, making sure to check the third option before clicking Add to complete the custom domain setup.
Here, we assume the custom domain added is
frontend.blog.com
. - Add an A record pointing to
-
-
Backend: Mix Space
-
Log in to Render, click the upper right corner + → Web Service.
-
Select Existing image, enter
innei/mx-server:latest
for Image URL. -
Wait a few seconds, then click Connect.
-
Change Name to core.
-
Select Project as Production.
-
Select Region as Singapore.
-
Select Instance Type as Free.
-
Click Add from .env under Environment Variables, modify the following environment variables, and paste them into the input box.
ALLOWED_ORIGINS=frontend.blog.com REDIS_HOST=red-cvdd4eofnakc738i3f00 DB_CONNECTION_STRING=mongodb+srv://<DB_USER>:<DB_PASSWORD>@<DB_USER> JWT_SECRET=************************
The
JWT_SECRET
can be quickly generated using the following command.openssl rand -base64 24 | cut -c1-32
-
Click Deploy Web Service to deploy.
-
Scroll down and click + Add Custom Domain under Custom Domains, enter the custom domain in the format
backend.blog.com
. -
Follow the prompts to go to the domain hosting provider, such as Cloudflare, add a CNAME record, and then return to click verify to validate.
-
Special Part Two: serv00 Deployment#
Recommendation Index: ★★★
Difficulty Index: ★★★★★
My electric shop now has a one-click installation script available, simplifying the installation process and allowing for faster completion. Your support is welcome.
https://afdian.com/a/ireno?tab=shop
Note: The backend does not come with a theme by default. After running the service, you need to log in to the backend management interface https://backend domain/proxy/qaqdmin
to configure the theme according to the tutorial at the end of Cloud Functions.
alias node=node20
alias npm=npm20
mkdir -p ~/.npm-global && npm config set prefix "$HOME/.npm-global" && echo 'export PATH=$HOME/.npm-global/bin:$PATH' >> ~/.profile && source ~/.profile && npm install -g pm2 && pm2
mkdir ~/.mx-space
npm install [email protected] --prefix ~/.mx-space
devil mongo db add core
devil port add tcp 2323
devil port add tcp 2333
devil port add tcp 5555
cd ~/domains/***.serv00.net
fetch https://raw.githubusercontent.com/redis/redis/7.4/redis.conf
sed -i '' "s/^port .*/port 5555/" redis.conf
sed -i '' -E "s/^# requirepass .*/requirepass secure_pass/" redis.conf
sed -i '' 's/^appendonly no$/appendonly yes/' redis.conf
mkdir -p ~/domains/***.serv00.net/mix-space/core && cd $_
curl -L -O https://github.com/mx-space/core/releases/latest/download/release-linux.zip
unzip release-linux.zip
rm release-linux.zip
mkdir -p ~/domains/***.serv00.net/mix-space/shiro && cd $_
curl -L -O https://github.com/Innei/Shiro/releases/latest/download/release.zip
unzip release.zip
rm release.zip
cat > ~/domains/***.serv00.net/ecosystem.config.js <<EOF
const { execSync } = require('node:child_process');
const nodePath = execSync(`npm root --quiet -g`, { encoding: 'utf-8' }).trim();
module.exports = {
apps: [
{
name: 'shiro',
script: 'server.js',
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
PORT: 2323,
NODE_ENV: 'production',
NEXT_SHARP_PATH: process.env.NEXT_SHARP_PATH,
NEXT_PUBLIC_API_URL: 'http://127.0.0.1:2323/api/v2',
NEXT_PUBLIC_GATEWAY_URL: 'http://127.0.0.1:2323'
},
log_date_format: 'YYYY-MM-DD HH:mm:ss',
},
{
name: 'redis',
script: 'redis-server',
args: '~/domains/***.serv00.net/mix-space/core/redis.conf',
autorestart: true,
watch: false,
},
{
name: 'core',
script: 'index.js',
autorestart: true,
watch: false,
max_memory_restart: '500M',
args: [
'--color',
'--encrypt_enable',
'--encrypt_key ********************(64 characters)',
'--redis_host 127.0.0.1',
'--redis_port 5555',
'--redis_password ********',
'--db_host mongo15.serv00.com',
'--collection_name mix-space',
'--db_user mix-space',
'--db_password ********',
'--port 2333',
'--allowed_origins example1.com,example2.com,localhost',
'--jwt_secret *************(32 characters)',
].join(' '),
env: {
NODE_ENV: 'production',
NODE_PATH: nodePath,
},
},
],
};
EOF
pm2 start ~/domains/***.serv00.net/ecosystem.config.js
Cloud Functions#
Shiro Theme#
-
Log in to the backend, click on the bottom left Additional Features - Configuration and Cloud Functions, and click + New.
-
Fill in Name as
shiro
, Reference astheme
, and paste the following code in the code area on the right. Please modify as appropriate.{ "footer": { "otherInfo": { "date": "2020-{{now}}", "icp": { "text": "萌 ICP 备 20236136 号", "link": "https://icp.gov.moe/?keyword=20236136" } }, "linkSections": [ { "name": "About", "links": [ { "name": "About This Site", "href": "/about-site" }, { "name": "About Me", "href": "/about" }, { "name": "About This Project", "href": "https://github.com/innei/Shiro", "external": true } ] }, { "name": "More", "links": [ { "name": "Timeline", "href": "/timeline" }, { "name": "Friend Links", "href": "/friends" }, { "name": "Monitoring", "href": "https://status.innei.in/status/main", "external": true } ] }, { "name": "Contact", "links": [ { "name": "Leave a Message", "href": "/message" }, { "name": "Send Email", "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 } } } }
PS Status Plugin#
- Log in to the backend, click on the bottom left Additional Features - Configuration and Cloud Functions, and click + New.
- Fill in Name as
update
, Reference asps
, select Data Type asFunction
, select Request Method asPOST
, fill in the left input box withkey
, and the right box with the value of the key. Then click here to select all content and paste it into the code area on the right, and finally click the green button to save. - Download and install Kizuna, for Windows systems, use the shortcut
WIN + R
and enternotepad %USERPROFILE%\AppData\Local\kizuna\config.yml
to edit.
server_config:
endpoint: "https://backend.example.com/api/v2/fn/ps/update" # https://api.example.com/api/v2/fn/ps/update
token: "YOUR-KEY-HERE" # Set key
report_time: 5 # Reporting interval in seconds
rules: # Application name replacement rules
- match_application: WeChat
replace:
application: 微信
description: 一个小而美的办公软件
- match_application: QQ
replace:
application: QQ
description: 一个多功能的通讯软件
- match_application: Netease Cloud Music
replace:
application: 网易云音乐
description: 一个音乐播放和分享的平台
After editing, save with CTRL + S
and close, then run Kizuna, which will periodically upload your activity data to the defined endpoint.
Reference Links#
Mix Space Official Documentation
Mix-Space Deploy Latest Frontend Shiro
Mix-Space Setup from Beginner to Advanced
This article is synchronized and updated to xLog by Mix Space. The original link is https://reno.zone.id/posts/default/mix-space-blog-guide