如何在Dreamhost上部署Typescript(React)应用及Node.js服务?
Dreamhost 部署TS(React)应用+对应Node.js服务操作指南
核心疑问直接答复
- 无需手动SSH安装npm:Dreamhost的VPS/专服默认预装Node.js与npm,但版本普遍偏旧,不满足新版React、TS的依赖要求,只需通过nvm切换适配的LTS版本即可,不要手动编译安装系统级npm,避免破坏服务器环境。
- Passenger勾选报错解决:报错触发条件为两类:要么当前使用的是共享主机(非VPS/专用服务器,本身不支持Passenger运行Node服务),要么VPS/专服的操作系统未升级到最新稳定版。对应解决方式:
- 若为共享主机:跳过Passenger配置,改用自定义端口绑定的方式部署Node服务;
- 若为VPS/专服:在Dreamhost控制台的服务器管理页,将操作系统升级到Debian 12或Ubuntu 22.04及以上版本,升级完成后即可正常勾选Passenger配置。
方案一:符合Passenger配置要求(VPS/专服已升级最新OS)
该方案由Dreamhost自带的Passenger进程管理器自动托管服务,无需额外配置进程守护,稳定性更高。
- SSH配置适配Node版本
连接服务器后,通过nvm官方一键脚本完成版本管理工具安装,执行source ~/.bashrc生效环境变量,再依次执行:nvm install --lts安装最新LTS版Node.jsnvm alias default 已安装的Node版本号(比如18.20.4)设置默认使用版本
- 本地项目预处理
- TS版React前端项目:执行
npm install安装本地依赖,再执行打包命令(Vite/CRA均为npm run build),生成dist/build静态资源目录 - 后端Node服务:确认所有生产依赖已写入
package.json的dependencies字段,排除仅本地使用的dev依赖
- TS版React前端项目:执行
- 上传项目文件
通过sftp/rsync将项目文件上传到对应域名的web根目录(一般为~/你的域名/):- 将前端打包后的静态资源目录重命名为
public,放到web根目录下 - 将后端Node服务的入口文件(如
server.js)放到web根目录下
- 将前端打包后的静态资源目录重命名为
- 服务器端安装生产依赖
进入web根目录,执行npm install --production,仅安装生产环境所需依赖,避免占用多余服务器空间。 - 配置Passenger规则
- 在web根目录新建
.htaccess文件,写入以下内容:PassengerAppType node PassengerStartupFile server.js PassengerBaseURI / - 在Dreamhost控制台对应域名管理页,勾选Passenger选项,应用类型选择Node.js,确认启动文件路径为刚才配置的
server.js。
- 在web根目录新建
- 后端适配静态资源路由
后端服务代码中需配置静态资源指向,以Express为例:- 加入
app.use(express.static('public'))指向前端静态文件目录 - 配置兜底路由,所有非接口请求均返回前端
index.html,适配SPA前端路由。
- 加入
- 访问对应域名验证部署结果,若报错可查看web根目录下的
logs/文件夹中的运行日志排查。
方案二:不符合Passenger配置要求(共享主机/旧OS无法升级)
该方案不依赖Passenger,直接通过自定义端口绑定部署服务。
- SSH配置适配Node版本 与方案一的第1步完全一致
- 本地项目预处理、上传文件、服务器安装生产依赖 均与方案一的第2、3、4步一致
- 进程守护与服务启动
Dreamhost共享主机禁用80/443端口,需选用1024以上的空闲端口(如3000)运行服务,避免直接断开SSH导致服务停止,需用pm2托管进程:- 执行
npm install -g pm2安装进程管理工具 - 进入web根目录,执行
pm2 start server.js --name 自定义服务名启动服务 - 执行
pm2 save保存进程列表,再通过crontab配置@reboot自动执行pm2进程恢复命令,实现服务开机自启。
- 执行
- 域名端口绑定
在Dreamhost控制台对应域名管理页,将域名的web服务指向修改为“代理到自定义端口”,填写你的Node服务运行的端口号(如3000)。 - 后端适配静态资源路由的逻辑与方案一第6步一致,访问域名验证即可。
新手部署注意事项
- 不要将本地的
node_modules文件夹打包上传,必须在服务器端执行npm install,避免本地与服务器系统依赖不兼容 - 若选择直接在服务器上编译TS代码,需提前安装
typescript、ts-node等dev依赖,更推荐本地编译后上传,减少服务器资源占用 - 数据库密钥、API Token等敏感环境变量,需在服务器端新建
.env文件存放,配合dotenv包读取,禁止将.env文件上传到公共访问目录 - 若遇到端口占用报错,执行
lsof -i:对应端口号查看占用进程,更换为其他空闲端口即可。
内容的提问来源于stack exchange,提问作者user14280047
相关产品推荐
相关产品推荐

