Noodlecode parody of spaghetti code

Tag: apache

Setup Trac on Windows

Using Bitnami Trac Stack + Subversion (SVN).

    1. Setup environment
      • Download Bitnami Track Stack (Windows installer) & install it
      • Add to PATH
        C:\Program Files\BitNami Trac Stack\python\Scripts
        C:\Program Files\BitNami Trac Stack\apache2\bin
    2. Create new project
      • Cmd
        $ trac-admin <trac env path> initenv
      • path: C:\Users\Username\Projects\Trac\newproject
    3. Configure SVN repo
      • Edit C:\Users\Username\Projects\Trac\newproject\conf\trac.ini
        repository_dir = <svn repo path>
      • path: C:\Users\Username\Projects\Repos\newproject (create using TortoiseSVN)
    4. Enable SVN module in Trac
        • Edit trac.ini

  • Edit logo image
    • Edit trac.ini
      src = site/logo.png
    • Place image in <trac env path>\htdocslogo.png
  • Enable syntax highlighting
    • Install pygments
      # easy_install pygments
    • Edit trac.ini
      pygments_default_style = default
  • Add admin permission
    • Cmd
      $ trac-admin /path/to/projenv permission add admin TRAC_ADMIN
    • /path/to/projectenv = c:\Users\Username\Projects\Trac\newproject
  • Add user
    • Cmd
      # htdigest -c htpasswd "Trac" username
    • -c = Create auth file (exclude when adding user)
      htpasswd = C:\Users\Username\BitNami Trac Stack\apps\trac\users\htpasswd
      “trac” = realm in http-dav-svn.conf below
  • Enable SVN repo hosting on Apache
    • Add in httpd.conf
      # svn repository
      Include conf/extra/http-dav-svn.conf
    • Create http-dav-svn.conf (copied from subversion.conf at
    • Edit:
      SVNParentPath C:\Users\Username\Projects\Repos
      AuthType Basic
    • AuthName & AuthUserFile follow values in c:\Program Files\BitNami Trac Stack\apps\trac\conf\trac.conf
      * bitnami trac by default is using basic auth

Trac can be accessed at http://localhost/trac. Checkout & commit to SVN repo at http://localhost/svn

Apache Caching Proxy Server

This setup is using Apache 2.2 bundled with XAMPP, in Windows 7

Create new config file: /xampp/apache/conf/extra/httpd-cache-proxy.conf

LoadModule proxy_module modules/
LoadModule proxy_http_module modules/
LoadModule proxy_connect_module modules/
LoadModule proxy_ftp_module modules/

Listen 3128
NameVirtualHost *:3128
<VirtualHost *:3128>
    ErrorLog "logs/proxy-error.log"
    CustomLog "logs/proxy-access.log" combined

    <IfModule mod_proxy.c>
      ProxyRequests On
      ProxyVia On
      <Proxy *>
        Order deny,allow
        Deny from all
        Allow from

    <IfModule mod_cache.c>
      LoadModule disk_cache_module modules/
      <IfModule mod_disk_cache.c>
        CacheEnable disk /
        CacheRoot "c:/xampp/apache/proxy/cache"
        CacheDirLevels 3
        CacheDirLength 5
        CacheMaxFileSize 10485760
        CacheMaxExpire 2592000
      ProxyTimeout 60

Include this file to /xampp/apache/conf/httpd.conf

Include conf/extra/httpd-cache-proxy.conf

Make sure to create folder for CacheRoot. Restart Apache using XAMPP control panel or Windows Services (if you installed as service), and set browser’s proxy server to

Trac on Fedora

This is multiple projects installation, a continuation from previous posts.

Install required packages:

yum install trac mod_wsgi

Software: Trac 0.11.7, mod_wsgi 2.3

Trac folder: /var/svn/trac
Python eggs cache dir: /tmp/egg-cache

Create new trac environment

trac-admin /var/svn/trac/testproj initenv
  Project Name > Test Project
  Database connection string > [sqlite:db/trac.db]
  Repository type > [svn]
  Path to repository > /var/svn/repos/testproj

Create wsgi script

vim /var/svn/trac/trac.wsgi
#!/usr/bin/env python
import os
def application(environ, start_request):
  os.environ['TRAC_ENV_PARENT_DIR'] = '/var/svn/trac'
  os.environ['PYTHON_EGG_CACHE'] = '/tmp/egg-cache'
  from trac.web.main import dispatch_request
  return dispatch_request(environ, start_request)

Apache mod_wsgi settings

vim /etc/httpd/conf.d/trac.conf
# comment all settings in /etc/httpd/conf.d/wsgi.conf
LoadModule wsgi_module modules/
WSGIScriptAlias /trac /var/svn/trac/trac.wsgi
<Directory /var/svn/trac>
  WSGIApplicationGroup %{GLOBAL}
  Order deny,allow
  Allow from all
<LocationMatch "/trac/[^/]+/login">
  AuthType Digest
  AuthName "Project Repository"
  AuthUserFile /var/svn/auth
  Require valid-user

Grant administration right to admin user (trac>=0.11)

trac-admin /var/svn/trac/testproj permission add user1 TRAC_ADMIN

Set ownership

chown -R apache.apache /var/svn

Reload apache

service httpd reload

View list of projects – http://localhost/trac

Apache + SVN on Fedora

Create SVN repo, accessible from network, all users can read & checkout, certain users can write / commit

Software: Apache 2.2.11, Subversion 1.6.6, mod_dav_svn 1.6.6

File & folder:

/var/svn/auth – authentication file
/var/svn/repos/ – project repositories

Install mod_dav_svn

yum install mod_dav_svn svn

Create SVN repo (refer previous post)

svnadmin create --fs-type fsfs /var/svn/repos/testproj

Create authentication file

htdigest [-c] <auth file> <realm> <username>
htdigest -c /var/svn/auth "Project Repository" user1

c – create file (exclude this flag when adding users)

Setup Apache + mod_dav_svn

vim /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module modules/
LoadModule authz_svn_module modules/

<Location /svn>
  DAV svn
  SVNParentPath /var/svn/repos
  SVNListParentPath On
  AuthType Digest
  AuthName "Project Repository"
  AuthUserFile /var/svn/auth
    Require valid-user

Change ownership of the whole svn repo dir

chown -R apache.apache /var/svn

Note: Re-assign the ownership everytime you create a new repo

Lastly, reload apache

service httpd reload

View list of projects – http://localhost/svn
View contents of particular (myproj) project – http://localhost/svn/myproj

Deploy Turbogears 2.1 on Fedora

(Update: Using Fedora 16)

Install mod_wsgi for apache

yum install mod_wsgi

Edit apache config: (/etc/httpd/conf/httpd.conf)

ServerName hostname:80

Workaround for mod_wsgi 2.x in Fedora, move this line:

Include conf.d/*.conf

… to below these lines:

User apache
Group apache

Add this to the end of the config file: (/etc/httpd/conf.d/wsgi.conf)

<IfModule mod_wsgi.c>
  WSGISocketPrefix /var/run/wsgi

Using TG2 demo app from the previous post (HelloWorld), create apache config file for this app: (/etc/httpd/conf.d/HelloWorld.conf)

Listen 8080
NameVirtualHost *:8080

<VirtualHost *:8080>

  ServerAdmin [email protected]
  ServerName hostname
  ErrorLog logs/hostname-error_log
  CustomLog logs/hostname-access_log common

  Alias /images/ /var/www/HelloWorld/images/
  Alias /css/ /var/www/HelloWorld/css/
  Alias /javascript/ /var/www/HelloWorld/javascript/

  WSGIDaemonProcess HelloWorld threads=10 processes=3
  WSGIProcessGroup HelloWorld
  WSGIScriptAlias / /var/www/HelloWorld/HelloWorld.wsgi

  <Directory /var/www/HelloWorld>
    Order deny,allow
    Allow from all


Create directory for static contents (do these as root):

mkdir -p /var/www/HelloWorld/python-eggs

Create wsgi script for apache to launch this app: (/var/www/HelloWorld/HelloWorld.wsgi)

import os, sys, site
appname = 'HelloWorld'
prev_sys_path = list(sys.path)
site.addsitedir('/usr/local/pythonenv/%s/lib/python2.6/site-packages' % appname)
new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
sys.path[:0] = new_sys_path
sys.path.append('/usr/local/turbogears/%s' % appname)
from pkg_resources import working_set, Environment
env = Environment('/usr/local/pythonenv/%s' % appname)
distributions, errors = working_set.find_plugins(env)
for dist in distributions:
os.environ['PYTHON_EGG_CACHE'] = '/usr/local/turbogears/%s/python-eggs' % appname
from paste.deploy import loadapp
application = loadapp('config:/usr/local/turbogears/%s/production.ini' % appname)

Move TG2 public folder to static contents folder:

cp -r HelloWorld/helloworld/public/* /var/www/HelloWorld
chown -R apache.apache /var/www/HelloWorld

Move TG2 app to application folder:

mkdir -p /usr/local/turbogears
cp -r HelloWorld/ /usr/local/turbogears/

Create production config file of the app:

cd /usr/local/turbogears/HelloWorld
cp development.ini production.ini

Set debug to false: (/usr/local/turbogears/HelloWorld/production.ini)


Set permission:

chown -R apache.apache /usr/local/turbogears

Finally, restart apache:

service httpd restart

Now, browse to http://localhost:8080

Thunderbird calendar + WebDAV


Users synchronize their calendar in Thunderbird with calendar server (WebDAV) on Fedora

Install Thunderbird & calendar plugin:

yum install thunderbird thunderbird-lightning

Install apache + mod dav:

yum install httpd mod_dav_svn

Calendars will be stored in /home/webmaster/calendar. Make sure to chmod 755 /home/webmaster

Setting up apache:


<IfModule mod_dav.c>
  Alias /calendar /home/webmaster/calendar
  <Directory /home/webmaster/calendar>
    DAV On
    Options +Indexes
    AuthType Basic
    AuthName "Calendar Authentication"
    AuthUserFile /home/webmaster/calendar.htpasswd
    <LimitExcept GET OPTIONS>
      require valid-user
    Order allow,deny
    Allow from all
<Directory /home/webmaster/calendar>
  AuthUserFile /home/webmaster/calendar.htpasswd
  AuthName "Calendar Authentication"
  AuthType basic
  require valid-user

Create user & password:

htpasswd -cb /home/webmaster/calendar.htpasswd username password

Create calendar directory & set permission:

mkdir /home/webmaster/calendar
chown -R apache /home/webmaster/calendar

Test the new configuration:

touch calendar.ics
cadaver http://localhost/calendar
put calendar.ics

Refer /var/log/httpd/error_log if there’s any error. Always check folder permission.

Create new calendar for Thunderbird (calendar name: Personal):

touch Personal.ics
cadaver http://localhost/calendar
put Personal.ics

Launch Thunderbird

  1. Events & Tasks > Calendar (or Ctrl+Shift+C)
  2. File > New > Calendar
  3. ‘On the network’
  4. ‘iCalendar (ICS)’, location: http://localhost/calendar/Personal.ics
  5. Enter username & password (in /home/webmaster/calendar.htpasswd)

Create new event for the new calendar

Copyright © 2017 Noodlecode