全栈项目云端部署指南
目录
第一部分:部署基础与规划
- 项目背景与部署目标
- 服务器选购指南
- 基础环境配置(SSH + 软件安装)
- 部署架构总览
第二部分:通用部署核心流程
- 标准化部署七步法
- 代码托管与免密克隆
- 环境变量与敏感信息管理
- 进程守护(Supervisor 与 systemd)
- 反向代理与 HTTPS(Nginx + SSL)
- 数据库部署与管理(MySQL/PostgreSQL)
- 日志管理与轮转
第三部分:安全加固与监控
- SSH 安全与防火墙
- Fail2ban 防暴力破解
- Nginx 安全响应头
- 基础监控与告警
第四部分:自动化与备份
- CI/CD 自动部署(GitHub Actions 示例)
- 数据备份与恢复策略
- 系统快照与灾难演练
第五部分:项目示例(Go+Flutter / Python+Vue)
- demo1 部署示例
- demo2 部署示例
- 配置模板速查表
第六部分:故障排查速查手册
第一部分:部署基础与规划
1. 项目背景与部署目标
- 背景:将全栈项目从本地开发环境部署到云端,支持小规模内测或正式线上服务。
- 目标:
- 稳定运行,具备故障自愈能力(进程守护)。
- 安全可控(HTTPS、访问控制、防火墙)。
- 可维护(日志轮转、备份、监控)。
- 流程标准化,可复用于不同技术栈。
2. 服务器选购指南
2.1 需求评估维度
- 技术栈:Linux 优先(Ubuntu 24.04 LTS);.NET/SQL Server 选 Windows。
- 流量与性能:内测 2核2GB 足够;正式线上建议 2核4GB 起步。
- 数据存储:MySQL/PostgreSQL 建议 4GB+ 内存;SQLite 可 2GB。
- 维护能力:新手可选带面板镜像(宝塔/1Panel),推荐纯净系统自行配置。
2.2 产品选择对比
| 特性 | 轻量应用服务器 | 云服务器(CVM/ECS) |
|---|---|---|
| 优势 | 便宜、开箱即用 | 灵活、高性能、可伸缩 |
| 计费 | 包年包月 | 按量/包年包月 |
| 场景 | 毕设、个人博客、测试 | 企业级、高并发、AI |
推荐方案:
- 极致性价比:2核2GB、4M带宽、50GB SSD(腾讯云轻量)
- 均衡实用:2核4GB、5M带宽、60GB SSD(阿里云轻量)
- 专业进阶:4核8GB、5M+带宽(CVM/ECS)
2.3 购买后立即操作
- 防火墙规则(云控制台)开放端口:
22(SSH),80(HTTP),443(HTTPS), 以及项目专用端口(如 5051, 5052)。 - 操作系统:Ubuntu 24.04 LTS 纯净版。
3. 基础环境配置(SSH + 软件安装)
3.1 SSH 登录
ssh ubuntu@<服务器IP>
# 若频繁断开,加入心跳参数
ssh -o ServerAliveInterval=60 ubuntu@<IP>
3.2 更新系统并安装基础软件
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx git curl wget supervisor
# 编程语言环境(按需)
sudo apt install -y golang-go python3 python3-pip nodejs npm python3.12-venv
4. 部署架构总览
用户浏览器 → HTTPS(443) → Nginx(反向代理+静态资源)
├─ 前端静态文件(/dist 或 /build)
└─ 代理 /api/* → 后端进程(Gunicorn/Go二进制)
└─ 数据库(MySQL/PostgreSQL/SQLite)
Supervisor/systemd 守护后端进程
第二部分:通用部署核心流程
1. 标准化部署七步法
- 后端环境准备(虚拟环境/编译)
- 前端构建(本地或服务器)
- 上传静态文件(scp/rsync)
- 配置进程守护(Supervisor 或 systemd)
- 配置 Nginx(HTTP/HTTPS + API 代理)
- 启动服务(supervisorctl / systemctl)
- 验证并测试
2. 代码托管与免密克隆(GitHub SSH)
# 生成 SSH 密钥对
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/github_key
cat ~/.ssh/github_key.pub # 复制公钥到 GitHub → Settings → SSH Keys
# 配置 SSH config
cat > ~/.ssh/config <<EOF
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_key
StrictHostKeyChecking no
EOF
chmod 600 ~/.ssh/config
# 浅克隆(节约空间)
git clone --depth 1 git@github.com:用户名/仓库名.git
3. 环境变量与敏感信息管理
原则:绝不硬编码密码、密钥;不将 .env 提交到 Git。
3.1 创建 .env 文件(示例)
# 后端根目录下 .env
PORT=8082
DATABASE_URL=postgresql://user:pass@localhost/dbname
SECRET_KEY=your-secret-key
3.2 在 Supervisor 或 systemd 中引用
Supervisor(demo2 示例):
environment=ENV_FILE="/home/ubuntu/demo2/backend/.env"
后端代码读取 os.getenv("ENV_FILE") 再加载 python-dotenv。
systemd(推荐):
创建 /etc/systemd/system/myapp.service,使用 EnvironmentFile=/path/to/.env。
4. 进程守护:Supervisor vs systemd
| 方案 | 优点 | 适用场景 |
|---|---|---|
| Supervisor | 简单、Web管理界面、非root用户友好 | 传统项目、多进程管理 |
| systemd | 系统原生、资源占用低、日志集成好 | 现代 Linux 推荐 |
4.1 systemd 示例(替代 Supervisor)
创建 /etc/systemd/system/demo2-backend.service:
[Unit]
Description=Demo2 Flask Backend
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/demo2/backend
EnvironmentFile=/home/ubuntu/demo2/backend/.env
ExecStart=/home/ubuntu/demo2/backend/venv/bin/gunicorn -w 4 -b 127.0.0.1:8082 wsgi:app
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启动命令:
sudo systemctl daemon-reload
sudo systemctl enable demo2-backend
sudo systemctl start demo2-backend
sudo systemctl status demo2-backend
5. 反向代理与 HTTPS(Nginx + SSL)
5.1 购买域名并解析
- 在域名服务商(阿里云/腾讯云/Cloudflare)添加 A 记录,将域名指向服务器公网 IP。
5.2 申请免费 SSL 证书(Let’s Encrypt)
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 自动配置 HTTPS 并定时续期(证书90天有效期)
5.3 Nginx 完整 HTTPS 配置模板(替换之前的 HTTP-only)
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
root /home/ubuntu/demo2/frontend/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8082;
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;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:8082;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
}
# HTTP 强制跳转 HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
6. 数据库部署与管理(MySQL/PostgreSQL)
6.1 安装 PostgreSQL(以 Ubuntu 24.04 为例)
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql && sudo systemctl enable postgresql
6.2 创建数据库和用户(安全配置)
sudo -u postgres psql
CREATE DATABASE myappdb;
CREATE USER myappuser WITH PASSWORD 'strong_password';
GRANT ALL PRIVILEGES ON DATABASE myappdb TO myappuser;
\q
6.3 后端连接配置(示例 .env)
DATABASE_URL=postgresql://myappuser:strong_password@localhost/myappdb
6.4 数据库备份(cron 任务)
# 创建备份脚本 /home/ubuntu/backup_db.sh
#!/bin/bash
pg_dump myappdb > /backups/myappdb_$(date +%Y%m%d_%H%M%S).sql
# 保留最近7天
find /backups -name "*.sql" -mtime +7 -delete
# 加入 crontab(每天凌晨2点)
0 2 * * * /home/ubuntu/backup_db.sh
7. 日志管理与轮转
7.1 使用 logrotate 管理 Supervisor/应用日志
创建 /etc/logrotate.d/myapp:
/var/log/demo2-backend*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 ubuntu ubuntu
sharedscripts
postrotate
supervisorctl reread && supervisorctl update
endscript
}
7.2 Nginx 日志轮转(系统已自带,可调整保留时长)
sudo nano /etc/logrotate.d/nginx
# 设置 rotate 30 保留30天
第三部分:安全加固与监控
1. SSH 安全与防火墙
1.1 禁用密码登录,仅允许密钥
sudo nano /etc/ssh/sshd_config
# 修改:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
# 重启
sudo systemctl restart sshd
1.2 配置 UFW 防火墙
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
2. Fail2ban 防暴力破解
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban && sudo systemctl start fail2ban
3. Nginx 安全响应头
在 server 块中添加:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always;
4. 基础监控与告警
4.1 健康检查脚本(cron 每5分钟)
#!/bin/bash
curl -f http://127.0.0.1:8082/health || echo "后端异常" | mail -s "Alert" your-email@example.com
4.2 安装 netdata(实时监控面板)
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# 访问 http://你的IP:19999
第四部分:自动化与备份
1. CI/CD 自动部署(GitHub Actions)
1.1 在项目根目录创建 .github/workflows/deploy.yml
name: Deploy to Server
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Build Frontend
run: |
cd frontend
npm install
npm run build
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Backend Dependencies
run: |
cd backend
pip install -r requirements.txt
- name: Deploy via SSH
uses: appleboy/scp-action@v0.1.4
with:
host: ${{ secrets.SERVER_IP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "frontend/dist,backend"
target: "/home/ubuntu/demo2"
- name: Restart Services
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.SERVER_IP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
sudo systemctl restart demo2-backend
sudo systemctl reload nginx
需要在 GitHub 仓库 Settings → Secrets 中添加
SERVER_IP、SSH_PRIVATE_KEY。
2. 数据备份与恢复策略
2.1 自动备份脚本(结合云存储)
#!/bin/bash
DATE=$(date +%Y%m%d)
tar -czf /backups/code_$DATE.tar.gz /home/ubuntu/demo2
pg_dump myappdb > /backups/db_$DATE.sql
# 上传到 OSS(需安装 ossutil)
ossutil cp /backups/code_$DATE.tar.gz oss://mybucket/backups/
2.2 恢复步骤
- 重新安装系统后,安装基础软件,克隆代码。
- 从 OSS 下载最新备份,解压覆盖。
- 导入数据库:
psql myappdb < db_backup.sql。 - 重启服务。
3. 系统快照(云厂商功能)
- 腾讯云/阿里云控制台可创建自定义镜像或磁盘快照,灾难后一键恢复。
第五部分:项目示例(Go+Flutter / Python+Vue)
1. demo1 部署示例(Go + Flutter Web)
1.1 后端(Go)编译与 Supervisor 配置
cd ~/demo1/server/go/cmd/demo1backend
go build -o timeapi main.go
创建 /etc/supervisor/conf.d/demo1-backend.conf:
[program:demo1-backend]
command=/home/ubuntu/demo1/server/go/cmd/demo1backend/timeapi
directory=/home/ubuntu/demo1/server/go/cmd/demo1backend
user=ubuntu
autostart=true
autorestart=true
environment=PORT="8081",TEST_SEED_USERS="test1,test2",TEST_SEED_PASSWORD="Pass1234"
1.2 前端构建与上传(本地)
flutter build web --release --dart-define=API_BASE=/api
scp -r build/web/* ubuntu@<IP>:/home/ubuntu/demo1/build/web/
1.3 Nginx 配置(HTTPS 版)
server {
listen 443 ssl;
server_name demo1.your-domain.com;
root /home/ubuntu/demo1/build/web;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
}
}
1.4 验证
访问 https://demo1.your-domain.com,使用 test1/Pass1234 登录。
2. demo2 部署示例(Python Flask + Vue3)
2.1 后端环境(使用 systemd 代替 Supervisor)
cd ~/demo2/backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt gunicorn gevent
创建 /etc/systemd/system/demo2-backend.service(参考 4.1 节)。
2.2 前端构建与上传
cd demo2/frontend
npm install && npm run build
scp -r dist/* ubuntu@<IP>:/home/ubuntu/demo2/frontend/dist/
2.3 Nginx 配置(含 WebSocket)
server {
listen 443 ssl;
server_name demo2.your-domain.com;
root /home/ubuntu/demo2/frontend/dist;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
}
location /socket.io/ {
proxy_pass http://127.0.0.1:8082;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
2.4 验证
访问 https://demo2.your-domain.com,使用 test1/Test1234 登录。
3. 配置模板速查表
| 项目 | 后端类型 | 守护方式 | 监听端口 | 静态目录 | API 代理 |
|---|---|---|---|---|---|
| demo1 | Go | Supervisor | 8081 | /home/ubuntu/demo1/build/web |
http://127.0.0.1:8081/ |
| demo2 | Flask | systemd | 8082 | /home/ubuntu/demo2/frontend/dist |
http://127.0.0.1:8082 |
第六部分:故障排查速查手册
常用命令汇总
| 目的 | 命令 |
|---|---|
| Nginx 配置测试 | sudo nginx -t |
| 重载 Nginx | sudo systemctl reload nginx |
| 查看 Nginx 错误日志 | sudo tail -f /var/log/nginx/error.log |
| Supervisor 状态 | sudo supervisorctl status |
| systemd 状态 | sudo systemctl status demo2-backend |
| 查看 systemd 日志 | sudo journalctl -u demo2-backend -f |
| 端口监听检查 | sudo ss -lntp | grep 8082 |
| 测试后端直连 | curl -v http://127.0.0.1:8082/health |
| 防火墙状态 | sudo ufw status verbose |
| 查看进程内存 | htop 或 ps aux --sort=-%mem | head |
常见问题与解决
- 无法访问端口:检查云防火墙 + UFW + 服务监听地址(应为 127.0.0.1 或 0.0.0.0)。
- 502 Bad Gateway:后端未启动或端口错误;检查 Nginx
proxy_pass末尾斜杠。 - SSL 证书过期:
sudo certbot renew --dry-run测试自动续期。 - 磁盘写满:
df -h查看,清理旧日志或备份文件。
结语
本指南从零开始,覆盖了全栈项目部署所需的服务器选购、环境配置、进程守护、HTTPS、数据库、安全加固、监控、CI/CD、备份恢复等核心环节,并提供了两个不同技术栈的完整示例。您可以根据自身项目需求,按章节逐步实施。
后续扩展建议:
- 引入 Docker 容器化部署(编写 Dockerfile + docker-compose)。
- 使用 Kubernetes 管理多服务(进阶)。
- 集成 Sentry 做前端错误监控。
祝您部署顺利! 🚀
这份文档可以直接保存为 `.md` 文件使用。如需调整细节(如具体域名、端口),请根据实际项目替换。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)