Skip to content

Instantly share code, notes, and snippets.

@justinvoss
Created June 20, 2011 16:05
Show Gist options
  • Save justinvoss/1035890 to your computer and use it in GitHub Desktop.
Save justinvoss/1035890 to your computer and use it in GitHub Desktop.
Example Fabric and Cuisine Scrips
from deployment.cuisine import *
from fabric.api import *
from fabric.context_managers import *
from fabric.utils import puts
from fabric.colors import red, green
import simplejson
import os
GIT_REPO = 'git@github.com:Vossy/redacted-webapp.git'
def app_user(command):
'''
This helper method runs the given command as the webapp user.
'''
sudo(command, user='redacted_webapp')
def production():
puts(red('Using PRODUCTION settings'))
env.hosts = ['app.redacted.com']
env.user = '***********'
env.password = '***********'
def setup_packages():
puts(green('Installing Ubuntu packages'))
sudo('apt-get update')
package_ensure('nginx')
package_ensure('postgresql')
package_ensure('supervisor')
package_ensure('git-core')
package_ensure('ufw') # may have to install by hand
package_ensure('python-pip')
package_ensure('python-psycopg2')
package_ensure('python-imaging')
def setup_users():
puts(green('Creating Ubuntu users'))
user_ensure('redacted_webapp')
def configure_firewall():
puts(green('Configuring server firewall'))
sudo('ufw allow proto tcp from any to any port 22')
sudo('ufw allow 80')
sudo('ufw --force enable')
def configure_nginx():
puts(green('Configuring Nginx web server'))
config_template = text_strip_margin('''
|
|server {
| server_name app.redacted.com;
|
| access_log /srv/redacted-webapp/logs/nginx_access.log;
|
| location /static/ {
| alias /srv/redacted-webapp/src/media/;
| autoindex on;
| }
|
| location /media/ {
| alias /srv/redacted-webapp/shortcuts/admin_media/;
| }
|
| location / {
| proxy_pass http://127.0.0.1:9001/;
| proxy_redirect off;
| proxy_set_header Host $host;
| proxy_set_header X-Real-IP $remote_addr;
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
| }
|
|}
|
''')
file_write('/etc/nginx/sites-available/redacted.conf', config_template)
if not dir_exists('/srv/redacted-webapp/shortcuts/admin_media'):
run('ln -s /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media /srv/redacted-webapp/shortcuts/admin_media')
if file_exists('/etc/nginx/sites-enabled/default'):
sudo('rm /etc/nginx/sites-enabled/default')
if not file_exists('/etc/nginx/sites-enabled/redacted.conf'):
sudo('ln -s /etc/nginx/sites-available/redacted.conf /etc/nginx/sites-enabled/redacted.conf')
sudo('service nginx reload')
def configure_postgresql():
print red('''MANUAL STEP: create Postgres user 'redacted' with password '2011Superhero' ''')
print red('''MANUAL STEP: create Postgres database 'redacted_webapp' owned by 'redacted' user''')
def configure_supervisor():
puts(green('Configuring the supervisor process'))
runner_script = text_strip_margin('''
|#!/bin/bash
|
|cd /srv/redacted-webapp/src
|exec gunicorn_django --bind=127.0.0.1:9001
|
''')
file_write('/srv/redacted-webapp/bin/runserver', runner_script, mode='a+rx')
supervisor_conf = text_strip_margin('''
|
|[program:redacted-webapp]
|command=/srv/redacted-webapp/bin/runserver
|user=redacted_webapp
|
''')
file_write('/etc/supervisor/conf.d/redacted.conf', supervisor_conf)
def setup_folders():
puts(green('Setting up on-disk folders'))
dir_ensure('/srv/redacted-webapp', owner='redacted_webapp', group='redacted_webapp')
dir_ensure('/srv/redacted-webapp/src/media', owner='redacted_webapp', group='redacted_webapp')
dir_ensure('/srv/redacted-webapp/shortcuts', owner='redacted_webapp', group='redacted_webapp')
dir_ensure('/srv/redacted-webapp/logs', owner='www-data', group='www-data')
dir_ensure('/srv/redacted-webapp/bin', owner='www-data', group='www-data')
def clone_from_github():
puts(green('Fetching latest code from GitHub'))
with cd('/srv/redacted-webapp/'):
if dir_exists('/srv/redacted-webapp/src'):
with cd('/srv/redacted-webapp/src'):
app_user('git checkout -- .')
app_user('git pull')
else:
app_user('git clone %s src' % GIT_REPO)
with cd('/srv/redacted-webapp/src'):
puts(green('Installing app dependencies'))
run('pip install -r requirements.txt')
puts(green('Injecting database settings'))
db_settings = text_strip_margin('''
|
|DATABASES = {
| 'default': {
| 'ENGINE': 'django.db.backends.postgresql_psycopg2',
| 'NAME': 'redacted_webapp',
| 'USER': '***********',
| 'PASSWORD': '***********',
| }
|}
|
''')
file_append('settings.py', db_settings)
puts(green('Syncing database models'))
run('python manage.py syncdb')
run('python manage.py migrate')
def restart_web_server():
puts(green('Reloading the supervisor process'))
sudo('supervisorctl reload')
def deploy():
puts(green('Starting deployment'))
setup_packages()
setup_users()
setup_folders()
configure_firewall()
configure_nginx()
configure_postgresql()
configure_supervisor()
clone_from_github()
restart_web_server()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment