Probando ownCloud, el Dropbox libre

herramientas Hace algo más de dos años que la gente de KDE anunció un proyecto llamado ownCloud, un sistema de copia y sincronización de archivos «en la nube» basado en un servicio LAMP en la parte del servidor y el uso de csync en la parte del cliente. El resultado es que cualquiera pueda montarse su propio servicio de sincronización de ficheros similar a Dropbox o SugarSync, pero sin restricciones de espacio y/o tráfico (más allá de lo que le permita su propio servidor o su servicio de hosting) y sin plantearse dilemas de privacidad. El desarrollo ha sido muy rápido (hace dos meses que vió la luz la versión 3 del servidor y la 1 del principal cliente) y realmente, merece la pena probarlo y echarle un vistazo.

El aspecto realmente «potente» de ownCloud es montar tu propio servicio, pero si no tienes medios o prefieres empezar por evaluar si te gusta de forma sencilla, puedes hacerlo a través de algún proveedor externo, que ya los hay. Existen servicios de pago y otros que, al igual que Dropbox y similares, ofrecen una modalidad de entrada gratuita y opciones adicionales por las que hay que pagar (freemiun que lo llaman por ahí). Owncube ofrece cinco Gbytes de espacio gratuito y GetFreeCloud, ofrece seis. Yo te aconsejo que empieces por Owncube puesto que ha actualizado ya su versión a la 3.0.2 y hasta la anterior, la 3.0.1 que es la usada en GetFreeCloud, existen un par de vulnerabilidades que pueden aprovecharse fácilmente a través de Metasploit. (Ver ACTUALIZACI�N (y II))

Crear una cuenta en cualquiera de ambos servicios es fácil: nombre, contraseña, correo electrónico y listo. Sólo con eso ya tienes un servicio de almacenamiento con un cómodo interfaz web.
Interfaz web de owncloud

Pero si realmente le quieres sacar partido a la sincronización automática de archivos entre tu equipo y el servidor y/o entre distintos equipos, necesitas instalarte un software cliente. En el anterior enlace tienes los binarios disponibles para Windows y las principales distribuciones de Linux. Los de Mac y Android (Ver ACTUALIZACI�N) aún están en fase de desarrollo y no están disponibles. Para distribuciones «marginales» de Linux tienes los fuentes y detalladas instrucciones de compilación, aunque imagino que la mayoría de ellas tendrán ya listos paquetes más o menos oficiales. Yo estoy usando Chakra en estos momentos (y muy contento, ya os hablaré de ello en otra ocasión) y el pkgbuild correspondiente está disponible aquí.

owncloud-client en el system tray de Chakra Linux Una vez instalado tenemos un icono disponible en la bandeja del sistema con un menú contextual bien sencillo: La opción de Configurar nos permite cambiar los datos de conexión con el servidor de sincronización y la opción de Add Folder nos permite añadir un nuevo directorio al servicio. Luego tenemos una entrada por cada directorio que se está sincronizando que nos abre directamente el administrador de archivos por defecto en dicho directorio local y la opción de cerrar el servicio (Quit). Si pulsamos con el botón izquierdo sobre el icono, en lugar de este menú se nos abrirá una ventana con información sobre el estado de sincronización de los directorios y la posibilidad de elmininarlos (del servicio, no de borrarlos), añadir nuevos, parar temporalmente el servicio en uno de ellos o volver a reanudarlo, etc.
owncloud-client

En la funcionalidad de «añadir directorios» es donde, quizás, se aprecia mejor la diferencia en la filosofía de uso frente a Dropbox que, tal vez, es su competidor más popular. Aquí no existe un único directorio de sincronización sino que los añadimos de forma individual aunque estos se encuentre en diferentes sitios de nuestro sistema de archivos. En Dropbox solemos resolver este asunto (al menos desde Linux) mediante enlaces simbólicos pero este método es bastante más flexible y cómodo. Además, podemos realizar la sincronización de un directorio en particular no sólo contra el servidor que hemos configurado «en la nube» sino contra otro directorio local o contra cualquier otra URL donde, lógicamente, debemos de tener acceso de escritura. Esto nos abre 1001 posibilidades de salvaguarda de nuestros datos.
diferentes modalidades de sincronización disponibles en owncloud-client

Volviendo al interfaz web, este tiene algunos «complementos» bastante útiles que podemos apreciar en el menú de enlaces a la izquierda: bookmarks, calendarios, contactos y dos entradas llamadas Música y Galería donde, automáticamente y de forma similar a como hace Android, se recopilan entradas a este tipo de archivos independientemente del directorio donde se encuentren. Ah, y en la opción de música tenemos un reproductor y todo 😉
galería de imágenes en la interfaz web de owncloud

No he encontrado forma de sincronizar el calendario o los bookmarks con otros servicios externos y los contactos deberían de poder sincronizarse con los de GMail a través de una opción existente en el menú de Ajustes (la rueda dentada que aparece en la parte inferior izquierda) pero no he logrado hacer que funcione.

Para los amigos de la línea de comando, existe un cliente de administración opcional para la consola llamado owncloud-admin. Los ficheros de configuración, al menos en mi distribución, se guardan en el directorio $HOME/.local/share/data/ownCloud/ Allí nos llevaremos la desagradable sorpresa de que el usuario y la contraseña de nuestro servidor de sincronización se guardan en claro dentro del fichero owncloud.cfg. En la instalación del cliente se nos pregunta si queremos que esta no se guarde y se nos pregunte en cada arranque pero, vaya, sería deseable una mayor integración con kwallet, el servicio de gestión de contraseñas propio de KDE.

Está claro que el desarrollo tiene aún muchos detalles por pulir y mejorar. He tenido problemas durante las pruebas con supuestos desajustes horarios entre cliente y servidor (que se han solucionado eliminando el servicio de sincronización y volviéndolo a crear, luego se trata de otra cosa…) y echo de menos que sincronice el contenido de enlaces simbólicos en el equipo local (cosa que no hace). Se echan de menos, además, opciones disponibles en Dropbox desde hace tiempo (como, por ejemplo, la recuperación de versiones anteriores de un archivo). También sería deseable que, ya puestos, pudiéramos sincronizar distintas carpetas contra diferentes servidores de owncloud. Y, desde luego, los clientes móviles deberían de estar disponibles pronto si quieren que el servicio entre a competir con los grandes. Pero de entrada, y a mi juicio, tiene muchas posibilidades y se trata del primer servicio de este tipo verdaderamente libre (y no como Ubuntu One). OpenSuse está particularmente involucrado en sacarlo adelante, asi que esperemos que seguirá evolucionando de forma rápida.

Pronto y en otra entrada, contaremos como puedes montarte tu propio servicio servidor de owncloud.

ACTUALIZACI�N: Uppps! A los pocos minutos de escribir esto me entero de que ya está disponible el cliente para Android.

ACTUALIZACI�N (y II): En getfreecloud.com han actualizado ya a la versión 3.03 de la versión servidor de owncloud, así que ya no hay problemas de vulnerabilidades conocidas.

74 comentarios

  1. Pastor: no me he debido de explicar bien en el comentario. Te digo que yo no cuento en ningún lado que tengas que escribir «http://localhost/owncloud» en el navegador. Y repito: creo que estás mezclando la instalación de un servidor de owncloud (cosa de la que yo no hablo aquí) con la instalación y configuración inicial del cliente contra un servidor público ya instalado, que es lo que trato de explicar.

  2. Paganini: y… ¿dónde digo que haya que escribir eso? Me parece que lo que tu te has instalado es la versión de servidor y lo que yo trato aquí es la de cliente (y usar un servidor ya instalado como owncube o getfreecloud)

  3. Muy buen post, he seguido todos los pasos al pie de la letra y no he tenido errores, pero al escribir en el navegador http://localhost/owncloud me aparece esto escrito, quisiera saber que ocurrio mal, ya que he buscado mucho y no he conseguido. Gracias!

    ?php

    /**
    * ownCloud
    *
    * @author Frank Karlitschek
    * @copyright 2010 Frank Karlitschek karlitschek@kde.org
    *
    * This library is free software; you can redistribute it and/or
    * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
    * License as published by the Free Software Foundation; either
    * version 3 of the License, or any later version.
    *
    * This library is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
    *
    * You should have received a copy of the GNU Affero General Public
    * License along with this library. If not, see .
    *
    */

    $RUNTIME_NOAPPS = TRUE; //no apps, yet

    require_once(‘lib/base.php’);

    // Setup required :
    $not_installed = !OC_Config::getValue(‘installed’, false);
    if($not_installed) {
    // Check for autosetup:
    $autosetup_file = OC::$SERVERROOT.»/config/autoconfig.php»;
    if( file_exists( $autosetup_file )){
    OC_Log::write(‘core’,’Autoconfig file found, setting up owncloud…’,OC_Log::INFO);
    include( $autosetup_file );
    $_POST[‘install’] = ‘true’;
    $_POST = array_merge ($_POST, $AUTOCONFIG);
    unlink($autosetup_file);
    }
    OC_Util::addScript(‘setup’);
    require_once(‘setup.php’);
    exit();
    }

    // Handle WebDAV
    if($_SERVER[‘REQUEST_METHOD’]==’PROPFIND’){
    header(‘location: ‘.OC_Helper::linkToRemote(‘webdav’));
    exit();
    }
    elseif(!OC_User::isLoggedIn() && substr(OC::$REQUESTEDFILE,-3) == ‘css’){
    OC_App::loadApps();
    OC::loadfile();
    }
    // Someone is logged in :
    elseif(OC_User::isLoggedIn()) {
    OC_App::loadApps();
    if(isset($_GET[«logout»]) and ($_GET[«logout»])) {
    OC_User::logout();
    header(«Location: «.OC::$WEBROOT.’/’);
    exit();
    }else{
    if(is_null(OC::$REQUESTEDFILE)){
    OC::loadapp();
    }else{
    OC::loadfile();
    }
    }

    // For all others cases, we display the guest page :
    } else {
    OC_App::loadApps();
    $error = false;
    // remember was checked after last login
    if(isset($_COOKIE[«oc_remember_login»]) && isset($_COOKIE[«oc_token»]) && isset($_COOKIE[«oc_username»]) && $_COOKIE[«oc_remember_login»]) {
    if(defined(«DEBUG») && DEBUG) {
    OC_Log::write(‘core’,’Trying to login from cookie’,OC_Log::DEBUG);
    }
    // confirm credentials in cookie
    if(isset($_COOKIE[‘oc_token’]) && OC_User::userExists($_COOKIE[‘oc_username’]) &&
    OC_Preferences::getValue($_COOKIE[‘oc_username’], «login», «token») == $_COOKIE[‘oc_token’]) {
    OC_User::setUserId($_COOKIE[‘oc_username’]);
    OC_Util::redirectToDefaultPage();
    }
    else {
    OC_User::unsetMagicInCookie();
    }

    // Someone wants to log in :
    } elseif(isset($_POST[«user»]) and isset($_POST[‘password’]) and isset($_SESSION[‘sectoken’]) and isset($_POST[‘sectoken’]) and ($_SESSION[‘sectoken’]==$_POST[‘sectoken’]) ) {
    if(OC_User::login($_POST[«user»], $_POST[«password»])) {
    if(!empty($_POST[«remember_login»])){
    if(defined(«DEBUG») && DEBUG) {
    OC_Log::write(‘core’,’Setting remember login to cookie’,OC_Log::DEBUG);
    }
    $token = md5($_POST[«user»].time().$_POST[‘password’]);
    OC_Preferences::setValue($_POST[‘user’], ‘login’, ‘token’, $token);
    OC_User::setMagicInCookie($_POST[«user»], $token);
    }
    else {
    OC_User::unsetMagicInCookie();
    }
    OC_Util::redirectToDefaultPage();
    } else {
    $error = true;
    }

    // The user is already authenticated using Apaches AuthType Basic… very usable in combination with LDAP
    } elseif(isset($_SERVER[«PHP_AUTH_USER»]) && isset($_SERVER[«PHP_AUTH_PW»])){
    if (OC_User::login($_SERVER[«PHP_AUTH_USER»],$_SERVER[«PHP_AUTH_PW»])) {
    //OC_Log::write(‘core’,»Logged in with HTTP Authentication»,OC_Log::DEBUG);
    OC_User::unsetMagicInCookie();
    OC_Util::redirectToDefaultPage();
    }else{
    $error = true;
    }
    }
    if(!array_key_exists(‘sectoken’, $_SESSION) || (array_key_exists(‘sectoken’, $_SESSION) && is_null(OC::$REQUESTEDFILE)) || substr(OC::$REQUESTEDFILE, -3) == ‘php’){
    $sectoken=rand(1000000,9999999);
    $_SESSION[‘sectoken’]=$sectoken;
    $redirect_url = (isset($_REQUEST[‘redirect_url’])) ? $_REQUEST[‘redirect_url’] : $_SERVER[‘REQUEST_URI’];
    OC_Template::printGuestPage(», ‘login’, array(‘error’ => $error, ‘sectoken’ => $sectoken, ‘redirect’ => $redirect_url));
    }
    }

  4. Mmm, esa es buena, no me sabía yo esos parámetros de configuración 🙂
    Imagino que lo mío es más matar moscas a cañonazos, pero cuando hay muchas moscas funciona 🙂

    Gracias por el truco.

    1. Hace unas semanas escribí una entrada en la que comentaba algunas de estas cosas. La verdad es que un servidor web con poca RAM y muchos accesos es difícil de gobernar. Después de escribir la entrada que te enlazo estuve haciendo pruebas con memcached y varnish pero, claro, para que funcionen tienes que dedicarles RAM al cacheado y eso hace que puedas disponer de aún menos procesos de Apache, así que no siempre resulta una estrategia rentable… Estos problemas, cuando estás con el servidor web de tu empresa con 4 gigas de RAM no te los tropiezas… 🙂

  5. Aloriel: yo tengo limitado el número de clientes que Apache admite en 40 con la directiva MaxClients y un Timeout bajo, en 10 segundos, para que las conexiones se renueven rápidamente, pero, aún así, ante una avalancha como la de Meneame el servidor cayó. Lo que sospecho es que lo que saturó la memoria del servidor fue la estructura que genera Apache para mantener clientes en espera de ser atendididos y eso podría controlarse con la directiva ListenBacklog. Como me pica la curiosidad montaré una maqueta pequeña y haré pruebas, pero tendrá que esperar a Julio que ahora estoy saturado de trabajo… Ya te cuento.

  6. Josemaría: el mío es algo más grande, 2GB de RAM y 4 procesadores a 2GHz (2 núcleos 4 hilos), pero la conexión no da, así que tengo un pequeño script que cada 5 minutos me comprueba el número de conexiones que hay, si son más de 150 me manda un correo y comprueba cuántas hay un minuto después. Si son más de 180 mata el Apache y lo relanza, también mandándome un correo. Con eso conseguí que no se cayese la página cuando me menearon (a lo mejor a ti te tocaría poner más conexiones o menos).

    ¡Saludos!

  7. Aloriel: Lo tengo en un VPS pequeñito con sólo 512Mbytes de RAM. He estado ajustando parámetros durante estos dos días y he conseguido que de tiempos de respuesta aceptables (de entre 1 y 3 segundos) con cargas de 3000 o 3500 páginas por hora, pero ha llegado a tener picos de cinco mil y pico y eso es ingobernable con estos recursos. De hecho, no ha estado nunca realmente caido, pero el pobre indio no daba para más… Tengo pendiente desde hace meses ver algún acelerador para php (eaccelerator o xcache, seguramente) pero con las 500 visitas a la hora que suelo tener de máximo no me hace realmente falta. Digo yo que de aquí a dos años que me toque otro meneo habré sacado tiempo de hacerlo 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información

ACEPTAR
Aviso de cookies