# -*- coding: utf-8; -*- """ Fabric script for the 'host' server Please see the accompanying README for full instructions. """ from __future__ import unicode_literals, absolute_import import os from fabric.api import * from fabric.contrib.files import append, exists from rattail_fabric import make_deploy, mkdir, make_system_user, cdvirtualenv, workon from rattail_fabric import apt, pod, postgresql, python # Set the 'live' role to the canonical hostname for this server. #env.roledefs = {'live': ['host.example.com']} deploy = make_deploy(__file__) @task def bootstrap_all(): """ Bootstrap all aspects of the server. """ bootstrap_system() bootstrap_rattail() @task def bootstrap_system(): """ Bootstrap the base system. """ apt.dist_upgrade() # postgresql apt.install('postgresql') # python apt.install('libpython-dev', 'libpq-dev') python.install_pip() python.install_virtualenvwrapper() deploy('python/premkvirtualenv', '/srv/envs/premkvirtualenv') sudo('mkvirtualenv BASELINE') # apache apt.install('apache2', 'libapache2-mod-wsgi') deploy('apache/wsgi.conf', '/etc/apache2/conf-available/wsgi.conf') sudo('a2enconf wsgi') sudo('a2enmod ssl') sudo('service apache2 restart') # misc apt.install('git', 'emacs-nox', 'emacs-goodies-el') @task def bootstrap_rattail(): """ Bootstrap the Rattail software. """ from rattail_fabric.rattail import bootstrap_rattail # rattail user and core files bootstrap_rattail() # virtual environment python.mkvirtualenv('rattail') with cdvirtualenv('rattail'): mkdir('src') with workon('rattail'): python.pip('psycopg2') # rattail source with cdvirtualenv('rattail', 'src'): if not exists('rattail'): sudo('git clone https://rattailproject.org/git/rattail.git') with cdvirtualenv('rattail', 'src/rattail'): sudo('git pull') sudo('pip install --editable .') with workon('rattail'): sudo('pip install --upgrade rattail[db,auth]') # tailbone source with cdvirtualenv('rattail', 'src'): if not exists('tailbone'): sudo('git clone https://rattailproject.org/git/tailbone.git') with cdvirtualenv('rattail', 'src/tailbone'): sudo('git pull') sudo('pip install --upgrade --editable .') # # rattail-demo source # with cdvirtualenv('rattail', 'src'): # if not exists('rattail-demo'): # sudo('git clone https://rattailproject.org/git/rattail-demo.git') # with cdvirtualenv('rattail', 'src/rattail-demo'): # sudo('git pull') # sudo('pip install --upgrade --editable .') # config with cdvirtualenv('rattail', 'app'): deploy('rattail/rattail.conf.template', 'rattail.conf') # database postgresql.create_user('rattail', password=env.password_postgresql_rattail) postgresql.create_db('rattail', owner='rattail') with cd('/srv/envs/rattail'): sudo('bin/alembic --config=app/rattail.conf upgrade heads', user='rattail') sudo('bin/rattail --config app/rattail.conf initdb --with-admin', user='rattail') # POD mkdir('/srv/pod') if getattr(env, 'rattail_download_pod', False): pod.install_pod() else: puts("Skipping POD download, per 'fabenv' settings.") # website with cdvirtualenv('rattail', 'app'): mkdir('sessions', owner='rattail:rattail') deploy('rattail/web.conf', 'web.conf') deploy('rattail/rattail.wsgi', 'rattail.wsgi') deploy('rattail/rattail.localhost.conf', '/etc/apache2/sites-available/000-default.conf') sudo('service apache2 restart') ############################## # fabenv ############################## try: import fabenv except ImportError as error: warn("Couldn't import fabenv: {}".format(error)) # Set some default env attrs in case fabenv isn't prepped. if not hasattr(env, 'password_postgresql_rattail'): setattr(env, 'password_postgresql_rattail', 'password')