La historia de la creación de una nube doméstica. Parte 3. Crear una nube personal: instalar y configurar Nextcloud

En el camino a la creación de nuestro propio servicio en la nube, mientras nos acostumbramos al sistema Debian y creamos un servidor web . Ahora es el momento del paso final: crear y configurar una nube personal basada en el servidor de Nextcloud.





Tabla de contenidos


Parte 1. Configurar su entorno Debian para el uso diario
Parte 2. Crear un servidor - configurar LAMP en Debian
Parte 3. Crear una nube personal: instalar y configurar Nextcloud
Parte 4. Actualización 2018 - Debian 9 y Nextcloud 13
Parte 5. Actualización 2019 - PHP 7.2, MariaDB 10.4 y Nextcloud 17



Navegación rápida de capítulos


Prólogo
Preparando un servidor para instalar Nextcloud
Instalar Nextcloud
Organizando el almacenamiento de Nextcloud
Configure el acceso a la máquina virtual de Nextcloud desde la red de área local
Configuración de Nextcloud
Ajuste avanzado de Nextcloud
Protección para Nextcloud
Smartphone Cloud Sync
Sincronización en la nube de computadora personal
Epílogo



Prólogo


Entonces llegamos a la cosa para la cual todo comenzó y hacia la cual no avanzamos rápidamente. Esta parte describirá la instalación y algunos puntos en la configuración del servidor Nextcloud en la máquina virtual VMWare, así como una pequeña experiencia trabajando con él en la forma de sincronizar el contenido de un par de teléfonos inteligentes y carpetas basados ​​en Windows en una computadora de escritorio. Las siguientes instrucciones de instalación para Nextcloud implican que el servicio se implementa en un servidor que se creó de acuerdo con las instrucciones de la parte anterior de mi historia.

Inicialmente, este capítulo fue planeado para ser pequeño, ya que quería limitarme a describir la instalación y configuración de Nextcloud, esencialmente terminando esta historia sobre "simplemente ingresar a Linux para una tarea específica". Pero, pensando que esto podría parecer interesante para alguien, decidió mostrar cómo resolví el problema de sincronizar las carpetas de la computadora de mi casa, por lo que este capítulo final fluyó sin problemas de las instrucciones claras sobre qué y cómo hacer en la programación. Esto explica algunas "vinagretas" en esta parte: comienza con el trabajo y la configuración en Linux, fluye al nivel de la red y la configuración de software virtual, y termina con muletas de planeo en Windows. Por otro lado, esta serie de artículos tiene el título "Historia de la creación ..." y decidí contarlo hasta el final.

Nota
Al seguir leyendo en las construcciones del formulario http: // 127.0.0.1 (https: // 127.0.0.1), el espacio después de http: // (https: //) debe eliminarse al ingresar a la barra de direcciones del navegador. Se insertó un espacio al publicar este artículo para evitar que el motor convierta automáticamente el texto en enlaces.



Preparando un servidor para instalar Nextcloud


Nextcloud es una aplicación web que tiene un conjunto de archivos y funciona con una determinada base de datos MySQL. La aplicación web se instala como un sitio normal, para cuya instalación debe cargar los archivos del "motor" en el servidor, ejecutar el archivo de instalación y especificar los detalles de acceso a la base de datos creada previamente para este sitio durante la instalación.

Cree un directorio en el que se colocarán los archivos de Nextcloud:
# mkdir / var / www / nextcloud

Decidí rechazar HTTP, dejando el acceso solo a través de HTTPS. Para hacer esto, necesita configurar apache.

Abre el archivo:
# nano /etc/apache2/sites-available/default-ssl.conf
Y antes de la etiqueta, agregue el siguiente contenido:

<Directory /var/www/nextcloud> Options FollowSymLinks AllowOverride All Require all granted </Directory> 


Deshabilitar configuración HTTP:
# a2dissite 000-default.conf

Cerrar puerto 80:
# ufw delete allow 80

Y reinicie el servidor web:
# service apache2 restart

Ahora necesita crear una base de datos para nextcloud. Ingresamos mysql ingresando la contraseña del superusuario mysql:
# mysql -u root -p

Crea una base de datos llamada nextcloud:
mysql> CREAR BASE DE DATOS `nextcloud`;

Cree un usuario con el nombre nextcloud y la contraseña trivial nc123:
mysql> CREAR USUARIO 'nextcloud' @ 'localhost' IDENTIFICADO POR 'nc123';

Le damos acceso completo al usuario de nextcloud a la base de datos de nextcloud:
mysql> OTORGA TODOS LOS PRIVILEGIOS EN `nextcloud`. * A 'nextcloud' @ 'localhost';

Actualizar tabla de privilegios:
mysql> PRIVILEGIOS DE LAVADO;

Salga de mysql:
mysql: mysql> salir

Además, necesita instalar módulos adicionales para PHP:
# apt-get install curl libcurl3 libcurl3-dev php5-curl
# a2enmod reescribir

En la primera parte de esta historia, abrimos puertos para la interacción de la red y el correo, pero para nuestro objetivo no son necesarios y es mejor cerrarlos. Eliminar las reglas:
# ufw delete allow 138 / udp
# ufw delete allow 139 / udp
# ufw delete allow 139 / tcp
# ufw delete allow 445 / tcp
# ufw delete permite 25
# ufw delete allow 465
# ufw delete allow 110
# ufw delete allow 143
# ufw delete allow 993



Instalar Nextcloud


Descargue los archivos y descomprímalos en el directorio deseado:
# wget download.nextcloud.com/server/releases/nextcloud-11.0.2.tar.bz2
# tar xjf nextcloud-11.0.2.tar.bz2 -C / var / www

Cambiar permisos de carpeta:
# chmod 755 / var / www / nextcloud

Y asignamos al propietario de esta carpeta un servidor web para que no haya problemas al escribir en ella:
# chown -R www-data: www-data / var / www / nextcloud

Eso es todo! El servicio está instalado, si escribe en el navegador https: // 127.0.0.1/nextcloud, se abre el asistente de instalación. Pero esperemos con esto, habiendo preparado previamente un lugar para almacenar datos de usuario.

Vale la pena mencionar que Nextcloud versión 11.0.2 actualmente está bastante desactualizada y contiene vulnerabilidades que no están presentes en las versiones más nuevas y más actuales, por lo que si instala la rama 11.x, entonces es mejor instalar una versión más reciente (a principios de 2018 - esto versión 11.0.7).



Organizando el almacenamiento de Nextcloud


Esta parte es opcional y se puede omitir sin problemas: todo funcionará sin ella. Sin embargo, si va a crear un directorio de datos fuera de la máquina virtual, le recomiendo que se familiarice con él.

Por defecto, el contenido sincronizado se almacenará en el directorio / var / www / nextcloud / nxcdata. Esta opción no me convenía de inmediato por varias razones. Por un lado, no quisiera aumentar constantemente el tamaño del archivo de un disco virtual. Por otro lado, me gustaría tener una solución de almacenamiento de datos de máquina virtual separada e independiente. Lo más simple que viene a la mente de inmediato es el uso de una unidad USB. Si no hay suficiente espacio, la unidad simplemente se puede reemplazar. Si es necesario, se puede conectar a otra computadora y descargar los archivos necesarios. Móvil y conveniente. Sin embargo, no quería usar USB 2.0 debido al ancho de banda relativamente pequeño para los estándares modernos, y no tuve éxito con USB 3.0: el software de virtualización (WMVare y VirtualBox) no quería reenviar normalmente los dispositivos conectados a través de un controlador USB 3.0.

Mi apetito en el proceso de creación de la nube ha aumentado y ya no tenía menos de un terabyte, así que al final decidí conectar un disco duro normal de dos terabytes a la máquina virtual, que ya estaba ubicada y conectada dentro de la computadora. Si es necesario, puede extraerse sin problemas y conectarse a través del adaptador SATA <-> USB 3.0 existente.

Por lo tanto, la idea principal es organizar un punto permanente para conectar un directorio con contenido de usuario fuera del directorio / var / www / nextcloud, en el que se crea un enlace simbólico llamado nxcdata que se refiere al directorio de datos real, que se puede conectar de varias maneras en diferentes medios.

Crea un directorio:
# mkdir / mnt / nxcdata

Cambiamos los derechos:
# chmod 770 / mnt / nxcdata

Hacemos que el propietario del servidor web:
# chown www-data: www-data / mnt / nxcdata

Puedo colocar los datos en cualquier lugar y en cualquier lugar, lo principal es colocar un enlace simbólico a este directorio en el directorio / mnt / nxcdata y nombrarlo nxcdata, es decir la ruta completa se verá como / mnt / nxcdata / nxcdata.

Primero, probé la solución para la carpeta local que creé en el directorio de inicio.

Creó una carpeta en el lugar correcto:
$ mkdir / inicio / usuario / nxcdata

Cambió los derechos:
# chmod 755 / home / user / nxcdata

Propiedad del servidor web:
# chown -R www-data: www-data / home / user / nxcdata

Creó un enlace simbólico:
# ln -s / home / user / nxcdata / mnt / nxcdata / nxcdata

Esta solución fue viable, por lo que puede seguir adelante. El directorio de datos externo se puede conectar de dos maneras: a través del servicio VMWare Shared o directamente como un disco físico o partición. Debe entenderse que la primera solución es posible solo si se instalan las herramientas de vmware, que se instalan sin problemas solo si hay una interfaz gráfica del sistema operativo (de lo contrario, tendrá que editar los scripts de instalación de las herramientas de vmware). Si abandonamos la interfaz gráfica, solo queda la opción de conectar el disco directamente a la máquina virtual, pero con esta solución tuve que sufrir mucho. Después de algún tiempo, todavía encontré una versión de trabajo estable, teniendo en cuenta que se inventó un script universal, que incorporaba ambas opciones de conexión.

Para una carpeta conectada mediante VMWare Shared Folders en la sección Carpetas compartidas de la configuración de la máquina virtual, debe conectar la carpeta necesaria desde el sistema host y asignarle el nombre vmw-nxcdata. Esta carpeta puede hacer referencia a algún directorio en el disco duro o directamente al directorio raíz de algún disco en el sistema host.

La carpeta montada aparecerá en el sistema virtual automáticamente a lo largo de la ruta / mnt / hgfs / vmw-nxcdata. Sin embargo, el problema es que el servidor web no tendrá suficientes derechos para escribir archivos a lo largo de esta ruta y los medios estándar del sistema no pueden reasignar los derechos a este directorio. Por lo tanto, tuve que descubrir cómo montar manualmente dichos recursos.

Crea una carpeta:
# mkdir / mnt / vmw-nxcdata

Montamos utilizando el módulo vmhgfs, que se instaló con vmware-tools:
# mount -t vmhgfs -o uid = www-data, gid = www-data, fmask = 007, dmask = 007 .host: / vmw-nxcdata / mnt / vmw-nxcdata

El montaje debe realizarse exactamente con estos parámetros para un funcionamiento sin problemas del servidor web en el futuro. Inicialmente, monté sin especificar uid / gid y máscaras, pero luego no condujo a nada bueno, ya que ya no era posible cambiar los derechos después del montaje. Después de completar el montaje, puede mostrar: "No se pudo agregar la entrada a mtab, continuando", pero se montará y funcionará.

Genial, montamos el directorio. Ahora puede colocar un enlace simbólico a este directorio en / mnt / nxcdata. Pero no me gustaría hacer esto manualmente cada vez que inicio o reinicie el servidor. La forma más fácil es ingresar el comando anterior en el archivo /etc/rc.local para montarlo en la línea "exit 0". Sin embargo, quería que el desmontaje automático se llevara a cabo cuando la máquina virtual se apaga para una seguridad de datos confiable. Y decidí hacer todo a nivel de servicio y lidiar un poco con los mecanismos init / update-rc, más aún tenía curiosidad y resultó ser bastante interesante.

El significado de las siguientes acciones es crear un servicio del sistema que se llamaría y ejecutaría comandos predefinidos cuando el sistema se enciende o apaga. El servicio se describe mediante un script compilado de acuerdo con ciertas reglas y se encuentra en /etc/init.d. El bloque INIT INFO se encuentra al comienzo del script y contiene información de servicio en la que me gustaría mencionar las directivas Default-Start y Default-Stop: especifican los niveles de ejecución en los que el script debe iniciarse o detenerse de manera predeterminada.

Niveles de ejecución:

0: ejecución del script cuando el sistema está apagado
1 - ejecución del script al inicio del sistema en modo de usuario único
2 - ejecución del script al inicio del sistema en modo multiusuario
3 - 5 - reservado
6 - ejecución del script al reiniciar el sistema

Después de escribir el script, se activa utilizando el mecanismo update-rc, que, de hecho, crea enlaces al script en los directorios necesarios /etc/rc0.d - /etc/rc6.d, cuyo contenido corresponde a las tareas realizadas por los niveles de ejecución. Los enlaces se pueden crear de forma independiente, pero, a diferencia de habilitar o deshabilitar las configuraciones del servidor web apache, debe tener en cuenta muchos matices aquí, por lo que debe habilitar o deshabilitar el servicio a través de update-rc.

Entonces, crea un archivo:
# nano /etc/init.d/nxcdata_automount.sh

Y escriba los siguientes contenidos en él:

 #!/bin/sh # nxcdata_automount.sh 1.0 ### BEGIN INIT INFO # Provides: myscript # Required-Start: # Required-Stop: # Default-Start: 1 2 3 4 5 # Default-Stop: 0 6 # Short-Description: nxcdata_automount.sh 1.0 # Description: nxcdata_automount.sh 1.0 ### END INIT INFO . /lib/lsb/init-functions # Start actions perform_start() { log_daemon_msg «Start nxcdata_automount» sleep 30 mount -t vmhgfs -o uid=www-data,gid=www-data,fmask=007,dmask=007 .host:/vmw-nxcdata /mnt/vmw-nxcdata #mount -t ntfs-3g -o uid=www-data,gid=www-data,fmask=007,dmask=007 /dev/sdb1 /mnt/sdb1 #mount -t ext4 /dev/sdb1 /mnt/sdb1 sleep 5 service fail2ban restart log_end_msg 0 return 0 } # Stop actions perform_stop() { log_daemon_msg «Stop nxcdata_automount» umount /mnt/nxcdata log_end_msg 0 return 0 } case $1 in start) perform_start ;; stop) perform_stop ;; *) echo “Usage: /etc/init.d/myscript {start|stop}” exit 3 ;; esac 


Preste atención a un par de equipos comentados en la sección perform_start: esta es nuestra base para el futuro. Además, después del montaje, se reinicia el servicio fail2ban.

La paradoja es que después de un año ya no recuerdo por qué hice esto, pero dudo mucho que se haya hecho así. Obviamente, después de montar el servicio, por alguna razón, el servicio se bloqueó o no pudo iniciarse inicialmente y tuvo que reiniciarse manualmente.

Después de tal distracción, continuamos configurando más. Crea un enlace simbólico:
# ln -s / mnt / vmw-nxcdata / mnt / nxcdata / nxcdata

Hacemos que nuestro script sea ejecutable:
# chmod + x /etc/init.d/nxcdata_automount.sh

Agregue el script al inicio:
# update-rc.d nxcdata_automount.sh por defecto

Reiniciamos el sistema y nos aseguramos de que el montaje automático haya sido exitoso y de que todo sea accesible de la manera correcta.

Para eliminar el script, deberá ejecutar un par de comandos:
# update-rc.d -f nxcdata_automount.sh eliminar
# rm -f /etc/init.d/nxcdata_automount.sh

En el caso de montar una unidad no a través de VMWare Shared Folders, debe seguir directamente los mismos pasos que cuando se monta a través de VMWare Shared Folders, pero teniendo en cuenta el hecho de que aparece una segunda unidad completa en el sistema. ¿Cómo encontrar la letra de unidad?

La mayoría de los dispositivos de bloque de Linux están conectados a través de la interfaz SCSI, por lo que en la mayoría de los casos los discos comenzarán con las letras sd. La tercera letra en el nombre del disco significa su número de serie en el sistema y se indica alfabéticamente: sda - el primer disco, sdb - el segundo disco, sdc - el tercero y así sucesivamente. Luego viene el número que define el número de partición en el disco: sda1, sda2, etc. La manera más fácil de ver todas las unidades asignadas es mirar el contenido del directorio / dev / y filtrar los dispositivos SD:

$ ls -l / dev / | grep sd

Por ejemplo, necesitamos conectar una unidad sdb1 con un sistema de archivos NTFS.

Cree un directorio y monte el disco en él:
# mkdir / mnt / sdb1
# mount -t ext4 / dev / sdb1 / mnt / sdb1

Cree un directorio para los datos, establezca los derechos y el usuario para ellos:
# mkdir / mnt / sdb1 / nxcdata & chmod 770 / mnt / sdb1 / nxcdata & chown -R www-data: www-data / mnt / sdb1 / nxcdata

A continuación, también debe crear un script para el montaje automático y ajustar el comando de montaje en el script (los ejemplos de conexión de una unidad con NTFS y EXT4 ya están en el script y comentados) y agregar el script al inicio.

B crea un enlace simbólico al directorio de datos:
# ln -s / mnt / sdb1 / nxcdata / mnt / nxcdata / nxcdata

De hecho, todos estos problemas con un montón de directorios nxcdata están diseñados para una cosa: para proporcionar una transferencia simple del directorio de datos en el futuro: no necesitará editar la configuración en el motor de Nextcloud y, en general, acceder a ella: todo lo que necesita hacer es conectar un nuevo disco, copiar a le datos y recrear un enlace simbólico que conduce a un nuevo directorio con datos. Al mismo tiempo, todas las acciones no van más allá del directorio / mnt. Así que todo resultó ser complicado evolutivamente, simplemente no quería perder las soluciones que tenía.

¿Cuál es la mejor manera de transferir datos fuera de la máquina virtual? Compartiré mi experiencia sobre qué opción dejé y por qué.

Las unidades USB se capturaron automáticamente cuando la máquina virtual se encendió, se arrojaron correcta y completamente dentro, y todo funcionó siempre, pero solo hasta que la unidad se desconectó del sistema por alguna razón. El reinicio o la desconexión física y la conexión de un disco ayudaron. La decisión resultó ser poco confiable. No hubo tal problema con las unidades flash, pero su volumen y velocidad de trabajo categóricamente no me convenían. Quizás valió la pena probar un disco externo con energía autónoma.

El reenvío de directorios a través de VMWare Shared Folders funcionó de manera estable y perfecta. Esta solución satisfizo completamente la tarea de sincronizar dos teléfonos inteligentes. Todo funcionó durante varios días, se bombearon decenas de gigabytes de datos. Sin embargo, cuando decidí agregar datos de la computadora a la nube, de repente encontré un problema con rutas largas y nombres de archivos. En teoría, el límite de nombre de archivo / carpeta NTFS es de 255 caracteres, pero en la práctica la API de Windows lo limita a 244 caracteres. En teoría, el límite en la longitud de la ruta a un archivo o carpeta en NTFS es de 32.767 caracteres, pero en la práctica, la API de Windows lo limita a 245 caracteres. Dado que soy un gran admirador de la estructuración de la información, la longitud de mi camino puede ser muy grande. El título no abreviado de los libros también puede ser fácilmente de 100 a 150 caracteres, incluidos los espacios. Esta restricción es un problema conocido de VMWare Shared Folders, que no se pudo curar incluso cuando se usa Windows 10 con todo tipo de claves inteligentes en el registro para eliminar el límite de 255 caracteres. Una posible razón son las limitaciones de vmhgfs. Esta forma conveniente de conectarse tuvo que ser abandonada. La razón es segura: el problema está en el sistema de archivos virtual, que se utiliza en el mecanismo de carpetas compartidas VMWare.

La siguiente solución es conectar el disco duro directamente a la máquina virtual. Tampoco funcionó sin problemas. La estructura de datos (o sistema de archivos, y esto era evidente tanto para NTFS como para EXT2 / 3/4) se descompuso constantemente cuando el disco o su partición fue "capturada" por el software de la máquina virtual, o cuando fue devuelta al sistema host incluso si transfirí todo Conduzca sin conexión en el sistema host. En algunos modos, no escribo ni leo datos; ni siquiera pude formatear correctamente el disco duro o la partición reenviados. Sin embargo, logramos encontrar un modo de trabajo: un disco duro físico con una partición, formateado en NTFS, estaba conectado a la máquina virtual en un cierto modo de conexión: SATA / Independiente / Persistente / Usar partición individual. La carpeta nxcdata que contiene los datos debe estar en el disco duro.



Configure el acceso a la máquina virtual de Nextcloud desde la red de área local


No tenemos problemas para abrir sitios web dentro de una máquina virtual o desde un sistema host. Pero, ¿cómo abrir el sitio creado desde otra computadora en la red local? Veamos la estructura de nuestra red, que se muestra a continuación.



La imagen muestra que el enrutador está conectado directamente a Internet y configurado para que distribuya automáticamente las direcciones IP a los dispositivos conectados en el rango 192.168.0.2-192.168.0.254. La dirección 192.168.0.2 fue recibida por nuestra computadora y 192.168.0.3, la segunda computadora en la que hacemos el servidor. Sin embargo, el software de virtualización está instalado en la segunda computadora, que creó su propio enrutador virtual y configuró su DHCP en la subred 192.168.233.0/24. Nuestro servidor virtual recibió IP 192.168.133.138.

Puedo abrir fácilmente el sitio dentro de la máquina virtual 192.168.233.138. Puedo abrir fácilmente el sitio desde la máquina 192.168.0.3 simplemente ingresando la dirección IP deseada en el navegador: el software de virtualización ya se ha encargado de la configuración correcta del entorno de red en la máquina host. Pero, ¿cómo llego al sitio desde la computadora 192.168.0.2? Si ingreso la dirección IP 192.168.233.138, no se abrirá nada para mí, ya que ni mi computadora ni el enrutador real saben nada sobre esta subred. Si ingreso la dirección 192.168.0.3, tampoco se abrirá nada para mí, ya que realmente no hay un sitio en esta computadora, está dentro de su máquina virtual.

Para resolver este problema, debe configurar el enrutador virtual de la computadora 192.168.0.3. Ya sabemos que el acceso a los sitios va por los puertos 80 y 443. Cuando accedemos a estos puertos a una máquina 192.168.0.3, necesitamos construir un enrutamiento para que las solicitudes se envíen a la máquina virtual 192.168.233.138. Afortunadamente para esto tenemos las herramientas disponibles. VMWare Workstation tiene una herramienta Virtual Network Editor que se puede abrir desde el menú de la máquina virtual (Editar -> Virtual Network Editor).



Esta herramienta le permite administrar con bastante flexibilidad la configuración de la red. Necesitamos seleccionar la tarjeta de red virtual VMNet8 y hacer clic en el botón "Configuración de NAT ..." que está disponible. En la ventana que se abre, debe agregar reglas para crear la ruta que necesitamos.



Especifique el puerto del sistema host y luego especifique la dirección IP y el puerto de la máquina virtual donde se deben redirigir las solicitudes. Para reenviar tráfico HTTPS, debe especificar el puerto del sistema host 443 y el puerto 443 y la dirección de la máquina virtual 192.168.233.138. Después de crear las reglas, haga clic en "Aceptar" en todas las ventanas: el entorno de red virtual se reconfigura automáticamente.

Después de estos cambios, nuestros sitios comenzarán a abrirse desde la máquina 192.168.0.2 al acceder a la dirección 192.168.0.3.

Configuraciones similares para el reenvío de puertos están disponibles no solo para VMWare, sino también para VirtualBox (Configuraciones → Red → seleccione el adaptador requerido → Avanzado → Reenvío de puertos). Sin embargo, durante los experimentos para conectar el disco duro a esta etapa, encontré el VMWare Player gratuito instalado, en el que no estaba el Virtual Network Editor. No encontré nada sobre el reenvío de puertos para VMWare Player en Internet y tuve que usar una versión de prueba de VMWare Workstation; al instalar el producto, me da 30 días de uso gratuito. Después de 30 días, el producto se puede quitar, limpiar e instalar nuevamente, pero esa atención al servidor es de alguna manera redundante y claramente indeseable. ( ) . VMWare Workstation vmnetcfg, Virtual Network Editor. VMWare Player . VMWare Player - ? VMWare Player, . , . , VMWare Player , , .

, . Port Forwarding, , IP . . IP , – IP , , . , IP NAT , «» IP ? , «» IP. , . dyndns freedns.afraid.org , VDS - , IP .

IP 192.168.0.3 192.168.233.138, , .



Nextcloud


https:// 127.0.0.1/nextcloud , https:// 192.168.233.138/nextcloud , , https:// 192.168.0.3/nextcloud .

/ , , nxcdata: /mnt/nxcdata/nxcdata. - .

:

— Personal → e-mail user@localhost
— → →
— → Usage survey →
— → → : « » 25 GB
— → users user

.

:
# nano /var/www/nextcloud/config/config.php

, «);» :

'memcache.local' => '\OC\Memcache\Memcached',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
array('localhost', 11211),
),


«».

:
# nano /var/www/nextcloud/config/config.php

trusted_domains IP , , Nexcloud. trusted_domains :

'trusted_domains' =>
array (
0 => '127.0.0.1',
1 => '192.168.233.138',
),


– user. , – , IP 192.168.0.3 , .
, , subversion, . , , - .

wtigga 2017 « VPS: «» Nextcloud» . , , Nextcloud, 12- .



«» Nextcloud


, . , . – . , .

, , 11.0.2, . 12. - , , 11.x .

1

«file is locked». . — oc_file_locks mysql ( nextcloud) :
mysql > DELETE FROM oc_file_locks WHERE 1

, , :
# nano /root/empty_oc_file_locks

:

 #!/bin/bash mysql -unextcloud > -pnc123 -D nextcloud <<MY_QUERY DELETE FROM oc_file_locks WHERE 1 MY_QUERY 


, . 15 cron (https://ru.wikipedia.org/wiki/Cron ).
:
# nano /root/crontab

:

*/15 * * * * root bash /root/empty_oc_file_locks


:
# crontab /root/crontab

:
# crontab -l

2

webDAV ( , ) :

Error PHP reset() expects parameter 1 to be array, null given at /var/www/nextcloud/apps/files_versions/lib/Storage.php#783
Error PHP ksort() expects parameter 1 to be array, null given at /var/www/nextcloud/apps/files_versions/lib/Storage.php#782
Error PHP Invalid argument supplied for foreach() at /var/www/nextcloud/apps/files_versions/lib/Storage.php#759
Error PHP Undefined index: by_file at /var/www/nextcloud/apps/files_versions/lib/Storage.php#759
Error PHP Undefined index: all at /var/www/nextcloud/apps/files_versions/lib/Storage.php#757


. «Undefined index… Storage.php#757», . . . (Storage.php#757) . - , «». «, » , , 100TB.

3

.htaccess – ! , . . . , , , nextcloud.
/var/www/nextcloud/lib/private/Files/filesystem.php :

$blacklist = \OC::$server->getConfig()->getSystemValue('blacklisted_files', array('.htaccess'));


:

$blacklist = \OC::$server->getConfig()->getSystemValue('blacklisted_files', array(''));




Nextcloud


fail2ban. , nextcloud , .

:
# nano /etc/fail2ban/filter.d/nextcloud.conf

:

[Definition]
failregex={«reqId»:".*",«remoteAddr»:".*",«app»:«core»,«message»:«Login failed: '.*' \(Remote IP: ''\)»,«level»:2,«time»:".*"}
ignoreregex =

:
# nano /etc/fail2ban/jail.local

:

# nextcloud
[nextcloud]
enabled = true
port = http,https
protocol = tcp
filter = nextcloud
logpath = /var/log/nextcloud.log


:
# service fail2ban restart

:
# fail2ban-client status nextcloud

, fail2ban 12 IP 30 . - - , .




, Android, FolderSync. .

, https:// 192.168.0.3/nextcloud, . «» , .

. – « ». ( » . 2 . « » « », . «» Wi-Fi, SSID Wi-Fi « WiFi SSID'» — . . . « » [nosync]. , , «[nosync]».

DCIM, Download, Telegram, viber, WhatsApp. . , , . - .




. , . , 15 /++, - , BAT/CMD Sign 0f Mistery xStarter. - AutoIt .

, . Nextcloud Windows , , . , . : , , , , , . , , , .

, , . VMWare Shared Folders , , , – . , , VMWare Shared Folders, . , , . , . , Nextcloud . , Nextcloud , , .

- , , . . BAT , FreeFileSync . «\\?\D:\Info», .. . , webdav FreeFileSync . FolderSync Windows, , , GoodSync , , . , GoodSync , 15$ , , . , .

GoodSync . , GoodSync2Go. . GoodSync. Sync , D, GoodSync .

[ geektimes.ru AlexanderS .
, ! ]


: . « » « / ». « » « _gsdata_», — « » « ». , . Info «bck_Info».
D:\Sync bck_Info.bat :

 @set dir=%~dp0 @%dir%GoodSync\GoodSync2Go-v10.exe /miniwin /exit sync "%~n0" 


BAT. . GoodSync GoodSync2Go-v10.exe, (bck_Info), , . , GoodSync. , Enter BAT .

FreeFileSync xml , .. . GoodSync D:\Sync\GoodSync\GoodSync\Profile\jobs.tic , .. .
bck_all.bat:

 @set dir=%~dp0 call %dir%bck_Info.bat call %dir%bck_Info2.bat call %dir%bck_Info3.bat call %dir%bck_Info4.bat 

, .

, . , , , , , , . , D:\Sync\GoodSync\GoodSync\Profile\*.log. «» – - . , . log_analayser AutoIt . - , AutoIt, , SciTE – .

, log_analayser.au3 :

 ; LOG Analyser 1.0 ;      - #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|LOG Analyser #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|log_analyser.exe #AutoIt3Wrapper_Res_Comment=     - #AutoIt3Wrapper_Res_Description= - ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) #include <Array.au3> #include <_FileDirList.au3> ;  Local $msg_title = "LOG Analyser 1.0" Local $path = @ScriptDir Local $soft_open_log = "notepad.exe" Local $path, $dir_mode, $word, $file_analyse_name, $file_analyse_ext, $log_path, $log_msg_on Local $file_log, $word_detect, $file_analyse, $cnt_files, $i ;    if ($CmdLine[0] < 6) then MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit else if (StringCompare($CmdLine[1], "file") = 0) then $dir_mode = 0 elseif (StringCompare($CmdLine[1], "dir") = 0) then $dir_mode = 1 else MsgBox(0x10, $msg_title, "     'file'  'dir'!" & @CRLF & @CRLF & "  ") Exit endif $word = $CmdLine[2] if ($dir_mode = 0) then $file_analyse_name = $CmdLine[3] else $dir_analyse = $CmdLine[3] endif $file_analyse_ext = $CmdLine[4] $log_path = $CmdLine[5] if (StringCompare($CmdLine[6], "err_msg_on") = 0) then $log_msg_on = 1 elseif (StringCompare($CmdLine[6], "err_msg_off") = 0) then $log_msg_on = 0 else MsgBox(0x10, $msg_title, "     'log_msg_on'  'log_msg_off'!" & @CRLF & @CRLF & "  ") Exit endif endIf ;   $file_log = $log_path & "\" & "log_analyser" & "-" & @YEAR & "-" & @MON & "-" & @MDAY & "-" & @HOUR & "-" & @MIN & "-" & @SEC & ".log" $word_detect = 0 ;    if ($dir_mode = 0) then $file_analyse = $file_analyse_name & "." & $file_analyse_ext if (_file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) = 1) then $word_detect = 1 endif else ;     $dir_arr = _FileDirList($dir_analyse, "*."&$file_analyse_ext, 1, 1, 0) ;_ArrayDisplay($dir_arr) ;    -       if ($dir_arr = 0) then MsgBox(0x10, $msg_title, "       !" & @CRLF & @CRLF & "  ") Exit endif $cnt_files = $dir_arr[0] ;    $i = 0 While $i <> $cnt_files $i = $i + 1 $file_analyse = $dir_arr[$i] if (_file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) = 1) then $word_detect = 1 endif WEnd endif ;    if ($word_detect = 1) and ($log_msg_on = 1) then if (MsgBox (0x41034, $msg_title, " !" & @CRLF & "      : " & $file_log & @CRLF & @CRLF & "   ?")) = 6 then ShellExecuteWait($soft_open_log, $file_log) endif endif Exit ;                    ;   ,   ,     Func _file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) Local $file1, $file2, $file_line, $write_once $word_detect = 0 $write_once = 0 $file1 = FileOpen($file_analyse, 0) ;     If $file1 = -1 Then FileClose($file1) MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit EndIf ;       While 1 $file_line = FileReadLine($file1) If @error = -1 Then ExitLoop if (StringInStr($file_line, $word) <> 0) then $word_detect = 1 ;            if (FileExists($file_log) = 0) then $file2 = FileOpen($file_log, 1) FileClose($file2) endif ;        if ($write_once = 0) then $write_once = 1 $file2 = FileOpen($file_log, 1) FileWriteLine($file2, " : " & $file_analyse) FileClose($file2) endif ;       $file2 = FileOpen($file_log, 1) FileWriteLine($file2, $file_line) FileClose($file2) endif WEnd ;     ,          if ($word_detect = 1) then $file2 = FileOpen($file_log, 1) FileWriteLine($file2, @CRLF) FileClose($file2) endif FileClose($file1) Return $word_detect EndFunc 

F7 SciTE log_analayser.exe.

- , , , .

:


— , ( )

:

1 — [file = ; dir = , ]
2 —
3 —
4 —
5 — ,
6 — [err_msg_on = ; err_msg_off = ]

, bck_auto.bat:

 @echo Start Backup @set dir=%~dp0 call %dir%bck_all.bat log_analyser.exe dir  %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

, , , , . - D:\Sync\LOG.
. . , , . , : , «», – Macintosh! Siber Systems , - . , ?

:

 @echo Start Backup @set dir=%~dp0 call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

: GoodSync , . - , . D:\Sync . clean_logs.bat:

 @echo off set dir=%~dp0 For /R %dir% %%i in (*.log) Do ( Del /q "%%i") @echo on 

- , , ( ) log. .
bck_auto.bat :

 @echo Start Backup @set dir=%~dp0 @call clean_logs.bat call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

, . , , ?

bck_auto.bat:

 @echo Start Backup & PCOFF @set dir=%~dp0 start MonitorOnOff.exe 0 @call clean_logs.bat call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_off shutdown /s /t 0 exit 

. MonitorOnOff ( , ), shutdown . log_analyser , – , .

MonitorOnOff AutoIt.

 ; Monitor On Off 1.0 ;   /  #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|Monitor On Off #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|MonitorOnOff.exe #AutoIt3Wrapper_Res_Comment=  /  #AutoIt3Wrapper_Res_Description=  /  ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) HotKeySet("{F10}", "_Monitor_ON") HotKeySet("{F11}", "_Monitor_OFF") HotKeySet("{Esc}", "_Quit") Global Const $lciWM_SYSCommand = 274 Global Const $lciSC_MonitorPower = 61808 Global Const $lciPower_Off = 2 Global Const $lciPower_On = -1 Global $MonitorIsOff = False if ($CmdLine[0] <> 0) then _Monitor_OFF() endif While 1 Sleep(10) WEnd Func _Monitor_ON() $MonitorIsOff = False Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]') DllCall('user32.dll', 'int', 'SendMessage', _ 'hwnd', $Progman_hwnd, _ 'int', $lciWM_SYSCommand, _ 'int', $lciSC_MonitorPower, _ 'int', $lciPower_On) EndFunc Func _Monitor_OFF() $MonitorIsOff = True Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]') While $MonitorIsOff = True DllCall('user32.dll', 'int', 'SendMessage', _ 'hwnd', $Progman_hwnd, _ 'int', $lciWM_SYSCommand, _ 'int', $lciSC_MonitorPower, _ 'int', $lciPower_Off) _IdleWaitCommit(0) Sleep(20) WEnd EndFunc Func _IdleWaitCommit($idlesec) Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do $iSave = DllStructGetData ($LastInputInfo, 2) Sleep(60) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False Return DllStructGetData ($LastInputInfo, 2)-$iSave EndFunc Func _Quit() _Monitor_ON() Exit EndFunc 

: F10 , F11 – , ESC . .

– bck_all.bat, « » . , . D:\Sync\GoodSync\LOG\ - . – ? , . check_file_exist.

 ; Check File Exist 1.0 ;        #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|Check File Exist #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|check_file_exist.exe #AutoIt3Wrapper_Res_Comment=       #AutoIt3Wrapper_Res_Description=   ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) #include <Array.au3> #include <_FileDirList.au3> ;  Local $msg_title = "Check File Exist 1.0" Local $path = @ScriptDir Local $soft_open_dir = "explorer.exe" Local $path, $dir_analyse, $words, $msg_open ;    if ($CmdLine[0] < 5) then MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit else $dir_analyse = $CmdLine[1] $file = $CmdLine[2] $words0 = $CmdLine[3] $words1 = $CmdLine[4] if (StringCompare($CmdLine[5], "msg_on") = 0) then $msg_open = 1 elseif (StringCompare($CmdLine[5], "msg_off") = 0) then $msg_open = 0 else MsgBox(0x10, $msg_title, "     'msg_on'  'msg_off'!" & @CRLF & @CRLF & "  ") Exit endif endIf ;      $dir_arr = _FileDirList($dir_analyse, "*"&$file&"*", 1, 0, 0) ;_ArrayDisplay($dir_arr) ;      if ($dir_arr = 0) then if (StringCompare($words0, "0") <> 0) then if ($msg_open = 0) then MsgBox(0x41030, $msg_title, $words0) else if (MsgBox(0x41034, $msg_title, $words0 & @CRLF & @CRLF & "     ?")) = 6 then ShellExecuteWait($soft_open_dir, $dir_analyse) endif endif endif else if (StringCompare($words1, "0") <> 0) then if ($msg_open = 0) then MsgBox(0x41030, $msg_title, $words1) else if (MsgBox(0x41034, $msg_title, $words1 & @CRLF & @CRLF & "    ?")) = 6 then ShellExecuteWait($soft_open_dir, $dir_analyse) endif endif endif endif Exit 

– log_analyser. ( ) .

:

1 — ( — /)
2 — ,
3 — , , =0 —
4 — , , =0 —
5 — : msg_off — / , msg_on — ,

, Check_LOG_from_log_analyser.bat, Windows:

 @set dir=%~dp0LOG start check_file_exist.exe %dir% .log 0 "     !" msg_on exit 

, , Sync . , – Windows 7 64 .

, . AutoIt, if-then-else-end, , AutoIt, . BAT , . , .

Dark Dragon





, , , . , : «, - ». – . . . , . , . , . – , . , - .



, .



. 3. — Nextcloud.
: 1.2.1.
: 08.02.2018.
: 15.01.2020.

1.2.1 [15-01-2020]
.

1.2.0 [08-02-2018]
.

1.1.0 [08-02-2018]
.

1.0.0 [08-02-2018]
.
Nextcloud 11.0.2 VMWare, VMWare , Nextcloud.



( )
- (, code blockquote) :
[Definition]
failregex={«reqId»:".*",«remoteAddr»:".*",«app»:«core»,«message»:«Login failed: '.*' \(Remote IP: ''\)»,«level»:2,«time»:".*"}
ignoreregex =

! , .. . (/) — . :


— , « Nextcloud» , ,
— ,



Source: https://habr.com/ru/post/es410011/


All Articles