Esta guía explica cómo crear un nuevo entorno de proyecto en un servidor con Trac instalado y funcionando.

Trac es una Wiki mejorada y sistema de seguimiento para proyectos de desarrollo de software. Utiliza un enfoque minimalista a las soluciones de gestión de proyectos basadas en Web, entrometiéndose lo menos posible y manteniéndose al margen del proceso de desarrollo de proyectos establecido por un equipo.

Trac provee una interfase a Subversion y ​Git (u otros sistemas de control de versiones), una Wiki integrada y facilidades de reporte. A su vez, permite utilizar lenguaje de markup Wiki en descripciones y mensajes de commit, crear enlaces y referencias entre bugs, tareas, etc. Incluye una línea de tiempo que muestra los eventos en orden y un roadmap.

Trac está escrito en lenguaje Python y necesita una base de datos ​SQLite, ​PostgreSQL, o ​MySQL para su funcionamiento. Además, utiliza el sistema de plantillas ​Genshi para renderizado de HTML.

Esta guía no incluye la instalación del Software Trac en un servidor, sino la creación de un nuevo entorno de proyecto. Para conocer el proceso de instalación de Trac, remitirse a la guía de instalación oficial: Trac Installation Guide for 1.2.

Usuario y base de datos PostgreSQL

En caso de no contar con una base de datos y usuario en un servidor de bases de datos PostgreSQL, será necesario crear ambos tal como explica el siguiente tutorial Crear una base de datos y usuario en un servidor PostgreSQL.

Se asume que se dispone de una base de datos "proyecto" totalmente vacía, y un usuario "user_proyecto" con privilegios de uso sobre la misma.

Creación de un nuevo entorno de proyecto en Trac

Crear un nuevo entrono con el utilitario trac-admin utilizando el comando "initenv". Es necesario pasar como parámetro la ruta en el sistema de archivos donde se alojará el nuevo entorno:

root@linux:/var/trac# trac-admin /var/trac/proyecto initenv
Creando un nuevo entorno Trac en /var/trac/proyecto

Trac will first ask a few questions about your environment
in order to initialize and prepare the project database.

Please enter the name of your project.
This name will be used in page titles and descriptions.

Nombre de Proyecto [My Project]> Nuevo Proyecto

Please specify the connection string for the database to use.
By default, a local SQLite database is created in the environment
directory. It is also possible to use an existing MySQL or
PostgreSQL database (check the Trac documentation for the exact
connection string syntax).

Cadena de conexión a la base de datos [sqlite:db/trac.db]> postgres://postgres:1234@localhost:5432/proyecto

Creando e inicializando el proyecto
Instalando las páginas wiki predeterminadas
TracInterfaceCustomization importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracInterfaceCustomization
WikiMacros importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiMacros
TracBackup importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracBackup
TracUpgrade importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracUpgrade
TracLogging importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracLogging
TracAdmin importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracAdmin
TracRss importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracRss
TracSyntaxColoring importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracSyntaxColoring
TracNavigation importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracNavigation
TracFastCgi importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracFastCgi
InterMapTxt importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/InterMapTxt
CamelCase importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/CamelCase
WikiDeletePage importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiDeletePage
RecentChanges importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/RecentChanges
TracRevisionLog importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracRevisionLog
TracQuery importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracQuery
WikiNewPage importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiNewPage
TracModWSGI importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracModWSGI
TracBatchModify importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracBatchModify
PageTemplates importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/PageTemplates
TracTickets importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracTickets
SandBox importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/SandBox
TicketQuery importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TicketQuery
WikiRestructuredText importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiRestructuredText
TracTimeline importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracTimeline
TracBrowser importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracBrowser
WikiProcessors importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiProcessors
TracPlugins importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracPlugins
TracNotification importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracNotification
TracLinks importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracLinks
TracReports importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracReports
TracModPython importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracModPython
TracGuide importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracGuide
TracTicketsCustomFields importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracTicketsCustomFields
TracWorkflow importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracWorkflow
TracAccessibility importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracAccessibility
InterTrac importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/InterTrac
WikiFormatting importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiFormatting
TracEnvironment importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracEnvironment
TracImport importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracImport
TracChangeset importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracChangeset
TracSupport importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracSupport
WikiRestructuredTextLinks importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiRestructuredTextLinks
InterWiki importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/InterWiki
WikiStart importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiStart
TracUnicode importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracUnicode
WikiHtml importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiHtml
TracFineGrainedPermissions importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracFineGrainedPermissions
TracIni importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracIni
TracPermissions importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracPermissions
TracSearch importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracSearch
TracCgi importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracCgi
TracWiki importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracWiki
TracChangeLog importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracChangeLog
WikiPageNames importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/WikiPageNames
TracStandalone importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracStandalone
TracRepositoryAdmin importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracRepositoryAdmin
TracRoadmap importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracRoadmap
TitleIndex importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TitleIndex
TracInstall importada desde /root/.cache/Python-Eggs/Trac-1.2.2-py2.7.egg-tmp/trac/wiki/default-pages/TracInstall

---------------------------------------------------------------------
El entorno del proyecto para 'Nuevo Proyecto' se creó con éxito.

Ahora puede configurar el entorno editando el archivo:

/var/trac/proyecto/conf/trac.ini

Si desea hacer pruebas del entorno del proyecto,
pruebe a ejecutar el servidor de web independiente de Trac, `tracd`:

tracd --port 8000 /var/trac/proyecto

Apunte su navegador a http://localhost:8000/proyecto.
Allí también podrá hojear la documentación de su versión instalada
de Trac, incluyendo información de instalación más amplia (como
el despliegue de Trac en un servidor real).

La documentación más actual también puede ser encontrada en el sitio
web del proyecto:

http://trac.edgewall.org/

¡Enhorabuena!
	

Tal como se observa, la inicialización del proyecto es interactiva, y se debe pasar el nombre de proyecto y la cadena de conexión a la base de datos siguiento el formato motor://usuario:contraseña@host:puerto/base. En este caso se inicializa la base como superusuario de Postgres (usurio "postgres"), pero luego se cambiará al usuario sin privilegios:

postgres://postgres:1234@localhost:5432/proyecto

Se han creado los siguientes archivos del entorno dentro del nuevo directorio "proyecto":

root@linux:/var/trac# ll proyecto
total 36
drwxr-xr-x  7 root root     4096 dic 12 13:23 .
drwxr-x--- 20 trac www-data 4096 dic 12 13:23 ..
drwxr-xr-x  2 root root     4096 dic 12 13:23 conf
drwxr-xr-x  2 root root     4096 dic 12 13:23 htdocs
drwxr-xr-x  2 root root     4096 dic 12 13:23 log
drwxr-xr-x  2 root root     4096 dic 12 13:23 plugins
-rw-r--r--  1 root root       98 dic 12 13:23 README
drwxr-xr-x  2 root root     4096 dic 12 13:23 templates
-rw-r--r--  1 root root       27 dic 12 13:23 VERSION

A su vez, la base de datos a sido poblada:

root@linux:/var/trac# su - postgres
postgres@linux:~$ psql
psql (10.4)
Type "help" for help.

postgres=# \c proyecto
You are now connected to database "proyecto" as user "postgres".
proyecto=# \d
		List of relations
Schema |            Name            |   Type   |  Owner   
--------+----------------------------+----------+----------
public | attachment                 | table    | postgres
public | auth_cookie                | table    | postgres
public | cache                      | table    | postgres
public | component                  | table    | postgres
public | enum                       | table    | postgres
public | milestone                  | table    | postgres
public | node_change                | table    | postgres
public | node_change_id_seq         | sequence | postgres
public | notify_subscription        | table    | postgres
public | notify_subscription_id_seq | sequence | postgres
public | notify_watch               | table    | postgres
public | notify_watch_id_seq        | sequence | postgres
public | permission                 | table    | postgres
public | report                     | table    | postgres
public | report_id_seq              | sequence | postgres
public | repository                 | table    | postgres
public | revision                   | table    | postgres
public | session                    | table    | postgres
public | session_attribute          | table    | postgres
public | system                     | table    | postgres
public | ticket                     | table    | postgres
public | ticket_change              | table    | postgres
public | ticket_custom              | table    | postgres
public | ticket_id_seq              | sequence | postgres
public | version                    | table    | postgres
public | wiki                       | table    | postgres
(26 rows)

proyecto=# \q
postgres@linux:~$ exit

Configuración de la nueva instancia de Trac

Cambiar al directorio de configuración del nuevo proyecto:

root@linux:/var/trac# cd proyecto/conf/

Editar el archivo de configuración trac.ini:

root@linux:/var/trac/proyecto/conf# cp trac.ini trac.ini.original
root@linux:/var/trac/proyecto/conf# nano trac.ini

Contenido de ejemplo:

# -*- coding: utf-8 -*-

[account-manager]
account_changes_notify_addresses = emiliano
db_htpasswd_hash_type = sha
environ_auth_overwrite = disabled
force_passwd_change = enabled
htpasswd_file = /var/trac/proyecto/conf/usuarios.htpasswd
htpasswd_hash_type = sha256
notify_actions = new,change,delete
password_store = HtPasswdStore
persistent_sessions = disabled
refresh_passwd = disabled
verify_email = disabled

[attachment]
max_size = 209152
max_zip_size = 2097152
render_unsafe_content = disabled

[browser]
color_scale = enabled
downloadable_paths = /trunk,/branches/*,/tags/*
hide_properties = svk:merge
intermediate_color = 
intermediate_point = 
newest_color = (255, 136, 136)
oldest_color = (136, 136, 255)
oneliner_properties = trac:summary
render_unsafe_content = disabled
wiki_properties = trac:description

[changeset]
max_diff_bytes = 10000000
max_diff_files = 0
wiki_format_messages = enabled

[components]
acct_mgr.admin.* = enabled
acct_mgr.api.* = enabled
acct_mgr.db.sessionstore = disabled
acct_mgr.guard.accountguard = disabled
acct_mgr.htfile.htdigeststore = disabled
acct_mgr.htfile.htpasswdstore = enabled
acct_mgr.http.* = disabled
acct_mgr.model.* = disabled
acct_mgr.notification.* = enabled
acct_mgr.pwhash.* = disabled
acct_mgr.pwhash.htdigesthashmethod = enabled
acct_mgr.register.* = enabled
acct_mgr.register.emailverificationmodule = disabled
acct_mgr.register.registrationmodule = disabled
acct_mgr.svnserve.svnservepasswordstore = disabled
acct_mgr.web_ui.* = enabled
acct_mgr.web_ui.loginmodule = enabled
acct_mgr.web_ui.resetpwstore = enabled
graphviz.* = enabled
ldapauth.* = enabled
pagetopdf.pagetopdf.* = enabled
trac.db.mysql_backend.mysqlconnector = disabled
trac.db.sqlite_backend.sqliteconnector = disabled
trac.web.auth.loginmodule = disabled
tracdragdrop.* = enabled
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled
tracrpc.* = enabled
tracstats.* = enabled
webadmin.* = enabled
weekplan.* = enabled

[gitweb-repositories]
projects_base = 
projects_list = 
projects_url = 
sync_per_request = 

[graphviz]
cache_dir = /var/trac/proyecto/htdocs/graphviz
cache_manager = enabled
cache_max_count = 2000
cache_max_size = 10000000
cache_min_count = 1500
cache_min_size = 5000000
cmd_path = c:\utilitarios\ATT\Graphviz\bin
default_graph_fontname = "Arial"
default_graph_fontsize = 10
png_antialias = disabled

[header_logo]
alt = Nuevo Proyecto
height = -1
link = https://trac.linuxito.com/trac/proyecto
src = site/logo_trac_proyecto.png
width = -1

[inherit]
htdocs_dir = 
plugins_dir = 
templates_dir = 

[logging]
log_file = trac.log
log_format = 
log_level = DEBUG
log_type = none

[mainnav]
admin.order = 8.0
browser.order = 4.0
newticket.order = 6.0
roadmap.order = 3.0
search.order = 7.0
tickets.order = 5.0
timeline.order = 2.0
wiki.order = 1.0

[metanav]
about.order = 5.0
help.order = 4.0
login.order = 1.0
logout.order = 2.0
prefs.order = 3.0
settings.order = 3.0

[milestone]
default_group_by = component
default_retarget_to = 
stats_provider = DefaultTicketGroupStatsProvider

[mimeviewer]
enscript_modes = text/x-dylan:dylan:4
enscript_path = enscript
max_preview_size = 262144
mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb
php_path = /usr/local/php/bin/php
silvercity_modes = 
tab_width = 8
treat_as_binary = application/octet-stream,application/pdf,application/postscript,application/msword,application/rtf

[notification]
admit_domains = 
ambiguous_char_width = single
batch_subject_template = ${prefix} Batch modify: ${tickets_descr}
default_format.email = text/plain
email_address_resolvers = SessionEmailResolver
email_sender = SmtpEmailSender
ignore_domains = 
message_id_hash = md5
mime_encoding = base64
sendmail_path = sendmail
smtp_always_bcc = 
smtp_always_cc = 
smtp_default_domain = 
smtp_enabled = enabled
smtp_from = admin@linuxito.com
smtp_from_author = disabled
smtp_from_name = 
smtp_password = 
smtp_port = 25
smtp_replyto = admin@linuxito.com
smtp_server = smtp.linuxito.com
smtp_subject_prefix = __default__
smtp_user = 
ticket_subject_template = ${prefix} #${ticket.id}: ${summary}
use_public_cc = disabled
use_short_addr = disabled
use_tls = disabled

[notification-subscriber]
always_notify_cc = CarbonCopySubscriber
always_notify_previous_updater = TicketPreviousUpdatersSubscriber
always_notify_updater = TicketUpdaterSubscriber

[pagetopdf]
charset = iso-8859-1
size = A4

[project]
admin = 
admin_trac_url = .
descr = PROYECTO
footer = Visit the Trac open source project at
http://trac.edgewall.org/ icon = common/trac.ico name = Nuevo Proyecto url = https://trac.linuxito.com/trac/proyecto/login [query] default_anonymous_query = status!=closed&cc~=$USER default_query = status!=closed&owner=$USER items_per_page = 100 ticketlink_query = ?status=!closed [report] items_per_page = 100 items_per_page_rss = 0 [revisionlog] default_log_limit = 100 graph_colors = #cc0,#0c0,#0cc,#00c,#c0c,#c00 [roadmap] stats_provider = DefaultTicketGroupStatsProvider [search] default_disabled_filters = min_query_length = 3 [sqlite] extensions = [svn] authz_file = authz_module_name = [ticket] allowed_empty_fields = milestone,version default_cc = default_component = default_description = default_keywords = default_milestone = default_owner = < default > default_priority = major default_resolution = fixed default_severity = default_summary = default_type = defect default_version = max_comment_size = 262144 max_description_size = 262144 max_summary_size = 262144 preserve_newlines = default restrict_owner = enabled workflow = ConfigurableTicketWorkflow [ticket-workflow] accept = new -> assigned accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY create = <none> -> new create.default = 1 create_and_assign = <none> -> assigned create_and_assign.label = assign create_and_assign.operations = may_set_owner create_and_assign.permissions = TICKET_MODIFY leave = * -> * leave.default = 1 leave.operations = leave_status reassign = new,assigned,reopened -> new reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed -> reopened reopen.operations = del_resolution reopen.permissions = TICKET_CREATE resolve = new,assigned,reopened -> closed resolve.operations = set_resolution resolve.permissions = TICKET_MODIFY [timeline] abbreviated_messages = enabled changeset_collapse_events = disabled changeset_long_messages = disabled changeset_show_files = 0 default_daysback = 30 max_daysback = 90 newticket_formatter = oneliner ticket_show_component = disabled ticket_show_details = disabled [trac] auth_cookie_domain = auto_preview_timeout = 2.0 auto_reload = disabled backup_dir = db base_url = /trac/proyecto database = postgres://postgres:1234@localhost:5432/proyecto debug_sql = disabled default_charset = iso-8859-1 default_date_format = iso8601 default_dateinfo_format = relative default_handler = WikiModule default_language = es_AR default_timezone = America/Argentina/Buenos_Aires genshi_cache_size = 128 htdocs_location = ignore_auth_case = disabled jquery_location = jquery_ui_location = jquery_ui_theme_location = never_obfuscate_mailto = disabled permission_policies = ReadonlyWikiPolicy,DefaultPermissionPolicy,LegacyAttachmentPolicy permission_store = DefaultPermissionStore pg_dump_path = pg_dump request_filters = resizable_textareas = enabled secure_cookies = disabled show_email_addresses = disabled show_full_names = enabled show_ip_addresses = disabled timeout = 20 use_base_url_for_redirect = disabled use_chunked_encoding = disabled use_xsendfile = disabled wiki_toolbars = enabled xsendfile_header = X-Sendfile [versioncontrol] allowed_repository_dir_prefixes = default_repository_type = svn [wiki] default_edit_area_height = 20 ignore_missing_pages = disabled max_size = 262144 render_unsafe_content = disabled safe_origins = data: safe_schemes = cvs,file,ftp,git,irc,http,https,news,sftp,smb,ssh,svn,svn+ssh split_page_names = disabled

A continuación, cambiar los permisos de archivos:

root@linux:/var/trac/proyecto/conf# cd ..
root@linux:/var/trac/proyecto# chown -R trac:www-data .
root@linux:/var/trac/proyecto# chmod -R o-wrx .

Instalación del script de inicio del servicio

Elegir un puerto TCP disponible de la salida de netstat -tlpn. En este caso se selecciona el puerto 11080.

Crear el script de inicio de servicio:

root@linux:/var/trac/proyecto/conf# nano tracd-proyecto-servicio.sh

Pegar el siguiente contenido:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          tracd-proyecto
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Servidor Web backend de Trac Proyecto
# Description:       Servidor Web backend de Trac Proyecto
### END INIT INFO

PROYECTO="proyecto"

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
NAME="tracd-${PROYECTO}"
DESC="${NAME}"
PIDFILE="/var/run/${NAME}.pid"

TRACD_PROTO="http"
TRACD_HOSTNAME="127.0.0.1"
TRACD_PORT="11080"
TRACD_BASE_PATH="/trac/${PROYECTO}"
TRACD_USER="trac"
TRACD_GROUP="www-data"
TRACD_ENV="/var/trac/${PROYECTO}"

DAEMON="/usr/local/bin/tracd"
DAEMON_OPTS=""
DAEMON_OPTS="${DAEMON_OPTS} --protocol=${TRACD_PROTO} --hostname=${TRACD_HOSTNAME} --port=${TRACD_PORT} --base-path=${TRACD_BASE_PATH}"
DAEMON_OPTS="${DAEMON_OPTS} --user=${TRACD_USER} --group=${TRACD_GROUP}"
DAEMON_OPTS="${DAEMON_OPTS} --daemonize --pidfile=${PIDFILE}"
DAEMON_OPTS="${DAEMON_OPTS} --single-env ${TRACD_ENV}"

PYTHON_EGG_CACHE="/var/cache/python_egg_cache"
PKG_RESOURCES_CACHE_ZIP_MANIFESTS=1
export PYTHON_EGG_CACHE PKG_RESOURCES_CACHE_ZIP_MANIFESTS

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

if [ -r /etc/default/${NAME} ] ; then
   . /etc/default/${NAME}
fi

set -e

tracd_start() {
   pgrep --pidfile ${PIDFILE} $(basename ${DAEMON}) > /dev/null 2>&1
   if [ $? -eq 0 ] ; then
      echo "${NAME} ya está corriendo con el PID $(cat ${PIDFILE})."
      exit 1
   fi
   ${DAEMON} ${DAEMON_OPTS}
   if [ $? -ne 0 ] ; then
      echo "ERROR: No se pudo iniciar el proceso."
      exit 2
   fi
   echo "OK"
}

tracd_stop() {
   if [ ! -r "${PIDFILE}" ] ; then
      echo "No se encontró el archivo '${PIDFILE}'."
      exit 1
   fi
   pgrep --pidfile ${PIDFILE} $(basename ${DAEMON}) > /dev/null 2>&1
   if [ $? -eq 0 ] ; then
      pkill --pidfile ${PIDFILE}
      if [ $? -ne 0 ] ; then
         echo "ERROR al matar el proceso $(cat ${PIDFILE})."
         exit 2
      fi
      rm ${PIDFILE}
      echo "OK"
   else
      echo "El PID $(cat ${PIDFILE}) presente en el archivo '${PIDFILE}' no corresponde al proceso buscado."
      exit 3
   fi
}

tracd_status() {
   if [ ! -r "${PIDFILE}" ] ; then
      echo "No se encontró el archivo '${PIDFILE}'."
      exit 1
   fi
   pgrep --pidfile ${PIDFILE} $(basename ${DAEMON}) > /dev/null 2>&1
   if [ $? -eq 0 ] ; then
      echo "${NAME} está corriendo con el PID $(cat ${PIDFILE})."
   else
      echo "${NAME} NO está corriendo. El archivo del PID '${PIDFILE}' no es válido."
      exit 2
   fi
}

case "$1" in
   start)
      echo -n "Iniciando $DESC: "
      tracd_start || exit $?
      ;;
   stop)
      echo -n "Deteniendo $DESC: "
      tracd_stop || exit $?
      ;;
   restart)
      echo "Reiniciando $DESC: "
      echo -n "Deteniendo $DESC: "
      tracd_stop || exit $?
      echo -n "Iniciando $DESC: "
      tracd_start || exit $?
      ;;
   status)
      tracd_status || exit $?
      ;;
   *)
      N="/etc/init.d/$NAME"
      echo "Usage: $N {start|stop|restart|status}" >&2
      exit 3
      ;;
esac

exit 0

Editar las variables PROYECTO y TRACD_PORT, junto con la cabecera de init, según corresponda.

Luego instalar el script de inicio:

root@linux:/var/trac/proyecto/conf# ln -s /var/trac/proyecto/conf/tracd-proyecto-servicio.sh /etc/init.d/tracd-proyecto

Iniciar el servicio:

root@linux:/var/trac/proyecto/conf# service tracd-proyecto start
Iniciando tracd-proyecto: OK
root@linux:/var/trac/proyecto/conf# netstat -tulpn | grep 11080
tcp        0      0 127.0.0.1:11080         0.0.0.0:*               LISTEN      25959/python

Configuración de Nginx

Este servidor utiliza un front-end HTTP Nginx para proveer HTTPS, filtrado por IP, compresión y demás mejoras.

Crear un archivo de configuración del sitioa:

root@linux:/var/trac/proyecto/conf# cd /usr/local/etc/nginx/sites-available/
root@linux:/usr/local/etc/nginx/sites-available# nano trac_proyecto.conf

Configuración de ejemplo:

location ~ /trac/proyecto/chrome/(.+)/ {
	rewrite /trac/proyecto/chrome/(.+)/(.*) /htdocs/$1/$2 break;
	root /var/trac/proyecto/www;
}

location ~ /trac/proyecto(/?) {
	allow 192.168.1.0/24;
	deny all;

	proxy_pass http://tracd-proyecto;
	proxy_set_header Host $host;
	proxy_set_header Front-End-Https on;
	#proxy_redirect on;

	add_header X-Content-Type-Options nosniff;
	add_header X-Frame-Options "SAMEORIGIN";
	add_header X-XSS-Protection "1; mode=block";
	add_header X-Robots-Tag none;
	add_header X-Download-Options noopen;
	add_header X-Permitted-Cross-Domain-Policies none;
	add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
}

rewrite ^/proyecto/(.*) /trac/proyecto/$1 last;
rewrite ^/proyecto$ /trac/proyecto last;

Agregar el upstream:

root@linux:/usr/local/etc/nginx/sites-available# cd ..
root@linux:/usr/local/etc/nginx# nano upstreams.conf

Agregar las siguientes líneas al final del archivo:

upstream tracd-proyecto {
	server 127.0.0.1:11080;
}

(Este archivo es incluído desde nginx.conf.)

Finalmente, habilitar el sitio y recargar Nginx:

root@linux:/usr/local/etc/nginx# cd sites-enabled/
root@linux:/usr/local/etc/nginx/sites-enabled# ln -s ../sites-available/trac_proyecto.conf .
root@linux:/usr/local/etc/nginx/sites-enabled# service nginx reload
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Reloading nginx configuration: OK

Despliegue del sitio Trac

El siguiente paso consiste en ejecutar el despliegue del nuevo sitio. Para comenzar, actualizar el entorno de Trac utilizando trac-admin:

root@linux:/usr/local/etc/nginx/sites-enabled# trac-admin "/var/trac/proyecto" upgrade
root@linux:/usr/local/etc/nginx/sites-enabled# trac-admin "/var/trac/proyecto" wiki upgrade

Ejecutar el deploy:

root@linux:/var/trac/proyecto# trac-admin /var/trac/proyecto deploy /var/trac/proyecto/www

Setear los permisos para "www-data":

root@linux:/var/trac/proyecto# chown -R trac:www-data www/
root@linux:/var/trac/proyecto# chmod -R o-wrx www/

Luego es necesario crear el archivo de usuarios (usuarios.htpasswd, según se ha definido en la configuración del archivo trac.ini) utilizando la herramienta htpasswd, o enlazar uno ya existente (si la base de usuarios está definida en una ubicación fija y se comparte entre todas las instancias de Trac).

A continuación, me doy permisos de administrador:

root@linux:/var/trac/proyecto/conf# su - trac
trac@trac:~$ trac-admin /var/trac/proyecto/ permission add linuxito TRAC_ADMIN
trac@trac:~$ exit
logout
root@linux:/var/trac/proyecto/conf#

Reiniciar Trac una vez más:

root@linux:/var/trac/proyecto/conf# service tracd-proyecto restart
Reiniciando tracd-proyecto: 
Deteniendo tracd-proyecto: OK
Iniciando tracd-proyecto: OK

Configuración de permisos

Ingresar al sitio por primera vez y autenticarse con el usuario al que se ha dado TRAC_ADMIN mediante la URL https://trac.linuxito.com/trac/proyecto/.

Dirigirse al menú "Admin > Permisos". Eliminar "setup", "auth_moved", "annonymous" y crear un grupo para los usuarios de la instancia.

Cambio al usuario de base de datos no privilegiado

Una vez instalado, configurado el sitio y verificado que todo funciona, cambiar al usuario de Postgres no privilegiado.

Conectarse a la base de datos con el cliente psql como "postgres":

root@linux:/var/trac/proyecto/conf# su - postgres
postgres@linux:~$ psql
psql (10.4)
Type "help" for help.

postgres=# \c proyecto
You are now connected to database "proyecto" as user "postgres".
proyecto=#

Establecer los permisos adecuados sobre la base de datos "proyecto":

GRANT CONNECT,TEMPORARY ON DATABASE proyecto TO user_proyecto;
revoke all privileges on database proyecto from public;

Permisos sobre las tablas del schema "public":

grant insert,select,update,delete,truncate,references,trigger on all tables in schema public to postgres;
grant insert,select,update,delete,truncate on all tables in schema public to user_proyecto;

Cerrar sesión y editar el archivo trac.ini:

proyecto=# \q
postgres@linux:~$ exit
logout
root@linux:/var/trac/proyecto/conf# nano trac-ini

Cambiar la línea de conexión del usuario "postgres" al usuario (y correspondiente contraseña) "user_proyecto".

Reiniciar por última vez la instancia de Trac y verificar el funcionamiento del sitio:

root@linux:/var/trac/proyecto/conf# service tracd-proyecto restart
Reiniciando tracd-proyecto: 
Deteniendo tracd-proyecto: OK
Iniciando tracd-proyecto: OK

Referencias


Tal vez pueda interesarte


Compartí este artículo