initialize trac

exemple for trac.yourwebsite.com :

 apt-get install trac
 mkdir /var/www/trac.yourwebsite.com
 chmod 2750 /var/www/trac.yourwebsite.com
 trac-admin /var/www/trac.yourwebsite.com initenv 
 chown -R www-data: /var/www/trac.yourwebsite.com
 #Edit trac.ini if needed
 cd /var/www/trac.yourwebsite.com/conf/

apache config

 apt-get install libapache2-mod-python

In /etc/apache2/sites-available/trac.yourwebsite.com :

<VirtualHost *:80>
    ServerAdmin system@yourwebsite.com
    ServerName trac.yourwebsite.com
    ServerAlias trac.yourwebsite.vm.gnt

    DocumentRoot /var/www/trac.yourwebsite.com

    <Location />
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend
        PythonOption TracEnv /var/www/trac.byourwebsite.com
        PythonOption TracUriRoot /
        PythonPath "sys.path + ['/var/www/trac.yourwebsite.com']"
    </Location>

    <Location "/login">
        AuthType Basic
        AuthName "Trac login"
        AuthUserFile /etc/apache2/trac.passwd
        Require valid-user
    </Location>

    ErrorLog  /var/log/apache2/error.trac.yourwebsite.log
    CustomLog /var/log/apache2/access.trac.yourwebsite.log combined

</VirtualHost>

And to finish :

a2ensite trac.binbang.org
/etc/init.d/apache2 reload
htpasswd -c /etc/apache2/trac.passwd admin
trac-admin /var/www/trac.yourwebsite.com/ permission add  admin TRAC_ADMIN

tips

when behind a reverse proxy

To be sure Trac has the good website domain name and not redirect you to private one when you access using public one, add :

ProxyPreserveHost On

import milestones

apt-get install sqlite3
sqlite3 /var/www/trac/db/trac.db
.dump milestone

import milestones from the following dump

BEGIN TRANSACTION;
CREATE TABLE milestone (
    name text PRIMARY KEY,
    due integer,
    completed integer,
    description text
);
INSERT INTO "milestone" VALUES('8 jan 2010',1262908800,0,'');
INSERT INTO "milestone" VALUES('15 jan 2010',1263513600,0,'');
INSERT INTO "milestone" VALUES('22 jan 2010',1264118400,0,'');
INSERT INTO "milestone" VALUES('29 jan 2010',1264723200,0,'');
INSERT INTO "milestone" VALUES('5 feb 2010',1265328000,0,'');
INSERT INTO "milestone" VALUES('12 feb 2010',1265932800,0,'');
INSERT INTO "milestone" VALUES('19 feb 2010',1266537600,0,'');
INSERT INTO "milestone" VALUES('5 mar 2010',1267747200,0,'');
INSERT INTO "milestone" VALUES('12 mar 2010',1268352000,0,'');
INSERT INTO "milestone" VALUES('19 mar 2010',1268956800,0,'');
INSERT INTO "milestone" VALUES('26 mar 2010',1269561600,0,'');
INSERT INTO "milestone" VALUES('2 apr 2010',1270166400,0,'');
INSERT INTO "milestone" VALUES('9 apr 2010',1270771200,0,'');
INSERT INTO "milestone" VALUES('16 apr 2010',1271376000,0,'');
INSERT INTO "milestone" VALUES('23 apr 2010',1271980800,0,'');
INSERT INTO "milestone" VALUES('30 Apr 2010',1272585600,0,'');
INSERT INTO "milestone" VALUES(' 7 May 2010',1273190400,0,'');
INSERT INTO "milestone" VALUES('14 May 2010',1273795200,0,'');
INSERT INTO "milestone" VALUES('21 May 2010',1274400000,0,'');
INSERT INTO "milestone" VALUES('28 May 2010',1275004800,0,'');
INSERT INTO "milestone" VALUES(' 4 Jun 2010',1275609600,0,'');
INSERT INTO "milestone" VALUES('11 Jun 2010',1276214400,0,'');
INSERT INTO "milestone" VALUES('18 Jun 2010',1276819200,0,'');
INSERT INTO "milestone" VALUES('25 Jun 2010',1277424000,0,'');
INSERT INTO "milestone" VALUES(' 2 Jul 2010',1278028800,0,'');
INSERT INTO "milestone" VALUES(' 9 Jul 2010',1278633600,0,'');
INSERT INTO "milestone" VALUES('16 Jul 2010',1279238400,0,'');
INSERT INTO "milestone" VALUES('23 Jul 2010',1279843200,0,'');
INSERT INTO "milestone" VALUES('30 Jul 2010',1280448000,0,'');
INSERT INTO "milestone" VALUES(' 6 Aug 2010',1281052800,0,'');
INSERT INTO "milestone" VALUES('13 Aug 2010',1281657600,0,'');
INSERT INTO "milestone" VALUES('20 Aug 2010',1282262400,0,'');
INSERT INTO "milestone" VALUES('27 Aug 2010',1282867200,0,'');
INSERT INTO "milestone" VALUES(' 3 Sep 2010',1283472000,0,'');
INSERT INTO "milestone" VALUES('10 Sep 2010',1284076800,0,'');
INSERT INTO "milestone" VALUES('17 Sep 2010',1284681600,0,'');
INSERT INTO "milestone" VALUES('24 Sep 2010',1285286400,0,'');
INSERT INTO "milestone" VALUES(' 1 Oct 2010',1285891200,0,'');
INSERT INTO "milestone" VALUES(' 8 Oct 2010',1286496000,0,'');
INSERT INTO "milestone" VALUES('15 Oct 2010',1287100800,0,'');
INSERT INTO "milestone" VALUES('22 Oct 2010',1287705600,0,'');
INSERT INTO "milestone" VALUES('29 Oct 2010',1288310400,0,'');
INSERT INTO "milestone" VALUES(' 5 Nov 2010',1288915200,0,'');
INSERT INTO "milestone" VALUES('12 Nov 2010',1289520000,0,'');
INSERT INTO "milestone" VALUES('19 Nov 2010',1290124800,0,'');
INSERT INTO "milestone" VALUES('26 Nov 2010',1290729600,0,'');
INSERT INTO "milestone" VALUES(' 3 Dec 2010',1291334400,0,'');
INSERT INTO "milestone" VALUES('10 Dec 2010',1291939200,0,'');
INSERT INTO "milestone" VALUES('17 Dec 2010',1292544000,0,'');
INSERT INTO "milestone" VALUES('24 Dec 2010',1293148800,0,'');
INSERT INTO "milestone" VALUES('31 Dec 2010',1293753600,0,'');
INSERT INTO "milestone" VALUES(' 7 Jan 2011',1294358400,0,'');
INSERT INTO "milestone" VALUES('14 Jan 2011',1294963200,0,'');
INSERT INTO "milestone" VALUES('21 Jan 2011',1295568000,0,'');
INSERT INTO "milestone" VALUES('28 Jan 2011',1296172800,0,'');
INSERT INTO "milestone" VALUES(' 4 Feb 2011',1296777600,0,'');
INSERT INTO "milestone" VALUES('11 Feb 2011',1297382400,0,'');
INSERT INTO "milestone" VALUES('18 Feb 2011',1297987200,0,'');
INSERT INTO "milestone" VALUES('25 Feb 2011',1298592000,0,'');
INSERT INTO "milestone" VALUES(' 4 Mar 2011',1299196800,0,'');
INSERT INTO "milestone" VALUES('11 Mar 2011',1299801600,0,'');
INSERT INTO "milestone" VALUES('18 Mar 2011',1300406400,0,'');
INSERT INTO "milestone" VALUES('25 Mar 2011',1301011200,0,'');
INSERT INTO "milestone" VALUES(' 1 Apr 2011',1301616000,0,'');
COMMIT;

Save this in /tmp/milestones.sql and load with

sqlite3 /var/www/trac/db/trac.db
.read /tmp/milestones.sql

There will be an error message with the create table because it already exists but this does not prevent the insert statements from being executed. The above lines can be generated using the following python script:

from time import strftime, gmtime
for i in range(1,50):
    now = 1271980800 + i * 604800
    print "INSERT INTO \"milestone\" VALUES('%s',%d,0,'');" % ( strftime('%e %b %Y', gmtime(now)), now )

directive.