Herramientas de usuario

Herramientas del sitio


manuales:nextcloud

Instalación Nextcloud nginx+mariadb

Instalación de Nextcloud con las siguientes versiones de software:

  • Raspberry Pi: arquitectrura arm64
  • Nextcloud: 20.0.5
  • PHP: php-fpm 7.3.19
  • Nginx: 1.14.2
  • MariaDB: 10.3.27
  • IP: Dirección IPv4 de la Raspberry 192.168.0.126
  • DOMINIO: prueban.floresvillatoro.com

Instalación de paquetes

apt update
apt upgrade
apt install nginx-full php-fpm mariadb-server
apt install php-mbstring php-curl php-gd php-xml php-zip
apt install php-intl php-mysql php-exif php-ldap php-apcu php-imagick php-bcmath php-gmp
apt install  ffmpeg 

Verificar que el sitio http://192.168.0.126/ nos carga Configuración de DNS local, editamos en el servidor(raspberry pi) y en nuestra computadora linux el archivo /etc/hosts y agregamos la siguiente linea:

192.168.0.126  prueban.floresvillatoro.com

Y ya con eso, el sitio debera abrirnos con esa dirección.

Certificados

Para pruebas locales se recomienda usar certificados snakeoil, para ello instalamos:

apt install ssl-cert
ls /etc/ssl/certs/ssl-cert-snakeoil.pem
ls /etc/ssl/private/ssl-cert-snakeoil.key

Para entornos de producción con dominio de internet, se deben usar los certificados generados por letsencrypt con el certbot

apt install certbot python3-certbot-nginx python3-certbot-apache
certbot --nginx -d nube.midominio.com

Configuración del Nginx

Vamos a crear nuestro sitio en /srv/www/

Creamos la carpeta donde estarán los archivos de nuestros sitios:

mkdir -p /srv/www/prueba
chown www-data.www-data -R /srv/www
</bash>
 
Configuramos los VirtualHosts :
<code bash>
cd /etc/nginx/
ls -lh --color sites-available/
ls -lh --color sites-enabled/

Agregamos nuestra configuración del sitio:

nano sites-available/prueban.floresvillatoro.com.conf

Agregamos la configuración que esta mas abajo y deben de cambiar el dominio prueban.floresvillatoro.com por el que esten configurando. Además, deben prestarle atención a las siguientes lineas:

  1. server unix:/var/run/php/php7.3-fpm.sock: El que interpreta nuestro código php 7.3.
  2. server_name prueban.floresvillatoro.com;: El dominio de nuestro sitio.
  3. ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;: Nuestro certificado
  4. ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;: La llave para el certificado
  5. root /srv/www/prueba;: Lugar donde estan los archivos de nuestro sitio, nextcloud.
upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/var/run/php/php7.3-fpm.sock;
}
 
server {
    listen 80;
    listen [::]:80;
    server_name prueban.floresvillatoro.com;
 
    # Enforce HTTPS
    return 301 https://$server_name$request_uri;
}
 
server {
    listen 443      ssl http2;
    listen [::]:443 ssl http2;
    server_name prueban.floresvillatoro.com;
 
    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
 
    # HSTS settings
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
 
    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;
 
    # Enable gzip but do not remove ETag headers
    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$
 
    # Pagespeed is not supported by Nextcloud, so if your server is built
    # with the `ngx_pagespeed` module, uncomment this line to disable it.
    #pagespeed off;
 
    # HTTP response headers borrowed from Nextcloud `.htaccess`
    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;
 
    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;
 
    # Path to the root of your installation
    root /srv/www/prueba;
 
    # Specify how to handle directories -- specifying `/index.php$request_uri`
    # here as the fallback means that Nginx always exhibits the desired behaviour
    # when a client requests a path that corresponds to a directory that exists
    # on the server. In particular, if that directory contains an index.php file,
    # that file is correctly served; if it doesn't, then the request is passed to
    # the front-end controller. This consistent behaviour means that we don't need
    # to specify custom rules for certain paths (e.g. images and other assets,
    # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
    # `try_files $uri $uri/ /index.php$request_uri`
    # always provides the desired behaviour.
    index index.php index.html /index.php$request_uri;
 
    # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }
 
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
 
    # Make a regex exception for `/.well-known` so that clients can still
    # access it despite the existence of the regex rule
    # `location ~ /(\.|autotest|...)` which would otherwise handle requests
    # for `/.well-known`.
    location ^~ /.well-known {
        # The following 6 rules are borrowed from `.htaccess`
 
        rewrite ^/\.well-known/host-meta\.json  /public.php?service=host-meta-json  last;
        rewrite ^/\.well-known/host-meta        /public.php?service=host-meta       last;
        rewrite ^/\.well-known/webfinger        /public.php?service=webfinger       last;
        rewrite ^/\.well-known/nodeinfo         /public.php?service=nodeinfo        last;
 
        location = /.well-known/carddav     { return 301 /remote.php/dav/; }
        location = /.well-known/caldav      { return 301 /remote.php/dav/; }
 
        try_files $uri $uri/ =404;
    }
 
    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)              { return 404; }
 
    # Ensure this block, which passes PHP files to the PHP process, is above the blocks
    # which handle static assets (as seen below). If this block is not declared first,
    # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
    # to the URI, resulting in a HTTP 500 error response.
    location ~ \.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;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;
 
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }
 
    location ~ \.(?:css|js|svg|gif)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }
 
    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }
 
    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}
 
 

Ahora al darle ls sobre sites-available deberá aparecer nuestro archivo:

Activamos nuestro sitio con:

cd /etc/nginx/
ln -s /etc/nginx/sites-available/prueban.floresvillatoro.com.conf sites-enabled/

Verificamos que se ha creado el enlace simbólico correctamente con: Ahora borramos la configuración por defecto de nginx con:

rm sites-enabled/default

Verificamos que ya no esta el archivo

Reiniciamos el nginx y el php-fpm con:

systemctl restart nginx
systemctl restart php7.3-fpm

Ahora Recargamos el sitio http://192.168.0.126/ y nos mostrará el siguiente mensaje. Lo podemos pasar dándole en Vanzado…Aceptar el riesgo y continuar Nos mostrará un error por que no hemos definido ninguna página web.

Verificación funcionamiento PHP

Creamos el archivo /srv/www/prueba/info.php con el contenido siguiente (nano /srv/www/prueba/info.php):

<?php
  phpinfo();
?>

Y al cargar la página https://prueban.floresvillatoro.com/info.php deberá mostrarnos:

Configuración de MariaDB

mysql
mysql> CREATE DATABASE nextclouddb;
mysql> CREATE USER nextclouduser@localhost IDENTIFIED BY 'SUPERCLAVELOCA';
mysql> GRANT USAGE ON nextclouddb.* to nextclouduser@localhost;
mysql> GRANT ALL PRIVILEGES ON nextclouddb.* TO nextclouduser@localhost;
mysql> FLUSH PRIVILEGES;
mysql> exit

Deberán ver las confirmaciones asi como la siguiente imagen:

Instalación de Nextcloud 20.0.5

cd /srv/www/
wget https://download.nextcloud.com/server/releases/nextcloud-20.0.5.zip
unzip nextcloud-20.0.5.zip 
chown www-data.www-data -R  /srv/www/
ls -alh --color

Deberán ver los siguiente:

Editamos el archivo /etc/nginx/sites-enabled/prueban.floresvillatoro.com.conf (con nano), y cambiamos la linea:

  • root /srv/www/prueba/; por root /srv/www/nextcloud/;

y reiniciamos nginx y php con:

systemctl restart nginx
systemctl restart php7.3-fpm

Ahora continuamos la instalación desde nuestro navegador web, abriendo la página https://prueban.floresvillatoro.com/ que deberá mostrar:

Llenamos los datos de nuestro usuario de nextclou y los de la base de datos, ver siguiente imagen. En que el la página nos de un time-out, solo es de refrescar la página y nos dara el login: Ahora solo es de ingresar el usuario y la clave que definimos y nos cargara nextcloud

Seguridad y Otros

PATH de php

nano /etc/php/7.3/fpm/pool.d/www.conf

Descomentar

;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

Seguridad de cabecera de HTTP

https://help.nextcloud.com/t/nginx-strict-transport-security-http-header-is-not-configured-to-at-least-15768000-seconds/916

nano /etc/nginx/sites-enabled/prueban.floresvillatoro.com.conf 

Agregar en la configuración del nginx justo despues de la linea que contiene add_header X-XSS-Protection “1; mode=block” always;

 add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";

Luego reiniciamos el nginx y el php-fpm

Habilitar el cache ACPU

https://docs.nextcloud.com/server/19/admin_manual/installation/server_tuning.html https://docs.nextcloud.com/server/19/admin_manual/configuration_server/caching_configuration.html

Agregar estas lineas justo despues de la linea que contiene [opcache] en el archivo /etc/php/7.3/fpm/php.ini

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

Y activar el cache en la configuración del nextcloud en el archivo /srv/www/nextcloud/config/config.php agregar justo despues de 'installed' ⇒ true, : 'memcache.local' ⇒ '\OC\Memcache\APCu',

Agregar al final del archivo el apc enable en /etc/php/7.3/cli/php.ini

apc.enable_cli = 1

y reiniciamos nginx y php con:

systemctl restart nginx
systemctl restart php7.3-fpm

Ejecutar comandos de mantenimiento de Nextcloud

Algunas ocasiones es necesario ejecutar algunos comandos de mantenimiento para arreglar problemas de la base de datos, estos comanod usualmente se pueden encontrar en el sitio https://prueban.floresvillatoro.com/settings/admin/overview y elli simplemente ejecutan:

sudo -u www-data php /srv/www/nextcloud/occ db:add-missing-indices

Configuración CRON

Siguiendo la guia oficial de Nextcloud para Cron, lo que hacemos es como root ejecutar:

crontab -u www-data -e

Luego elegimos el editor nano Y agregamos la siguiente linea al final de archivo

*/5  *  *  *  * php -f /var/www/nextcloud/cron.php

Luego verificamos que se haya agregado la linea

crontab -u www-data -l

php.ini

Tambien es bueno hecharle un vistazo a estas configuraciones del archivo php.ini.

Abrir el archivo /etc/php/7.3/fpm/php.ini y verificar:

  1. max_execution_time = 300
  2. max_input_time = 300
  3. memory_limit = 512M
  4. post_max_size = 16G
  5. upload_max_filesize = 16G
  6. date.timezone = America/El_Salvador

y reiniciamos nginx y php con:

systemctl restart nginx
systemctl restart php7.3-fpm

Collabora CODE Arm64 Instalación

Collabora CODE no se puede instalar en un Raspberry Pi OS(antes Raspbian OS) por que las imagenes oficiales son para arquitecturas ARMHF y Collabora solo se puede instalar en arquitecturas x86-64 , pero existe este proyecto para instalarlo en ARM64 con fuse. Requisitos:

  1. Haber usado una imagen de ARM64 en la raspberry
  2. Tener instalado nextcloud

Primero configuramos el nextcloud para que pueda resolver el servicio del Collabora CODE, para ello editamos el archivo /etc/nginx/sites-enabled/prueban.floresvillatoro.com.conf ye le agregamos esto al final de la sección server { antes del último }.

   location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
       fastcgi_split_path_info ^(.+?.php)(\/.*|)$;
       set $path_info $fastcgi_path_info;
       try_files $fastcgi_script_name =404;
       include fastcgi_params;
       #include php_optimization.conf;
   }
systemctl restart nginx
systemctl restart php7.3-fpm

Instalamos el Collabora Built-in CODE Server (ARM64)

cd /srv/www/nextcloud/
sudo -u www-data php -d memory_limit=512M ./occ app:install richdocumentscode

Nos mostrará un error de que solo esta diseñado para la arquitectura x86-64, pero lo ignoramos.

Instalamos la aplicación Collabora Online en el listado de aplicaciones para nextcloud.

Luego verificamos que la aplicación este activa en la interfaz de administración de nextcloud: https://prueban.floresvillatoro.com/settings/admin/richdocuments

Ver:

Estado, Deteniendo, Iniciando y Reiniciando Servicios

Nginx

systemctl status nginx
systemctl stop nginx
systemctl start nginx
systemctl restart nginx

PHP-FPM 7.3

systemctl status php7.3-fpm
systemctl stop php7.3-fpm
systemctl start php7.3-fpm
systemctl restart php7.3-fpm

En caso de que falle algo, podemos ver logs de errores con los siguientes comandos

journalctl -xe
tail -n 200  /var/log/syslog

RAID Espejo

Se va a configurar nextcloud con un arreglo de discos RAID1 por sotware con mdadm con un disco SPARE para tener una copia de seguridad en caso de que un disco se arruine.

Requisitos:

Debian Stretch

root@plantilla:/home/ues# lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch

Tres discos de 8 GB

root@plantilla:/home/ues# fdisk  -l
Disco /dev/sdb: 8 GiB, 8589934592 bytes, 16777216 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
 
 
Disco /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: dos
Identificador del disco: 0xaa82d50e
 
Disposit.  Inicio Comienzo    Final Sectores Tamaño Id Tipo
/dev/sda1  *          2048 12582911 12580864     6G 83 Linux
/dev/sda2         12584958 16775167  4190210     2G  5 Extendida
/dev/sda5         12584960 16775167  4190208     2G 82 Linux swap / Solaris
 
 
Disco /dev/sdd: 8 GiB, 8589934592 bytes, 16777216 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
 
 
Disco /dev/sdc: 8 GiB, 8589934592 bytes, 16777216 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes

Referencia:

manuales/nextcloud.txt · Última modificación: por manuel.floresv