如形の博客
在 VPS 上部署洛谷保存站 Blur image

项目地址#

Demo

laikit-dev / luogu-saver

Waiting for api.github.com...

???
???
???
?????

前置要求#

在开始之前,请确保你已具备以下条件:

  • 有一个邮箱或 Github、Google 账号。
  • 有一定的 Linux 终端操作能力和 Web 知识。
  • 能支付一个月 33 美元的费用或已经有服务器了。

购买 VPS(如果你有服务器可以忽略)#

进入 Zeabur 注册,然后选一种方式注册,进入仪表盘后点击左侧“服务器”,然后点击“创建服务器”,选择“服务器-单机部署”,再选择“从 zeabur 购买服务器”,点击“前往购买”。

1

供应商选择 Tencent,方案中区域:亚洲,排序:价格 ↑,在前 44 个价格为 33 美元的服务器选一个。操作系统选 ZeaburOS,然后前往结账.

2

勾选 我已阅读并同意上述重要事项······,点击“设置付款方式”,选“充值余额”,然后用支付宝或微信支付充值到账户里。支付后,满屏的烟花会庆祝你的成功,然后你的服务器将会安装一系列自带的 Zeabur 服务。

3

到此,服务器就购买成功了!

SSH 服务器#

回到 Zeabur 首页,点击服务器、你的服务器名字进入详细页面,点击服务器运行信息中的 IPv4 旁边的一串 IP 地址复制下来,打开终端,输入以下内容:

ssh ubuntu@<IP>
bash

如果输出 ubuntu@<IP>'s password:,那么没有问题,先不要关闭终端。

然后回到 Zeabur 服务器页面,点击上侧的 SSH,点击 SSH 密码下面的“···”(不是“连接”),此时可能会弹出警告,大致意思是“如果你在 ssh 后一不小心弄坏(rm -rf)了服务器,他们无法回复,只能重装系统”,不必理会,直接点“确定放弃权利”,然后点击密码复制到剪贴板,再回到终端,粘贴密码(粘贴时不会有 * 等字符出现,属于正常现象),让后 Enter,第一次 SSH 有交互式提问,输入 y 即可。如果终端输出类似如下,那么就成功了!

Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-124-generic x86_64)
···
bash

部署保存站#

部署基础设施 (数据库、缓存等)#

克隆项目仓库并进入目录:

git clone https://github.com/laikit-dev/luogu-saver.git
cd luogu-saver
bash

编辑 docker-compose.yml 中密码:

nano docker-compose.yml
bash

用上、下键移动光标找到 services.db.environment.MARIADB_ROOT_PASSWORD 并修改为自己的密码,例:MARIADB_ROOT_PASSWORD: 123456。再找到 services.meilisearch.environment.MEILI_MASTER_KEY 并修改为自己的密码,例:MEILI_MASTER_KEY: 123456。然后按 Ctrl + O , Enter(字母 O,不是 00),最后按 Ctrl + X 退出。

然后启动基础设施服务:

sudo docker compose up -d
bash

构建项目#

升级 Node.js#

由于默认 Node.js 版本过低(v18.19.1)而项目要求的 Node.js 版本是 22.18.0 或更高(见 README),Vite 也要求 20.19+ 或 22.12+。需要升级 Node.js。

安装 nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
source ~/.bashrc
bash

安装并切换到 Node.js 22

nvm install 22
nvm alias default 22
nvm use 22
bash

验证一下:

node -v
bash

应该显示 v22.x.x

开始构建#

npm install
npm run build
export VITE_API_URL=http://你的域名 # 替换为你的自定义域名
cd ~/luogu-saver/packages/backend
npm install --production --ignore-scripts
bash

安装依赖、创建数据库#

sudo npm install -g pm2
sudo apt update && sudo apt install nginx -y

sudo docker exec -it mariadb-docker-saver mariadb -u root -p
bash

然后输入 docker-compose.yml 中你设置的第 11 个(MariaDB)的密码(输入时不会有 * 等字符出现,属于正常现象)。进入控制台后粘贴以下脚本:

CREATE DATABASE luogu_saver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;
bash

配置后端#

编辑 config.yml

cd ~/luogu-saver/packages/backend
nano config.yml
bash

粘贴以下内容,注意修改自己的密码:

port: 3000
env: "development"

network:
  timeout: 30000

db:
  host: "127.0.0.1"
  port: 3306
  user: "root"
  password: "你的MariaDB密码"
  database: "luogu_saver"

redis:
  host: "127.0.0.1"
  port: 6379
  password: ""
  keyPrefix: ""

chroma:
  enable: false
  ssl: false
  host: "127.0.0.1"
  port: 8000
  collectionName: "lgs_articles"

queue:
  save:
    concurrencyLimit: 2
    maxRequestToken: 20
    regenerationInterval: 1000
    maxQueueLength: 1000
  ai:
    concurrencyLimit: 10
    maxRequestToken: 50
    regenerationInterval: 1000
    maxQueueLength: 2000
  update:
    concurrencyLimit: 2
    maxRequestToken: 20
    regenerationInterval: 1000
    maxQueueLength: 1000

llm:
  providers: []
  scenarios:
    chat:
      use: "openai"
      temperature: 0.7
      maxTokens: 2048
      topP: 1
      frequencyPenalty: 0
      presencePenalty: 0
      stopSequences: []
    summary:
      use: "openai"
      temperature: 0.7
      maxTokens: 1024
    embedding:
      use: "openai"
    censor:
      use: "openai"

recommendation:
  anonymous:
    expireTime: 604800
    maxCount: 100
  maxHistory: 500
  decayFactor: 0.9
  relevantThreshold: 0.75

verification:
  luogu:
    codeExpireTime: 300
    codeLength: 32

judgement:
  enabled: true
  intervalMs: 1200000
  runOnStartup: true
  sourceUrl: "https://www.luogu.com.cn/judgement"
yaml

启动后端:

pm2 start dist/index.js --name luogu-backend
bash

托管前端#

配置 Nginx#

这是最后一步,让前端页面可以通过 HTTP 访问。

sudo nano /etc/nginx/sites-available/default
bash

将内容替换为(注意添加你的生产域名在 server_name):

server {
    listen 81;
    server_name _;   # 示例:server_name _ example.com;

    root /home/ubuntu/luogu-saver/packages/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        rewrite ^/api/(.*) /$1 break;
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
nginx

保存后,测试并启动 Nginx:

ssudo chmod o+x /home/ubuntu
sudo chmod -R o+rX /home/ubuntu/luogu-saver/packages/frontend/dist
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
bash

自定义域名#

在你的域名服务商后台,添加一条 A 记录:

  • 主机记录:luogu(取决于你想用哪个子域名)

  • 记录值:你的服务器 IP

  • TTL:随意

转发端口#

现在,我们需要在 Zeabur 上部署一个 Nginx 服务,专门用来转发流量,是可以通过 8080 端口(https://example.com)访问(即访问网站时的默认端口,否则只能通过 https://example.com:81 访问,不够优雅)。

在仪表盘右上角点“创建项目”新建一个 Zeabur 项目,点击左侧“新建服务”,点击“模板”,输入“Nginx”部署,然后点“设置”,选择“打开配置文件编辑器”,粘贴以下代码:

worker_processes  5;
error_log  stderr;
worker_rlimit_nofile 8192;

events {}

http {
  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log   /dev/stdout  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128;

  server {
    listen 80 default_server;
    server_name _;   

    location / {
        proxy_pass http://服务器 IP:81;
        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 X-Forwarded-Proto $scheme;
    }
  }
}
nginx

然后点击网络-绑定外部域名,添加你的域名 example.com 并确认。

然后会自动开始部署,耐心等待一会,当状态变为运行中时,可以打开你的域名,如果没有问题的话。

恭喜你,部署成功了!

参考资料#

在 VPS 上部署洛谷保存站
https://example.github.io/article/deploy-lg-saver
Author 如形
Published at August 11, 2026
Comment seems to stuck. Try to refresh?✨