Instalar Nextcloud 17 en CentOS 8 con Nginx, PHP 7.3 y MariaDB

Instala Nextcloud 17 en un servidor CentOS 8 con Nginx, PHP 7.3 y MariaDB. Esta guía paso a paso cubre la instalación de paquetes, configuración de PHP-FPM, SELinux, certificados Let’s Encrypt y comprobaciones posteriores para dejar Nextcloud operativo y seguro.
Introducción
Nextcloud es una alternativa de código abierto a servicios de sincronización y compartición de archivos (similar a Dropbox). Está escrito en PHP y JavaScript y soporta varios sistemas de bases de datos como MySQL/MariaDB, PostgreSQL, Oracle y SQLite.
En esta guía detallada instalarás Nextcloud 17 en CentOS 8 usando Nginx como servidor web, PHP-FPM 7.3 y MariaDB como base de datos. También configuraremos SSL con Let’s Encrypt y aplicaremos ajustes de SELinux y permisos.
Criterios previos
- Servidor CentOS 8 con 2 GB de RAM, 25 GB de espacio libre y 2 CPUs (mínimos recomendados para prueba/uso ligero).
- Acceso root o sudo.
- Un nombre de dominio apuntando al servidor (ej. cloud.tudominio.tld).
- Puertos 80 y 443 abiertos en el firewall.
Qué haremos (resumen de pasos)
- Instalar Nginx.
- Instalar PHP-FPM 7.3 y extensiones necesarias.
- Ajustar configuración de PHP-FPM y opcache.
- Instalar MariaDB y crear la base de datos de Nextcloud.
- Generar certificado SSL con Certbot (Let’s Encrypt).
- Descargar Nextcloud 17 y preparar permisos.
- Crear la configuración de virtualhost en Nginx.
- Ajustar SELinux para permitir escritura en los directorios necesarios.
- Ejecutar el instalador web y comprobaciones finales.
Nota importante
Esta guía asume CentOS 8 y PHP 7.3. Si usas una distribución diferente (Rocky Linux, AlmaLinux o RHEL) o versiones más recientes de PHP/Nextcloud, ajusta los repositorios y paquetes de acuerdo con tu entorno.
Paso 1 - Instalar Nginx
Instala Nginx desde AppStream y abre los puertos HTTP/HTTPS en firewalld.
sudo dnf install nginx
Inicia y habilita el servicio para el arranque:
systemctl start nginx
systemctl enable nginx
Verifica el estado del servicio:
systemctl status nginx
Deberías ver que Nginx está activo en el servidor CentOS 8.
Añade los servicios HTTP y HTTPS al firewall:
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Resultado esperado: Nginx instalado y puertos 80/443 abiertos.
Paso 2 - Instalar PHP-FPM 7.3
Nextcloud recomienda PHP 7.2 o 7.3 para la versión 17. Usaremos PHP 7.3 desde el repositorio REMI.
Habilita PowerTools, EPEL y añade REMI:
sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Lista de repositorios activos:
dnf repolist
Habilita el módulo PHP 7.3 de REMI:
dnf module list php
dnf module enable php:remi-7.3
Instala PHP y extensiones requeridas por Nextcloud:
sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip
Con esto tendrás PHP-FPM 7.3 y las librerías comunes necesarias.
Paso 3 - Configurar PHP-FPM 7.3
Ajusta php.ini para Nextcloud. Edita /etc/php.ini:
vim /etc/php.ini
Descomenta y adapta:
memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0
Ajustes de opcache: edita /etc/php.d/10-opcache.ini
vim /etc/php.d/10-opcache.ini
Configura:
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
Edita el pool de PHP-FPM /etc/php-fpm.d/www.conf y cambia usuario/grupo a nginx:
vim /etc/php-fpm.d/www.conf
Modifica:
user = nginx
group = nginx
Usa socket unix:
listen = /run/php-fpm/www.sock
Descomenta variables de entorno y la línea de opcache file cache:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_value[opcache.file_cache] = /var/lib/php/opcache
Crea directorios de sesión y opcache y ajusta permisos:
mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}
Habilita e inicia php-fpm:
systemctl enable php-fpm
systemctl start php-fpm
Verifica el socket y el servicio:
netstat -pl | grep php
systemctl status php-fpm
Resultado: PHP-FPM escuchando en /run/php-fpm/www.sock.
Paso 4 - Instalar y configurar MariaDB
Instala MariaDB y habilita el servicio:
sudo dnf install mariadb mariadb-server
systemctl start mariadb
systemctl enable mariadb
Asegura la instalación con mysql_secure_installation:
mysql_secure_installation
Responde según tu política (se recomienda establecer contraseña root, eliminar usuarios anónimos, eliminar base de datos de prueba y recargar privilegios).
Entra en el shell de MySQL y crea la base de datos y usuario para Nextcloud:
mysql -u root -p
-- en el prompt de mysql:
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextcloudpassdb';
flush privileges;
Ajusta la contraseña y el nombre de base de datos en producción; evita usar credenciales de ejemplo.
Paso 5 - Generar SSL con Let’s Encrypt
Instala certbot desde EPEL:
sudo dnf install certbot
Genera certificados usando el modo webroot (ajusta dominio y correo):
certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io
Los certificados estarán en /etc/letsencrypt/live/cloud.hakase-labs.io/. Comprueba:
ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/
Nota: Para renovación automática puedes usar systemd timer o un cron que ejecute “certbot renew” y recargue nginx cuando sea necesario.
Paso 6 - Descargar e instalar Nextcloud
Instala unzip si hace falta y descarga Nextcloud 17 al directorio web:
sudo dnf install unzip
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
unzip nextcloud-17.0.2.zip
Crea directorio de datos y ajusta permisos a nginx:
mkdir -p /var/www/nextcloud/data/
sudo chown -R nginx:nginx /var/www/nextcloud
Paso 7 - Configurar virtualhost Nginx para Nextcloud
Crea /etc/nginx/conf.d/nextcloud.conf y pega la configuración (reemplaza server_name y rutas de SSL por las tuyas):
upstream php-handler {
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;
}
server {
listen 80;
listen [::]:80;
server_name cloud.hakase-labs.io;
# enforce https
return 301 https://$server_name:443$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.hakase-labs.io;
# 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/ssl/nginx/fullchain.pem;
ssl_certificate_key /etc/ssl/nginx/privkey.pem;
# Add headers to serve security related headers
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;
fastcgi_hide_header X-Powered-By;
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
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;
}
client_max_body_size 512M;
fastcgi_buffers 64 4K;
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;
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\/.+)\.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;
fastcgi_param modHeadersAvailable true;
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;
}
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;
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}
Prueba la configuración y reinicia Nginx:
nginx -t
systemctl restart nginx
Comprueba puertos y escucha:
netstat -plntu
Paso 8 - Configurar SELinux para Nextcloud
Si tu sistema ejecuta SELinux en modo enforcing, marca las rutas necesarias con httpd_sys_rw_content_t y aplica restorecon.
Instala la herramienta de gestión:
sudo dnf install policycoreutils-python-utils
Aplica los contextos SELinux:
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/assets(/.*)?'
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'
restorecon -Rv '/var/www/nextcloud/'
Con esto SELinux permitirá a Nginx/PHP escribir en los directorios necesarios.
Paso 9 - Asistente de instalación web de Nextcloud
Abre en el navegador:
Verás la página de instalación web. Rellena el usuario administrador y la contraseña, selecciona MySQL/MariaDB y suministra los datos de la base de datos creados anteriormente (nextcloud_db, nextclouduser).
Haz clic en “Finish Setup” y espera a que termine. Al finalizar verás el panel de control de Nextcloud.
¡Enhorabuena! Has instalado Nextcloud 17 con Nginx, PHP-FPM 7.3 y MariaDB en CentOS 8.
Sección de mejoras, comprobaciones y seguridad (valor añadido)
Fact box (datos clave)
- Requisitos mínimos recomendados: 2 GB RAM, 2 CPUs, 25 GB disco.
- PHP recomendado para Nextcloud 17: 7.2 o 7.3.
- Directorio de instalación por defecto en esta guía: /var/www/nextcloud.
- Socket PHP-FPM usado: /run/php-fpm/www.sock.
Comprobaciones post-instalación (mini-checklist)
- Acceso HTTPS válido al dominio.
- Instalador web completado sin errores.
- Permisos de /var/www/nextcloud asignados a nginx:nginx.
- SELinux tiene contextos correctos para data, config y apps.
- Certificado Let’s Encrypt generado y válido.
- Copia de seguridad de la base de datos y de config.php realizada.
Backups recomendados (breve SOP)
- Hacer dump de la base de datos:
mysqldump -u root -p nextcloud_db > /root/backup_nextcloud_db_$(date +%F).sql
- Archivar config y datos (si los datos no están en un almacenamiento separado):
tar czf /root/backup_nextcloud_www_$(date +%F).tar.gz /var/www/nextcloud
- Verificar integridad del backup y almacenarlo fuera del servidor.
Renovación del certificado Let’s Encrypt (nota)
- Para renovar manualmente:
certbot renew --quiet --deploy-hook "systemctl reload nginx"
- Configura una tarea programada o timer systemd para renovaciones automáticas.
Seguridad y endurecimiento (resumen)
- Forzar HTTPS y redirigir todo tráfico HTTP a HTTPS.
- Habilitar cabeceras de seguridad recomendadas (HSTS con precaución, X-Frame-Options, Referrer-Policy).
- Restringir acceso al panel de administración por IP si procede.
- Mantener paquetes y parches al día (kernel, PHP, Nginx, MariaDB).
- Hacer escaneos periódicos de integridad (integrity checks de Nextcloud y backups).
Problemas comunes y soluciones rápidas
- Error “Can’t write into config directory”: revisa propietario/permiso del directorio /var/www/nextcloud/config y SELinux.
- 502 Bad Gateway al acceder a PHP: verifica que php-fpm está activo y que Nginx apunta al socket correcto (/run/php-fpm/www.sock).
- Problemas con subida de archivos grandes: revisa client_max_body_size en Nginx y post_max_size/upload_max_filesize en php.ini.
Criterios de aceptación
- La página de login de Nextcloud carga sobre HTTPS sin errores de certificado.
- El usuario admin puede crear una cuenta de prueba y subir un archivo de 100 MB.
- Las aplicaciones básicas (Calendar, Contacts) se instalan y funcionan.
- Las tareas de copia de seguridad y restauración se verifican exitosamente.
Guía rápida de resolución (decision tree)
flowchart TD
A[Iniciar: Nextcloud inaccesible] --> B{¿Página HTTPS responde?}
B -- No --> C{¿Nginx activo?}
C -- No --> D[Reiniciar nginx y revisar logs]
C -- Sí --> E{¿502/504?}
E -- Sí --> F[Revisar php-fpm: systemctl status php-fpm y socket]
E -- No --> G[Revisar firewall y DNS]
B -- Sí --> H{¿Errores de aplicación?}
H -- Sí --> I[Revisar logs de Nextcloud: data/nextcloud.log]
H -- No --> J[Servicio OK]
Role-based checklist (breve)
- Administrador de sistemas: instalar paquetes, configurar firewall, automatizar renovación Certbot, aplicar SELinux.
- DBA: crear base de datos, asegurar credenciales, planificar backups y restauraciones.
- Soporte/Helpdesk: probar subida/descarga de archivos, sincronización cliente de escritorio y móvil, restablecimiento de contraseñas.
Casos límite y cuándo esta guía puede fallar
- Si usas PHP 8.x o Nextcloud más reciente, algunos paquetes o configuraciones pueden diferir.
- En entornos con almacenamiento externo (NFS, SMB) conviene ajustar permisos y opciones de cache/locking (Redis, memcache).
- Si el servidor está detrás de un proxy inverso o balanceador, hay que adaptar las directivas de proxy y headers.
Notas de compatibilidad y migración
- CentOS 8 ha seguido distintas vías tras su ciclo de vida; en entornos nuevos considera alternativas compatibles (Rocky Linux, AlmaLinux, RHEL).
- Para migrar Nextcloud entre servidores, realiza backup de la base de datos, copia de /var/www/nextcloud y del directorio de datos, y restaura en el destino con las rutas y permisos ajustados.
Mini glosario (1 línea cada término)
- PHP-FPM: gestor de procesos FastCGI para ejecutar código PHP de forma eficiente.
- Opcache: caché de bytecode de PHP que acelera la ejecución.
- webroot: directorio público que sirve archivos estáticos (ej. /usr/share/nginx/html).
- Certbot: cliente para obtener/renovar certificados de Let’s Encrypt.
Preguntas frecuentes (FAQ)
¿Puedo usar PostgreSQL en lugar de MariaDB?
Sí, Nextcloud soporta PostgreSQL. Cambia la sección de base de datos durante la instalación y crea la base de datos y usuario correspondiente en PostgreSQL.
¿Cómo habilito Redis como cache para mejorar el rendimiento?
Instala Redis y la extensión PHP correspondiente; configura Redis como memcache en config.php de Nextcloud y asegúrate de que Redis está protegido y configurado correctamente.
Resumen final
Has completado la instalación de Nextcloud 17 en CentOS 8 con Nginx y PHP-FPM 7.3, configurado MariaDB, SELinux y certificado SSL. Antes de ponerlo en producción, revisa backups, monitorización y políticas de parcheo.
Referencias
Materiales similares

Desactivar búsqueda en línea de Unity Dash

Aria en Opera: IA integrada y cómo probarla

Compartir juegos en Steam: guía rápida

Botones para compartir en Blogger con AddThis

Probar apps de pago en Mac gratis
