Tabla de Contenidos
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:
- server unix:/var/run/php/php7.3-fpm.sock: El que interpreta nuestro código php 7.3.
- server_name prueban.floresvillatoro.com;: El dominio de nuestro sitio.
- ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;: Nuestro certificado
- ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;: La llave para el certificado
- 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
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
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:
- max_execution_time = 300
- max_input_time = 300
- memory_limit = 512M
- post_max_size = 16G
- upload_max_filesize = 16G
- 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:
- Haber usado una imagen de ARM64 en la raspberry
- 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:
- https://es.wikipedia.org/wiki/RAID#RAID_0_(Data_Striping,_Striped_Volume)