Fetching contributors…
Cannot retrieve contributors at this time
347 lines (241 sloc) 12.2 KB
Detailed instructions for installing OSQA on WebFaction
Adapted from
Please email turian at gmail with any updates or corrections.
Installing OSQA on Webfaction
Details the steps for setting up OSQA on a Webfaction shared-hosting
account, including email setup, using Apache2, mod_wsgi, psycopg2.
If you want to search-and-replace through this file, you will need to replace:
osqa_server [name of Webfaction application, which will be in ~/webapps/]
osqa_static [name of Webfaction application for static media serving] [domain name for OSQA site]
PORT [port number assigned by WebFaction to your mod_wsgi application]
SITENAME [name you give the OSQA site, which will contain the apache logs]
MYOSQA [name of the OSQA project]
MAILBOX_USERNAME [username you give the email address]
MAILBOX_PASSWORD [password that webfaction gives to this email username]
OSQADATABASE_NAME [username you give the database]
OSQADATABASE_PASSWORD [password that webfaction gives to this database]
~/envs/osqa [directory for the OSQA python environment, grep for 'env']
USERNAME [your WebFaction username]
Some things I'm not sure about:
Here's what I don't know how to do:
* Set up a nginx server for static media.
* Configure sphinx search
* Use PostgreSQL, not MySQL:
Webfaction Control Panel
(Note: if you sign up and pick django it will create the application
for you, website/subdomain and associate the two for you.)
If necessary, add or create any domains or subdomains you may need.
Let's call the domain
Create a new Webfaction application with a "Type:" of "mod_wsgi
2.5/Python2.5", naming it "osqa_server". (These instructions
might also work with mod_wsgi 2.0, if you like.)
Note the port number assigned to the mod_wsgi application. Call
it PORT.
Create a new Webfaction website which will associate the subdomain
with the new osqa_server application. Give it name SITENAME, at least one
domain, and set it to use the osqa_server application for the site's
root location, "/".
You will need to create a database, typically one for each project
you create. Change the type to PostgreSql and modify the name (it
defaults to your webfaction account name) by adding an underscore
and a project-specific identifier such as "_osqa". Before
leaving this section of the control panel, you may wish to change
the password.
Save the database password for later.
[The following I haven't figured out yet]
You will probably want to add a static media server. This is a
Webfaction application. I created one of type "Static only (no
.htaccess)" and with the name of "osqa_static".
To configure email, you need an email mailbox. Add one here. Note
that your mailbox password shouldn't be the same password you use
to SSH to webfaction.
Save the mail password for later.
We will call the username and password MAILBOX_USERNAME and
MAILBOX_PASSWORD, respectively.
You might also consider adding an email address like,
OSQA Software
Log onto webfaction and get the code. I use my fork because I have
a simple pip installation:
In my situation, I keep source code in ~/utils/src, create
virtual environments in ~/envs/osqa, and create Pinax projects in
You will need pip + virtualenv installed:
easy_install --prefix=~/utils/ pip
easy_install --prefix=~/utils/ virtualenv
cd ~/utils/src/
git clone git://
cd osqa
# We need python2.5 to be compatible with WSGI
python2.5 ~/utils/bin/pip install -E ~/envs/osqa -r osqa-requirements.txt
source ~/envs/osqa/bin/activate
# [Optional] If you want a MySQL database
easy_install-2.5 --prefix ~/envs/osqa/ mysql-python
Additional Software
[Note that PostgreSQL installation doesn't work for me.]
You will need to install psycopg2 separately for PostgreSQL.
Psycopg2 requires a little fiddling. Continuing to
work in the ~/utils/src/ directory:
cd ~/utils/src/
tar zxf psycopg2-2.0.13.tar.gz
cd psycopg2-2.0.13
nano setup.cfg
# edit the line reading "#pg_config=" so that it reads:
python2.5 build
python2.5 install
Create a Project
In Pinax, you clone a project from OSQA.
However, OSQA we just copy it.
cd ~/webapps/osqa_server
mkdir projects
cd projects
cp -R ~/utils/src/osqa MYOSQA
export OSQAPROJECT=`pwd`
Make some directories, as described in the OSQA INSTALL file:
[okay I haven't actually done this yet]
# mkdir -p $OSQASITE/upfiles/
# mkdir -p $OSQALOG
# sudo chown -R `whoami`:www-data $OSQASITE
# sudo chown -R `whoami`:www-data $OSQALOG
# chmod -R g+w $OSQASITE/upfiles
# chmod -R g+w $OSQALOG
Edit the settings files:
Pay attention to the following settings:
# The following setting might not be necessary, it's used in Pinax tho
APP_URL = '' #used by email notif system and RSS
[Later on, the install instructions should talk about]
SERVE_MEDIA = False # [Not present, not ready yet]
Create a directory for logs:
mkdir log
Modify mail cron scripts "cron/send_email_alerts" as follows:
[Pinax has cron/, cron/,
cron/, are these also necessary?]
# activate virtual environment
. $WORKON_HOME/bin/activate
python send_email_alerts >> $PROJECT_ROOT/log/cron_mail.log 2>&1
Use command "crontab -e" to add this script to your cron file, to run twice a day::
1 0,12 * * * ~/webapps/osqa_server/projects/MYOSQA/cron/send_email_alerts
[Configure sphinx]
Create the database tables, indices, and so forth:
python syncdb
[Ignore the following static media steps, I haven't tried them]
Build media directory links within the project and create symbolic
links on the static media server.
python build_media -all
mkdir ~/webapps/OSQA_STATIC/MYOSQA
ln -sd ~/webapps/osqa_server/projects/MYOSQA/site_media ~/webapps/OSQA_STATIC/MYOSQA/site_media
Set up the badges:
1. You should run the SQL commands in:
2. Edit paths in the file `cron/multi_award_badges`. (This
file doesn't yet exist in the git repositories, so just
copy `cron/send_email_alerts` and make sure the command
`multi_award_badges` is executed.)
3. Run `cron/multi_award_badges` to make sure it works okay.
4. Use `crontab -e` to call `cron/multi_award_badges` maybe
four times an hour.
4,19,34,49 * * * * ~/webapps/osqa_server/projects/MYOSQA/cron/multi_award_badges
5. Repeat steps 1-4 for `cron/once_award_badges`.
Configure Apache2
Edit ~/webapps/osqa_server/apache2/conf/httpd.conf as follows::
ServerAdmin ""
ServerRoot "/home/USERNAME/webapps/osqa_server/apache2"
LoadModule dir_module modules/
LoadModule env_module modules/
#LoadModule setenvif_module modules/
LoadModule log_config_module modules/
LoadModule mime_module modules/
LoadModule rewrite_module modules/
LoadModule wsgi_module modules/
KeepAlive Off
Listen PORT
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /home/USERNAME/logs/user/access_osqa_server_log combined
ErrorLog /home/USERNAME/logs/user/error_osqa_server_log
ServerLimit 2
#SetEnvIf X-Forwarded-SSL on HTTPS=1
WSGIPythonPath /home/USERNAME/envs/osqa/lib/python2.5/site-packages/
WSGIScriptAlias / /home/USERNAME/webapps/osqa_server/projects/MYOSQA/osqa.wsgi
LoadModule alias_module modules/
WSGIDaemonProcess osqaWSGI user=USERNAME group=USERNAME threads=25 python-path=/home/USERNAME/envs/osqa/lib/python2.5/site-packages
WSGIProcessGroup osqaWSGI
#ErrorLog "logs/MYOSQA_2009_05_06.log"
SetHandler none
#Alias /site_media /home/USERNAME/webapps/static/MYOSQA/site_media
#force all content to be served as static files
#otherwise django will be crunching images through itself wasting time
Alias /content/ /home/USERNAME/webapps/osqa_server/projects/MYOSQA/templates/content/
Alias /forum/admin/media/ /home/turian/envs/osqa/lib/python2.5/site-packages/django/contrib/admin/media/
#AliasMatch /([^/]*\.css) /home/USERNAME/webapps/osqa_server/projects/MYOSQA/templates/content/style/$1
<Directory "/home/USERNAME/webapps/osqa_server/projects/MYOSQA/templates/content">
# Order deny,allow
# Allow from all
If you want virtual hosts of the admin interface under HTTPS, please
look at OSQA's install file.
Create osqa.wsgi and edit it:
cp osqa.wsgi.dist osqa.wsgi
Edit ~/webapps/osqa_server/projects/MYOSQA/deploy/osqa.wsgi as follows::
import os
import sys
# redirect sys.stdout to sys.stderr for bad libraries like geopy that uses
# print statements for optional import exceptions.
sys.stdout = sys.stderr
from os.path import abspath, dirname, join
from site import addsitedir
# add the virtual environment site-packages to the path
from site import addsitedir
sys.path.insert(0, abspath(join(dirname(__file__), "../")))
from django.conf import settings
os.environ["DJANGO_SETTINGS_MODULE"] = "MYOSQA.settings"
#print sys.path
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
And then you're up and running with:
You should log in to the admin interface (,
and go to "Sites > Sites", and change the domain name that is used in
all emails.