Poprawienie wdrażania.
authorMarek Stępniowski <marek@stepniowski.com>
Mon, 19 Oct 2009 12:40:37 +0000 (14:40 +0200)
committerMarek Stępniowski <marek@stepniowski.com>
Mon, 19 Oct 2009 12:40:37 +0000 (14:40 +0200)
fabfile.py
pip-options.txt [deleted file]
requirements.txt
wolnelektury.vhost.template [new file with mode: 0644]
wolnelektury.wsgi.template [new file with mode: 0644]

index ad5760d..1305177 100644 (file)
@@ -1,5 +1,6 @@
 from __future__ import with_statement # needed for python 2.5
 from fabric.api import *
 from __future__ import with_statement # needed for python 2.5
 from fabric.api import *
+from fabric.contrib import files
 
 import os
 
 
 import os
 
@@ -15,7 +16,7 @@ env.use_south = True
 def staging():
     """Use staging server"""
     env.hosts = ['stigma.nowoczesnapolska.org.pl:2222']
 def staging():
     """Use staging server"""
     env.hosts = ['stigma.nowoczesnapolska.org.pl:2222']
-    env.user = 'zuber'
+    env.user = 'platforma'
     env.path = '/var/services/wolnelektury'
     env.python = '/usr/bin/python'
     env.virtualenv = '/usr/bin/virtualenv'
     env.path = '/var/services/wolnelektury'
     env.python = '/usr/bin/python'
     env.virtualenv = '/usr/bin/virtualenv'
@@ -26,9 +27,9 @@ def production():
     env.hosts = ['wolnelektury.pl:22123']
     env.user = 'fundacja'
     env.path = '/opt/lektury/wolnelektury'
     env.hosts = ['wolnelektury.pl:22123']
     env.user = 'fundacja'
     env.path = '/opt/lektury/wolnelektury'
-    env.python = '/opt/cas/basevirtualenv/bin/python'
-    env.virtualenv = '/opt/cas/basevirtualenv/bin/virtualenv'
-    env.pip = '/opt/cas/basevirtualenv/bin/pip'
+    env.python = '/opt/lektury/basevirtualenv/bin/python'
+    env.virtualenv = '/opt/lektury/basevirtualenv/bin/virtualenv'
+    env.pip = '/opt/lektury/basevirtualenv/bin/pip'
 
 
 # =========
 
 
 # =========
@@ -48,6 +49,7 @@ def setup():
 
     run('mkdir -p %(path)s; cd %(path)s; %(virtualenv)s --no-site-packages .;' % env, pty=True)
     run('cd %(path)s; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True)
 
     run('mkdir -p %(path)s; cd %(path)s; %(virtualenv)s --no-site-packages .;' % env, pty=True)
     run('cd %(path)s; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True)
+    run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True)
     deploy()
 
 def deploy():
     deploy()
 
 def deploy():
@@ -62,8 +64,10 @@ def deploy():
     env.release = time.strftime('%Y-%m-%dT%H%M')
 
     upload_tar_from_git()
     env.release = time.strftime('%Y-%m-%dT%H%M')
 
     upload_tar_from_git()
-    upload_pybundle()
+    upload_wsgi_script()
+    upload_vhost_sample()
     install_requirements()
     install_requirements()
+    copy_localsettings()
     symlink_current_release()
     migrate()
     restart_webserver()
     symlink_current_release()
     migrate()
     restart_webserver()
@@ -105,33 +109,31 @@ def upload_tar_from_git():
     run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
     local('rm %(release)s.tar.gz' % env)
 
     run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
     local('rm %(release)s.tar.gz' % env)
 
+def upload_vhost_sample():
+    "Create and upload Apache virtual host configuration sample"
+    print ">>> upload vhost sample"
+    files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost.sample' % env, context=env)
+
+def upload_wsgi_script():
+    "Create and upload a wsgi script sample"
+    print ">>> upload wsgi script sample"
+    files.upload_template('%(project_name)s.wsgi.template' % env, '%(path)s/%(project_name)s.wsgi' % env, context=env)
+    run('chmod ug+x %(path)s/%(project_name)s.wsgi' % env)
+
 def install_requirements():
     "Install the required packages from the requirements file using pip"
     print '>>> install requirements'
     require('release', provided_by=[deploy])
 def install_requirements():
     "Install the required packages from the requirements file using pip"
     print '>>> install requirements'
     require('release', provided_by=[deploy])
-    run('cd %(path)s; %(pip)s install -E . requirements.pybundle' % env)
+    run('cd %(path)s; %(pip)s install -E . -r %(path)s/releases/%(release)s/requirements.txt' % env, pty=True)
 
 
-def upload_pybundle():
-    "Create pybundle with required libraries and upload it"
-    print ">>> upload pybundle"
+def copy_localsettings():
+    "Copy localsettings.py from root directory to release directory (if this file exists)"
+    print ">>> copy localsettings"
     require('release', provided_by=[deploy])
     require('release', provided_by=[deploy])
+    require('path', provided_by=[staging, production])
+
     with settings(warn_only=True):
     with settings(warn_only=True):
-        pip_options = run('cat %(path)s/releases/%(release)s/pip-options.txt' % env)
-        if pip_options.failed:
-            env.pip_options = ''
-        else:
-            env.pip_options = pip_options
-
-    requirements_mtime = os.path.getmtime('requirements.txt')
-    bundle_mtime = 0
-    try:
-        bundle_mtime = os.path.getmtime('requirements.pybundle')
-    except os.error:
-        pass
-
-    if requirements_mtime > bundle_mtime:
-        local('pip bundle requirements.pybundle %(pip_options)s -r requirements.txt' % env)
-        put('requirements.pybundle', '%(path)s' % env)
+        run('cp %(path)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env)
 
 def symlink_current_release():
     "Symlink our current release"
 
 def symlink_current_release():
     "Symlink our current release"
diff --git a/pip-options.txt b/pip-options.txt
deleted file mode 100644 (file)
index 41760c0..0000000
+++ /dev/null
@@ -1 +0,0 @@
--f http://redmine.nowoczesnapolska.org.pl/projects/librarian/files -f http://www.pythonware.com/products/pil/
\ No newline at end of file
index 0e94c2b..d06b0ef 100644 (file)
@@ -1,3 +1,6 @@
+--find-links=http://stigma.nowoczesnapolska.org.pl/pypi/
+--find-links=http://www.pythonware.com/products/pil/
+
 Django==1.1.1
 librarian==1.2.6
 lxml==2.2.2
 Django==1.1.1
 librarian==1.2.6
 lxml==2.2.2
diff --git a/wolnelektury.vhost.template b/wolnelektury.vhost.template
new file mode 100644 (file)
index 0000000..959b164
--- /dev/null
@@ -0,0 +1,38 @@
+<VirtualHost *:80>
+    ServerName %(project_name)s.example.com
+    ServerAdmin admin@example.com
+
+    WSGIDaemonProcess %(project_name)s user=%(user)s group=%(user)s processes=2 threads=15 display-name=%%{GROUP} python-path=%(path)s/lib/python2.5/site-packages
+    WSGIProcessGroup %(project_name)s
+
+    WSGIScriptAlias / %(path)s/%(project_name)s.wsgi
+    <Directory %(path)s>
+        Order allow, deny
+        allow from all
+    </Directory>
+
+    Alias /media %(path)s/media
+    <Directory %(path)s/media>
+        Options Indexes
+        Order allow, deny
+        Allow from all
+    </Directory>
+        
+    Alias /admin-media %(path)s/admin-media
+    <Directory %(path)s/admin-media>
+        Options Indexes
+        Order allow, deny
+        Allow from all
+    </Directory>
+
+    Alias /static %(path)s/releases/current/%(project_name)s/static
+    <Directory %(path)s/releases/current/%(project_name)s/static>
+        Options Indexes
+        Order allow, deny
+        Allow from all
+    </Directory>
+
+    LogLevel warn
+    ErrorLog /var/log/apache2/error.log
+    CustomLog /var/log/apache2/access.log combined
+</VirtualHost>
diff --git a/wolnelektury.wsgi.template b/wolnelektury.wsgi.template
new file mode 100644 (file)
index 0000000..76e3903
--- /dev/null
@@ -0,0 +1,25 @@
+#!%(python)s
+import site
+site.addsitedir('%(path)s/lib/python2.5/site-packages')
+
+import os
+from os.path import abspath, dirname, join
+import sys
+
+# Redirect sys.stdout to sys.stderr for bad libraries like geopy that use
+# print statements for optional import exceptions.
+sys.stdout = sys.stderr
+
+# Add apps and lib directories to PYTHONPATH
+sys.path = [
+       '%(path)s/releases/current/%(project_name)s',
+       '%(path)s/releases/current',
+       '%(path)s/releases/current/apps',
+       '%(path)s/releases/current/lib',
+] + sys.path
+
+# Run Django
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+
+from django.core.handlers.wsgi import WSGIHandler
+application = WSGIHandler()