@@ -41,10 +41,6 @@ import {
4141 recreateDirectory ,
4242 sendDockerCleanupNotifications ,
4343 spawnAsync ,
44- startService ,
45- startServiceRemote ,
46- stopService ,
47- stopServiceRemote ,
4844 updateLetsEncryptEmail ,
4945 updateServerById ,
5046 updateServerTraefik ,
@@ -88,11 +84,9 @@ export const settingsRouter = createTRPCRouter({
8884 . mutation ( async ( { input } ) => {
8985 try {
9086 if ( input ?. serverId ) {
91- await stopServiceRemote ( input . serverId , "dokploy-traefik" ) ;
92- await startServiceRemote ( input . serverId , "dokploy-traefik" ) ;
87+ await execAsync ( "docker restart dokploy-traefik" ) ;
9388 } else if ( ! IS_CLOUD ) {
94- await stopService ( "dokploy-traefik" ) ;
95- await startService ( "dokploy-traefik" ) ;
89+ await execAsync ( "docker restart dokploy-traefik" ) ;
9690 }
9791 } catch ( err ) {
9892 console . error ( err ) ;
@@ -106,6 +100,7 @@ export const settingsRouter = createTRPCRouter({
106100 await initializeTraefik ( {
107101 enableDashboard : input . enableDashboard ,
108102 serverId : input . serverId ,
103+ force : true ,
109104 } ) ;
110105 return true ;
111106 } ) ,
@@ -513,16 +508,18 @@ export const settingsRouter = createTRPCRouter({
513508 . input ( apiServerSchema )
514509 . query ( async ( { input } ) => {
515510 const command =
516- "docker service inspect -- format= '{{range .Spec.TaskTemplate.ContainerSpec. Env}}{{println .}}{{end}}' dokploy-traefik " ;
511+ "docker container inspect dokploy-traefik -- format '{{json .Config. Env}}' " ;
517512
513+ let result = "" ;
518514 if ( input ?. serverId ) {
519- const result = await execAsyncRemote ( input . serverId , command ) ;
520- return result . stdout . trim ( ) ;
521- }
522- if ( ! IS_CLOUD ) {
523- const result = await execAsync ( command ) ;
524- return result . stdout . trim ( ) ;
515+ const execResult = await execAsyncRemote ( input . serverId , command ) ;
516+ result = execResult . stdout ;
517+ } else {
518+ const execResult = await execAsync ( command ) ;
519+ result = execResult . stdout ;
525520 }
521+ const envVars = JSON . parse ( result . trim ( ) ) ;
522+ return envVars . join ( "\n" ) ;
526523 } ) ,
527524
528525 writeTraefikEnv : adminProcedure
@@ -532,34 +529,30 @@ export const settingsRouter = createTRPCRouter({
532529 await initializeTraefik ( {
533530 env : envs ,
534531 serverId : input . serverId ,
532+ force : true ,
535533 } ) ;
536534
537535 return true ;
538536 } ) ,
539537 haveTraefikDashboardPortEnabled : adminProcedure
540538 . input ( apiServerSchema )
541539 . query ( async ( { input } ) => {
542- const command = `docker service inspect --format='{{json .Endpoint .Ports}}' dokploy-traefik` ;
540+ const command = `docker container inspect --format='{{json .NetworkSettings .Ports}}' dokploy-traefik` ;
543541
544542 let stdout = "" ;
545543 if ( input ?. serverId ) {
546544 const result = await execAsyncRemote ( input . serverId , command ) ;
547545 stdout = result . stdout ;
548546 } else if ( ! IS_CLOUD ) {
549- const result = await execAsync (
550- "docker service inspect --format='{{json .Endpoint.Ports}}' dokploy-traefik" ,
551- ) ;
547+ const result = await execAsync ( command ) ;
552548 stdout = result . stdout ;
553549 }
554550
555- const parsed : any [ ] = JSON . parse ( stdout . trim ( ) ) ;
556- for ( const port of parsed ) {
557- if ( port . PublishedPort === 8080 ) {
558- return true ;
559- }
560- }
561-
562- return false ;
551+ const ports = JSON . parse ( stdout . trim ( ) ) ;
552+ return Object . entries ( ports ) . some ( ( [ containerPort , bindings ] ) => {
553+ const [ port ] = containerPort . split ( "/" ) ;
554+ return port === "8080" && bindings && ( bindings as any [ ] ) . length > 0 ;
555+ } ) ;
563556 } ) ,
564557
565558 readStatsLogs : adminProcedure
@@ -772,6 +765,7 @@ export const settingsRouter = createTRPCRouter({
772765 await initializeTraefik ( {
773766 serverId : input . serverId ,
774767 additionalPorts : input . additionalPorts ,
768+ force : true ,
775769 } ) ;
776770 return true ;
777771 } catch ( error ) {
@@ -788,7 +782,7 @@ export const settingsRouter = createTRPCRouter({
788782 getTraefikPorts : adminProcedure
789783 . input ( apiServerSchema )
790784 . query ( async ( { input } ) => {
791- const command = `docker service inspect --format='{{json .Endpoint .Ports}}' dokploy-traefik` ;
785+ const command = `docker container inspect --format='{{json .NetworkSettings .Ports}}' dokploy-traefik` ;
792786
793787 try {
794788 let stdout = "" ;
@@ -800,21 +794,38 @@ export const settingsRouter = createTRPCRouter({
800794 stdout = result . stdout ;
801795 }
802796
803- const ports : {
804- Protocol : string ;
805- TargetPort : number ;
806- PublishedPort : number ;
807- PublishMode : string ;
808- } [ ] = JSON . parse ( stdout . trim ( ) ) ;
809-
810- // Filter out the default ports (80, 443, and optionally 8080)
811- const additionalPorts = ports
812- . filter ( ( port ) => ! [ 80 , 443 , 8080 ] . includes ( port . PublishedPort ) )
813- . map ( ( port ) => ( {
814- targetPort : port . TargetPort ,
815- publishedPort : port . PublishedPort ,
816- publishMode : port . PublishMode . toLowerCase ( ) as "host" | "ingress" ,
817- } ) ) ;
797+ const portsMap = JSON . parse ( stdout . trim ( ) ) ;
798+ const additionalPorts : Array < {
799+ targetPort : number ;
800+ publishedPort : number ;
801+ publishMode : "host" | "ingress" ;
802+ } > = [ ] ;
803+
804+ // Convert the Docker container port format to our expected format
805+ for ( const [ containerPort , bindings ] of Object . entries ( portsMap ) ) {
806+ if ( ! bindings ) continue ;
807+
808+ const [ port = "" ] = containerPort . split ( "/" ) ;
809+ if ( ! port ) continue ;
810+
811+ const targetPortNum = Number . parseInt ( port , 10 ) ;
812+ if ( Number . isNaN ( targetPortNum ) ) continue ;
813+
814+ // Skip default ports
815+ if ( [ 80 , 443 , 8080 ] . includes ( targetPortNum ) ) continue ;
816+
817+ for ( const binding of bindings as Array < { HostPort : string } > ) {
818+ if ( ! binding . HostPort ) continue ;
819+ const publishedPort = Number . parseInt ( binding . HostPort , 10 ) ;
820+ if ( Number . isNaN ( publishedPort ) ) continue ;
821+
822+ additionalPorts . push ( {
823+ targetPort : targetPortNum ,
824+ publishedPort,
825+ publishMode : "host" , // Docker standalone uses host mode by default
826+ } ) ;
827+ }
828+ }
818829
819830 return additionalPorts ;
820831 } catch ( error ) {
0 commit comments