Refactor Dockerfile and documentation for non-root user setup. Update CLAUDE.md and README.md to clarify media storage permissions and user requirements. Modify appsettings for local development database configuration. Enhance MediaEndpoints by removing unused regex and improving file resolution logic. Update BumperPreview to use SHA-256 for asset ID generation, ensuring better security practices.
ci / build-backend (push) Successful in 1m33s
ci / build-frontend (push) Successful in 1m2s
ci / tests (push) Successful in 1m52s
ci / sonar (push) Successful in 4m24s

This commit is contained in:
Leonid Pershin
2026-07-26 21:41:33 +03:00
parent e79769be81
commit b52080e026
9 changed files with 103 additions and 51 deletions
+44 -15
View File
@@ -8,7 +8,7 @@ Runbook: разметка, форматирование и монтирован
> разделов), но каждый шаг ниже содержит проверку — не пропускайте их.
Итог: раздел `sdb1` (ext4) смонтирован в `/srv/telewave/media`, внутри созданы рабочие каталоги,
запись из контейнера (сейчас работает под root) возможна.
запись из контейнера (работает под непривилегированным uid 1654) возможна.
---
@@ -106,12 +106,28 @@ findmnt /srv/telewave/media
sudo mkdir -p /srv/telewave/media/{inbox,manual,uploads,originals,assets}
```
**Владелец.** Контейнер сейчас работает под `root` (в Dockerfile нет `USER`), а bind-mount
пробрасывает права хоста внутрь как есть. Поэтому достаточно оставить владельцем root:
**Владелец.** Контейнер работает под непривилегированным пользователем `app` образа aspnet —
**uid/gid 1654** (`USER $APP_UID` в Dockerfile). Bind-mount пробрасывает права хоста внутрь как
есть, никакого маппинга uid не происходит: контейнер увидит ровно те номера, что стоят на хосте.
Значит, владельцем хранилища должен быть 1654.
Имени `app` на хосте нет — заводим группу с этим gid, чтобы права были читаемыми в `ls` и чтобы
в неё можно было добавить себя:
```bash
sudo chown -R root:root /srv/telewave/media
sudo chmod -R 755 /srv/telewave/media
sudo groupadd -g 1654 telewave # «уже существует» — не ошибка, идём дальше
sudo usermod -aG telewave "$USER" # чтобы класть файлы в inbox/manual под собой
```
> Членство в группе применяется **только к новым сессиям**: перелогиньтесь (или `newgrp telewave`),
> иначе следующая команда отработает, а записать файл вы всё равно не сможете. Проверка — `id`
> должен показать `telewave` в списке групп.
Теперь владелец и базовые права:
```bash
sudo chown -R 1654:1654 /srv/telewave/media
sudo chmod -R 750 /srv/telewave/media
```
Два каталога наполняете вы, а не приложение:
@@ -122,17 +138,20 @@ sudo chmod -R 755 /srv/telewave/media
(Медиа → «Из папки manual»), выбираются галочками и сразу привязываются к шоу. Импортированные
файлы уходят из каталога так же, как из `inbox/`.
Чтобы класть в них файлы вручную (SFTP/rsync) под своим пользователем, откройте на запись именно
эти каталоги вашей группе:
Их открываем группе на запись, плюс setgid (`2` в начале режима) — чтобы файлы, положенные вами по
SFTP/rsync, наследовали группу `telewave`, а не вашу личную, и приложение их видело:
```bash
sudo chown root:$(id -gn) /srv/telewave/media/inbox /srv/telewave/media/manual
sudo chmod 775 /srv/telewave/media/inbox /srv/telewave/media/manual
sudo chmod 2775 /srv/telewave/media/inbox /srv/telewave/media/manual
```
> При переходе контейнера на non-root пользователя (если позже добавим `USER` в Dockerfile —
> в aspnet-образе это обычно uid `1654`), сменить владельца на этот uid:
> `sudo chown -R 1654:1654 /srv/telewave/media` (кроме `inbox` и `manual`, оставленных вам).
Забрать файл из каталога приложение сможет в любом случае: удаление зависит от прав на **каталог**
(владелец — 1654), а не на сам файл, поэтому чужой umask у ваших загрузок импорту не мешает.
**Обновление существующей установки.** Если хранилище было заведено раньше, когда контейнер работал
под root, — те же команды и есть вся миграция: выполните их на остановленном контейнере
(`docker compose down`), затем поднимайте новый образ. До смены владельца приложение стартует, но
любая запись в `/media` будет падать с `Permission denied`.
---
@@ -185,14 +204,24 @@ Docker — это важно, потому что файлы в `inbox/` кла
## 7. Проверка записи из контейнера
После добавления тома и пересборки образа убедиться, что контейнер пишет на диск:
После добавления тома и пересборки образа убедиться, что контейнер работает под нужным uid и пишет
на диск:
```bash
docker compose exec app id # ожидается uid=1654 gid=1654
docker compose exec app sh -c 'touch /media/.wtest && ls -l /media/.wtest && rm /media/.wtest'
```
Команда должна отработать без ошибок доступа. На этом подготовка хоста завершена — дальнейшее
(создание `MediaAsset`, нарезка ffmpeg) делает уже само приложение.
И что вы сами можете класть файлы вручную (под своим пользователем, не через sudo):
```bash
touch /srv/telewave/media/inbox/.wtest && rm /srv/telewave/media/inbox/.wtest
```
Обе команды должны отработать без ошибок доступа. `Permission denied` в первой — не сделан
`chown -R 1654:1654` из шага 5; во второй — вы не в группе `telewave` либо не перелогинились после
`usermod`. На этом подготовка хоста завершена — дальнейшее (создание `MediaAsset`, нарезка ffmpeg)
делает уже само приложение.
---