diff -ruNa rustdesk-server/Cargo.toml rustdesk-server-mod/Cargo.toml
--- rustdesk-server/Cargo.toml	2023-03-31 14:36:55.405030000 +0200
+++ rustdesk-server-mod/Cargo.toml	2023-03-31 18:37:16.460227000 +0200
@@ -24,33 +24,33 @@
 lazy_static = "1.4"
 clap = "2"
 rust-ini = "0.18"
-minreq = { version = "2.4", features = ["punycode"] }
-machine-uid = "0.2"
+minreq = { version = "2.7", features = ["punycode"] }
+machine-uid = "0.3"
 mac_address = "1.1"
-whoami = "1.2"
-base64 = "0.13"
-axum = { version = "0.5", features = ["headers"] }
+whoami = "1.4"
+base64 = "0.21"
+axum = { version = "0.6", features = ["headers"] }
 sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "sqlite", "macros", "chrono", "json" ] }
-deadpool = "0.8"
+deadpool = "0.9"
 async-trait = "0.1"
 async-speed-limit = { git = "https://github.com/open-trade/async-speed-limit" }
-uuid = { version = "1.0", features = ["v4"] }
-bcrypt = "0.13"
+uuid = { version = "1.3", features = ["v4"] }
+bcrypt = "0.14"
 chrono = "0.4"
 jsonwebtoken = "8"
 headers = "0.3"
-once_cell = "1.8"
+once_cell = "1.17"
 sodiumoxide = "0.2"
-tokio-tungstenite = "0.17"
-tungstenite = "0.17"
-regex = "1.4"
-tower-http = { version = "0.3", features = ["fs", "trace", "cors"] }
+tokio-tungstenite = "0.18"
+tungstenite = "0.18"
+regex = "1.7"
+tower-http = { version = "0.4", features = ["fs", "trace", "cors"] }
 http = "0.2"
-flexi_logger = { version = "0.22", features = ["async", "use_chrono_for_offset"] }
+flexi_logger = { version = "0.25", features = ["async", "dont_minimize_extra_stacks"] }
 ipnetwork = "0.20"
-local-ip-address = "0.5.1"
-dns-lookup = "1.0.8"
-ping = "0.4.0"
+local-ip-address = "0.5"
+dns-lookup = "1.0"
+ping = "0.4"
 
 [build-dependencies]
 hbb_common = { path = "libs/hbb_common" }
diff -ruNa rustdesk-server/src/common.rs rustdesk-server-mod/src/common.rs
--- rustdesk-server/src/common.rs	2023-03-31 14:36:55.414712000 +0200
+++ rustdesk-server-mod/src/common.rs	2023-03-31 14:39:28.303035000 +0200
@@ -11,6 +11,7 @@
     net::SocketAddr,
     time::{Instant, SystemTime},
 };
+use base64::{engine::general_purpose, Engine as _};
 
 #[allow(dead_code)]
 pub(crate) fn get_expired_time() -> Instant {
@@ -113,11 +114,11 @@
     if let Ok(mut file) = std::fs::File::open(sk_file) {
         let mut contents = String::new();
         if file.read_to_string(&mut contents).is_ok() {
-            let sk = base64::decode(&contents).unwrap_or_default();
+            let sk = general_purpose::STANDARD.decode(&contents).unwrap_or_default();
             if sk.len() == sign::SECRETKEYBYTES {
                 let mut tmp = [0u8; sign::SECRETKEYBYTES];
                 tmp[..].copy_from_slice(&sk);
-                let pk = base64::encode(&tmp[sign::SECRETKEYBYTES / 2..]);
+                let pk = general_purpose::STANDARD.encode(&tmp[sign::SECRETKEYBYTES / 2..]);
                 log::info!("Private key comes from {}", sk_file);
                 return (pk, Some(sign::SecretKey(tmp)));
             }
@@ -125,7 +126,7 @@
     } else {
         let gen_func = || {
             let (tmp, sk) = sign::gen_keypair();
-            (base64::encode(tmp), sk)
+            (general_purpose::STANDARD.encode(tmp), sk)
         };
         let (mut pk, mut sk) = gen_func();
         for _ in 0..300 {
@@ -138,7 +139,7 @@
         if let Ok(mut f) = std::fs::File::create(&pub_file) {
             f.write_all(pk.as_bytes()).ok();
             if let Ok(mut f) = std::fs::File::create(sk_file) {
-                let s = base64::encode(&sk);
+                let s = general_purpose::STANDARD.encode(&sk);
                 if f.write_all(s.as_bytes()).is_ok() {
                     log::info!("Private/public key written to {}/{}", sk_file, pub_file);
                     log::debug!("Public key: {}", pk);
diff -ruNa rustdesk-server/src/database.rs rustdesk-server-mod/src/database.rs
--- rustdesk-server/src/database.rs	2023-03-31 14:36:55.414875000 +0200
+++ rustdesk-server-mod/src/database.rs	2023-03-31 18:33:24.925088000 +0200
@@ -56,12 +56,16 @@
             .parse()
             .unwrap_or(1);
         log::debug!("MAX_DATABASE_CONNECTIONS={}", n);
-        let pool = Pool::new(
-            DbPool {
-                url: url.to_owned(),
-            },
-            n,
-        );
+        //let pool = Pool::new(
+        //    DbPool {
+        //        url: url.to_owned(),
+        //    },
+        //    n,
+        //);
+        let poolmgr = DbPool {
+            url: url.to_owned(),
+        };
+        let pool = Pool::builder(poolmgr).build().unwrap();
         let _ = pool.get().await?; // test
         let db = Database { pool };
         db.create_tables().await?;
diff -ruNa rustdesk-server/src/relay_server.rs rustdesk-server-mod/src/relay_server.rs
--- rustdesk-server/src/relay_server.rs	2023-03-31 14:36:55.415662000 +0200
+++ rustdesk-server-mod/src/relay_server.rs	2023-03-31 14:41:50.542810000 +0200
@@ -26,6 +26,7 @@
     io::Error,
     net::SocketAddr,
 };
+use base64::{engine::general_purpose, Engine as _};
 
 type Usage = (usize, usize, usize, usize);
 
@@ -564,10 +565,10 @@
 
 fn get_server_sk(key: &str) -> String {
     let mut key = key.to_owned();
-    if let Ok(sk) = base64::decode(&key) {
+    if let Ok(sk) = general_purpose::STANDARD.decode(&key) {
         if sk.len() == sign::SECRETKEYBYTES {
             log::info!("The key is a crypto private key");
-            key = base64::encode(&sk[(sign::SECRETKEYBYTES / 2)..]);
+            key = general_purpose::STANDARD.encode(&sk[(sign::SECRETKEYBYTES / 2)..]);
         }
     }
 
diff -ruNa rustdesk-server/src/rendezvous_server.rs rustdesk-server-mod/src/rendezvous_server.rs
--- rustdesk-server/src/rendezvous_server.rs	2023-03-31 14:36:55.416091000 +0200
+++ rustdesk-server-mod/src/rendezvous_server.rs	2023-03-31 14:42:09.796510000 +0200
@@ -38,6 +38,7 @@
     sync::Arc,
     time::Instant,
 };
+use base64::{engine::general_purpose, Engine as _};
 
 #[derive(Clone, Debug)]
 enum Data {
@@ -1158,10 +1159,10 @@
     fn get_server_sk(key: &str) -> (String, Option<sign::SecretKey>) {
         let mut out_sk = None;
         let mut key = key.to_owned();
-        if let Ok(sk) = base64::decode(&key) {
+        if let Ok(sk) = general_purpose::STANDARD.decode(&key) {
             if sk.len() == sign::SECRETKEYBYTES {
                 log::info!("The key is a crypto private key");
-                key = base64::encode(&sk[(sign::SECRETKEYBYTES / 2)..]);
+                key = general_purpose::STANDARD.encode(&sk[(sign::SECRETKEYBYTES / 2)..]);
                 let mut tmp = [0u8; sign::SECRETKEYBYTES];
                 tmp[..].copy_from_slice(&sk);
                 out_sk = Some(sign::SecretKey(tmp));
diff -ruNa rustdesk-server/src/utils.rs rustdesk-server-mod/src/utils.rs
--- rustdesk-server/src/utils.rs	2023-03-31 14:36:55.416273000 +0200
+++ rustdesk-server-mod/src/utils.rs	2023-03-31 14:42:45.200332000 +0200
@@ -6,6 +6,7 @@
     net::{IpAddr, TcpStream},
     process, str,
 };
+use base64::{engine::general_purpose, Engine as _};
 
 fn print_help() {
     println!(
@@ -26,14 +27,14 @@
 
 fn gen_keypair() {
     let (pk, sk) = sign::gen_keypair();
-    let public_key = base64::encode(pk);
-    let secret_key = base64::encode(sk);
+    let public_key = general_purpose::STANDARD.encode(pk);
+    let secret_key = general_purpose::STANDARD.encode(sk);
     println!("Public Key:  {public_key}");
     println!("Secret Key:  {secret_key}");
 }
 
 fn validate_keypair(pk: &str, sk: &str) -> ResultType<()> {
-    let sk1 = base64::decode(sk);
+    let sk1 = general_purpose::STANDARD.decode(sk);
     if sk1.is_err() {
         bail!("Invalid secret key");
     }
@@ -45,7 +46,7 @@
     }
     let secret_key = secret_key.unwrap();
 
-    let pk1 = base64::decode(pk);
+    let pk1 = general_purpose::STANDARD.decode(pk);
     if pk1.is_err() {
         bail!("Invalid public key");
     }
