diff options
author | Aamir Khan <syst3m.w0rm@gmail.com> | 2012-07-07 17:33:54 -0400 |
---|---|---|
committer | Aamir Khan <syst3m.w0rm@gmail.com> | 2012-07-07 17:33:54 -0400 |
commit | f46b77083bfd2543b39e77df68eaeff06799aef8 (patch) | |
tree | 1adef72197a3456094f6829b3f7b2b2b109a34dc | |
parent | 5f0e0a0ca25770784c47f1036bf972bd29a14789 (diff) | |
download | hyperkitty-f46b77083bfd2543b39e77df68eaeff06799aef8.tar.gz hyperkitty-f46b77083bfd2543b39e77df68eaeff06799aef8.tar.xz hyperkitty-f46b77083bfd2543b39e77df68eaeff06799aef8.zip |
production server deployment using apache wsgi module
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | apache/README | 3 | ||||
-rw-r--r-- | apache/__init__.py | 0 | ||||
-rw-r--r-- | apache/apache_django_wsgi.conf | 23 | ||||
-rwxr-xr-x | apache/django.wsgi | 42 | ||||
-rw-r--r-- | apache/settings_production.py | 195 | ||||
-rw-r--r-- | apache/urls_production.py | 87 | ||||
-rw-r--r-- | robots.txt (renamed from templates/robots.txt) | 0 |
8 files changed, 351 insertions, 0 deletions
@@ -4,3 +4,4 @@ .bzr kittystore .* +logs diff --git a/apache/README b/apache/README new file mode 100644 index 0000000..485e6a2 --- /dev/null +++ b/apache/README @@ -0,0 +1,3 @@ +Add the following line in your httpd.conf (generally present at /etc/apache2/httpd.conf) + +Include "/home/akhan/gsoc/apache/apache_django_wsgi.conf" diff --git a/apache/__init__.py b/apache/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apache/__init__.py diff --git a/apache/apache_django_wsgi.conf b/apache/apache_django_wsgi.conf new file mode 100644 index 0000000..7f1ccaf --- /dev/null +++ b/apache/apache_django_wsgi.conf @@ -0,0 +1,23 @@ +<VirtualHost *:80> + + Alias /robots.txt /home/akhan/gsoc/robots.txt + Alias /favicon.ico /home/akhan/gsoc/favicon.ico + Alias /static /home/akhan/gsoc/static + + ErrorLog /home/akhan/gsoc/logs/error.log + CustomLog /home/akhan/gsoc/logs/access.log combined + + WSGIScriptAlias / /home/akhan/gsoc/apache/django.wsgi + WSGIDaemonProcess akhan user=akhan group=users threads=25 + + <Directory "/home/akhan/gsoc/apache"> + Order deny,allow + Allow from all + </Directory> + + <Directory "/home/akhan/gsoc"> + Order allow,deny + Allow from all + </Directory> + +</VirtualHost> diff --git a/apache/django.wsgi b/apache/django.wsgi new file mode 100755 index 0000000..cc699a4 --- /dev/null +++ b/apache/django.wsgi @@ -0,0 +1,42 @@ +import os +import sys +import site + +STAGING=True + +if STAGING: + # staging virtual environment + vepath = '/home/akhan/.virtualenvs/wackyenv/lib/python2.7/site-packages' +else: + # live virtual environment + vepath = '/home/akhan/.virtualenvs/live-server/lib/python2.7/site-packages' + +prev_sys_path = list(sys.path) + +# add the site-packages of our virtualenv as a site dir +site.addsitedir(vepath) + +# add the app's directory to the PYTHONPATH +sys.path.append('/home/akhan/gsoc') + +# reorder sys.path so new directories from the addsitedir show up first +new_sys_path = [p for p in sys.path if p not in prev_sys_path] + +for item in new_sys_path: + sys.path.remove(item) +sys.path[:0] = new_sys_path + + +#Calculate the path based on the location of the WSGI script. +apache_configuration= os.path.dirname(__file__) +project = os.path.dirname(apache_configuration) +workspace = os.path.dirname(project) +sys.path.append(workspace) + + +os.environ['DJANGO_SETTINGS_MODULE'] = 'gsoc.apache.settings_production' +# make sure this directory is writable by wsgi process +os.environ['PYTHON_EGG_CACHE'] = '/home/akhan/gsoc/.python-egg' + +from django.core.handlers.wsgi import WSGIHandler +application = WSGIHandler() diff --git a/apache/settings_production.py b/apache/settings_production.py new file mode 100644 index 0000000..1090b7a --- /dev/null +++ b/apache/settings_production.py @@ -0,0 +1,195 @@ +import os + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +# Django settings for hyperkitty project. + +DEBUG = False +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + ('Aamir Khan', 'syst3m.w0rm+hk@gmail.com'), +) + +MANAGERS = ADMINS + +MAILMAN_API_URL=r'http://%(username)s:%(password)s@localhost:8001/3.0/' +MAILMAN_USER='mailmanapi' +MAILMAN_PASS='88ffd62d1094a6248415c59d7538793f3df5de2f04d244087952394e689e902a' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'hk', # Or path to database file if using sqlite3. + 'USER': 'root', # Not used with sqlite3. + 'PASSWORD': 'rootroot', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'America/Chicago' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale +USE_L10N = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/home/media/media.lawrence.com/media/" +MEDIA_ROOT = '' + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash. +# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" +MEDIA_URL = '' + +# Absolute path to the directory static files should be collected to. +# Don't put anything in this directory yourself; store your static files +# in apps' "static/" subdirectories and in STATICFILES_DIRS. +# Example: "/home/media/media.lawrence.com/static/" +#STATIC_ROOT = '' +STATIC_ROOT = BASE_DIR + '/static_files/' + +# URL prefix for static files. +# Example: "http://media.lawrence.com/static/" +STATIC_URL = '/static/' + +# URL prefix for admin static files -- CSS, JavaScript and images. +# Make sure to use a trailing slash. +# Examples: "http://foo.com/static/admin/", "/static/admin/". +ADMIN_MEDIA_PREFIX = '/static/admin/' + +# Additional locations of static files +STATICFILES_DIRS = ( + # Put strings here, like "/home/html/static" or "C:/www/django/static". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + BASE_DIR + '/static/', +) + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +# 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'dtc3%x(k#mzpe32dmhtsb6!3p(izk84f7nuw1-+4x8zsxwsa^z' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +) + + +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media", + "django.core.context_processors.static", + "django.core.context_processors.csrf", + "django.contrib.messages.context_processors.messages", + "gsoc.context_processors.app_name", +) + + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', +) + +ROOT_URLCONF = 'gsoc.apache.urls_production' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + BASE_DIR + '/templates', +) + +AUTHENTICATION_BACKENDS = ( + 'social_auth.backends.google.GoogleBackend', + 'social_auth.backends.yahoo.YahooBackend', + 'social_auth.backends.browserid.BrowserIDBackend', + 'social_auth.backends.OpenIDBackend', + 'django.contrib.auth.backends.ModelBackend', +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', +# 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.admin', + # 'django.contrib.admindocs', + 'gsoc', + 'social_auth', + 'djangorestframework', + 'gravatar', +) + + +LOGIN_URL = '/accounts/login/' +LOGIN_REDIRECT_URL = '/' +LOGIN_ERROR_URL = '/accounts/login/' +SOCIAL_AUTH_COMPLETE_URL_NAME = 'socialauth_complete' +SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'socialauth_associate_complete' +SOCIAL_AUTH_DEFAULT_USERNAME = 'new_social_auth_user' +SOCIAL_AUTH_UUID_LENGTH = 16 + +AUTH_PROFILE_MODULE = 'gsoc.UserProfile' + + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +SOCIAL_AUTH_LAST_LOGIN = 'social_auth_last_login_backend' +APP_NAME = 'Fedora Mailman App' +KITTYSTORE_URL = 'postgres://mm3:mm3@localhost/mm3' diff --git a/apache/urls_production.py b/apache/urls_production.py new file mode 100644 index 0000000..3bb4a65 --- /dev/null +++ b/apache/urls_production.py @@ -0,0 +1,87 @@ +from django.conf.urls.defaults import patterns, include, url +from django.views.generic.simple import direct_to_template +from gsoc.api import EmailResource, ThreadResource, SearchResource + +urlpatterns = patterns('', + # Account + url(r'^accounts/login/$', 'views.accounts.user_login', name='user_login'), + url(r'^accounts/logout/$', 'views.accounts.user_logout', name='user_logout'), + url(r'^accounts/profile/$', 'views.accounts.user_profile', name='user_profile'), + url(r'^accounts/register/$', 'views.accounts.user_registration', name='user_registration'), + + + # Index + url(r'^/$', 'views.pages.index', name='index'), + url(r'^$', 'views.pages.index', name='index'), + + # Archives + url(r'^archives/(?P<mlist_fqdn>.*@.*)/(?P<year>\d{4})/(?P<month>\d\d?)/(?P<day>\d\d?)/$', + 'views.list.archives'), + url(r'^archives/(?P<mlist_fqdn>.*@.*)/(?P<year>\d{4})/(?P<month>\d\d?)/$', + 'views.list.archives'), + url(r'^archives/(?P<mlist_fqdn>.*@.*)/$', + 'views.list.archives'), + + # Threads + url(r'^thread/(?P<mlist_fqdn>.*@.*)/(?P<threadid>.+)/$', + 'views.thread.thread_index'), + + + # Lists + url(r'^list/$', 'views.pages.index'), # Can I remove this URL? + url(r'^list/(?P<mlist_fqdn>.*@.*)/$', + 'views.list.list'), + + # Search Tag + url(r'^tag/(?P<mlist_fqdn>.*@.*)\/(?P<tag>.*)\/(?P<page>\d+)/$', + 'views.list.search_tag'), + url(r'^tag/(?P<mlist_fqdn>.*@.*)\/(?P<tag>.*)/$', + 'views.list.search_tag'), + + # Search + # If page number is present in URL + url(r'^search/(?P<mlist_fqdn>.*@.*)\/(?P<target>.*)\/(?P<keyword>.*)\/(?P<page>\d+)/$', + 'views.list.search_keyword'), + # Show the first page as default when no page number is present in URL + url(r'^search/(?P<mlist_fqdn>.*@.*)\/(?P<target>.*)\/(?P<keyword>.*)/$', + 'views.list.search_keyword'), + url(r'^search/(?P<mlist_fqdn>.*@.*)/$', + 'views.list.search'), + + + ### MESSAGE LEVEL VIEWS ### + # Vote a message + url(r'^message/(?P<mlist_fqdn>.*@.*)/(?P<messageid>.+)/$', + 'views.message.index'), + + url(r'^vote/(?P<mlist_fqdn>.*@.*)/$', + 'views.message.vote'), + ### MESSAGE LEVEL VIEW ENDS ### + + + + ### THREAD LEVEL VIEWS ### + # Thread view page + url(r'^thread/(?P<mlist_fqdn>.*@.*)/(?P<threadid>.+)/$', + 'views.thread.thread_index'), + + # Add Tag to a thread + url(r'^addtag/(?P<mlist_fqdn>.*@.*)\/(?P<email_id>.*)/$', + 'views.thread.add_tag'), + ### THREAD LEVEL VIEW ENDS ### + + + # REST API + url(r'^api/$', 'views.api.api'), + url(r'^api/email\/(?P<mlist_fqdn>.*@.*)\/(?P<messageid>.*)/', + EmailResource.as_view()), + url(r'^api/thread\/(?P<mlist_fqdn>.*@.*)\/(?P<threadid>.*)/', + ThreadResource.as_view()), + url(r'^api/search\/(?P<mlist_fqdn>.*@.*)\/(?P<field>.*)\/(?P<keyword>.*)/', + SearchResource.as_view()), + + + # Social Auth + url(r'', include('social_auth.urls')), + +) diff --git a/templates/robots.txt b/robots.txt index 5fe5da1..5fe5da1 100644 --- a/templates/robots.txt +++ b/robots.txt |