Sub-Store
Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket! - Sub-Store

新建用户

在HestiaCP中新建一个用户,然后修改用户,高级选项。为用户指定不同的 shell,以限制用户的访问权限或功能。这里我们从Nologin(无权限)设置成 =Bash(权限最大)。

具体原因你可以参考

HestiaCP 安装 Ghost 教程
GHOST部署教程前言 在我自己搭建HOSTEYE博客系统的过程中,经历了许多挑战和困惑。虽然网上有很多优秀的教程可以参考,但我决定将自己的搭建经验整理成一个教程,希望踏上Ghost博客路上朋友们提供一些帮助。 本教程不仅会介绍Ghost的安装与配置,更会针对我在搭建过程中所遇到的各种问题进行详细的解答。从域名购买到服务器搭建,再到主题选择和插件优化,我将全面详细的写出教程。无论你是技术上的小白,还是有一定经验的用户,都希望本教程能够对你有所启发。 在开始构建你的 GHOST 博客之旅之前,请务必心怀耐心和热情。技术世界中的探索与发现永无止境,并且建立自己的博客也是一段愉快而神奇的过程。 如果您在阅读过程中有任何疑问或困惑,请随时向我提问。 关于Ghost,为什么选择Ghost? 关于Ghost:https://zh.wikipedia.org/zh-cn/Ghost_(博客平台) 我认为 GHOST 适合那些想要专注于创作内容的人。 它的设置非常简单,Ghost内置了针对SEO(加载速度等)的全面优化,可以让启动博客之前的学习和折腾个人的成本降低到最低。就我而言,HOSTEYEFOX

创建网站

在Hestiacp中新建网站配置ssl的操作就不再赘述了。如果你是第一次看到hestiacp系列教程,请点击下方链接,就能看到完整的一系列教程了。

HestiaCP - HOSTEYE

配置环境

在上一篇安装ghost的时候使用的是nvm安装nodejs,这次我们使用fnmfnm 是一个更快、更轻量且更现代的替代品,特别适合在跨平台和性能敏感的场景下使用。

nvm vs fnm

  1. 安装速度
    • nvm:较慢,因为它使用 Shell 脚本管理 Node.js 版本切换。
    • fnm:快得多,采用了 Rust 编写,性能更高,版本切换迅速。
  2. 内存占用
    • nvm:较高,因其基于 Bash 实现。
    • fnm:内存占用更低,Rust 的高效特性让它更轻量。
  3. 跨平台支持
    • nvm:主要在 Unix 系统(Linux、macOS)上运行,Windows 支持依赖 WSL。
    • fnm:支持多平台,包括 Windows(无需 WSL),Linux,macOS。
  4. 使用体验
    • nvm:配置稍显复杂,使用需要通过 bashrczshrc 进行配置。
    • fnm:更简洁,配置简单,并且默认支持 .nvmrc 文件,体验类似 nvm
  5. 并行性
    • nvm:不支持并行安装。
    • fnm:支持并行下载和安装 Node.js 版本,安装多个版本更快。

安装 Node.js

记得先切换到新建的用户。

su - user

安装fnm

curl -fsSL https://fnm.vercel.app/install | bash

在终端中运行以下命令:

fnm ls-remote

该命令会列出所有可以安装的 Node.js 版本,包括历史版本、当前版本以及 LTS 版本。输出中,你会看到类似以下的列表:

   v0.12.18
    v4.9.1
    v5.12.0
    v6.17.1
    v8.17.0
   v10.24.1
    ...
   v16.20.2
   v18.17.1
    v20.5.0  (Iron LTS)

带有 "LTS" 标记的版本(如 v20.x.x (Iron LTS))表示是长期支持的版本。

你可以根据输出的列表选择你想要安装的具体版本,我们这里选择 v20.18.0,然后使用以下命令安装:

fnm install v20.18.0

如果你只想安装最新的 LTS 版本,也可以运行:

fnm install --lts

安装 PNPM 软件包管理器

npm install -g pnpm

配置SubStore

下载前端和后端文件

进入 /home/user/web/domain/public_html/目录下。我们要依靠HestiaCP强大的备份和恢复功能来保障数据安全。具体你可以看下面这篇文章。

HestiaCP 备份迁移网站教程
HestiaCP有非常强大的备份和迁移功能。将会备份新建的用户信息,cron作业信息,数据库,和网站目录/home/user/web/domain/ 里的所有文件。 默认用户方案只允许保留一个备份文件。你可以登录管理员账户,在用户方案 中设置备份数量。 备份网站数据 手动创建备份 在面板中,点击创建备份按钮。 将一个显示弹出窗口,其中包含以下消息: 任务已添加到队列。 自动创建备份 每天hestiacp都会自动备份。 备份文件存放目录 在服务器 /backup 下。 如何将用户移至新服务器? 在旧服务器上创建用户备份。 v-backup-user username 将打包后的文件复制到新服务器并将其放置在 中/backup。你可以使用scp 命令或者其他任何工具。 scp /backup/username.2020.01.01-00-00.tar [email protected]:/backup/ 在新服务器上恢复备份。你可以通过更改命令中的用户名来恢复到不同的用户。
cd /home/user/web/domain/public_html/

下载前端文件

curl -fsSL https://github.com/sub-store-org/Sub-Store-Front-End/releases/latest/download/dist.zip -o dist.zip

解压缩

unzip dist.zip && mv dist frontend && rm dist.zip

解压后前端文件将会存储到 /home/user/web/domain/public_html/frontend/ 里面。

下载后端文件

curl -fsSL https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store.bundle.js -o sub-store.bundle.js

创建systemd系统服务

/etc/systemd/system/目录下新建sub-store.service文件,并填入以下配置:

[Unit]
Description=Sub-Store
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
LimitNOFILE=32767
Type=simple
Environment="SUB_STORE_FRONTEND_BACKEND_PATH=/abcabcabc"
Environment="SUB_STORE_BACKEND_CRON=0 0 * * *"
Environment="SUB_STORE_FRONTEND_PATH=/home/user/web/domain/public_html/frontend"
Environment="SUB_STORE_FRONTEND_HOST=0.0.0.0"
Environment="SUB_STORE_FRONTEND_PORT=3001"
Environment="SUB_STORE_DATA_BASE_PATH=/home/user/web/domain/public_html"
Environment="SUB_STORE_BACKEND_API_HOST=127.0.0.1"
Environment="SUB_STORE_BACKEND_API_PORT=3000"
ExecStart=/home/user/.local/share/fnm/fnm exec --using v20.18.0 node /home/user/web/domain/public_html/sub-store.bundle.js
User=user
Group=user
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sh -c ulimit -n 51200
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

千万注意,这里需要需要修改一些地方。参考下面的解释:

  • Environment="...":定义了一系列环境变量,供服务在运行时使用:
    • SUB_STORE_FRONTEND_BACKEND_PATH:前端和后端路径配置。请自行更改为其它复杂内容并保密,这是后面API部分作为验证使用的。
    • SUB_STORE_BACKEND_CRON:后端的 CRON 任务定时配置,表示每天午夜(00:00)运行一次。
    • SUB_STORE_FRONTEND_PATH:前端路径设置为/home/user/web/domain/public_html/frontend请自行更改userdomain
    • SUB_STORE_FRONTEND_HOSTSUB_STORE_FRONTEND_PORT:指定前端监听的主机地址(0.0.0.0)和端口(3001)。请自行更改。
    • SUB_STORE_DATA_BASE_PATH:后端数据库的路径配置。请自行更改。
    • SUB_STORE_BACKEND_API_HOSTSUB_STORE_BACKEND_API_PORT:后端 API 的主机地址(127.0.0.1)和监听端口(3000)。请自行更改。且不建议开放公网。
  • ExecStart=/home/user/.local/share/fnm/fnm exec --using v20.18.0 node /home/user/web/domain/public_html/sub-store.bundle.js:这是启动服务的命令。它使用 fnm(Fast Node Manager)执行 node,并使用 v20.18.0 版本的 Node.js 运行 /home/user/web/domain/public_html/sub-store.bundle.js 文件。请自行更改userdomain
  • User=userGroup=user:指定服务以 user 用户和 user 组身份运行。请自行更改user

systemd 相关命令:

  1. systemctl start sub-store.service 启动服务
  2. systemctl enable sub-store.service 设置为开机自启
  3. systemctl status sub-store.service 查看服务状态
  4. systemctl stop sub-store.service 停止服务
  5. systemctl restart sub-store.service 重启服务

配置Nginx

HestiaCP配置反向代理离不开模板。下面是两个模板,请自行参考修改

.tpl

#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================

server {
	listen      %ip%:%proxy_port%;
	server_name %domain_idn% %alias_idn%;
	error_log   /var/log/%web_system%/domains/%domain%.error.log error;

	include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;

    location ~ /.well-known {
        allow all;
    }

	location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:3001;

	}



	include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}

.stpl

#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================

server {
	listen      %ip%:%proxy_ssl_port% ssl;
	server_name %domain_idn% %alias_idn%;
	error_log   /var/log/%web_system%/domains/%domain%.error.log error;

	ssl_certificate     %ssl_pem%;
	ssl_certificate_key %ssl_key%;
	ssl_stapling        on;
	ssl_stapling_verify on;

	# TLS 1.3 0-RTT anti-replay
	if ($anti_replay = 307) { return 307 https://$host$request_uri; }
	if ($anti_replay = 425) { return 425; }

	include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;

    location ~ /.well-known {
        allow all;
    }

	location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:33001;

	}


	proxy_hide_header Upgrade;

	include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}

配置防火墙

在面板中,按照你设置的前端端口,放行对应端口即可。

完成

访问substore的链接格式为:

https://abc.com/?api=https://abc.com/abckey

更新

只需要进入项目目录,首先更新后端:

curl -fsSL https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store.bundle.js -o sub-store.bundle.js

然后使用systemd重新加载substore即可。

自定义

部署之后,在添加国旗的时候,如果节点中有深港 的字样的话,无论落地是哪里,都会给你装上HK的旗子。这时我们需要自己修改一下后端。

先git clone仓库代码,然后修改/backend/src/utils/geo.js里的getFlag这一部分。

自行修改即可。

修改后,构建打包

pnpm install
pnpm run build
pnpm run bundle

后端文件会在/dist文件夹里,替换之前搭建的后端就行。

其他需要修改的地方,就自己看代码自己找吧。

包含的标签:

教程, HestiaCP

最后更新: October 26, 2024