Núvol privat basat en ownCloud

dilluns, 20 octubre, 2014

Durant els darrers mesos, a CaminsTECH hem estat treballant en la implementació d'un servei de compartició de fitxers al núvol. Un dels requisits d'aquesta solució havia de ser assegurar que el control de les dades es mantingués dins de la pròpia universitat. Finalment, aquest projecte s'ha convertit en un servei anoment CaminsDRIVE que ofereix la possibilitat d'utilitzar un aplicatiu amb les característiques del conegut sistema Dropbox™ als usuaris de CaminsTECH.

Arquitectura

La solució escollida es basa en ownCloud  (un software de cloud opensource) sobre màquines amb sistema operatiu Linux (Ubuntu 64). L'arquitectura del sistema s'ha dissenyat  seguint una estructura dividida en tres nivells: balancer, frontend i backend.

  • Primer nivell o balancer és el punt d’entrada on s'implementa el balanceig de la càrrega de peticions. Només es permet l'accés mitjançant el protocol HTTPS. Aquestes peticions són distribuïdes entre els diferents servidors d'ownCloud.
  • Segon nivell o frontend és el nivell on s'executen les instàncies de l’aplicació ownCloud. El nombre d'instàncies pot crèixer o decrèixer segons la demanda. 
  • Tercer nivell o backend és el nivell on es troben els serveis que donen suport a les diverses instàncies del frontend.  

Arquitectura

Balancer

La implementació del balancejador s’ha realitzat utilitant el servidor web Apache amb el mòdul proxy_balancer. Actualment s'ha optat per la utilització d'un sistema balanceig de la càrrega basat en el nombre de peticions (lbmethod_byrequests).

La utilització de diversos servidors d'ownCloud pot produir problemes d'autenticació als usuaris. Quan una petició arriba a un ownCloud diferent al que ha realitzat l'autenticació, aquest torna a requerir l'autenticació a l'usuari (aquest frontend no conté cap sessió de l'usuari). Per solucionar aquest problema cal assegurar-se que totes les peticions d'una mateixa sessió es redireccionin a la mateixa instància d'ownCloud. Aquest comportament es pot aconseguir mitjançat la utilització de l'atribut stickysession del ProxySet.

<VirtualHost *:443>
   ServerName drive.caminstech.upc.edu
   
   ProxyRequests off
   Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
   <Proxy balancer://cluster>
      BalancerMember http://XXX.XXX.XXX.XXX:80 route=driveX
      BalancerMember http://YYY.YYY.YYY.YYY:80 route=driveY
      BalancerMember ...
      
      ProxySet lbmethod=byrequests
      ProxySet stickysession=ROUTEID
   </Proxy>
   ProxyPass / balancer://cluster/

   SSLEngine on
   SSLCertificateFile /etc/ssl/private/drive.caminstech.upc.edu.crt
   SSLCertificateKeyFile /etc/ssl/private/drive.caminstech.upc.edu_privatekey.pem
   BrowserMatch "MSIE [2-6]" \
      nokeepalive ssl-unclean-shutdown \
      downgrade-1.0 force-response-1.0
   BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

 Caldria avaluar la utilització d'un balancejador més lleuger (per exemple HAProxy).

 Caldria avaluar la utilització d'un sistema de sessió única (per exemple memcached).

Frontend

Les diferents instàncies d'ownCloud 6.0.3 corren sobre el servidor web nginx. Tant el codi de l'aplicatiu, els fitxers d'usuari com la base de dades es troben centralitzats en el servidor de backend, per tant, totes les instàncies executen la mateixa aplicació.

Per a la configuració del servidor web s'han seguit les instruccions del manual de configuració d'ownCloud sobre nginx.

upstream php-handler {
        server 127.0.0.1:9000;
}

server {
        listen 80;
        server_name drive.caminstech.upc.edu;

        root /caminsDRIVE/owncloud;

        client_max_body_size 2G;
        fastcgi_buffers 64 4K;

        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

        index index.php;
        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
                deny all;
        }

        location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

                try_files $uri $uri/ index.php;
        }

        location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 = 404;

                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_param HTTPS on;
                fastcgi_pass php-handler;
        }

        # Optional: set long EXPIRES header on static assets
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
                expires 30d;
                # Optional: Don't log access to assets
                access_log off;
        }
}

La mida màxima dels fitxers de pujada també cal definir-la al fitxer de configuració del PHP (/etc/php5/fpm/php.ini).

  upload_max_filesize = 2G
  post_max_size = 2G

Backend

Durant la creació de la base de dades cal donar accés les diferents instàncies dels frontends (ex. frontend1, frontend2).

mysql> create database owncloud;
mysql> grant usage on *.* to username@frontend1 identified by 'password';
mysql> grant all privileges on owncloud.* to username@frontend1;
mysql> grant usage on *.* to username@frontend2 identified by 'password';
mysql> grant all privileges on owncloud.* to username@frontend2;

Per últim, cal donar accés als directoris compartits per NFS afegint les línies següents al fitxer /etc/exports

/caminsDRIVE/files <frontend1>(rw,sync,root_squash,no_subtree_check)
/caminsDRIVE/owncloud <frontend1>(rw,sync,root_squash,no_subtree_check)

 En cas que el nombre de grups del servidor LDAP sigui gran (>1000), les eines d'administració d'ownCloud pateixen temps d'espera elevats. Per aquesta raó, en aquesta solució es va optar per implementar un servidor OpenLDAP dedicat. Aquest servidor només conté els usuaris i grups necessaris pel funcionament del servei.

Desenvolupament a mida de plugins

En el nostre cas, l'eina de consulta de l'espai utilitzat pels usuaris no satisfeia les nostres necessitats. Per aquesta raó hem implementat un plugin d'administració que permet consultar l'espai en disc utilitzat pels usuaris. Aquest plugin resta disponible a bitbucket.

Enllaços d'interés

Afegeix un nou comentari

Image CAPTCHA