feat: enhance Nextcloud maintenance checks and add Collabora endpoint validations

This commit is contained in:
martin.fencl
2026-08-06 18:14:14 +02:00
parent 2291025752
commit 33492bb642
+137 -28
View File
@@ -11,28 +11,86 @@
vm_password: "{{ lookup('ansible.builtin.env', 'vm_pass') }}" vm_password: "{{ lookup('ansible.builtin.env', 'vm_pass') }}"
vm_use_sudo: "{{ use_sudo | default(false) | bool }}" vm_use_sudo: "{{ use_sudo | default(false) | bool }}"
nextcloud_container: "nextcloud"
nextcloud_db_container: "nextcloud-db"
redis_container: "redis"
nextcloud_local_status_url: "http://127.0.0.1:8080/status.php"
collabora_url: "https://collabora.martinfencl.eu/"
collabora_discovery_url: >-
https://collabora.martinfencl.eu/hosting/discovery
vm_commands: vm_commands:
- >- - name: Run Nextcloud cron
docker exec -u www-data nextcloud command: >-
php -f /var/www/html/cron.php docker exec -u www-data
{{ nextcloud_container }}
php -f /var/www/html/cron.php
- >- - name: Update Nextcloud applications
docker exec -u www-data nextcloud command: >-
php occ app:update --all docker exec -u www-data
{{ nextcloud_container }}
php occ app:update --all
- >- - name: Run Nextcloud maintenance repair
docker exec -u www-data nextcloud command: >-
php occ maintenance:repair --include-expensive docker exec -u www-data
{{ nextcloud_container }}
php occ maintenance:repair --include-expensive
- >- - name: Read Nextcloud status
docker exec -u www-data nextcloud command: >-
php occ status docker exec -u www-data
{{ nextcloud_container }}
php occ status
- >- - name: Check required containers
set -o pipefail; command: >-
timeout 180s set -o pipefail;
bash -x /data/compose/nextcloud/stack-health.sh for container in
</dev/null {{ nextcloud_container | quote }}
{{ nextcloud_db_container | quote }}
{{ redis_container | quote }};
do
docker ps
--filter "name=^/${container}$"
--filter "status=running"
--format '{% raw %}{{.Names}}{% endraw %}'
| grep -qx "${container}"
|| {
echo "Container ${container} is not running" >&2;
exit 1;
};
done
- name: Check MariaDB readiness
command: >-
docker exec
{{ nextcloud_db_container }}
sh -c
'mariadb-admin ping -h 127.0.0.1 --silent 2>/dev/null
|| mysqladmin ping -h 127.0.0.1 --silent 2>/dev/null'
- name: Check Redis readiness
command: >-
set -o pipefail;
docker exec
{{ redis_container }}
redis-cli -h 127.0.0.1 ping
| grep -qx PONG
- name: Check Nextcloud local status endpoint
command: >-
set -o pipefail;
curl
--fail
--silent
--show-error
--max-time 15
{{ nextcloud_local_status_url | quote }}
| grep -q '"installed":true'
pre_tasks: pre_tasks:
- name: Validate VM connection variables - name: Validate VM connection variables
@@ -56,7 +114,7 @@
state: present state: present
update_cache: true update_cache: true
- name: Run Nextcloud commands on VM - name: Run Nextcloud checks on VM
ansible.builtin.command: ansible.builtin.command:
argv: argv:
- sshpass - sshpass
@@ -67,6 +125,8 @@
- -o - -o
- UserKnownHostsFile=/dev/null - UserKnownHostsFile=/dev/null
- -o - -o
- LogLevel=ERROR
- -o
- ConnectTimeout=15 - ConnectTimeout=15
- -o - -o
- ServerAliveInterval=10 - ServerAliveInterval=10
@@ -75,26 +135,27 @@
- "{{ vm_user }}@{{ vm_ip }}" - "{{ vm_user }}@{{ vm_ip }}"
- >- - >-
{{ {{
('sudo -n bash -lc ' ~ (item | quote)) ('sudo -n bash -lc ' ~ (item.command | quote))
if vm_use_sudo if vm_use_sudo
else else
('bash -lc ' ~ (item | quote)) ('bash -lc ' ~ (item.command | quote))
}} }}
environment: environment:
SSHPASS: "{{ vm_password }}" SSHPASS: "{{ vm_password }}"
loop: "{{ vm_commands }}" loop: "{{ vm_commands }}"
loop_control: loop_control:
label: "{{ item }}" label: "{{ item.name }}"
register: vm_cmds register: vm_cmds
changed_when: false changed_when: false
failed_when: false failed_when: false
no_log: true no_log: true
- name: Show outputs for each command - name: Show outputs for each VM command
ansible.builtin.debug: ansible.builtin.debug:
msg: | msg: |
CMD: {{ item.item }} CHECK: {{ item.item.name }}
RC: {{ item.rc }} CMD: {{ item.item.command }}
RC: {{ item.rc }}
STDOUT: STDOUT:
{{ item.stdout | default('') | trim }} {{ item.stdout | default('') | trim }}
@@ -103,14 +164,15 @@
{{ item.stderr | default('') | trim }} {{ item.stderr | default('') | trim }}
loop: "{{ vm_cmds.results }}" loop: "{{ vm_cmds.results }}"
loop_control: loop_control:
label: "{{ item.item }}" label: "{{ item.item.name }}"
- name: Fail play if any command failed - name: Fail if any Nextcloud VM command failed
ansible.builtin.assert: ansible.builtin.assert:
that: that:
- item.rc == 0 - item.rc == 0
fail_msg: | fail_msg: |
Command failed on VM: {{ item.item }} Nextcloud check failed: {{ item.item.name }}
Command: {{ item.item.command }}
RC: {{ item.rc }} RC: {{ item.rc }}
STDERR: STDERR:
@@ -118,4 +180,51 @@
quiet: true quiet: true
loop: "{{ vm_cmds.results }}" loop: "{{ vm_cmds.results }}"
loop_control: loop_control:
label: "{{ item.item }}" label: "{{ item.item.name }}"
- name: Check external Collabora root endpoint
ansible.builtin.uri:
url: "{{ collabora_url }}"
method: GET
return_content: true
validate_certs: true
status_code: 200
timeout: 20
register: collabora_root
delegate_to: localhost
run_once: true
changed_when: false
failed_when: >-
collabora_root.status | default(0) != 200
or
'OK' not in (collabora_root.content | default(''))
- name: Check external Collabora discovery endpoint
ansible.builtin.uri:
url: "{{ collabora_discovery_url }}"
method: GET
return_content: true
validate_certs: true
status_code: 200
timeout: 20
register: collabora_discovery
delegate_to: localhost
run_once: true
changed_when: false
failed_when: >-
collabora_discovery.status | default(0) != 200
or
'<wopi-discovery' not in
(collabora_discovery.content | default(''))
- name: Show final health summary
ansible.builtin.debug:
msg: |
Nextcloud VM checks: OK
Nextcloud containers: OK
MariaDB: OK
Redis: OK
Nextcloud local HTTP: OK
Collabora root endpoint: OK
Collabora discovery endpoint: OK
run_once: true