Portada! Tutorial - Instalar Nextcloud en RedHat/CentOS 8 y derivados

VittokoX

kernelpanic fanboy
Miembro del Equipo
MOD
Nextcloud_Logo.png

Hola Foreros todos, bienvenidos!.
Hace ya bastante tiempo que vengo utilizando Owncloud y posteriormente Nextcloud como nube privada, así que creo buena ocasión (ahora que tuve que reinstalar el sistema operativo de mi servidor casero) mostrarles cómo se deja andando este bicho :zippy
Partamos indicando que Nextcloud actualmente es uno de los líderes en almacenamiento en nubes privadas, contando con amplia documentación y soporte pagado si se contrata empresarialmente donde te pueden ayudar con todas tus dudas.
Como en capa9 amamos Linux y el software opensource es que el día de hoy procederemos a despejar ese manto de dudas con respecto a la instalación de Nextcloud de forma profesional (es decir, sin bajar el firewall y SELinux :risas) y -si dispondes de un dominio ya comprado- poder acceder a él mediante una URL desde internet, porque de qué nos sirve una nube privada si no vamos a poder acceder desde fuera de nuestra casa?.

Partimos!

Los materiales que vamos a utilizar el día de hoy son:
  • Un servidor con sistema operativo RHEL 8.x o compatible (CentOS 8, Oracle Linux 8, etc) y acceso vía SSH a él
  • Conexión a Internet
  • Tiempo :zippy
Bueno, partamos con lo básico, instalar el repositorio de Extra Packages for Enterprise Linux (EPEL).
Código:
dnf y install epel-release
Procedemos a instalar también el repositorio de Remi, que dispone de PHP y sus librerías para facilitarnos el proceso.
Código:
dnf install -y  http://rpms.remirepo.net/enterprise/remi-release-8.rpm

Ahora habilitamos el modulo de remi para php 7.4
Código:
dnf module install -y php:remi-7.4

Ahora procedemos a instalar el mejor servidor web :zippytey todo el ecosistema de LAMP
Código:
dnf install -y php-mysqlnd php-fpm mariadb-server httpd
Damos permisos de firewall para el servidor web
Código:
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload
Configuramos los servicios de servidor web y base de datos para arrancar automáticamente
Código:
systemctl enable --now mariadb httpd

Accediendo a la IP de nuestro servidor con cualquier navegador deberíamos ver la pantalla de bienvenida
20210310-3.png


Ahora debemos realizar el "cierre" de la base de datos, estableciendo una contraseña para el usuario root de la DB, entre otras cosas.
Utilizamos el comando mysql_secure_installation
Lo primero que hará será pedirnos la contraseña del root de la DB, pero como es primera vez que usamos la Base de datos esta no existe, por lo que presionamos enter -es decir, le indicamos al sistema que la password está en blanco-.
Código:
[[email protected] ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Enter current password for root (enter for none):
Seguimos... En esta preguntará si deseamos configurar un password para root (ojo que este root es el superusuario de la base de datos, no del sistema operativo).
Código:
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
Esta parte es para remover los usuarios anonimos, habilitar las conexiones con root solo desde localhost y eliminar las base de datos de test que viene incluida por defecto.
Código:
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Vamos a probar que la instalación de PHP se integró sin problemas con nuestro webserver.
Para ello vamos a crear un archivo info.php para que PHP nos muestre datos
Código:
vim /var/www/html/info.php
presionamos "i" para entrar al modo de inserción y escribimos:
<?php phpinfo();?>
Luego presionamos la tecla "Esc" y posteriormente ":wq" para write and quit (guardar y cerrar) en vim.

Cambiamos propietario al usuario apache y restauramos el contexto de seguridad SELinux.
Código:
chown -Rv apache:apache /var/www/html/*
chcon -t httpd_sys_rw_content_t /var/www/html/ -Rv
Ahora a probar si php muestra información accediendo vía web
Screenshot-from-2021-04-29-15-42-16.png


Sin problemas. Entonces procedemos a instalar las librerías de php necesarias que utiliza Nextcloud
Código:
dnf install -y php-gd php-mbstring php-intl php-pecl-apcu php-mysqlnd php-opcache php-json php-zip php-process php-bcmath php-gmp php-imagick

Procedemos a entrar a MariaDB para crear el usuario y la contraseña que utilizará el ambiente.
Los datos serán:
Base de datos: dbnextcloud
Usuario: ncadmin
password:
macoy123

Entramos con
mysql -u root -p
Luego las siguientes sentencias SQL
Código:
CREATE USER 'ncadmin'@'localhost' IDENTIFIED BY 'macoy123';
CREATE DATABASE dbnextcloud;
GRANT ALL PRIVILEGES ON dbnextcloud.* TO 'ncadmin'@'localhost';
FLUSH PRIVILEGES;
quit

Con los pasos anteriores tenemos lo necesario para comenzar con el proceso de deploy de Nextcloud.
Lo primero será instalar wget y unzip
Código:
dnf -y install wget unzip
Posteriormente descargamos la versión de nextcloud 20 desde su repositorio.
Código:
wget https://download.nextcloud.com/server/releases/latest-20.zip
Ahora moveremos el archivo comprimido donde residirá la instalación de Nextcloud. En mi caso será /var/www pero ustedes pueden hacerlo con algún otro directorio.
Código:
mv latest-20.zip /var/www/ -vf
Nos cambiamos a ese directorio y procedemos a descomprimir
Código:
cd /var/www/
unzip latest-20.zip
Creamos la carpeta que va a contener los datos de nuestra nube. Como soy muy original y creativo, la llamaré "data"
Código:
mkdir /var/www/nextcloud/data
Cambiamos el propietario de la carpeta para que sea apache quien administre
Código:
chown -R apache.apache /var/www/nextcloud

Configuramos permisos de SELinux en sistema
Código:
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

Ahora aplicamos esos permisos a las carpetas
Código:
restorecon -Rv /var/www/nextcloud/

Permisos de Selinux para que Apache pueda conectarse a la DB y a la red
Código:
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db on

Ahora pasamos a la parte de configurar php para que funcione correctamente con Nextcloud.
Primero, editamos /etc/php.ini y buscamos los siguientes parámetros
Código:
upload_max_filesize = 1G
memory_limit = 1024M

Configurar opcache en /etc/php.d/10-opcache.ini
Código:
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Configurar php-fpm en /etc/pgp-fpm.d/www.conf
Código:
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18

Reiniciamos php-fpm para que integre los cambios que aplicamos
Código:
systemctl restart php-pm
Todo listo con PHP y MySQL. Nos resta la configuración del virtualhost en Apache.
Para ello creamos un archivo en /etc/httpd/conf.d/00_nextcloud.conf y lo llenamos con lo siguiente
Código:
<VirtualHost *:80>
        ServerName      nube.condorbinario.com
        ServerAlias     nube.condorbinario.com
        DocumentRoot    /var/www/nextcloud
</VirtualHost>

<Directory /var/www/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All
        <IfModule mod_dav.c>
        Dav off
        </IfModule>
</Directory>
Luego recargamos apache para que tome el nuevo archivo
Código:
systemctl reload httpd

Ahora procedemos con la instalación
Accedemos al sitio de nextcloud con cualquier navegador. La ip de mi servidor es 192.168.1.100
20210311-1.png

Una vez llenamos los datos de la cuenta de administración, clickeamos donde dice "Storage & Database" y se va a desplegar un formulario para llenar los datos de la conexión a la BD
20210311-2.png

Y presionamos "Finish Setup". Aparecerá esta pantalla y luego el menú donde muestra el avance de la instalación
20210311-3.png


20210311-4.png


Una vez finalizada la configuración, aparecemos en el panel de bienvenida y "home" de Nextcloud
20210311-5.png

20210311-6.png


Con eso finalizamos la instalación de nuestro servidor local de Nextcloud.

Pero tío VittokoX, y si quiero acceder desde internet?
Bueno, primero debemos contar con un dominio de nuestra propiedad e idealmente un servidor DNS (cualquier plan de hosting de esos de 5990 al año sirve para esos fines :zippy).
Primero creamos reglas en nuestro router para que redireccione tanto el tráfico del puerto 80 como el 443 hacia la IP local de nuestro servidor.
No ahondaré en detalles porque cada router es distinto pero pueden encontrarlo bajo el tema "virtual servers".
Luego escogemos el nombre FQDN que tendrá nuestro servidor. En mi caso lo llamaré nube.condorbinario.com :zippy

Una vez tenemos un DNS apuntando a nuestra IP pública, procedemos a apoyarnos en certbot para esos fines.
Primero lo instalamos
Código:
dnf install certbot -y
Posteriormente procedemos a pedir el wildcard del dominio
Código:
certbot certonly \
--manual --preferred-challenges=dns \
--email [email protected] \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos \
-d nube.condorbinario.com

Este procedimiento nos mostrará un tipo de registro TXT que deberemos registrar en el DNS de nuestro dominio condorbinario.com como un puntero llamado _acme-challenge
quedando así
1619667987235.png


Una vez ingresado ese código, esperamos 1 minuto y procedemos a presionar "enter" para que el motor de let's encrypt valide el dominio mediante la llave TXT que configuramos en nuestro hosting.
Debería aparecer algo similar a esto
Código:
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/condorbinario.comfullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/condorbinario.com/privkey.pem
   Your certificate will expire on 2021-06-10. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Este certificado tiene una validez de 3 meses, para que no se nos olvide, podemos crear un cronjob que se ejecute cada lunes a las 5am.
Para esto editamos /etc/crontab y escribimos
00 5 1 * * root /usr/bin/certbot renew

Instalamos mod_ssl para apache
Código:
dnf install mod_ssl -y
editamos el archivo de virtualhost que teníamos anteriormente
Código:
vim/etc/httpd/conf.d/00_nextcloud.conf
VirtualHost *:80>
        ServerName      nube.condorbinario.com
    ServerAlias    nube.condorbinario.com
        DocumentRoot    /var/www/nextcloud
        RewriteEngine on
    RewriteCond %{SERVER_NAME} =nube.condorbinario.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

<Directory /var/www/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All
        <IfModule mod_dav.c>
        Dav off
        </IfModule>
</Directory>

<VirtualHost *:443>
        ServerName              nube.condorbinario.com
    ServerAlias        nube.condorbinario.com
        DocumentRoot            /var/www/nextcloud
        SSLEngine               on
        SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
        SSLProtocol             All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder     On
        Header always set       Strict-Transport-Security "max-age=63072000;"
    SSLCertificateFile      /etc/letsencrypt/live/condorbinario.com/cert.pem
        SSLCertificateKeyFile   /etc/letsencrypt/live/condorbinario.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/condorbinario.com/chain.pem
        CustomLog           /var/log/httpd/access_nc.log common env=nc
    ErrorLog        /var/log/httpd/error_nc.log
</VirtualHost>
[code]

Editamos el archivo que le dice a Nextcloud qué URLs de conexión aceptará como seguras
Este archivo es /var/www/nextcloud/config/config.php y editamos la parte del array que se llama trusted_domains dejando solamente las URLs desde donde aceptaremos conexiones. En nuestro caso solo dejaremos nube.condorbinario.com, obviamente :zippy
[code]
  'trusted_domains' =>
  array (
    0 => 'nube.condorbinario.com',
  ),
[code]

Finalmente, recargamos apache para que tome los cambios
[code]systemctl reload httpd

y listo!
1619669153692.png
 
Última modificación:

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Buenísimo.

En tiempos de Teletrabajo y clases online, esta nube privada es una muy buena alternativa para compartir recursos en la red.

PD: Yo lo probé con integración a Active Directory de Microsoft y queda impeke.
 
Upvote 0

VittokoX

kernelpanic fanboy
Miembro del Equipo
MOD
Buenísimo.

En tiempos de Teletrabajo y clases online, esta nube privada es una muy buena alternativa para compartir recursos en la red.

PD: Yo lo probé con integración a Active Directory de Microsoft y queda impeke.
Excelente!, de hecho, es lo que uso para mantener archivos compartidos con mi pareja y mi hija, particularmente las cosas de su colegio y las de mutuo interés como las cuentas de la casa, planillas de proyecciones y las fotos familiares, obvio jajaja
 
Upvote 0

ranamaldita

mueranse
oie oie, como es eso que habilitaste el stream de php74 y te quedo instalado el 7.2 :p Nos engañaste con el SS o se te instalo el por defecto del repo.

da lo mismo la wea en todo caso
 
Upvote 0

dwyer

Sonidista-Computin
Se agradece
Yo lo instalé en Ubuntu Server pero no me sirvió para lo que quería. Que era emular algo como wetransfer
Usé Jirareau pero tampoco me sirvió a mi propósito.
Sigo en búsqueda de algo similar

Saludos

Enviado desde mi SM-G955F mediante Tapatalk
 
Upvote 0

Cosme

Gold Member
por un montón de motivos, estas cosas se llevan con docker ahora :zippy
 
Upvote 0

Nexlander

User
Reviewer
Upvote 0
Subir