server.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2018 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package daemon // import "miniflux.app/daemon"
  5. import (
  6. "crypto/tls"
  7. "net/http"
  8. "time"
  9. "miniflux.app/config"
  10. "miniflux.app/logger"
  11. "miniflux.app/reader/feed"
  12. "miniflux.app/scheduler"
  13. "miniflux.app/storage"
  14. "golang.org/x/crypto/acme/autocert"
  15. )
  16. func newServer(cfg *config.Config, store *storage.Storage, pool *scheduler.WorkerPool, feedHandler *feed.Handler) *http.Server {
  17. certFile := cfg.CertFile()
  18. keyFile := cfg.KeyFile()
  19. certDomain := cfg.CertDomain()
  20. certCache := cfg.CertCache()
  21. server := &http.Server{
  22. ReadTimeout: 30 * time.Second,
  23. WriteTimeout: 30 * time.Second,
  24. IdleTimeout: 60 * time.Second,
  25. Addr: cfg.ListenAddr(),
  26. Handler: routes(cfg, store, feedHandler, pool),
  27. }
  28. if certDomain != "" && certCache != "" {
  29. cfg.IsHTTPS = true
  30. server.Addr = ":https"
  31. certManager := autocert.Manager{
  32. Cache: autocert.DirCache(certCache),
  33. Prompt: autocert.AcceptTOS,
  34. HostPolicy: autocert.HostWhitelist(certDomain),
  35. }
  36. // Handle http-01 challenge.
  37. s := &http.Server{
  38. Handler: certManager.HTTPHandler(nil),
  39. Addr: ":http",
  40. }
  41. go s.ListenAndServe()
  42. go func() {
  43. logger.Info(`Listening on "%s" by using auto-configured certificate for "%s"`, server.Addr, certDomain)
  44. if err := server.Serve(certManager.Listener()); err != http.ErrServerClosed {
  45. logger.Fatal(`Server failed to start: %v`, err)
  46. }
  47. }()
  48. } else if certFile != "" && keyFile != "" {
  49. cfg.IsHTTPS = true
  50. // See https://blog.cloudflare.com/exposing-go-on-the-internet/
  51. // And https://wiki.mozilla.org/Security/Server_Side_TLS
  52. server.TLSConfig = &tls.Config{
  53. MinVersion: tls.VersionTLS12,
  54. PreferServerCipherSuites: true,
  55. CurvePreferences: []tls.CurveID{
  56. tls.CurveP256,
  57. tls.X25519,
  58. },
  59. CipherSuites: []uint16{
  60. tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  61. tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  62. tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  63. tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  64. tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  65. tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  66. },
  67. }
  68. go func() {
  69. logger.Info(`Listening on "%s" by using certificate "%s" and key "%s"`, server.Addr, certFile, keyFile)
  70. if err := server.ListenAndServeTLS(certFile, keyFile); err != http.ErrServerClosed {
  71. logger.Fatal(`Server failed to start: %v`, err)
  72. }
  73. }()
  74. } else {
  75. go func() {
  76. logger.Info(`Listening on "%s" without TLS`, server.Addr)
  77. if err := server.ListenAndServe(); err != http.ErrServerClosed {
  78. logger.Fatal(`Server failed to start: %v`, err)
  79. }
  80. }()
  81. }
  82. return server
  83. }