Instalar un servidor de Subversion en un CentOs con Plesk

No es nada difícil instalar un servidor de Subversion en un linux, pero hay que tener unas cuantas cosas en cuenta si queremos que se integre bien con Plesk y poder alojar todos nuestros proyectos bajo un subdominio del tipo https://svn.midominio.com/repositorio1

Como siempre, para toquetear el servidor necesitas tener acceso al sistema por consola con el usuario root. Este tutorial funciona con Plesk 8 y Plesk 9 (concretamente Plesk 9.2) corriendo sobre un Linux CentOS, que no es otra cosa que un servidor dedicado de 1and1. Y siendo honrados, hay que decir que básicamente es la adaptación y traducción del howto que yo usé escrito por Ale Le (en inglés).

NOTA: Cambia “repositorio1″ por el nombre que le quieras dar y “dominio.com” por tu nombre de dominio.

Resumen de los pasos a seguir:

  1. Instalar el servidor de Subversion
  2. Configurar apache
  3. Crear el repositorio Subversion
  4. Configurar Plesk
  5. Crear usuarios y repositorios

Paso 1: Instalar el servidor de Subversion

  1. # yum install subversion
    Una vez hecho login con el usuario root, usamos yum para instalar los paquetes de subversion (si en vez de CentOs utilizas otra distribución, quizás tengas que usar aptget u otro gestor de paquetes). Para comprobar que la versión de subversion es la correcta ejecuta # svn --version y tendría que darte 1.4 (en concreto, yo tengo 1.4.2)

Paso 2: Configurar Apache

Gracias a yum hemos instalado Subversion con gran facilidad y podríamos usarlo ya con los protocolos y puertos de subversion. Ahora hemos de configurar apache para que cuando alguien llame a https://svn.midominio.com/repositorio1 se esté conectando a subversion via WEBDAV.

  1. # yum install mod_dav_svn
    Instalamos el mod_dav_svn para apache (DAV es la tecnología que nos permitirá hacer commits a través de http). Este comando debería instalar todos los paquetes que dependan para su funcionamiento (como mod_authz_svn). Puedes ver los módulos de apache que tienes instalados en # ll /etc/httpd/modules
  2. # vi /etc/httpd/conf.d/subversion.conf
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so

    Puede ser que el archivo ya esté creado, aunque con un nombre subversion.conf.ALGO : si estas dos lineas aparecen arriba y no están comentadas, ya nos vale. Hemos de asegurarnos de que apache está cargando el archivo mod_dav_svn.so al arrancar. En /etc/httpd/conf/httpd.conf podemos ver que después de cargar módulos básicos hace Include conf.d/*.conf. Por lo que crearemos un archivo llamado /etc/httpd/conf.d/subversion.conf y le insertamos el código arriba escrito.

Paso 3: Crear el repositorio Subversion

  1. # mkdir /var/svn/
    # mkdir /var/svn/repositorio1

    Crearemos el directorio svnrepo en /var/, donde se alojarán los repositorios de subversion
  2. # svnadmin create /var/svn/repositorio1
    Instalamos un repositorio en ese directorio mediante el comando svnadmin create
  3. chmod -R 777 /var/svn/repositorio1
    Muy importante es dar permisos de escritura a este directorio. Si no es así, apache no podrá modificar estos archivos y por tanto, los commits nunca funcionarán.

Paso 4: Configurar Plesk

  1. Creamos un subdominio mediante el panel de control de Plesk.
    Dentro del dominio en el que queremos colgar nuestro servidor de subversion. Hay que ir al panel del dominio > Sitio Web > Crear subdominio y le llamamos “svn”, por ejemplo. Si al crear el dominio hemos activado https y hemos dicho que vaya al mismo sitio que http, podremos acceder por https a nuestro repositorio.
  2. # vi /var/www/vhosts/dominio.com/subdomains/svn/conf/vhost.conf
    <Location /repositorio1>
    DAV svn
    SVNPath /var/svn/repositorio1
    AuthType Basic
    AuthName “Subversion repositorio1”
    AuthUserFile /etc/svn-auth-file
    Require valid-user
    </Location>

    Como Plesk sobreescribe el archivo /var/www/vhosts/dominio.com/conf/httpd.confy el /var/www/vhosts/dominio.com/subdomains/svn/conf/httpd.conf cada vez que tocamos algo en el panel de control, hemos de hacer los cambios en otro fichero que creamos con el nombre vhost.conf. En ese fichero introducimos el código que he puesto arriba. Con eso le decimos a apache que use DAV y que el repositorio de svn está en /var/svnrepo/ y que para autenticar pida cualquier usuario válido en el archivo de passwords /etc/svn-auth-file (luego lo creamos).
  3. # /usr/local/psa/admin/sbin/websrvmng -u --vhost-name=dominio.com
    Como siempre que añadamos un archivo al directorio conf de un dominio, hemos de decir a Plesk que regenere el httpd.conf incluyendo un “include” a nuestro vhost.conf. Al poner name=dominio.com sólo regenerará ese dominio.
  4. # /etc/init.d/httpd restart
    Una vez el include está en httpd.conf, reiniciamos el apache y así leerá el nuevo archivo vhost.conf. Ahora ya tenemos montado el servidor y el subdominio apuntando a nuestro subversion en http://svn.dominio.com/repositorio1 o https://svn.dominio.com/repositorio1 si lo hemos configurado así (pruébalo, venga!) :-)

Paso 5: Crear usuarios y repositorios

  1. # htpasswd -c /etc/svn-auth-file usuario1
    La aplicación htpasswd crea un archivo en /etc/svn-auth-file e introduce un usuario con nombre usuario1 (en seguida nos pide que escribamos y confirmemos su contraseña). ¡Alerta! Si queremos crear más usuarios, no debemos usar la opción -c, ya que esta crea un nuevo fichero, sobreescribiendo el anterior. Para el segundo y siguientes usuarios, usaremos # htpasswd /etc/svn-auth-file usuario2. Si queremos borrar un usuario, podemos editar el fichero o usar la opción -D mayúscula.
  2. Además, a mi me interesa tener varios repositorios, sólo he de hacer los pasos 3, 4 (sólo el punto 2, añadiendo un bloque debajo del otro) y 5 cambiando “repositorio1″ por otro nuevo repositorio
  3. Si sólo quiero dar acceso a ciertos usuarios a repositorios concretos, puedo hacerlo cambiando la linea en vhost.conf Require valid-user por Require user usuario1 usuario2

Por favor, dejad comentarios si veis algún fallo o sugerencia. Espero que esto os ahorre unas cuantas horas de investigación :-)

Reparar todas las tablas de todas las bases de datos de MySQL en Plesk

Para reparar todas las tablas de todas las bases de datos de MySQL en Plesk (Linux) tenemos que poner en una sola linea este pedazo churro:

for database in $(mysql --skip-column-names -uadmin -p`cat /etc/psa/.psa.shadow` -e
"show databases" ); do echo "optmizing tables from $database";
for table in $(mysql --skip-column-names -uadmin -p`cat /etc/psa/.psa.shadow` -e
"show tables" $database ); do echo "-> $table " ;
mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "OPTIMIZE TABLE $table" $database ;
done ; done ;

Bajar ficheros adjuntos de más de 5 MB desde Horde/Webmail en Plesk

Se trata de una configuración de Horde vhost webmail, dirigida por Plesk.

Los Virtual Host (Vhost) de Plesk están en el archivo : /etc/httpd/conf.d/zz010_psa_httpd.conf.

Conéctese a su servidor mediante root SSH y modifíquelo a través del editor de texto

# nano /etc/httpd/conf.d/zz010_psa_httpd.conf

A continuación, basta incluir la siguente linea en vhost webmail :

php_admin_value memory_limit 128M

Puede modificar el tamaño 128 por 56 o lo que se estime necesario….

Por último, deberán modificarse las variables de /etc/php.ini para ficheros de upload y tamaño de POST.

# nano /etc/php.ini

Error al borrar un dominio en Parallels Plesk Panel

Un error que sigue apareciendo aunque pasen versiones y versiones de Plesk Panel ( desde la 7.4 a la 9.2 ) es la perdida de integridad referencial en algunas tablas. Esto provoca que a la hora de ejectuar algunas herramientas y falten datos se generen errores. En ese caso al borrar el dominio ‘delete.me’ nos aparece este mensaje :

0: class.MailManager.php:242
        MailManager::execWithException(string 'smart_exec', string 'mailmng', array, array, string 'lst')
1: class.MailManager.php:274
        MailManager->callMailManager(string 'remove-mailname', array)
2: class.MailManager.php:354
        MailManager->removeMailname(string 'sharoj.com', string 'delete')
3: cmd_mail.php3:1357
        mn_del(string '490')
4: class.DSMail.php:211
        DSMail->delete(boolean false)
5: class.PhDomain.php:358
        PhDomain->reset(integer '0', boolean true, boolean false)
6: class.BsDomain.php:330
        BsDomain->reset(integer '0')
7: class.BsDomain.php:302
      BsDomain->delete(integer '0')
8: class.BsDomain.php:536
        mdeleteDomains(array)
9: removeDomains.php3:42
        require(string '/opt/psa/admin/htdocs/domains/removeDomains.php3')
10: plesk.php:51

Tendremos que buscar manualmente donde está el problema y repararlo , directamente a la base de datos de Plesk (generalmente llamada psa).

Comenzamos a buscar relaciones rotas entre objetos:

# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 152938
Server version: 5.0.32-Debian_7etch10-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select id, name from domains where name = "delete.me";
+------+------------+
| id   | name       |
+------+------------+
| 1241 | delete.me  |
+------+------------+
1 row in set (0.00 sec)

Ya tenemos el ID del dominio, nos centramos en las cuentas de correo ya que el error se genera al borrar cuentas de correo. Vamos a ver que tablas hay en esta version de Plesk ( 9.2.3 )

mysql> show tables like '%mail%' ;
+------------------------+
| Tables_in_psa (%mail%) |
+------------------------+
| Webmails               |
| badmailfrom            |
| mail                   |
| mail_aliases           |
| mail_redir             |
| mail_resp              |
| mass_mail              |
| mass_mail_clients      |
| mass_mail_domains      |
+------------------------+
9 rows in set (0.00 sec)

La tabla que nos interesa es mail vamos a ver que esctructura tiene y vamos sacando datos:

mysql> desc mail ;
+---------------+------------------------------------------+------+-----+---------+----------------+
| Field         | Type                                     | Null | Key | Default | Extra          |
+---------------+------------------------------------------+------+-----+---------+----------------+
| id            | int(10) unsigned                         | NO   | PRI | NULL    | auto_increment |
| mail_name     | varchar(245)                             | NO   |     |         |                |
| perm_id       | int(10) unsigned                         | NO   | MUL |         |                |
| postbox       | enum('false','true')                     | NO   |     | false   |                |
| account_id    | int(10) unsigned                         | NO   | MUL |         |                |
| redirect      | enum('false','true')                     | NO   |     | false   |                |
| redir_addr    | varchar(255)                             | YES  |     | NULL    |                |
| mail_group    | enum('false','true')                     | NO   |     | false   |                |
| autoresponder | enum('false','true')                     | NO   |     | false   |                |
| spamfilter    | enum('false','true')                     | NO   |     | true    |                |
| virusfilter   | enum('none','incoming','outgoing','any') | NO   |     | none    |                |
| mbox_quota    | bigint(20)                               | NO   |     | -1      |                |
| dom_id        | int(10) unsigned                         | NO   | MUL |         |                |
+---------------+------------------------------------------+------+-----+---------+----------------+
13 rows in set (0.01 sec)
mysql> select * from mail where dom_id = 1241;
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
| id  | mail_name | perm_id | postbox | account_id | redirect | redir_addr | mail_group | autoresponder | spamfilter | virusfilter | mbox_quota | dom_id |
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
| 490 | delete.me |    2202 | true    |       2204 | false    |            | false      | false         | false      | incoming    |         -1 |   1241 |
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
1 row in set (0.00 sec)

Vemos que tiene al menos una cuenta de correo para el usuario 2204, vamos a buscar este usuario en la tabla accounts, ya que el id es accounts_id

mysql> show tables like '%acco%'
    -> ;
+------------------------+
| Tables_in_psa (%acco%) |
+------------------------+
| accounts               |
+------------------------+
1 row in set (0.00 sec)
mysql> select * from accounts where id = 2204 ;
Empty set (0.01 sec)

Pues no está, aquí tenemos el problema, no existe la información del usuario pero sí el buzón.
lo más comodo es borar la entrada en la base de datos de la cuenta de correo. Dado que vamos a borrar el dominio nos es indiferente conservarlo.

mysql> delete from mail where id =490 limit 1 ;
Query OK, 1 row affected (0.03 sec)

De otra forma , habíamos dado de alta una fila en accounts con el id 2204 .

Solución al error: MySQL query failed: Incorrect information in file: ‘./psa/misc.frm’

Síntomas

En la página Inicio de Sesión de Parallels Plesk Panel en https://plesk.host.name:8443, aparece el siguiente error:

ERROR: PleskMainDBException
MySQL query failed: Incorrect information in file: ‘./psa/misc.frm’

0: /usr/local/psa/admin/plib/common_func.php3:216
db_query(string ‘select param, val from misc’)
1: /usr/local/psa/admin/plib/common_func.php3:513
get_param(string ‘mysql41_compatible’)
2: /usr/local/psa/admin/plib/common_func.php3:410
db_set_names()
3: /usr/local/psa/admin/plib/common_func.php3:389
db_connect_real(string ‘localhost’, string ‘admin’, string ‘***********’, string ‘psa’)
4: /usr/local/psa/admin/plib/common_func.php3:369
db_connect()
5: /usr/local/psa/admin/auto_prepend/auth.php3:87

Causa

La causa de este problema son unos permisos incorrectos al directorio /tmp. Por este motivo, MySQL no puede crear sus archivos temporales correctamente para el motor InnoDB en el inicio.

Los permisos correctos son:

~# ls -ld /tmp/
drwxrwxrwt 4 root root 36864 Aug  8 08:41 /tmp/
~#

Resolución

Corrija los permisos con el siguiente comentario:

~# chmod 1777 /tmp

Información Adicional

Para ver el error, actualice la sección [mysqld] en el archivo /etc/my.cnf con esta línea:

/etc/my.cnf
---&gt;8---
[mysqld]
innodb_force_recovery = 4
---8&lt;---

Ahora reinicie el servicio con:

~# /etc/init.d/mysqld restart
Stopping MySQL:                                            [  OK ]
Starting MySQL:                                            [  OK ]
~#

En el archivo de registro de errores de MySQL debería aparecer el siguiente error:

/var/log/mysqld.log
---&gt;8---
^G/usr/libexec/mysqld: Can't create/write to file '/tmp/ib1suXEE' (Errcode: 13)
020326 22:26:17  InnoDB: Error: unable to create temporary file; errno: 13
020326 22:26:18 [Note] /usr/libexec/mysqld: ready for connections.
---8&lt;---

La ubicación del archivo de registro de errores de MySQL se define en el archivo de configuración:

~# grep log-error /etc/my.cnf
log-error=/var/log/mysqld.log
~#