Instalación de Nextcloud 23 en Ubuntu 20.04 con LEMP + SSL

NOTA: Durante la creación del video tutorial de esta entrada, cambio la versión de Nextcloud a 23.0.2, presta atención al video para realizar una correcta instalación basada en la última versión disponible.

Hola colegas de Networld, en la entrada de hoy vamos a ver como instalarnos nuestra propia nube personal o corporativa usando Nextcloud en su versión 23.0.0. La instalación la estaremos realizando sobre Ubuntu 20.04 con Nginx, PHP7.4-FPM y MariaDB. Además vamos a usar un certificado autofirmado, he optado por esta opción porque la mayoría de ustedes no cuentan con dominio propio así que se les hace imposible generar un certificado válido, pero sepan que al final la configuración del host virtual en Nginx es igual para ambos casos.

Como nota adicional una de las metas que me he propuesto traerles a ustedes es lograr la palomita verde en el chequeo o verificación de seguridad de Nextcloud, veamos como nos va.

Datos de interés:

Necesitamos un servidor DNS funcionando en nuestra red, que apunte la url cloud.networld.cu hacia la ip donde estará corriendo Nginx en este caso, 10.10.20.4.

Necesitamos una instalación limpia de Ubuntu 20.04.

Dominio: cloud.networld.cu

Dirección IP: 10.10.20.4

//Lo primero es cerciorarnos de que tenemos nuestro sistema actualizado:

# sudo apt update
# sudo apt upgrade

//Aunque podemos usar nuestro tutorial de implementación de LEMP en Ubuntu 20.04, debido a la complejidad de Nextcloud haremos el proceso desde el principio.

//Nos instalamos Nginx:

# sudo apt install nginx

//Ahora vamos a instalar nuestro servidor de BD:

# sudo apt install mariadb-server mariadb-client

//Una vez terminado el proceso, procedemos a configurar nuestro password de root:

# sudo mysql_secure_installation

//Vamos a instalar php y sus componentes necesarios para Nextcloud:

# sudo apt install php-imagick php7.4-common php7.4-mysql php7.4-fpm php7.4-gd php7.4-json php7.4-curl  php7.4-zip php7.4-xml php7.4-mbstring php7.4-bz2 php7.4-intl php7.4-bcmath php7.4-gmp php7.4-cli imagemagick

//Debemos editar la configuración de php para mejorar el funcionamiento de Nextcloud:

# sudo nano /etc/php/7.4/fpm/php.ini

//Los parámetros a editar son:

memory_limit = 512M
cgi.fixpathinfo = 0
upload_max_filesize = 1024M
max_execution_time = 300

//Deben ir navegando por las líneas del archivo para buscar las opciones:

memory_limit = 512M establece el límite de memoria que puede usar php, Nextcloud recomienda un mínimo de 512.

upload_max_filesize = 1024M Esta línea queda a decisión de ustedes y establece el tamaño de archivos permitidos que se puede subir a Nextcloud.

max_execution_time = 300 Esta posiblemente es una de las líneas más importantes, por defecto viene en 30, pero debemos poner 300, y esto es el tiempo máximo de ejecución de código, un valor bajo o por defecto por ejemplo no dejará que instales Nextcloud, pues el proceso de instalación necesita por lo menos un valor de 300 para completarse.

//Dentro del mismo archivo vamos a ajustar los parámetros de OPCache, casi al final del archivo, buscamos las siguientes líneas y las descomentamos y configuramos según les muestro:

opcache.enable=1
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

//Comprobamos el estado de php y lo activamos:

# sudo systemctl status php7.4-fpm
# sudo systemctl is-enabled php7.4-fpm

//Tenemos que configurar algunas variables:

# sudo nano /etc/php/7.4/fpm/pool.d/www.conf

//Buscamos y descomentamos las siguientes líneas:

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

//Reiniciamos el servicio de php:

# sudo systemctl restart php7.4-fpm

//Haremos un pequeño ajuste el el hostvirtual por defecto de Nginx para poner en funcionamiento el phpMyAdmin, si no vas a usar phpMyAdmin, esto está de más:

# sudo nano /etc/nginx/sites-available/default
location ~ \\.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

//Agregamos también en la línea index

index.php

//Comprobamos si esta correcta la configuración de Nginx y lo reiniciamos:

# sudo nginx -t
# sudo systemctl reload nginx

//Estamos listos para instalar phpMyAdmin.

# sudo apt install phpmyadmin

//Durante la instalación se mostrará el siguiente mensaje en el cual vamos a presionar ESC ya que nuestro servidor Web Nginx no está listado:

\"\"

//Luego nos pedirá confirmación para que el asistente instale la base de datos de phpMyAdmin, damos en Yes:

\"\"

//Nos pedirá una contraseña para la base de datos de phpMyAdmin, escojamos una segura y continuamos.

\"\"

//Creamos enlace simbólico ya que phpMyAdmin se nos instala en un directorio diferente a nuestro directorio raíz de Nginx:

# sudo ln -s  /usr/share/phpmyadmin /var/www/html/phpmyadmin

//Asignamos permisos y propiedad:

$ sudo chmod 775 -R /usr/share/phpmyadmin/
$ sudo chown root:www-data -R /usr/share/phpmyadmin/

//Recordemos que no tenemos privilegios en el usuario phpmyadmin para crear usuarios ni bases de datos, así que vamos a asignarle esos privilegios, también puedes crear un nuevo usuario y hacer lo mismo. (No puedes usar el usuario root para acceder desde phpMyAdmin).

# sudo mysql -u root -p
# GRANT ALL PRIVILEGES ON *.* TO \'phpmyadmin\'@\'localhost\' WITH GRANT OPTION;
# FLUSH PRIVILEGES;
# exit;

//Ya podemos acceder a phpMyAdmin mediante http://10.10.20.4/phpmyadmin y crear la base de datos de nextcloud y un usuario con privilegios sobre esa base de datos.

//Es hora de descargar el paquete de Nextcloud:

# wget https://download.nextcloud.com/server/releases/nextcloud-23.0.0.zip

//Instalamos unzip y procedemos a descomprimir Nextcloud en el directorio raíz de Nginx:

//En el momento de este tutorial, la última versión estable es la 23.0.0, comprobar si es la última cuando hagas el procedimiento.

# sudo apt install unzip
# sudo unzip nextcloud-23.0.0.zip -d /var/www/

//Tomamos posesión del directorio y archivos:

# sudo chown www-data:www-data /var/www/nextcloud/ -R

//Vamos a crear el archivo de vhost para Nextcloud en Nginx (Un detalle importante, no reiniciar Nginx ni acceder a la url de Nextcloud, pues este archivo vhost contiene líneas que aún no hemos configurado):

# sudo nano /etc/nginx/conf.d/nextcloud.conf
server {
    listen 80;
    listen [::]:80;
    server_name cloud.networld.cu;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.networld.cu;
    include snippets/nextcloud.conf;
    include snippets/ssl-params.conf;

    # 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-Permitted-Cross-Domain-Policies    \"none\"          always;
    add_header X-Robots-Tag                         \"none\"          always;
    add_header X-XSS-Protection                     \"1; mode=block\" always;
    add_header Strict-Transport-Security \"max-age=15768000; includeSubDomains; preload;\" always;

    #I found this header is needed on Ubuntu, but not on Arch Linux. 
    add_header X-Frame-Options \"SAMEORIGIN\";

    # Path to the root of your installation
    root /var/www/nextcloud/;

    access_log /var/log/nginx/nextcloud.access;
    error_log /var/log/nginx/nextcloud.error;

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


    location = /.well-known/webfinger {
    return 301 $scheme://$host/index.php/.well-known/webfinger;
    }
    location = /.well-known/nodeinfo {
    return 301 $scheme://$host/index.php/.well-known/nodeinfo;
    }

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

    location ~ /.well-known/acme-challenge {
      allow all;
    }    

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
       rewrite ^ /index.php;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
       deny all;
    }
    location ~ ^/(?:\\.|autotest|occ|issue|indie|db_|console) {
       deny all;
     }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\\.php(?:$|/) {
       include fastcgi_params;
       fastcgi_split_path_info ^(.+\\.php)(/.*)$;
       try_files $fastcgi_script_name =404;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       #Avoid sending the security headers twice
       fastcgi_param modHeadersAvailable true;
       fastcgi_param front_controller_active true;
       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
       fastcgi_intercept_errors on;
       fastcgi_request_buffering off;
       fastcgi_read_timeout 300;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
       try_files $uri/ =404;
       index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~* \\.(?:css|js)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control \"public, max-age=7200\";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        add_header X-Content-Type-Options nosniff;
        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 Referrer-Policy no-referrer;
        # Optional: Don\'t log access to assets
        access_log off;
   }

   location ~* \\.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don\'t log access to other assets
        access_log off;
   }
 }

//UNA VEZ MÁS, ES IMPORTANTE NO RECARGAR O REINICIAR EL SERVICIO DE NGINX NI ACCEDER A LA URL DE NEXTCLOUD http://cloud.networld.cu (aún faltan pasos)

//Modificar las líneas para ajustar a tus propiedades:

//Modificar según su dominio:
server_name cloud.networld.cu;

//Vamos a crear nuestro certificado:

# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-nextcloud.key -out /etc/ssl/certs/nginx-nextcloud.crt

//Debemos llenar los datos que nos pide, modificar a sus propiedades:

Country Name (2 letter code) [AU]:CU
State or Province Name (full name) [Some-State]:Mayabeque
Locality Name (eg, city) []:Santa Cruz del Norte
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NETWORLD
Organizational Unit Name (eg, section) []:Redes y Internet
Common Name (e.g. server FQDN or YOUR name) []:cloud.networld.cu
Email Address []:admin@networld.cu

//Generamos el archivo pem para el ejemplo con un tamaño de 2048 más que suficiente:

# sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

//Configurar Nginx para usar los archivos generados:

# sudo nano /etc/nginx/snippets/nextcloud.conf
ssl_certificate /etc/ssl/certs/nginx-nextcloud.crt;
ssl_certificate_key /etc/ssl/private/nginx-nextcloud.key;
# sudo nano /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\";
# add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection \"1; mode=block\";

//Comprobamos que todo este correcto y reiniciamos Nginx:

# sudo nginx -t
# sudo systemctl restart nginx

//Hasta aquí ya podemos proceder con la instalación de Nextcloud, asi que accedemos a la utl: https://cloud.networld.cu aceptamos la advertencia del certificado y continuamos llenando los datos que nos pide Nextcloud.

//Agregar código del país:

# sudo nano /var/www/nextcloud/config/config.php
\'default_phone_region\' => \'CU\',

//Configurando la cache para Nextcloud:

# sudo apt install redis-server

//Comprobamos la versión instalada de Redis:

# redis-server -v
En mi caso me devuelve:
Redis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=636cde3b5c7a3923

//Veamos el estado, iniciamos y activamos para el inicio:

# systemctl status redis
# sudo systemctl start redis-server
# sudo systemctl enable redis-server

//Instalamos el paquete redis para php:

# sudo apt install php-redis

//Ejecutamos lo siguiente para ver si ya está activado el nuevo módulo:

# php --ri redis

//Si por casualidad nos muestra disable, ejecutamos:

# sudo phpenmod redis

//Agregar la configuración de cache para Nextcloud:

# sudo nano /var/www/nextcloud/config/config.php
\'memcache.distributed\' => \'\\OC\\Memcache\\Redis\',
\'memcache.local\' => \'\\OC\\Memcache\\Redis\',
\'memcache.locking\' => \'\\OC\\Memcache\\Redis\',
\'redis\' => array(
     \'host\' => \'localhost\',
     \'port\' => 6379,
     ),

//Ya contamos con nuestro Nextcloud, listo para configurarlo y adaptarlo a nuestras necesidades.

//Para el tutorial me base en mis propios videos sobre Nextcloud que están en el canal, algo de experiencia y mucha ayuda de la siguiente entrada la cual pueden consultar si presentan otro tipo de error o advertencia, además de que encontrarán más info para ajustar más las configuraciones:

Deja un comentario

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

Scroll al inicio