diff --git a/Deployment/all-in-one/Docker/tasks/main.yaml b/Deployment/all-in-one/Docker/tasks/main.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..10c93bb0d6ae263eda4998470d894a50be677683
--- /dev/null
+++ b/Deployment/all-in-one/Docker/tasks/main.yaml
@@ -0,0 +1,101 @@
+# Uninstall old Docker
+- name: Uninstall old versions of docker
+  become: yes
+  apt:
+    name: ['docker', 'docker-engine', 'docker.io']
+    state: absent
+
+# Install Docker dependencies
+- name: Install dependencies
+  become: yes
+  apt:
+    name: ['apt-transport-https', 'ca-certificates', 'curl', 'python-setuptools', 'software-properties-common']
+    state: latest
+    install_recommends: no
+    update_cache: yes
+  environment: "{{ proxy_env }}"
+
+# Add Docker repository key
+- name: Add Docker apt repository key
+  become: yes
+  apt_key:
+    url: https://download.docker.com/linux/ubuntu/gpg
+    state: present
+  environment: "{{ proxy_env }}"
+
+# Add Docker repository
+- name: Add Docker apt repository and update apt cache
+  become: yes
+  apt_repository:
+    repo: "deb https://download.docker.com/linux/{{ ansible_distribution|lower }} {{ ansible_distribution_release }} stable"
+    mode: '644'
+    update_cache: yes
+    state: present
+  environment: "{{proxy_env}}"
+
+# Install Docker
+- name: Install docker
+  become: yes
+  apt:
+    name: docker.io
+    state: latest
+    install_recommends: no
+    update_cache: yes
+  environment: "{{proxy_env}}"
+
+# Install Docker compose
+- name: Install docker-compose
+  tags: 'docker'
+  become: yes
+  pip:
+    name: ['docker-compose']
+    state: latest
+  environment: "{{proxy_env}}"
+
+# Make sure systemd directory exists
+- name: Make sure that systemd directory exists
+  file:
+    path: '/etc/systemd/system'
+    state: 'directory'
+    owner: 'root'
+    group: 'root'
+    mode: '0755'
+
+# Make sure docker.service.d directory exists
+- name: Make sure that docker.service.d directory exists
+  file:
+    path: '/etc/systemd/system/docker.service.d'
+    state: 'directory'
+    owner: 'root'
+    group: 'root'
+    mode: '0755'
+  become: yes
+
+# Configure Docker system proxy
+- name: Configure Docker proxy
+  template:
+    src: 'http-proxy.conf.j2'
+    dest: '/etc/systemd/system/docker.service.d/http-proxy.conf'
+    owner: 'root'
+    group: 'root'
+    mode: '0644'
+  when: (ansible_service_mgr == 'systemd' and
+        (proxy_env.http_proxy is defined or proxy_env.https_proxy is defined))
+  become: yes
+
+# Restart systemd daemons
+- name: Reload systemd daemons
+  command: systemctl daemon-reload
+  become: yes
+
+# Restart Docker daemon
+- name: Restart docker daemon
+  command: systemctl restart docker
+  become: yes
+
+# Restart Docker daemon
+- name: Restart docker
+  service:
+    name: docker
+    state: restarted
+  become: yes
\ No newline at end of file
diff --git a/Deployment/playbooks/roles/frontend/tasks/main.yaml b/Deployment/playbooks/roles/frontend/tasks/main.yaml
index 84aefbefff9e327d72127d62a87a8f1d15f9bc51..9aca3b15acc17a3ee0f9b1948d8accb76dcbf06f 100644
--- a/Deployment/playbooks/roles/frontend/tasks/main.yaml
+++ b/Deployment/playbooks/roles/frontend/tasks/main.yaml
@@ -1,5 +1,41 @@
-- name: Set up frontend application
-  hosts: frontend-instance
+# Clone source code repository
+- name: Clone the code repository into home directory
+  git:
+    repo: "https://gitlab.eng.unimelb.edu.au/smaabi/unimelb-comp90024-2023-grp-58.git"
+    dest: ~/cluster-and-cloud-computing-assignment-2
+  environment: "{{ proxy_env }}"
   become: true
-  tasks:
-    - name:
\ No newline at end of file
+
+# Create Docker config directory
+- name: Make sure that Docker config directory exists
+  become: yes
+  file:
+    path: '~/.docker'
+    state: 'directory'
+
+# Set Docker proxy for University of Melbourne Research Cloud
+- name: Ensure Docker client proxy settings are present on the server
+  become: yes
+  copy:
+    content: "{{ docker_proxy_settings }}"
+    dest: ~/.docker/config.json
+
+# Build Docker image for web frontend and web backend
+- name: Configure compose
+  become: yes
+  template:
+    src: "{{ playbook_dir }}/../web/docker-compose.yaml.j2"
+    dest: "~/cluster-and-cloud-computing-assignment-2/web/docker-compose.yaml"
+    owner: "{{ ansible_user }}"
+    group: "{{ ansible_user }}"
+
+# Run Docker compose to activate web frontend and web backend
+- name: Run docker compose
+  become: yes
+  docker_compose:
+    project_src: "~/cluster-and-cloud-computing-assignment-2/web/"
+    pull: false
+    build: yes
+    state: present
+    remove_orphans: no
+    recreate: always
\ No newline at end of file
diff --git a/Deployment/playbooks/roles/openstack-security-group/tasks/main.yaml b/Deployment/playbooks/roles/openstack-security-group/tasks/main.yaml
index 65e68771fcab7733f37b2e64a4dedc62e242afe4..adb884de1f877bdd047e16ac08ea83da0fe3723c 100644
--- a/Deployment/playbooks/roles/openstack-security-group/tasks/main.yaml
+++ b/Deployment/playbooks/roles/openstack-security-group/tasks/main.yaml
@@ -5,19 +5,6 @@
     name: "{{ item.name }}"
     description: "{{ item.description }}"
     state: present
-    security_group_rules:
-      - ether_type: IPv6
-        protocol: any
-        direction: egress
-        port_range_min: 1
-        port_range_max: 65535
-        remote_ip_prefix: ::/0
-      - ether_type: IPv4
-        protocol: any
-        direction: egress
-        port_range_min: 1
-        port_range_max: 65535
-        remote_ip_prefix: 0.0.0.0/0
   loop: "{{ security_groups }}"
 
 - name: Create a list of security group names
diff --git a/Deployment/playbooks/vars/comm.yaml b/Deployment/playbooks/vars/comm.yaml
index 2588ae592d22964e638d867c0840087df3c644d6..fa42b686dabb5a52434e39470acab87b988290a1 100644
--- a/Deployment/playbooks/vars/comm.yaml
+++ b/Deployment/playbooks/vars/comm.yaml
@@ -19,18 +19,36 @@ volumes:
 
 # Security group
 security_groups:
-  - name: ssh
-    description: "security group for SSH access"
+  - name: ssh_access
+    description: "ssh access"
     protocol: tcp
     port_range_min: 22
     port_range_max: 22
     remote_ip_prefix: 0.0.0.0/0
-  - name: demo_http
-    description: "security group for HTTP"
+  - name: couchdb_access
+    description: "couchdb access"
+    protocol: tcp
+    port_range_min: 5984
+    port_range_max: 5984
+    remote_ip_prefix: 0.0.0.0/0
+  - name: http_access
+    description: "HTTP access"
     protocol: tcp
     port_range_min: 80
     port_range_max: 80
     remote_ip_prefix: 0.0.0.0/0
+  - name: intra_cluster_communication
+    description: "comm access"
+    protocol: tcp
+    port_range_min: 9100
+    port_range_max: 9200
+    remote_ip_prefix: 0.0.0.0/0
+  - name: intra_cluster_communication_1
+    description: "comm access 1"
+    protocol: tcp
+    port_range_min: 4369
+    port_range_max: 4369
+    remote_ip_prefix: 0.0.0.0/0
 
 # Instance
 master-instance: