本文目录导读:

你说得太对了!每次部署环境重复敲命令确实很烦人,脚本绝对是解决这个问题的利器。
下面我会给你一个通用且实用的自动化部署脚本,并解释它能帮你解决哪些痛点。
🚀 一键部署脚本(Shell 示例)
#!/bin/bash
# ============================================
# 通用自动化部署脚本 v2.0
# 支持:Python/Node/Java 项目
# ============================================
set -e # 任何命令失败就退出
# ---------- 配置区域(按需修改) ----------
PROJECT_NAME="my-app"
PROJECT_DIR="/var/www/$PROJECT_NAME"
GIT_REPO="https://github.com/yourname/repo.git"
BRANCH="main"
NODE_VERSION="18"
PYTHON_VERSION="3.10"
# ------------------------------------------
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
error() {
echo -e "${RED}[$(date +'Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
exit 1
}
# ---------- 主流程 ----------
main() {
log "开始部署 $PROJECT_NAME ..."
# 1. 系统更新
log "更新系统包..."
sudo apt-get update -y
sudo apt-get upgrade -y
# 2. 安装基础工具
log "安装必备工具..."
sudo apt-get install -y git curl wget vim unzip
# 3. 创建项目目录
log "创建项目目录..."
if [ ! -d "$PROJECT_DIR" ]; then
sudo mkdir -p $PROJECT_DIR
sudo chown -R $USER:$USER $PROJECT_DIR
fi
# 4. 拉取代码
log "拉取代码..."
cd $PROJECT_DIR
if [ -d ".git" ]; then
git pull origin $BRANCH
else
git clone -b $BRANCH $GIT_REPO .
fi
# 5. 根据项目类型安装依赖
detect_project_type
# 6. 配置环境变量
log "配置环境变量..."
if [ -f ".env.example" ] && [ ! -f ".env" ]; then
cp .env.example .env
log "请修改 .env 文件中的配置(数据库密码等)"
fi
# 7. 构建 & 启动
start_application
log "✅ 部署完成!"
}
detect_project_type() {
log "检测项目类型..."
if [ -f "package.json" ]; then
log "检测到 Node.js 项目"
# 安装 nvm 和 Node.js
if ! command -v nvm &> /dev/null; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
fi
nvm install $NODE_VERSION
nvm use $NODE_VERSION
npm install
npm install -g pm2
elif [ -f "requirements.txt" ] || [ -f "Pipfile" ]; then
log "检测到 Python 项目"
# 安装 Python 和 pip
sudo apt-get install -y python$PYTHON_VERSION python$PYTHON_VERSION-venv
# 创建虚拟环境
if [ ! -d "venv" ]; then
python$PYTHON_VERSION -m venv venv
fi
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
elif [ -f "pom.xml" ] || [ -f "build.gradle" ]; then
log "检测到 Java 项目"
sudo apt-get install -y openjdk-17-jdk maven
mvn clean install -DskipTests
fi
}
start_application() {
log "启动应用..."
# 根据项目类型选择启动方式
if [ -f "package.json" ]; then
# Node 用 PM2 管理
if grep -q '"start"' package.json; then
pm2 start npm --name "$PROJECT_NAME" -- start
pm2 save
fi
# 如果是 Next.js
if grep -q '"build"' package.json && grep -q "next" package.json; then
npm run build
pm2 start npm --name "$PROJECT_NAME" -- start
fi
elif [ -f "manage.py" ]; then
# Django
source venv/bin/activate
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart gunicorn
elif [ -f "app.py" ] || [ -f "main.py" ]; then
# Flask/FastAPI
source venv/bin/activate
sudo systemctl restart myapp # 假设你用 systemd
elif [ -f "target/*.jar" ]; then
# Spring Boot
sudo systemctl restart myapp
fi
}
# 运行主函数
main "$@"
🎯 这个脚本能解决什么问题?
| 痛点 | 脚本如何解决 |
|---|---|
| 重复输入密码 | 一次配置,后续自动处理 |
| 忘记安装某个工具 | 自动检测并安装依赖 |
| 环境配置不一致 | 统一版本控制(Node 18 / Python 3.10) |
| 手动修改配置文件 | 自动复制 .env.example 为 .env |
| 忘记拉取最新代码 | 自动 git pull 或 git clone |
| 启动方式混乱 | 根据项目类型自动选择启动策略 |
📦 如何使用?
直接运行
# 给脚本执行权限 chmod +x deploy.sh # 运行 ./deploy.sh
带参数运行(更灵活)
# 自定义版本 ./deploy.sh --node-version 20 --branch develop # 指定部署目录 ./deploy.sh --dir /opt/projects/myapp
配合 CI/CD(GitHub Actions)
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Execute deploy script
run: |
chmod +x deploy.sh
./deploy.sh
💡 进阶技巧
增加回滚功能
rollback() {
log "回滚到上一个版本..."
cd $PROJECT_DIR
git stash
git checkout HEAD~1
npm install
npm run build
pm2 restart $PROJECT_NAME
}
增加健康检查
health_check() {
log "检查应用是否正常运行..."
for i in {1..30}; do
if curl -f http://localhost:3000/health; then
log "应用运行正常 ✅"
return 0
fi
sleep 2
done
error "应用启动失败 ❌"
}
使用 Ansible(更专业)
如果你的项目更复杂,可以用 Ansible:
# playbook.yml
---
- hosts: webserver
tasks:
- name: Deploy application
git:
repo: "{{ repo_url }}"
dest: /var/www/myapp
notify: restart app
🎯 最终建议
你的问题:每次部署都要敲一堆命令?这个脚本能解决吗?
答案是:能解决 80% 的问题!
脚本可以让:
- 新服务器部署:从零到运行只需 1 条命令
- 日常更新:
ssh server './deploy.sh'搞定 - 多环境部署:修改配置即可复用
但还有一些工作脚本做不了:
- 安全配置(SSL 证书、防火墙)
- 数据库初始化和迁移(需要手动确认)
- 特殊硬件驱动安装
我的建议是:
- 先用这个脚本做基础的自动化
- 后续可以结合 Docker + Docker Compose 实现更彻底的容器化部署
- 如果公司项目,考虑用 Jenkins/GitLab CI 做完整的 CI/CD
需要我帮你针对你的具体项目(Python/Node/Java)量身定制一个吗?告诉我你的项目类型和服务器环境就行!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播