Closed
Description
Description of the issue
Unable to use MariaDB SSL certificate specified in site_config.json
.
Context information
Output of bench version
erpnext 14.10.0
frappe 14.18.1
payments 0.0.1
Steps to reproduce the issue
- Install ERPNext on a Kubernetes cluster
- Modify
site_config.json
to specify MySQL certificate using the following keys (as described here):db_ssl_ca
db_ssl_cert
db_ssl_key
- Try to open ERPNext in your browser
Observed result
A page showing Internal Server Error and the following logged by the Gunicorn container:
TypeError: Connection.__init__() got an unexpected keyword argument 'ca'
Expected result
Success
Stacktrace / full error message
Traceback (most recent call last):
File "/home/frappe/frappe-bench/env/lib/python3.10/site-packages/gunicorn/workers/base_async.py", line 55, in handle
self.handle_request(listener_name, req, client, addr)
File "/home/frappe/frappe-bench/env/lib/python3.10/site-packages/gunicorn/workers/ggevent.py", line 127, in handle_request
super().handle_request(listener_name, req, sock, addr)
File "/home/frappe/frappe-bench/env/lib/python3.10/site-packages/gunicorn/workers/base_async.py", line 108, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/home/frappe/frappe-bench/env/lib/python3.10/site-packages/werkzeug/local.py", line 237, in application
return ClosingIterator(app(environ, start_response), self.cleanup)
File "/home/frappe/frappe-bench/env/lib/python3.10/site-packages/werkzeug/wrappers/request.py", line 187, in application
resp = f(*args[:-2] + (request,))
File "/home/frappe/frappe-bench/apps/frappe/frappe/app.py", line 87, in application
response = handle_exception(e)
File "/home/frappe/frappe-bench/apps/frappe/frappe/app.py", line 324, in handle_exception
response = get_response("message", http_status_code=http_status_code)
File "/home/frappe/frappe-bench/apps/frappe/frappe/website/serve.py", line 26, in get_response
frappe.log_error(f"{path} failed")
File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 2218, in log_error
error_log = get_doc(
File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 1176, in get_doc
doc = frappe.model.document.get_doc(*args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 72, in get_doc
controller = get_controller(doctype)
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/base_document.py", line 81, in get_controller
site_controllers[doctype] = _get_controller()
File "/home/frappe/frappe-bench/apps/frappe/frappe/model/base_document.py", line 47, in _get_controller
module_name, custom = frappe.db.get_value(
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 495, in get_value
result = self.get_values(
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 592, in get_values
out = self._get_values_from_table(
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 809, in _get_values_from_table
query = frappe.qb.engine.get_query(
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/query.py", line 513, in get_query
criterion = self.build_conditions(table, filters, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/query.py", line 369, in build_conditions
criterion = self.dict_query(filters=filters, table=table, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/query.py", line 328, in dict_query
_operator = self.OPERATOR_MAP["="]
File "/usr/local/lib/python3.10/functools.py", line 981, in __get__
val = self.func(instance)
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/query.py", line 194, in OPERATOR_MAP
if frappe.get_hooks("filters_config"):
File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 1478, in get_hooks
hooks = _dict(cache().get_value("app_hooks", _load_app_hooks))
File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/redis_wrapper.py", line 81, in get_value
val = generator()
File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/caching.py", line 57, in wrapper
return_val = func(*args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 1439, in _load_app_hooks
apps = [app_name] if app_name else get_installed_apps(sort=True)
File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/caching.py", line 57, in wrapper
return_val = func(*args, **kwargs)
File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 1404, in get_installed_apps
installed = json.loads(db.get_global("installed_apps") or "[]")
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 958, in get_global
return self.get_default(key, user)
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 962, in get_default
d = self.get_defaults(key, parent)
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 978, in get_defaults
defaults = frappe.defaults.get_defaults_for(parent)
File "/home/frappe/frappe-bench/apps/frappe/frappe/defaults.py", line 218, in get_defaults_for
frappe.qb.from_(table)
File "/home/frappe/frappe-bench/apps/frappe/frappe/query_builder/utils.py", line 76, in execute_query
return frappe.db.sql(query, params, *args, **kwargs) # nosemgrep
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 199, in sql
self.connect()
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 113, in connect
self._conn = self.get_connection()
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/database.py", line 98, in get_connection
conn = self._get_connection()
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/database.py", line 104, in _get_connection
return self.create_connection()
File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/database.py", line 107, in create_connection
return pymysql.connect(**self.get_connection_settings())
TypeError: Connection.__init__() got an unexpected keyword argument 'ca'
Additional information
site_config.json
:
{
"db_host": "mysql",
"db_name": "erpnext",
"db_user": "erpnext",
"db_password": "some_password",
"db_port": 3306,
"db_type": "mariadb",
"db_ssl_ca": "/etc/ssl/mysql/ca.crt",
"db_ssl_cert": "/etc/ssl/mysql/tls.crt",
"db_ssl_key": "/etc/ssl/mysql/tls.key"
}