What is the recommended way to deploy Volto / Plone 5.2/6 / Zope4/5 for production use?

First of all, thanks for all the effort and the hard labor it took to bring good old Zope and Plone to Python 3!
We did the greater part of the migration work to bring our application to Python 3 and did not reach any greater hurdles.

Great job! In very good quality! But I must say, that was no supprise to me ;-).

It was already asked here, but it seems to me that this was in a very early state of this kind of setups:

https://community.plone.org/t/volto-deployment-options/7458/12
https://community.plone.org/t/plone-5-2-wsgi-deployment/8923/11

There are some hints in Volto docs:

https://docs.voltocms.com/deploying/pm2/

and Zope docs:

https://zope.readthedocs.io/en/latest/zopebook/ZEO.html?highlight=zeo

After reading this I'm not sure, which is the right way to go. Would be great if some of you can share their opinion!

Until now we are using 4teamwork buildout scripts for Zope2, and this scripts seem to work for Zope4/5 and Python3 widely.
In first tests I got some problems only with the implemented healthcheck which depends on ZServer unless I'm mistaken.
But I'm not sure, if it results in an optimal setup with WSGI, e.g. 4 threads in wsgi.ini for a ZEO-client is not optimal for a ZEO setup, is it?

Would be really helpful for us if some of you can share some experiences or general recommendations:

Standard installation is using Waitress, isn't it?
Do you use this pure-Python WSGI implementation in production?

Do you use PM2 or good old Supervisor?

How did you solve loadbalancing, over PM2 or good old haproxy?

Is implementing a healthcheck needed?
ftw.monitor utilizing zc.monitor is not working with WSGI.
Is ftw.publisher.monitor the new way to go?

Do you use more ZEO-Clients than before?

Would be great if some of you are willing to share the buildout.cfg of your latest production setups!

Thanks in advance

Michael

buildout.cfg

[buildout]
extends =
https://zopefoundation.github.io/Zope/releases/5.1/versions-prod.cfg
https://raw.githubusercontent.com/4teamwork/ftw-buildouts/master/production.cfg
https://raw.githubusercontent.com/4teamwork/ftw-buildouts/master/zeoclients/4.cfg
https://raw.githubusercontent.com/4teamwork/ftw-buildouts/master/haproxy.cfg
https://raw.githubusercontent.com/4teamwork/ftw-buildouts/master/single-thread.cfg
...

wsgi.ini

[server:main]
paste.server_factory = plone.recipe.zope2instance:main
use = egg:plone.recipe.zope2instance#main
fast-listen = [‪0.0.0.0‬](tel:%E2%80%AA0.0.0.0%E2%80%AC):10601
threads = 4
...

I don't have a complete answer, nor do I believe any single person in the entire community has the authoritative answer. I personally have no interest in manual deployments.

My hope is that I can use GitHub - plone/ansible-playbook: An Ansible playbook for automated deployment of full-stack Plone servers. to deploy GitHub - plone/ansible.plone_server: Ansible role to create a plone server and somehow add on Volto as additional deployment steps. That will require changing to use PM instead of Supervisor, as that seems to be the chosen way forward by Volto developers, as well as several other modifications. Beyond just updating Ansible playbooks and scripts, documentation needs to be written and updated. I'm doing that work, but don't wait for me or anyone else. I would recommend that you try it out. If you run into troubles, document them and file an issue in the issue trackers.

For what is worth, our deployments of Volto use docker, there's a Dockerfile in the Volto repo that's fine to use for production.