Skip to content

Django-Vagrant-Ansible-Nginx-Gunicorn Starter Pack

Notifications You must be signed in to change notification settings

aoxborrow/dvang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DVANG

Django-Vagrant-Ansible-Nginx-Gunicorn Starter Pack

This is a starter pack for quickly developing a Django project locally with Vagrant, which is then easily deployed into production with Ansible. It installs and configures all the services you'll need:

  • Vagrant VM based on Ubuntu 18.04
  • Python 3.6 virtualenv for your Django app and its dependencies
  • Nginx to serve static files and proxy to Gunicorn
  • Supervisor to automatically start/restart Gunicorn
  • PostgreSQL with database and initial Django migrations
  • Minimal Django configuration with Django Admin and Debug Toolbar
  • Node.js for installing front-end components (optional)

Features

  • Disposable environment is fully self-contained within the Vagrant VM
  • Ansible playbooks for both local development and production
  • Develop with Django dev server, then test/deploy with Gunicorn/Nginx
  • Easily add Ansible galaxy roles (ansible/requirements.yml)
  • Activates Python virtualenv on login
  • Installs Python packages from requirements.txt
  • Installs Node packages from package.json
  • Configure environment-specific Django settings in settings_local.py

Shortcuts

  • activate - activate the virtualenv
  • deactivate - deactivate the virtualenv
  • make run - run Django development server
  • make migrate - makemigrations and migrate
  • make load - load fixtures
  • make collect - collect static files
  • make restart - start/restart Gunicorn & Nginx
  • make provision-dev - run playbook for dev (must deactivate virtualenv)
  • make provision-prod - run playbook production (must deactivate virtualenv)

Local Development

  1. Install Vagrant

  2. Clone this repo as your project name: (This is important, the project folder name will be used for configuring database name, hostname, etc.)

    git clone [email protected]:paste/dvang.git my-project-name
  3. Build your Vagrant VM:

    vagrant up
  4. Log into the VM via SSH:

    vagrant ssh
  5. Start Django development server:

    cd my-project-name
    make run
  6. Modify your computer's local /etc/hosts:

    192.168.33.55   my-project-name.local
    
  7. Visit your app:

    http://my-project-name.local
    
  8. Login to Django Admin with user/pass: admin/admin:

    http://my-project-name.local/admin
    
  9. Profit ✔️


In Production

  1. You'll need a remote user with sudo privileges to run Ansible.

  2. Edit the host_name and other settings in ansible/prod.yml as necessary.

  3. Clone your project onto the server in your remote user's home folder, e.g. ~/my-project-name

  4. Install Ansible with the included script:

    cd ~/my-project-name
    sudo ansible/install.sh
  5. Install Ansible Galaxy roles:

    make install-galaxy-roles
  6. Run the Ansible production playbook:

    make provision-prod
  7. Activate the virtualenv:

    # after this you can use "activate" and "deactivate" shortcuts
    source ~/.bashrc
  8. Apply Django migrations:

    make migrate
  9. Load Django fixtures:

    make load
  10. Collect Django static files:

    make collect
  11. Profit ✔️


HTTPS in Production

  1. To use HTTPS you will need an SSL certificate. Get one from Certbot here: https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx

  2. Copy the certificate and key to your remote user's home folder. The Nginx configuration expects the files to be named after the host_name, like this:

    ~/dvang.io.crt
    ~/dvang.io.key
    
  3. Update the production playboook to use SSL, in ansible/prod.yml:

    nginx_use_ssl: true
  4. Enable SSL features for Django, in src/settings_local.py:

    # this enables secure cookies, HTTP redirect, etc.
    USE_SSL = True
  5. Re-run the Ansible production playbook:

    make provision-prod
  6. Profit ✔️