Added /health endpoint, Docker HEALTHCHECK and improved access log formatting.
authorAdam Dullage <redacted>
Sun, 18 Feb 2024 10:31:54 +0000 (10:31 +0000)
committerAdam Dullage <redacted>
Sun, 18 Feb 2024 10:31:54 +0000 (10:31 +0000)
Dockerfile
server/logger.py
server/main.py

index 0ef0d20d44a9d2aa08eb2bfbe494a8c684be5dea..df9c15f2710f87d1d1b7dbf8eff8b93dafe228d7 100644 (file)
@@ -30,7 +30,9 @@ ENV FLATNOTES_PATH=/data
 RUN mkdir -p ${APP_PATH}
 RUN mkdir -p ${FLATNOTES_PATH}
 
-RUN apt update && apt install -y gosu \
+RUN apt update && apt install -y \
+    curl \
+    gosu \
     && rm -rf /var/lib/apt/lists/*
 
 RUN pip install pipenv
@@ -45,6 +47,7 @@ COPY --from=build ${BUILD_DIR}/client/dist ./client/dist
 
 VOLUME /data
 EXPOSE 8080/tcp
+HEALTHCHECK --interval=60s --timeout=10s CMD curl -f http://localhost:8080/health || exit 1
 
 COPY entrypoint.sh /
 RUN chmod +x /entrypoint.sh
index 7b89d95d9c98e1ae921ee82fd8be65ea98c2ade1..a7bf7fa356c727d68dc813516db9828ea0cc04f9 100644 (file)
@@ -1,9 +1,31 @@
 import logging
 import os
 
-logging.basicConfig(
-    format="%(asctime)s [%(levelname)s]: %(message)s",
-    datefmt="%Y-%m-%d %H:%M:%S",
+formatter = logging.Formatter(
+    "%(asctime)s [%(levelname)s]: %(message)s", "%Y-%m-%d %H:%M:%S"
 )
+log_level = os.environ.get("LOGLEVEL", "INFO").upper()
+
+# Internal
 logger = logging.getLogger()
-logger.setLevel(os.environ.get("LOGLEVEL", "INFO").upper())
+handler = logging.StreamHandler()
+handler.setFormatter(formatter)
+logger.addHandler(handler)
+logger.setLevel(log_level)
+
+
+# Uvicorn
+class HealthEndpointFilter(logging.Filter):
+    def filter(self, record: logging.LogRecord) -> bool:
+        return (
+            record.args
+            and len(record.args) >= 3
+            and record.args[2] != "/health"
+        )
+
+
+uvicorn_logger = logging.getLogger("uvicorn.access")
+uvicorn_logger.addFilter(HealthEndpointFilter())
+for handler in uvicorn_logger.handlers:
+    handler.setFormatter(formatter)
+uvicorn_logger.setLevel(log_level)
index 6c52ebbda8ccdcedaf76a5aa3dc596df12e55929..ce72fb240e4f99f2b6290e0128c4fc3a75f3666c 100644 (file)
@@ -225,6 +225,17 @@ if global_config.auth_type != AuthType.READ_ONLY:
             raise HTTPException(409, api_messages.attachment_exists)
 
 
+# endregion
+
+
+# region Healthcheck
+@app.get("/health")
+def healthcheck() -> str:
+    """A lightweight endpoint that simply returns 'OK' to indicate the server
+    is running."""
+    return "OK"
+
+
 # endregion
 
 app.mount("/", StaticFiles(directory="client/dist"), name="dist")
git clone https://git.99rst.org/PROJECT