Instalación Y Migración De Aplicaciones Web Php

Realizar la migración de la aplicación Drupal que tienes instalada en el entorno de desarrollo a nuestro entorno de producción, para ello ten en cuenta lo siguiente:

Cuando me refiero al entorno de producción, estoy haciendo referencia a un servidor de OVH.

Antes de realizar la migración necesitamos preparar nuestro entorno de producción instalando todos los paquetes necesarios, como pueden ser php, mysql, … para poder migrar Drupal de manera correcta. En mi caso tengo listo el entorno de producción, ya que en él llevé a cabo la instalación de un servidor LEMP que es lo que al fin y al cabo vamos a utilizar. Si quieres ver como instalar un servidor LEMP puedes verlo aquí.

1. La aplicación se tendrá que migrar a un nuevo virtualhost al que se accederá con el nombre portal.iesgnXX.es.

En nuestro entorno en producción, vamos a crear este nuevo virtualhost. Para ello antes que nada creamos la ruta donde vamos a almacenar esta aplicación, en mi caso dentro de /srv/www/aplicacionesiesgn/.

Ahora debemos crear el fichero de configuración de Nginx que utilizará esta aplicación. Nos desplazamos a /etc/nginx/sites-available/, y podemos copiar el fichero por defecto para tener la estructura, en mi caso ya tengo un virtualhost creado y utilizo el fichero de este:

root@vpsjavierpzh:/etc/nginx/sites-available# cp aplicacionesiesgn.conf drupal.conf
root@vpsjavierpzh:/etc/nginx/sites-available# nano drupal.conf

Edito el fichero de configuración de Drupal y queda de tal manera:

server {
        listen 80;
        listen [::]:80;

        root /srv/www/aplicacionesiesgn/drupal;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name portal.iesgn15.es;

        location / {
                         try_files $uri $uri/ /index.php?$args;
                }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }
}

Como podemos apreciar, a esta aplicación se accederá con la URL: portal.iesgn15.es como nos pide el ejercicio. Ya solo nos quedaría habilitar el servicio de este sitio web mediante la creación de un enlace simbólico a la ruta /etc/nginx/sites-enabled/:

root@vpsjavierpzh:/etc/nginx/sites-available# ln -s /etc/nginx/sites-available/drupal.conf /etc/nginx/sites-enabled/

root@vpsjavierpzh:/etc/nginx/sites-available# ls -l /etc/nginx/sites-enabled/
total 0
lrwxrwxrwx 1 root root 49 Nov  9 18:44 aplicacionesiesgn.conf -> /etc/nginx/sites-available/aplicacionesiesgn.conf
lrwxrwxrwx 1 root root 34 Nov  9 12:09 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 38 Nov 18 08:06 drupal.conf -> /etc/nginx/sites-available/drupal.conf

Como hemos realizado cambios en la configuración de Nginx debemos reiniciar el servicio:

systemctl restart nginx.service

2. Vamos a nombrar el servicio de base de datos que tenemos en producción. Como es un servicio interno no la vamos a nombrar en la zona DNS, la vamos a nombrar usando resolución estática. El nombre del servicio de base de datos se debe llamar: bd.iesgnXX.es.

Para nombrar el servicio de la base de datos mediante resolución estática, debemos añadir al fichero /etc/hosts del servidor de OVH la siguiente línea:

127.0.0.1       bd.iesgn15.es

3. Por lo tanto los recursos que deberás crear en la base de datos serán (respeta los nombres):

root@vpsjavierpzh:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 65
Server version: 10.3.25-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.001 sec)

MariaDB [(none)]> CREATE DATABASE bd_drupal;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER 'user_drupal' IDENTIFIED BY 'pass_drupal';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON bd_drupal.* TO 'user_drupal';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| bd_drupal          |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

MariaDB [(none)]> exit
Bye

root@vpsjavierpzh:~#

4. Realiza la migración de la aplicación.

Para realizar la migración, debemos llevarnos todos los archivos de Drupal desde el entorno de desarrollo hasta el entorno de producción. Para ello vamos a copiar los archivos con scp, pero primero vamos a comprimir todos los datos en un solo archivo:

root@buster:/var/www/html# tar -cf ./drupaldat.tar.gz ./drupal/*

Lo pasamos al servidor de OVH:

root@buster:/var/www/html# scp ./drupaldat.tar.gz debian@vpsjavierpzh.iesgn15.es:/home/debian/

Muevo este archivo al directorio donde vamos a almacenar esta aplicación:

root@vpsjavierpzh:/home/debian# mv drupaldat.tar.gz /srv/www/aplicacionesiesgn/

Y descomprimimos el fichero obteniendo como resultado:

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# tar -xvf drupaldat.tar.gz

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# cd drupal/

root@vpsjavierpzh:/srv/www/aplicacionesiesgn/drupal# ls
autoload.php   core		  INSTALL.txt  profiles    sites       vendor
composer.json  example.gitignore  LICENSE.txt  README.txt  themes      web.config
composer.lock  index.php	  modules      robots.txt  update.php

Nos faltaría simplemente cambiar el propietario de todos estos nuevos archivos a www:data, que es el usuario que posee los permisos de lectura y escritura en Nginx.

chown -R www-data:www-data /srv/

Ya tenemos los datos de Drupal en el entorno de producción por lo tanto nos faltaría restaurar la copia de seguridad en el servidor de OVH. Para ello primero pasamos la copia:

root@buster:~# scp backupdrupal.sql debian@vpsjavierpzh.iesgn15.es:/home/debian/
debian@vpsjavierpzh.iesgn15.es's password:
backupdrupal.sql                                                      100% 8165KB  63.9KB/s   02:07

root@buster:~#

Y por último restauramos la copia de seguridad en nuestro servidor de base de datos de OVH:

mysql -u user_drupal -p bd_drupal < backupdrupal.sql

Si entramos y vemos las tablas de esta base de datos:

root@vpsjavierpzh:/home/debian/drupal# mysql -u user_drupal -p bd_drupal
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.3.25-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [bd_drupal]> show tables;
+----------------------------------+
| Tables_in_bd_drupal              |
+----------------------------------+
| batch                            |
| block_content                    |
| block_content__body              |
| block_content_field_data         |
| block_content_field_revision     |
| block_content_revision           |
| block_content_revision__body     |
| cache_bootstrap                  |
| cache_config                     |
| cache_container                  |
| cache_data                       |
| cache_default                    |
| cache_discovery                  |
| cache_dynamic_page_cache         |
| cache_entity                     |
| cache_menu                       |
| cache_page                       |
| cache_render                     |
| cachetags                        |
| comment                          |
| comment__comment_body            |
| comment_entity_statistics        |
| comment_field_data               |
| config                           |
| file_managed                     |
| file_usage                       |
| history                          |
| key_value                        |
| key_value_expire                 |
| locale_file                      |
| locales_location                 |
| locales_source                   |
| locales_target                   |
| menu_link_content                |
| menu_link_content_data           |
| menu_link_content_field_revision |
| menu_link_content_revision       |
| menu_tree                        |
| node                             |
| node__body                       |
| node__comment                    |
| node__field_image                |
| node__field_tags                 |
| node_access                      |
| node_field_data                  |
| node_field_revision              |
| node_revision                    |
| node_revision__body              |
| node_revision__comment           |
| node_revision__field_image       |
| node_revision__field_tags        |
| path_alias                       |
| path_alias_revision              |
| queue                            |
| router                           |
| search_dataset                   |
| search_index                     |
| search_total                     |
| semaphore                        |
| sequences                        |
| sessions                         |
| shortcut                         |
| shortcut_field_data              |
| shortcut_set_users               |
| taxonomy_index                   |
| taxonomy_term__parent            |
| taxonomy_term_data               |
| taxonomy_term_field_data         |
| taxonomy_term_field_revision     |
| taxonomy_term_revision           |
| taxonomy_term_revision__parent   |
| user__roles                      |
| user__user_picture               |
| users                            |
| users_data                       |
| users_field_data                 |
| watchdog                         |
+----------------------------------+
77 rows in set (0.001 sec)

MariaDB [bd_drupal]>

Vemos que hemos restaurado la copia de seguridad correctamente.

Por último nos faltaría crear un registro CNAME, para que nos muestre esta paǵina, en nuestra zona DNS del servidor OVH. En mi caso, como destino pongo vpsjavierpzh.iesgn15.es en vez de una dirección IP, ya que tengo creado un registro de tipo A que apunta a esta IP.

Lo creamos:

Si accedemos a la dirección portal.iesgn15.es:

5. Asegúrate que las URL limpias de Drupal siguen funcionando en Nginx.

Para que Drupal utilice las URLs limpias debemos añadir este bloque en su fichero de configuración, es decir, en /etc/nginx/sites-available/drupal.conf:

location / {
    try_files $uri /index.php?$query_string;
}

6. La aplicación debe estar disponible en la URL: portal.iesgnXX.es (Sin ningún directorio).

Se puede ver como efectivamente la URL de la aplicación portal.iesgn15.es.

Instalación / migración de la aplicación Nextcloud

1. Instala la aplicación web Nextcloud en tu entorno de desarrollo.

Vamos a instalar la aplicación Nextcloud en un servidor web Apache de nuestro entorno de desarrollo para posteriormente realizar la migración a un servidor web Nginx en nuestro entorno de producción.

Nos descargamos Nextcloud desde su página oficial con el siguiente comando:

root@buster:/home/vagrant# wget https://download.nextcloud.com/server/releases/nextcloud-20.0.1.zip
--2020-11-18 17:08:17--  https://download.nextcloud.com/server/releases/nextcloud-20.0.1.zip
Resolving download.nextcloud.com (download.nextcloud.com)... 95.217.64.181, 2a01:4f9:2a:3119::181
Connecting to download.nextcloud.com (download.nextcloud.com)|95.217.64.181|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 142691943 (136M) [application/zip]
Saving to: ‘nextcloud-20.0.1.zip’

nextcloud-20.0.1.zip      100%[=====================================>] 136.08M  10.7MB/s    in 16s     

2020-11-18 17:08:34 (8.26 MB/s) - ‘nextcloud-20.0.1.zip’ saved [142691943/142691943]

root@buster:/home/vagrant#

Vamos a descomprimir el archivo descargado:

root@buster:/home/vagrant# unzip nextcloud-20.0.1.zip

La carpeta descomprimida la trasladamos al directorio donde vamos a almacenar nuestra aplicación web, en mi caso es dentro de /srv/www/, y le vamos a asignar como propietario de los archivos al usuario www-data que es el adecuado.

root@buster:/home/vagrant# mv nextcloud /srv/www/

root@buster:/home/vagrant# ls /srv/www/nextcloud/
3rdparty  config       core	 index.html  occ	   ocs-provider  resources   themes
apps	  console.php  cron.php  index.php   ocm-provider  public.php	 robots.txt  updater
AUTHORS   COPYING      data	 lib	     ocs	   remote.php	 status.php  version.php

root@buster:/home/vagrant# chown -R www-data:www-data /srv/www/

Una vez hecho esto, tendríamos que crear un fichero de configuración que nos mostrará la página, para ello creamos uno en /etc/apache2/sites-available/. En mi caso, copio uno ya existente para tener la plantilla, ustedes podéis utilizar el fichero 000-default.conf.

root@buster:/etc/apache2/sites-available# cp anchor.conf nextcloud.conf

root@buster:/etc/apache2/sites-available# nano nextcloud.conf

El fichero /etc/apache2/sites-available/nextcloud.conf quedaría así:

<\VirtualHost *:80\>

        ServerName www.jpnextcloud.com
        ServerAdmin webmaster@localhost
        DocumentRoot /srv/www/nextcloud

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

<\/VirtualHost\>

Atención: a esta configuración hay que eliminarle los carácteres \, que he tenido que introducir para escapar los carácteres siguientes, así que en caso de querer copiar la configuración, debemos tener en cuenta esto.

Habilitamos la página:

root@buster:/etc/apache2/sites-available# a2ensite nextcloud.conf
Enabling site nextcloud.
To activate the new configuration, you need to run:
  systemctl reload apache2

root@buster:/etc/apache2/sites-available# systemctl reload apache2

Por último, nos quedaría crear un usuario y una base de datos, para que Nextcloud guarde sus datos:

root@buster:/var/www/html/nextcloud# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.3.25-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| anchor             |
| drupal             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.014 sec)

MariaDB [(none)]> CREATE DATABASE bd_nextcloud;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER 'user_nextcloud' IDENTIFIED BY 'pass_nextcloud';
Query OK, 0 rows affected (0.005 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON bd_nextcloud.* TO 'user_nextcloud';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| anchor             |
| bd_nextcloud       |
| drupal             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
6 rows in set (0.001 sec)

MariaDB [(none)]> exit
Bye

Vemos que hemos creado un nuevo usuario con privilegios de la nueva base de datos.

Mi entorno de desarrollo se trata de una máquina virtual Vagrant, por tanto para visualizar este sitio web, necesito añadir en el fichero /etc/hosts de mi máquina la línea que corresponda.

Si nos dirigimos al navegador a la dirección www.jpnextcloud.com nos muestra:

Vemos que Nextcloud necesita una serie de extensiones PHP. Para instalar todas las extensiones necesarias:

apt install php-{mysql,zip,curl,mbstring,xml,gd} -y

Si probamos a entrar ahora a la dirección www.jpnextcloud.com nos muestra:

Introducimos los datos del administrador y de nuestra base de datos en el instalador y comenzará la instalación de Nextcloud.

Una vez finalizado el proceso podemos ver como ya hemos instalado esta aplicación web con Apache.

2. Realiza la migración al servidor en producción, para que la aplicación sea accesible en la URL: www.iesgnXX.es/cloud

Vamos a realizar la migración de esta aplicación instalada previamente a nuestro entorno de desarrollo, pero ahora en vez de trabajar con Apache haremos que trabaje con Nginx.

Lo primero que haremos será realizar una copia de seguridad de la base de datos que tenemos en el servidor de desarrollo, para restaurarla en el servidor de OVH. Para ello:

root@buster:~# mysqldump -u user_nextcloud -p bd_nextcloud > backupnextcloud.sql
Enter password:

root@buster:~# ls
backupdrupal.sql  backupnextcloud.sql

root@buster:~#

Vamos a comprimir todos los archivos del directorio /srv/www/nextcloud, ya que en él se encuentran todos los datos de la aplicación web:

root@buster:/srv/www# tar -cf ./nextclouddat.tar.gz ./nextcloud/*
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets

root@buster:/srv/www# mv nextclouddat.tar.gz /root/

root@buster:~# ls
backupdrupal.sql  backupnextcloud.sql  nextclouddat.tar.gz

Pasamos la copia de seguridad y los datos comprimidos al servidor de OVH:

root@buster:~# scp ./backupnextcloud.sql debian@vpsjavierpzh.iesgn15.es:/home/debian/
debian@vpsjavierpzh.iesgn15.es's password:
backupnextcloud.sql                                                   100%  137KB 776.4KB/s   00:00    

root@buster:~# scp ./nextclouddat.tar.gz debian@vpsjavierpzh.iesgn15.es:/home/debian/
debian@vpsjavierpzh.iesgn15.es's password:
nextclouddat.tar.gz                                                   100%  528MB   8.4MB/s   01:02    

root@buster:~#

Una vez en el entorno de producción, vamos a instalar las extensiones de PHP que requiere Nextcloud:

apt install php-{mysql,zip,curl,mbstring,xml,gd} -y

Ahora vamos a descomprimir los archivos de Nextcloud en el directorio /srv/www/aplicacionesiesgn/:

root@vpsjavierpzh:/home/debian# mv nextclouddat.tar.gz /srv/www/aplicacionesiesgn/

root@vpsjavierpzh:/home/debian# cd /srv/www/aplicacionesiesgn/

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# tar -xvf nextclouddat.tar.gz

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# ls
drupal	nextcloud  nextclouddat.tar.gz	principal

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# ls nextcloud/
3rdparty  config       core	 index.html  occ	   ocs-provider  resources   themes
apps	  console.php  cron.php  index.php   ocm-provider  public.php	 robots.txt  updater
AUTHORS   COPYING      data	 lib	     ocs	   remote.php	 status.php  version.php

Debemos cambiar el propietario a www-data:

chown -R www-data:www-data /srv/

Es el momento de crear la base de datos y el correspondiente usuario que utilizará Nextcloud:

root@vpsjavierpzh:/srv/www/aplicacionesiesgn# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 324
Server version: 10.3.25-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| bd_drupal          |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

MariaDB [(none)]> CREATE DATABASE bd_nextcloud;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER 'user_nextcloud' IDENTIFIED BY 'pass_nextcloud';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON bd_nextcloud.* TO 'user_nextcloud';
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| bd_drupal          |
| bd_nextcloud       |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [(none)]> exit
Bye

Vemos que hemos creado correctamente el usuario y la base de datos y ahora ya podemos restaurar la copia de seguridad:

root@vpsjavierpzh:/home/debian# mysql -u user_nextcloud -p bd_nextcloud < backupnextcloud.sql
Enter password:

root@vpsjavierpzh:/home/debian# mysql -u user_nextcloud -p bd_nextcloud
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 326
Server version: 10.3.25-MariaDB-0+deb10u1 Debian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [bd_nextcloud]> show tables;
+-----------------------------+
| Tables_in_bd_nextcloud      |
+-----------------------------+
| oc_accounts                 |
| oc_activity                 |
| oc_activity_mq              |
| oc_addressbookchanges       |
| oc_addressbooks             |
| oc_appconfig                |
| oc_authtoken                |
| oc_bruteforce_attempts      |
| oc_calendar_invitations     |
| oc_calendar_reminders       |
| oc_calendar_resources       |
| oc_calendar_resources_md    |
| oc_calendar_rooms           |
| oc_calendar_rooms_md        |
| oc_calendarchanges          |
| oc_calendarobjects          |
| oc_calendarobjects_props    |
| oc_calendars                |
| oc_calendarsubscriptions    |
| oc_cards                    |
| oc_cards_properties         |
| oc_collres_accesscache      |
| oc_collres_collections      |
| oc_collres_resources        |
| oc_comments                 |
| oc_comments_read_markers    |
| oc_credentials              |
| oc_dav_cal_proxy            |
| oc_dav_shares               |
| oc_direct_edit              |
| oc_directlink               |
| oc_federated_reshares       |
| oc_file_locks               |
| oc_filecache                |
| oc_filecache_extended       |
| oc_files_trash              |
| oc_flow_checks              |
| oc_flow_operations          |
| oc_flow_operations_scope    |
| oc_group_admin              |
| oc_group_user               |
| oc_groups                   |
| oc_jobs                     |
| oc_login_flow_v2            |
| oc_mail_accounts            |
| oc_mail_aliases             |
| oc_mail_attachments         |
| oc_mail_classifiers         |
| oc_mail_coll_addresses      |
| oc_mail_mailboxes           |
| oc_mail_messages            |
| oc_mail_recipients          |
| oc_migrations               |
| oc_mimetypes                |
| oc_mounts                   |
| oc_notifications            |
| oc_notifications_pushtokens |
| oc_oauth2_access_tokens     |
| oc_oauth2_clients           |
| oc_preferences              |
| oc_privacy_admins           |
| oc_properties               |
| oc_recent_contact           |
| oc_richdocuments_assets     |
| oc_richdocuments_direct     |
| oc_richdocuments_wopi       |
| oc_schedulingobjects        |
| oc_share                    |
| oc_share_external           |
| oc_storages                 |
| oc_systemtag                |
| oc_systemtag_group          |
| oc_systemtag_object_mapping |
| oc_talk_bridges             |
| oc_talk_commands            |
| oc_talk_guests              |
| oc_talk_participants        |
| oc_talk_rooms               |
| oc_talk_signaling           |
| oc_text_documents           |
| oc_text_sessions            |
| oc_text_steps               |
| oc_trusted_servers          |
| oc_twofactor_backupcodes    |
| oc_twofactor_providers      |
| oc_user_status              |
| oc_user_transfer_owner      |
| oc_users                    |
| oc_vcategory                |
| oc_vcategory_to_object      |
| oc_webauthn                 |
| oc_whats_new                |
+-----------------------------+
92 rows in set (0.001 sec)

MariaDB [bd_nextcloud]> exit
Bye

Vemos que la hemos restaurado satisfactoriamente, por tanto, ya tendríamos todos los datos disponibles en el entorno de producción, por lo que nos faltaría crear el sitio web.

Para crear el sitio web, creamos su fichero de configuración y lo enlazamos simbólicamente a la ruta /etc/nginx/sites-enabled/ para que esté disponible para Nginx:

root@vpsjavierpzh:/etc/nginx/sites-available# cp drupal.conf nextcloud.conf

root@vpsjavierpzh:/etc/nginx/sites-available# nano nextcloud.conf

root@vpsjavierpzh:/etc/nginx/sites-available# ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/

root@vpsjavierpzh:/etc/nginx/sites-available# ls -l /etc/nginx/sites-enabled/
total 0
lrwxrwxrwx 1 root root 49 Nov  9 18:44 aplicacionesiesgn.conf -> /etc/nginx/sites-available/aplicacionesiesgn.conf
lrwxrwxrwx 1 root root 34 Nov 18 16:31 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 38 Nov 18 08:06 drupal.conf -> /etc/nginx/sites-available/drupal.conf
lrwxrwxrwx 1 root root 41 Nov 18 19:13 nextcloud.conf -> /etc/nginx/sites-available/nextcloud.conf

Reiniciamos el servicio:

systemctl restart nginx

Accedemos a la dirección http://www.iesgn15.es/cloud/ y obtenemos este resultado:

Esto es porque tanto el fichero de configuración del virtualhost Nextcloud, como el fichero .../(nextcloud)/config/config.php no están bien configurados:

El fichero /etc/nginx/sites-available/nextcloud.conf, en mi caso, el fichero /etc/nginx/sites-available/aplicacionesiesgn.conf, ya que quiero que se acceda mediante la dirección www.iesgn15.es/cloud, debe quedar así:

upstream php-handler {
	server unix:/run/php/php7.3-fpm.sock;
}

server {
        listen 80;
        listen [::]:80;

        root /srv/www/aplicacionesiesgn;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name www.iesgn15.es;

        rewrite ^/$ /principal permanent;

        location / {
                 try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }


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;

fastcgi_hide_header X-Powered-By;


      location = /robots.txt {
    		allow all;
    		log_not_found off;
    		access_log off;
    	}

        location = /.well-known/carddav {
    		return 301 $scheme://$host:$server_port/nextcloud/remote.php/dav;
    	}

    	location = /.well-known/caldav {
    		return 301 $scheme://$host:$server_port/nextcloud/remote.php/dav;
    	}

        location /.well-known/acme-challenge { }

    	location ^~ /cloud {
            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 /cloud {
    			rewrite ^ /cloud/index.php;
    		}

    		location ~ ^\/cloud\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
    			deny all;
    		}

    		location ~ ^\/cloud\/(?:\.|autotest|occ|issue|indie|db_|console) {
    			deny all;
    		}

            location ~ ^\/cloud\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.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 modHeadersAvailable true;
    			fastcgi_param front_controller_active true;
    			fastcgi_pass php-handler;
    			fastcgi_intercept_errors on;
    			fastcgi_request_buffering off;
    		}

            location ~ ^\/cloud\/(?:updater|oc[ms]-provider)(?:$|\/) {
    			try_files $uri/ =404;
    			index index.php;
    		}

            location ~ ^\/cloud\/.+[^\/]\.(?:css|js|woff2?|svg|gif|map)$ {
    			try_files $uri /cloud/index.php$request_uri;
    			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;
    			add_header Referrer-Policy no-referrer;
    			access_log off;
    		}

            location ~ ^\/cloud\/.+[^\/]\.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
    			try_files $uri /cloud/index.php$request_uri;
    			# Optional: Don't log access to other asse
    			access_log off;
    		}
    }
}

Atención: a esta configuración hay que sustituirle en las rutas, la palabra cloud, por el nombre que tenga vuestro directorio de Nextcloud, que suele ser nextcloud, pero yo lo he modificado.

Y el fichero .../(nextcloud)/config/config.php debe quedar así:

<?php
$CONFIG = array (
  'instanceid' => 'occb96siynsl',
  'passwordsalt' => '5A/7E474U9dFg2k16Pvdy9hZRdo/J8',
  'secret' => 'oVy6H5qJtp6WJ37nVspZF06HuiwhyhMqd5WhAnxEW4AhK5/h',
  'trusted_domains' =>
  array (
    0 => 'www.iesgn15.es',
  ),
  'datadirectory' => '/srv/www/aplicacionesiesgn/cloud/data',
  'dbtype' => 'mysql',
  'version' => '20.0.1.1',
  'overwrite.cli.url' => 'http://www.iesgn15.es/cloud',
  'dbname' => 'bd_nextcloud',
  'dbhost' => 'bd.iesgn15.es:3306',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'user_nextcloud',
  'dbpassword' => 'pass_nextcloud',
  'installed' => true,
);

Si probamos de nuevo a acceder a http://www.iesgn15.es/cloud/:

Vemos que ya podemos loguearnos correctamente. Si accedemos con nuestro usuario:

3. Instala en un ordenador el cliente de Nextcloud y realiza la configuración adecuada para acceder a “tu nube”.

Para instalar el cliente de Nextcloud:

apt install nextcloud-desktop -y

Si abrimos la aplicación de escritorio y seguimos estos pasos:

Y ya habríamos terminado de configurar Nextcloud Client.

Si vemos el contenido de la carpeta /home/javier/Nextcloud:

javier@debian:~/Nextcloud$ ls
 Documents             'Nextcloud Manual.pdf'   Photos                          Talk
'Nextcloud intro.mp4'   Nextcloud.png          'Reasons to use Nextcloud.pdf'

Vemos que se ha sincronizado correctamente con nuestra nube.