1
0

init.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // init_once.go contains global initialization/teardown functions that should be called exactly once
  2. // per process.
  3. package imgproxy
  4. import (
  5. "context"
  6. "fmt"
  7. "log/slog"
  8. "go.uber.org/automaxprocs/maxprocs"
  9. "github.com/imgproxy/imgproxy/v3/config"
  10. "github.com/imgproxy/imgproxy/v3/env"
  11. "github.com/imgproxy/imgproxy/v3/logger"
  12. "github.com/imgproxy/imgproxy/v3/vips"
  13. )
  14. // Init performs the global resources initialization. This should be done once per process.
  15. func Init() error {
  16. if err := env.Load(context.TODO()); err != nil {
  17. return err
  18. }
  19. logCfg, logErr := logger.LoadConfigFromEnv(nil)
  20. if logErr != nil {
  21. return logErr
  22. }
  23. // Initialize logger as early as possible to log further initialization steps
  24. if err := logger.Init(logCfg); err != nil {
  25. return err
  26. }
  27. // NOTE: This is temporary workaround. We have to load env vars in config.go before
  28. // actually configuring ImgProxy instance because for now we use it as a source of truth.
  29. // Will be removed once we move env var loading to imgproxy.go
  30. if err := config.Configure(); err != nil {
  31. // we moved validations to specific config files, hence, no need to return err
  32. slog.Warn("old config validation warning", "err", err)
  33. }
  34. // NOTE: End of temporary workaround.
  35. maxprocs.Set(maxprocs.Logger(func(msg string, args ...any) {
  36. slog.Debug(fmt.Sprintf(msg, args...))
  37. }))
  38. vipsCfg, err := vips.LoadConfigFromEnv(nil)
  39. if err != nil {
  40. return err
  41. }
  42. if vipsErr := vips.Init(vipsCfg); vipsErr != nil {
  43. return vipsErr
  44. }
  45. return nil
  46. }
  47. // Shutdown performs global cleanup
  48. func Shutdown() {
  49. vips.Shutdown()
  50. }