@@ -23,6 +23,7 @@ import (
2323 "gitlab.com/postgres-ai/database-lab/v2/pkg/config"
2424 "gitlab.com/postgres-ai/database-lab/v2/pkg/config/global"
2525 "gitlab.com/postgres-ai/database-lab/v2/pkg/estimator"
26+ "gitlab.com/postgres-ai/database-lab/v2/pkg/localui"
2627 "gitlab.com/postgres-ai/database-lab/v2/pkg/log"
2728 "gitlab.com/postgres-ai/database-lab/v2/pkg/observer"
2829 "gitlab.com/postgres-ai/database-lab/v2/pkg/retrieval"
@@ -49,20 +50,6 @@ func main() {
4950 log .Fatal (errors .WithMessage (err , "failed to parse config" ))
5051 }
5152
52- log .Msg ("Database Lab Instance ID:" , cfg .Global .InstanceID )
53- log .Msg ("Database Lab Engine version:" , version .GetVersion ())
54-
55- if cfg .Server .VerificationToken == "" {
56- log .Warn ("Verification Token is empty. Database Lab Engine is insecure" )
57- }
58-
59- runner := runners .NewLocalRunner (cfg .Provision .UseSudo )
60-
61- pm := pool .NewPoolManager (& cfg .PoolManager , runner )
62- if err := pm .ReloadPools (); err != nil {
63- log .Fatal (err .Error ())
64- }
65-
6653 dockerCLI , err := client .NewClientWithOpts (client .FromEnv )
6754 if err != nil {
6855 log .Fatal ("Failed to create a Docker client:" , err )
@@ -71,13 +58,27 @@ func main() {
7158 ctx , cancel := context .WithCancel (context .Background ())
7259 defer cancel ()
7360
74- engProps , err := getEngineProperties (ctx , dockerCLI , cfg . Global . InstanceID )
61+ engProps , err := getEngineProperties (ctx , dockerCLI , cfg )
7562 if err != nil {
7663 log .Err ("failed to get Database Lab Engine properties:" , err .Error ())
7764 return
7865 }
7966
80- internalNetworkID , err := networks .Setup (ctx , dockerCLI , cfg .Global .InstanceID , engProps .ContainerName )
67+ log .Msg ("Database Lab Instance ID:" , engProps .InstanceID )
68+ log .Msg ("Database Lab Engine version:" , version .GetVersion ())
69+
70+ if cfg .Server .VerificationToken == "" {
71+ log .Warn ("Verification Token is empty. Database Lab Engine is insecure" )
72+ }
73+
74+ runner := runners .NewLocalRunner (cfg .Provision .UseSudo )
75+
76+ pm := pool .NewPoolManager (& cfg .PoolManager , runner )
77+ if err := pm .ReloadPools (); err != nil {
78+ log .Fatal (err .Error ())
79+ }
80+
81+ internalNetworkID , err := networks .Setup (ctx , dockerCLI , engProps .InstanceID , engProps .ContainerName )
8182 if err != nil {
8283 log .Errf (err .Error ())
8384 return
@@ -152,10 +153,11 @@ func main() {
152153 Restore : retrievalSvc .CollectRestoreTelemetry (),
153154 })
154155
156+ localUI := localui .New (cfg .LocalUI , engProps , runner , dockerCLI )
155157 server := srv .NewServer (& cfg .Server , & cfg .Global , engProps , cloningSvc , retrievalSvc , platformSvc , dockerCLI , obs , est , pm , tm )
156158 shutdownCh := setShutdownListener ()
157159
158- go setReloadListener (ctx , provisionSvc , tm , retrievalSvc , pm , cloningSvc , platformSvc , est , server )
160+ go setReloadListener (ctx , provisionSvc , tm , retrievalSvc , pm , cloningSvc , platformSvc , est , localUI , server )
159161
160162 server .InitHandlers ()
161163
@@ -166,6 +168,17 @@ func main() {
166168 }
167169 }()
168170
171+ if cfg .LocalUI .Enabled {
172+ go func () {
173+ if err := localUI .Run (ctx ); err != nil {
174+ log .Err ("Failed to start local UI container:" , err .Error ())
175+ return
176+ }
177+
178+ log .Msg ("Local UI has started successfully" )
179+ }()
180+ }
181+
169182 <- shutdownCh
170183 cancel ()
171184
@@ -181,7 +194,7 @@ func main() {
181194 tm .SendEvent (ctx , telemetry .EngineStoppedEvent , telemetry.EngineStopped {Uptime : server .Uptime ()})
182195}
183196
184- func getEngineProperties (ctx context.Context , dockerCLI * client.Client , instanceID string ) (global.EngineProps , error ) {
197+ func getEngineProperties (ctx context.Context , dockerCLI * client.Client , cfg * config. Config ) (global.EngineProps , error ) {
185198 hostname := os .Getenv ("HOSTNAME" )
186199 if hostname == "" {
187200 return global.EngineProps {}, errors .New ("hostname is empty" )
@@ -192,16 +205,23 @@ func getEngineProperties(ctx context.Context, dockerCLI *client.Client, instance
192205 return global.EngineProps {}, fmt .Errorf ("failed to inspect DLE container: %w" , err )
193206 }
194207
208+ instanceID , err := config .LoadInstanceID (cfg .PoolManager .MountDir )
209+ if err != nil {
210+ return global.EngineProps {}, fmt .Errorf ("failed to load instance ID: %w" , err )
211+ }
212+
195213 engProps := global.EngineProps {
196214 InstanceID : instanceID ,
197215 ContainerName : strings .Trim (dleContainer .Name , "/" ),
216+ EnginePort : cfg .Server .Port ,
198217 }
199218
200219 return engProps , nil
201220}
202221
203222func reloadConfig (ctx context.Context , provisionSvc * provision.Provisioner , tm * telemetry.Agent , retrievalSvc * retrieval.Retrieval ,
204- pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , server * srv.Server ) error {
223+ pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , localUI * localui.UIManager ,
224+ server * srv.Server ) error {
205225 cfg , err := config .LoadConfiguration ()
206226 if err != nil {
207227 return err
@@ -224,6 +244,10 @@ func reloadConfig(ctx context.Context, provisionSvc *provision.Provisioner, tm *
224244 return err
225245 }
226246
247+ if err := localUI .Reload (ctx , cfg .LocalUI ); err != nil {
248+ return err
249+ }
250+
227251 dbCfg := resources.DB {
228252 Username : cfg .Global .Database .User (),
229253 DBName : cfg .Global .Database .Name (),
@@ -241,14 +265,15 @@ func reloadConfig(ctx context.Context, provisionSvc *provision.Provisioner, tm *
241265}
242266
243267func setReloadListener (ctx context.Context , provisionSvc * provision.Provisioner , tm * telemetry.Agent , retrievalSvc * retrieval.Retrieval ,
244- pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , server * srv.Server ) {
268+ pm * pool.Manager , cloningSvc * cloning.Base , platformSvc * platform.Service , est * estimator.Estimator , localUI * localui.UIManager ,
269+ server * srv.Server ) {
245270 reloadCh := make (chan os.Signal , 1 )
246271 signal .Notify (reloadCh , syscall .SIGHUP )
247272
248273 for range reloadCh {
249274 log .Msg ("Reloading configuration" )
250275
251- if err := reloadConfig (ctx , provisionSvc , tm , retrievalSvc , pm , cloningSvc , platformSvc , est , server ); err != nil {
276+ if err := reloadConfig (ctx , provisionSvc , tm , retrievalSvc , pm , cloningSvc , platformSvc , est , localUI , server ); err != nil {
252277 log .Err ("Failed to reload configuration" , err )
253278 }
254279
@@ -264,13 +289,17 @@ func setShutdownListener() chan os.Signal {
264289}
265290
266291func shutdownDatabaseLabEngine (ctx context.Context , dockerCLI * client.Client , engProps global.EngineProps , fsp * resources.Pool ) {
267- log .Msg ("Stopping control containers" )
292+ log .Msg ("Stopping auxiliary containers" )
268293
269294 if err := cont .StopControlContainers (ctx , dockerCLI , engProps .InstanceID , fsp .DataDir ()); err != nil {
270295 log .Err ("Failed to stop control containers" , err )
271296 }
272297
273- log .Msg ("Control containers have been stopped" )
298+ if err := cont .CleanUpSatelliteContainers (ctx , dockerCLI , engProps .InstanceID ); err != nil {
299+ log .Err ("Failed to stop satellite containers" , err )
300+ }
301+
302+ log .Msg ("Auxiliary containers have been stopped" )
274303}
275304
276305func removeObservingClones (obsCh chan string , obs * observer.Observer ) {
0 commit comments