From 7419c1c86962f23f223653a946a90fad3503a82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Sat, 19 Jan 2019 17:13:36 +0800 Subject: [PATCH] Rewrite service files for uwsgi & systemctl --- botan-start.py | 57 ----------------------------------- botanjs/compressor/closure.py | 0 botanjs/compressor/yui.py | 0 botanjs/config.py | 0 botanjs/service/webapi.py | 9 ++---- main.py | 22 ++++++++++++++ setup/celery.conf | 15 +++++++++ setup/compiler-tasks.service | 19 ++++++++++++ setup/config | 13 ++++++++ setup/install | 21 +++++++++++++ 10 files changed, 93 insertions(+), 63 deletions(-) delete mode 100755 botan-start.py mode change 100755 => 100644 botanjs/compressor/closure.py mode change 100755 => 100644 botanjs/compressor/yui.py mode change 100755 => 100644 botanjs/config.py mode change 100755 => 100644 botanjs/service/webapi.py create mode 100644 main.py create mode 100644 setup/celery.conf create mode 100644 setup/compiler-tasks.service create mode 100755 setup/config create mode 100755 setup/install diff --git a/botan-start.py b/botan-start.py deleted file mode 100755 index e36bf7b..0000000 --- a/botan-start.py +++ /dev/null @@ -1,57 +0,0 @@ -#!env/bin/python - -import os, sys -from botanjs.config import Config as config, DEBUG -from subprocess import Popen -from botanjs.service.webapi import WebAPI - -SiteRoot = os.path.abspath( "." ) - -# Setting the SiteRoot for config -config["Paths"]["SiteRoot"] = SiteRoot; - -# Create the lock folder for celery -lockDir = os.path.join( SiteRoot, "env", "var", "run", "celery" ) - -os.makedirs( lockDir, exist_ok=True ) - -sys.path.append( os.path.abspath( "." ) ) - -RUNTIME_ENV = os.path.abspath( os.path.join( "env", "bin" ) ) -if RUNTIME_ENV not in os.environ[ "PATH" ]: - os.environ[ "PATH" ] = RUNTIME_ENV + os.pathsep + os.environ[ "PATH" ] - -if __name__ == "__main__": - - jwork = "botanjs.service.jwork" - nodeName = "botanNode1" - - celOut = open( os.path.join( config["Paths"]["Log"], jwork + "-err.log" ), "a+" ) - cel = Popen( - [ - "celery", "multi", "restart", nodeName - , "-A", jwork, "worker" - , "--pidfile=" + os.path.join( lockDir, jwork + ".pid" ) - , "--logfile=" + os.path.join( config["Paths"]["Log"], jwork + ".log" ) - , "--workdir=" + config["Paths"]["Runtime"] - , "beat", "-l", "info" - ] - , stdout = celOut - , stderr = celOut - ) - - celOut.close() - - if not DEBUG and os.fork(): - import logging - logging.basicConfig( - filename = os.path.join( config["Paths"]["Log"], "access.log" ) - , level = logging.DEBUG - ) - sys.exit() - - WebAPI( - jsCache = config["Paths"]["Cache"] - , jsRoot = config["BotanJS"]["SrcDir"] - , brokerURL = config["BotanJS"]["CeleryBroker"] - ) diff --git a/botanjs/compressor/closure.py b/botanjs/compressor/closure.py old mode 100755 new mode 100644 diff --git a/botanjs/compressor/yui.py b/botanjs/compressor/yui.py old mode 100755 new mode 100644 diff --git a/botanjs/config.py b/botanjs/config.py old mode 100755 new mode 100644 diff --git a/botanjs/service/webapi.py b/botanjs/service/webapi.py old mode 100755 new mode 100644 index 54a62ea..ab2dd5c --- a/botanjs/service/webapi.py +++ b/botanjs/service/webapi.py @@ -1,11 +1,10 @@ -#!/usr/bin/env python3 from flask import Flask from flask import Response from flask import render_template from flask import request from botanjs.service.jclassresv import BotanClassResolver as JCResv from botanjs.service.jwork import app as CeleryApp, JWork -from botanjs.config import Config, DEBUG +from botanjs.config import Config import os @@ -33,10 +32,8 @@ class WebAPI: self.app.add_url_rule( "//" , view_func = lambda mode: self.api_request( mode, "zpayload" ) ) self.app.add_url_rule( "//" , view_func = self.api_request ) - self.app.run( - host = Config[ "Service" ][ "BindAddress" ] - , port = int( Config[ "Service" ][ "Port" ] ) - , debug = DEBUG ) + def run( self, *args, **kwargs ): + return self.app.run( *args, **kwargs ) def index( self ): return "Hello, this is the BotanJS Service API.", 200 diff --git a/main.py b/main.py new file mode 100644 index 0000000..d3ade1d --- /dev/null +++ b/main.py @@ -0,0 +1,22 @@ +#!env/bin/python + +import os +from botanjs.config import Config as config, DEBUG +from subprocess import Popen +from botanjs.service.webapi import WebAPI + +SiteRoot = os.path.abspath( "." ) + +# Setting the SiteRoot for config +config["Paths"]["SiteRoot"] = SiteRoot; + +service = WebAPI( + jsCache = config["Paths"]["Cache"] + , jsRoot = config["BotanJS"]["SrcDir"] + , brokerURL = config["BotanJS"]["CeleryBroker"] +) + +application = service.app + +if __name__ == "__main__": + service.run( debug = DEBUG ) diff --git a/setup/celery.conf b/setup/celery.conf new file mode 100644 index 0000000..24fe5c8 --- /dev/null +++ b/setup/celery.conf @@ -0,0 +1,15 @@ +# Absolute or relative path to the 'celery' command: +CELERY_BIN="BIN_ROOT/celery" + +CELERYD_NODES="w1 w2" +CELERY_APP="botanjs.service.jwork" + +# How to call manage.py +CELERYD_MULTI="multi" + +# - %n will be replaced with the first part of the nodename. +# # - %I will be replaced with the current child process index +# # and is important when using the prefork pool to avoid race conditions. +CELERYD_PID_FILE="RUN_ROOT/tasks-%n.pid" +CELERYD_LOG_FILE="PROJ_ROOT/logs/tasks-%n.log" +CELERYD_LOG_LEVEL="INFO" diff --git a/setup/compiler-tasks.service b/setup/compiler-tasks.service new file mode 100644 index 0000000..28630cb --- /dev/null +++ b/setup/compiler-tasks.service @@ -0,0 +1,19 @@ +[Unit] +Description=BotanJS Compiler Tasks +After=network.target + +[Service] +Type=forking +EnvironmentFile=-ETC_ROOT/celery.conf +WorkingDirectory=PROJ_ROOT +ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ + -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ + --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' +ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ + --pidfile=${CELERYD_PID_FILE}' +ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \ + -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ + --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' + +[Install] +WantedBy=multi-user.target diff --git a/setup/config b/setup/config new file mode 100755 index 0000000..8cb7eff --- /dev/null +++ b/setup/config @@ -0,0 +1,13 @@ +#!/bin/bash + +[[ $CONFIG ]] && return +CONFIG=1 + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPT_DIR="$( realpath "$SCRIPT_DIR" )" +PROJ_ROOT="$( cd "$SCRIPT_DIR/../" && pwd )" +ENV_ROOT="$PROJ_ROOT/env" +BIN_ROOT="$ENV_ROOT/bin" +ETC_ROOT="$ENV_ROOT/etc" +RUN_ROOT="$ENV_ROOT/run" +PYTHON="$BIN_ROOT/python3" diff --git a/setup/install b/setup/install new file mode 100755 index 0000000..9166471 --- /dev/null +++ b/setup/install @@ -0,0 +1,21 @@ +#!/bin/bash + +INST_DIR=$( dirname "${BASH_SOURCE[0]}" ) +source "$INST_DIR/config" + +mkdir -p "$RUN_ROOT" +mkdir -p "$ETC_ROOT" + +sed -e "s|PROJ_ROOT|$PROJ_ROOT|g" \ + -e "s|BIN_ROOT|$BIN_ROOT|g" \ + -e "s|RUN_ROOT|$RUN_ROOT|g" \ + "$INST_DIR/celery.conf" > "$ETC_ROOT/celery.conf" + +sed -e "s|PROJ_ROOT|$PROJ_ROOT|g" \ + -e "s|ETC_ROOT|$ETC_ROOT|g" \ + -e "s|RUN_AS|$RUN_AS|g" \ + "$INST_DIR/compiler-tasks.service" > $HOME/.config/systemd/user/botanjs-tasks.service + +systemctl --user enable botanjs-tasks.service +systemctl --user daemon-reload +systemctl --user start botanjs-tasks.service