mirror of
https://github.com/netinvent/npbackup.git
synced 2025-09-11 07:25:47 +08:00
Make upgrade server production ready with gunicorn support
This commit is contained in:
parent
e65b10ab77
commit
79b69d3ea6
2 changed files with 74 additions and 39 deletions
|
@ -1,5 +1,6 @@
|
|||
fastapi
|
||||
fastapi-offline>=1.5.0
|
||||
#uvicorn
|
||||
uvicorn[standard]
|
||||
gunicorn
|
||||
pydantic
|
||||
ruamel.yaml
|
|
@ -7,53 +7,87 @@ __intname__ = "npbackup.upgrade_server.upgrade_server"
|
|||
__author__ = "Orsiris de Jong"
|
||||
__copyright__ = "Copyright (C) 2023 NetInvent"
|
||||
__license__ = "GPL-3.0-only"
|
||||
__build__ = "2023020301"
|
||||
__version__ = "1.2.0"
|
||||
__build__ = "2023020501"
|
||||
__version__ = "1.3.0"
|
||||
|
||||
|
||||
DEVEL = True
|
||||
|
||||
import sys
|
||||
import os
|
||||
import multiprocessing
|
||||
from argparse import ArgumentParser
|
||||
from upgrade_server import configuration
|
||||
import upgrade_server.api
|
||||
from ofunctions.logger_utils import logger_get_logger
|
||||
|
||||
|
||||
config_dict = configuration.load_config()
|
||||
try:
|
||||
listen = config_dict["http_server"]["listen"]
|
||||
except KeyError:
|
||||
listen = None
|
||||
try:
|
||||
port = config_dict["http_server"]["port"]
|
||||
except KeyError:
|
||||
listen = None
|
||||
|
||||
if DEVEL:
|
||||
import uvicorn as server
|
||||
|
||||
server_args = {
|
||||
"workers": 1,
|
||||
"log_level": "debug",
|
||||
"reload": True,
|
||||
"host": listen if listen else "0.0.0.0",
|
||||
"port": port if port else 8080,
|
||||
}
|
||||
else:
|
||||
import gunicorn as server
|
||||
|
||||
server_args = {
|
||||
"workers": 8,
|
||||
"reload": False,
|
||||
"host": listen if listen else "0.0.0.0",
|
||||
"port": port if port else 8080,
|
||||
}
|
||||
|
||||
logger = logger_get_logger()
|
||||
|
||||
if __name__ == "__main__":
|
||||
if __name__ == '__main__':
|
||||
config_dict = configuration.load_config()
|
||||
try:
|
||||
server.run("upgrade_server.api:app", **server_args)
|
||||
listen = config_dict["http_server"]["listen"]
|
||||
except KeyError:
|
||||
listen = None
|
||||
try:
|
||||
port = config_dict["http_server"]["port"]
|
||||
except KeyError:
|
||||
listen = None
|
||||
|
||||
|
||||
_DEV = os.environ.get("_DEV", False)
|
||||
|
||||
|
||||
parser = ArgumentParser(
|
||||
prog="{} {} - {}".format(__intname__, __copyright__, __license__),
|
||||
description="""NPBackup Upgrade server""",
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--dev", action="store_true", help="Run with uvicorn"
|
||||
)
|
||||
|
||||
if _DEV:
|
||||
import uvicorn
|
||||
server_args = {
|
||||
"workers": 1,
|
||||
"log_level": "debug",
|
||||
"reload": True,
|
||||
"host": listen if listen else "0.0.0.0",
|
||||
"port": port if port else 8080,
|
||||
}
|
||||
else:
|
||||
import gunicorn.app.base
|
||||
|
||||
class StandaloneApplication(gunicorn.app.base.BaseApplication):
|
||||
"""
|
||||
This class supersedes gunicorn's class in order to load config before launching the app
|
||||
"""
|
||||
def __init__(self, app, options=None):
|
||||
self.options = options or {}
|
||||
self.application = app
|
||||
super().__init__()
|
||||
|
||||
def load_config(self):
|
||||
config = {key: value for key, value in self.options.items()
|
||||
if key in self.cfg.settings and value is not None}
|
||||
for key, value in config.items():
|
||||
self.cfg.set(key.lower(), value)
|
||||
|
||||
def load(self):
|
||||
return self.application
|
||||
|
||||
server_args = {
|
||||
"workers": (multiprocessing.cpu_count() * 2) + 1,
|
||||
"bind": f'{listen}:{port}' if listen else "0.0.0.0:8080",
|
||||
"worker_class": "uvicorn.workers.UvicornWorker"
|
||||
}
|
||||
|
||||
|
||||
logger = logger_get_logger()
|
||||
|
||||
try:
|
||||
if _DEV:
|
||||
uvicorn.run("upgrade_server.api:app", **server_args)
|
||||
else:
|
||||
StandaloneApplication(upgrade_server.api.app, server_args).run()
|
||||
except KeyboardInterrupt as exc:
|
||||
logger.error("Program interrupted by keyoard: {}".format(exc))
|
||||
sys.exit(200)
|
||||
|
|
Loading…
Add table
Reference in a new issue