通过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)