This guide installs Plone as a native Python application with systemd service management.
It supports Debian 10 to latest stable, Ubuntu LTS, and RHEL 9+ compatible systems.
For a Docker-based installation, see Plone Docker Ansible Setup.
- name: Install Plone
hosts: plone
become: true
vars:
plone_user: plone
plone_group: plone
plone_home: /opt/plone
plone_venv: /opt/plone/venv
plone_port: 8080
plone_version: "6.0.10"
tasks:
- name: Install dependencies on Debian/Ubuntu
apt:
name:
- python3
- python3-venv
- python3-dev
- build-essential
- libxml2-dev
- libxslt1-dev
- zlib1g-dev
- curl
- git
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install dependencies on RHEL family
dnf:
name:
- python3
- python3-devel
- gcc
- libxml2-devel
- libxslt-devel
- zlib-devel
- curl
- git
state: present
when: ansible_os_family == "RedHat"
- name: Create Plone system user
user:
name: "{{ plone_user }}"
group: "{{ plone_group }}"
system: true
create_home: false
- name: Create Plone directory
file:
path: "{{ plone_home }}"
state: directory
owner: "{{ plone_user }}"
group: "{{ plone_group }}"
mode: "0755"
- name: Create Python virtual environment
command: "python3 -m venv {{ plone_venv }}"
args:
creates: "{{ plone_venv }}/bin/python"
- name: Install Plone in virtual environment
pip:
name:
- "Plone=={{ plone_version }}"
- pip
- setuptools
- wheel
virtualenv: "{{ plone_venv }}"
state: present
- name: Create Plone buildout directory
file:
path: "{{ plone_home }}/instance"
state: directory
owner: "{{ plone_user }}"
group: "{{ plone_group }}"
mode: "0755"
- name: Write buildout configuration
copy:
dest: "{{ plone_home }}/instance/buildout.cfg"
mode: "0644"
owner: "{{ plone_user }}"
group: "{{ plone_group }}"
content: |
[buildout]
extends = https://dist.plone.org/release/6.0-latest/versions.cfg
parts = instance
find-links += https://dist.plone.org/release/6.0-latest/
allow-picked-versions = false
[instance]
recipe = plone.recipe.zope2instance
user = admin:admin
http-address = {{ plone_port }}
environment-vars =
zope_i18n_compile_mo_files true
eggs =
Plone
plone.app.caching
plone.app.theming
- name: Write systemd service for Plone
copy:
dest: /etc/systemd/system/plone.service
mode: "0644"
content: |
[Unit]
Description=Plone CMS
After=network.target
[Service]
Type=simple
User={{ plone_user }}
Group={{ plone_group }}"
WorkingDirectory={{ plone_home }}/instance
Environment=PATH={{ plone_venv }}/bin:%H/bin
ExecStart={{ plone_venv }}/bin/python {{ plone_venv }}/bin/runwsgi {{ plone_home }}/instance/etc/zope.ini
Restart=always
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
- name: Reload systemd daemon
systemd:
daemon_reload: true
- name: Enable and start Plone service
service:
name: plone
state: started
enabled: true
admin with password admin - change immediately after first login.plone_version to use the latest stable Plone 6.0.x release.Beyond this playbook, we offer:
Contact our automation team: office@linux-server-admin.com