Proyecto GeoNode

Descripción general

Los siguientes pasos to guiarán hacia una nueva configuración del Proyecto GeoNode. Todas las guías primero instalarán y configurarán el sistema para ejecutarlo en modo DEBUG (también conocido como modo DESARROLLO) y luego configurarán un servidor HTTPD para servir a GeoNode a través del puerto estándar HTTP (` 80`).

Esas guías no están destinadas a usarse en un sistema de producción. Habrá capítulos dedicados que te mostrarán algunos consejos para optimizar GeoNode para una máquina lista para producción. En cualquier caso, recomendamos encarecidamente consultar a un DevOp o Administrador del sistema experimentado antes de exponer su servidor a la WEB.

Ubuntu 22.04

Esta parte de la documentación describe el proceso de configuración completo de GeoNode en un entorno limpio Ubuntu 22.04 de 64 bits (escritorio o servidor). Todos los ejemplos utilizan comandos de shell que debes ingresar en una terminal local o en un shell remoto. - Si tienes un entorno de escritorio gráfico, puede abrir la aplicación de terminal después de iniciar sesión; - si está trabajando en un servidor remoto, el proveedor o administrador del sistema debería haberle dado acceso a través de un cliente ssh.

Instalar las dependencias

En esta sección, instalaremos todos los paquetes y herramientas básicos necesarios para una instalación completa de GeoNode. Para seguir esta guía, se requieren conocimientos básicos sobre la configuración del servidor Ubuntu y el trabajo con un shell. Esta guía utiliza vim como editor; siéntete libre de usar nano, gedit u otros.

Actualización de los paquetes de sistema

Verifica que tu sistema ya esté actualizado con el repositorio ejecutando los siguientes comandos:

sudo apt update

Crear un usuario dedicado

En los siguientes pasos se utiliza un usuario llamado geonode: para ejecutar los comandos de instalación, el usuario debe estar en el grupo sudo.

Crear usuario geonode si no está presente:

# Follow the prompts to set the new user's information.
# It is fine to accept the defaults to leave all of this information blank.
sudo adduser geonode

# The following command adds the user geonode to group sudo
sudo usermod -aG sudo geonode

# make sure the newly created user is allowed to login by ssh
# (out of the scope of this documentation) and switch to User geonode
su geonode

Instalación de paquetes

Agrega los paquetes GIS de Ubuntu antes de instalar los otros paquetes del sistema.

sudo apt update

Nota

No necesitas instalar los paquetes del sistema si deseas ejecutar el proyecto usando Docker

Primero, instalaremos todos los paquetes del sistema necesarios para la configuración de GeoNode.

# Install packages from GeoNode core
sudo apt install -y python3-gdal=3.3.2+dfsg-2~focal2 gdal-bin=3.3.2+dfsg-2~focal2 libgdal-dev=3.3.2+dfsg-2~focal2
sudo apt install -y python3-pip python3-dev python3-virtualenv python3-venv virtualenvwrapper
sudo apt install -y libxml2 libxml2-dev gettext
sudo apt install -y libxslt1-dev libjpeg-dev libpng-dev libpq-dev libmemcached-dev
sudo apt install -y software-properties-common build-essential
sudo apt install -y git unzip gcc zlib1g-dev libgeos-dev libproj-dev
sudo apt install -y sqlite3 spatialite-bin libsqlite3-mod-spatialite

# Install Openjdk
sudo -i apt update
sudo apt install openjdk-8-jdk-headless default-jdk-headless -y

# Remember to select the correct java version /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
sudo update-alternatives --config java

sudo apt update -y
sudo apt autoremove -y
sudo apt autoclean -y
sudo apt purge -y
sudo apt clean -y

# Install Packages for Virtual environment management
sudo apt install -y virtualenv virtualenvwrapper

# Install text editor
sudo apt install -y vim

Instalación del proyecto Geonode

El proyecto Geonode es la forma adecuada de ejecutar una instalación personalizada de Geonode. El repositorio de geonode-project contiene un conjunto mínimo de archivos que siguen la estructura de un proyecto django. El propio Geonode se instalará como requisito de su proyecto. Dentro de la estructura del proyecto es posible ampliar, reemplazar o modificar todos los componentes de GeoNode (por ejemplo, css y otros archivos estáticos, plantillas, modelos…) e incluso registrar nuevas aplicaciones de Django sin tocar el código original de Geonode.

Nota

Puedes llamar a tu proyecto de geonode como desees siguiendo las convenciones de nomenclatura para paquetes de Python (generalmente minúsculas con guiones bajos (_). En los ejemplos siguientes, reemplaza my_geonode con el nombre que desees para tu proyecto.

Consulta también el archivo README en el repositorio geonode-project

En primer lugar, debemos preparar un nuevo entorno virtual de Python

Preparar el ambiente

sudo mkdir -p /opt/geonode_custom/
sudo usermod -a -G www-data geonode
sudo chown -Rf geonode:www-data /opt/geonode_custom/
sudo chmod -Rf 775 /opt/geonode_custom/

Clonar el código fuente

cd /opt/geonode_custom/
git clone https://github.com/GeoNode/geonode-project.git

Esto clonará la rama master. Tendrás que cambiar a la rama o etiqueta deseada. Por ejemplo, si quieres generar un proyecto para GeoNode 4.2.2, debes usar el comando docker

git checkout -b 4.2.2

Haz una instancia a partir de la Plantilla Django

Nota

Llamaremos a nuestra instancia my_geonode. Puedes cambiar el nombre a tu conveniencia.

vim ~/.bashrc
# add the following line to the bottom
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
mkvirtualenv --python=/usr/bin/python3 my_geonode

Alterantively you can also create the virtual env like below
python3.8 -m venv /home/geonode/dev/.venvs/my_geonode
source /home/geonode/dev/.venvs/my_geonode/bin/activate

pip install Django==3.2.13

django-admin startproject --template=./geonode-project -e py,sh,md,rst,json,yml,ini,env,sample,properties -n monitoring-cron -n Dockerfile my_geonode

# Install the Python packages
cd /opt/geonode_custom/my_geonode
pip install -r src/requirements.txt --upgrade
pip install -e src/ --upgrade

# Install GDAL Utilities for Python
pip install pygdal=="`gdal-config --version`.*"

# Dev scripts
mv .override_dev_env.sample src/.override_dev_env
mv src/manage_dev.sh.sample src/manage_dev.sh
mv src/paver_dev.sh.sample src/paver_dev.sh

Instalar y configurar el sistema de base de datos PostgreSQL

En esta sección vamos a instalar los paquetes PostgreSQL junto con la extensión PostGIS. Esos pasos deben realizarse solo si aún no tienes la base de datos instalada en tu sistema.

# Ubuntu 22.04
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
sudo wget --no-check-certificate --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update -y; sudo apt install -y postgresql-13 postgresql-13-postgis-3 postgresql-13-postgis-3-scripts postgresql-13 postgresql-client-13

Ahora debemos crear dos bases de datos, my_geonode y my_geonode_data, pertenecientes al rol my_geonode.

Advertencia

Esta es nuestra configuración predeterminada. Puedes utilizar cualquier base de datos o rol que necesites. Los parámetros de conexión deben estar correctamente configurados en settings, como veremos más adelante en este apartado.

Bases de datos y permisos

Primero, crea el usuario del geonode. GeoNode utilizará este usuario para acceder a la base de datos

sudo service postgresql start
sudo -u postgres createuser -P my_geonode

# Use the password: geonode

Se te pedirá que establezcas una contraseña para el usuario. Ingrese geonode como contraseña.

Advertencia

Esta es una contraseña de ejemplo utilizada por simplicidad. Esta contraseña es muy débil y debe cambiarse en un entorno de producción.

Crea la base de datos my_geonode y my_geonode_data con el propietario my_geonode

sudo -u postgres createdb -O my_geonode my_geonode
sudo -u postgres createdb -O my_geonode my_geonode_data

A continuación, creemos extensiones PostGIS

sudo -u postgres psql -d my_geonode -c 'CREATE EXTENSION postgis;'
sudo -u postgres psql -d my_geonode -c 'GRANT ALL ON geometry_columns TO PUBLIC;'
sudo -u postgres psql -d my_geonode -c 'GRANT ALL ON spatial_ref_sys TO PUBLIC;'
sudo -u postgres psql -d my_geonode -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_geonode;'

sudo -u postgres psql -d my_geonode_data -c 'CREATE EXTENSION postgis;'
sudo -u postgres psql -d my_geonode_data -c 'GRANT ALL ON geometry_columns TO PUBLIC;'
sudo -u postgres psql -d my_geonode_data -c 'GRANT ALL ON spatial_ref_sys TO PUBLIC;'
sudo -u postgres psql -d my_geonode_data -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_geonode;'

El último paso es cambiar las políticas de acceso de usuarios para conexiones locales en el archivo pg_hba.conf

sudo vim /etc/postgresql/13/main/pg_hba.conf

Desplázate hasta el final del documento. Queremos que la conexión local sea «confiable» para el usuario predeterminado.

Asegúrate de que tu configuración se parezca a la siguiente.

...
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                trust

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

Advertencia

Si tu base de datos PostgreSQL reside en una máquina separada/remota, tendrás que permitir el acceso remoto a las bases de datos en el archivo /etc/postgresql/13/main/pg_hba. conf al usuario geonode y le dice a PostgreSQL que acepte conexiones no locales en el archivo /etc/postgresql/13/main/postgresql.conf

Reinicia PostgreSQL para que el cambio sea efectivo.

sudo service postgresql restart

PostgreSQL ya está listo. Para probar la configuración, intenta conectarte a la base de datos geonode como función geonode.

psql -U postgres my_geonode
# This should not ask for any password

psql -U my_geonode my_geonode
# This should ask for the password geonode

# Repeat the test with geonode_data DB
psql -U postgres my_geonode_data
psql -U my_geonode my_geonode_data

Ejecuta el proyecto GeoNode por primera vez en modo DEBUG

Advertencia

Asegúrate de haber completado con éxito todos los pasos de la sección Instalar las dependencias.

Este comando ejecutará GeoNode y GeoServer localmente después de haber preparado la base de datos Spatialite. El servidor se iniciará en modo DEBUG (o DESARROLLO) e iniciará los siguientes servicios:

  1. GeoNode en http://localhost:8000/

  2. GeoServer en http://localhost:8080/geoserver/

Esta modalidad es beneficiosa para depurar problemas y/o desarrollar nuevas funciones, pero no se puede utilizar en un sistema de producción.

# Prepare the GeoNode Spatialite database (the first time only)
cd src/
chmod +x paver_dev.sh
./paver_dev.sh setup
./paver_dev.sh sync

Nota

En caso de que quieras empezar de nuevo desde una situación limpia, simplemente ejecuta

./paver_dev.sh reset_hard

Advertencia

Esto eliminará por completo tus local_settings, borrará la base de datos SQLlite y eliminará el directorio de datos de GeoServer.

# Run the server in DEBUG mode
./paver_dev.sh start

Una vez que el servidor haya terminado la inicialización e imprima en la consola la frase GeoNode ya está disponible., puedes abrir un navegador e ir a:

http://localhost:8000/

Inicia sesión con:

user: admin
password: admin

De ahora en adelante, todo lo ya dicho para GeoNode Core (consulta la sección 3. Configuración de la base de datos Postgis y siguientes), se aplica a un Proyecto GeoNode.

Ten cuidado de utilizar las nuevas rutas y nombres en todas partes:

  • Cada vez que encuentres la palabra clave geonode, deberás utilizar el nombre personalizado de su geonode (en este ejemplo, my_geonode).

  • Cada vez que encuentres rutas que apunten a /opt/geonode/, deberás actualizarlas para que apunten a tu proyecto personalizado (en este ejemplo, /opt/geonode_custom/my_geonode).

Docker

Advertencia

Antes de continuar con esta sección, deberías haber leído y comprendido claramente las secciones INSTALACIÓN > GeoNode Core, y en particular la de Docker. Todo lo dicho para GeoNode Core Vanilla se aplica aquí también, excepto que los nombres de los contenedores Docker serán ligeramente diferentes. Por ejemplo, si nombraste a tu proyecto my_geonode, tus contenedores se llamarán:

'django4my_geonode' instead of 'django4geonode' and so on...

Desplegar una instancia de una plantilla Django de geonode-project con Docker en localhost.

Preparar el ambiente

sudo mkdir -p /opt/geonode_custom/
sudo usermod -a -G www-data geonode
sudo chown -Rf geonode:www-data /opt/geonode_custom/
sudo chmod -Rf 775 /opt/geonode_custom/

Clonar el código fuente

cd /opt/geonode_custom/
git clone https://github.com/GeoNode/geonode-project.git

Esto clonará la rama master. Tendrás que cambiar a la rama o etiqueta deseada. Por ejemplo, si quieres generar un proyecto para GeoNode 4.2.2, debes usar el comando docker

git checkout -b 4.2.2

Haz una instancia a partir de la Plantilla Django

Nota

Llamaremos a nuestra instancia my_geonode. Puedes cambiar el nombre a tu conveniencia.

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
mkvirtualenv --python=/usr/bin/python3 my_geonode

Alterantively you can also create the virtual env like below
python3.8 -m venv /home/geonode/dev/.venvs/my_geonode
source /home/geonode/dev/.venvs/my_geonode/bin/activate

pip install Django==3.2.13

django-admin startproject --template=./geonode-project -e py,sh,md,rst,json,yml,ini,env,sample,properties -n monitoring-cron -n Dockerfile my_geonode
cd /opt/geonode_custom/my_geonode

Crea el archivo .env

Se requiere un archivo .env para ejecutar la aplicación. Se puede crear desde .env.sample ya sea manualmente o con el script create-envfile.py.

El script acepta varios parámetros para crear el archivo, en detalle:

  • hostname: por ejemplo, master.demo.geonode.org, el valor predeterminado es localhost

  • https: (booleano), el valor predeterminado es False

  • email: correo electrónico del administrador (esto es obligatorio si https está configurado en True, ya que LetsEncrypt certbot requiere un correo electrónico válido)

  • emv_type: prod, test o dev. Establecerá la variable DEBUG en False (prod, test) o True (dev)

  • geonodepwd: Contraseña de administrador de GeoNode (requerida dentro del .env)

  • geoserverpwd: Contraseña de administrador de Geoserver (requerida dentro del .env)

  • pgpwd: Contraseña de PostgreSQL (requerida dentro del .env)

  • dbpwd: Contraseña de usuario de GeoNode DB (requerida dentro del .env)

  • geodbpwd: Contraseña de usuario de la geodatabase (requerida dentro del .env)

  • clientid: ID de cliente Oauth2 (requerido dentro del .env)

  • clientsecret: secreto del cliente Oauth2 (requerido dentro del .env)

  • secret key: clave secreta de Django (requerida dentro del .env)

  • sample_file: ruta absoluta a un archivo env_sample utilizado para crear el env_file. Si no se proporciona, se utiliza el que está dentro del proyecto GeoNode.

  • file: ruta absoluta a un archivo json que contiene toda la configuración anterior

Nota

si se pasa la misma configuración en el archivo json y como argumento, la CLI sobrescribirá la del archivo JSON. Si no se proporciona algún valor, se utiliza una cadena aleatoria

Ejemplo de USO

```bash
python create-envfile.py -f /opt/core/geonode-project/file.json \
  --hostname localhost \
  --https \
  --email random@email.com \
  --geonodepwd gn_password \
  --geoserverpwd gs_password \
  --pgpwd pg_password \
  --dbpwd db_password \
  --geodbpwd _db_password \
  --clientid 12345 \
  --clientsecret abc123
```

Ejemplo de JSON esperado:

```JSON
{
  "hostname": "value",
  "https": "value",
  "email": "value",
  "geonodepwd": "value",
  "geoserverpwd": "value",
  "pgpwd": "value",
  "dbpwd": "value",
  "geodbpwd": "value",
  "clientid": "value",
  "clientsecret": "value"
}
```

Modifica el código y las plantillas y reconstruye los contenedores Docker

docker-compose -f docker-compose.yml build --no-cache

Finalmente, ejecuta los contenedores

docker-compose -f docker-compose.yml up -d

Despliega una instancia de una plantilla Django de geonode-project con Docker en un dominio

Nota

Usaremos www.example.org como ejemplo. Puedes cambiar el nombre a tu conveniencia.

Detén los contenedores

cd /opt/geonode_custom/my_geonode

docker-compose -f docker-compose.yml stop

Edita el archivo de sobrecarga ENV para desplegar en www.example.org

Reemplaza en todas partes localhost con www.example.org

vim .env
# e.g.: :%s/localhost/www.example.org/g

Nota

Es posible anular aquí aún más variables para personalizar la instancia de GeoNode. Consulta la sección Configuración de GeoNode para obtener una lista de las opciones disponibles.

Ejecuta los contenedores en modo demonio

docker-compose -f docker-compose.yml -f docker-compose.override.example-org.yml up --build -d

Prueba geonode-project con Vagrant

Nota

Dentro de los archivos de geonode-project encontrarás un archivo llamado Vagrantfile.compose y otro llamado Vagrantfile.stack, copia uno de ellos en el archivo Vagrantfile para usarlos con vagrant.

apt-get install -y vagrant
#choose what to test (in this case docker-compose.yml)
cp Vagrantfile.compose Vagrantfile
#this will start a vargant virtual machine, generate and build geonode-project
vagrant up
# check services are up upon reboot
vagrant ssh geonode-compose -c 'docker ps'
vagrant destroy -f
# test docker swarm
cp Vagrantfile.stack Vagrantfile
vagrant up
# check services are up upon reboot
vagrant ssh geonode-vagrant -c 'docker service ls'
vagrant destroy -f

Nota

Vagrant generará un proyecto dummi llamado «antani» dentro de vagrant, comenzando con el código base de geonode-project, de esta manera es posible probar dentro de vagrant casi instantáneamente lo que uno modifica en el proyecto geonode