No estás usando esta distribución?

Selecciona una versión o distribución diferente

Nextcloud es una serie de programas cliente-servidor que permiten la creación de servicios de alojamiento de archivos. Nextcloud permite a los usuarios crear servidores privados. Su modelo de desarrollo abierto permite añadir y/o modificar la funcionalidad del software del servidor en forma de aplicaciones. Nextcloud es una bifurcación de OwnCloud que también es un software de servicio de alojamiento en la nube.

En este tutorial

Después de completar este tutorial, tendremos:

  • Un servidor NextCloud recién instalado.
  • Almacenamiento caché de PHP proporcionado por ACPu y Redis para notar un aumento de velocidad cuando se navegue en la nube.
  • Enlaces amigables, eliminamos el /index.php de la URL.
  • SSL habilitado con certificados de Let’s Encrypt y todo el tráfico redirigido a HTTPS.
  • Nuestra nube completamente cifrada.

Utilizaremos durante todo el tutorial el dominio nc.voidnull.es para representar una configuración válida. Recuerda que deberás de cambiar en todos los pasos ese dominio por el tuyo -que puede ser un subdominio o bien un dominio-.

Instalación de servidor web, APCu y Redis

Para la instalación del servidor Web deberemos de seguir las instrucciones de este otro tutorial de cómo instalar un servidor web en Ubuntu 22.04. En este caso usaremos Nginx en vez de Apache.

Instalación de servidor web LEMP en Ubuntu 22.04
A continuación vamos a instalar un servidor LEMP completo en Ubuntu 22.04 “Jammy Jellyfish”. Hay algunas cosas que han cambiado respecto a otras versiones de Ubuntu, por ejemplo algunos datos importantes a tener en cuenta

Instalación de servidor LEMP

Como siempre, lo primero actualizamos los repositorios y actualizamos los paquetes:

apt update
apt upgrade

Iniciaremos los servicios del servidor web y los añadiremos al arranque:

systemctl enable nginx mariadb 
systemctl start nginx mariadb

Instalamos los paquetes necesarios para APCu y Redis:

apt install php8.1-apcu php8.1-redis redis-server

Habilitamos Redis para el inicio:

systemctl enable redis-server

Finalmente, instalamos los paquetes necesarios de PHP para NextCloud:

apt install php8.1-zip php-dompdf php8.1-xml php8.1-mbstring php8.1-curl unzip php8.1-gd php8.1-mysql php8.1-intl php8.1-bcmath php8.1-gmp php8.1-imagick imagemagick

Configuración previa de PHP

Deberemos de modificar la configuración de PHP:

nano /etc/php/8.1/fpm/php.ini

Y cambiamos:

memory_limit = 128MB

Por:

memory_limit = 1G

Luego descomentamos estas líneas en el fichero /etc/php/8.1/fpm/pool.d/www.conf:

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Y reiniciamos FPM:

systemctl restart php8.1-fpm.service

Configuración Nginx y activación de SSL

Lo primero que haremos será crear un Server para nuestro NextCloud, vamos a ello:

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/nextcloud.conf

Y editamos el fichero para que quede con el siguiente contenido:

server {
    listen 80;
    listen [::]:80;
    server_name nc.voidnull.es;

    # Enforce HTTPS
    return 301 https://$server_name$request_uri;
}
📢
Recuerda de cambiar nc.voidnull.es por tu dominio para que la configuración sea correcta.

Creamos los directorios necesarios:

mkdir -p /var/www/vhosts/nc.voidnull.es/{www,logs}

Activamos el espacio web y reiniciamos Nginx:

ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/nextcloud.conf
touch /var/www/vhosts/nc.voidnull.es/logs/{nextcloud.access,nextcloud.error}
systemctl restart nginx

Activamos SSL

Para SSL tendremos que seguir estas instrucciones para generar el certificado:

Cómo utilizar Certbot para configurar un SSL de Let’s Encrypt en GNU/Linux
Certbot es una maravillosa herramienta que puedes utilizar para generar un certificado SSL con Let’s Encrypt e instalarlo y configurar automáticamente en tu servidor web.

Actualizamos configuración Nginx

Una vez tenemos SSL, tenemos que ampliar la configuración de Nginx para que NextCloud funcione correctamente. Editaremos el fichero /etc/nginx/sites-enabled/nextcloud.conf y añadiremos lo siguiente arriba del todo:

upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/var/run/php/php8.1-fpm.sock;
}

Luego dentro de la configuración de server añadiremos lo siguiente para que quede exactamente así (con la configuración de certbot añadida en el paso anterior):

server {
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    server_name nc.voidnull.es;

    ssl_certificate /etc/letsencrypt/live/nc.voidnull.es/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/nc.voidnull.es/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    # HSTS settings
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;

    # set max upload size and increase upload timeout:
    client_max_body_size 512M;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Pagespeed is not supported by Nextcloud, so if your server is built
    # with the `ngx_pagespeed` module, uncomment this line to disable it.
    #pagespeed off;

    # HTTP response headers borrowed from Nextcloud `.htaccess`
    add_header Referrer-Policy                      "no-referrer"   always;
    add_header X-Content-Type-Options               "nosniff"       always;
    add_header X-Download-Options                   "noopen"        always;
    add_header X-Frame-Options                      "SAMEORIGIN"    always;
    add_header X-Permitted-Cross-Domain-Policies    "none"          always;
    add_header X-Robots-Tag                         "none"          always;
    add_header X-XSS-Protection                     "1; mode=block" always;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to the root of your installation
    root /var/www/vhosts/nc.voidnull.es/www;

    # Specify how to handle directories -- specifying `/index.php$request_uri`
    # here as the fallback means that Nginx always exhibits the desired behaviour
    # when a client requests a path that corresponds to a directory that exists
    # on the server. In particular, if that directory contains an index.php file,
    # that file is correctly served; if it doesn't, then the request is passed to
    # the front-end controller. This consistent behaviour means that we don't need
    # to specify custom rules for certain paths (e.g. images and other assets,
    # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
    # `try_files $uri $uri/ /index.php$request_uri`
    # always provides the desired behaviour.
    index index.php index.html /index.php$request_uri;

    # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

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

    # Make a regex exception for `/.well-known` so that clients can still
    # access it despite the existence of the regex rule
    # `location ~ /(\.|autotest|...)` which would otherwise handle requests
    # for `/.well-known`.
    location ^~ /.well-known {
        # The rules in this block are an adaptation of the rules
        # in `.htaccess` that concern `/.well-known`.

        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }

        # Let Nextcloud's API for `/.well-known` URIs handle all other
        # requests by passing them to the front-end controller.
        return 301 /index.php$request_uri;
    }

    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }

    # Ensure this block, which passes PHP files to the PHP process, is above the blocks
    # which handle static assets (as seen below). If this block is not declared first,
    # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
    # to the URI, resulting in a HTTP 500 error response.
    location ~ \.php(?:$|/) {
        # Required for legacy support
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets

        location ~ \.wasm$ {
            default_type application/wasm;
        }
    }

    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }

    # Rule borrowed from `.htaccess`
    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}
📢
Recuerda de cambiar nc.voidnull.es por tu dominio para que la configuración sea correcta.

Instalación de NextCloud

Ahora viene lo interesante de todo esto. Tendremos que descargar la última versión de NextCloud y crear una base de datos para que funcione. Por otro lado continuaremos con la instalación mediante el navegador.

Descargar NextCloud y configurar permisos

Lo primero que haremos será descargarnos la última versión de NextCloud dentro de la ruta de nuestra web:

cd /var/www/html/vhost/nc.voidnull.es/www/
wget https://download.nextcloud.com/server/releases/latest.zip

Y descomprimimos el fichero latest.zip:

unzip latest.zip

Movemos los ficheros y eliminamos directorio:

mv nextcloud/* . && mv nextcloud/.* . && rm -rf netxcloud && rm latest.zip

Cambiamos permisos:

chown -R www-data:www-data .*

Creación de la base de datos

Lo siguiente será crear la base de datos y el usuario, para ello nos iniciamos sesión en MariaDB:

mysql -u root -p

Creamos la base de datos con esto:

CREATE DATABASE nextcloud;
CREATE USER 'ncuser'@'localhost' IDENTIFIED BY 'ncpassword';
GRANT ALL PRIVILEGES ON nextcloud . * TO 'ncuser'@'localhost';

Instalación de NextCloud

Abre tu navegador favorito y pon la URL que has configurado para acceder a NextCloud y así iniciar la instalación. Si no has creado un puntero antes, tendrás que esperar a que se propague el DNS.

Aquí tendremos que configurar un nombre de usuario para la cuenta administrador así como una contraseña segura. También tendrás que configurar una ruta donde se guardarán los datos que se suban de en la nube. Este directorio es donde van todos los ficheros, yo recomiendo ponerlo fuera de la ruta de la web para evitar problemas. Así que lo que haremos será crear un usuario y dentro de ese usuario crearemos un directorio:

useradd -m -d /bin/nologin nextcloud

Creamos directorio y cambiamos permisos:

mkdir -p /home/nextcloud/cloud
chown www-data.nextcloud -R /home/nextcloud

Hecho esta parte, configuramos la base de datos. Tendremos que rellenar los datos y finalmente hacer clic en Completar la instalación.

Si es todo correcto, iniciará la instalación y obtendremos la siguiente imagen una vez finalice:

Configuración de NextCloud

Ahora mismo ya tenemos un NextCloud funcional y que se puede utilizar, pero hay una configuración muy recomendable e interesante para hacer a NextCloud y eso mismo vamos a explicar. Para empezar, si vamos a Configuración > Ajustes Básicos veremos que nos aparecen varios errores que podemos corregir con esta configuración:

Configuración de la memoria caché

Al principio hemos instalado Redis pero no lo hemos configurado. Para ello editaremos el fichero /etc/redis/redis.conf y tenemos que buscar el parámetro port 6379 y lo cambiamos por port 0. Buscaremos la siguiente línea unixsocket /var/run/redis/redis.sock y la descomentaremos. Debajo de esa línea nos encontraremos con unixsocketperm 700 el cual también descomentaremos y cambiaremos por unixsocketperm 770. Guardamos y salimos.

Añadimos el usuario redis al grupo de Apache:

usermod -a -G redis www-data

Finalmente, reiniciamos los servicios de Apache y Redis:

systemctl restart nginx
systemctl enable redis-server
systemctl restart redis-server

Hecho esto, tendremos que configurar NextCloud para que use Redis, para ello tendremos que modificar el fichero de configuración de NextCloud que se encuentra en /var/www/html/vhost/nc.voidnull.es/www/config/config.php.

Añadiremos lo siguiente:

'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'filelocking.enabled' => 'true',
'redis' =>
  array (
    'host' => '127.0.0.1',
    'port' => 6379,
    'timeout' => 0.0,
  ),

Es posible que sea necesario reiniciar el servidor para que esto empiece a funcionar correctamente, así que una vez guardado esto, reiniciamos el servidor.

Configurar OPcache de PHP

Desde Nextcloud 12, se requiere una configuración adicional para configurar correctamente Opcache de PHP. Se muestra el error «La OPcache de PHP no está bien configurada. Para mejorar el rendimiento se recomienda usar las siguientes configuraciones en el php.ini«. Para ello tendremos que editar el fichero /etc/php/8.1/fpm/php.ini.

Al final del fichero añadimos lo siguiente:

; Nextcloud Opcache settings
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Y reiniciamos PHP-FPM:

systemctl restart php8.1-fpm

Carga máxima de ficheros

Generalmente, hasta que no carguemos algún fichero grande no nos daremos cuenta de este «problema». Por defecto PHP se configura con una limitación de carga de archivos de unos 2MB. Como estamos instalando una nube personal que puede contener archivos de un tamaño de gigabytes, podemos cambiar la configuración de PHP para permitir mucha más flexibilidad.

Para ello modificaremos el fichero /etc/php/8.1/fpm/php.ini y modifcaremos los parámetros upload_max_filesize y post_max_size y les pondremos el valor de 2048M. Finalmente, reiniciaremos PHP-FPM para que surja efecto.

Enlaces amigables

Otra cosa interesante es configurar enlaces amigables para que las URL’s sean visualmente más facil de recordar o más «simpáticas» -quería decir bonitas, pero no me parecen bonitas unas URL’s-. Tras esta pequeña broma sin sentido, lo que haremos será modificar el fichero de configuración de NextCloud /var/www/html/vhost/nc.voidnull.es/www/config/config.php y añadimos lo siguiente:

'htaccess.RewriteBase' => '/',

Y si reiniciamos el servicio del Nginx veremos que de las URL nc.voidnull.es/index.php/apps/gallery pasaremos a nc.voidnull.es/apps/gallery.

Conclusión

Y con todo esto tendríamos nuestra nube personal en nuestro servidor. Desde hace varios años que estoy usando NextCloud y podría decir que es de lo mejor que tenemos en el mundo del Software Libre. Lo utilizo para todo, para tener mis ficheros -antes lo usaba mucho para clase-, también tengo mis calendarios, mis contactos -con los que podéis sincronizar en Android con DavDroid- también tengo mi nube federada con otras nubes de amigos. Es una locura todo lo que se puede hacer, yo recomiendo investigar.

No puedo acabar este artículo sin mencionar que es importante repasar la documentación que tienen los de NextCloud en su web. Si algo de este tutorial no funciona, porque han cambiado algo y no me ha dado tiempo de actualizar, en la documentación deberías e estar la respuesta.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación