Skip to content

Commit c833229

Browse files
author
Pablo Andino
committed
init branch
1 parent 300a96c commit c833229

File tree

5 files changed

+290
-0
lines changed

5 files changed

+290
-0
lines changed

.dockerignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
config
2+
source

README.md

+55
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,60 @@ API del Servicio de Normalización de Datos Geográficos de Argentina.
99
## Documentación
1010
Para consultar la documentación de la API, acceder a [https://apis.datos.gob.ar/georef](https://apis.datos.gob.ar/georef).
1111

12+
## Contenedores
13+
Para correr los contenedores asegúrate de tener instalado docker-compose\
14+
El archivo de configuración puede correr dos servicios creando los siguientes contenedores:
15+
- georef-api_es01: Un contenedor con Elasticsearch procesar e indexar los datos. Estos datos son almacenados y persistidos en un volumen de docker.
16+
- georef-api_app: Un contenedor con la aplicación. Al correrlo la primera vez es necesario correr una indexación.
17+
18+
Antes de levantar el servicio de la app deberás generar un archivo config/georef.cfg que puedes hacerlo copiando el que ya existe (docker/georef.example.cfg) y renombrando ciertas variables.
19+
Tener en cuenta que dentro de la red de docker por defecto el host para el servidor de Elasticsearch es "es01" y el puerto es 9200.\
20+
Las carpetas config/; source/; backups/ y logs/ serán montadas dentro del contenedor de georef-api_app y se podrá acceder desde el host a los archivos generados por la app.
21+
22+
El archivo de configuración docker/georef.example.cfg está preparado para ser copiado al destino config/georef.cfg\
23+
La fuente de datos está configurada para ser leida desde la carpeta source/; pero si se desea se puede cambiar el archivo georef.cfg para especificar otra ruta o una URL.
24+
Si bien se puede copiar los archivos fuente dentro de /source, se recomienda crear un enlace duro; sobre todo si se están haciendo pruebas con el ETL en el mismo entorno de desarrollo.
25+
26+
```
27+
cp -rl /home/georef-etl/files/latest /home/georef-api/source
28+
```
29+
Si se encuentra en otra partición se puede optar por un enlace simbólico:
30+
31+
```
32+
ln /home/georef-etl/files/latest /home/georef-api/source
33+
```
34+
35+
Para correr la aplicación:
36+
37+
Situarse dentro de la carpeta "docker" y correr el siguiente comando:
38+
39+
```
40+
docker-compose up
41+
```
42+
43+
Para indexar los archivos generados por el ETL correr el siguiente comando:
44+
45+
```
46+
docker-compose exec app make index
47+
```
48+
49+
Nota: Para más comandos referirse a la documentación (https://datosgobar.github.io/georef-ar-api/georef-api-development/#3-crear-los-indices)
50+
51+
El puerto utilizado por la aplicación es el 5000 y se mapea al mismo puerto del host. Ambos valores pueden ser modificados en el archivo docker-compose.yml
52+
53+
Para realizar consultas a la api se puede hacer una petición desde el host a dicho puerto.
54+
55+
Ejemplo:
56+
57+
```
58+
curl localhost:5000/api/provincias
59+
```
60+
61+
Nota: Para más endpoints referirse a la documentación (https://datosgobar.github.io/georef-ar-api/open-api/)
62+
63+
Si se modifica el código fuente reconstruir la imagen
64+
65+
`docker-compose build app`
66+
1267
## Soporte
1368
En caso de que encuentres algún bug, tengas problemas con la instalación, o tengas comentarios de alguna parte de Georef API, podés mandarnos un mail a [datosargentina@jefatura.gob.ar](mailto:datosargentina@jefatura.gob.ar) o [crear un issue](https://github.com/datosgobar/georef-ar-api/issues/new?title=Encontre-un-bug-en-georef-ar-api).

docker/Dockerfile_api

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
FROM python:3.9
2+
3+
RUN apt-get update
4+
RUN apt-get -y upgrade
5+
RUN apt-get install -y libgeos-3.9.0 libgeos-c1v5
6+
7+
RUN pip install --upgrade pip
8+
9+
WORKDIR /opt/app-root/src/georef-ar-api
10+
11+
COPY requirements.txt .
12+
COPY requirements-dev.txt .
13+
RUN pip install -r requirements.txt
14+
RUN pip install -r requirements-dev.txt
15+
16+
RUN pip install Flask==2.0.0 # Actualizar en requirements.txt
17+
18+
COPY . .

docker/docker-compose.yml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
version: '2.2'
2+
services:
3+
# for three nodes see: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html#docker-compose-file
4+
es01:
5+
image: docker.elastic.co/elasticsearch/elasticsearch:$ELASTIC_STACK_VERSION
6+
container_name: georef-api_es01
7+
environment:
8+
- node.name=es01
9+
- cluster.name=es-docker-cluster
10+
- discovery.type=single-node
11+
- bootstrap.memory_lock=true # disable swapping out parts of the JVM heap to disk (https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html)
12+
- "ES_JAVA_OPTS=$JAVA_OPTS"
13+
ulimits:
14+
memlock: # configures the range of memory that ElasticSearch will use. Setting this to –1 means unlimited.
15+
soft: -1
16+
hard: -1
17+
volumes:
18+
- data01:/usr/share/elasticsearch/data
19+
networks:
20+
- geonet
21+
app:
22+
build:
23+
context: ..
24+
dockerfile: ./docker/Dockerfile_api
25+
image: datosgobar/georef-etl_api
26+
container_name: georef-api_app
27+
environment:
28+
- "GEOREF_CONFIG=config/georef.cfg"
29+
- "FLASK_APP=service/__init__.py"
30+
- "FLASK_ENV=development"
31+
command: flask run --host=0.0.0.0 --port=5000
32+
volumes:
33+
- ../config:/opt/app-root/src/georef-ar-api/config:ro
34+
- ../source:/opt/app-root/src/georef-ar-api/source
35+
- ../logs:/opt/app-root/src/georef-ar-api/logs
36+
- ../backups:/opt/app-root/src/georef-ar-api/backups
37+
ports:
38+
- 8080:5000
39+
networks:
40+
- geonet
41+
42+
volumes:
43+
data01:
44+
driver: local
45+
46+
networks:
47+
geonet:
48+
driver: bridge

docker/georef.example.cfg

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
# Archivo de configuración de ejemplo para georef-ar-api
2+
# Este archivo utiliza la sintaxis de Python.
3+
4+
#------------------------------------------------------------
5+
# Configuración para API
6+
#------------------------------------------------------------
7+
8+
# El valor MAX_RESULT_LEN tiene distintos significados dependiendo de
9+
# si se está en una consulta GET o POST:
10+
#
11+
# GET: Número máximo de entidades a devolver en una consulta:
12+
# max <= MAX_RESULT_LEN
13+
#
14+
# POST: Número máximo de entidades a devolver en todas las consultas
15+
# sumadas:
16+
# body[0][max] + body[1][max] + ... <= MAX_RESULT_LEN
17+
#
18+
# Su valor debe ser menor o igual que MAX_RESULT_WINDOW.
19+
MAX_RESULT_LEN = 5000
20+
21+
# El valor máximo permitido para (max + inicio). Su valor debe ser
22+
# idéntico a el valor index.max_result_window de Elasticsearch, que
23+
# por defecto es 10000.
24+
MAX_RESULT_WINDOW = 10000
25+
26+
# Cantidad máxima de consultas que se pueden envíar a la API en una
27+
# request POST (bulk).
28+
MAX_BULK_LEN = 1000
29+
30+
# Tamaño del cache de direcciones. Ver la documentación de
31+
# georef-ar-address (https://github.com/datosgobar/georef-ar-address)
32+
# para más detalles sobre su significado.
33+
ADDRESS_PARSER_CACHE_SIZE = 5000
34+
35+
# URLs de endpoints de descarga completa de datos Por ejemplo, el
36+
# usuario puede acceder a /api/departamentos.csv para descargarse la
37+
# base total de departamentos. Internamente la api realiza un HTTP
38+
# redirect a las URLs configuradas en COMPLETE_DOWNLOAD_URLS. En caso
39+
# establecer una URL como None, se desactivará el endpoint asociado.
40+
COMPLETE_DOWNLOAD_URLS = {
41+
'provincias': {
42+
'json': 'https://www.example.org',
43+
'csv': None,
44+
'geojson': None
45+
},
46+
'departamentos': {
47+
'json': None,
48+
'csv': None,
49+
'geojson': None
50+
},
51+
'municipios': {
52+
'json': None,
53+
'csv': None,
54+
'geojson': None
55+
},
56+
'localidades-censales': {
57+
'json': None,
58+
'csv': None,
59+
'geojson': None
60+
},
61+
'asentamientos': {
62+
'json': None,
63+
'csv': None,
64+
'geojson': None
65+
},
66+
'localidades': {
67+
'json': None,
68+
'csv': None,
69+
'geojson': None
70+
},
71+
'calles': {
72+
# calles no tiene archivo geojson asociado
73+
'json': None,
74+
'csv': None
75+
}
76+
}
77+
78+
#------------------------------------------------------------
79+
# Configuración para indexación de datos
80+
#------------------------------------------------------------
81+
82+
# Configuración de entorno
83+
GEOREF_ENV = 'prod' # prod, stg o dev
84+
85+
# Path local o URL de archivo de sinónimos. El archivo debe contener
86+
# sinónimos en formato Solr, para más información, ver:
87+
# https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html#_solr_synonyms
88+
SYNONYMS_FILE = '/opt/app-root/src/georef-ar-api/source/sinonimos-nombres.txt'
89+
90+
# Path local o URL de archivo de términos excluyentes. El archivo debe
91+
# contener términos mutuamente excluyentes en forma de sinónimos en
92+
# formato Solr, para más información, ver:
93+
# https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html#_solr_synonyms
94+
EXCLUDING_TERMS_FILE = '/opt/app-root/src/georef-ar-api/source/terminos-excluyentes-nombres.txt'
95+
96+
# Paths locales o URLs archivos de datos a indexar Las URLs
97+
# especificadas debajo utilizan el portal de descargas
98+
# infra.datos.gob.ar, que siempre provee la última versión disponible
99+
# de los archivos de datos utilizados por Georef API.
100+
STATES_FILE = '/opt/app-root/src/georef-ar-api/source/provincias.ndjson'
101+
DEPARTMENTS_FILE = '/opt/app-root/src/georef-ar-api/source/departamentos.ndjson'
102+
MUNICIPALITIES_FILE = '/opt/app-root/src/georef-ar-api/source/municipios.ndjson'
103+
CENSUS_LOCALITIES_FILE = '/opt/app-root/src/georef-ar-api/source/localidades-censales.ndjson'
104+
SETTLEMENTS_FILE = '/opt/app-root/src/georef-ar-api/source/asentamientos.ndjson'
105+
LOCALITIES_FILE = '/opt/app-root/src/georef-ar-api/source/localidades.ndjson'
106+
STREETS_FILE = '/opt/app-root/src/georef-ar-api/source/calles.ndjson'
107+
INTERSECTIONS_FILE = '/opt/app-root/src/georef-ar-api/source/intersecciones.ndjson'
108+
STREET_BLOCKS_FILE = '/opt/app-root/src/georef-ar-api/source/cuadras.ndjson'
109+
110+
# Directorio donde almacenar archivos indexados anteriormente
111+
BACKUPS_DIR = 'backups'
112+
113+
# Configura si se debe envíar un mail de reporte al terminar la
114+
# indexación
115+
EMAIL_ENABLED = False
116+
117+
# Configuración de envío de mails para indexación. Si EMAIL_ENABLED es
118+
# falso, no es necesario configurar los valores.
119+
EMAIL_HOST = 'mail.foo.com'
120+
EMAIL_SSL = True
121+
EMAIL_PORT = 0 # 0 utiliza el puerto default
122+
EMAIL_USER = 'user@foo.com'
123+
EMAIL_PASSWORD = 'password'
124+
EMAIL_RECIPIENTS = [
125+
'bar@mail.com'
126+
]
127+
128+
#------------------------------------------------------------
129+
# Configuración para Flask
130+
#------------------------------------------------------------
131+
132+
JSON_AS_ASCII = False
133+
134+
#------------------------------------------------------------
135+
# Configuración para Elasticsearch
136+
#------------------------------------------------------------
137+
138+
ES_HOSTS = [
139+
'es01'
140+
]
141+
142+
# Cantidad máxima de consultas que pueden ser envíadas a la vez a
143+
# Elasticsearch utilizando el mecanismo MultiSearch. Su valor debe ser
144+
# menor o igual a MAX_RESULT_LEN, ya que MAX_RESULT_LEN indica el
145+
# máximo número de consultas que el usuario puede enviar a la vez. Por
146+
# ejemplo, si se utiliza MAX_RESULT_LEN = 5000 y
147+
# ES_MULTISEARCH_MAX_LEN = 1000, una petición con 5000 consultas por
148+
# parte del usuario se separarían en 5 consultas MultiSearch de 1000
149+
# elementos cada una.
150+
ES_MULTISEARCH_MAX_LEN = 1000
151+
152+
# Si una búsqueda retorna menos de ES_TRACK_TOTAL_HITS de documentos,
153+
# el total numérico de documentos encontrados se calcula
154+
# precisamente. Si la búsqueda retorna más de ES_TRACK_TOTAL_HITS de
155+
# documentos, se utiliza su valor como "total" de documentos
156+
# encontrados. Valores menores ofrecen más performance en búsquedas
157+
# con muchos resultados, a costo de tener una cuenta de total de
158+
# documentos encontrados menos precisa.
159+
# Si no se define, se utiliza el default de Elasticsearch (10000).
160+
# Si se define como True, siempre se calcula el total de hits exacto,
161+
# el cual es el comportamiento default en Elasticsearch 6.X.X.
162+
ES_TRACK_TOTAL_HITS = None
163+
164+
# Activa la funcionalidad de Elasticsearch de descubrir nuevos nodos
165+
# desde los listados
166+
ES_SNIFF = True
167+
ES_SNIFFER_TIMEOUT = 60

0 commit comments

Comments
 (0)