This guide deploys ownCloud 10 with Docker Compose on Debian 10 to latest stable, Ubuntu LTS, and RHEL 9+ compatible hosts.
- name: Deploy ownCloud
hosts: owncloud
become: true
vars:
app_root: /opt/owncloud
app_port: 8080
owncloud_version: "10.16"
db_password: "{{ vault_owncloud_db_password }}"
admin_password: "{{ vault_owncloud_admin_password }}"
domain: "localhost:{{ app_port }}"
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-ce
- docker-ce-cli
- containerd.io
- 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
copy:
dest: "{{ app_root }}/docker-compose.yml"
mode: "0644"
content: |
version: '3.8'
volumes:
files:
driver: local
mysql:
driver: local
redis:
driver: local
services:
owncloud:
image: owncloud/server:{{ owncloud_version }}
container_name: owncloud_server
restart: always
ports:
- "{{ app_port }}:8080"
depends_on:
- mariadb
- redis
environment:
- OWNCLOUD_DOMAIN={{ domain }}
- OWNCLOUD_DB_TYPE=mysql
- OWNCLOUD_DB_NAME=owncloud
- OWNCLOUD_DB_USERNAME=owncloud
- OWNCLOUD_DB_PASSWORD={{ db_password }}
- OWNCLOUD_DB_HOST=mariadb
- OWNCLOUD_ADMIN_USERNAME=admin
- OWNCLOUD_ADMIN_PASSWORD={{ admin_password }}
- OWNCLOUD_MYSQL_UTF8MB4=true
- OWNCLOUD_REDIS_ENABLED=true
- OWNCLOUD_REDIS_HOST=redis
volumes:
- files:/mnt/data
mariadb:
image: mariadb:10.11
container_name: owncloud_mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD={{ db_password }}
- MYSQL_USER=owncloud
- MYSQL_PASSWORD={{ db_password }}
- MYSQL_DATABASE=owncloud
volumes:
- mysql:/var/lib/mysql
redis:
image: redis:6
container_name: owncloud_redis
restart: always
volumes:
- redis:/data
- name: Start application stack
community.docker.docker_compose:
project_src: "{{ app_root }}"
state: present
- name: Wait for ownCloud to be ready
uri:
url: "http://localhost:{{ app_port }}"
status_code: 200,302
register: result
until: result.status in [200, 302]
retries: 30
delay: 5
Create an ansible-vault file with secure passwords:
# group_vars/all/vault.yml
vault_owncloud_db_password: "your-secure-db-password-here"
vault_owncloud_admin_password: "your-secure-admin-password-here"
# Run the playbook
ansible-playbook -i inventory.ini owncloud.yml
# With vault password
ansible-playbook -i inventory.ini owncloud.yml --ask-vault-pass
For production deployments, consider adding:
/mnt/data volume and MySQL databaseSee Configuration and Security for production hardening.
Any questions?
Feel free to contact us. Find all contact information on our contact page.