Nextcloud

Instalación de Nextcloud + NGinx + PHP7 + MariaDB + Let’s Encrypt en Ubuntu 18.04

Escrito el y tuvo 17 comentarios

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

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 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.

Comparte:

¿Ideas? ¿Comentarios?

  1. Marcos 1 año atrás

    Prefiero algo más fácil 🙂

    # snap install nextcloud
    # nextcloud.enable-https -s

    Es cierto que es menos personalizable.

    Responder
    1. @Marcos:

      Snap en un servidor? Usted Marcos, es muy valiente jajajaja.

      Responder
      1. Marcos 1 año atrás
        @systeminside:

        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.

        Responder
        1. @Marcos:

          Mmmm interesante. Gracias por el dato Marcos, y un place tener por acá.

          Abrazo de vuelta.

          Responder
  2. Zicoxy3 1 año atrás

    Interesante… estaba pensando en montarlo en una raspberry3, ya que no tengo un pc a mano. Cambiaría mucho??

    Responder
    1. @Zicoxy3:

      Supongo que usarías Raspbian.. no creo que el método entre Debian y Ubuntu sea muy diferente.. Saludos

      Responder
  3. Percaff_TI99 1 año atrás

    Te salteaste la carpeta /html en ‘chown -R www-data:www-data /var/www/nextcloud/’

    Gran tutorial, saludos.

    Responder
    1. @Percaff_TI99:

      Cierto.. Corrigiendo, gracias.

      Responder
  4. 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.

    Responder
    1. @fedu:

      Excelente. Ya nos contarás como te va.. Saludos

      Responder
  5. aquí un ejemplo de lo que se puede hacer con una raspberry como servidor
    https://www.lastdragon.net/?p=2038

    Responder
  6. Hola. La configuración del servidor nginx no redirige correctamente de https://www a https:// Que hay que añadir para que funcione

    Responder
    1. @rasd:

      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?

      Responder
      1. @systeminside:

        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

        Responder
        1. @rasd:

          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

          Responder
          1. @systeminside:

            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.

            Responder
            1. @rasd:

              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.

              Responder

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.