@@ -200,28 +200,49 @@ async fn main() {
200200 . allow_methods ( [ Method :: GET , Method :: POST , Method :: DELETE ] )
201201 . allow_headers ( [ header:: CONTENT_TYPE ] ) ;
202202
203- let app = Router :: new ( )
204- . route ( "/cb-admin/api/cache" , delete ( invalidate_handler) )
205- . route ( "/cb-admin/api/status" , get ( get_memory_cache_status) )
206- . route ( "/cb-admin" , get ( embedded_ui_index) )
207- . route ( "/cb-admin/" , get ( embedded_ui_index) )
208- . route ( "/cb-admin/*path" , get ( embedded_ui_handler) )
209- . route ( "/metrics" , get ( move || async move { handle. render ( ) } ) )
203+ // 8. Build Proxy Router (main traffic)
204+ let proxy_router = Router :: new ( )
210205 . route ( "/" , get ( proxy:: proxy_handler) )
211206 . route ( "/*path" , get ( proxy:: proxy_handler) )
207+ . layer ( cors. clone ( ) ) ;
208+
209+ // 9. Build Admin Router (admin + metrics)
210+ let admin_router = Router :: new ( )
211+ . route ( "/admin/api/cache" , delete ( invalidate_handler) )
212+ . route ( "/admin/api/status" , get ( get_memory_cache_status) )
213+ . route ( "/admin" , get ( embedded_ui_index) )
214+ . route ( "/admin/" , get ( embedded_ui_index) )
215+ . route ( "/admin/*path" , get ( embedded_ui_handler) )
216+ . route ( "/metrics" , get ( move || async move { handle. render ( ) } ) )
212217 . layer ( cors) ;
213218
214219 // ------------------------------------------------------
215- // 8 . Bind the server to all interfaces on port 3000
220+ // 10 . Bind the server to all interfaces on port 3000
216221 // ------------------------------------------------------
217- let addr = SocketAddr :: from ( ( [ 0 , 0 , 0 , 0 ] , 3000 ) ) ;
218- info ! ( "🚀 Server listening at http://{}" , addr) ;
222+ let config = CONFIG . get ( ) . expect ( "CONFIG must be initialized" ) ;
223+
224+ let proxy_addr = SocketAddr :: from ( ( [ 0 , 0 , 0 , 0 ] , config. proxy_port ) ) ;
225+ let admin_addr = SocketAddr :: from ( ( [ 0 , 0 , 0 , 0 ] , config. admin_port ) ) ;
226+
227+ info ! ( "🚀 Proxy listening at http://{}" , proxy_addr) ;
228+ info ! (
229+ "🛠 Admin UI listening at http://{}/admin/ | Metrics at http://{}/metrics" ,
230+ admin_addr, admin_addr
231+ ) ;
232+
233+ // 11. Start both servers concurrently
234+ let proxy_server = Server :: bind ( & proxy_addr) . serve ( proxy_router. into_make_service ( ) ) ;
235+ let admin_server = Server :: bind ( & admin_addr) . serve ( admin_router. into_make_service ( ) ) ;
219236
220237 // ------------------------------------------------------
221- // 9 . Start serving HTTP requests using Axum and Hyper
238+ // 12 . Start serving HTTP requests using Axum and Hyper
222239 // ------------------------------------------------------
223- Server :: bind ( & addr)
224- . serve ( app. into_make_service ( ) )
225- . await
226- . unwrap ( ) ;
240+ let ( proxy_result, admin_result) = tokio:: join!( proxy_server, admin_server) ;
241+
242+ if let Err ( e) = proxy_result {
243+ error ! ( "❌ Proxy server exited with error: {}" , e) ;
244+ }
245+ if let Err ( e) = admin_result {
246+ error ! ( "❌ Admin server exited with error: {}" , e) ;
247+ }
227248}
0 commit comments