From 41d0d2eb46f53722af3f521f322e4d60caaf1b82 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Mon, 25 Mar 2024 15:30:27 +0000 Subject: [PATCH 01/10] more dir creating up in dockerfile + add redis password --- backend/config/__init__.py | 1 + backend/handler/redis_handler.py | 7 ++++--- docker/Dockerfile | 16 +++++++--------- unraid_template/romm.xml | 3 +++ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/backend/config/__init__.py b/backend/config/__init__.py index a703f8fed..e1a92eec6 100644 --- a/backend/config/__init__.py +++ b/backend/config/__init__.py @@ -28,6 +28,7 @@ DB_NAME: Final = os.environ.get("DB_NAME", "romm") # REDIS REDIS_HOST: Final = os.environ.get("REDIS_HOST", "127.0.0.1") REDIS_PORT: Final = os.environ.get("REDIS_PORT", 6379) +REDIS_PASSWORD: Final = os.environ.get("REDIS_PASSWORD") # IGDB IGDB_CLIENT_ID: Final = os.environ.get( diff --git a/backend/handler/redis_handler.py b/backend/handler/redis_handler.py index 1a5250cde..8d780fb6a 100644 --- a/backend/handler/redis_handler.py +++ b/backend/handler/redis_handler.py @@ -1,7 +1,7 @@ import sys from enum import Enum -from config import REDIS_HOST, REDIS_PORT +from config import REDIS_HOST, REDIS_PORT, REDIS_PASSWORD from logger.logger import log from redis import Redis from rq import Queue @@ -39,8 +39,8 @@ class FallbackCache: return repr(self) -redis_client = Redis(host=REDIS_HOST, port=REDIS_PORT, db=0) -redis_url = f"redis://{REDIS_HOST}:{REDIS_PORT}" +redis_client = Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=0) +redis_url = f"redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}" if REDIS_PASSWORD else f"redis://{REDIS_HOST}:{REDIS_PORT}" high_prio_queue = Queue(name=QueuePrio.HIGH.value, connection=redis_client) default_queue = Queue(name=QueuePrio.DEFAULT.value, connection=redis_client) @@ -54,6 +54,7 @@ else: cache = Redis( host=REDIS_HOST, port=REDIS_PORT, + password=REDIS_PASSWORD, db=0, decode_responses=True, ) diff --git a/docker/Dockerfile b/docker/Dockerfile index 954f15dcb..c907541ab 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -150,22 +150,20 @@ RUN rm -r \ /docker-entrypoint.sh \ /docker-entrypoint.d -# Move everything we prepared over to our final docker image -FROM scratch -COPY --from=production-stage / / - # User permissions RUN addgroup -g 1000 -S romm && adduser -u 1000 -D -S -G romm romm # Create the directories and set ownership and permissions RUN mkdir /romm /redis-data && \ - chown romm:romm /romm /redis-data && \ - chmod 777 /romm /redis-data + chown romm:romm /romm /redis-data /backend/handler/fixtures && \ + chmod -R 755 /romm /redis-data /backend/handler/fixtures -VOLUME /redis-data +# Move everything we prepared over to our final docker image +FROM scratch +COPY --from=production-stage / / -# Set user to run as -USER romm +# Declare the supported volumes +VOLUME ["/romm/resources", "/romm/library", "/romm/assets", "/romm/logs", "/romm/config", "/redis-data"] # Expose ports and start EXPOSE 8080 diff --git a/unraid_template/romm.xml b/unraid_template/romm.xml index f41d06ce5..a5d4d15c8 100644 --- a/unraid_template/romm.xml +++ b/unraid_template/romm.xml @@ -38,6 +38,9 @@ + + + From 8f5536c69b1b760b61aebbb6b2a03d56ddbdfce6 Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 21:50:41 +0100 Subject: [PATCH 02/10] switch to gunicorn for handling backend app --- docker/init_scripts/init | 11 ++- docker/nginx/default.conf | 10 +-- poetry.lock | 151 +++++++++++++++++++++----------------- pyproject.toml | 3 +- 4 files changed, 102 insertions(+), 73 deletions(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 177103e57..619ec778b 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -45,6 +45,15 @@ start_bin_uvicorn () { echo $UVICORN_PID > /tmp/uvicorn.pid } +# function that runs or main process and creates a corresponding PID file, +start_bin_gunicorn () { + # cleanup potentially leftover socket + rm /tmp/gunicorn.sock -f + # Commands to start our main application and store its PID to check for crashes + info_log "starting gunicorn" + gunicorn main:app --bind=0.0.0.0:5000 --bind=unix:/tmp/gunicorn.sock --pid=/tmp/gunicorn.pid --workers 2 & +} + # Commands to start nginx (handling PID creation internally) start_bin_nginx () { info_log "starting nginx" @@ -129,7 +138,7 @@ while true; do watchdog_process_pid bin nginx # Start uvicorn if we dont have a corresponding PID file - watchdog_process_pid bin uvicorn + watchdog_process_pid bin gunicorn # only start the watcher.py if we actually want to use the rescan on fs change feature if [[ ${ENABLE_RESCAN_ON_FILESYSTEM_CHANGE} == "true" ]]; then diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf index 8daa911c3..8c3048407 100644 --- a/docker/nginx/default.conf +++ b/docker/nginx/default.conf @@ -45,8 +45,8 @@ http { # include /etc/nginx/conf.d/*.conf; # include /etc/nginx/sites-enabled/*; - upstream uvicorn { - server unix:/tmp/uvicorn.sock; + upstream wsgi_server { + server unix:/tmp/gunicorn.sock; } server { @@ -74,16 +74,16 @@ http { # OpenAPI for swagger and redoc location /openapi.json { - proxy_pass http://uvicorn; + proxy_pass http://wsgi_server; } # Backend api calls location /api { rewrite /api/(.*) /$1 break; - proxy_pass http://uvicorn; + proxy_pass http://wsgi_server; } location /ws { - proxy_pass http://uvicorn; + proxy_pass http://wsgi_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; diff --git a/poetry.lock b/poetry.lock index cd9daf09f..5a812b8f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.0.dev0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aioredis" @@ -489,13 +489,13 @@ all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" [[package]] name = "fastapi-pagination" -version = "0.12.19" +version = "0.12.21" description = "FastAPI pagination" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "fastapi_pagination-0.12.19-py3-none-any.whl", hash = "sha256:67838b21e2f62fae739117d130f8153a362d1fc266c2d738543e71d446618635"}, - {file = "fastapi_pagination-0.12.19.tar.gz", hash = "sha256:d947d0c91589dc2fc99a15409707eb24272970a044489d21363641af03516fd7"}, + {file = "fastapi_pagination-0.12.21-py3-none-any.whl", hash = "sha256:5715b3dec31f9f9a0df6e08a53d7efe8c185d1fc8b392438d60e15349d7478d1"}, + {file = "fastapi_pagination-0.12.21.tar.gz", hash = "sha256:ba0bd1023ae37cb32946e91b1356f2454809e15393911d68e318f5c7aa6887c4"}, ] [package.dependencies] @@ -605,6 +605,26 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "gunicorn" +version = "21.2.0" +description = "WSGI HTTP Server for UNIX" +optional = false +python-versions = ">=3.5" +files = [ + {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, + {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + [[package]] name = "h11" version = "0.14.0" @@ -1515,13 +1535,13 @@ testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygm [[package]] name = "pytest-asyncio" -version = "0.23.5.post1" +version = "0.23.6" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-asyncio-0.23.5.post1.tar.gz", hash = "sha256:b9a8806bea78c21276bc34321bbf234ba1b2ea5b30d9f0ce0f2dea45e4685813"}, - {file = "pytest_asyncio-0.23.5.post1-py3-none-any.whl", hash = "sha256:30f54d27774e79ac409778889880242b0403d09cabd65b727ce90fe92dd5d80e"}, + {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, + {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, ] [package.dependencies] @@ -1550,17 +1570,17 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "pytest-mock (>=3.12)"] [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -1708,7 +1728,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -1886,60 +1905,60 @@ typing_extensions = ">=4,<5" [[package]] name = "sqlalchemy" -version = "2.0.28" +version = "2.0.29" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, - {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, - {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, - {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, - {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, - {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, - {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, - {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, - {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, + {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, + {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, + {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, + {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, + {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, + {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, + {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, + {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, ] [package.dependencies] @@ -2187,13 +2206,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.28.0" +version = "0.29.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.28.0-py3-none-any.whl", hash = "sha256:6623abbbe6176204a4226e67607b4d52cc60ff62cda0ff177613645cefa2ece1"}, - {file = "uvicorn-0.28.0.tar.gz", hash = "sha256:cab4473b5d1eaeb5a0f6375ac4bc85007ffc75c3cc1768816d9e5d589857b067"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [package.dependencies] @@ -2562,4 +2581,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "8d975475427ba194f31c84eb3d428a562771b94e2b97d79fe9a9abb50e149b14" +content-hash = "dd136e19589c65c352565a9fcbf67e338a6415ff36f874e765eec19b53ee883d" diff --git a/pyproject.toml b/pyproject.toml index 6543a3d5b..46a52f143 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,8 @@ authors = [ python = "^3.11" requests = "2.31.0" fastapi = "0.110.0" -uvicorn = "0.28.0" +uvicorn = "0.29.0" +gunicorn = "21.2.0" websockets = "12.0" python-socketio = "5.11.1" SQLAlchemy = {extras = ["mypy"], version = "^2.0.28"} From dd428e0af96da36d33b46e7c8ce60c95ce66444c Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 21:56:28 +0100 Subject: [PATCH 03/10] switch to gunicorn for handling backend app --- docker/init_scripts/init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 619ec778b..89af81709 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -51,7 +51,7 @@ start_bin_gunicorn () { rm /tmp/gunicorn.sock -f # Commands to start our main application and store its PID to check for crashes info_log "starting gunicorn" - gunicorn main:app --bind=0.0.0.0:5000 --bind=unix:/tmp/gunicorn.sock --pid=/tmp/gunicorn.pid --workers 2 & + gunicorn --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:5000 --bind=unix:/tmp/gunicorn.sock --pid=/tmp/gunicorn.pid --workers 2 main:app & } # Commands to start nginx (handling PID creation internally) From 22f8b6115ed1dc0378727ae5258d5bfaa3f09dcc Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 22:00:49 +0100 Subject: [PATCH 04/10] remove uvicorn function from init --- docker/init_scripts/init | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 89af81709..07708cbbd 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -33,18 +33,6 @@ error_log () { exit 1 } -# function that runs or main process and creates a corresponding PID file, -# sadly uvicorn can not do that itself -start_bin_uvicorn () { - # cleanup potentially leftover socket - rm /tmp/uvicorn.sock -f - # Commands to start our main application and store its PID to check for crashes - info_log "starting uvicorn" - uvicorn main:app --proxy-headers --host 0.0.0.0 --port 5000 --uds /tmp/uvicorn.sock --workers 2 & - UVICORN_PID=$! - echo $UVICORN_PID > /tmp/uvicorn.pid -} - # function that runs or main process and creates a corresponding PID file, start_bin_gunicorn () { # cleanup potentially leftover socket From de6838df8519d354bb2457c841934686c6f5e132 Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 22:20:25 +0100 Subject: [PATCH 05/10] make gunicorn log access and error logs to stdout --- docker/init_scripts/init | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 07708cbbd..40d4dc94e 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -39,7 +39,15 @@ start_bin_gunicorn () { rm /tmp/gunicorn.sock -f # Commands to start our main application and store its PID to check for crashes info_log "starting gunicorn" - gunicorn --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:5000 --bind=unix:/tmp/gunicorn.sock --pid=/tmp/gunicorn.pid --workers 2 main:app & + gunicorn \ + --access-logfile - \ + --error-logfile - \ + --worker-class uvicorn.workers.UvicornWorker \ + --bind=0.0.0.0:5000 \ + --bind=unix:/tmp/gunicorn.sock \ + --pid=/tmp/gunicorn.pid \ + --workers 2 \ + main:app & } # Commands to start nginx (handling PID creation internally) From 369ab477368f5692f4ee3bcf59506070c719ec51 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Mon, 25 Mar 2024 17:30:38 -0400 Subject: [PATCH 06/10] get rid of logs volume --- backend/logger/file_formatter.py | 23 ----------------------- backend/logger/logger.py | 17 ----------------- docker/Dockerfile | 2 +- examples/docker-compose.example.yml | 1 - unraid_template/romm.xml | 1 - 5 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 backend/logger/file_formatter.py diff --git a/backend/logger/file_formatter.py b/backend/logger/file_formatter.py deleted file mode 100644 index b550e3b1d..000000000 --- a/backend/logger/file_formatter.py +++ /dev/null @@ -1,23 +0,0 @@ -import logging - - -class FileFormatter(logging.Formatter): - level: str = "%(levelname)s" - dots: str = ":" - identifier: str = "\t [RomM]" - identifier_warning: str = " [RomM]" - identifier_critical: str = " [RomM]" - msg: str = "%(message)s" - date: str = "[%(asctime)s] " - FORMATS: dict = { - logging.DEBUG: level + dots + identifier + date + msg, - logging.INFO: level + dots + identifier + date + msg, - logging.WARNING: level + dots + identifier_warning + date + msg, - logging.ERROR: level + dots + identifier + date + msg, - logging.CRITICAL: level + dots + identifier_critical + date + msg - } - - def format(self, record): - log_fmt = self.FORMATS.get(record.levelno) - formatter = logging.Formatter(fmt=log_fmt, datefmt='%Y-%m-%d %H:%M:%S') - return formatter.format(record) \ No newline at end of file diff --git a/backend/logger/logger.py b/backend/logger/logger.py index 69affbee3..a2d6fcb64 100644 --- a/backend/logger/logger.py +++ b/backend/logger/logger.py @@ -1,20 +1,8 @@ import logging import sys -from datetime import datetime -from pathlib import Path -from typing import Final -from config import ROMM_BASE_PATH -from logger.file_formatter import FileFormatter from logger.stdout_formatter import StdoutFormatter -LOGS_BASE_PATH: Final = f"{ROMM_BASE_PATH}/logs" - -# Create logs folder if not exists -Path(LOGS_BASE_PATH).mkdir(parents=True, exist_ok=True) -now = datetime.now() -logs_file = f"{LOGS_BASE_PATH}/{now.strftime('%Y%m%d_%H%M%S')}.log" - # Get logger log = logging.getLogger("romm") log.setLevel(logging.DEBUG) @@ -24,10 +12,5 @@ stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.setFormatter(StdoutFormatter()) log.addHandler(stdout_handler) -# Define file handler -file_handler = logging.FileHandler(logs_file) -file_handler.setFormatter(FileFormatter()) -log.addHandler(file_handler) - # Hush passlib warnings logging.getLogger("passlib").setLevel(logging.ERROR) diff --git a/docker/Dockerfile b/docker/Dockerfile index c907541ab..a8e1b1942 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -163,7 +163,7 @@ FROM scratch COPY --from=production-stage / / # Declare the supported volumes -VOLUME ["/romm/resources", "/romm/library", "/romm/assets", "/romm/logs", "/romm/config", "/redis-data"] +VOLUME ["/romm/resources", "/romm/library", "/romm/assets", "/romm/config", "/redis-data"] # Expose ports and start EXPOSE 8080 diff --git a/examples/docker-compose.example.yml b/examples/docker-compose.example.yml index f51e4cc0a..49e49b499 100644 --- a/examples/docker-compose.example.yml +++ b/examples/docker-compose.example.yml @@ -26,7 +26,6 @@ services: - /path/to/library:/romm/library # Your game library - /path/to/assets:/romm/assets # Uploaded saves, states, etc. - /path/to/config:/romm/config # [Optional] Path where config.yml is stored - - /path/to/logs:/romm/logs # [Optional] Path where logs are stored ports: - 80:8080 depends_on: diff --git a/unraid_template/romm.xml b/unraid_template/romm.xml index a5d4d15c8..9ad97df4b 100644 --- a/unraid_template/romm.xml +++ b/unraid_template/romm.xml @@ -30,7 +30,6 @@ /mnt/user/appdata/romm/resources /mnt/user/appdata/romm/assets - /mnt/user/appdata/romm/logs From a06ccb53249ccd4df445691b29c7e9cbcc809f41 Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 22:52:10 +0100 Subject: [PATCH 07/10] move sleep to the beginning of our while true loop to save innocent CPUs from overheating in case of errornous behaviour --- docker/init_scripts/init | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 40d4dc94e..34d85ac68 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -111,6 +111,9 @@ cd /backend || { error_log "/backend directory doesn't seem to exist"; } # function definition done, lets start our main loop while true; do + # check for died processes every 5 seconds + sleep 5 + # Start redis server if we dont have a corresponding PID file # and REDIS_HOST is not set (which would mean we're using an external redis) if [[ -z "${REDIS_HOST:=""}" ]]; then @@ -148,7 +151,4 @@ while true; do watchdog_process_pid python worker # Start scheduler if we dont have a corresponding PID file watchdog_process_pid python scheduler - - # check for died processes every 5 seconds - sleep 5 done From 680f2b239d9c334edf47d249782389c1eaee4b23 Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 23:02:36 +0100 Subject: [PATCH 08/10] add a log line to ask for patience --- docker/init_scripts/init | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 34d85ac68..bb2788336 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -111,6 +111,7 @@ cd /backend || { error_log "/backend directory doesn't seem to exist"; } # function definition done, lets start our main loop while true; do + info_log "Starting UP... Please be patient" # check for died processes every 5 seconds sleep 5 From 072acb9feceb8d3ce8fd0e22d814104c5654462c Mon Sep 17 00:00:00 2001 From: Psych0D0g Date: Mon, 25 Mar 2024 23:03:23 +0100 Subject: [PATCH 09/10] only print patience log one --- docker/init_scripts/init | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index bb2788336..7c9f0e1b1 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -109,9 +109,10 @@ watchdog_process_pid () { # switch to backend directory cd /backend || { error_log "/backend directory doesn't seem to exist"; } +info_log "Starting UP... Please be patient" + # function definition done, lets start our main loop while true; do - info_log "Starting UP... Please be patient" # check for died processes every 5 seconds sleep 5 From 4863b80eb3c4c4014ac3a57f21038c43c2072875 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Mon, 25 Mar 2024 22:08:32 +0000 Subject: [PATCH 10/10] tweak startup text --- docker/init_scripts/init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/init_scripts/init b/docker/init_scripts/init index 7c9f0e1b1..ff0a3be14 100755 --- a/docker/init_scripts/init +++ b/docker/init_scripts/init @@ -109,7 +109,7 @@ watchdog_process_pid () { # switch to backend directory cd /backend || { error_log "/backend directory doesn't seem to exist"; } -info_log "Starting UP... Please be patient" +info_log "Starting up, please wait..." # function definition done, lets start our main loop while true; do