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
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
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)
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")