main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "os"
  7. "os/signal"
  8. "runtime"
  9. "syscall"
  10. "time"
  11. )
  12. const version = "2.17.0"
  13. type ctxKey string
  14. func initialize() error {
  15. log.SetOutput(os.Stdout)
  16. if err := initLog(); err != nil {
  17. return err
  18. }
  19. if err := configure(); err != nil {
  20. return err
  21. }
  22. if err := initNewrelic(); err != nil {
  23. return err
  24. }
  25. initPrometheus()
  26. if err := initDownloading(); err != nil {
  27. return err
  28. }
  29. initErrorsReporting()
  30. if err := initVips(); err != nil {
  31. return err
  32. }
  33. if err := checkPresets(conf.Presets); err != nil {
  34. shutdownVips()
  35. return err
  36. }
  37. return nil
  38. }
  39. func run() error {
  40. if err := initialize(); err != nil {
  41. return err
  42. }
  43. defer shutdownVips()
  44. defer closeErrorsReporting()
  45. go func() {
  46. var logMemStats = len(os.Getenv("IMGPROXY_LOG_MEM_STATS")) > 0
  47. for range time.Tick(time.Duration(conf.FreeMemoryInterval) * time.Second) {
  48. freeMemory()
  49. if logMemStats {
  50. var m runtime.MemStats
  51. runtime.ReadMemStats(&m)
  52. logDebug("MEMORY USAGE: Sys=%d HeapIdle=%d HeapInuse=%d", m.Sys/1024/1024, m.HeapIdle/1024/1024, m.HeapInuse/1024/1024)
  53. }
  54. }
  55. }()
  56. ctx, cancel := context.WithCancel(context.Background())
  57. if prometheusEnabled {
  58. if err := startPrometheusServer(cancel); err != nil {
  59. return err
  60. }
  61. }
  62. s, err := startServer(cancel)
  63. if err != nil {
  64. return err
  65. }
  66. defer shutdownServer(s)
  67. stop := make(chan os.Signal, 1)
  68. signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
  69. select {
  70. case <-ctx.Done():
  71. case <-stop:
  72. }
  73. return nil
  74. }
  75. func main() {
  76. if len(os.Args) > 1 {
  77. switch os.Args[1] {
  78. case "health":
  79. os.Exit(healthcheck())
  80. case "version":
  81. fmt.Println(version)
  82. os.Exit(0)
  83. }
  84. }
  85. if err := run(); err != nil {
  86. logFatal(err.Error())
  87. }
  88. }