Cómo instalar y configurar Nextcloud en Fedora 32

Nextcloud es un software de código abierto para almacenar y sincronizar tus datos en varios dispositivos. Puedes considerarlo como tu propio clon de Dropbox. Pero además de almacenar archivos, también ofrece funciones adicionales como Calendario, Contactos, Tareas programadas, transmisión de medios, etc.

Nextcloud proporciona aplicaciones para Windows, Linux, MacOS y aplicaciones móviles para Android e iOS que puedes utilizar para sincronizar archivos entre tus distintos dispositivos.

En este tutorial, aprenderemos a instalar y configurar Nextcloud en un servidor basado en Fedora 32. También instalaremos el servidor web Nginx junto con PHP 7.4 y MariaDB

Requisitos previos

  • Un servidor con Fedora 32.

  • Un usuario sudo no root.

  • Asegúrate de que todo está actualizado.

    $ sudo dnf update
    
  • Paquetes esenciales.

    $ sudo dnf install wget curl bzip2 nano unzip policycoreutils-python-utils -y
    

    Algunos de estos paquetes pueden estar ya en tu sistema.

Configurar el cortafuegos

El primer paso es configurar el cortafuegos. El servidor Fedora viene con el cortafuegos Firewalld preinstalado.

Comprueba si el cortafuegos se está ejecutando.

$ sudo firewall-cmd --state
running

Comprueba los servicios/puertos permitidos actualmente.

$ sudo firewall-cmd --permanent --list-services

Debería mostrar la siguiente salida.

dhcpv6-client mdns ssh

Permite los puertos HTTP y HTTPS.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Vuelve a comprobar el estado del cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Deberías ver una salida similar.

dhcpv6-client http https mdns ssh

Vuelve a cargar el cortafuegos.

$ sudo systemctl reload firewalld

Instala PHP

Fedora 32 viene por defecto con PHP 7.4 pero para tener un repositorio de PHP actualizado, añadiremos el repositorio REMI.

Instala el repositorio REMI que es el repositorio oficial de Fedora para instalar paquetes PHP.

$ sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm

Activa el repositorio remi y desactiva el repositorio remi-modular. Esto habilita el repositorio necesario para instalar los paquetes de PHP 7.4.

$ sudo dnf config-manager --set-enabled remi
$ sudo dnf config-manager --set-disabled remi-modular

Instala PHP 7.4 junto con algunos paquetes adicionales.

$ sudo dnf install php-fpm php-cli php-gd php-mbstring php-intl php-mysqlnd php-imagick php-zip php-json php-process php-xml php-bcmath php-gmp php-ftp php-smbclient php-opcache

Comprueba si PHP funciona correctamente.

$ php --version
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies

Configurar PHP

Abre el archivo /etc/php-fpm.d/www.conf.

$ sudo nano /etc/php-fpm.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=apache y group=apache en el archivo y cámbialas por nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

Descomenta las variables de entorno de PHP que aparecen a continuación.

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

Descomenta la configuración de opcache en la última línea.

php_value[opcache.file_cache] = /var/lib/php/opcache

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Ahora edita la configuración de PHP opcache /etc/php.d/10-opcache.ini.

$ sudo nano /etc/php.d/10-opcache.ini

Cambia la configuración como se indica a continuación.

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

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Ejecuta los siguientes comandos para aumentar los límites de carga de archivos y de memoria para PHP.

$ sudo cp /etc/php.ini /etc/php.ini.bak
$ sudo sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php.ini
$ sudo sed -i "s/post_max_size = 8M/post_max_size = 100M/" /etc/php.ini
$ sudo sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 100M/" /etc/php.ini

Por defecto, hay 3 archivos en el directorio /var/lib/php/ cuyo propietario de grupo está establecido en apache, pero estamos utilizando Nginx. Así que tenemos que dar al usuario nginx permisos de lectura y escritura en los 3 directorios con setfacl.

$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/opcache/
$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/session/
$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/wsdlcache/

Habilita e inicia el proceso php-fpm.

$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

Instalar Nginx

Fedora 32 incluye por defecto la última versión estable de Nginx.

Instala Nginx.

$ sudo dnf install nginx -y

Comprueba que funciona correctamente.

$ nginx -v
nginx version: nginx/1.18.0

Inicia y activa Nginx.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Abre la dirección IP de tu servidor en un navegador para ver la siguiente página. Esto significa que Nginx está funcionando correctamente.

Página de Fedora Default Nginx

Instala MariaDB

MariaDB es un sustituto directo de MySQL, lo que significa que los comandos para ejecutar y operar MariaDB son los mismos que los de MySQL.

Fedora 32 incluye por defecto MariaDB 10.4, que es el que vamos a utilizar.

Instala el servidor MariaDB.

$ sudo dnf install mariadb-server

Comprueba si MariaDB se ha instalado correctamente.

$ mysql --version
mysql  Ver 15.1 Distrib 10.4.14-MariaDB, for Linux (x86_64) using  EditLine wrapper

Activa e inicia el servicio MariaDB.

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

Ejecuta el siguiente comando para realizar la configuración por defecto, como dar una contraseña de root, eliminar los usuarios anónimos, no permitir el inicio de sesión de root de forma remota y eliminar las tablas de prueba.

$ sudo mysql_secure_installation

Al pulsar Intro se elige la opción por defecto (la que está en mayúsculas, Y en este caso).

Enter current password for root (enter for none): [PRESS ENTER]
Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Change the root password? [Y/n] [ANSWER n]
Remove anonymous users? [Y/n] [PRESS ENTER]
Disallow root login remotely? [Y/n] [PRESS ENTER]
Remove test database and access to it? [Y/n] [PRESS ENTER]
Reload privilege tables now? [Y/n] [PRESS ENTER]

Eso es todo. La próxima vez que quieras acceder a MySQL, utiliza el siguiente comando

$ sudo mysql

Introduce tu contraseña de root cuando se te pida.

Configurar MariaDB

Introduce el siguiente comando para entrar en el shell de MySQL.

$ sudo mysql

Crea un usuario MySQL para manejar la base de datos NextCloud.

mysql> CREATE USER 'nextuser'@'localhost' IDENTIFIED BY 'yourpassword';

Crea la base de datos NextCloud.

mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Concede todos los privilegios a la base de datos Nextcloud al usuario que hemos creado.

mysql> GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextuser'@'localhost';

Salir de la shell de MySQL.

mysql> exit

Descargar Nextcloud

Es hora de descargar y configurar las carpetas de Nextcloud.

$ wget https://download.nextcloud.com/server/releases/latest.tar.bz2
$ tar -jxvf latest.tar.bz2
$ sudo mv nextcloud /var/www/html/

A continuación, tenemos que crear una carpeta de datos.

$ sudo mkdir /var/www/html/nextcloud/data
$ sudo chown -R nginx:nginx /var/www/html/nextcloud

Instalar SSL

Instalaremos el SSL utilizando el servicio Let's Encrypt.

Para ello, instala Certbot.

$ sudo dnf install certbot

Detén Nginx porque interferirá con el proceso de Certbot.

$ sudo systemctl stop nginx

Genera el certificado. También creamos un certificado DHParams.

$ export LDOMAIN="nextcloud.example.com"
$ export LEMAIL="[email protected]"
$ sudo certbot certonly --standalone -d $LDOMAIN --preferred-challenges http --agree-tos -n -m $LEMAIL --keep-until-expiring 
$ sudo systemctl start nginx
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

También necesitamos configurar una tarea cron para renovar el SSL automáticamente. Para abrir el editor crontab, ejecuta el siguiente comando

$ sudo EDITOR=nano crontab -e

El comando anterior abre Crontab con el editor Nano en lugar del editor Vim por defecto.

Pega la siguiente línea en la parte inferior.

25 2 * * * /usr/bin/certbot renew --quiet --pre-hook “systemctl stop nginx” --post-hook “systemctl start nginx”

La tarea cron anterior ejecutará certbot a las 2:25 de la madrugada todos los días. Puedes cambiarlo por lo que quieras.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Configurar SELinux/Permisos

Es necesario configurar SELinux para que Nextcloud funcione en Fedora. Introduce los siguientes comandos para la configuración básica de SELinux que debería funcionar para todos.

Asegúrate de ajustar las rutas de los archivos si son diferentes en tu caso.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/data(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/apps(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.user.ini'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

$ sudo restorecon -Rv '/var/www/html/nextcloud/'

Para habilitar las actualizaciones a través de la interfaz web de Nextcloud, ejecuta también el siguiente comando.

$ sudo setsebool -P httpd_unified on

Configurar Nginx para Nextcloud

A continuación, tenemos que configurar Nginx para alojar Nextcloud.

Para nuestro propósito, Nextcloud se alojará en el dominio http://nextcloud.example.com,

Configura los directorios donde vivirán los bloques del servidor.

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf	

Pega las siguientes líneas después de la línea include /etc/nginx/conf.d/*.conf

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Crea el archivo /etc/nginx/sites-available/nextcloud.conf utilizando el editor Nano.

$ sudo nano /etc/nginx/sites-available/nextcloud.conf

Pega el siguiente código en el editor. Asegúrate de sustituir el dominio de ejemplo por tu dominio real antes de pegarlo.

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

server {
    listen 80;
    listen [::]:80;
    server_name nextcloud.example.com;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name nextcloud.example.com;
	
	access_log /var/log/nginx/nextcloud.access.log;
    error_log /var/log/nginx/nextcloud.error.log;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # NOTE: some settings below might be redundant
    ssl_certificate /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nextcloud.example.com/privkey.pem;
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
	ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
    #
    # 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 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/html/nextcloud;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

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

    # set max upload size
    client_max_body_size 100M;
    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/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;

    # 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\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
        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;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js, css and map files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        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;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida que guardes el archivo.

Activa este archivo de configuración vinculándolo al directorio sites-enabled.

$ sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/

Prueba la configuración de Nginx.

$ sudo nginx -t

Recarga el servicio Nginx si todo está bien.

$ sudo systemctl reload nginx

Instalar Nextcloud

Hay dos formas de configurar Nextcloud: mediante la línea de comandos o mediante la interfaz gráfica. Nosotros optaremos por el método de la línea de comandos.

Entra en el directorio de Nextcloud.

$ cd /var/www/html/nextcloud

Ejecuta el siguiente comando para instalar Nextcloud.

$ sudo -u nginx php occ  maintenance:install --database "mysql" --database-name "nextcloud"  --database-user "nextuser" --database-pass "yourpassword" --admin-user "admin" --admin-pass "password"

Este comando se ejecuta como usuario nginx porque tiene permisos de escritura en la carpeta Nextcloud.

A continuación, tenemos que añadir nuestro dominio a la lista de dominios de confianza. Abre el archivo /var/www/html/nextcloud/config/config.php.

$ sudo nano config/config.php

Cambia el valor de la variable trusted_domains añadiendo la dirección IP de tu servidor y tu dominio Nextcloud nextcloud.example.com para que puedas acceder a tu instalación desde tu dominio.

'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '167.172.35.56',
    2 => 'nextcloud.example.com',
  ),

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida que guardes el archivo.

Inicia tu instalación de Nextcloud abriendo https://nextcloud.example.com en tu navegador y verás la siguiente pantalla.

Página de inicio de sesión de Nextcloud

Introduce tus datos de acceso a la administración. Desplázate a través de los banners introductorios de Nextcloud, establece tu ubicación y estado del tiempo y elige un fondo de pantalla y, una vez que hayas terminado, deberías ser recibido con una pantalla similar.

Página de Nextcloud

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de Nextcloud en un servidor Fedora 32. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...