Skip to content

Flask-Vagrant-Ansible-Nginx-Gunicorn Starter Pack

Notifications You must be signed in to change notification settings

aoxborrow/fvang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FVANG

Flask-Vagrant-Ansible-Nginx-Gunicorn Starter Pack

This is a starter pack for quickly developing a new Flask 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 Flask app and its dependencies
  • Nginx to serve static files and proxy to Gunicorn
  • Supervisor to automatically start/restart Gunicorn
  • 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 Flask 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

Shortcuts

  • activate - activate the virtualenv
  • deactivate - deactivate the virtualenv
  • make run - run Flask development server
  • 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 hostname, etc.)

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

    vagrant up
  4. Log into the VM via SSH:

    vagrant ssh
  5. Start Flask development server:

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

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

    http://my-project-name.local
    
  8. 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. 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:

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

    nginx_use_ssl: true
  4. Re-run the Ansible production playbook:

    make provision-prod
  5. Profit ✔️