From afdfc98eef1f0bece7240b7e669dc86fc46005b9 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 8 Feb 2026 21:38:23 +0300 Subject: [PATCH] fix(infra): harden grafana permissions and document recovery - Why: - students hit permission denied after pull and grafana restart-loop with readonly db - What: - run grafana as default non-root user - mount provisioning directory as read-only - add troubleshooting for git permission issues and grafana volume reset - normalize file modes for data jsonl and docs/DE-task.md to 100644 - Check: - docker compose config - docker compose up -d grafana - curl -u admin:admin http://localhost:3000/api/health --- data/browser_events.jsonl | 0 data/device_events.jsonl | 0 data/geo_events.jsonl | 0 data/location_events.jsonl | 0 docker-compose.yml | 3 +-- docs/DE-task.md | 0 docs/OPERATIONS.md | 25 +++++++++++++++++++++++++ 7 files changed, 26 insertions(+), 2 deletions(-) mode change 100755 => 100644 data/browser_events.jsonl mode change 100755 => 100644 data/device_events.jsonl mode change 100755 => 100644 data/geo_events.jsonl mode change 100755 => 100644 data/location_events.jsonl mode change 100755 => 100644 docs/DE-task.md diff --git a/data/browser_events.jsonl b/data/browser_events.jsonl old mode 100755 new mode 100644 diff --git a/data/device_events.jsonl b/data/device_events.jsonl old mode 100755 new mode 100644 diff --git a/data/geo_events.jsonl b/data/geo_events.jsonl old mode 100755 new mode 100644 diff --git a/data/location_events.jsonl b/data/location_events.jsonl old mode 100755 new mode 100644 diff --git a/docker-compose.yml b/docker-compose.yml index 9a7af85..64402a2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -193,14 +193,13 @@ services: grafana: image: grafana/grafana:11.5.2-ubuntu - user: root depends_on: - prometheus ports: - 3000:3000 volumes: - grafana_lib:/var/lib/grafana - - ./configs/grafana/provisioning/:/etc/grafana/provisioning/ + - ./configs/grafana/provisioning/:/etc/grafana/provisioning/:ro # container_name: grafana # hostname: grafana restart: unless-stopped diff --git a/docs/DE-task.md b/docs/DE-task.md old mode 100755 new mode 100644 diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 188804d..5a4d768 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -258,5 +258,30 @@ curl -s -X POST -u admin:admin http://localhost:3000/api/admin/provisioning/aler ## Troubleshooting - `etl_pipeline` падает с ошибкой схемы: сначала запустить `ddl_init`. +- `git pull` падает с `Permission denied` на `data/*` или `configs/grafana/provisioning/*`: + - Причина: локально есть файлы/каталоги не вашего пользователя (часто после запуска контейнеров с root-пользователем). + - Диагностика: + ```bash + ls -ld data configs/grafana/provisioning + ls -l data | head -n 20 + ``` + - Быстрое восстановление: + ```bash + # Владелец и права для рабочей копии репозитория + sudo chown -R "$USER:$USER" . + find . -type d -exec chmod u+rwx {} \; + find . -type f -exec chmod u+rw {} \; + ``` + - После восстановления повторить `git pull --ff-only`. + - Не запускать `git` через `sudo`. +- `grafana` перезапускается с ошибкой `attempt to write a readonly database`: + - Причина: старый `grafana_lib` содержит `grafana.db`, созданный root-пользователем. + - Простой recovery (сбросить только volume Grafana): + ```bash + docker compose stop grafana + docker volume ls | grep grafana_lib + docker volume rm _grafana_lib + docker compose up -d grafana + ``` - После `docker compose down -v` нужно повторно прогнать: `ddl_init` -> `kafka_load` -> `etl_pipeline`. - Для демо по умолчанию использовать малый срез данных; полный прогон делать осознанно.