学校服务器部署

介绍

服务器结构示意图

整个应用程序依赖三个部分,分别是由 Node.js 运行的 Nuxt 部分,数据库部分,和文件存储部分。Nuxt 部分由 pm2 工具启动,并且在后台运行;数据库和文件存储部分均使用 systemd 运行。

安装和配置数据库

安装 PostgreSQL

sudo apt install postgresql

进入 PostgreSQL 命令行

sudo -u postgres psql

命令行长这样 👇

psql (16.4 (Ubuntu 16.4-0ubuntu0.24.04.2))
Type "help" for help.

postgres=#

创建数据库用户

将命令中的 usernamepassword (小写)改成具体的用户名和密码。请妥善保管数据库密码。

CREATE ROLE username WITH LOGIN PASSWORD 'password';

创建数据库

将命令中的 database_nameusername 分别改成具体的数据库名称和第三步中设置的用户名。

CREATE DATABASE database_name OWNER username;

退出命令行

在 PostgreSQL 命令行中输入 \q 可退出命令行。

获取 URL

数据库对应的 URL 为:

postgresql://username:password@localhost/database_name

其中 usernamepassworddatabase_name 均替换为上述步骤中设置的内容。此 URL 将在下文中被填入环境变量中。

安装和配置 MINIO

MINIO 是一个开源的兼容 S3 协议的对象存储服务。我们使用 systemd 来管理 MINIO 服务。

安装 MINIO

curl -O https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

以上命令第一行下载了 MINIO 的安装包,第二行将其设置为可执行文件,第三行将其移动到 /usr/local/bin/ 目录下。 如果国内访问速度慢,可以考虑先下载到本地后上传。

配置 MINIO 环境变量

sudo nano /etc/default/minio

这里使用了 Ubuntu 自带的 nano 编辑器。把以下内容复制到 nano 中:

/etc/default/minio
# Volume to be used for MinIO server.
MINIO_VOLUMES="/mnt/data"
# Use if you want to run MinIO on a custom port.
MINIO_OPTS="--address :9199 --console-address :9001"
# Root user for the server.
MINIO_ROOT_USER=MINIO-USERNAME
# Root secret for the server.
MINIO_ROOT_PASSWORD=MINIO-PASSWORD

上述文件中的 MINIO-USERNAMEMINIO-PASSWORD 需要替换为你想要设定的 MINIO 管理员用户名和密码。该用户名和密码稍后将用于登录 MinIO 的 Web 界面。注意,不是 Linux 用户名和密码。

编辑好之后使用 Ctrl+S 保存,然后使用 Ctrl+X 退出 nano 编辑器。

编写 service 文件

sudo nano /etc/systemd/system/minio.service

在文件中填入以下内容:

/etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
AssertFileNotEmpty=/etc/default/minio

[Service]
Type=notify

WorkingDirectory=/usr/local/

User=USERNAME
Group=USERNAME
ProtectProc=invisible

EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutSec=infinity

SendSIGKILL=no

[Install]
WantedBy=multi-user.target

上述文件中的 USERNAME 需要替换为你的用户名。存储数据的文件夹被设置为 /mnt/data,可以根据需要自行修改。

启动 MINIO

每次更改 service 文件后,需要重新加载 systemd 服务:

sudo systemctl daemon-reload

初次使用时需要启用该服务(在后续维护中则不需要运行该命令):

sudo systemctl enable minio

启动 MINIO:

sudo systemctl start minio

操作 MINIO 服务

查看 MINIO 状态:

sudo systemctl status minio

停止 MINIO:

sudo systemctl stop minio

重启 MINIO:

sudo systemctl restart minio

查看 MINIO 日志:

sudo journalctl -u minio

访问 MINIO 的 Web 界面进行管理

使用浏览器访问 http://服务器ip:9001,用之前设置的管理员用户名和密码登录。

创建访问密钥

在左边栏进入 Access Keys 页面,点击右上角 Create New Access Key 按钮,点击 Create ,创建一个新的访问密钥。 将 Access Key 和 Secret Key 内容记录下来,以填入后文中的 pm2 配置文件中。

创建存储桶

在左边栏进入 Buckets 页面,点击右上角 Create Bucket 按钮,输入存储桶名称,点击 Create Bucket ,创建一个新的存储桶。 记录存储桶名称,以填入后文中的 pm2 配置文件中。

运行 Nuxt 部分

运行以下命令拉取并构建

git clone https://github.com/SMS-COSMO/SMS-Tree.git
cd SMS-Tree
git submodule update --init --recursive
pnpm install --registry=https://registry.npmmirror.com
pnpm build

配置环境变量

初始化数据库

第一次创建数据库时,需要对数据库进行初始化。

pnpm db:push
pnpm db:createAdmin # 创建管理员用户

运行以下命令安装 pm2

pnpm install pm2 -g

配置 pm2

SMS-Tree/父级目录下新建文件 ecosystem.config.js,其中 env: {} 的内容与 .env 相同。只需把 XXX=XXX 改为 XXX: XXX 即可:

内容示例
module.exports = {
  apps: [
    {
      name: 'SMS-Tree',
      script: './SMS-Tree/.output/server/index.mjs',
      instances: 'max',
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'production',
        PORT: 3000,
        DATABASE_URL: 'postgresql://username:password@localhost/database_name',
        SIGN_PUBLIC_KEY: '',
        SIGN_PRIVATE_KEY: '',
        ENC_PUBLIC_KEY: '',
        ENC_PRIVATE_KEY: '',
        ENC_KID: '',
        SIGN_KID: '',
        SERVER_URL: '',
        TOKEN_EXPIRATION_TIME: '',
        SEIUE_LOGIN: '',
        SEIUE_API_URL: '',
        SEIUE_OPEN_API_URL: '',
        SEIUE_CHALK_UR: '',
        SEIUE_PASSPORT_URL: '',
        S3_ACCESS_KEY_ID: '',
        S3_SECRET_ACCESS_KEY: '',
        BUCKET_NAME: '',
        S3_SERVER_URL: '',
        CHATGPT_DETECTOR_API: '',
      },
    },
  ],
};

启动 pm2

SMS-Tree/父级目录下运行:

pm2 start ecosystem.config.js

可进行的 pm2 操作有

查看正在运行的进程列表:

pm2 list

打开进程管理器:

pm2 monit

查看日志:

pm2 logs

停止所有进程:

pm2 delete all

停止特定的进程(<id> 为查看列表时输出的对应进程的 id):

pm2 delete <id>

更新 SMS-Tree

当 SMS-Tree 的 GitHub 仓库产生更新时,需要在服务器上更新代码版本。

停止 PM2 进程

pm2 delete all

拉取新版代码

cd SMS-Tree
git pull

更新依赖 & 构建

pnpm install --registry=https://registry.npmmirror.com
pnpm build

重启 PM2 进程

cd ..
pm2 start ecosystem.config.js

相关文档