media: кодеки для magick в образе и диагностика ресайза

Базовый пакет imagemagick в alpine идёт без кодеков, поэтому magick не мог
прочитать jpeg-вложение и падал с "exit status 1". Ставим imagemagick-jpeg,
-heic, -webp, -tiff.

Чтобы такое было видно из логов: runMagick подставляет stderr в ошибку и
отдельно ловит "код выхода 0, но пустой вывод" (так magick ведёт себя без
кодека на запись), а веб логирует формат, размеры до и после, время
скачивания и ресайза.

Если ресайз всё же не удался, отдаём оригинал вместо 502; в кэш не кладём
записи больше 4 МБ, чтобы неужатые оригиналы не съели память.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-06 12:37:57 +03:00
co-authored by Claude Opus 5
parent 39f4a4dff9
commit 2bf618d105
4 changed files with 66 additions and 7 deletions
+11 -1
View File
@@ -84,9 +84,19 @@ func runMagick(ctx context.Context, data []byte, args ...string) ([]byte, error)
cmd := exec.CommandContext(ctx, "magick", cmdArgs...)
cmd.Stdin = bytes.NewReader(data)
// Без stderr от magick ошибка выглядит как голое "exit status 1"
// и не подсказывает, чего не хватает (обычно — кодека).
var stderr bytes.Buffer
cmd.Stderr = &stderr
out, err := cmd.Output()
if err != nil {
return nil, fmt.Errorf("magick: %w", err)
return nil, fmt.Errorf("magick: %w: %s", err, strings.TrimSpace(stderr.String()))
}
// Без кодека magick иногда завершается успешно, но не пишет ничего.
if len(out) == 0 {
return nil, fmt.Errorf("magick produced empty output: %s", strings.TrimSpace(stderr.String()))
}
return out, nil