# Хранение файлов в S3 для каналов

Данная статья описывает режим сохранения и выдачи файлов чатов через S3-совместимое хранилище. Режим включается на уровне аккаунта и поддерживает как каналы, принимающие вложения, так и каналы, в которых отправка файлов невозможна (в этом случае пользователю доставляется защищенная ссылка на скачивание).

## Назначение и область применения

При включении режима S3:

  * новые файлы посетителей и операторов сохраняются в S3-бакет

  * ссылки на файлы формируются как пресайнд-URL с ограниченным сроком жизни

  * ранее загруженные файлы (до включения S3) продолжают открываться из файловой системы без миграции

Если S3 недоступно, операции с файлами (загрузка, предпросмотр, скачивание, доставка в каналы) недоступны до восстановления соединения с S3.

!!! Note "N.B."
    Пресайнд-URL (Presigned URL) — это временная ссылка, по которой можно получить доступ к приватному файлу в хранилище.

## Включение режима

  1. Создайте конфигурационный файл S3 на сервере:
```

/etc/webim/s3.json
```
Пример содержимого:
```
{
  "config": {
    "default_connection": "default"
  },
  "connections": {
    "default": {
      "access_key": "КЛЮЧ_ДОСТУПА",
      "secret_key": "СЕКРЕТ",
      "host": "https://s3.ru-1.storage.selcloud.ru",
      "region": "ru-1",
      "bucket_name": "НАЗВАНИЕ_БАКЕТА",
      "connect_timeout": 5,
      "read_timeout": 5,
      "max_retries": 3
    }
  }
}
```

  1. Включите параметр аккаунта:

  * `use_s3_storage = true`
     См. раздел [«Параметры настроек сервера»](https://webim.ru/kb/devops/server-account-config-parameters.html) и таблицу параметров.

  1. Перезапустите сервисы, обслуживающие чат и файлы.

## Правила формирования ключей объектов

Для новых файлов используется многоуровневая структура ключа в бакете:

```
<YYYY>/<MMDD>/<G1>/<G2>/<GUID>.<ext>
```

где:

  * `YYYY` — год загрузки,

  * `MMDD` — месяц и день (без разделителя),

  * `G1` — первые 2 символа `GUID`,

  * `G2` — следующие 2 символа `GUID`,

  * `GUID` — идентификатор файла.

Для файлов, загруженных до включения S3, поддерживается прежний формат ключей с двумя уровнями префиксов по `GUID` (обратная совместимость чтения).

## Срок жизни ссылок

Срок действия пресайнд-URL соответствует тайм-аутам для ссылок на файлы, задаваемым в конфигурации аккаунта. Подробности см. в разделе [«Список тайм-аутов»](https://webim.ru/kb/for-admins/time-outs-list.html) — параметр **`file_url_expiring_timeout`** и сопутствующие параметры для интерфейсов и каналов.

## Поведение в каналах

* **Каналы, поддерживающие вложения.** Отправка/получение файлов оператором и посетителем выполняется штатно. Файлы сохраняются в S3. Для изображений доступны уменьшенные версии (превью). Для некоторых каналов предпросмотр отправляется вместе с вложением (например, Apple Messages for Business).
* **Каналы, не поддерживающие вложения.** При отправке оператором файла в диалог вместо вложения посетителю доставляется защищенная ссылка на объект в S3 с ограниченным временем жизни.

## Совместимость и миграция

  * Перенос существующих файлов в S3 не выполняется автоматически. Старые файлы продолжают открываться из файловой системы.

  * Режим можно безопасно включать и выключать. При выключенном `use_s3_storage` все операции возвращаются к файловой системе.

## Требования и сеть

  * Необходим доступ с серверов Webim к S3-эндпоинту по HTTPS.

  * Время на серверах должно быть синхронизировано (NTP), иначе пресайнд-URL могут считаться недействительными.

  * Бакет должен существовать заранее; минимальная версия ACL/политик — приватный доступ, внешняя публикация объектов не требуется (используются пресайнд-URL).

---

Источник: https://webim.ru/kb/devops/s3-file-storage.html
