Preámbulo
Un amigo me solicitó la bitácora de instalación de Trac en Debian Wheezy, había tenido algunos detalles utilizando Trac y postgreSQL 9, por lo que decidí publicarla para que más personas pudieran aprovecharla, sin embargo, como el Wiki de GNU de Venezuela no está operativo (donde estaba la versión Squeeze) entonces publicaré toda la guía por acá.
Instalación de Trac
Trac funciona en el modo “instancia”, cada instancia requiere de su propia base de datos y de su propia carpeta (instancia), pero comparten un único punto en el servidor web, aunque Trac utiliza por defecto sqlite para la base de datos, utilizaremos postgreSQL.
La instalación se realiza en una distribución Debian-based pero puede ser realizada en cualquier distribución GNU/Linux que posea python-setuptools y el comando easy_install (o pip).
Instalación de dependencias
- Instalar las dependencias en Debian Wheezy (o distribución compatible con aptitude | apt-get):
aptitude install apache2 python2.7-setuptools python-genshi python-pybabel python-psycopg2 python2.7-psycopg2 libapache2-mod-wsgi python-babel babel-1.4.0 postgresql-8.4 subversion git mercurial bzr
Nota: si utiliza postgresql-9.1 con Trac < 0.12.2 tendrá que realizar una correción en el código fuente de Trac para poder crear instancias en schemas de postgreSQL 9.
Nota: Si se instala babel posterior a la instalación de Trac, deberá reinstalar trac y actualizar sus instancias.
- Opcionalmente, podemos actualizar setuptools (requiere conexión a Internet)
easy_install -U setuptools
Instalación de Trac
- Vía apt-get:
apt-get install trac trac-bzr trac-git trac-graphviz trac-mercurial trac-odtexport trac-wikiprint
- ó via easy_install:
easy_install Babel==0.9.5 Genshi==0.6 easy_install Trac
- También podemos descargar el fuente e instalarlo manualmente:
wget -c http://ftp.edgewall.com/pub/trac/Trac-0.12.2.tar.gz tar xvf Trac-0.12.2.tar.gz cd Trac-0.12.2 python ./setup.py install
Nota: si deseamos instalar (o descargar) la versión de pruebas ejecutamos:
- Usando easy_install:
easy_install Trac==dev
- Descargando:
svn co http://svn.edgewall.org/repos/trac/trunk trac cd trac python ./setup.py install
Por ultimo, luego de instalado, verificamos que tenemos la última versión:
trac-admin --version
Luego de instalado Trac, procedemos a configurar una instancia.
Configuración de una instancia
Preparación de la DB de postgreSQL
Agregar las siguientes líneas al archivo pg_hba.conf:
archivo: /etc/postgresql/{version}/main/pg_hba.conf
local tracdb tracuser password host tracdb tracuser 127.0.0.1/32 md5 host tracdb tracuser [subnet]/24 md5 #para poder iniciar sesion en red: host all all [subnet]/24 md5
Donde [subnet] se reemplaza por la subnet de la red local; ejemplo:
local tracdb tracuser password host tracdb tracuser 127.0.0.1/32 md5 host tracdb tracuser 192.168.1.0/24 md5 #para poder iniciar sesion en red: host all all 192.168.1.0/24 md5
Y en postgresql.conf modificamos:
listen_addresses = '*'
Nota: solo necesario si el postgreSQL y el Trac estarán en diferentes equipos.
- Iniciar una consola y ejecutar:
su postgres
- E iniciar una consola de postgreSQL:
>psql
- En la consola de postgreSQL, crear la DB:
- Para crear una DB en > 8.4 ejecutar:
CREATE DATABASE tracdb WITH ENCODING='UTF8' TEMPLATE=template0 LC_COLLATE='C' LC_CTYPE='C' CONNECTION LIMIT=-1;
- para 8.3 o inferior:
CREATE DATABASE tracdb WITH ENCODING='UTF8' TEMPLATE=template0 LC_COLLATE 'C' LC_CTYPE 'C';
- Crear el usuario necesario para gestionar la DB:
create user tracuser password 'clavesecreta';
- Y garantizar los permisos necesarios sobre la DB de trac:
grant all on database tracdb to tracuser;
- Salimos del postgresql:
postgres=# \q
Y reiniciamos el postgreSQL:
/etc/init.d/postgresql restart
Ya estamos listos para crear una instancia de Trac.
(Opcional) Preparación de Trac con postgreSQL 9.1
Nota: cambios iniciales para Trac 0.12 y postgreSQL 9.1
Si se intenta crear una instancia de Trac en postgreSQL 9.1 utilizando un schema personalizado (no “public”), Trac devolverá un error por un detalle en el uso de psycopg (la librería python para conectarse a Trac), dicho error se ve así:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/trac/admin/console.py", line 422, in do_initenv
options=options)
File "/usr/lib/python2.7/dist-packages/trac/env.py", line 213, in __init__
self.create(options)
File "/usr/lib/python2.7/dist-packages/trac/env.py", line 401, in create
DatabaseManager(self).init_db()
File "/usr/lib/python2.7/dist-packages/trac/db/api.py", line 146, in init_db
connector.init_db(**args)
File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 98, in init_db
params)
File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 87, in get_connection
params)
File "/usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py", line 212, in __init__
cnx.cursor().execute('SET search_path TO %s', (self.schema,))
DataError: invalid value for parameter "search_path": "weyu"
DETAIL: schema "weyu" does not exist
Es un error en el archivo /usr/lib/python2.7/dist-packages/trac/db/postgres_backend.py, dicho error ya está corregido en versiones posteriores de Trac y existe un patch para dicho archivo:
- Parche que está en la incidencia #10406 de Trac:
http://trac.edgewall.org/attachment/ticket/10406/10406-search-path-r10830.patch
Si desean hacer los cambios ustedes mismos, las líneas a cambiar son:
Línea 34: 34 from psycopg2 import ProgrammingError as PGSchemaError <- eliminar esta 34 from psycopg2 import DataError, ProgrammingError <- agregar esta Línea 214: 214 except PGSchemaError: <- eliminar esta 214 except (DataError, ProgrammingError): <- agregar esta
Con esta correción podrán crear instancias en postgreSQL 9.1.
Creando un ambiente base (environment Trac)
- Creamos el árbol de proyectos:
mkdir /srv/{repositorios,trac,proyectos} -p
- Nos dirigimos a la carpeta de proyectos:
cd /srv/proyectos
- Inicializamos la primera instancia de trac (se llamará documentacion)
trac-admin /srv/proyectos/documentacion initenv
- Se inicia un script que realliza una serie de preguntas:
Project Name [My Project]> Documentacion GNU/Linux
- Conexión a la DB:
Database connection string [sqlite:db/trac.db]>
- forma del database connection string
''{database}://{usuario}:{contraseña}@{host}:{port}/{database}?schema={schema}''
Ejemplo:
postgres://tracuser:clavesecreta@localhost:5432/tracdb?schema=documentacion
Nota: de usar el schema “public”, simplemente no pasar la opcion schema: ejemplo:
postgres://tracuser:clavesecreta@localhost/tracdb
- Si deseamos usar unix-sockets:
postgres://user:pass@/dbname?host=/path/to/unix/socket/dir&schema=schemaname
Ejemplo:
postgres://tracuser:clavesecreta@/tracdb?host=/var/run/postgresql/.s.PGSQL.5432/dir&schema=documentacion
— Al terminar la configuración de trac, podemos iniciar las pruebas:
- ejecutamos:
tracd –port 8000 /srv/proyectos/documentacion
Y apuntamos nuestro navegador a:
http://host:8000/documentacion
Luego de chequeado, procedemos a configurar nuestra instancia de Trac.
Configuración de Apache y Trac
Debemos crear un ambiente web (www) con WSGI del Trac para apache, para ello desplegamos en la carpeta web (/srv/trac/www’) el sitio web:
trac-admin /srv/proyectos/weyu deploy /srv/trac/www/
Creamos el virtualHost para multiples proyectos de trac, creamos un archivo en:
/etc/apache2/sites-availables/trac.site
<VirtualHost *:80>
# administrador del servidor
ServerAdmin jesuslara@DOMINIO
# nombre del vhost
ServerName proyectos.DOMINIO
# alias del servidor
ServerAlias trac.DOMINIO
DocumentRoot /srv/trac/www/htdocs/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
WSGIScriptAlias / /srv/trac/www/cgi-bin/trac.wsgi
<Directory /srv/trac/www>
WSGIApplicationGroup %{GLOBAL}
SetEnv trac.env_parent_dir /srv/proyectos
Order deny,allow
Allow from all
</Directory>
ErrorLog /srv/trac/www/log/apache-error.log
CustomLog /srv/trac/www/log/access.log combined
</VirtualHost>
- Creamos el directorio para los logs de apache:
mkdir /srv/trac/www/log && chown www-data.www-data /srv/trac/www/ -R
- Modificamos el archivo trac.wsgi /srv/trac/www/cgi-bin/trac.wsgi:
Este queda:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
sys.stdout = sys.stderr
import os
import trac.db.postgres_backend
trac.db.postgres_backend.PostgreSQLConnection.poolable = False
os.environ['TRAC_ENV_PARENT_DIR'] = '/srv/proyectos/'
def application(environ, start_request):
if not 'trac.env_parent_dir' in environ:
environ.setdefault('trac.env_path', '/srv/proyectos/documentacion')
if 'PYTHON_EGG_CACHE' in environ:
os.environ['PYTHON_EGG_CACHE'] = environ['PYTHON_EGG_CACHE']
elif 'trac.env_path' in environ:
os.environ['PYTHON_EGG_CACHE'] = \
os.path.join(environ['trac.env_path'], '.egg-cache')
elif 'trac.env_parent_dir' in environ:
os.environ['PYTHON_EGG_CACHE'] = \
os.path.join(environ['trac.env_parent_dir'], '.egg-cache')
from trac.web.main import dispatch_request
return dispatch_request(environ, start_request)
Apache debe acceder al directorio de proyectos:
chown www-data.www-data /srv/proyectos -R
- Y al directorio trac/htdocs:
chown www-data.www-data /srv/trac -R
- Reiniciamos apache:
/etc/init.d/apache2 restart
- Y ya podemos acceder a nuestra instancia vía la ruta del virtualhost:
Quedando el directorio así:
.
|-- proyectos
| `-- documentacion
| |-- attachments
| |-- conf
| |-- htdocs
| |-- log
| |-- plugins
| `-- templates
|-- repositorio
| `-- documentacion
`-- trac
`-- www
|-- cgi-bin
|-- htdocs
| |-- common
| | |-- css
| | |-- guide
| | `-- js
| `-- site
`-- log
(opcional) Configuración de múltiples ambientes (instancias)
Aunque se puede crear una base de datos para cada instancia, utilizaremos una única base de datos postgreSQL y schemas por cada instancia de Trac.
- Inicializamos una nueva instancia:
trac-admin /srv/proyectos/lyx-book/ initenv
- Configuramos la instancia:
Project Name [My Project]> Lyx Book Database connection string [sqlite:db/trac.db]> postgres://tracuser:clavesecreta@localhost:5432/tracdb?schema=lyx
- Propietario www-data a la carpeta del proyecto:
chown www-data.www-data /srv/proyectos -R
- reiniciamos apache:
/etc/init.d/apache2 restart
- Y ya podemos ver la nueva instancia en la lista de instancias:
- al acceder al vhost, veremos la lista de instancias:
– Lista de instancias:
—————————————-
Available Projects
—————————————-
Autenticación inicial del Trac
La autenticación inicial se realizará vía htpasswd (en próximo artículo, agregaré la autenticación openldap).
- Agregamos un usuario de sistema, para administrar el trac
useradd administrador
- Creamos el archivo inicial para autenticar los usuarios con Trac
htpasswd -c /srv/trac/www/.htpasswd administrador
- nota: inicialmente autenticamos con el usuario administrador, con la contraseña que le asignemos.
- Y agregamos la entrada de autenticación al vhost del trac:
<Location />
AuthType Basic
AuthName "Trac"
AuthUserFile /srv/trac/www/.htpasswd
Require valid-user
</Location>
- Luego, agregamos la info de autenticación via HTPASSWD al archivo de configuración de la instancia:
- nota: el archivo de configuración de la instancia está en /srv/proyectos/{instancia}/conf/trac.ini, ejemplo:
archivo: /srv/proyectos/documentacion/conf/trac.ini
- Agregamos la autenticación vía htpasswd:
[account-manager] account_changes_notify_addresses = password_file = /srv/trac/www/.htpasswd password_format = htpasswd password_store = HtPasswdStore
- Le damos privilegios de TRAC_ADMIN al usuario administrador:
trac-admin /srv/proyectos/documentacion
- Aparece la consola de la instancia de Trac:
- Welcome to trac-admin 0.12.2 Interactive Trac administration console. Copyright (C) 2003-2011 Edgewall Software Type: '?' or 'help' for help on commands. Trac [/srv/proyectos/documentacion]>
- Y en la consola ejecutamos el siguiente comando:
permission add administrador TRAC_ADMIN
- Salimos de la consola:
>exit
- Ejecutamos el upgrade de la instancia:
trac-admin /srv/proyectos/weyu upgrade
- Y reiniciamos apache:
/etc/init.d/apache2 restart
Y ya podemos entrar al trac como el usuario administrador:
http://host/documentacion/admin/
Ahora podemos personalizar ciertas opciones como incorporar plugins o agregar temas.
Incorporar un Tema a Trac
Para incorporar un tema a Trac, se debe primeramente incorporar el http://trac-hacks.org/wiki/ThemeEnginePlugin Theme Engine Plugin
Instalación del Theme Engine Plugin
- Descargamos el gestor de temas:
svn co http://trac-hacks.org/svn/themeengineplugin/0.11/ theme-engine
- compilamos e instalamos:
cd theme-engine python setup.py install
- Habilitamos el theme engine plugin en el archivo conf/trac.ini
[components] themeengine.* = enabled
- Y reiniciamos el apache:
/etc/init.d/apache2 restart
Ya podemos instalar un nuevo tema.
Instalar un Tema
- Descargamos el tema que necesitamos:
svn co http://trac-hacks.org/svn/pydotorgtheme/0.11/ pydotorgtheme
- Habilitamos el tema como plugin en el archivo conf/trac.ini
- Se agregan a la sección ![components] del archivo trac.ini:
pydotorgtheme.* = enabled
- Habilitamos el tema en la sección ![theme] del archivo conf/trac.ini
[theme] theme = PyDotOrg
- Reiniciamos apache:
/etc/init.d/apache2 restart
Y ya contamos con un nuevo tema instalado.
Instalando un plugin de Trac
Para instalar un plugin de trac por la vía de la descarga, primero, ubicamos y descargamos la fuente;
- Descargamos, el plugin de Mercurial
svn co http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin
- Nos movemos a la carpeta:
cd mercurial-plugin
- Ejecutamos la instalación del plugin:
python setup.py install
- Y luego incorporamos dicho plugin al ‘conf/trac.ini’
[components] tracext.hg.backend.*
- Nota: podremos saber el nombre del componente a agregar en el archivo “setup.py > packages”.
Algunos plugins solicitarán actualizar (upgrade) de la instancia, para ello:
- Ejecutamos en una cónsola:
trac-admin /srv/proyectos/documentacion upgrade
- Y reiniciamos apache:
/etc/init.d/apache2 restart
Configuración de repositorios
La configuración de repositorios (directorios donde se almacena código fuente versionado gracias a un VCS) depende de cada software de VCS utilizado, por defecto Trac gestiona Subversion, pero puede habilitarse para otros VCS.
Subversion
- Instalamos subversion
aptitude install subversion libapache2-svn
- Creamos la carpeta para el proyecto que deseamos versionar:
mkdir /srv/repositorio/proyecto-svn
- Creamos el ambiente del proyecto SVN:
svnadmin create /srv/repositorio/proyecto-svn
- Y le damos privilegio a apache para leerlo:
chown www-data.www-data /srv/repositorio -R
- Entramos en el environment del trac:
trac-admin /srv/proyectos/documentacion
- Agregamos el repositorio:
repository add proyecto-svn /srv/repositorio/proyecto-svn svn
- nota: la sintaxis es: repository add {nombre} {ruta} {tipo}
- Y ejecutamos la sincronización:
Trac> repository resync proyecto-svn Resyncing repository history for proyecto-svn ... 0 revisions cached. Done.
- Podemos ejecutar la resincronización de todos los repositorios existentes ejecutando:
repository resync '*'
Mercurial (Hg)
- Instalamos el soporte a mercurial en nuestra distribución:
aptitude install mercurial
- Descargamos el plugin
svn co http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin
- E instalamos el plugin de mercurial:
cd mercurial-plugin python setup.py install
- Configuramos el plugin de mercurial (hg) en el trac.ini
[components] tracext.hg.backend.*
- agregamos la configuración del plugin mercurial
[hg] # -- Show revision number in addition to the changeset hash (defaults to yes) show_rev = yes # -- Changeset hash format node_format = short
- Reiniciamos el environment de trac y apache:
trac-admin /srv/proyectos/documentacion upgrade && /etc/init.d/apache2 restart
Y ya tenemos configurado el soporte para Mercurial en Trac, ahora procedemos a agregar un repositorio:
- Para agregar un repositorio Hg (Mercurial) creamos:
mkdir /srv/repositorio/hg/gnu
- Nos movemos al directorio:
cd /srv/repositorio/hg/gnu/
- Iniciamos Mercurial en la carpeta
hg init
- Y actualizamos:
hg update 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
- Entramos en el environment del trac:
trac-admin /srv/proyectos/documentacion
- Agregamos el repositorio:
>repository add gnu-hg /srv/repositorio/hg/gnu hg
- Y ejecutamos la re-sincronización:
Trac [/srv/proyectos/documentacion]> repository resync gnu-hg Resyncing repository history for gnu... 0 revisions cached. Done.
GIT
Configurando Git
- Instalamos lo necesario para git:
aptitude install git git-core git-daemon-run
- instalamos el plugin de GIT
easy_install http://github.com/hvr/trac-git-plugin/tarball/master
- Reiniciamos apache:
/etc/init.d/apache2 restart
- Agregamos la sección GIT al trac.ini
[git] cached_repository = false persistent_cache = false shortrev_len = 7 wiki_shortrev_len = 7 git_bin = /usr/bin/git trac_user_rlookup = true use_committer_id = false use_committer_time = false
- Y habilitamos el plugin (trac.ini)
[components] tracext.git.* = enabled
- Tambien agregamos la posibilidad de tener GIT post-commit hooks:
[components] tracopt.ticket.commit_updater.committicketreferencemacro = enabled tracopt.ticket.commit_updater.committicketupdater = enabled
- Y cambiamos esto (en el trac.ini):
repository_sync_per_request = (default)
— por esto:
repository_sync_per_request =
Ya configurado GIT, creamos un repositorio.
Creación de un repositorio GIT
- Creamos la carpeta:
mkdir /srv/repositorios/lyx-book
- La convertimos en un repositorio git vacio:
git --bare init
- Nota: el directorio debe ser de tipo “bare”, ya que Trac debe tener acceso a los archivos de control (HEAD y config) de GIT y no solo el directorio .git/
- Incorporamos los archivos necesarios, ejecutamos su adhesión al GIT:
git add .
- Ejecutamos el primer commit del repositorio:
git commit -a -m 'first commit'
- Verificamos su estado:
git status # On branch master nothing to commit (working directory clean)
- Cargamos la consola de la instancia:
trac-admin /srv/proyectos/documentacion Welcome to trac-admin 0.12.2 Interactive Trac administration console. Copyright (C) 2003-2011 Edgewall Software Type: '?' or 'help' for help on commands. Trac [/srv/proyectos/documentacion]>
- Incorporamos el repositorio:
repository add lyx-book /srv/repositorio/lyx-book git
- Ejecutamos la sincronización:
repository resync lyx-book
Conclusiones
Trac es una excelente herramienta de SCM (Source Code Management) ya que combina Wiki, Gestión de incidencias (ticket, bug-tracking), gestión de código VCS y se le pueden incorporar plugins de terceros que incluyen desde un foro hasta un blog.
Buenos tardes, Jesús ante todo un cordial saludo, de más este decirte que te felicito por tú página, siempre para mi es una referencia. Hoy te escribo para comentarte sobre un error que ocurre con frecuencia en el trac cuando utiliza git, para mi entender es un error se sincronización, al final lo he solventado empleando un git gc y un repository resync * en el trac. El error básicamente es al mostrar el código empleando la página del trac, apenas efectúas una modificación y actualizas el código, al querer visualizarlo por el trac, genera un error. ¿Has podido observar algo similar?. Saludos
Gracias!
Si, he visto ese detalle, el problema es que los repositorios GIT deben ser bare (ser base y no ser una “copia” -*clone*- de otro git), el código para gestionar GIT en Trac aún no está muy eficiente en este aspecto.
Lo otro es que recomiendo “volver” a montar el módulo de GIT-plugin del trac y no confiar en el que trae Debian (da muchos errores), yo actualizo los módulos con setup-tools y luego instalo manualmente el plugin de git y resolví el detalle de la visualización …
Saludos!
la creacion en postgres sql especifico a 8.3 esta mal, no puedes crear justo en esta version una DB con codificacion especifica, es un bug de esa version en especial.. si tienes el manejador con es_VE y creas con UTF8 no te dejara hacerlo, esa parte esta mal y hay que especificar que no se debe usar esa version, en debian lenny hay que usar la version de backports (en debian archive) y en etch tengo 8.4 en mis repos..