To run the Plone content management system using Unit:

  1. Install Unit with a Python 3.6+ language module.

  2. Install and configure Plone’s prerequisites.

  3. Install Plone’s core files. Here, we install it at /path/to/app/; use a real path in your configuration:

    $ mkdir /tmp/plone && cd /tmp/plone/
    $ wget
    $ tar xzvf Plone-A.B.C-UnifiedInstaller-1.0.tgz  \
    $ ./ --target=/path/to/app/  \
                   --with-python=/full/path/to/python  \


    Plone’s Zope instance and virtual environment are created in the zinstance/ subdirectory; later, the resulting path is used to configure Unit, so take care to note it in your setup. Also, make sure the Python version specified with --with-python matches the module version from Step 1.

  4. To run Plone on Unit, add a new configuration file named /path/to/app/zinstance/wsgi.cfg:

    extends =
    parts +=
    recipe = plone.recipe.zope2instance
    user = admin:admin
    eggs =
    scripts =
    initialization =
        from import make_wsgi_app
        wsgiapp = make_wsgi_app({}, '${buildout:parts-directory}/instance/etc/zope.conf')
        def application(*args, **kwargs):return wsgiapp(*args, **kwargs)

    It creates a new Zope instance. The part’s name must end with .py for the resulting instance script to be recognized as a Python module; the initialization option defines a WSGI entry point using zope.conf from the instance part in buildout.cfg.

    Rerun Buildout, feeding it the new configuration file:

    $ cd /path/to/app/zinstance/
    $ bin/buildout -c wsgi.cfg
          Generated script '/path/to/app/zinstance/bin/'.

    Thus created, the instance script can be used with Unit.

  5. Run the following command so Unit can access the application directory:

    # chown -R unit:unit /path/to/app/


    The unit:unit user-group pair is available only with official packages, Docker images, and some third-party repos. Otherwise, account names may differ; run the ps aux | grep unitd command to be sure.

    For further details, including permissions, see the security checklist.

  6. Next, prepare the Plone configuration for Unit (use real values for path and home):

        "listeners": {
            "*:80": {
                "pass": "applications/plone"
        "applications": {
            "plone": {
                "type": "python 3.Y",
                "path": "/path/to/app/zinstance/",
                "home": "/path/to/app/zinstance/",
                "module": "bin.wsgi"
  7. Upload the updated configuration. Assuming the JSON above was added to config.json:

    # curl -X PUT --data-binary @config.json --unix-socket \
           /path/to/control.unit.sock http://localhost/config/


    The control socket path may vary; run unitd -h or see Startup and Shutdown for details.

    After a successful update, your Plone instance should be available on the listener’s IP address and port:

    Plone on Unit - Setup Screen