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.
This commit is contained in:
@@ -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)
|
||||
делает уже само приложение.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user