Cómo instalar NextCloud en Ubuntu 22.04 LTS: Guía paso a paso

por | 03-noviembre-2023 | 0 Comentarios

Categoría(s): Diseño Web
Etiqueta(s): Linux | Ubuntu
Al utilizar SSH, optas por una vía segura y encriptada.
👇🏻 Índice de Contenido
2
3
Adentrarse en el mundo de los servidores privados puede parecer una tarea desafiante. Sin embargo, con la guía adecuada, el camino se vuelve mucho más ameno y accesible. NextCloud es una solución robusta y confiable para aquellos que buscan tener control total sobre sus archivos. Al usar NextCloud, no solo estarás dando un paso gigante hacia la autonomía digital, sino que también disfrutarás de un espacio a tu gusto para almacenar, compartir y gestionar tus archivos.

Esta guía desglosa cada paso del proceso, desde la preparación del sistema hasta la optimización del servidor NextCloud. Al final de este recorrido, tendrás un servidor NextCloud funcionando en tu máquina Ubuntu 22.04 LTS.

1. Accede al servidor por SSH

Al utilizar SSH, optas por una vía segura y encriptada.
ssh root@ipservidor
Texto para Final de Código

2. Crea un usuario local

Ahora estamos conectados como “root”, por seguridad vamos a crear un usuario local, si es que no está creado ya.

Crea un usuario local

# cambia evzek por el nombre de tu usuario.
adduser evzek
# Se debería de ver algo así:
Adding user 'evzek' ...
Adding new group 'evzek' (1000) ...
Adding new user 'evzek' (1000) with group 'evzek' ...
Creating home directory '/home/evzek' ...
Copying files from '/etc/skel' ...

# Crea tu contraseña.
New password:
Retype new password:
passwd: password updated successfully

# Campos opcionales, puedes pasar con enter.
Changing the user information for evzek
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:

# R → Yes
Is the information correct? [Y/n]
NOTA: Cuándo veas “Y” en mayúscula (en terminal), es el valor predeterminado al presionar la tecla “enter”.

3. Verifica que tenga permisos sudo tu usuario

# cambia evzek por el nombre de tu usuario.
usermod -aG sudo evzek
# NOTA: Si todo salió bien, no deberías ver ningún mensaje.
  • usermod: Es una utilidad para modificar la configuración de un usuario existente.
  • aG: Estas opciones juntas indican que se va a agregar (-a) al usuario a un grupo (-G) sin eliminarlo de otros grupos a los que ya pertenece.
  • sudo: Es el nombre del grupo al que queremos agregar al usuario. En sistemas basados en Debian, como Ubuntu, los miembros del grupo sudo tienen permisos para ejecutar cualquier comando como superusuario a través del comando sudo.
  • evzek: Es el nombre del usuario al que queremos agregar al grupo mencionado.

4. Ahora puedes desconectar e identificarte con tu usuario

# cambia evzek por el nombre de tu usuario.
ssh evzek@ipservidor

¿Por qué es importante crear un usuario local y no solo quedarnos con root?

Usar el usuario root constantemente puede parecer práctico debido a su acceso total, pero en realidad, es una práctica riesgosa. Cuando utilizamos root, cualquier error, por mínimo que sea, puede tener consecuencias graves en el sistema. Además, al trabajar siempre con estos privilegios, nos exponemos a mayores riesgos de seguridad. Si un atacante o un malware obtienen acceso, tendrían control absoluto.

Por otro lado, algunas aplicaciones no están diseñadas para ser ejecutadas con permisos de root y podrían comportarse de forma impredecible. Es una norma general evitar usar root a menos que sea estrictamente necesario. Al final del día, trabajar con un usuario regular es como llevar cinturón de seguridad: puede que no lo notes siempre, pero te protege en momentos cruciales.

¡Es una elección inteligente para cuidar tu servidor!

5. Actualiza tu servidor

Usaremos dist-upgrade es más exhaustivo en vez de sudo apt upgrade y, por lo general, es suficiente para obtener todas las actualizaciones necesarias, incluidas aquellas que involucran cambios en las dependencias.

Es hora de actualizar

# 1
sudo apt update
# 2
sudo apt dist-upgrade
# 3
sudo apt autoremove
  • sudo apt update: Actualiza la lista de paquetes disponibles en los repositorios configurados en tu sistema. En otras palabras, le dice a tu servidor: “Oye, ¿cuáles son las últimas versiones de los programas y herramientas disponibles para instalar o actualizar?”. No instala ni actualiza ningún programa, solo refresca la información.
  • sudo apt upgrade: Una vez que has actualizado la lista de paquetes con el comando anterior, este comando se encarga de instalar las últimas versiones de todos los programas que ya tienes en tu sistema. Así que, básicamente, le estás diciendo a tu computadora: “Ahora que ya sabes cuáles son las últimas versiones, ¡vamos a instalarlas!”
  • sudo apt dist-upgrade: Es una versión avanzada del típico sudo apt upgrade. Mientras que upgrade solo actualiza paquetes existentes, dist-upgrade gestiona de forma inteligente las dependencias, pudiendo agregar o quitar paquetes según sea necesario para las actualizaciones. Es útil para transiciones a nuevas versiones del sistema, pero es importante usarlo con precaución y estar atentos a los cambios que propone.
  • sudo apt autoremove: Ayuda a mantener tu sistema limpio, eliminando paquetes que fueron instalados automáticamente como dependencias y que ya no son necesarios. Es como un asistente que se asegura de que tu sistema no esté lleno de cosas innecesarias, manteniéndolo ordenado y eficiente. ¡Una pequeña limpieza de vez en cuando siempre es buena idea!

6. Personalicemos “localhost

Actualmente, el indicador de bash muestra localhost, lo cual está bien si solo tienes un servidor y solo quieras tener un servidor, pero te recomiendo cambiarlo para identificarlo mejor, por ejemplo con el nombre del dominio y proyecto. Así sabrás en donde estás conectado.

Tendremos que editar 2 archivos “hostname” y “hosts

Editamos el archivo hostname

# Editamos hostname con nano.
sudo nano /etc/hostname
# Cambia localhost por el nombre del dominio completo.

Editamos el archivo hosts

# Editamos hostname con nano.
sudo nano /etc/hosts
# Dejamos la primera línea. Podemos dejar el dominio completo y una versión corta.
# /etc/hosts
127.0.0.1 localhost
127.0.1.1 tudominio.com versioncorta

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

En el editor nano recuerda:

  • Pegar con clic derecho (normalmente).
  • Guardar ctrl + o.
  • Salir ctrl + x.
Debemos reiniciar nuestra máquina:
sudo reboot

7. Configurar la Base de Datos (MariaDB)

Usaremos MariaDB en lugar de MySQL por su rendimiento superior y características avanzadas.

Configurar MariaDB

# Instalar MariaDB server
sudo apt install mariadb-server

# Revisar status del servicio MariaDB
sudo systemctl status mariadb

# Si todo esta ok aparecerá
Active: active (running)

# Si no esta iniciado
sudo systemctl start mariadb

# Si no esta habilitado
sudo systemctl enable mariadb

8. MySQL Secure Installation

El comando sudo mysql_secure_installation es una herramienta que te ayuda a fortalecer la seguridad de tu servidor MySQL o MariaDB. Al ejecutarlo, te guiará a través de varios pasos para hacer cambios recomendados que aumentan la seguridad de tu base de datos.

MySQL Secure Installation

sudo mysql_secure_installation

Sigue los pasos

# Paso 1
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
haven’t set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
# R: Enter → NO tenemos establecida una contraseña le damos enter.

# Paso 2
Switch to unix_socket authentication [Y/n]
# R: N → Opción de autenticación de socket Unix, diremos que no, usaremos la autenticación estandar.

# Paso 3
Change the root password? [Y/n]
# R: Y → Establece una contraseña para el usuario root.

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.

# Paso 4
Remove anonymous users? [Y/n]
# R: Yes → Eliminar cuentas de usuario anónimas: Estas cuentas pueden ser utilizadas por cualquier usuario, incluso desde hosts remotos, por lo que es recomendable eliminarlas.

# Paso 5
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]
# R: Yes → Deshabilitar el inicio de sesión root de forma remota.

# Paso 6
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]
# R: Yes → Eliminar la base de datos ‘test’: Esta es una base de datos que se crea por defecto y que cualquier usuario puede acceder. Eliminarla reduce el riesgo de exposición a pruebas maliciosas.

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

Reload privilege tables now? [Y/n]
# Yes → Recargar las tablas de privilegios: Esto asegura que todos los cambios hechos anteriormente tengan efecto inmediato.

9. Crea la Base de Datos

Entramos a la consola de MariaDB.

sudo mariadb
Crea la la Base de Datos
# Puedes sustituir la palabra nextcloud por el nombre que quieras para tu Base de Datos.
CREATE DATABASE nextcloud;
# Verificamos mostrando las Bases de Datos existentes.
SHOW DATABASES;

# NO COPIES igual, crea tu usuario y contraseña.
# Este comando da al usuario “EligeTuUsuario” todos los permisos sobre la base de datos “nextcloud” y también establece/verifica que su contraseña es “CreaTuContraseña”, todo mientras se conecta desde el mismo servidor donde está la base de datos.
GRANT ALL PRIVILEGES ON nextcloud.* TO ‘EligeTuUsuario’@’localhost’ IDENTIFIED BY ‘CreaTuContraseña’;

# Recarga los privilegios en MySQL o MariaDB, aplicando de inmediato los cambios realizados en permisos de usuarios.
FLUSH PRIVILEGES;

Ctrl + d → Para desconectarse de MariaDB.

10. Instala Apache

sudo apt install apache2

11. Instala PHP y otras dependencias

sudo apt install php php-apcu php-bcmath php-cli php-common php-curl php-gd php-gmp php-imagick php-intl php-mbstring php-mysql php-zip php-xml libapache2-mod-php php-bz2 php-ctype php-dom php-json php-posix zip unzip wget

12. Habilita los módulos necesarios de Apache

sudo a2enmod rewrite dir mime env headers

13. Reinicia el servicio de apache2

# Reiniciar el servicio de apache2
sudo systemctl restart apache2
# Verificar el servicio de apache2
sudo systemctl status apache2
# Siempre es buena idea revisar si todos los módulos se habilitaron correctamente.
sudo apache2ctl -M

14. En PHP habilita:

bcmath, gmp, imagick e intl

sudo phpenmod bcmath gmp imagick intl

15. Descargamos última versión de Nextcloud

# Verifica que tengas instalado wget
which wget
# Si no lo tienes usa para instalar
sudo apt install wget

# Descargamos Nextcloud
wget https://download.nextcloud.com/server/releases/latest.zip

# Descomprimimos.
unzip latest.zip

# Removemos el .zip
rm latest.zip

# Recomiendo cambiar el nombre de la carpeta (por ejemplo el del dominio).
mv nextcloud NuevoNombreDelDirectorio.com

# Cambiamos permisos de la carpeta.
sudo chown -R www-data:www-data NuevoNombreDelDirectorio.com

# Movemos nuestra carpeta a /var/www/
sudo mv NuevoNombreDelDirectorio.com /var/www/

# Podemos verificar que se movió exitosamente.
ls -l /var/www/

16. Deshabilitemos el sitio predeterminado de apache

000-default.conf

sudo a2dissite 000-default.conf
# Nos pedira recargar apache.
sudo systemctl reload apache2

17. Crear un archivo de configuración de host para Nextcloud

Asegúrate de ajustar los nombres para que coincidan con los tuyos.

Cambia el nombre

sudo nano /etc/apache2/sites-available/NuevoNombreDelDirectorio.com.conf
conf para Apache 2.4.* o superior.

Cambia el nombre

# Definimos el directorio raíz del dominio
DocumentRoot “/var/www/NuevoNombreDelDirectorio.com”
# Nombre del servidor
ServerName NuevoNombreDelDirectorio.com
# Registro de errores y accesos
ErrorLog /var/log/apache2/NuevoNombreDelDirectorio.com_error.log
CustomLog /var/log/apache2/NuevoNombreDelDirectorio.com_access.log combined


# Opciones para el directorio
Options -Indexes +FollowSymlinks
AllowOverride All

# Configuración de acceso
Require all granted
He actualizado un poco este archivo:

  • Orden de las directivas: En la configuración mejorada, he movido ErrorLog y CustomLog fuera del bloque Directory. Es más estándar tener estas directivas al nivel del VirtualHost en lugar de dentro del bloque del directorio.
  • Registro (Logging): Cambié TransferLog por CustomLog ... combined. Este último añade más información al registro, como el referente y el agente de usuario, lo que puede ser útil para analizar el tráfico.
  • Opciones de directorio: En la configuración mejorada, desactivé el listado de directorios con Indexes. Esto evita que, si no hay un archivo index en un directorio, se muestre un listado completo del contenido del directorio, lo cual es una buena práctica de seguridad.
  • Control de acceso: Reemplacé las directivas Order, Allow y Deny por Require all granted. Esto se debe a que las primeras tres están obsoletas desde Apache 2.4 en adelante y Require es la forma moderna de controlar el acceso.
.conf para Apache 2.3.* o inferior:
DocumentRoot “/var/www/NuevoNombreDelDirectorio.com”
ServerName NuevoNombreDelDirectorio.com

Options MultiViews FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all

TransferLog /var/log/apache2/NuevoNombreDelDirectorio.com_access.log
ErrorLog /var/log/apache2/NuevoNombreDelDirectorio.com_error.log

18. Edita el archivo de configuración principal de Apache

El archivo de configuración principal de Apache depende de cómo y dónde se haya instalado Apache, así como de la distribución de Linux que estés utilizando. Aquí te dejo una guía general:

httpd.conf: Este archivo es el archivo de configuración principal en muchas instalaciones de Apache, especialmente en las que se instalan a partir del código fuente y en algunas distribuciones de Linux.

apache2.conf: Es típico de las instalaciones de Apache en distribuciones de Linux basadas en Debian, como Ubuntu.

Para determinar cuál de estos archivos debes editar, puedes hacer lo siguiente:

Si estás en una distribución basada en Debian (como Ubuntu), probablemente tu archivo principal sea apache2.conf. Puedes verificar su existencia con:

apache2.conf

# Si estás en una distribución basada en Debian (como Ubuntu), probablemente tu archivo principal sea apache2.conf
ls /etc/apache2/apache2.conf
# Si estás en otras distribuciones, puedes buscar el archivo httpd.conf con:
ls /etc/httpd/conf/httpd.conf
# o en otra posible ubicación:
ls /etc/apache2/httpd.conf
Si ambos archivos existen en tu sistema, te recomendaría que revisaras primero apache2.conf si estás en una distribución basada en Debian, o httpd.conf en otras distribuciones.

Editamos .conf

# Identificado el archivo procedemos a editarlo
sudo nano /etc/apache2/apache2.conf

Casi al final del archivo .conf para Apache 2.4.* o superior:

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# ↑ Después de
# Protección contra Clickjacking
Header always append X-Frame-Options SAMEORIGIN

# Evitar que el servidor muestre su versión
ServerTokens Prod
ServerSignature Off

# ↓ Antes de
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Encabezados de seguridad: Añadí Header always append X-Frame-Options SAMEORIGIN para proteger contra Clickjacking, impidiendo que tu sitio sea mostrado en un iframe desde un dominio diferente.

Ocultar versión de Apache: Agregué ServerTokens Prod y ServerSignature Off para que Apache no muestre su versión en los encabezados o en las páginas de error, lo que es otra buena práctica de seguridad.

19. Habilitar .conf

sudo a2ensite NuevoNombreDelDirectorio.com.conf
# Te Pedirá recargar apache2.
sudo systemctl reload apache2

20. Instalamos y configuramos PHP-FPM

PHP-FPM

# Instalamos php-fpm.
sudo apt install php8.1-fpm
# Revisamos que este corriendo php-fpm.
service php8.1-fpm status

# Saber la versión de php-fpm.
php-fpm8.1 -v

# Socket.
ls -la /var/run/php/php8.1-fpm.sock

# Deshabilita el módulo prefork de Apache.
sudo a2dismod php8.1
sudo a2dismod mpm_prefork

# Activamos php-fpm
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.1-fpm

# Verificamos, systemctl es más versátil y detallado en sistemas que utilizan systemd.
sudo systemctl status php8.1-fpm
service php8.1-fpm status

21. Configurar php.ini

php.ini

# Saber mi versión de PHP
php -v
# Ubicación si estás usando PHP-FPM con Nginx o Apache:
/etc/php/8.1/fpm/php.ini

# Ubicación si estás usando el módulo mod_php con Apache:
/etc/php/8.1/apache2/php.ini

¿No estás seguro?, si estás usando PHP-FPM con Nginx / Apache o módulo mod_php con Apache, comprueba con phpinfo()

info.php

# Crea el archivo info.php
sudo nano /var/www/NuevoNombreDelDirectorio.com/info.php

Código info.php

<?php 
 phpinfo(); 
?>
La página resultante te mostrará toda la configuración de PHP.

En la sección Loaded Configuration File (Archivo de configuración cargado), verás la ruta al archivo php.ini que está siendo utilizado.

No olvides eliminar el archivo info.php después de haber comprobado la información para mantener la seguridad de tu servidor.

22. Parámetros php.ini

abrimos php.ini

# Abrimos php.ini
sudo nano /etc/php/8.1/fpm/php.ini
# o
sudo nano /etc/php/8.1/apache2/php.ini

Editamos php.ini

memory_limit = 512M
upload_max_filesize = 512M
max_execution_time = 360
post_max_size = 512M
date.timezone = “America/Mexico_City”
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

memory_limit = 512M: establece el límite de memoria que un script PHP puede consumir a 512 megabytes.

upload_max_filesize = 512M: define el tamaño máximo permitido para archivos cargados a 200 megabytes.

max_execution_time = 360: determina que un script PHP puede ejecutarse hasta 360 segundos antes de ser terminado.

post_max_size = 512M: especifica que el tamaño máximo para datos enviados mediante el método POST es de 200 megabytes.

date.timezone = “America/Mexico_City”: configura la zona horaria predeterminada a la de Ciudad de México.

opcache.enable=1: habilita la extensión OPcache. Cuando está establecido en 1, OPcache mejora el rendimiento almacenando bytecode precompilado en la memoria compartida, eliminando así la necesidad de cargar y analizar scripts en cada solicitud.

opcache.interned_strings_buffer=8: determina la cantidad de memoria, en megabytes, reservada para almacenar cadenas internadas. Cuando una cadena se interna, es almacenada una vez en memoria y se reutiliza, lo que puede mejorar el rendimiento y reducir el uso de memoria.

opcache.max_accelerated_files=10000: establece el número máximo de archivos que pueden ser acelerados por OPcache. Este valor determina cuántos scripts PHP pueden ser optimizados y guardados en el caché.

opcache.memory_consumption=128: define el tamaño, en megabytes, de la memoria compartida que se utilizará para almacenar el bytecode de PHP en OPcache.

opcache.save_comments=1: indica si se deben guardar o no los comentarios de los scripts PHP. Al establecer este valor en 1, todos los comentarios en el código PHP se conservarán cuando se almacenen en el caché. Esto puede ser necesario para algunas bibliotecas o herramientas que dependen de la presencia de comentarios en el código, como las anotaciones.

opcache.revalidate_freq=1: establece con qué frecuencia, en segundos, se deben verificar los archivos de script PHP para detectar cambios. Un valor de 1 significa que OPcache verificará los scripts en cada solicitud para ver si han sido modificados y, en caso afirmativo, los recompilará y almacenará en el caché.

23. Configurar php-fpm pool

Abrimos www.conf
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 6
# Reiniciamos
sudo systemctl restart php8.1-fpm

# Comprobamos
sudo systemctl status php8.1-fpm

24. Directivas de Apache para el procesamiento de archivos PHP por php-fpm

¿Recuerdas que deshabilitamos el sitio predeterminado de apache (000-default.conf)?
Ahora debemos dirigirnos al archivo .conf correcto:

Abrimos .conf

sudo nano /etc/apache2/sites-available/NuevoNombreDelDirectorio.com.conf

Agregamos php-fpm

SetHandler “proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/”
Tu archivo se debería de ver algo así:

Ejemplo .conf

# Definimos el directorio raíz del dominio
DocumentRoot “/var/www/NombreDominio.com”
# Nombre del servidor
ServerName NombreDominio.com

# Registro de errores y accesos
ErrorLog /var/log/apache2/NombreDominio.com_error.log
CustomLog /var/log/apache2/NombreDominio.com_access.log combined


# Opciones para el directorio
Options -Indexes +FollowSymlinks
AllowOverride All

# Configuración de acceso
Require all granted
# Directivas de Apache para el procesamiento de archivos PHP por php-fpm

SetHandler “proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/”

Reiniciamos

# Reiniciamos apache2
sudo systemctl restart apache2
# Reiniciamos php
sudo systemctl restart php8.1-fpm
# Verifica apache2
sudo systemctl status apache2
# Verifica php
sudo systemctl status php8.1-fpm

25. Instalar Nextcloud mediante comando CLI

Recuerda que debes estar ubicado en la carpeta de tu NextCloud para usar CLI.

cd /var/www/NombreDelDirectorio.com/

Instala Nextcloud con CLI

sudo -u www-data php occ maintenance:install –database “mysql” –database-name “NombreDeTuBaseDeDatos” –database-user “UsuarioDeTuBaseDeDatos” –database-pass “ContraseñaDeTuBaseDeDatos” –admin-user “UsuarioParaNextCloud” –admin-pass “ContraseñaParaNextCloud”

Si lo hiciste bien, el comando mostrará “Nextcloud was successfully installed”

26. Soluciona el error ‘Acceso a través de un Dominio no Confiable’ en config.php

Nextcloud permite el acceso solo desde el localhost, podría mostrar un error como “Acceso a través de un dominio no confiable”

Necesitamos permitir el acceso a Nextcloud utilizando una dirección IP o un nombre de dominio.

Editamos config.php

sudo nano /var/www/NombreDelDirectorio.com/config/config.php

trusted domains

‘trusted_domains’ => [
0 => ‘localhost’,
1 => ‘NombreDelDirectorio.com’,
],
Configura Nextcloud para usar APCu para el caché de memoria en config.php

memcache.local

‘memcache.local’ => ‘\OC\Memcache\APCu’,

Agregamos proxies IPv4 y IPv6:

trusted_proxies

‘trusted_proxies’ => [
0 => ‘AquiTuIPv4’,
1 => ‘[AquiTuIPv6]’,
],
Tu archivo config.php se debería de ver algo así:

Ejemplo php.config

‘***’,
‘passwordsalt’ => ‘***’,
‘secret’ => ‘***’,
‘trusted_domains’ => [
0 => ‘localhost’,
1 => ‘NombreDelDirectorio.com’,
],
‘datadirectory’ => ‘/var/www/NombreDelDirectorio.com/data’,
‘trusted_proxies’ =>
0 => ‘*.*.*.*’,
1 => ‘[*:*::*:*:*:*]’,
],
‘dbtype’ => ‘mysql’,
‘version’ => ‘27.1.3.2’,
‘overwrite.cli.url’ => ‘http://localhost’,
‘dbname’ => ‘***’,
‘dbhost’ => ‘localhost’,
‘dbport’ => ”,
‘dbtableprefix’ => ‘**_’,
‘mysql.utf8mb4’ => true,
‘dbuser’ => ‘***’,
‘dbpassword’ => ‘***’,
‘installed’ => true,
‘memcache.local’ => ‘\OC\Memcache\APCu’,
);

Ejemplo php.config

‘***’,
‘passwordsalt’ => ‘***’,
‘secret’ => ‘***’,
‘trusted_domains’ =>
0 => ‘localhost’,
1 => ‘NombreDelDirectorio.com’,
],
‘datadirectory’ => ‘/var/www/NombreDelDirectorio.com/data’,
‘trusted_proxies’ =>
0 => ‘*.*.*.*’,
1 => ‘[*:*::*:*:*:*]’,
],
‘dbtype’ => ‘mysql’,
‘version’ => ‘27.1.*.*’,
‘overwrite.cli.url’ => ‘http://localhost’,
‘dbname’ => ‘*’,
‘dbhost’ => ‘*’,
‘dbport’ => ”,
‘dbtableprefix’ => ‘**_’,
‘mysql.utf8mb4’ => true,
‘dbuser’ => ‘**’,
‘dbpassword’ => ‘**’,
‘default_phone_region’ => ‘MX’,
‘memcache.local’ => ‘\OC\Memcache\APCu’,
‘filelocking.enabled’ => true,
‘memcache.locking’ => ‘\OC\Memcache\Redis’,
‘redis’ => [
‘host’ => ‘/var/run/redis/redis.sock’,
‘port’ => 0,
‘dbindex’ => 0,
‘password’ => ”,
‘timeout’ => 1.5,
],
‘htaccess.RewriteBase’ => ‘/’,
‘installed’ => true,
);

Reiniciamos apache y php:

rutas en php.ini

# Reiniciamos apache2
sudo systemctl restart apache2
# Reiniciamos php
sudo systemctl restart php8.1-fpm
# Verifica apache2
sudo systemctl status apache2
# Verifica php
sudo systemctl status php8.1-fpm

27. Instala y configura Redis

En Nextcloud, Redis se utiliza para el caché local y distribuido, así como para el bloqueo de archivos transaccional. Usamos APCu para el caché local, que es más rápido que Redis. Utilizaremos Redis para el bloqueo de archivos. El mecanismo de bloqueo de archivos transaccional de Nextcloud bloquea archivos para evitar la corrupción de estos durante la operación normal.

Instala Redis

# Instalamos Redis
sudo apt-get install redis-server php-redis
# Iniciamos Redis
sudo systemctl start redis-server

# Habilitamos
sudo systemctl enable redis-server

Configura Redis para usar sockets Unix en lugar de puertos.

redis.conf

sudo nano /etc/redis/redis.conf

Añade a redis.conf

# ↓ Debajo de
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 0
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
# TCP listen() backlog.
# ↑ Antes de

# Reiniciamos redis
sudo systemctl restart redis
# Verificamos redis
sudo systemctl status redis

# Comprobamos la ruta de redis.sock
ls -la /var/run/redis/redis.sock

# Añade el usuario de Apache al grupo Redis.
sudo usermod -a -G redis www-data

Configuramos Nextcloud para usar Redis para el bloqueo de archivos.

Abrimos config.php

sudo nano /var/www/NombreDelDirectorio.com/config/config.php

Editamos config.php

‘filelocking.enabled’ => true,
‘memcache.locking’ => ‘\OC\Memcache\Redis’,
‘redis’ => [
‘host’ => ‘/var/run/redis/redis.sock’,
‘port’ => 0,
‘dbindex’ => 0,
‘password’ => ”,
‘timeout’ => 1.5,
],
Tu archivo config.php se debería de ver algo así:

Ejemplo php.config

‘***’,
‘passwordsalt’ => ‘***’,
‘secret’ => ‘***’,
‘trusted_domains’ => [
0 => ‘localhost’,
1 => ‘NombreDelDirectorio.com’,
],
‘datadirectory’ => ‘/var/www/NombreDelDirectorio.com/data’,
‘trusted_proxies’ =>
0 => ‘*.*.*.*’,
1 => ‘[*:*::*:*:*:*]’,
],
‘dbtype’ => ‘mysql’,
‘version’ => ‘27.1.3.2’,
‘overwrite.cli.url’ => ‘http://localhost’,
‘dbname’ => ‘***’,
‘dbhost’ => ‘localhost’,
‘dbport’ => ”,
‘dbtableprefix’ => ‘**_’,
‘mysql.utf8mb4’ => true,
‘dbuser’ => ‘***’,
‘dbpassword’ => ‘***’,
‘installed’ => true,
‘memcache.local’ => ‘\OC\Memcache\APCu’,
‘filelocking.enabled’ => true,
‘memcache.locking’ => ‘\OC\Memcache\Redis’,
‘redis’ => [
‘host’ => ‘/var/run/redis/redis.sock’,
‘port’ => 0,
‘dbindex’ => 0,
‘password’ => ”,
‘timeout’ => 1.5,
],
);

Habilitamos el bloqueo de sesiones Redis en PHP.

Abrimos php.ini

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

Modificamos php.ini

# ↓ Debajo de
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
soap.wsdl_cache_limit = 5
;Enable Redis session locking
redis.session.locking_enabled = 1
redis.session.lock_retries = -1
redis.session.lock_wait_time = 10000

[sysvshm]
; A default size of the shared memory segment
# ↑ Antes de

Reiniciamos

# Reiniciamos apache2
sudo systemctl restart apache2
# Reiniciamos php
sudo systemctl restart php8.1-fpm
# Verifica apache2
sudo systemctl status apache2
# Verifica php
sudo systemctl status php8.1-fpm

Ahora, podemos verificar el uso de Redis (activando el puerto de Redis en la configuración de Redis) ejecutando el comando “redis-cli MONITOR”. Durante la carga de Nextcloud, mostrará datos en tiempo real en la pantalla.

redis-cli MONITOR

# Ruta
sudo nano /etc/redis/redis.conf
# Cambiamos el puerto de 0 a 6379 Momentaneamente

# Reseteamos
sudo systemctl restart redis

# comando para ver en tiempo real
sudo redis-cli MONITOR

# y cualquier accion en nextcloud lo veremos en tiempo real

# Vuelve a cambiar el puerto a 0, reinicia redis y listo

28. Instala SSL

Puedes usar https://certbot.eff.org/instructions, pero no lo haré de esta forma en esta ocasión.

Vamos a usar “python3-certbot-apache”.

Usar sudo snap install --classic certbot es como tener una aplicación en tu teléfono que se actualiza automáticamente cada vez que hay una nueva versión, sin que tengas que preocuparte por nada. Por otro lado, con sudo apt-get install python3-certbot-apache, es como si descargases una app que necesita que tú, de vez en cuando, la revises y actualices manualmente. Ambas opciones hacen prácticamente lo mismo, pero una te da actualizaciones automáticas y la otra te permite decidir cuándo y cómo actualizar.

python3-certbot-apache

# Instalamos.
sudo apt-get install python3-certbot-apache -y
# Con la herramienta certbot, solicitemos un certificado para nuestro dominio.
sudo certbot –apache -d NombreDelDominio.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter ‘c’ to cancel):
# correo@dominio.com → Introduce la dirección de correo electrónico (utilizada para avisos urgentes de renovación y de seguridad)

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o:
# R → teclea “Y”

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let’s Encrypt project and the non-profit organization that
develops Certbot? We’d like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o:
# R → teclea “Y”

29. Habilitar el módulo HTTP2 de Apache y configura el sitio para los protocolos http2

http2

sudo a2enmod http2

Editamos *-le-ssl.conf

sudo nano /etc/apache2/sites-enabled/NombreDelDominio.com-le-ssl.conf

-le-ssl.conf

# ↓ Debajo de
# permite el protocolo HTTP/2 y HTTP/1.1
Protocols h2 h2c http/1.1

Reiniciamos apache2

sudo systemctl restart apache2
# Verificamos
curl -I –http2 -s https://NombreDelDominio.com/ | grep HTTP

# deberías recibir:
HTTP/2 302

Resolver problemas de Nextcloud

The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips ↗.

Abrimos -ssl.conf

sudo nano /etc/apache2/sites-enabled/NombreDelDominio.com-le-ssl.conf

HTTP Strict Transport Security, que instruye a los navegadores a no permitir ninguna conexión con la instancia de Nextcloud usando HTTP, previene ataques de intermediarios.

*-le-ssl.conf

# No permitir ninguna conexión usando HTTP
Header always set Strict-Transport-Security “max-age=15552000; includeSubDomains”

Reiniciamos

# Reiniciamos apache2
sudo systemctl restart apache2
Tu archivo *-le-ssl.conf se debería de ver algo así:
# permite el protocolo HTTP/2 y HTTP/1.1
Protocols h2 h2c http/1.1
# Definimos el directorio raíz del dominio
DocumentRoot “/var/www/NombreDelDirectorio.com”
# Nombre del servidor
ServerName NombreDelDirectorio.com

# Registro de errores y accesos
ErrorLog /var/log/apache2/NombreDelDirectorio.com.log
CustomLog /var/log/apache2/NombreDelDirectorio.com_access.log combined

# No permitir ninguna conexión usando HTTP

Header always set Strict-Transport-Security “max-age=15552000; includeSubDomains”


# Opciones para el directorio
Options -Indexes +FollowSymlinks
AllowOverride All

# Configuración de acceso
Require all granted
# Directivas de Apache para el procesamiento de archivos PHP por php-fpm

SetHandler “proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/”

SSLCertificateFile /etc/letsencrypt/live/NombreDelDirectorio.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/NombreDelDirectorio.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add “default_phone_region” with the respective ISO 3166-1 code ↗  of the region to your config file.

Abre config.php

sudo nano /var/www/NombreDelDirectorio.com/config/config.php

default_phone_region

‘default_phone_region’ => ‘MX’,

Pretty URL’s

Las URL amigables eliminan la parte “index.php” en todas las URLs de Nextcloud. Esto hará que las URLs sean más cortas y estéticas.

Abrimos config.php

sudo nano /var/www/NombreDelDirectorio.com/config/config.php

Edita config.php

# Agrega la siguiente línea:
‘htaccess.RewriteBase’ => ‘/’,

Actualiza .htaccess

# Ejecuta este comando qué actualizará el archivo .htaccess para la redirección.
sudo -u www-data php –define apc.enable_cli=1 /var/www/NombreDelDirectorio.com/occ maintenance:update:htaccess

Actualiza tu sistema

Las URL amigables eliminan la parte “index.php” en todas las URLs de Nextcloud. Esto hará que las URLs sean más cortas y estéticas.
# update
sudo apt update

# upgrade
sudo upgrade
ó
# dist-upgrade
sudo apt dist-upgrade

# Eliminar paquetes parciales
sudo apt-get autoclean

# Borrar todos los paquetes .deb
sudo apt-get clean

# Eliminar paquetes como dependencias que el sistema ya no necesita
sudo apt-get autoremove

# Eliminar paquetes huérfanos
# Para poder eliminar estos paquetes debemos instalar Deborphan.
sudo apt-get install deborphan
# Luego, ejecuta el siguiente comando:
sudo deborphan | xargs sudo apt-get -y remove –purge

# Reiniciar tu sistema
sudo reboot

Así debería de verse tu config.php

Ejemplo config.php

‘***’,
‘passwordsalt’ => ‘***’,
‘secret’ => ‘***’,
‘trusted_domains’ => [
0 => ‘localhost’,
1 => ‘NombreDelDominio.com’,
],
‘datadirectory’ => ‘/var/www/NombreDelDominio.com/data’,
‘trusted_proxies’ => [
0 => ‘AquiTuIPv4’,
1 => ‘[AquiTuIPv6]’,
],
‘dbtype’ => ‘mysql’,
‘version’ => ‘***’,
‘overwrite.cli.url’ => ‘http://localhost’,
‘dbname’ => ‘NombreDeTuBaseDeDatos’,
‘dbhost’ => ‘localhost’,
‘dbport’ => ”,
‘dbtableprefix’ => ‘TuPrefijo_’,
‘mysql.utf8mb4’ => true,
‘dbuser’ => ‘***’,
‘dbpassword’ => ‘***’,
‘default_phone_region’ => ‘MX’,
‘memcache.local’ => ‘\OC\Memcache\APCu’,
‘filelocking.enabled’ => true,
‘memcache.locking’ => ‘\OC\Memcache\Redis’,
‘redis’ => [
‘host’ => ‘/var/run/redis/redis.sock’,
‘port’ => 0,
‘dbindex’ => 0,
‘password’ => ”,
‘timeout’ => 1.5,
],
‘htaccess.RewriteBase’ => ‘/’,
‘installed’ => true,
);

0 comentarios

Enviar un comentario

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