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