feat: SAC 0.6.0 user edit UI, login to dashboard, daily report timer sync

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-01 09:55:12 +10:00
parent 56c469ddbd
commit 8de5d14cfb
17 changed files with 449 additions and 56 deletions
+4
View File
@@ -15,6 +15,10 @@ sudo chmod 755 /opt/sac-deploy.sh
sudo /opt/sac-deploy.sh
```
Суточные отчёты: `sac-daily-report.service` + timer. Файл `sac-daily-report.timer` в git — шаблон;
на сервере timer **генерируется** из `SAC_DAILY_REPORT_HOUR` / `SAC_DAILY_REPORT_TIMEZONE`
(`deploy/systemd/render-sac-daily-report-timer.sh`, вызывается из `sac-deploy.sh`).
## Альтернатива: Docker
Только для стенда. См. [docs/install-ubuntu-24.04-docker.md](../docs/install-ubuntu-24.04-docker.md).
+18
View File
@@ -122,10 +122,28 @@ else
die "${SERVICE_NAME} запущен, но /health не ответил — journalctl -u ${SERVICE_NAME} -n 80 --no-pager"
fi
RENDER_DAILY_TIMER="${APP_ROOT}/deploy/systemd/render-sac-daily-report-timer.sh"
if [ -f "${RENDER_DAILY_TIMER}" ]; then
chmod +x "${RENDER_DAILY_TIMER}" 2>/dev/null || true
fi
for aux in sac-retention sac-daily-report; do
for suffix in service timer; do
src="${APP_ROOT}/deploy/systemd/${aux}.${suffix}"
dst="/etc/systemd/system/${aux}.${suffix}"
if [ "${aux}" = "sac-daily-report" ] && [ "${suffix}" = "timer" ]; then
if [ -x "${RENDER_DAILY_TIMER}" ]; then
log "Генерация ${dst} из ${CONFIG_FILE} (SAC_DAILY_REPORT_HOUR/TIMEZONE)"
bash "${RENDER_DAILY_TIMER}" "${CONFIG_FILE}" "${dst}"
systemctl daemon-reload
systemctl restart "${aux}.timer" 2>/dev/null || systemctl start "${aux}.timer" 2>/dev/null || true
elif [ -f "${src}" ]; then
log "WARN: ${RENDER_DAILY_TIMER} не найден — копируем статический timer"
cp "${src}" "${dst}"
systemctl daemon-reload
fi
continue
fi
if [ -f "${src}" ]; then
if [ ! -f "${dst}" ] || ! cmp -s "${src}" "${dst}"; then
log "Обновление ${dst}"
@@ -0,0 +1,44 @@
#!/usr/bin/env bash
# Генерирует sac-daily-report.timer из SAC_DAILY_REPORT_HOUR и SAC_DAILY_REPORT_TIMEZONE.
# Usage: sudo deploy/systemd/render-sac-daily-report-timer.sh [config.env] [output.timer]
set -euo pipefail
CONFIG_FILE="${1:-/opt/security-alert-center/config/sac-api.env}"
OUTPUT="${2:-/etc/systemd/system/sac-daily-report.timer}"
HOUR=9
TZ_NAME="Europe/Moscow"
if [ -f "${CONFIG_FILE}" ]; then
set -a
# shellcheck source=/dev/null
source "${CONFIG_FILE}"
set +a
fi
HOUR="${SAC_DAILY_REPORT_HOUR:-9}"
TZ_NAME="${SAC_DAILY_REPORT_TIMEZONE:-Europe/Moscow}"
if ! [[ "${HOUR}" =~ ^[0-9]+$ ]] || [ "${HOUR}" -lt 0 ] || [ "${HOUR}" -gt 23 ]; then
printf 'render-sac-daily-report-timer: invalid SAC_DAILY_REPORT_HOUR=%s\n' "${HOUR}" >&2
exit 1
fi
HOUR_PADDED="$(printf '%02d' "${HOUR}")"
cat >"${OUTPUT}" <<EOF
[Unit]
Description=Daily SAC report aggregation and notify
[Timer]
OnCalendar=*-*-* ${HOUR_PADDED}:00:00
Timezone=${TZ_NAME}
Persistent=true
[Install]
WantedBy=timers.target
EOF
printf 'render-sac-daily-report-timer: wrote %s (OnCalendar=%s:00:00 Timezone=%s)\n' \
"${OUTPUT}" "${HOUR_PADDED}" "${TZ_NAME}"
+4 -2
View File
@@ -2,8 +2,10 @@
Description=Daily SAC report aggregation and notify
[Timer]
OnCalendar=*-*-* 09:15:00
RandomizedDelaySec=300
# Шаблон по умолчанию (hour=9, Europe/Moscow). На prod timer перегенерируется
# из config/sac-api.env: deploy/systemd/render-sac-daily-report-timer.sh или sac-deploy.sh
OnCalendar=*-*-* 09:00:00
Timezone=Europe/Moscow
Persistent=true
[Install]