新建用户
在HestiaCP中新建一个用户,然后修改用户,高级选项。为用户指定不同的 shell,以限制用户的访问权限或功能。这里我们从Nologin(无权限)设置成 =Bash(权限最大)。
具体原因你可以参考
创建网站
在Hestiacp中新建网站,配置ssl的操作就不再赘述了。如果你是第一次看到hestiacp系列教程,请点击下方链接,就能看到完整的一系列教程了。
配置环境
在上一篇安装ghost的时候使用的是nvm
安装nodejs,这次我们使用fnm
。fnm
是一个更快、更轻量且更现代的替代品,特别适合在跨平台和性能敏感的场景下使用。
nvm
vs fnm
:
- 安装速度:
nvm
:较慢,因为它使用 Shell 脚本管理 Node.js 版本切换。fnm
:快得多,采用了 Rust 编写,性能更高,版本切换迅速。
- 内存占用:
nvm
:较高,因其基于 Bash 实现。fnm
:内存占用更低,Rust 的高效特性让它更轻量。
- 跨平台支持:
nvm
:主要在 Unix 系统(Linux、macOS)上运行,Windows 支持依赖 WSL。fnm
:支持多平台,包括 Windows(无需 WSL),Linux,macOS。
- 使用体验:
nvm
:配置稍显复杂,使用需要通过bashrc
或zshrc
进行配置。fnm
:更简洁,配置简单,并且默认支持.nvmrc
文件,体验类似nvm
。
- 并行性:
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强大的备份和恢复功能来保障数据安全。具体你可以看下面这篇文章。
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
。请自行更改user
和domain
。SUB_STORE_FRONTEND_HOST
和SUB_STORE_FRONTEND_PORT
:指定前端监听的主机地址(0.0.0.0
)和端口(3001
)。请自行更改。SUB_STORE_DATA_BASE_PATH
:后端数据库的路径配置。请自行更改。SUB_STORE_BACKEND_API_HOST
和SUB_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
文件。请自行更改user
和domain
。User=user
和Group=user
:指定服务以user
用户和user
组身份运行。请自行更改user
。
systemd 相关命令:
- systemctl start sub-store.service 启动服务
- systemctl enable sub-store.service 设置为开机自启
- systemctl status sub-store.service 查看服务状态
- systemctl stop sub-store.service 停止服务
- 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
文件夹里,替换之前搭建的后端就行。
其他需要修改的地方,就自己看代码自己找吧。