#!/bin/sh # SPDX-FileCopyrightText: 2026 Chiu Ki Sit # # SPDX-License-Identifier: AGPL-3.0-or-later # # Boot recovery for Matrix services on Synology DSM. # # This script runs after multi-user.target (outside Container Manager's dependency # chain) and does two things: # # 1. Makes {{ matrix_base_synology_volume_path }} mount-shared so Docker bind-propagation=slave mounts work. # Inserting this into the systemd chain Before=pkg-ContainerManager-dockerd.service # causes Container Manager to detect a broken dependency and prompt for repair, # so it must run here instead, after Docker is already up. # # 2. Starts any enabled matrix-*.service that systemd skipped at boot. # Synology's systemd drops services with multi-level dependency chains # (e.g. traefik -> socket-proxy -> docker) from the boot activation queue. # Services that need bind-propagation=slave (e.g. matrix-synapse) are # created after step 1, so the propagation is already in effect. # Wait up to 120s for Docker to be ready i=0 while [ "$i" -lt 60 ]; do {{ devture_systemd_docker_base_host_command_docker }} info >/dev/null 2>&1 && break i=$((i + 1)) sleep 2 done if ! {{ devture_systemd_docker_base_host_command_docker }} info >/dev/null 2>&1; then echo "matrix-synology-boot-fix: Docker not ready after 120s, aborting" >&2 exit 1 fi # Make {{ matrix_base_synology_volume_path }} shared so Docker bind-propagation=slave mounts work correctly. # Must run after Docker is up to avoid interfering with Container Manager's # integrity checks, but before matrix-synapse (and any other service using # bind-propagation=slave) creates its containers. /bin/mount --make-shared {{ matrix_base_synology_volume_path }} echo "matrix-synology-boot-fix: {{ matrix_base_synology_volume_path }} set to shared mount propagation" # Start any enabled matrix-*.service that is inactive or failed. # Both states indicate the service did not come up at boot — either skipped by # Synology's boot ordering or failed due to Docker/mount-propagation not being # ready yet (the conditions above now satisfy those prerequisites). {{ devture_systemd_docker_base_host_command_systemctl }} list-unit-files 'matrix-*.service' --state=enabled --no-legend 2>/dev/null | \ while read -r unit _state; do [ "$unit" = "matrix-synology-boot-fix.service" ] && continue status="$({{ devture_systemd_docker_base_host_command_systemctl }} is-active "$unit" 2>/dev/null)" if [ "$status" = "inactive" ] || [ "$status" = "failed" ]; then echo "matrix-synology-boot-fix: starting $unit (was $status)" {{ devture_systemd_docker_base_host_command_systemctl }} start "$unit" fi done