Обработка запросов в Kibana и ElasticSearch через приложение Flask - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь настроить систему ElasticSearch на экземпляре с открытым только портом 443, и с использованием стека Elastic с Docker и Docker Compose, стек экспонируется с портами 5601 (Kibana) и 9200 (ElasticSearch).Я хотел использовать Flask для того, чтобы:

  1. Решить проблему с открытым только портом 443, поскольку я хочу, чтобы пользователи могли использовать как ES, так и Kibana
  2. Обработка авторизации
  3. Добавление дополнительных функций в поисковую систему (пользовательские конечные точки)

Nginx используется в качестве веб-сервера:

server {
    listen 443;
    listen [::]:443 ipv6only=on;

    server_name XXX.XXX.XXX.XXX;

    location / {
        proxy_pass http://localhost:5000;
        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;
    }
}

Я пытался настроить приложение Flask следующим образом:

import requests
from elasticsearch import Elasticsearch
from flask import Response, redirect, request, stream_with_context, url_for

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

kibana_server_baseurl = 'http://localhost:5601/'
elastic_server_baseurl = 'http://localhost:9200/'

@app.route('/')
@requires_auth
def index():
    return 'Elastic Search System'

@app.route('/kibana', methods=['POST', 'GET'])
@requires_auth
def kibana():
    req = requests.get(kibana_server_baseurl, stream=True)
    return Response(stream_with_context(req.iter_content()),
                    content_type=req.headers['content-type'])

@app.route('/elastic', methods=['POST', 'GET'])
@requires_auth
def kibana():
    req = requests.get(elastic_server_baseurl, stream=True)
    return Response(stream_with_context(req.iter_content()),
                    content_type=req.headers['content-type'])

@app.route('/custom', methods=['POST', 'GET'])
@requires_auth
def custom_func():
    req = request.get_json()
    embedding_vector = get_embedding(req['sentence'])
    query = construct_query(embedding_vector)
    return es.search(index=req['index_name'], doc_type='_doc', body=query)

Это приводит к следующей ошибке:

Could not build url for endpoint'http://localhost:5601/'

и так:

@app.route('/kibana', methods=['POST', 'GET'])
@requires_auth
def kibana():
    req = requests.get(kibana_server_baseurl, stream=True)
    return req.content()

Не удивительно, что это приводит к бесконечной анимации загрузки Kibana.

Есть ли какой-нибудь способ добиться того, что я хочу, учитывая ограничение порта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...