diff --git a/.env b/.env
index fe45b31ba671da025d152264e6efaebeae0755fc..e81f2907303fdc92076f9c0e92815a2ad4c36f4a 100644
--- a/.env
+++ b/.env
@@ -1,3 +1,17 @@
 DOCKER_SUBNET=172.27.0.0/16
 DOCKER_SUBNET_GATEWAY=172.27.0.1
 HANDLE_SERVER_IPV4_ADDRESS=172.27.0.2
+HANDLE_SERVER_BIND_ADDRESS=172.27.0.2
+HANDLE_SERVER_TCP_PORT=2641
+HANDLE_SERVER_UDP_PORT=2641
+HANDLE_SERVER_HTTP_PORT=8000
+HANDLE_SERVER_ORG_NAME="Test Inc."
+HANDLE_SERVER_CONTACT_NAME="Ms Test"
+HANDLE_SERVER_CONTACT_EMAIL="test@example.com"
+HANDLE_SERVER_LOG_SAVE_INTERVAL="Monthly"
+
+
+# HANDLE_SERVER_HOME_PREFIX without "0.NA/" prefix.
+HANDLE_SERVER_HOME_PREFIX="0.TEST"
+# USE_PUBLIC_HANDLE_SYSTEM="TRUE"
+USE_PUBLIC_HANDLE_SYSTEM="FALSE"
diff --git a/handle_server/Dockerfile b/handle_server/Dockerfile
index 107b32b81edc4b1faa34ac7df0034b0c86e87496..6ef9a68bb7218e50ce6267d49ff23b4c8913211a 100644
--- a/handle_server/Dockerfile
+++ b/handle_server/Dockerfile
@@ -1,5 +1,7 @@
 FROM eclipse-temurin:21-jre-alpine
 
+RUN apk add jq
+
 RUN mkdir -p /hs/srv_1
 
 WORKDIR /hs
@@ -14,6 +16,8 @@ RUN tar -xvzf handle-distribution.tar.gz
 WORKDIR /hs/handle-${HANDLE_SERVER_VERSION}
 
 COPY ./run_handle_server.sh ./
+COPY ./generate_keys.sh ./
+COPY ./generate_siteinfo.sh ./
 
 COPY ./templates /hs/templates
 
diff --git a/handle_server/run_handle_server.sh b/handle_server/run_handle_server.sh
index 0b818d7be202ce912f1dca688532027ee45bfafd..6bd28d1a78a0260bed7ad8fa7d4b02266a5820b5 100755
--- a/handle_server/run_handle_server.sh
+++ b/handle_server/run_handle_server.sh
@@ -10,10 +10,38 @@ fi
 # ### Update configuration ###
 
 # update config.dct
-sed "s/HANDLE_SERVER_IPV4_ADDRESS/${HANDLE_SERVER_IPV4_ADDRESS}/g" /hs/templates/config.dct > "$SRV_DIR/config.dct"
+ALLOW_NA_ADMINS='"allow_na_admins" = "no"'
+TEMPLATE_NS_OVERRIDE='"template_ns_override" = "yes"'
+SERVER_ADMINS="300:${HANDLE_SERVER_HOME_PREFIX}/ADMIN"
+if [ "$USE_PUBLIC_HANDLE_SYSTEM" = "TRUE" ] ; then
+    ALLOW_NA_ADMINS=""
+    TEMPLATE_NS_OVERRIDE=""
+    SERVER_ADMINS="300:0.NA/${HANDLE_SERVER_HOME_PREFIX}"
+fi
+REPLICATION_ADMINS="${SERVER_ADMINS}"
+
+sed "s/__HANDLE_SERVER_BIND_ADDRESS__/${HANDLE_SERVER_BIND_ADDRESS}/g" /hs/templates/config.dct \
+  | sed "s/__HANDLE_SERVER_HTTP_PORT__/${HANDLE_SERVER_HTTP_PORT}/g" \
+  | sed "s/__HANDLE_SERVER_TCP_PORT__/${HANDLE_SERVER_TCP_PORT}/g" \
+  | sed "s/__HANDLE_SERVER_UDP_PORT__/${HANDLE_SERVER_UDP_PORT}/g" \
+  | sed "s/__HANDLE_SERVER_ALLOW_NA_ADMINS__/${ALLOW_NA_ADMINS}/g" \
+  | sed "s/__HANDLE_SERVER_TEMPLATE_NS_OVERRIDE__/${TEMPLATE_NS_OVERRIDE}/g" \
+  | sed "s/__HANDLE_SERVER_SERVER_ADMINS__/${SERVER_ADMINS}/g" \
+  | sed "s/__HANDLE_SERVER_REPLICATION_ADMINS__/${REPLICATION_ADMINS}/g" \
+  > "$SRV_DIR/config.dct"
 
 # update siteinfo.json
-sed "s/HANDLE_SERVER_IPV4_ADDRESS/${HANDLE_SERVER_IPV4_ADDRESS}/g" /hs/templates/siteinfo.json > "$SRV_DIR/siteinfo.json"
+RSA_KEY_N="$(cat "${SRV_DIR}/pubkey.json" | jq .n)"
+RSA_KEY_E="$(cat "${SRV_DIR}/pubkey.json" | jq .e)"
+
+sed "s/__HANDLE_SERVER_IPV4_ADDRESS__/${HANDLE_SERVER_IPV4_ADDRESS}/g" /hs/templates/siteinfo.json \
+  | sed "s/__HANDLE_SERVER_DESCRIPTION__/${HANDLE_SERVER_DESCRIPTION}/g" \
+  | sed "s/__HANDLE_SERVER_HTTP_PORT__/${HANDLE_SERVER_HTTP_PORT}/g" \
+  | sed "s/__HANDLE_SERVER_TCP_PORT__/${HANDLE_SERVER_TCP_PORT}/g" \
+  | sed "s/__HANDLE_SERVER_UDP_PORT__/${HANDLE_SERVER_UDP_PORT}/g" \
+  | sed "s/\"__HANDLE_SERVER_PUBKEY_RSA_N__\"/${RSA_KEY_N}/g" \
+  | sed "s/\"__HANDLE_SERVER_PUBKEY_RSA_E__\"/${RSA_KEY_E}/g" \
+  > "$SRV_DIR/siteinfo.json"
 
 
 # ### Configure private handle network ###
diff --git a/handle_server/templates/config.dct b/handle_server/templates/config.dct
index 6a1ee17af711184cf789bbdbec58ad6b0425aa72..ce049b5b87b9edbea06a189b76d959550e648427 100644
--- a/handle_server/templates/config.dct
+++ b/handle_server/templates/config.dct
@@ -1,29 +1,29 @@
 {
   "hdl_http_config" = {
-    "bind_address" = "HANDLE_SERVER_IPV4_ADDRESS"
+    "bind_address" = "__HANDLE_SERVER_BIND_ADDRESS__"
     "num_threads" = "15"
-    "bind_port" = "8000"
+    "bind_port" = "__HANDLE_SERVER_HTTP_PORT__"
     "log_accesses" = "yes"
   }
 
   "server_type" = "server"
   "hdl_udp_config" = {
-    "bind_address" = "HANDLE_SERVER_IPV4_ADDRESS"
+    "bind_address" = "__HANDLE_SERVER_BIND_ADDRESS__"
     "num_threads" = "15"
-    "bind_port" = "2641"
+    "bind_port" = "__HANDLE_SERVER_UDP_PORT__"
     "log_accesses" = "yes"
   }
 
   "hdl_tcp_config" = {
-    "bind_address" = "HANDLE_SERVER_IPV4_ADDRESS"
+    "bind_address" = "__HANDLE_SERVER_BIND_ADDRESS__"
     "num_threads" = "15"
-    "bind_port" = "2641"
+    "bind_port" = "__HANDLE_SERVER_TCP_PORT__"
     "log_accesses" = "yes"
   }
 
   "log_save_config" = {
     "log_save_directory" = "logs"
-    "log_save_interval" = "Monthly"
+    "log_save_interval" = "__HANDLE_SERVER_LOG_SAVE_INTERVAL__"
   }
 
   "no_udp_resolution" = "no"
@@ -35,11 +35,11 @@
 
   "server_config" = {
     "server_admins" = (
-      "300:0.TEST/ADMIN"
+      "__HANDLE_SERVER_SERVER_ADMINS__"
     )
 
     "replication_admins" = (
-      "300:0.TEST/ADMIN"
+      "__HANDLE_SERVER_REPLICATION_ADMINS__"
     )
 
     "max_session_time" = "86400000"
@@ -47,10 +47,10 @@
     "max_auth_time" = "60000"
     "server_admin_full_access" = "yes"
     "case_sensitive" = "no"
-    "allow_na_admins" = "no"
-    "template_ns_override" = "yes"
+    __HANDLE_SERVER_ALLOW_NA_ADMINS__
+    __HANDLE_SERVER_TEMPLATE_NS_OVERRIDE__
     "auto_homed_prefixes" = (
-      "0.NA/0.TEST"
+      "0.NA/__HANDLE_SERVER_HOME_PREFIX__"
     )
 
   }
diff --git a/handle_server/templates/siteinfo.json b/handle_server/templates/siteinfo.json
index c27f6c26df804750d55c11398f3f883f37236c46..77a609433995f2d3987f95d1532cf018c9f85eb5 100644
--- a/handle_server/templates/siteinfo.json
+++ b/handle_server/templates/siteinfo.json
@@ -7,19 +7,19 @@
   "attributes": [
     {
       "name": "desc",
-      "value": ""
+      "value": "__HANDLE_SERVER_DESCRIPTION__"
     }
   ],
   "servers": [
     {
       "serverId": 1,
-      "address": "HANDLE_SERVER_IPV4_ADDRESS",
+      "address": "__HANDLE_SERVER_IPV4_ADDRESS__",
       "publicKey": {
         "format": "key",
         "value": {
           "kty": "RSA",
-          "n": "wqkCd9QfFxYwMhQM72k-nQ5yL0lbxz9OTOTgR2eFj6dz5YZzoDg3t4MauMVUt5pkByWScle-7mdVJHuEp1GErqyzW3dPagTgmzc1R1i2gQF5fUiJFx90hkAzh88PW4qFs_YBwOsChGanGzsqn6cbKV3VQn5K2QZHF7rxeKdstF72lFN7ewkk-Kw5i0I3akpGYu9YJ_Is8k7rDQ5P_KKfrn_N_0_seQO-IT9vW_u0IvK75_6VwNjU5wU6SDF9dgivSk-qv7R_rpl8eAow0zUkllsFqJxEEn63koK5gSsKitfN7Jt_71b_Nwmjpv2gEydh42bEOSHx0dFeALwY1rl74w",
-          "e": "AQAB"
+          "n": "__HANDLE_SERVER_PUBKEY_RSA_N__",
+          "e": "__HANDLE_SERVER_PUBKEY_RSA_E__"
         }
       },
       "interfaces": [
@@ -27,19 +27,19 @@
           "query": true,
           "admin": true,
           "protocol": "TCP",
-          "port": 2641
+          "port": __HANDLE_SERVER_TCP_PORT__
         },
         {
           "query": true,
           "admin": false,
           "protocol": "UDP",
-          "port": 2641
+          "port": __HANDLE_SERVER_UDP_PORT__
         },
         {
           "query": true,
           "admin": true,
           "protocol": "HTTP",
-          "port": 8000
+          "port": __HANDLE_SERVER_HTTP_PORT__
         }
       ]
     }