Skip to content

Commit 41f166d

Browse files
committed
Fix ssl issue
1 parent ec8014f commit 41f166d

File tree

11 files changed

+201
-28
lines changed

11 files changed

+201
-28
lines changed

deploy/docker/.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
IDENTITY_SERVER_PORT=8080
22
COMMUNITY_SERVER_PORT=8087
33
WORKSHOP_SERVER_PORT=8000
4+
CHATBOT_SERVER_PORT=5002
45
ENABLE_SHELL_INJECTION=false
56
ENABLE_LOG4J=false
67
LISTEN_IP="127.0.0.1"

deploy/docker/docker-compose.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,13 @@ services:
148148
crapi-chatbot:
149149
container_name: crapi-chatbot
150150
image: crapi/crapi-chatbot:${VERSION:-latest}
151-
ports:
152-
- "${LISTEN_IP:-127.0.0.1}:5002:5002"
153-
151+
env:
152+
- TLS_ENABLED=${TLS_ENABLED:-false}
153+
- SERVER_PORT=${CHATBOT_SERVER_PORT:-5002}
154+
# - CHATBOT_OPENAI_API_KEY=
155+
# ports:
156+
# - "${LISTEN_IP:-127.0.0.1}:5002:5002"
157+
154158
crapi-web:
155159
container_name: crapi-web
156160
image: crapi/crapi-web:${VERSION:-latest}

services/chatbot/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
retrieval/docs
2+
__pycache__/
3+
*.pyc

services/chatbot/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ COPY requirements.txt /app/requirements.txt
1313
# Install any needed dependencies specified in requirements.txt
1414
RUN pip install --no-cache-dir -r requirements.txt
1515
COPY src /app
16+
COPY certs /app/certs
1617
COPY retrieval /app/retrieval
1718
ENV PYTHONPATH "${PYTHONPATH}:/app"
18-
CMD python3.12 -m gunicorn --bind 0.0.0.0:5002 chatbot_api:app
19-
19+
CMD /entrypoint.sh
2020
EXPOSE 5002

services/chatbot/certs/server.crt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIGSTCCBDGgAwIBAgIJAPc4JnQC+MORMA0GCSqGSIb3DQEBCwUAMIG6MQswCQYD
3+
VQQGEwJVUzEaMBgGA1UECAwRREVWRUxPUE1FTlQgU1RBVEUxGTAXBgNVBAcMEERF
4+
VkVMT1BNRU5UIENJVFkxHDAaBgNVBAoME0RFVkVMT1BNRU5UIENPTVBBTlkxGjAY
5+
BgNVBAsMEURKQU5HTyBERVZFTE9QRVJTMRIwEAYDVQQDDAlsb2NhbGhvc3QxJjAk
6+
BgkqhkiG9w0BCQEWF2RldmVsb3BtZW50QGV4YW1wbGUuY29tMB4XDTE3MDcyMzIy
7+
NTMxOVoXDTI3MDcyMTIyNTMxOVowgboxCzAJBgNVBAYTAlVTMRowGAYDVQQIDBFE
8+
RVZFTE9QTUVOVCBTVEFURTEZMBcGA1UEBwwQREVWRUxPUE1FTlQgQ0lUWTEcMBoG
9+
A1UECgwTREVWRUxPUE1FTlQgQ09NUEFOWTEaMBgGA1UECwwRREpBTkdPIERFVkVM
10+
T1BFUlMxEjAQBgNVBAMMCWxvY2FsaG9zdDEmMCQGCSqGSIb3DQEJARYXZGV2ZWxv
11+
cG1lbnRAZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
12+
AQC44Me+Wb3x9kfW9BfHqNpDcQS3sEZuboirglbz6cLej2gIb6zaz93MFGjw4nyp
13+
6lfm/Rss56gCfcVwmrrxZFjqnKLbIM7b2Fes3VeMFOGtYGFS4X60EPq11T5MG2VX
14+
8ARJnDRX4oKWaMawUg3UrjTOWadoBwdp+k3EWLyOc9miMHOrPhmKiaYcZJdM78nl
15+
TLG7DqMStltVpDn4IuJWkw0Y9QYeRAESsQ+DLp+jvIRv7DJ7UjOAXa0IpiJyr1bJ
16+
7qcCBd6/Yxz8lj/2yQrOSvHHjN69eYB8gcZaVoP++N8uYyea205UmzR/b3KUhFII
17+
wUXJKhWnsf0Yv4a/9RU8/ZVxPsw+43bvnW/VvFMXc7+Rm8gJHg5qIXJB+2AmbM0k
18+
g7DwgkM6f+DLn7m/SIZrgk6Pv2Zrv+k6AkPuCcTD8VY5yYRAddJZ9cWKIwCYUwVO
19+
32+UKN8A41xShB7XPyd9VtpPMhAZQrwvuWJTbiWYoQGXyktGSKr3GGe6keU8NNxW
20+
QU4Hn0+nhe/LOzHYw7sSoTjgBfvP8By+ei4zhiWUetyogd18m9F1HnkOJHdXn8uf
21+
Fy0kblCWu83jIGzDwW8uke2Osdm4N5hJL2Qj0AXGOWON4OM6JeJETuXjZXsqAqWV
22+
ZqM4A7gGo12rIRfg2cZ9tx3JhOhvSMWBE5MA9x7SGT2fAQIDAQABo1AwTjAdBgNV
23+
HQ4EFgQUyjHyDG2Yos8dxhoiUT04oVR+JdwwHwYDVR0jBBgwFoAUyjHyDG2Yos8d
24+
xhoiUT04oVR+JdwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEASpqo
25+
aUHGEMGHpszdYowLRq9me8XqJkxFWuKPIZgZL/fb6nf5hjICtjpZGic79x13A2eV
26+
paXPmQa7MK1JbGGnVEJN07W7CKnwB2lgV/WZuARDPzJ/9anLtRTs8OhuOIcDYIsg
27+
f5pfTwWosNwZej1coosK04Dp8/8gt0qq6Ri1nH/HV5r7bzYmtMquv6N1sKtS4QGG
28+
lPBnGptToj4zN9x0w57JvUzGnUAVwuaRJerizmxMggS1j2Q3iK70xG9860fMJvCC
29+
pX2tsOjHsyxw/qRYZPeANGQlwVX+93cV4LV7XE4tK2QvyUOJMjwqB1EMmJEcSDXw
30+
65zWZrCTpVsSkPmlQcL7gVYWPGyPpAWJICuvdvG4klbAcQS9EhK8w4rnrV2B3wzm
31+
KNp1c48gmIOsxRYYOQYB9TKfqmv6icYUPZ7wUhahYyf5z5EMnvfXEyflmSAsHOy6
32+
kkSLd8TfC8VQxAhL87DeCEkWkDl1xeEcPuRu3gOm90dxVZfphrqlBZ9hW9j7dysg
33+
Xp2xSqDYOcyKAMR5mMajOogE8vDXgoSRkQK+/HYCNCtKthVIXT2x5h8VP8MGFWNH
34+
YBQwmKnIT6PT2DV2TgpF3X9T9lLdPbg+TwnaoBuYxCIIEbTK+LNKnqaj2dLCxdOq
35+
VjVM6fboLD/7AqtVyld7pX/5FbcD3PaZURQw3p0=
36+
-----END CERTIFICATE-----

services/chatbot/certs/server.key

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
ywoqq7w2QdhJK/vom01mFY8wglE8lQ==
52+
-----END PRIVATE KEY-----

services/chatbot/entrypoint.sh

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/bin/sh
2+
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the “License”);
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an “AS IS” BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
# Get script directory
17+
DIR="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
18+
19+
echo "Starting Flask server"
20+
if [ "$TLS_ENABLED" = "true" ] || [ "$TLS_ENABLED" = "1" ]; then
21+
echo "TLS is ENABLED"
22+
# if $TLS_CERTIFICATE and $TLS_KEY are not set, use the default ones
23+
if [ "$TLS_CERTIFICATE" = "" ]; then
24+
TLS_CERTIFICATE=$DIR/certs/server.crt
25+
fi
26+
if [ "$TLS_KEY" = "" ]; then
27+
TLS_KEY=$DIR/certs/server.key
28+
fi
29+
echo "TLS_CERTIFICATE: $TLS_CERTIFICATE"
30+
echo "TLS_KEY: $TLS_KEY"
31+
gunicorn --workers=1 --threads=20 --timeout 60 --bind 0.0.0.0:${SERVER_PORT} --certfile $TLS_CERTIFICATE --keyfile $TLS_KEY --log-level=debug chatbot_api:app
32+
else:
33+
gunicorn --bind 0.0.0.0:${SERVER_PORT} chatbot_api:app

services/chatbot/src/chatbot_api.py

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,21 @@
2323
target_source_chunks = int(os.environ.get("TARGET_SOURCE_CHUNKS", 4))
2424
loaded_model_lock = threading.Lock()
2525
loaded_model = threading.Event()
26-
logger = logging.getLogger(__name__)
27-
logger.setLevel(logging.DEBUG)
26+
app.logger.setLevel(logging.DEBUG)
2827

2928

3029
def document_loader():
3130
try:
3231
load_dir = "retrieval"
33-
logger.debug("Loading documents from %s", load_dir)
32+
app.logger.debug("Loading documents from %s", load_dir)
3433
loader = DirectoryLoader(
3534
load_dir,
3635
exclude=["**/*.png", "**/images/**", "**/images/*", "**/*.pdf"],
3736
recursive=True,
3837
loader_cls=UnstructuredMarkdownLoader,
3938
)
4039
documents = loader.load()
41-
logger.debug("Loaded %s documents", len(documents))
40+
app.logger.debug("Loaded %s documents", len(documents))
4241
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
4342
texts = text_splitter.split_documents(documents)
4443
embeddings = get_embeddings()
@@ -48,7 +47,7 @@ def document_loader():
4847
retriever = db.as_retriever(search_kwargs={"k": target_source_chunks})
4948
return retriever
5049
except Exception as e:
51-
logger.error("Error loading documents %s", e, exc_info=True)
50+
app.logger.error("Error loading documents %s", e, exc_info=True)
5251
raise e
5352

5453

@@ -93,32 +92,37 @@ def qa_app(qa, query):
9392

9493
@app.route("/chatbot/genai/init", methods=["POST"])
9594
def init_bot():
95+
app.logger.debug("Initializing bot")
9696
try:
9797
with loaded_model_lock:
98-
if "openai_api_key" in request.json:
99-
logger.debug("Initializing bot %s", request.json["openai_api_key"])
100-
os.environ["OPENAI_API_KEY"] = request.json["openai_api_key"]
101-
global vulnerable_app_qa, retriever
102-
retriever = document_loader()
103-
llm = get_llm()
104-
vulnerable_app_qa = get_qa_chain(llm, retriever)
105-
loaded_model.set()
106-
return jsonify({"message": "Model Initialized"}), 200
107-
else:
98+
if os.environ.get("CHATBOT_OPENAI_API_KEY") is not None:
99+
app.logger.info("Using OpenAI API Key from environment")
100+
os.environ["OPENAI_API_KEY"] = os.environ.get("CHATBOT_OPENAI_API_KEY")
101+
elif "openai_api_key" not in request.json:
108102
return jsonify({"message": "openai_api_key not provided"}, 400)
103+
app.logger.debug("Initializing bot %s", request.json["openai_api_key"])
104+
os.environ["OPENAI_API_KEY"] = request.json["openai_api_key"]
105+
global vulnerable_app_qa, retriever
106+
retriever = document_loader()
107+
llm = get_llm()
108+
vulnerable_app_qa = get_qa_chain(llm, retriever)
109+
loaded_model.set()
110+
return jsonify({"message": "Model Initialized"}), 200
111+
109112
except Exception as e:
110-
logger.error("Error initializing bot ", e)
111-
logger.debug("Error initializing bot ", e, exc_info=True)
113+
app.logger.error("Error initializing bot ", e)
114+
app.logger.debug("Error initializing bot ", e, exc_info=True)
112115
return jsonify({"message": "Not able to initialize model " + str(e)}), 400
113116

114117

115118
@app.route("/chatbot/genai/state", methods=["GET"])
116119
def state_bot():
120+
app.logger.debug("Checking state")
117121
try:
118122
if loaded_model.is_set():
119123
return jsonify({"initialized": "true", "message": "Model already loaded"})
120124
except Exception as e:
121-
logger.error("Error checking state ", e)
125+
app.logger.error("Error checking state ", e)
122126
return jsonify({"message": "Error checking state " + str(e)}), 200
123127
return (
124128
jsonify({"initialized": "false", "message": "Model needs to be initialized"}),
@@ -128,15 +132,20 @@ def state_bot():
128132

129133
@app.route("/chatbot/genai/ask", methods=["POST"])
130134
def ask_bot():
135+
app.logger.debug("Asking bot")
131136
question = request.json["question"]
132137
global vulnerable_app_qa
133138
answer = qa_app(vulnerable_app_qa, question)
134-
logger.info("###########################################")
135-
logger.info("Test Attacker Question: %s", question)
136-
logger.info("Vulnerability App Answer: %s", answer)
137-
logger.info("###########################################")
139+
app.logger.info("###########################################")
140+
app.logger.info("Test Attacker Question: %s", question)
141+
app.logger.info("Vulnerability App Answer: %s", answer)
142+
app.logger.info("###########################################")
138143
return jsonify({"answer": answer}), 200
139144

140145

141146
if __name__ == "__main__":
142147
app.run(host="0.0.0.0", port=5002, debug=True)
148+
else:
149+
gunicorn_logger = logging.getLogger("gunicorn.error")
150+
app.logger.handlers = gunicorn_logger.handlers
151+
app.logger.setLevel(logging.DEBUG)

services/web/nginx.conf.template

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,25 @@ server {
148148
sub_filter_once off;
149149
}
150150

151+
location /chatbot/ {
152+
rewrite_by_lua_block {
153+
ngx.req.read_body() -- explicitly read the req body
154+
local body = ngx.req.get_body_data()
155+
if body then
156+
body = ngx.re.gsub(body, ngx.var.scheme.."://"..ngx.var.http_host, "${HTTP_PROTOCOL}://${CHATBOT_SERVICE}")
157+
ngx.req.set_body_data(body)
158+
end
159+
}
160+
proxy_pass ${HTTP_PROTOCOL}://${CHATBOT_SERVICE};
161+
proxy_set_header Host ${CHATBOT_SERVICE};
162+
proxy_set_header X-Forwarded-Host $http_host;
163+
sub_filter_types application/json text/html;
164+
sub_filter "${HTTP_PROTOCOL}://${CHATBOT_SERVICE}" "$scheme://$http_host";
165+
sub_filter_once off;
166+
proxy_ssl_verify off;
167+
proxy_ssl_trusted_certificate /app/certs/server.crt;
168+
}
169+
151170
location /images {
152171
try_files $uri $uri/ =404;
153172
}

services/web/nginx.ssl.conf.template

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,23 @@ server {
157157
sub_filter_once off;
158158
}
159159

160+
location /chatbot/ {
161+
rewrite_by_lua_block {
162+
ngx.req.read_body() -- explicitly read the req body
163+
local body = ngx.req.get_body_data()
164+
if body then
165+
body = ngx.re.gsub(body, ngx.var.scheme.."://"..ngx.var.http_host, "${HTTP_PROTOCOL}://${CHATBOT_SERVICE}")
166+
ngx.req.set_body_data(body)
167+
end
168+
}
169+
proxy_pass ${HTTP_PROTOCOL}://${CHATBOT_SERVICE};
170+
proxy_set_header Host ${CHATBOT_SERVICE};
171+
proxy_set_header X-Forwarded-Host $http_host;
172+
sub_filter_types application/json text/html;
173+
sub_filter "://${CHATBOT_SERVICE}" "://$http_host";
174+
sub_filter_once off;
175+
}
176+
160177
location /images {
161178
try_files $uri $uri/ =404;
162179
}

0 commit comments

Comments
 (0)