通过SSH和Paramiko通过管理命令部署Django网站。
项目描述
Django SSH Deployer
此包提供了一个Django管理命令,通过SSH和Paramiko将您的站点部署到各种实例(开发、测试、生产)。
先决条件
力量越大,责任越大!目标服务器(DEPLOYER_INSTANCES['instance']['servers'])必须每个都安装了git和Python 3.3+,并支持Linux风格的OS命令。目标服务器必须有一个用户(DEPLOYER_INSTANCES['instance']['server_user']),该用户从您运行Django命令的控制机器上设置了密钥。这意味着通常需要在目标服务器的用户账户的AUTHORIZED_KEYS中安装控制机器账户的公钥。
安装和所需的Django设置
通过pip安装到您的开发环境中
pip install django-ssh-deployer
然后向您的INSTALLED_APPS中添加django_ssh_deployer。接下来,我们需要在Django的设置中配置您的实例;这些可以位于您的开发或本地设置中,因为它们在生产中不是必需的。
DEPLOYER_INSTANCES = {
"dev": {
"name": "your-project",
"repository": "git@github.com:youruser/your-project.git",
"branch": "dev",
"settings": "config.settings.dev",
"pip_command": "-e .[dev]",
"code_path": "/var/django/sites",
"venv_python_path": "/usr/bin/python3",
"upgrade_pip": True,
"servers": ["devserver.example.com"],
"server_user": "deploy_user",
"save_deploys": 3,
"selinux": False,
"collectstatic": False,
"migrate": False,
},
"prod": {
"name": "your-project",
"repository": "git@github.com:youruser/your-project.git",
"branch": "prod",
"settings": "config.settings.prod",
"requirements": "requirements/prod.txt",
"code_path": "/var/django/sites",
"venv_python_path": "/usr/bin/python3",
"upgrade_pip": True,
"servers": ["prodserver-1.example.com", "prodserver-2.example.com"],
"server_user": "deploy_user",
"save_deploys": 3,
"selinux": True,
"additional_commands": [
"chmod -R a+rX /var/django/sites/your-project-prod",
"curl -kLs -o /dev/null --max-time 5 --resolve 'your-domain.com:443:127.0.0.1' https://your-domain.com/",
],
},
}
name: 您项目的名称。repository: 您 Django 项目的仓库,每个目标服务器都会克隆此仓库。branch: 实例要检出哪个分支。settings: 实例 Django 设置的完整路径。requirements或pip_command: 要为实例安装的相对路径的requirements文件,或 pip 路径。code_path: 在目标服务器上检出到您的代码仓库的根路径。venv_python_path: 在目标服务器上用于venv的 Python 版本的完整路径。servers: 部署 Django 项目的服务器列表。server_user: 在目标服务器上配置了来自控制机的密钥的用户。- (可选)
upgrade_pip: 如果设置为False,则不会升级pip到最新版本。 - (可选)
collectstatic: 如果设置为False,则不会收集静态文件。 - (可选)
migrate: 如果设置为False,则不会运行迁移。 - (可选)
save_deploys: 如果是一个正整数,则只保留最近的数量个部署。默认情况下,将保留所有部署。 - (可选)
selinux: 如果设置为 True,部署程序将运行chcon命令,为 SELinux 设置必要的文件安全上下文。它将codepath中的所有文件设置为httpd_sys_content_t,并将venv中的任何*.so文件设置为httpd_sys_script_exec_t。 - (可选)
additional_commands: 在部署完成后运行的命令列表。
您还可以自定义 Django 设置中由 git clone 创建的目录。
DEPLOYER_CLONE_DIR_FORMAT = "{name}-{instance}"
以下关键字将在检出目录格式中被替换:instance、name、branch 和 server_user。默认为 "{name}-{instance}",例如上面的示例中,将是 your-project-develop 和 your-project-production。
运行命令
python manage.py deploy --instance=develop
--instance: 必需。在DEPLOYER_INSTANCES中部署的实例名称。在上面的示例中,可以是develop或production。--quiet: 输出较少。不将正在运行的命令的输出显示到终端。--no-confirm: 在确认步骤之前发布。请小心!--stamp: 默认情况下,Django SSH Deployer 会将日期时间戳追加到git clone。这将覆盖默认的日期时间。
它做了什么
deploy 命令将以 server_user 的身份 SSH 到 servers 中的每个服务器,并在两步中执行以下功能。
首先,它将连接到每个服务器并准备新的部署
- 带有戳记从 git 中克隆仓库
- 创建一个带有戳记的
venv - 运行
collectstatic命令
在所有服务器上无错误地准备部署后,它将进入最终部署步骤
- 只在第一个服务器上运行
migrate命令 - 在每个服务器上创建或更新符号链接,以指向完成的部署
已知限制和问题
- 不支持 Windows 服务器,但是您可以使用 Windows 作为您的控制机。
- 您的仓库的主机必须在目标服务器的已知主机列表中,因为 git 检出需要 SSH 的初始指纹。
- 这并不是一个完整的持续集成产品(如 Jenkins)的替代品。
发布说明
贡献者
- Timothy Allen (https://github.com/FlipperPA)