跳到主要内容
← 指南列表

将自己开发的 Web 应用部署到服务器(Node.js、Python)

以下是将您在本地电脑上开发的 Express、Next.js(Node.js)或 Flask、FastAPI(Python)应用在服务器上 24 小时运行,并可以通过域名访问的完整流程。以 Ubuntu 为准。

整体流程

  1. 将代码拉取到服务器(GitHub)
  2. 将机密值放入 .env
  3. 让应用持续运行(Node.js 用 pm2,Python 用 systemd)
  4. 用 Nginx 绑定域名并配置 HTTPS

1. 拉取代码

如果 GitHub 仓库是公开的,直接拉取即可。

git clone https://github.com/your-id/your-app.git
cd your-app

如果是私有仓库(部署密钥)

创建服务器专用的密钥,并以“只读”方式注册到仓库中,就不必把您的 GitHub 密码放在服务器上。

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
cat ~/.ssh/deploy_key.pub

复制输出的那一行,粘贴到 GitHub 仓库 → Settings → Deploy keys → Add deploy key 中。(不要勾选“Allow write access”)然后设置让服务器使用这个密钥,再进行拉取。

printf 'Host github.com\n  IdentityFile ~/.ssh/deploy_key\n' >> ~/.ssh/config
git clone [email protected]:your-id/your-app.git

2. 机密值放在 .env 中

DB 密码、API 密钥之类的值不要直接写在代码中,而是放在服务器的 .env 文件中。

nano .env

🔒 请将 .env 加入 .gitignore,避免将其上传到 GitHub。

3-1. Node.js 应用(pm2)

Node.js 的安装与24 小时托管 Discord 机器人(discord.js、discord.py)中的“安装 Node.js”相同。

npm ci                                   # 按 package-lock.json 安装
npm run build                            # 仅限有构建步骤的应用(Next.js 等)
sudo npm install -g pm2
pm2 start npm --name my-app -- start     # 用 package.json 中的 start 脚本运行
pm2 save
pm2 startup                              # 将输出的命令再复制执行一次

3-2. Python 应用(systemd)

sudo apt install -y python3-venv
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
./venv/bin/pip install uvicorn       # 如果是 FastAPI
./venv/bin/pip install gunicorn      # 如果是 Flask

创建服务文件。

sudo nano /etc/systemd/system/my-app.service

将路径中的 username、your-app 替换为实际的值,ExecStart 两行中只保留适合您应用的一行。(main:app 指 main.py 中的 app,app:app 指 app.py 中的 app)

[Unit]
Description=My Web App
After=network-online.target

[Service]
User=username
WorkingDirectory=/home/username/your-app
EnvironmentFile=/home/username/your-app/.env
# FastAPI
ExecStart=/home/username/your-app/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000
# Flask
# ExecStart=/home/username/your-app/venv/bin/gunicorn -w 2 -b 127.0.0.1:8000 app:app
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now my-app
sudo systemctl status my-app      # 显示 active (running) 即表示成功

4. 绑定域名与 HTTPS

按照搭建网站设置 Nginx、域名和证书,并将“如果想接入 Node.js、Python 应用”部分中 proxy_pass 的端口改为您应用的端口(Node.js 通常为 3000,上面的 Python 示例为 8000)。

应用端口(3000、8000)无需在防火墙中开放。对外只开放 Nginx 的 80、443,让应用只能通过 Nginx 访问,这样更安全。

5. 修改代码后进行更新

cd ~/your-app
git pull

# Node.js
npm ci && npm run build && pm2 restart my-app

# Python
./venv/bin/pip install -r requirements.txt && sudo systemctl restart my-app

遇到问题时

  • 请先查看日志 —— pm2 logs my-app 或 journalctl -u my-app -f
  • 502 Bad Gateway —— 应用没有运行,或者 Nginx 的 proxy_pass 端口与应用端口不一致。
  • EADDRINUSE / Address already in use —— 该端口已被其他程序占用。请用 sudo ss -ltnp | grep 3000 查看是什么程序在使用。
  • 构建因内存不足而卡住 —— 如果在 npm run build 期间服务器卡住,请尝试添加 Swap。

如果问题仍未解决,请在 Discord 提交工单。