This guide deploys WooCommerce as a WordPress plugin using Docker Compose on Debian 10+, Ubuntu 20.04+, or RHEL 9+.
Current Version: WooCommerce 10.5 (released February 3, 2026)
WordPress Requirement: WordPress 6.4+
⚠️ Important: WooCommerce is a WordPress plugin, not standalone software. This playbook installs WordPress first, then adds WooCommerce.
- name: Deploy WooCommerce on WordPress with Docker
hosts: woocommerce
become: true
vars:
app_root: /opt/woocommerce
app_port: 8080
wordpress_version: latest
db_name: wordpress
db_user: wordpress
db_password: "wordpress-db-password-change-me"
db_root_password: "mariadb-root-password-change-me"
wordpress_admin_user: admin
wordpress_admin_password: "admin-password-change-me"
wordpress_admin_email: admin@example.com
tasks:
- name: Install Docker on Debian/Ubuntu
apt:
name:
- docker.io
- docker-compose-plugin
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install Docker on RHEL family
dnf:
name:
- docker
- docker-compose-plugin
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start Docker
service:
name: docker
state: started
enabled: true
- name: Create app directory
file:
path: "{{ app_root }}"
state: directory
mode: "0755"
- name: Write Docker Compose file for WordPress + WooCommerce
copy:
dest: "{{ app_root }}/docker-compose.yml"
mode: "0644"
content: |
version: '3.8'
services:
mariadb:
image: mariadb:11.4
container_name: woocommerce-db
restart: unless-stopped
environment:
MYSQL_DATABASE: {{ db_name }}
MYSQL_USER: {{ db_user }}
MYSQL_PASSWORD: {{ db_password }}
MYSQL_ROOT_PASSWORD: {{ db_root_password }}
volumes:
- mariadb_data:/var/lib/mysql
networks:
- woocommerce-net
wordpress:
image: bitnami/wordpress:{{ wordpress_version }}
container_name: woocommerce
restart: unless-stopped
depends_on:
- mariadb
ports:
- "{{ app_port }}:8080"
environment:
- WORDPRESS_DATABASE_HOST=mariadb
- WORDPRESS_DATABASE_PORT=3306
- WORDPRESS_DATABASE_NAME={{ db_name }}
- WORDPRESS_DATABASE_USER={{ db_user }}
- WORDPRESS_DATABASE_PASSWORD={{ db_password }}
- WORDPRESS_DATABASE_ROOT_PASSWORD={{ db_root_password }}
- WORDPRESS_USERNAME={{ wordpress_admin_user }}
- WORDPRESS_PASSWORD={{ wordpress_admin_password }}
- WORDPRESS_EMAIL={{ wordpress_admin_email }}
- WORDPRESS_FIRST_NAME=Store
- WORDPRESS_LAST_NAME=Admin
- WORDPRESS_BLOG_TITLE=My WooCommerce Store
- ALLOW_EMPTY_PASSWORD=no
volumes:
- wordpress_data:/bitnami/wordpress
networks:
- woocommerce-net
wpcli:
image: bitnami/wordpress-cli:latest
container_name: woocommerce-wpcli
depends_on:
- wordpress
volumes:
- wordpress_data:/bitnami/wordpress
networks:
- woocommerce-net
entrypoint: /bin/bash
command: -c "sleep 15 && wp plugin install woocommerce --activate && wp wc tool run install_pages --user={{ wordpress_admin_user }}"
volumes:
mariadb_data:
wordpress_data:
networks:
woocommerce-net:
- name: Start WordPress and WooCommerce stack
command: docker compose up -d
args:
chdir: "{{ app_root }}"
- name: Wait for WordPress to be ready
wait_for:
port: "{{ app_port }}"
timeout: 120
delay: 10
- name: Wait for WooCommerce installation
wait_for:
timeout: 30
when: wpcli_install | default(true)
- name: Display installation information
debug:
msg: |
WordPress + WooCommerce installation is ready!
Access: http://{{ inventory_hostname }}:{{ app_port }}
WordPress Admin: http://{{ inventory_hostname }}:{{ app_port }}/wp-admin
WooCommerce Settings: http://{{ inventory_hostname }}:{{ app_port }}/wp-admin/admin.php?page=wc-settings
Login Credentials:
- Username: {{ wordpress_admin_user }}
- Password: {{ wordpress_admin_password }}
IMPORTANT:
1. Change the admin password immediately after first login
2. Complete the WooCommerce setup wizard
3. Configure SSL/TLS via reverse proxy for production
For traditional LAMP stack installation:
- name: Deploy WordPress + WooCommerce (Direct LAMP)
hosts: woocommerce
become: true
vars:
app_root: /var/www/html/wordpress
web_user: www-data
db_name: wordpress
db_user: wordpress
db_password: "wordpress-db-password-change-me"
tasks:
- name: Install LAMP stack
apt:
name:
- apache2
- mariadb-server
- libapache2-mod-php
- php-mysql
- php-curl
- php-gd
- php-intl
- php-mbstring
- php-xml
- php-zip
- php-bcmath
- php-soap
- unzip
- git
- curl
state: present
update_cache: true
- name: Enable Apache mod_rewrite
command: a2enmod rewrite
notify: restart apache
- name: Start and enable MariaDB
service:
name: mariadb
state: started
enabled: true
- name: Create database
mysql_db:
name: "{{ db_name }}"
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Create database user
mysql_user:
name: "{{ db_user }}"
password: "{{ db_password }}"
priv: "{{ db_name }}.*:ALL"
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Install WP-CLI
get_url:
url: https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
dest: /usr/local/bin/wp
mode: '0755'
- name: Download WordPress
command: wp core download --path={{ app_root }}
args:
creates: "{{ app_root }}/wp-includes/version.php"
- name: Configure WordPress
command: >
wp config create
--dbname={{ db_name }}
--dbuser={{ db_user }}
--dbpass={{ db_password }}
--path={{ app_root }}
args:
creates: "{{ app_root }}/wp-config.php"
- name: Create WordPress database
command: wp db create --path={{ app_root }}
args:
creates: "{{ db_name }}"
- name: Install WordPress
command: >
wp core install
--url=http://{{ inventory_hostname }}
--title="My WooCommerce Store"
--admin_user=admin
--admin_password=admin-password-change-me
--admin_email=admin@example.com
--path={{ app_root }}
args:
creates: "{{ app_root }}/wp-config.php"
- name: Install WooCommerce plugin
command: wp plugin install woocommerce --activate --path={{ app_root }}
- name: Set ownership
file:
path: "{{ app_root }}"
owner: "{{ web_user }}"
group: "{{ web_user }}"
recurse: yes
- name: Configure Apache virtual host
template:
src: templates/wordpress-vhost.j2
dest: /etc/apache2/sites-available/wordpress.conf
notify: restart apache
- name: Enable WordPress site
command: a2ensite wordpress
notify: restart apache
handlers:
- name: restart apache
service:
name: apache2
state: restarted
http://YOUR-SERVER:8080/wp-admin| Variable | Description | Default |
|---|---|---|
app_root |
Installation directory | /opt/woocommerce |
app_port |
External port for web access | 8080 |
wordpress_version |
WordPress version tag | latest |
db_name |
MySQL database name | wordpress |
db_user |
MySQL database user | wordpress |
db_password |
MySQL database password | (change me) |
db_root_password |
MySQL root password | (change me) |
wordpress_admin_user |
WordPress admin username | admin |
wordpress_admin_password |
WordPress admin password | (change me) |
wordpress_admin_email |
WordPress admin email | admin@example.com |