目录

第一部分:部署基础与规划

  1. 项目背景与部署目标
  2. 服务器选购指南
  3. 基础环境配置(SSH + 软件安装)
  4. 部署架构总览

第二部分:通用部署核心流程

  1. 标准化部署七步法
  2. 代码托管与免密克隆
  3. 环境变量与敏感信息管理
  4. 进程守护(Supervisor 与 systemd)
  5. 反向代理与 HTTPS(Nginx + SSL)
  6. 数据库部署与管理(MySQL/PostgreSQL)
  7. 日志管理与轮转

第三部分:安全加固与监控

  1. SSH 安全与防火墙
  2. Fail2ban 防暴力破解
  3. Nginx 安全响应头
  4. 基础监控与告警

第四部分:自动化与备份

  1. CI/CD 自动部署(GitHub Actions 示例)
  2. 数据备份与恢复策略
  3. 系统快照与灾难演练

第五部分:项目示例(Go+Flutter / Python+Vue)

  1. demo1 部署示例
  2. demo2 部署示例
  3. 配置模板速查表

第六部分:故障排查速查手册


第一部分:部署基础与规划

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. 标准化部署七步法

  1. 后端环境准备(虚拟环境/编译)
  2. 前端构建(本地或服务器)
  3. 上传静态文件(scp/rsync)
  4. 配置进程守护(Supervisor 或 systemd)
  5. 配置 Nginx(HTTP/HTTPS + API 代理)
  6. 启动服务(supervisorctl / systemctl)
  7. 验证并测试

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_IPSSH_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
查看进程内存 htopps 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` 文件使用。如需调整细节(如具体域名、端口),请根据实际项目替换。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐