diff --git a/uffd-ldapd b/uffd-ldapd
index 6beac0bd363d5d598ba057bec8832c5af9cb4912..e69a8b257e31bea547bc828badfd9f313ff744f3 100755
--- a/uffd-ldapd
+++ b/uffd-ldapd
@@ -5,6 +5,7 @@ import socketserver
 import logging
 import socket
 import re
+import signal
 
 import click
 import requests
@@ -284,6 +285,10 @@ class StdoutFilter(logging.Filter):
 	def filter(self, record):
 		return record.levelno <= logging.INFO
 
+def sigterm_handler(_signum, _frame):
+	logger.info("Received SIGTERM, shutting down gracefully ...")
+	sys.exit(0)
+
 # pylint: disable=line-too-long
 @click.command(help='LDAP proxy for integrating LDAP service with uffd SSO. Supports user and group searches and as well as binds with user passwords.')
 @click.option('--socket-address', help='Host and port "ip:port" to listen on')
@@ -298,6 +303,10 @@ class StdoutFilter(logging.Filter):
 @click.option('--group-filter-regex', help='Python regular expression that group names must match for the group to be visible to LDAP clients')
 def main(socket_address, socket_path, socket_fd, api_url, api_user, api_secret, cache_ttl, base_dn, bind_password, group_filter_regex):
 	# pylint: disable=too-many-locals
+
+	# Register signal handler for proper SIGTERM handling
+	signal.signal(signal.SIGTERM, sigterm_handler)
+
 	if (socket_address is not None) \
 	   + (socket_path is not None) \
 	   + (socket_fd is not None) != 1: