Я пытаюсь настроить систему ElasticSearch на экземпляре с открытым только портом 443, и с использованием стека Elastic с Docker и Docker Compose, стек экспонируется с портами 5601 (Kibana) и 9200 (ElasticSearch).Я хотел использовать Flask для того, чтобы:
- Решить проблему с открытым только портом 443, поскольку я хочу, чтобы пользователи могли использовать как ES, так и Kibana
- Обработка авторизации
- Добавление дополнительных функций в поисковую систему (пользовательские конечные точки)
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.
Есть ли какой-нибудь способ добиться того, что я хочу, учитывая ограничение порта?