如何通过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
相关产品推荐
相关产品推荐

