diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 0000000..516f849 --- /dev/null +++ b/fabfile.py @@ -0,0 +1,96 @@ +# Define the Fabric script +# globals +config.project_name = 'rockviewer' +# environments +def local(): + "Use the local virtual server" + config.hosts = ['172.16.142.130'] + config.path = '~/www/rockviewer' + config.user = 'shane' + config.virtualhost_path = "/" +# tasks +def test(): + "Run the test suite and bail out if it fails" + local("cd $(project_name); python manage.py test", fail="abort") +def setup(): + """ + Setup a fresh virtualenv as well as a few useful directories, then run + a full deployment + """ + require('hosts', provided_by=[local]) + require('path') + sudo('aptitude install -y python-setuptools') + sudo('easy_install pip') + sudo('pip install virtualenv') + sudo('aptitude install -y apache2') + sudo('aptitude install -y libapache2-mod-wsgi') + # we want rid of the defult apache config + sudo('cd /etc/apache2/sites-available/; a2dissite default;') + run('mkdir -p $(path); cd $(path); virtualenv .;') + run('cd $(path); mkdir releases; mkdir shared; mkdir packages;', fail='ignore') + deploy() +def deploy(): + """ + Deploy the latest version of the site to the servers, install any + required third party modules, install the virtual host and + then restart the webserver + """ + require('hosts', provided_by=[local]) + require('path') + import time + config.release = time.strftime('%Y%m%d%H%M%S') + upload_tar_from_git() + install_requirements() + install_site() + symlink_current_release() + migrate() + restart_webserver() +def deploy_version(version): + "Specify a specific version to be made live" + require('hosts', provided_by=[local]) + require('path') + config.version = version + run('cd $(path); rm releases/previous; mv releases/current releases/previous;') + run('cd $(path); ln -s $(version) releases/current') + restart_webserver() +def rollback(): + """ + Limited rollback capability. Simple loads the previously current + version of the code. Rolling back again will swap between the two. + """ + require('hosts', provided_by=[local]) + require('path') + run('cd $(path); mv releases/current releases/_previous;') + run('cd $(path); mv releases/previous releases/current;') + run('cd $(path); mv releases/_previous releases/previous;') + restart_webserver() +# Helpers. These are called by other functions rather than directly +def upload_tar_from_git(): + require('release', provided_by=[deploy, setup]) + "Create an archive from the current Git master branch and upload it" + local('git archive --format=tar master | gzip > $(release).tar.gz') + run('mkdir $(path)/releases/$(release)') + put('$(release).tar.gz', '$(path)/packages/') + run('cd $(path)/releases/$(release) && tar zxf ../../packages/$(release).tar.gz') + local('rm $(release).tar.gz') +def install_site(): + "Add the virtualhost file to apache" + require('release', provided_by=[deploy, setup]) + sudo('cd $(path)/releases/$(release); cp $(project_name)$(virtualhost_path)$(project_name) /etc/apache2/sites-available/') + sudo('cd /etc/apache2/sites-available/; a2ensite $(project_name)') +def install_requirements(): + "Install the required packages from the requirements file using pip" + require('release', provided_by=[deploy, setup]) + run('cd $(path); pip install -E . -r ./releases/$(release)/requirements.txt') +def symlink_current_release(): + "Symlink our current release" + require('release', provided_by=[deploy, setup]) + run('cd $(path); rm releases/previous; mv releases/current releases/previous;', fail='ignore') + run('cd $(path); ln -s $(release) releases/current') +def migrate(): + "Update the database" + require('project_name') + run('cd $(path)/releases/current/$(project_name); ../../../bin/python manage.py syncdb --noinput') +def restart_webserver(): + "Restart the web server" + sudo('/etc/init.d/apache2 restart') \ No newline at end of file diff --git a/docs/pip-requirements.txt b/requirements.txt similarity index 100% rename from docs/pip-requirements.txt rename to requirements.txt diff --git a/rockviewer.wsgi b/rockviewer.wsgi new file mode 100644 index 0000000..8fa48ea --- /dev/null +++ b/rockviewer.wsgi @@ -0,0 +1,7 @@ +import os +import sys +# put the Django project on sys.path +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))) +os.environ["DJANGO_SETTINGS_MODULE"] = "three_d_viewer.settings" +from django.core.handlers.wsgi import WSGIHandler +application = WSGIHandler() \ No newline at end of file diff --git a/three_d_viewer/three_d_viewer b/three_d_viewer/three_d_viewer new file mode 100644 index 0000000..c61e290 --- /dev/null +++ b/three_d_viewer/three_d_viewer @@ -0,0 +1,12 @@ + + WSGIDaemonProcess rockviewer-production user=rockviewer group=rockviewer threads=10 python-path=~/www/rockviewer/lib/python2.6/site-packages + WSGIProcessGroup rockviewer-production + WSGIScriptAlias / ~/rockviewer/releases/current/rockviewer/rockviewer.wsgi + + Order deny,allow + Allow from all + + ErrorLog /var/log/apache2/error.log + LogLevel warn + CustomLog /var/log/apache2/access.log combined + \ No newline at end of file