#!/bin/sh set -eu umask 077 base=/srv/preland-admin # Подготовка root-процесса находится вне app-writable mount: UID приложения # не может подменить файл ссылкой между проверкой, chown и chmod. temporary=$(mktemp "$base/secrets/catalog.XXXXXX") trap 'rm -f "$temporary"' EXIT HUP INT TERM if ! /usr/bin/docker exec -i config-api-1 php < "$base/deploy/export-catalog.php" > "$temporary" 2>/dev/null; then echo 'Каталог групп не обновлён; прежний снимок сохранён.' >&2 exit 1 fi /usr/bin/python3 - "$temporary" <<'PY' import json, sys with open(sys.argv[1], encoding='utf-8') as stream: value = json.load(stream) assert value['host'] == 'zoomzilla.ru' assert set(value['groups']) == {'degr', 'tp', 'cons'} assert all(isinstance(items, list) for items in value['groups'].values()) PY chown 997:987 "$temporary" chmod 600 "$temporary" # -T заменяет саму ссылку назначения, не следует в указанный ею каталог. mv -fT "$temporary" "$base/state/catalog.json"