Implementación¶
En esta sección se detallan instrucciones para poder implementar la plataforma en producción.
Este documento apunta a operadores y administradores de sistemas que necesiten poner en funcionamiento la plataforma en un servidor, y por lo tanto se asumen conocimientos básciso de manejo de terminal, instalación de paquetes y configuración de servicios.
En los repositorios se incluyen ejemplos de archivos de configuración cuando es apropiado, pero siempre se deben tomar como ejemplos y ajustar según sea necesario a su criterio.
Requerimientos de SO
Se asume que la plataforma va a ejecutarse en un entorno con la distribución Ubuntu 18.04 instalada. Para otros sistemas operativos, será necesario consultar la documentación correspondiente de las dependencias.
Dependencias¶
La plataforma consiste en un backend, implementado sobre Python, y un frontend implementado en Nodejs. Utiliza PostgreSQL como base de datos, y Redis como cache y base de datos para la cola de trabajos.
A continuación se detallan instrucciones para instalar y configurar estas dependencias.
PostgreSQL y extensiones (TimescaleDB y PostGIS)¶
Sólo para Ubuntu 18.04
Las instrucciones están pensadas para Ubuntu 18.04. Puede verificar la guía de instalación de TimescaleDB si está utilizando otro sistema operativo.
Agregue el siguiente repositorio de PostgreSQL para obtener la últimas versiones de los pquetes de PostgreSQL (esto es necesario para versiones de Ubuntu menores a 19.04).
# `lsb_release -c -s` should return the correct codename of your OS
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -c -s)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
Agregue el repositorio de TimescaleDB y luego instale TimescaleDB, que al hacerlo automaticamente descargará e instalará también la versión correcta del servidor de PostgreSQL.
# Add TimescaleDBs PPA
sudo add-apt-repository -y ppa:timescale/timescaledb-ppa
sudo apt-get update
# Now install appropriate package for PG version
sudo apt install timescaledb-postgresql-11
Es recomendable que utilice la herramienta timescaledb-tune
para ajustar y
optimizar la base de datos para TimescaleDB.
sudo timescaledb-tune
Ahora, instale la extensión PostGIS 3 para esta versión de PostgreSQL.
sudo apt-get install -y postgresql-11-postgis-3
Finalmente, reinicie la instancia de PostgreSQL.
sudo service postgresql restart
Python, Redis, GDAL¶
Instale Python y otras dependencias como GDAL y el servidor de Redis.
sudo apt-get install -y \
build-essential \
git \
gdal-bin \
gettext \
libgdal-dev \
libpq-dev \
libproj-dev \
python3 \
python3-dev \
python3-pip \
redis-server
Nginx¶
Nginx se utiliza para servir tanto el backend (API y administrador) como el frontend (sitio web de la plataforma).
Instale Nginx desde los repositorios de Ubuntu:
sudo apt install nginx
Backend¶
Instalación¶
Primero clone el repositorio del backend.
git clone https://github.com/undp/satlomas-back.git
cd satlomas-back/
Para instalar las dependencias correctas del backend, debe instalar el manejador de paquetes Pipenv.
sudo -H pip3 install -U pipenv
Luego, ejecute lo siguiente para instalar todas las dependencias necesarias. Esto creará un entorno virtual para este proyecto.
pipenv install
Una vez que finalize la instalación, estará listo para configurar el backend.
Configuración¶
Base de datos¶
Cree un rol de superusuario para el usuario que está utilizando actualmente.
Si sabe que va a ejecutar PostgreSQL con otros usuario, por favor reemplaze
la variable $USER
como corresponde.
sudo -u postgres createuser -s $USER
Cree la base de datos.
createdb satlomas
Configure una contraseña para el usuario que acaba de crear. Ejecute el
siguiente comando reemplazando foobar
por una contraseña única:
Contraseña
Es muy importante que defina una contraseña única y dificil de adivinar.
psql satlomas -c "ALTER USER $USER WITH PASSWORD 'foobar'"
Agregue las extensiones TimescaleDB y PostGIS a la base de datos creada.
psql satlomas -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE"
psql satlomas -c "CREATE EXTENSION IF NOT EXISTS postgis CASCADE"
Registración en Copernicus Open Access Hub¶
Para que la plataforma pueda descargar los productos del satélite Sentinel-1 y Sentinel-2 de la ESA, es necesario estar registrado en Copernicus Open Access Hub.
Para registrase, ingrese aquí. Tome nota del nombre de usuario y contraseña dado que será necesario al momento de configurar el backend.
Registración en NASA EarthData¶
Para descargar los productos de MODIS VI, es necesario estar registrado en NASA EarthData.
Puede registrarse ingresando aquí. Tome nota del nombre de usuario y contraseña dado que será necesario al momento de configurar el backend.
Variables de entorno¶
Copie env.sample
y guarde un archivo nuevo llamada .env
.
cp env.sample .env
Ahora edite .env
según sus necesidades. El archivo env.sample
es un
ejemplo con valores por defecto para algunas variables, pero algunas de ellas
debe completarlas. A continuación se describen las variables que deben ser
configuradas para el funcionamiento de la plataforma.
Variable | Descripción |
---|---|
SECRET_KEY |
String único de caracteres alfanuméricos, utilizado para firmas criptográficas. Puede generar uno aquí. |
ALLOWED_HOSTS |
Lista de hosts habilitados. Debería ingresar el dominio y/o IP pública del servidor |
DB_USER |
Usuario de la BD (debería ser el nombre del usuario actual) |
DB_PASSWORD |
Contraseña de la BD (la contraseña que definió antes) |
SCIHUB_USER |
Usuario de SciHub |
SCIHUB_PASS |
Contraseña de SciHub |
MODIS_USER |
Usuario de EarthData |
MODIS_PASS |
Contraseña de EarthData |
Inicialización¶
Ingrese al entorno virtual creado por Pipenv, y proceda con la inicialización de la base de datos.
pipenv shell
./manage.py migrate # Correr las migraciones
Antes de continuar, debería generar los archivos estáticos, necesarios para el panel de administrador:
./manage.py collectstatic
Finalmente, cree un superusuario para SatLomas. Este será el primer usuario administrador, con el que podrá registrar nuevos administradores o usuarios.
./manage.py createsuperuser
Luego de seguir las instrucciones del comando, tendrá un usuario y contraseña para ingresar al administrador del backend.
Frontend¶
Instalación¶
Primero debe instalar Node v12. Ejecute los siguientes comandos:
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
Luego, clone el repositorio del frontend:
git clone https://github.com/undp/satlomas-front.git
cd satlomas-front/
Instale todas las dependencias con npm
:
npm install
Finalmente, ejecute el siguiente comando para generar un build del sitio web:
npm run build
Configuración de servicios¶
Más información
Esta sección de la documentación está basada en la guía How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu 18.04, de Digital Ocean. Para más información para depurar los servicios, puede consultarla.
Backend¶
Comience creando un nuevo archivo para el socket del servicio del backend:
sudo nano /etc/systemd/system/gunicorn.socket
Copie lo siguiente dentro del archivo:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Guarde y ciérrelo.
Para el siguiente paso es necesario que verifique la ruta del entorno virtual del backend. Desde el directorio del código del backend, ejecute el siguiente comando:
pipenv --venv
Tome nota de la ruta que devuelve el comando.
Ahora, cree un nuevo archivo para el servicio. El nombre de archivo del servicio debería coincidir con el del socket, a excepción de la extensión:
sudo nano /etc/systemd/system/gunicorn.service
Copie el siguiente contenido:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/satlomas-back
ExecStart=/home/ubuntu/.local/share/virtualenvs/satlomas-back-XVGhZdP0/bin/gunicorn \
--access-logfile - \
--timeout 600 \
--workers 3 \
--bind unix:/run/gunicorn.sock \
satlomas.wsgi:application
[Install]
WantedBy=multi-user.target
Ajuste WorkingDirectory
a la ruta absoluta del repositorio clonado del
backend. Luego, ajuste la ruta absoluta de ExecStart
a la del entorno
virtual de Pipenv, agregando al final /bin/gunicorn
. También será necesario
que defina el User
y Group
con el que se ejecutará el proceso. Este
usuario debería tener permisos para poder acceder al repositorio del backend.
Puede ajustar también la cantidad de workers y el timeout permitido, o agregar otras opciones de Gunicorn si es necesario.
Finalmente, puede iniciar y activar el servicio. Esto creará un archivo
/run/gunicorn.sock
y se iniciará el servidor. Cuando se realiza una
conexión al socket, systemd automaticamente inicia el servicio
gunicorn.service
para manejar el pedido.
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Frontend¶
De manera similar, para el servidor web del frontend será administrador por systemd.
Cree un nuevo archivo para el servicio del frontend:
sudo nano /etc/systemd/system/satlomas-front.service
y copie el siguiente contenido:
[Unit]
Description=Platform frontend next.js app
After=network.target
[Service]
Environment=NODE_ENV=production
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/satlomas-front
ExecStart=/usr/bin/node server.js
[Install]
WantedBy=multi-user.target
Ajuste WorkingDirectory
a la ruta absoluta del repositorio clonado del
frontend. También será necesario que defina el User
y Group
con el que se
ejecutará el proceso. Este usuario debería tener permisos para poder acceder
al repositorio del backend.
Finalmente, puede iniciar y activar el servicio.
sudo systemctl start satlomas-front.service
sudo systemctl enable satlomas-front.service
Nginx¶
A modo ejemplo, se presentan dos archivos de configuración para Nginx, para servir el backend y frontend respectivamente.
En este ejemplo, se asume que se tienen registrado el dominio satlomas.com
,
y dos registros A para los subdominios:
api.satlomas.com
: Backendapp.satlomas.com
: Frontend
Cree un nuevo archivo /etc/nginx/sites-available/satlomas-back
sudo nano /etc/nginx/sites-available/satlomas-back
y copie dentro de éste el siguiente contenido:
server {
server_name api.satlomas.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/ubuntu/satlomas-back;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
}
Ajuste server_name
al subdominio que corresponda al backend, y root
a la
ruta absoluta del repositorio del backend (en este caso, el repositorio fue
clonado dentro del directorio home del usuario ubuntu
).
Luego cree otro archivo /etc/nginx/sites-available/satlomas-front
sudo nano /etc/nginx/sites-available/satlomas-front
y copie lo siguiente:
server {
server_name app.satlomas.com;
location /static/ {
root /home/ubuntu/satlomas-front/public;
}
location /_next/static/ {
alias /home/ubuntu/satlomas-front/.next/static/;
}
location / {
# default port, could be changed if you use next with custom server
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# if you have try_files like this, remove it from our block
# otherwise next app will not work properly
# try_files $uri $uri/ =404;
}
}
Nuevamente, ajuste server_name
al subdominio correspndiente para el
frontend, y las ocurrencias de /home/ubuntu/satlomas-front
a la ruta
absoluta del repositorio del frontend.
Finalmente, haga enlaces simbólicos de estos dos archivos al directorio
/etc/nginx/sites-enabled/
para habilitar los sitios:
sudo ln -s /etc/nginx/sites-available/satlomas-back /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/satlomas-front /etc/nginx/sites-enabled/
y reinicie Nginx:
sudo systemctl restart nginx
Con esto concluye la implementación de la plataforma. Podrá acceder al
backend desde http://api.satlomas.com/
, y al frontend desde
http://app.satlomas.com/
(suponiendo que configuró los sitios con esos
subdominios).
Configuración SSL¶
Es posible configurar SSL a través de los certificados gratuitos de Let's Encrypt.
Instrucciones para Ubuntu 18.04
Las siguientes instrucciones están basadas en la guía de Certbot para la distribución de Ubuntu 18.04 y Nginx. Si desea ver más información puede acceder aquí.
Deberá agregar el PPA de Certbot a la lista de repositorios. Para esto, ejecute los siguientes comandos:
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y universe
sudo add-apt-repository -y ppa:certbot/certbot
sudo apt-get update
Ejecute este comando para instalar Certbot:
sudo apt-get install -y certbot python3-certbot-nginx
Ahora ejecute este comando para obtener un certificado y hacer que Certbot edite los archivos de configuración de Nginx de los sitios habilitados automáticamente.
sudo certbot --nginx
El certificado se debería actualizar automaticamente a través del servicio de Certbot.