Skip to main content

Common commands for deployment on a VPS.

Project description

This is a base set of Fabric 2 deployment functions for projects based on Django, Nginx, uWSGI Emperor, Memcached and PostgreSQL.

Fabric is a handy tool for automating deployment processes. Unlike Salt or Ansible, you’re writing code from the beginning rather than diving into a Turing Tarpit of templated YAML. Also unlike Salt, Ansible or shell scripts, Fabric neatly coordinates both local and remote SSH tasks. While Fabric may not be your best choice for provisioning, it works well as a simple and flexible tool for automatic custom workflows.

Installation (Fabric 2.*)

If Fabric 2 is available as an operating system package:

$ sudo apt install fabric invoke
$ pip install --user vps-deploy

Otherwise:

$ pip install --user fabric invoke vps-deploy

Getting started

To get started, create a fabfile.py in your top-level project directory. It might look something like this:

from fabric import task
from invoke.collection import Collection

from vps_deploy import django_fabric2 as df2

hosts = ['user@examplehost.com']

@task(hosts=hosts)
def deploy(c):
    df2.transfer_files_git(c)
    df2.init(c)
    df2.grep_for_pdb(c)
    df2.lint(c)
    df2.prepare_virtualenv(c)
    df2.prepare_django(c)
    df2.fix_permissions(c,
        # Sentry needs access to Git repo.
        read=[
            '.git', 'deploy', 'env', 'project'],
        read_write=['project', 'project/collected_static/CACHE'],
    )
    df2.reload_uwsgi(c)
    df2.flush_memcached(c)
    df2.update_nginx(c)

ns = Collection(
    deploy,
    task(df2.download_postgres_db, hosts=hosts),
    task(df2.mirror_postgres_db, hosts=hosts),
    task(df2.mirror_media, hosts=hosts),
)
ns.configure({
    # Built-in Fabric config.
    'run': {
        'echo': True,
        # Needed so local commands work. Can also use FABRIC_RUN_REPLACE_ENV.
        'replace_env': False,
        # Needed for Guix. Can also use FABRIC_RUN_SHELL.
        # 'shell': '/run/current-system/profile/bin/bash',
    },

    # Our custom project config.
    'env': {
        'branch': 'master',
        'app_user': 'www-data',
        'db_name': 'exampledb',
        'project_dir': '/srv/exampleproject',
        'media_dir': 'project/media',
        'virtualenv': '/srv/venvs/exampleproject-django-py38',
        'site_name': 'examplesite',
        'requirements': 'requirements/production.txt',
        'settings': 'project.settings.live',
        'uwsgi_conf': 'deploy/uwsgi.ini',
        'nginx_conf': 'deploy/nginx.conf',
        'python': '/usr/bin/python3.8',
    },
})

Deploying

To make a deployment:

fab –prompt-for-sudo-password deploy

This depends on a few things being already set up, such as SSH access to the server and having the server-site software and accounts set up. Those tend to to be better handled with configuration management tools like Salt or Ansible (and potentially triggered by Fabric!).

Release History

1.2.0 (2024-07-20)

  • only search git-tracked files in grep_for_pdb command

  • switch to f-strings throughout

  • fix conditionals failing rather than returning False

  • prevent Jinja2 from stripping trailing newlines (causes crontab issues)

  • remove setup.py (not required with Setuptools v40.0.9 under normal use and Pip >= 21.1 when using --editable)

  • add the ability to abort deployment when local git changes present

1.1.0 (2023-07-06)

  • drop dependency on patchwork due to version conflict with Python 3.11-compatible version of invoke

  • remove docs about Fabric 1

1.0.0 (2023-04-12)

  • remove Python 2 support

  • also look for breakpoint (Python 3.7) when checking for debugger calls

  • make sudo_upload_template function part of public API

  • use mktemp instead of deprecated tempfile

  • add pip_install_options argument to prepare_virtualenv function

  • checkout env.branch before running git reset

0.4.10 (2021-09-20)

Improvements

  • switch to setup.cfg

0.4.9 (2021-09-20)

Improvements

  • allow reading secrets from a GPG encrypted file with read_gpg_password_file

0.4.8 (2021-09-18)

Improvements

  • switch to f-strings (pyupgrade –py36-plus)

  • add homepage

0.4.7 (2021-06-29)

Improvements

  • add transfer_files_git_pull command

0.4.6 (2021-06-22)

Improvements

  • Allow grep_for_pdb to accept a comma-separated string of exclusions.

0.4.5 (2021-04-29)

Improvements

  • prevent environment variables containing “%” due to uWSGI applying special meaning to this character

  • add flake8_test and mypy_test commands

  • switch to git ls-files '*.py' to avoid false-positives on non-versioned files

0.4.4 (2020-11-16)

Bug fix

  • don’t attempt to restore database owner and privileges when running mirror_postgres_db

0.4.3 (2020-09-02)

Bug fix

  • fix issue AttributeError: Raw error caused by dependencies

0.4.2 (2020-08-13)

Improvements

  • use python3 -m to run pylint to avoid issues with Debian binary pylint3 and others using just pylint

  • install fabric>=2.5.0 as a dependency

0.4.1 (2020-08-10)

Bug fix

  • remove workaround previously needed for Python 2 Fabric on Python 3 projects

0.4.0 (2020-08-10)

Improvements

  • add Fabric 2 equivalents of existing features

0.3.2 (2019-12-04)

Improvements

  • add optional “push_to_origin” argument to “transfer_files_git”

0.3.1 (2019-07-17)

Bug fix

  • use Python 3 compatible syntax for octal numbers

0.3.0 (2019-07-17)

Improvements

  • create a separate uWSGI config file, rather than a symbolic link, reducing downtime

0.2.5 (2019-01-17)

Improvements

  • Test Nginx config to make errors fail loudly

  • Added a TODO file

  • Fail deployment if Django issues a warning

  • Allow Django “check” fail level to be specified

  • Added download_postgres_db, mirror_postgres_db and mirror_media commands

  • Push the git branch configured in env.branch

  • Remove install dependencies, since you probably already have Fabric 1.x installed

0.2.2 (2016-10-11)

  • Add README

  • Add license information

  • Remove redundant Supervisor, Bazaar and Gunicorn rules

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vps_deploy-1.2.0.tar.gz (22.0 kB view details)

Uploaded Source

Built Distribution

vps_deploy-1.2.0-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file vps_deploy-1.2.0.tar.gz.

File metadata

  • Download URL: vps_deploy-1.2.0.tar.gz
  • Upload date:
  • Size: 22.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.9.6 requests/2.28.1 setuptools/63.2.0 requests-toolbelt/0.9.1 tqdm/4.64.1 CPython/3.10.7

File hashes

Hashes for vps_deploy-1.2.0.tar.gz
Algorithm Hash digest
SHA256 51856de067eb6dcac4dfcb8554ad1bc13a3d4738e2a455b3a12ee2f308fcebf8
MD5 14a69ee0fafb09a7a5a7967ddf29df9f
BLAKE2b-256 72e256e550abeb090c8c929a6d408df6239de6f72c32aa9ffb3967cf1aacd9ac

See more details on using hashes here.

File details

Details for the file vps_deploy-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: vps_deploy-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.9.6 requests/2.28.1 setuptools/63.2.0 requests-toolbelt/0.9.1 tqdm/4.64.1 CPython/3.10.7

File hashes

Hashes for vps_deploy-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7f3d300700c5b8ecbd770d73b15c1dd0bf82ac6163704fe46ed56cad78fcc2f4
MD5 78c256d58982c9524aec0dc646a76700
BLAKE2b-256 615e7ec26a6bb74fedf52b007182477f3818c8e4c30b0d68f7b40cfdbc33ac3d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page