Health API endpoint
This commit is contained in:
		
							parent
							
								
									d023a81a32
								
							
						
					
					
						commit
						dd282963c3
					
				
					 3 changed files with 23 additions and 0 deletions
				
			
		|  | @ -4,6 +4,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release | ||||||
| 
 | 
 | ||||||
| ## ntfy server v1.31.0 (UNRELEASED) | ## ntfy server v1.31.0 (UNRELEASED) | ||||||
| 
 | 
 | ||||||
|  | **Features:** | ||||||
|  | 
 | ||||||
|  | * Preliminary `/v1/health` API endpoint for service monitoring (no ticket) | ||||||
|  | 
 | ||||||
| **Documentation:** | **Documentation:** | ||||||
| 
 | 
 | ||||||
| * Add HTTP/2 and TLSv1.3 support to nginx docs ([#553](https://github.com/binwiederhier/ntfy/issues/553), thanks to [bt90](https://github.com/bt90)) | * Add HTTP/2 and TLSv1.3 support to nginx docs ([#553](https://github.com/binwiederhier/ntfy/issues/553), thanks to [bt90](https://github.com/bt90)) | ||||||
|  |  | ||||||
|  | @ -68,6 +68,7 @@ var ( | ||||||
| 	authPathRegex          = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/auth$`) | 	authPathRegex          = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}(,[-_A-Za-z0-9]{1,64})*/auth$`) | ||||||
| 	publishPathRegex       = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}/(publish|send|trigger)$`) | 	publishPathRegex       = regexp.MustCompile(`^/[-_A-Za-z0-9]{1,64}/(publish|send|trigger)$`) | ||||||
| 
 | 
 | ||||||
|  | 	healthPath       = "/v1/health" | ||||||
| 	webConfigPath    = "/config.js" | 	webConfigPath    = "/config.js" | ||||||
| 	userStatsPath    = "/user/stats" | 	userStatsPath    = "/user/stats" | ||||||
| 	matrixPushPath   = "/_matrix/push/v1/notify" | 	matrixPushPath   = "/_matrix/push/v1/notify" | ||||||
|  | @ -296,6 +297,8 @@ func (s *Server) handleInternal(w http.ResponseWriter, r *http.Request, v *visit | ||||||
| 		return s.ensureWebEnabled(s.handleHome)(w, r, v) | 		return s.ensureWebEnabled(s.handleHome)(w, r, v) | ||||||
| 	} else if r.Method == http.MethodHead && r.URL.Path == "/" { | 	} else if r.Method == http.MethodHead && r.URL.Path == "/" { | ||||||
| 		return s.ensureWebEnabled(s.handleEmpty)(w, r, v) | 		return s.ensureWebEnabled(s.handleEmpty)(w, r, v) | ||||||
|  | 	} else if r.Method == http.MethodGet && r.URL.Path == healthPath { | ||||||
|  | 		return s.handleHealth(w, r, v) | ||||||
| 	} else if r.Method == http.MethodGet && r.URL.Path == webConfigPath { | 	} else if r.Method == http.MethodGet && r.URL.Path == webConfigPath { | ||||||
| 		return s.ensureWebEnabled(s.handleWebConfig)(w, r, v) | 		return s.ensureWebEnabled(s.handleWebConfig)(w, r, v) | ||||||
| 	} else if r.Method == http.MethodGet && r.URL.Path == userStatsPath { | 	} else if r.Method == http.MethodGet && r.URL.Path == userStatsPath { | ||||||
|  | @ -366,6 +369,18 @@ func (s *Server) handleTopicAuth(w http.ResponseWriter, _ *http.Request, _ *visi | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (s *Server) handleHealth(w http.ResponseWriter, _ *http.Request, _ *visitor) error { | ||||||
|  | 	response := &apiHealthResponse{ | ||||||
|  | 		Healthy: true, | ||||||
|  | 	} | ||||||
|  | 	w.Header().Set("Content-Type", "text/json") | ||||||
|  | 	w.Header().Set("Access-Control-Allow-Origin", "*") // CORS, allow cross-origin requests | ||||||
|  | 	if err := json.NewEncoder(w).Encode(response); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (s *Server) handleWebConfig(w http.ResponseWriter, _ *http.Request, _ *visitor) error { | func (s *Server) handleWebConfig(w http.ResponseWriter, _ *http.Request, _ *visitor) error { | ||||||
| 	appRoot := "/" | 	appRoot := "/" | ||||||
| 	if !s.config.WebRootIsApp { | 	if !s.config.WebRootIsApp { | ||||||
|  |  | ||||||
|  | @ -213,3 +213,7 @@ func (q *queryFilter) Pass(msg *message) bool { | ||||||
| 	} | 	} | ||||||
| 	return true | 	return true | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type apiHealthResponse struct { | ||||||
|  | 	Healthy bool `json:"healthy"` | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue