init.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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/errorreport"
  12. "github.com/imgproxy/imgproxy/v3/logger"
  13. "github.com/imgproxy/imgproxy/v3/monitoring"
  14. "github.com/imgproxy/imgproxy/v3/vips"
  15. )
  16. // Init performs the global resources initialization. This should be done once per process.
  17. func Init() error {
  18. if err := env.Load(context.TODO()); err != nil {
  19. return err
  20. }
  21. logCfg, logErr := logger.LoadConfigFromEnv(nil)
  22. if logErr != nil {
  23. return logErr
  24. }
  25. // Initialize logger as early as possible to log further initialization steps
  26. if err := logger.Init(logCfg); err != nil {
  27. return err
  28. }
  29. // NOTE: This is temporary workaround. We have to load env vars in config.go before
  30. // actually configuring ImgProxy instance because for now we use it as a source of truth.
  31. // Will be removed once we move env var loading to imgproxy.go
  32. if err := config.Configure(); err != nil {
  33. // we moved validations to specific config files, hence, no need to return err
  34. slog.Warn("old config validation warning", "err", err)
  35. }
  36. // NOTE: End of temporary workaround.
  37. maxprocs.Set(maxprocs.Logger(func(msg string, args ...any) {
  38. slog.Debug(fmt.Sprintf(msg, args...))
  39. }))
  40. if err := monitoring.Init(); err != nil {
  41. return err
  42. }
  43. vipsCfg, err := vips.LoadConfigFromEnv(nil)
  44. if err != nil {
  45. return err
  46. }
  47. if vipsErr := vips.Init(vipsCfg); vipsErr != nil {
  48. return vipsErr
  49. }
  50. errCfg, errErr := errorreport.LoadConfigFromEnv(nil)
  51. if errErr != nil {
  52. return errErr
  53. }
  54. if err := errorreport.Init(errCfg); err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. // Shutdown performs global cleanup
  60. func Shutdown() {
  61. monitoring.Stop()
  62. vips.Shutdown()
  63. errorreport.Close()
  64. }