Instalando Geoserver 2.19.1 en ubuntu 20.04

A continuación se documenta el proceso de levantar un servicio geoserver en un servidor Ubuntu 20.04. La idea será configurarlo con los siguientes principios:

  • El servicio es manejado por su propio usuario (geoserver).
  • El servicio está disponible en un dominio o subdominio en el puerto 80 con nginx como proxy reverso.
  • Systemd está a cargo de gestionar el proceso de geoserver.
  • Cambiaremos la contraseña por defecto para proteger la instalación.
  • la instalación se realizará como un usuario normal pero que pertenezca al grupo sudo

Para este fin comenzaremos con la instalación de algunos paquetes necesarios

sudo apt install -y wget unzip openjdk-11-jdk gdal-bin

Luego, asegurando que estemos en la carpeta $HOME del usuario en uso procederemos a descargar geoserver y descomprimirlo:

cd ~
mkdir tmp
cd tmp
wget http://sourceforge.net/projects/geoserver/files/GeoServer/2.19.1/geoserver-2.19.1-bin.zip

Creamos el usuario geoserver que manejará la instalación y la carpeta en que vivirá.

sudo mkdir -p /opt/geoserver
sudo useradd --home-dir /opt/geoserver --system --shell /bin/bash --user-group geoserver

Movemos el archivador descargado a su última morada

sudo mv geoserver-2.19.1-bin.zip /opt/geoserver/

Y nos preparamos a descomprimirlo y eliminarlo para que no estorbe.

sudo chown -R geoserver:geoserver /opt/geoserver
sudo su geoserver
cd
unzip geoserver-2.19.1-bin.zip
rm geoserver-2.19.1-bin.zip
exit

Lo siguiente será crear la unidad de systemd que manejará geoserver. Para eso editaremos con nuestro editor favorito el archivo /etc/systemd/system/geoserver.service y escribiremos el siguiente contenido

[Unit]
Description=Geoserver service
After=network.target

[Service]
User=geoserver
Group=geoserver
WorkingDirectory=/opt/geoserver
ExecStart=/usr/bin/java -DGEOSERVER_DATA_DIR=data_dir -Djava.awt.headless=true -DSTOP.PORT=8079 -DSTOP.KEY=geoserver -jar start.jar
Restart=always

[Install]
WantedBy=multi-user.target

A continuación nos aseguraremos de que el servicio opera correctamente. Para eso primero tenemos que asegurar que nuestro usuario es parte de los grupos adm y systemd-journal que nos permitirán monitorear el servicio.

sudo usermod -aG adm $USER
sudo usermod -aG systemd-journal $USER

Con esto hecho podemos proceder a cargar e inicar nuestro servicio:

sudo systemctl daemon-reload
sudo systemctl start geoserver

Y comprobamos que está saludable haciendo:

systemctl status geoserver

Lo cual nos debería mostrar algo parecido a esto:

● geoserver.service - Geoserver service
     Loaded: loaded (/etc/systemd/system/geoserver.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-07-15 22:17:01 UTC; 5s ago
   Main PID: 1837061 (java)
      Tasks: 21 (limit: 2280)
     Memory: 81.6M
     CGroup: /system.slice/geoserver.service
             └─1837061 /usr/bin/java -DGEOSERVER_DATA_DIR=data_dir -Djava.awt.headless=true -DSTOP.PORT=8>

Jul 15 22:17:01 citlaltepetl systemd[1]: Started Geoserver service.
Jul 15 22:17:02 citlaltepetl java[1837061]: 2021-07-15 22:17:02.708:INFO::main: Logging initialized @1154>
Jul 15 22:17:04 citlaltepetl java[1837061]: 2021-07-15 22:17:04.120:INFO:oejs.Server:main: jetty-9.4.36.v>
Jul 15 22:17:04 citlaltepetl java[1837061]: 2021-07-15 22:17:04.203:INFO:oejdp.ScanningAppProvider:main: >
Jul 15 22:17:06 citlaltepetl java[1837061]: 2021-07-15 22:17:06.097:INFO:oejw.StandardDescriptorProcessor>

Presionar q para salir. Si adicionalmente queremos que el servicio inicie automáticamente en caso de reiniciar el servidor haremos esto:

sudo systemctl enable geoserver

Con lo cual concluimos la instalación y procedemos a la configuración.

Configuración de nginx

Los pasos anteriores dejaron a geoserver escuchando en el puerto 8080. Para acceder debemos escribir la IP de nuestro servidor en el navegador, especificando este puerto. Si adicionalmente queremos acceder al servicio en una URL amigable y bajo https se deberán seguir estos pasos.

Antes de proceder es necesario que se cuenta con un nombre de dominio. Su obtención está fuera de los alcances de este manual.

Lo primero será crear una carpeta que funcionará como raíz de documentos para el subdominio que vamos a crear. También es posible usar el dominio pelón siguiendo casi los mismos pasos, pero aquí me voy a centrar en la opción del subdominio.

sudo mkdir /opt/geoserver/public
sudo chown geoserver:geoserver /opt/geoserver/public

A continuación instalaremos nginx

sudo apt install -y nginx

Y en este punto es necesario haber decidido la ubicación de nuestro geoserver, ya sea como servicio principal de nuestro dominio (y accedemos a él mediante midominio.com) o dentro de un subdominio (y accedemos mediante subdominio.midominio.com). En lo sucesivo usaré SUBDOMINIO.MIDOMINIO.COM como ubicación del servicio de geoserver. Lo escribo en mayúsculas solamente para hacer notorio lo que hay que reemplazar por tu propio nombre de dominio. Tu debes escribirlo en minúsculas.

Dicho esto crearemos y editaremos el archivo /etc/nginx/sites-available/SUBDOMINIO.MIDOMINIO.COM con el siguiente contenido:

server {
    listen 80;
    listen [::]:80;
    server_name SUBDOMINIO.MIDOMINIO.COM;

    root /opt/geoserver/public;

    location / {
        try_files $uri @geoserver;
    }

    location @geoserver {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;

        proxy_redirect off;

        proxy_pass http://localhost:8080;
    }
}

Ahora habilitaremos este registro y recargaremos nginx para asegurarnos de que todo está funcionando:

sudo ln -s /etc/nginx/sites-available/SUBDOMINIO.MIDOMINIO.COM /etc/nginx/sites-enabled/
sudo systemctl reload nginx

Y visitaremos en el navegador http://SUBDOMINIO.MIDOMINIO.COM/geoserver para asegurarnos de que ahí está corriendo geoserver.

Para evitar ciertos errores al enviar formularios en la interfaz administrativa de geoserver hay que editar el archivo /opt/geoserver/webapps/geoserver/WEB-INF/web.xml y añadir las siguientes líneas después del último <context-param> que esté ahí.

<context-param>
  <param-name>GEOSERVER_CSRF_WHITELIST</param-name>
  <param-value>SUBDOMINIO.MIDOMINIO.COM</param-value>
</context-param>

y reiniciamos geoserver para que los cambios tengan efecto:

sudo systemctl restart geoserver

Cambio de contraseñas

Geoserver tiene dos contraseñas que nos va a ser importante configurar inmediatamente después de la instalación. Una es la llave maestra y otra es la contraseña del usuario admin.

Para hacerlo escribe en el navegador la URL de geoserver (http://SUBDOMINIO.MIDOMINIO.COM/geoserver) y escribe las contraseñas por defecto en la caja de inicio de sesión que aparece en la parte superior derecha.

Captura de pantalla de la pantalla de inicio de sesión de geoserver.

La contraseña por defecto del usuario admin de geoserver es geoserver, de la misma manera la contraseña maestra por defecto es geoserver. Lo siguiente que veremos es la pantalla de inicio. En ella se nos mostrarán dos avisos que nos invitan a cambiar las contraseñas por defecto. Hay que seguir cada uno

Captura de pantalla de la página de inicio de geoserver

Mi recomendación es que utilices contraseñas completamente aleatorias de 16 caracteres. No trates de recordarla, usa un gestor de contraseñas.

Como un último paso para que geoserver sepa en qué url vive vamos a seguir el enlace que dice Global debajo de la sección Settings de la barra lateral izquierda. Luego en donde dice Proxy Base URL pondremos la dirección que usamos para acceder a geoserver en el navegador

Captura de pantalla de la sección de configuraciones globales de geoserver

Recomendaciones

  • No dejes abiertos todos los puertos de tu servidor. Usa algo como ufw o iptables para solamente permitir las conexiones entrantes en los puertos que tú planees.