You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jenkins部署远程生产服务器并调整Django部署目录?

Django跨实例多用户部署方案(Dev+Prod)

一、调整Instance1(Dev环境)的部署目录

1. 解决权限问题

Jenkins默认以jenkins用户运行,要读写/home/djDev/djApp,得先给它权限:

  • 创建目标目录(如果还没):sudo mkdir -p /home/djDev/djApp
  • 把jenkins加入djDev用户组:sudo usermod -aG djDev jenkins
  • 调整目录权限,让组内用户可读写:
    sudo chown -R djDev:djDev /home/djDev/djApp
    sudo chmod -R g+rw /home/djDev/djApp
    
  • 重启Jenkins生效:sudo systemctl restart jenkins

2. 修改Jenkins部署路径

打开你的Dev部署任务,把所有涉及/var/lib/jenkins的路径替换成/home/djDev/djApp:

  • 如果是Freestyle任务:在源码管理的“本地目录”或构建步骤的脚本里改路径
  • 如果是Pipeline,直接修改脚本里的路径,比如:
    stage('Deploy to Dev') {
        steps {
            sh 'git clone https://github.com/your-repo/django-app.git /home/djDev/djApp || (cd /home/djDev/djApp && git pull origin dev)'
        }
    }
    

3. 调整Django运行配置

  • 修改settings.py里的STATIC_ROOT、MEDIA_ROOT指向/home/djDev/djApp/static和/home/djDev/djApp/media
  • 如果用systemd管理服务,编辑/etc/systemd/system/django-dev.service:
    • 把WorkingDirectory设为/home/djDev/djApp
    • 把User设为djDev(用应用所属用户运行更安全)
  • 重启服务:sudo systemctl daemon-reload && sudo systemctl restart django-dev

二、配置Instance2(生产环境)的远程部署

1. 配置Jenkins无密码SSH访问

让instance1的jenkins用户能免密登录instance2的djProd用户:

  • 切换到jenkins用户:sudo su - jenkins
  • 生成SSH密钥:ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519(一路回车,不要设密码)
  • 把公钥传到instance2:ssh-copy-id -i ~/.ssh/id_ed25519.pub djProd@instance2-ip
  • 验证:ssh djProd@instance2-ip,能直接登录就算成功

2. 准备Instance2的部署环境

  • 创建目标目录:sudo mkdir -p /home/djProd/djApp
  • 设归属为djProd:sudo chown -R djProd:djProd /home/djProd/djApp
  • 给djProd配置sudo免密(用于重启服务):编辑/etc/sudoers,添加一行:
    djProd ALL=(ALL) NOPASSWD: /bin/systemctl restart django-prod
    
    (只允许重启指定服务,遵循最小权限原则)

3. 配置Jenkins生产部署任务

新建一个生产部署任务,推荐用Pipeline,示例脚本:

pipeline {
    agent any
    stages {
        stage('Deploy to Prod') {
            steps {
                sshagent(['instance2-djProd-ssh-key']) { // 提前在Jenkins全局配置里添加这个密钥凭据
                    sh '''
                        ssh djProd@instance2-ip << 'EOF'
                            cd /home/djProd/djApp
                            git pull origin main // 拉取生产分支
                            source venv/bin/activate
                            pip install -r requirements.txt --upgrade
                            python manage.py migrate --noinput
                            python manage.py collectstatic --noinput
                            sudo systemctl restart django-prod
                        EOF
                    '''
                }
            }
        }
    }
}

如果用Freestyle,就加一个“Execute shell script on remote host using ssh”步骤,填同样的脚本就行。

三、配置Dev测试通过后自动触发生产部署

1. Freestyle任务配置

打开Dev任务的构建后操作,添加“Build other projects”:

  • 选择生产部署任务
  • 勾选“Trigger only if build is stable”(只有测试通过、构建稳定才触发)

2. Pipeline配置

在Dev的Pipeline脚本里,测试阶段后加触发逻辑:

stage('Run Dev Tests') {
    steps {
        sh 'cd /home/djDev/djApp && python manage.py test'
    }
    post {
        success {
            build job: 'prod-deploy-job', wait: false // 异步触发生产部署
        }
    }
}

四、关键注意事项

  • 虚拟环境隔离:Dev和Prod都要单独建虚拟环境,比如/home/djDev/djApp/venv和/home/djProd/djApp/venv,避免依赖冲突
  • 分支隔离:Dev用dev分支,Prod用main分支,Jenkins任务分别拉对应分支,防止误部署
  • 日志监控:配置Django日志到/var/log/django/目录,同时保留Jenkins构建日志,方便排查问题
  • 备份策略:部署前自动备份Prod的数据库和静态文件,比如在生产部署脚本开头加备份命令

内容的提问来源于stack exchange,提问作者Santana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:37:07