Instalación de Nextcloud + NGinx + PHP7 + MariaDB + Let’s Encrypt en Ubuntu 18.04
Después de algunos años usando un VPS con Ubuntu 14.04, decidí que era hora de actualizar a Ubuntu 18.04. De paso, también decidí que mi NextCloud que hasta el momento usaba Apache2 y PHP5, debería correr con NGinx y PHP7. Además, no podía tampoco actualizar a la última versión de Nextcloud debido a paquetes tan viejos.
A continuación les mostraré los pasos que yo seguí para hacer la instalación de NextCloud y las configuraciones necesarias para que funcione a la primera, con todos los ajustes para que en el panel de control no nos salgan advertencias de que si falta esto o faltó configurar lo otro.
Todos los paquetes que voy a instalar están en los repositorios de Ubuntu. Estoy dando por sentado que estamos utilizando un servidor recién instalado, sin ninguna instalación o configuración previa.
Instalando NGinx
Comenzamos por la instalación del servidor web.
$ sudo apt update $ sudo apt install nginx -y
Una vez terminada la instalación, activamos NGinx:
$ sudo systemctl start nginx $ sudo systemctl enable nginx
Instalando PHP 7.2
Ahora pasamos a instalar todos los paquetes necesarios de PHP.
$ sudo apt install php7.2-fpm php7.2-curl php7.2-cli php7.2-mysql php7.2-gd php7.2-iconv php7.2-xsl php7.2-json php7.2-intl php-pear php-imagick php7.2-dev php7.2-common php7.2-mbstring php7.2-zip php7.2-soap -y
Una vez instalado, tenemos que editar dos ficheros, y en ambos descomentar o añadir las mismas opciones:
$ sudo cd /etc/php/7.2/ $ sudo nano fpm/php.ini $ sudo nano cli/php.ini
Adentro de ambos ficheros, buscamos las dos opciones que muestro a continuación, las descomentamos y la ponemos de esta forma:
date.timezone = America/Chicago cgi.fix_pathinfo=1
Guardamos y salimos del editor. Ahora editamos otro fichero:
fpm/pool.d/www.conf
Y descomentamos todas estas opciones:
env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp
Reiniciamos y activamos PHP:
$ sudo systemctl restart php7.1-fpm $ sudo systemctl enable php7.1-fpm
Para que Nextcloud trabaje mejor, vamos a usar APCU para cachear todo y aunque hay varias formas de instalar php-apcu (que de hecho está en los repositorios) yo lo hice de la siguiente manera:
$ sudo pecl install apcu
Y una vez que se instale, añadimos la extensión a los módulos de PHP:
$ sudo echo "extension = apcu.so" | sudo tee -a /etc/php/7.2/mods-available/apcu.ini
Luego creamos unos enlaces simbólicos que serán necesarios:
$ sudo ln -s /etc/php/7.2/mods-available/apcu.ini /etc/php/7.2/fpm/conf.d/30-apcu.ini $ sudo ln -s /etc/php/7.2/mods-available/apcu.ini /etc/php/7.2/cli/conf.d/30-apcu.ini
Volvemos a reiniciar PHP:
$ sudo systemctl restart php7.1-fpm
Para comprobar que PHP está funcionando ejecutamos:
netstat -pl | grep php
Instalando MariaDB
Ahora instalamos MariaDB:
$ sudo apt install mariadb-server mariadb-client -y
Y una vez instalado aseguramos la instalación:
$ sudo mysql_secure_installation
Y seleccionamos las siguientes opciones:
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Accedemos a MariaDB con el comando:
$ mysql -u root -p
Colocamos el password que le pusimos a root en MariaDB y una vez dentro ejecutamos lo siguiente:
CREATE DATABASE nextcloud; CREATE USER nextclouduser@localhost IDENTIFIED BY 'tucontraseña'; GRANT ALL PRIVILEGES ON nextcloud.* TO nextclouduser@localhost IDENTIFIED BY 'tucontraseña'; FLUSH PRIVILEGES;
y eso es todo.
Instalando Let’s Encrypt
Estamos suponiendo que vamos a instalar el certificado SSL en un servidor que está de cara a Internet. Si es algo local, pueden ejecutar un certificado autofirmado.
$ sudo apt install letsencrypt -y
Detenemos a NGinx:
$ sudo systemctl stop nginx
Y luego ejecutamos este comando:
$ sudo certbot certonly --standalone -d tudominio.ltd
Nos va a pedir un correo para avisarnos cuando necesitemos renovar el certificado. Aceptamos las condiciones y se deben generar un par de ficheros dentro de la carpeta /etc/letsencrypt/live/tudominio.ltd/
Instalando Nextcloud
Vamos a proceder a instalar Nextcloud, pero primero un par de utilidades:
sudo apt install wget unzip zip -y
Ahora descargamos la última versión:
cd /var/www/html/ wget https://download.nextcloud.com/server/releases/latest.zip
Lo descomprimimos y creamos la carpeta data donde irán nuestros ficheros:
unzip latest.zip mkdir -p nextcloud/data/
Le cambiamos el propietario a la carpeta de Nextcloud:
chown -R www-data:www-data /var/www/html/nextcloud/
Creando el VirtualHost en Nginx
cd /etc/nginx/sites-available/ nano nextcloud
Al fichero creado le ponemos esto adentro:
upstream php-handler { server unix:/run/php/php7.2-fpm.sock; } server { listen 80; listen [::]:80; server_name tudominio.ltd; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name tudominio.ltd; ssl_certificate /etc/letsencrypt/live/tudominio.ltd/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tudominio.ltd/privkey.pem; # Add headers to serve security related headers add_header Strict-Transport-Security "max-age=15552000"; 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"; root /var/www/html/nextcloud/; location = /robots.txt { allow all; log_not_found off; access_log off; } location = /.well-known/carddav { return 301 $scheme://$host/remote.php/dav; } location = /.well-known/caldav { return 301 $scheme://$host/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$uri; } 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/.+)\.php(?:$|/) { fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param HTTPS on; #Avoid sending the security headers twice fastcgi_param modHeadersAvailable true; fastcgi_param front_controller_active true; fastcgi_pass php-handler; fastcgi_intercept_errors on; fastcgi_request_buffering off; } location ~ ^/(?:updater|ocs-provider)(?:$|/) { try_files $uri/ =404; index index.php; } location ~ \.(?:css|js|woff|svg|gif)$ { try_files $uri /index.php$uri$is_args$args; add_header Cache-Control "public, max-age=15778463"; 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; access_log off; } location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { try_files $uri /index.php$uri$is_args$args; access_log off; } }
El fichero /etc/nginx/nginx.conf debe verse de esta forma:
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Ahora creamos un enlace simbólico para activar nuestro VHost:
ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/ nginx -t
Y por último reiniciamos NGinx y PHP
service restart nginx service restart php7.1-fpm
En este punto ya podemos acceder a tudominio.ltd e instalar nuestro Nextcloud usando por supuesto, los datos de la base de datos y la ruta de la carpeta de instalación.
Configurando UFW
Activamos el Firewall y permitimos los puertos necesarios para que todo funcione:
$ sudo ufw allow ssh $ sudo ufw allow http $ sudo ufw allow https $ sudo ufw enable
Instalamos Fail2ban
Ahora instalamos Fail2Ban para el que se haga el chistoso de querer acceder por SSH a nuestro servidor:
$ sudo apt install fail2ban sendmail
Luego creamos el fichero
$ sudo touch /etc/fail2ban/jail.local
Y le ponemos esto adentro:
[DEFAULT] # email address to receive notifications. destemail = elavdeveloper@gmail.com # the email address from which to send emails. sender = root@ # name on the notification emails. sendername = Fail2Ban # email transfer agent to use. mta = sendmail # see action.d/ufw.conf actionban = ufw.conf # see action.d/ufw.conf actionunban = ufw.conf [sshd] enabled = true port = 6222 filter = sshd logpath = /var/log/auth.log # the length of time between login attempts for maxretry. findtime = 600 # attempts from a single ip before a ban is imposed. maxretry = 5 # the number of seconds that a host is banned for. bantime = 600 ignoreip = 127.0.0.1/8 70.X.X.X 71.X.X.X
Donde dice 70.X.X.X deben poner las IP que son confiables y que no caerán en las jaulas.
Activamos Fail2ban:
sudo systemctl restart fail2ban sudo systemctl enable fail2ban
Cambiando el puerto de SSH
Ya que estamos, cambiemos también el puerto de acceso de SSH. Editamos el fichero nano /etc/ssh/sshd_config y cambiamos la opción del puerto
Port 22
por
Port 5122
O el número que se te ocurra y que por supuesto ya no esté ocupado por otro puerto. Reiniciamos SSH y hemos terminado
Hemos terminado
Espero no se me haya quedado nada por el camino. La mayor parte de esta guía ha sido tomada de este enlace.
Prefiero algo más fácil 🙂
# snap install nextcloud
# nextcloud.enable-https -s
Es cierto que es menos personalizable.
Snap en un servidor? Usted Marcos, es muy valiente jajajaja.
Bueno, es una de las maneras oficiales de instalarlo:
https://nextcloud.com/install/#instructions-server (Pestaña Appliances).
De hecho, la Nextcloud Box te recomienda este método:
https://nextcloud.com/box/
«microSD card with Snappy Ubuntu Core as OS»
Un abrazo.
Mmmm interesante. Gracias por el dato Marcos, y un place tener por acá.
Abrazo de vuelta.
Interesante… estaba pensando en montarlo en una raspberry3, ya que no tengo un pc a mano. Cambiaría mucho??
Supongo que usarías Raspbian.. no creo que el método entre Debian y Ubuntu sea muy diferente.. Saludos
Te salteaste la carpeta /html en ‘chown -R www-data:www-data /var/www/nextcloud/’
Gran tutorial, saludos.
Cierto.. Corrigiendo, gracias.
Hace varias semanas instalé nextcloud en una pc dinosaurio de esas de antes del año 2000 con un pentium 4 de un solo procesador, 80GB de disco duro y con debian 9, la verdad fue para trastear: funciona muy bien, la pc como servidor de nextcloud sólo que con apache2, la desventaja es que gasta mucha energía eléctrica como para para dejarla 24/7, pero se puede dejar prendida sólo cuando salgas de casa.
y ahora el siguiente paso sigue instalar la nextcloud en una raspberry (pi 3b plus) con un disco duro de 2Tb para que solo consuma alrededor de 24 watts (con todo y el disco duro) y con mucho mejor rendimiento que la pc dinosaurio. Saludos.
Excelente. Ya nos contarás como te va.. Saludos
aquí un ejemplo de lo que se puede hacer con una raspberry como servidor
https://www.lastdragon.net/?p=2038
Hola. La configuración del servidor nginx no redirige correctamente de https://www a https:// Que hay que añadir para que funcione
No sé que está pasando, pero en este caso, en la configuración se está redireccionando de http://domain.ltd a https://domain.ltd. ¿Qué estás intentando hacer?
Hola buenas,
pero si pones http://www.domain.ltd entonces no te redirige a domain.ltd y como no lo hace te da error en el certificado de Let’s Encrypt. No es que sea un problema grabe, pero a mi me molesta
Saludos
A ver. El problema es que en este fichero de configuración como te dije, no está configurado el http://www.domaind.ltd.. para ello tendrías que añadir en el fichero de configuración que el servidor responda también a eso.. por ejemplo:
server_name tudominio.ltd www.tudominio.ltd;
Saludos
Hola,
Lo que propones no es ninguna solución. Lo estoy probando en mi servidor y no funciona. Pruebalo con el tuyo y verás que tampoco funciona.
Pues lo que propongo es justamente lo que uso y si me funciona. Comparte en algún lugar tu configuración completa para revisarla, algo debes estar poniendo mal.