diff --git a/corporal/fablib/corporal.py b/corporal/fablib/corporal.py index 5d171c6..9cffdf8 100644 --- a/corporal/fablib/corporal.py +++ b/corporal/fablib/corporal.py @@ -12,7 +12,7 @@ from corporal.fablib import deploy_common def bootstrap_corporal_app(c, env, envname='corporal', user='rattail', - port=7900, sitename=None, stage=False, + port=7900, asgi=False, sitename=None, stage=False, coredir=None, lanes=None, core_office_url=None): """ @@ -35,6 +35,12 @@ def bootstrap_corporal_app(c, env, envname='corporal', user='rattail', c.sudo('chmod 0600 {}/pip.conf'.format(envdir)) mkdir(c, srcdir, owner=user, use_sudo=True) + # uvicorn + if asgi: + # (latest as of writing is 0.20.0) + c.sudo("bash -lc 'workon {} && pip install uvicorn[standard]'".format(envname), + user=user) + if stage: # pycorepos @@ -116,6 +122,10 @@ def bootstrap_corporal_app(c, env, envname='corporal', user='rattail', use_sudo=True, owner=user, mode='0600', context={'env': env, 'envname': envname, 'envdir': envdir, 'port': port}) + if asgi: + deploy_common(c, 'corporal/webasgi.conf.mako', '{}/webasgi.conf'.format(appdir), + use_sudo=True, owner=user, mode='0600', + context={'env': env, 'envname': envname, 'envdir': envdir}) deploy_common(c, 'corporal/upgrade.sh.mako', '{}/upgrade.sh'.format(appdir), use_sudo=True, owner=user, context={'envdir': envdir, 'production': production}) @@ -139,7 +149,8 @@ def bootstrap_corporal_app(c, env, envname='corporal', user='rattail', # supervisor deploy_common(c, 'corporal/supervisor.conf.mako', '/etc/supervisor/conf.d/{}.conf'.format(safename), - use_sudo=True, context={'envdir': envdir, 'safename': safename}) + use_sudo=True, context={'envdir': envdir, 'safename': safename, + 'port': port, 'asgi': asgi}) c.sudo('supervisorctl update') c.sudo('supervisorctl start {}:'.format(safename)) @@ -152,7 +163,8 @@ def bootstrap_corporal_app(c, env, envname='corporal', user='rattail', # apache deploy_common.apache_site(c, 'apache/site-corporal.mako', sitename, enable=True, - context={'sitename': sitename, 'port': port}) + context={'sitename': sitename, 'port': port, + 'asgi': asgi}) apache.restart(c) diff --git a/corporal/fablib/deploy/apache/site-corporal.mako b/corporal/fablib/deploy/apache/site-corporal.mako index 145ecfd..381064f 100644 --- a/corporal/fablib/deploy/apache/site-corporal.mako +++ b/corporal/fablib/deploy/apache/site-corporal.mako @@ -9,6 +9,13 @@ ProxyPass "http://127.0.0.1:${port}/" ProxyPassReverse "http://127.0.0.1:${port}/" + % if asgi: + + ProxyPreserveHost On + ProxyPass "ws://127.0.0.1:${port}/ws/" + ProxyPassReverse "ws://127.0.0.1:${port}/ws/" + + % endif ErrorLog ${'$'}{APACHE_LOG_DIR}/error.log LogLevel warn diff --git a/corporal/fablib/deploy/corporal/supervisor.conf.mako b/corporal/fablib/deploy/corporal/supervisor.conf.mako index 1a7a5ee..b6113c4 100644 --- a/corporal/fablib/deploy/corporal/supervisor.conf.mako +++ b/corporal/fablib/deploy/corporal/supervisor.conf.mako @@ -4,6 +4,11 @@ programs=${safename}_webmain [program:${safename}_webmain] +% if asgi: +environment=TAILBONE_ASGI_CONFIG="${envdir}/app/webasgi.conf" +command=${envdir}/bin/uvicorn --port ${port} --factory corporal.web.app:asgi_main +% else: command=${envdir}/bin/pserve pastedeploy+ini:${envdir}/app/web.conf directory=${envdir}/app/work +% endif user=rattail diff --git a/corporal/fablib/deploy/corporal/webasgi.conf.mako b/corporal/fablib/deploy/corporal/webasgi.conf.mako new file mode 100644 index 0000000..20107e2 --- /dev/null +++ b/corporal/fablib/deploy/corporal/webasgi.conf.mako @@ -0,0 +1,52 @@ +## -*- mode: conf; -*- + +<%text>############################################################ +# +# config for Corporal web app +# +<%text>############################################################ + + +<%text>############################## +# rattail +<%text>############################## + +[rattail.config] +include = %(here)s/rattail.conf + +[tailbone] +expose_websockets = true + + +<%text>############################## +# pyramid +<%text>############################## + +[app:main] +use = egg:Corporal + +pyramid.reload_templates = false +pyramid.debug_all = false +pyramid.default_locale_name = en +pyramid.includes = pyramid_exclog + +beaker.session.type = file +beaker.session.data_dir = %(here)s/sessions/data +beaker.session.lock_dir = %(here)s/sessions/lock +beaker.session.secret = ${env.tailbone_beaker_secret} +beaker.session.key = ${envname} + +pyramid_deform.tempdir = %(here)s/data/uploads + +exclog.extra_info = true + +# required for tailbone +rattail.config = %(__file__)s + + +<%text>############################## +# logging +<%text>############################## + +[handler_file] +args = ('${envdir}/app/log/webasgi.log', 'a', 'utf_8')