main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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.16.1"
  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. go func() {
  45. var logMemStats = len(os.Getenv("IMGPROXY_LOG_MEM_STATS")) > 0
  46. for range time.Tick(time.Duration(conf.FreeMemoryInterval) * time.Second) {
  47. freeMemory()
  48. if logMemStats {
  49. var m runtime.MemStats
  50. runtime.ReadMemStats(&m)
  51. logDebug("MEMORY USAGE: Sys=%d HeapIdle=%d HeapInuse=%d", m.Sys/1024/1024, m.HeapIdle/1024/1024, m.HeapInuse/1024/1024)
  52. }
  53. }
  54. }()
  55. ctx, cancel := context.WithCancel(context.Background())
  56. if prometheusEnabled {
  57. if err := startPrometheusServer(cancel); err != nil {
  58. return err
  59. }
  60. }
  61. s, err := startServer(cancel)
  62. if err != nil {
  63. return err
  64. }
  65. defer shutdownServer(s)
  66. stop := make(chan os.Signal, 1)
  67. signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
  68. select {
  69. case <-ctx.Done():
  70. case <-stop:
  71. }
  72. return nil
  73. }
  74. func main() {
  75. if len(os.Args) > 1 {
  76. switch os.Args[1] {
  77. case "health":
  78. os.Exit(healthcheck())
  79. case "version":
  80. fmt.Println(version)
  81. os.Exit(0)
  82. }
  83. }
  84. if err := run(); err != nil {
  85. logFatal(err.Error())
  86. }
  87. }