跳转到主要内容

通过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 设置的完整路径。
  • requirementspip_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}"

以下关键字将在检出目录格式中被替换:instancenamebranchserver_user。默认为 "{name}-{instance}",例如上面的示例中,将是 your-project-developyour-project-production

运行命令

python manage.py deploy --instance=develop
  • --instance: 必需。在 DEPLOYER_INSTANCES 中部署的实例名称。在上面的示例中,可以是 developproduction
  • --quiet: 输出较少。不将正在运行的命令的输出显示到终端。
  • --no-confirm: 在确认步骤之前发布。请小心!
  • --stamp: 默认情况下,Django SSH Deployer 会将日期时间戳追加到 git clone。这将覆盖默认的日期时间。

它做了什么

deploy 命令将以 server_user 的身份 SSH 到 servers 中的每个服务器,并在两步中执行以下功能。

首先,它将连接到每个服务器并准备新的部署

  • 带有戳记从 git 中克隆仓库
  • 创建一个带有戳记的 venv
  • 运行 collectstatic 命令

在所有服务器上无错误地准备部署后,它将进入最终部署步骤

  • 只在第一个服务器上运行 migrate 命令
  • 在每个服务器上创建或更新符号链接,以指向完成的部署

已知限制和问题

  • 不支持 Windows 服务器,但是您可以使用 Windows 作为您的控制机。
  • 您的仓库的主机必须在目标服务器的已知主机列表中,因为 git 检出需要 SSH 的初始指纹。
  • 这并不是一个完整的持续集成产品(如 Jenkins)的替代品。

发布说明

发布说明可在 GitHub 上找到。

贡献者

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django_ssh_deployer-1.0.0.tar.gz (10.4 kB 查看哈希值)

上传时间

构建分布

django_ssh_deployer-1.0.0-py3-none-any.whl (8.5 kB 查看哈希值)

上传时间 Python 3

由以下支持